ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggZTc1NTVmZS4uMTQzMzEzYyAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTUgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODAxMTggb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODAyMDEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDExODogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBOZXcgcmVnaW9uIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIFgxMSBjb2RlLgotCS0gSW1wcm92ZW1lbnRzIHRvIERpcmVjdERyYXcgYW5kIERpcmVjdFNvdW5kLgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTgwMjAxOiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIFN1cHBvcnQgZm9yIENhdGFsYW4gYW5kIFN3ZWRpc2ggbGFuZ3VhZ2VzLgorCS0gTW9yZSBEaXJlY3QqIHN1cHBvcnQuCisJLSBYMTEgdGhyZWFkLXNhZmUgd3JhcHBlcnMuCisJLSBTdXBwb3J0IGZvciBQb3N0c2NyaXB0IHByaW50ZXIgZm9udHMuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTYsMTAgKzE4LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDExOC50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAxMTgudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAxMTgudGFyLmd6Ci0gIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAxMTgudGFyLmd6CisgIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDIwMS50YXIuZ3oKKyAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAyMDEudGFyLmd6CisgIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAyMDEudGFyLmd6CisgIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAyMDEudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApkaWZmIC0tZ2l0IGEvQlVHUyBiL0JVR1MKaW5kZXggOGUzMzliMi4uN2NhMjAwYyAxMDA2NDQKLS0tIGEvQlVHUworKysgYi9CVUdTCkBAIC0zMCw2ICszMCwxMCBAQAogCS0gWW91IGNhbiBmaW5kIGluZm9ybWF0aW9uIGFib3V0IG1vc3Qgb2YgdGhlIFdpbjMyIEFQSSBjYWxscwogICAgICAgICAgIG9uIHRoZSB3d3cubWljcm9zb2Z0LmNvbSAoZ28gdG8gJ3NlYXJjaCcpLgogCisgKiBBIGxvdCBvZiB0aGUgZXh0ZW5zaW9ucyB0byB0aGUgR0RJIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIHdpdGggV2luMzIgYXJlCisgICBub3Qgc3VwcG9ydGVkIGF0IGFsbCBvciBvbmx5IGluIGEgdmVyeSBydWRpbWVudGFyeSB3YXkuIChXb3JsZCB0cmFuc2Zvcm1zLAorICAgYXJjIGRpcmVjdGlvbiwgR01fQURWQU5DRUQgdG8gbmFtZSBidXQgYSBmZXcpCisKIE1pc2NlbGxhbmVvdXM6CiAKICAqIDE2LWJpdCBFdWRvcmEgMS41LjIgZ29lcyBpbnRvIHJlY3Vyc2lvbiB0cnlpbmcgdG8gZGlzcGxheQpAQCAtNjQsOCArNjgsNiBAQAogICogQWxsb2NDU1RvRFNBbGlhcygpIHNob3VsZG4ndCBhbGxvYyBhbGlhcyBmb3IgdGhlIHNhbWUgc2VnbWVudCBtdWx0aXBsZQogICAgdGltZXMuCiAKLSAqIFgxMURSVl9QYWludFJnbiBkb2Vzbid0IHJlc3BlY3QgbWFwcGluZyBtb2RlcwotCiBXaGVyZSB0byBsb29rIGluIHNvdXJjZSBmaWxlczoKIAogICogZ3JlcCBmb3IgRklYTUUgaW4gdGhlIHNvdXJjZSBmaWxlcy4KZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA2NWE1MWE3Li4yYTA4MjA2IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDQgKzEsMTgzIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTdW4gRmViICAxIDEzOjI0OjU0IDE5OTggIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgorCisJKiBbZmlsZXMvZHJpdmUuY10KKwlBZGRlZCBEZXZpY2U9IHBhcmFtZXRlciB0byBkcml2ZSBjb25maWd1cmF0aW9uLgorCisJKiBbaWYxNjMyL3JlbGF5LmNdCisJVGhyb3coKSBhbmQgQ2F0Y2goKSBub3cgdXNlIHRoZSBjb3JyZWN0IENBVENIQlVGIGxheW91dCAodW50ZXN0ZWQpLgorCisJKiBbdG9vbHMvYnVpbGQuY10gW2luY2x1ZGUvc3RhY2tmcmFtZS5oXSBbbG9hZGVyL3Rhc2suY10KKwlNb3ZlZCAxNi1iaXQgc3RhY2sgcG9pbnRlciBpbnRvIHRocmVhZCBkYXRhYmFzZS4KKwlTYXZlIGN1cnJlbnQgJWZzIHdoaWxlIHJ1bm5pbmcgMTYtYml0IGNvZGUuCisKK0ZyaSBKYW4gMzAgMDk6MjU6NDkgMTk5OCAgTWFydGluIEJvZWhtZSAgPGJvZWhtZUBpbmZvcm1hdGlrLm11LWx1ZWJlY2suZGU+CisKKwkqIFtncmFwaGljcy9tYXBwaW5nLmNdCisJTWFkZSBEUHRvTFAzMiBhbmQgTFB0b0RQMzIgcmVzcGVjdCB3b3JsZCB0cmFuc2Zvcm1zLgorCisJKiBbZ3JhcGhpY3MvcGF0aC5jXSBbZ3JhcGhpY3MvcGFpbnRpbmcuY10gW2lmMTYzMi9nZGkuc3BlY10KKwkgIFtpbmNsdWRlL3BhdGguaF0KKwlNb3JlIHBhdGggc3VwcG9ydC4KKworCSogW2luY2x1ZGUvZ2RpLmhdIFtpbmNsdWRlL3dpbmRvd3MuaF0gW29iamVjdHMvZGMuY10KKwkgIFtyZWxheS9nZGkzMi5zcGVjXQorCVN1cHBvcnQgZm9yIEdldC9TZXRBcmNEaXJlY3Rpb24gYW5kIEdldC9TZXRXb3JsZFRyYW5zZm9ybQorCisJKiBbd2luZG93cy9ob29rLmNdCisJRml4ZWQgYSBidWcgaW4gSE9PS19NYXAxNlRvMzJDb21tb24uCisKK1RodSBKYW4gMjkgMjM6NDM6MTggMTk5OCAgRG91Z2xhcyBSaWRnd2F5IDxyaWRnd2F5QHRhaWdhLmdtY2wuY29tPgorCisJKiBbZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jXSBbb2JqZWN0cy9tZXRhZmlsZS5jXQorCURvY3VtZW50YXRpb24gZm9yIG1ldGFmaWxlIHJlbGF0ZWQgQVBJIGNhbGxzLiBGaXhlZCBhIGJ1ZyB0byBhdm9pZAorCWRvY3VtZW50aW5nIGl0LgorCisJKiBbaW5jbHVkZS93aW5kb3dzLmhdCisJRGVjbGFyYXRpb24gZm9yIExvYWRJbWFnZS4KKworVGh1IEphbiAyOSAyMTo0NDo0NSAxOTk4ICBIdXcgRCBNIERhdmllcyA8aC5kYXZpZXMxQHBoeXNpY3Mub3hmb3JkLmFjLnVrPgorCisJKiBbZ3JhcGhpY3Mvd2luMTZkcnYvKl0KKwlDaGFuZ2VzIHRvIHByaW50aW5nIGNvZGUgdG8gZW5hYmxlIHVzZSBvZiBwcmludGVyIGZvbnRzIHdpdGggdGhlCisJd2luMy4xIHBvc3RzY3JpcHQgZHJpdmVyLiBSZW1lbWJlciB0byBhZGQgcHJpbnRlcj1vbiB0byBbd2luZV0KKwlzZWN0aW9uIG9mIHdpbmUuY29uZiAuIFlvdSB3aWxsIGFsc28gbmVlZCB0byBkaXNhYmxlIHRydWV0eXBlCisJZm9udHMgZnJvbSBjb250cm9sIHBhbmVsLiBXaW53b3JkIDYuMCBhbmQgV3JpdGUgc2VlbSB0byBiZSBoYXBweQorCXdpdGggdGhpcy4uLgorCisJKiBbaW5jbHVkZS9iaXRtYXAuaF0KKwlGaXggV2lkdGhieXRlcyBmb3IgMTVicHAgZGlzcGxheXMuCisKK1R1ZSBKYW4gMjcgMjA6NTQ6MDggMTk5OCAgS3Jpc3RpYW4gTmllbHNlbiA8a3Jpc3RpYW4ubmllbHNlbkByaXNvZS5kaz4KKworCSogW3RzeDExLypdIFtpbmNsdWRlL3RzKl0gW3Rvb2xzL21ha2VfWDExd3JhcHBlcnNdCisJSW1wbGVtZW50ZWQgdGhyZWFkLXNhZmUgWDExIHdyYXBwZXJzLgorCitUdWUgSmFuIDI3IDEzOjU0OjA5IDE5OTggIENvbnN0YW50aW5lIFNhcHVudHpha2lzICA8Y3NhcHVudHpAdG1hLTEubGNzLm1pdC5lZHU+CisKKwkqIFt3aW5kb3dzL3F1ZXVlLmNdCisJRm9yZ290IHRvIGNvbnZlcnQgdGhkYiB0byB0aHJlYWRfaWQuCisKKwkqIFttaXNjL3JlZ2lzdHJ5LmNdCisJU3BlZCB1cCBXaW5kb3dzIDk1IHJlZ2lzdHJ5IHJlYWRpbmcuIENoYW5nZWQgY29kZSB0byB0cmF2ZXJzZQorCXJlZ2lzdHJ5IGFzIGEgdHJlZSByYXRoZXIgdGhhbiByZWFkIGluIGFsbCBwb3NzaWJsZSBrZXlzCisJKGluY2x1ZGluZyBkZWFkIG9uZXMpLiAKKworVHVlIEphbiAyNyAxMjo0NjowOSAxOTk4ICBNYXJjdXMgTWVpc3NuZXIgPG1zbWVpc3NuQGNpcC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogW2xvYWRlci9wZV9pbWFnZS5jXVtNYWtlZmlsZS5pbl1bc2NoZWR1bGVyL3RocmVhZC5jXQorCSAgW2xpYnRlc3QvaGVsbG81LmNdCisJRG9uJ3QgZXhpdCgpIG9uIGZhaWxlZCB0byBsb2FkIHJlZmVyZW5jZWQgZGxscy4KKwlGaXhlZCBzdGF0aWMgdGxzIGFsbG9jYXRpb24gZm9yIG11bHRpcGxlIHRocmVhZHMuCisJV0lORUxJQiBzaG91bGQgbm93IGJlIGFibGUgdG8gbG9hZCBQRSBkbGxzLiBBIHNhbXBsZQorCXdpbmVsaWIgcHJvZ3JhbSwgdGhhdCBkeW5hbWljYWxseSBsb2FkcyBhIGludGVybmFsIGRsbAorCWlzIGluY2x1ZGVkLgorCisJKiBbZ3JhcGhpY3MvZGRyYXcuY11baW5jbHVkZS9kZHJhdy5oXVtpbmNsdWRlL2QzZC5oXQorCUNsZWFuZWQgdXAgYW5kIGVuaGFuY2VkIGZ1cnRoZXIuIEFkZGVkIHNldmVyYWwgRGlyZWN0WDUKKwlpbnRlcmZhY2UgZGVmaW5pdGlvbnMgYW5kIERpcmVjdFN1cmZhY2UzIGltcGxlbWVudGF0aW9uLgorCVN0dWJzIGZvciBEM0QgKE5PVCBjb21pbmcgc29vbiwganVzdCB0aGVyZSBzbyBpdCBmYWlscyBzYWZlbHkpLgorCisJKiBbbXVsdGltZWRpYS9kc291bmQuY11baW5jbHVkZS9kc291bmQuaF0KKwlBY3R1YWxseSB3b3JrcyBub3cgZm9yIGEgbG90IG9mIGNhc2VzLiBTb21lIERpcmVjdFg1IHN0dWZmCisJYWRkZWQuIFN0aWxsIGxhY2tpbmcgc2V2ZXJhbCBmZWF0dXJlcy4KKworCSogW3dpbmRvd3MvZGlucHV0LmNdW2luY2x1ZGUvZGlucHV0LmhdCisJU3RhcnRlZCBpbXBsZW1lbnRpbmcgRGlyZWN0SW5wdXQuIERvZXNuJ3Qgd29yayB5ZXQsIGRvbid0IAorCWtub3cgd2h5LgorCisJKiBbaWYxNjMyL3RodW5rLmNdW21pc2MvY2FsbGJhY2tzLmNdCisJICBbd2luMzIva2VybmVsLmNdW2luY2x1ZGUvY2FsbGJhY2tzLmhdCisJQWRkZWQgV09XQ2FsbGJhY2sxNkV4LCBXT1dIYW5kbGUzMi4KKworCSogW21pc2MvY3B1LmNdCisJRml4ZWQgR2V0U3lzdGVtSW5mbywgSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudC4KKworCSogW211bHRpbWVkaWEvam95c3RpY2suY11bbXVsdGltZWRpYS90aW1lLmNdCisJU2V2ZXJhbCBmaXhlcy4gU21hbGwgaGFjayB0byBnZXQgdGltZXJldmVudHMgaW4gdGltZUdldFRpbWUoKSBsb29wcy4KKworVHVlIEphbiAyMCAxMToyNjoyNyAxOTk4ICBTbGF2ZW4gUmV6aWMgIDxlc2VydGVAY3MudHUtYmVybGluLmRlPgorCisJKiBbY29uZmlndXJlLmluXQorCUZpeGVkIGNoZWNrIGZvciB1bmlvbiBzZW11biBvbiBGcmVlQlNEIHN5c3RlbXMuCisKK1N1biBKYW4gMTggMjM6MDU6MDQgMTk5OCAgS2FybCBCYWNrc3Ry9m0gPGthcmxfYkBnZW9jaXRpZXMuY29tPgorCisJKiBbbWlzYy9vbGUybmxzLmNdIFtwcm9ncmFtcy9wcm9nbWFuL1N3LnJjXSBbcHJvZ3JhbXMvd2luaGVscC9Tdy5yY10KKwkgIFtyZXNvdXJjZXMvc3lzcmVzX1N3LnJjXQorCUFkZGVkL3VwZGF0ZWQgU3dlZGlzaCBsYW5ndWFnZSBzdXBwb3J0LgorCitTdW4gSmFuIDE4IDE4OjQ5OjAxIDE5OTggIEFsZXggS29yb2JrYSA8YWxleEB0cmFudG9yLnBoYXJtLnN1bnlzYi5lZHU+CisKKwkqIFttaXNjL3dpbnNvY2suY10gW21pc2Mvd2luc29ja19kbnMuY10gW3dpbmRvd3MvZXZlbnQuY10KKwkgIFt3aW5kb3dzL3dpbi5jXSBbd2luZG93cy9kY2UuY10gW3dpbmRvd3Mvd2lucG9zLmNdCisJQnVnIGZpeGVzLgorCitTdW4gSmFuIDE4IDEyOjQ1OjIzIDE5OTcgIEFuZHJlYXMgTW9ociA8MTAwLjMwOTM2QGdlcm1hbnkubmV0PgorCisJKiBbbXNkb3MvaW50MjUuY10gW21zZG9zL2ludDI2LmNdCisgICAgICAgIEltcGxlbWVudGVkICJuYXRpdmUiIGFic29sdXRlIGRpc2sgcmVhZC93cml0ZSBhY2Nlc3MuCisKKwkqIFttc2Rvcy9pbnQxMy5jXSBbbXNkb3MvaW9wb3J0cy5jXQorCUVuaGFuY2VkIEdFVCBEUklWRSBQQVJBTUVURVJTIChpbnQxMyBBSD0wOCkuCisKKwkqIFtncmFwaGljcy93aW4xNmRydi9wcnRkcnYuY10gW2lmMTYzMi9nZGkuc3BlY10KKwlGaXhlZCB0eXBvcywgaW1wbGVtZW50ZWQgZG1FbnVtREZvbnRzLAorCVN0YXJ0ZWQgaW1wbGVtZW50YXRpb24gb2YgZG1SZWFsaXplT2JqZWN0LgorCisJKiBbaWYxNjMyL2NvbXBvYmouc3BlY10gW29sZS9jb21wb2JqLmNdIFtyZWxheTMyL29sZTMyLnNwZWNdCisJU3R1YnMgQ29DcmVhdGVJbnN0YW5jZSwgQ29GcmVlVW51c2VkTGlicmFyaWVzLCBpbXBsZW1lbnRlZAorCUNvRmlsZVRpbWVOb3cuCisKKwkqIFtpZjE2MzIva2VybmVsLnNwZWNdIFtpbmNsdWRlL3dpbmRvd3MuaF0gW21lbW9yeS9nbG9iYWwuY10KKwkgIFttZW1vcnkvc3RyaW5nLmNdIFttaXNjL2tlcm5lbC5jXSBbbWlzYy9NYWtlZmlsZS5pbl0KKwkgIFttaXNjL3Rvb2xoZWxwLmNdIFttc2Rvcy9pbnQyMS5jXQorCUltcGxlbWVudGVkIEdsb2JhbEhhbmRsZU5vUklQLCBHZXRGcmVlTWVtSW5mbywgRGVidWdGaWxsQnVmZmVyLCAKKwlzdHVicyBHZXRTZXRLZXJuZWxET1NQcm9jLCBEaWFnUXVlcnksIERpYWdPdXRwdXQsIFRvb2xIZWxwSG9vaworCShVbmRvY3VtZW50ZWQgV2luZG93cykuCisKKwkqIFtpZjE2MzIvdXNlci5zcGVjXSBbaWYxNjMyL3dpbjMyczE2LnNwZWNdIFttaXNjL3dpbjMyczE2LmNdCisJTWlzYyBzdHVicy4KKworCSogW2lmMTYzMi93aW5hc3BpLnNwZWNdIFttaXNjL2FzcGkuY10KKwlJbXBsZW1lbnRlZCBHZXRBU1BJRExMVmVyc2lvbi4KKworCSogW2lmMTYzMi93cHJvY3Muc3BlY10gW21zZG9zL2ludDIwLmNdIFttc2Rvcy9NYWtlZmlsZS5pbl0KKwlBZGRlZCBoYW5kbGVyIGZvciBJbnQgMHgyMCAodGVybWluYXRlIHByb2dyYW0sIF92ZXJ5XyBvbGQtZmFzaGlvbmVkKS4KKworCSogW21pc2MvdzMyc2NvbWIuY10KKwlJbXBsZW1lbnRlZCBHZXQxNkRMTEFkZHJlc3MoKSBwYXJ0aWFsbHkKKwkoYmlnIHRoYW5rcyB0byBNYXJjdXMgYW5kIEFsZXhhbmRyZSkuCisKKwkqIFtyZWxheTMyL01ha2VmaWxlLmluXSBbcmVsYXkzMi9idWlsdGluMzIuY10gW3JlbGF5MzIvZHBsYXkuc3BlY10KKwlBZGRlZCBidWlsdC1pbiBEUExBWS5ETEwuCisKKwkqIFtyZWxheTMyL3dpbm1tLnNwZWNdIFttdWx0aW1lZGlhL2pveXN0aWNrLmNdCisJQWRkZWQgam95U2V0VGhyZXNob2xkLgorCisJKiBbbWlzYy93aW5kZWJ1Zy5jXQorCUFkZGVkIFdpbk5vdGlmeS4KKworCSogW3dpbjMyL2NvbnNvbGUuY10KKwlTdHVicyBDcmVhdGVDb25zb2xlU2NyZWVuQnVmZmVyLCBTZXRDb25zb2xlQWN0aXZlU2NyZWVuQnVmZmVyLAorCVdyaXRlQ29uc29sZU91dHB1dDMyQS4KKworCSogW3dpbmRvd3MvdXNlci5jXQorCVN0dWIgU2V0RXZlbnRIb29rLgorCitTYXQgSmFuIDE3IDE5OjMwOjM1IDE5OTggIE1hdHRoZXcgVG9zZWxhbmQgIDxQYXVsLlRvc2VsYW5kQGJ0aW50ZXJuZXQuY29tPgorCisJKiBbd2luZG93cy9wYWludGluZy5jXQorCUZpeGVkIGJyb2tlbiByZXN0b3JlLXRvLW1heGltaXplZC4KKworTW9uIEphbiAxMiAyMToyNTozMiAxOTk4ICBQZXJjZXZhbCAtIE1hcmMgSHVndWV0IFB1aWcgPG1ocEB0aW5ldC5mdXQuZXM+CisKKwkqIFtkb2N1bWVudGF0aW9uL3dpbmUubWFuXSBbaW5jbHVkZS9vcHRpb25zLmhdCisJICBbbWlzYy9tYWluLmNdIFtvbGUvb2xlMm5scy5jXSBbcmVzb3VyY2VzL3N5c3Jlcy5jXQorCSAgW3Jlc291cmNlcy9zeXNyZXNfQ2EucmNdIFtyZXNvdXJjZXMvTWFrZWZpbGUuaW5dCisJQWRkZWQgbGFuZ3VhZ2UgY2F0YWxhbi4gKEFmZWdpdCBsJ2lkaW9tYSBjYXRhbOApLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTdW4gSmFuIDE4IDE3OjA1OjU4IDE5OTggIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgogCiAJKiBbaW5jbHVkZS9zdGFja2ZyYW1lLmhdIFt0b29scy9idWlsZC5jXQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCBlNmRiMzFlLi43ZTMxNjM5IDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtNDAsOCArNDAsMTAgQEAKIAltdWx0aW1lZGlhIFwKIAlvYmplY3RzIFwKIAlvbGUgXAorCXJlbGF5MzIgXAogCXJlc291cmNlcyBcCiAJc2NoZWR1bGVyIFwKKwl0c3gxMSBcCiAJd2luMzIgXAogCXdpbmRvd3MKIApAQCAtNDksOCArNTEsNyBAQAogCWRlYnVnZ2VyIFwKIAlncmFwaGljcy93aW4xNmRydiBcCiAJaWYxNjMyIFwKLQltaXNjZW11IFwKLQlyZWxheTMyCisJbWlzY2VtdQogCiBQUk9HU1VCRElSUyA9IGxpYnRlc3QgcHJvZ3JhbXMKIApAQCAtODMsOCArODQsMTAgQEAKIAltdWx0aW1lZGlhL211bHRpbWVkaWEubyBcCiAJb2JqZWN0cy9vYmplY3RzLm8gXAogCW9sZS9vbGUubyBcCisJcmVsYXkzMi9yZWxheTMyLm8gXAogCXJlc291cmNlcy9yZXNvdXJjZXMubyBcCiAJc2NoZWR1bGVyL3NjaGVkdWxlci5vIFwKKwl0c3gxMS90c3gxMS5vIFwKIAl3aW4zMi93aW4zMi5vIFwKIAl3aW5kb3dzL3dpbmRvd3MubwogCkBAIC05Miw4ICs5NSw3IEBACiAJZGVidWdnZXIvZGVidWdnZXIubyBcCiAJZ3JhcGhpY3Mvd2luMTZkcnYvd2luMTZkcnYubyBcCiAJaWYxNjMyL2lmMTYzMi5vIFwKLQltaXNjZW11L21pc2NlbXUubyBcCi0JcmVsYXkzMi9yZWxheTMyLm8KKwltaXNjZW11L21pc2NlbXUubwogCiBhbGw6ICQoTUFJTl9UQVJHRVQpCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCA4NGQ4NzkxLi40NGVmZGFlIDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0yMDM5LDggKzIwMzksOCBAQAogI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KIGludCBtYWluKCkgewogCi0vKiBjaGVjayBmb3Igb3BlbiBzb3VuZCBzeXN0ZW0gYW5kIG9uZSBvZiB0aGUgU05EQ1RMXyBkZWZpbmVzIHRvIGJlIHN1cmUgKi8KLSNpZiAhZGVmaW5lZChPUEVOX1NPVU5EX1NZU1RFTSkgfHwgIWRlZmluZWQoU05EQ1RMX0RTUF9TVEVSRU8pCisvKiBjaGVjayBmb3Igb25lIG9mIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSBzcGVjaWZpYyBTTkRDVExfIGRlZmluZXMgKi8KKyNpZiAhZGVmaW5lZChTTkRDVExfRFNQX1NURVJFTykKICNlcnJvciBObyBvcGVuIHNvdW5kIHN5c3RlbQogI2VuZGlmCiAKQEAgLTIwNzcsMTIgKzIwNzcsMTMgQEAKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgogI2xpbmUgMjA3OSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NlbS5oPgogaW50IG1haW4oKSB7CiB1bmlvbiBzZW11biBmb28KIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDg2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwODc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX3VuaW9uX3NlbXVuPSJ5ZXMiCiBlbHNlCkBAIC0yMTEwLDcgKzIxMTEsNyBAQAogdGhlbgogICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCiAgIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTE0OiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjExNTogY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMTE4LDcgKzIxMTksNyBAQAogICBhY19jdl9jX2djY19zdHJlbmd0aF9idWc9InllcyIKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEyMiAiY29uZmlndXJlIgorI2xpbmUgMjEyMyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKHZvaWQpIHsKQEAgLTIxMjksNyArMjEzMCw3IEBACiAgIGV4aXQoIEFycmF5WzFdICE9IC0yICk7CiB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ibm8iCiBlbHNlCkBAIC0yMTUyLDcgKzIxNTMsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNTY6IGNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiID4mNQorZWNobyAiY29uZmlndXJlOjIxNTc6IGNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZXh0ZXJuX3ByZWZpeCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMTY0LDE0ICsyMTY1LDE0IEBACiAJLmxvbmcgMAogRU9GCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTY4ICJjb25maWd1cmUiCisjbGluZSAyMTY5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIGV4dGVybiBpbnQgYWNfdGVzdDsKIGludCBtYWluKCkgewogaWYgKGFjX3Rlc3QpIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE3NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZXh0ZXJuX3ByZWZpeD0ieWVzIgogZWxzZQpAQCAtMjE5NSw3ICsyMTk2LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciBhc3NlbWJsZXIgYWNjZXB0cyAuc3RyaW5nIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE5OTogY2hlY2tpbmcgIndoZXRoZXIgYXNzZW1ibGVyIGFjY2VwdHMgLnN0cmluZyIiID4mNQorZWNobyAiY29uZmlndXJlOjIyMDA6IGNoZWNraW5nICJ3aGV0aGVyIGFzc2VtYmxlciBhY2NlcHRzIC5zdHJpbmciIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2FzbV9zdHJpbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjIwNSwxNCArMjIwNiwxNCBAQAogCS5zdHJpbmcgInRlc3QiCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMDkgImNvbmZpZ3VyZSIKKyNsaW5lIDIyMTAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2FzbV9zdHJpbmc9InllcyIKIGVsc2UKQEAgLTIyMzksMjEgKzIyNDAsMjEgQEAKIGlmIHRlc3QgIiRMSUJfVEFSR0VUIiA9ICJsaWJ3aW5lLnNvLjEuMCIKIHRoZW4KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI0MzogY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjI0NDogY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19kbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBzYXZlZF9jZmxhZ3M9JENGTEFHUwogICBDRkxBR1M9IiRDRkxBR1MgLWZQSUMgLXNoYXJlZCAtV2wsLXNvbmFtZSxjb25mdGVzdC5zby4xLjAiCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNTAgImNvbmZpZ3VyZSIKKyNsaW5lIDIyNTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZGxsPSJ5ZXMiCiBlbHNlCkBAIC0yMjgxLDEyICsyMjgyLDEyIEBACiBmb3IgYWNfZnVuYyBpbiBjbG9uZSBtZW1tb3ZlIHN0cmVycm9yIHRjZ2V0YXR0ciB1c2xlZXAgd2FpdDQgd2FpdHBpZAogZG8KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI4NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMjg2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjkwICJjb25maWd1cmUiCisjbGluZSAyMjkxICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KQEAgLTIzMDksNyArMjMxMCw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCiBlbHNlCkBAIC0yMzM3LDE3ICsyMzM4LDE3IEBACiBkbwogYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM0MTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorZWNobyAiY29uZmlndXJlOjIzNDI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzQ2ICJjb25maWd1cmUiCisjbGluZSAyMzQ3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzUxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzUyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0yMzc0LDEyICsyMzc1LDEyIEBACiBkb25lCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzg6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQorZWNobyAiY29uZmlndXJlOjIzNzk6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzODMgImNvbmZpZ3VyZSIKKyNsaW5lIDIzODQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CkBAIC0yNDMwLDEyICsyNDMxLDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQzNDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQorZWNobyAiY29uZmlndXJlOjI0MzU6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQzOSAiY29uZmlndXJlIgorI2xpbmUgMjQ0MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewpAQCAtMjQ4NCw3ICsyNDg1LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0ODg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ4OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfY29uc3Q9eWVzCiBlbHNlCkBAIC0yNTA1LDEyICsyNTA2LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUwOTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAiY29uZmlndXJlOjI1MTA6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MTQgImNvbmZpZ3VyZSIKKyNsaW5lIDI1MTUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgpAQCAtMjUxOCw3ICsyNTE5LDcgQEAKICNpbmNsdWRlIDxmbG9hdC5oPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTIyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTIzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0yNTM1LDcgKzI1MzYsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzOSAiY29uZmlndXJlIgorI2xpbmUgMjU0MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiBFT0YKQEAgLTI1NTMsNyArMjU1NCw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTU3ICJjb25maWd1cmUiCisjbGluZSAyNTU4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KIEVPRgpAQCAtMjU3NCw3ICsyNTc1LDcgQEAKICAgOgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTc4ICJjb25maWd1cmUiCisjbGluZSAyNTc5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgogI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCkBAIC0yNTg1LDcgKzI1ODYsNyBAQAogZXhpdCAoMCk7IH0KIAogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1ODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICA6CiBlbHNlCkBAIC0yNjA5LDEyICsyNjEwLDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjEzOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNjE0OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MTggImNvbmZpZ3VyZSIKKyNsaW5lIDI2MTkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2lmIFNURENfSEVBREVSUwpAQCAtMjc4MCw2ICsyNzgxLDcgQEAKIHJlc291cmNlcy9NYWtlZmlsZQogc2NoZWR1bGVyL01ha2VmaWxlCiB0b29scy9NYWtlZmlsZQordHN4MTEvTWFrZWZpbGUKIHdpbjMyL01ha2VmaWxlCiB3aW5kb3dzL01ha2VmaWxlICBpbmNsdWRlL2NvbmZpZy5oIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CiBFT0YKQEAgLTI5MDUsNiArMjkwNyw3IEBACiByZXNvdXJjZXMvTWFrZWZpbGUKIHNjaGVkdWxlci9NYWtlZmlsZQogdG9vbHMvTWFrZWZpbGUKK3RzeDExL01ha2VmaWxlCiB3aW4zMi9NYWtlZmlsZQogd2luZG93cy9NYWtlZmlsZSAifQogRU9GCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KaW5kZXggODNkYTg5Ni4uYzcwZDgwYyAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtNTgsOCArNTgsOCBAQAogQUNfQ0FDSEVfQ0hFQ0soImZvciBPcGVuIFNvdW5kIFN5c3RlbSIsCiAJYWNfY3ZfY19vcGVuc291bmRzeXN0ZW0sCiAJQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+XSxbCi0vKiBjaGVjayBmb3Igb3BlbiBzb3VuZCBzeXN0ZW0gYW5kIG9uZSBvZiB0aGUgU05EQ1RMXyBkZWZpbmVzIHRvIGJlIHN1cmUgKi8KLSNpZiAhZGVmaW5lZChPUEVOX1NPVU5EX1NZU1RFTSkgfHwgIWRlZmluZWQoU05EQ1RMX0RTUF9TVEVSRU8pCisvKiBjaGVjayBmb3Igb25lIG9mIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSBzcGVjaWZpYyBTTkRDVExfIGRlZmluZXMgKi8KKyNpZiAhZGVmaW5lZChTTkRDVExfRFNQX1NURVJFTykKICNlcnJvciBObyBvcGVuIHNvdW5kIHN5c3RlbQogI2VuZGlmCiBdLGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtPSJ5ZXMiLGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtPSJubyIpKQpAQCAtNzIsNyArNzIsOCBAQAogZG5sICoqKiogQ2hlY2sgZm9yIHVuaW9uIHNlbXVuICoqKioKIAogQUNfQ0FDSEVfQ0hFQ0soImZvciB1bmlvbiBzZW11biIsIGFjX2N2X2NfdW5pb25fc2VtdW4sCi0gQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvc2VtLmg+XSxbdW5pb24gc2VtdW4gZm9vXSwKKyBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zZW0uaD5dLFt1bmlvbiBzZW11biBmb29dLAogICAgICAgICAgICAgICAgIGFjX2N2X2NfdW5pb25fc2VtdW49InllcyIsIGFjX2N2X2NfdW5pb25fc2VtdW49Im5vIikpCiBpZiB0ZXN0ICIkYWNfY3ZfY191bmlvbl9zZW11biIgPSAieWVzIgogdGhlbgpAQCAtMjA3LDYgKzIwOCw3IEBACiByZXNvdXJjZXMvTWFrZWZpbGUKIHNjaGVkdWxlci9NYWtlZmlsZQogdG9vbHMvTWFrZWZpbGUKK3RzeDExL01ha2VmaWxlCiB3aW4zMi9NYWtlZmlsZQogd2luZG93cy9NYWtlZmlsZSBdKQogCmRpZmYgLS1naXQgYS9jb250cm9scy9jb21iby5jIGIvY29udHJvbHMvY29tYm8uYwppbmRleCA1OWI1MWNiLi5hZjYxZDYzIDEwMDY0NAotLS0gYS9jb250cm9scy9jb21iby5jCisrKyBiL2NvbnRyb2xzL2NvbWJvLmMKQEAgLTM2MiwxMCArMzYyLDkgQEAKICAgICBVSU5UMzIgCXgsIHk7CiAgICAgQk9PTDMyIAliQm9vbDsKIAotICAgIGlmKCBscGhjLT53U3RhdGUgJiBDQkZfTk9SRURSQVcgKQotICAgICAgICByZXR1cm47CisgICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9OT1JFRFJBVyApIHJldHVybjsKIAotICAgIGhQcmV2QnJ1c2g9KEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGhkYyxHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlRORkFDRSkpOworICAgIGhQcmV2QnJ1c2ggPSAoSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlRORkFDRSkpOwogICAgIENPTlZfUkVDVDE2VE8zMiggJmxwaGMtPlJlY3RCdXR0b24sICZyICk7CiAKICAgICBSZWN0YW5nbGUzMihoZGMsIHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tICk7CkBAIC00MDMsOCArNDAyLDcgQEAKICAgIElOVDMyCWlkLCBzaXplID0gMDsKICAgIExQU1RSCXBUZXh0ID0gTlVMTDsKIAotICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9OT1JFRFJBVyApCi0gICAgICAgIHJldHVybjsKKyAgIGlmKCBscGhjLT53U3RhdGUgJiBDQkZfTk9SRURSQVcgKSByZXR1cm47CiAKICAgIC8qIGZvbGxvdyBXaW5kb3dzIGNvbWJvYm94IHRoYXQgc2VuZHMgYSBidW5jaCBvZiB0ZXh0IAogICAgICogaW5xdWlyaWVzIHRvIGl0cyBsaXN0Ym94IHdoaWxlIHByb2Nlc3NpbmcgV01fUEFJTlQuICovCkBAIC01MzcsOSArNTM1LDkgQEAKIAkgIC8qIHBhaW50IHRleHQgZmllbGQgKi8KIAogCSAgR1JBUEhfRHJhd1JlY3RhbmdsZSggaERDLCBscGhjLT5SZWN0RWRpdC5sZWZ0LCBscGhjLT5SZWN0RWRpdC50b3AsCi0JCQkgICAgICAgbHBoYy0+UmVjdEVkaXQucmlnaHQgLSBscGhjLT5SZWN0RWRpdC5sZWZ0LCAKLQkJCSAgICAgICBscGhjLT5SZWN0QnV0dG9uLmJvdHRvbSAtIGxwaGMtPlJlY3RCdXR0b24udG9wLAotCQkJICAgICAgIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfV0lORE9XRlJBTUUpICk7IAorCQkJCSAgICBscGhjLT5SZWN0RWRpdC5yaWdodCAtIGxwaGMtPlJlY3RFZGl0LmxlZnQsIAorCQkJCSAgICBscGhjLT5SZWN0QnV0dG9uLmJvdHRvbSAtIGxwaGMtPlJlY3RCdXR0b24udG9wLAorCQkJCSAgICBHZXRTeXNDb2xvclBlbjMyKENPTE9SX1dJTkRPV0ZSQU1FKSApOyAKIAkgIENCUGFpbnRUZXh0KCBscGhjLCBoREMgKTsKICAgICAgIH0KICAgICAgIGlmKCBoUHJldkJydXNoICkgU2VsZWN0T2JqZWN0MzIoIGhEQywgaFByZXZCcnVzaCApOwpAQCAtNjc5LDEzICs2NzcsMTIgQEAKICAgIFNldFdpbmRvd1BvczMyKCBscGhjLT5oV25kTEJveCwgSFdORF9UT1AsIHJlY3QubGVmdCwgcmVjdC50b3AsIAogCQkgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgCiAJCSBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1NJWkUgfCBTV1BfTk9SRURSQVcpOworCiAgICBpZiggIShscGhjLT53U3RhdGUgJiBDQkZfTk9SRURSQVcpICkKLSAgIHsKICAgICAgICBpZiggcFJlY3QgKQogICAgICAgICAgICBSZWRyYXdXaW5kb3cxNiggbHBoYy0+c2VsZi0+aHduZFNlbGYsIHBSZWN0LCAwLCBSRFdfSU5WQUxJREFURSB8IAogCQkJICAgUkRXX0VSQVNFIHwgUkRXX1VQREFURU5PVyB8IFJEV19OT0NISUxEUkVOICk7Ci0gICAgICAgU2hvd1dpbmRvdzMyKCBscGhjLT5oV25kTEJveCwgU1dfU0hPV05BICk7Ci0gICB9CisgICBTaG93V2luZG93MzIoIGxwaGMtPmhXbmRMQm94LCBTV19TSE9XTkEgKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05NTMsNyArOTUwLDcgQEAKIAkgICAgIGJyZWFrOwogICAgfQogCi0gIHJldHVybiBTZW5kTWVzc2FnZTMyQSggbHBoYy0+b3duZXIsIG1zZywgbHBoYy0+c2VsZi0+d0lEbWVudSwgbFBhcmFtICk7CisgICByZXR1cm4gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPm93bmVyLCBtc2csIGxwaGMtPnNlbGYtPndJRG1lbnUsIGxQYXJhbSApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk2MSw0MSArOTU4LDQyIEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIENPTUJPX0dldFRleHQoIExQSEVBRENPTUJPIGxwaGMsIFVJTlQzMiBOLCBMUFNUUiBscFRleHQpCiB7Ci0gICBJTlQzMglpZHg7Ci0KICAgIGlmKCBscGhjLT53U3RhdGUgJiBDQkZfRURJVCApCiAgICAgICAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kRWRpdCwgV01fR0VUVEVYVCwgCiAJCQkgICAgIChXUEFSQU0zMilOLCAoTFBBUkFNKWxwVGV4dCApOyAgICAgCiAKICAgIC8qIGdldCBpdCBmcm9tIHRoZSBsaXN0Ym94ICovCiAKLSAgIGlkeCA9IFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfR0VUQ1VSU0VMMzIsIDAsIDAgKTsKLSAgIGlmKCBpZHggIT0gTEJfRVJSICkKKyAgIGlmKCBscGhjLT5oV25kTEJveCApCiAgICB7Ci0gICAgICAgTFBTVFIgICAgICAgIGxwQnVmZmVyOwotICAgICAgIElOVDMyCSAgICBsZW5ndGggPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFRMRU4zMiwKLQkJCQkJICAgIChXUEFSQU0zMilpZHgsIDAgKTsKLQotICAgICAgIC8qICdsZW5ndGgnIGlzIHdpdGhvdXQgdGhlIHRlcm1pbmF0aW5nIGNoYXJhY3RlciAqLwotICAgICAgIGlmKCBsZW5ndGggPj0gTiApCi0JICAgbHBCdWZmZXIgPSAoTFBTVFIpIEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuZ3RoICsgMSApOwotICAgICAgIGVsc2UgCi0JICAgbHBCdWZmZXIgPSBscFRleHQ7Ci0KLSAgICAgICBpZiggbHBCdWZmZXIgKQorICAgICAgIElOVDMyIGlkeCA9IFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfR0VUQ1VSU0VMMzIsIDAsIDAgKTsKKyAgICAgICBpZiggaWR4ICE9IExCX0VSUiApCiAgICAgICAgewotCSAgIElOVDMyICAgIG4gPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFQzMiwgCi0JCQkJICAgICAgIChXUEFSQU0zMilpZHgsIChMUEFSQU0pbHBUZXh0ICk7CisgICAgICAgICAgIExQU1RSCWxwQnVmZmVyOworICAgICAgICAgICBJTlQzMglsZW5ndGggPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFRMRU4zMiwKKwkJCQkJICAgICAgICAoV1BBUkFNMzIpaWR4LCAwICk7CiAKLQkgICAvKiB0cnVuY2F0ZSBpZiBidWZmZXIgaXMgdG9vIHNob3J0ICovCisgICAgICAgICAgIC8qICdsZW5ndGgnIGlzIHdpdGhvdXQgdGhlIHRlcm1pbmF0aW5nIGNoYXJhY3RlciAqLworICAgICAgICAgICBpZiggbGVuZ3RoID49IE4gKQorCSAgICAgICBscEJ1ZmZlciA9IChMUFNUUikgSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW5ndGggKyAxICk7CisgICAgICAgICAgIGVsc2UgCisJICAgICAgIGxwQnVmZmVyID0gbHBUZXh0OwogCi0JICAgaWYoIGxlbmd0aCA+PSBOICkKLQkgICB7Ci0JICAgICAgIGlmKCBuICE9IExCX0VSUiApIG1lbWNweSggbHBUZXh0LCBscEJ1ZmZlciwgKE4+bikgPyBuKzEgOiBOLTEgKTsKLQkgICAgICAgbHBUZXh0W04gLSAxXSA9ICdcMCc7Ci0JICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEJ1ZmZlciApOworICAgICAgICAgICBpZiggbHBCdWZmZXIgKQorICAgICAgICAgICB7CisJICAgICAgIElOVDMyICAgIG4gPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFQzMiwgCisJCQkJCSAgIChXUEFSQU0zMilpZHgsIChMUEFSQU0pbHBUZXh0ICk7CisKKwkgICAgICAgLyogdHJ1bmNhdGUgaWYgYnVmZmVyIGlzIHRvbyBzaG9ydCAqLworCisJICAgICAgIGlmKCBsZW5ndGggPj0gTiApCisJICAgICAgIHsKKwkgICAgICAgICAgIGlmKCBuICE9IExCX0VSUiApIG1lbWNweSggbHBUZXh0LCBscEJ1ZmZlciwgKE4+bikgPyBuKzEgOiBOLTEgKTsKKwkgICAgICAgICAgIGxwVGV4dFtOIC0gMV0gPSAnXDAnOworCSAgICAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwQnVmZmVyICk7CisJICAgICAgIH0KKwkgICAgICAgcmV0dXJuIChMUkVTVUxUKW47CiAJICAgfQotCSAgIHJldHVybiAoTFJFU1VMVCluOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwpAQCAtMTA0NCw2ICsxMDQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgbHBoYy0+UmVjdEVkaXQuYm90dG9tIC0gbHBoYy0+UmVjdEVkaXQudG9wLAogICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9SRURSQVcgKTsKICAgICAgICBscGhjLT53U3RhdGUgJj0gfkNCRl9OT1JFU0laRTsKKwogICAgICAgIGlmKCBiUmVkcmF3ICYmICEobHBoYy0+d1N0YXRlICYgQ0JGX05PUkVEUkFXKSApCiAgICAgICAgICAgIFJlZHJhd1dpbmRvdzMyKCBscGhjLT5zZWxmLT5od25kU2VsZiwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19JTlZBTElEQVRFIHwgUkRXX0VSQVNFIHwgUkRXX1VQREFURU5PVyApOwpAQCAtMTM1Miw3ICsxMzUxLDcgQEAKIAkJaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9FRElUICkKIAkJICAgIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kRWRpdCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKIAkJU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwotCQlicmVhazsKKwkJcmV0dXJuIDA7CiAJCQogCWNhc2UgV01fU1lTS0VZRE9XTjoKIAkJaWYoIEtFWURBVEFfQUxUICYgSElXT1JEKGxQYXJhbSkgKQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbGlzdGJveC5jIGIvY29udHJvbHMvbGlzdGJveC5jCmluZGV4IGYxNjNjNDcuLjgxZDY2NTQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2xpc3Rib3guYworKysgYi9jb250cm9scy9saXN0Ym94LmMKQEAgLTI1NjYsNiArMjU2NiwxMSBAQAogCQkgICAgIH0KIAkJICAgICByZXR1cm4gTElTVEJPWF9IYW5kbGVLZXlEb3duKCB3bmQsIGRlc2NyLCB3UGFyYW0gKTsKIAorCQljYXNlIFdNX05DREVTVFJPWToKKwkJICAgICBpZiggQ0JfR0VUVFlQRShscGhjKSAhPSBDQlNfU0lNUExFICkKKwkJCSBscGhjLT5oV25kTEJveCA9IDA7CisJCSAgICAgLyogZmFsbCB0aHJvdWdoICovCisKIAkgICAgICAgIGRlZmF1bHQ6CiAJCSAgICAgcmV0dXJuIExpc3RCb3hXbmRQcm9jKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiAJICAgIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2hhc2guYyBiL2RlYnVnZ2VyL2hhc2guYwppbmRleCBiYTg3NDczLi5hYmEwMDFiIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9oYXNoLmMKKysrIGIvZGVidWdnZXIvaGFzaC5jCkBAIC03OTgsMTYgKzc5OCwxMSBAQAogICAgIGludCBpLCBqOwogICAgIElNQUdFX1NFQ1RJT05fSEVBREVSICpwZV9zZWc7CiAgICAgSU1BR0VfRVhQT1JUX0RJUkVDVE9SWSAqZXhwb3J0czsKLSAgICBJTUFHRV9EQVRBX0RJUkVDVE9SWSAqZGVidWdfZGlyOworICAgIElNQUdFX0RBVEFfRElSRUNUT1JZICpkaXI7CiAgICAgV09SRCAqb3JkaW5hbHM7CiAgICAgdm9pZCAqKmZ1bmN0aW9uczsKICAgICBjb25zdCBjaGFyICoqbmFtZXM7CiAKLSAgICBQRV9NT0RSRUYgKnBlbSA9IFBST0NFU1NfQ3VycmVudCgpLT5tb2RyZWZfbGlzdDsKLSAgICB3aGlsZSAocGVtICYmIChwZW0tPm1vZHVsZSAhPSBoTW9kdWxlKSkgcGVtID0gcGVtLT5uZXh0OwotICAgIGlmICghcGVtKSByZXR1cm47Ci0gICAgZXhwb3J0cyA9IHBlbS0+cGVfZXhwb3J0OwotCiAgICAgYWRkci5zZWcgPSAwOwogICAgIGFkZHIudHlwZSA9IE5VTEw7CiAKQEAgLTgzNSw3ICs4MzAsMTAgQEAKIAogICAgIC8qIEFkZCBleHBvcnRlZCBmdW5jdGlvbnMgKi8KIAotICAgIGlmICghZXhwb3J0cykgcmV0dXJuOworICAgIGRpciA9ICZQRV9IRUFERVIoaE1vZHVsZSktPk9wdGlvbmFsSGVhZGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhRGlyZWN0b3J5W0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9FWFBPUlRdOworICAgIGlmICghZGlyLT5TaXplKSByZXR1cm47CisgICAgZXhwb3J0cyAgID0gKElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgKilSVkEoIGRpci0+VmlydHVhbEFkZHJlc3MgKTsKICAgICBvcmRpbmFscyAgPSAoV09SRCAqKVJWQSggZXhwb3J0cy0+QWRkcmVzc09mTmFtZU9yZGluYWxzICk7CiAgICAgbmFtZXMgICAgID0gKGNvbnN0IGNoYXIgKiopUlZBKCBleHBvcnRzLT5BZGRyZXNzT2ZOYW1lcyApOwogICAgIGZ1bmN0aW9ucyA9ICh2b2lkICoqKVJWQSggZXhwb3J0cy0+QWRkcmVzc09mRnVuY3Rpb25zICk7CkBAIC04NjAsMTAgKzg1OCw5IEBACiAgICAgICAgIERFQlVHX0FkZFN5bWJvbCggYnVmZmVyLCAmYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMgKTsKICAgICB9CiAKLSAgICBkZWJ1Z19kaXIgPSAmUEVfSEVBREVSKGhNb2R1bGUpLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9ERUJVR107Ci0gICAgaWYgKGRlYnVnX2Rpci0+U2l6ZSkKLSAgICAgICAgREVCVUdfUmVnaXN0ZXJEZWJ1Z0luZm8oIGhNb2R1bGUsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19kaXItPlZpcnR1YWxBZGRyZXNzLCBkZWJ1Z19kaXItPlNpemUgKTsKKyAgICBkaXIgPSAmUEVfSEVBREVSKGhNb2R1bGUpLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9ERUJVR107CisgICAgaWYgKGRpci0+U2l6ZSkKKyAgICAgICAgREVCVUdfUmVnaXN0ZXJEZWJ1Z0luZm8oaE1vZHVsZSwgbmFtZSwgZGlyLT5WaXJ0dWFsQWRkcmVzcywgZGlyLT5TaXplKTsKICN1bmRlZiBSVkEKIH0KIApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvc3RhYnMuYyBiL2RlYnVnZ2VyL3N0YWJzLmMKaW5kZXggOThiY2MzOC4uYmI2NzBmMSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvc3RhYnMuYworKysgYi9kZWJ1Z2dlci9zdGFicy5jCkBAIC05Niw3ICs5Niw3IEBACiAKICNkZWZpbmUgTlJfU1RBQl9IQVNIIDUyMQogCi1zdHJ1Y3Qga25vd25fdHlwZWRlZiAqIGt0ZF9oZWFkW05SX1NUQUJfSEFTSF07CitzdHJ1Y3Qga25vd25fdHlwZWRlZiAqIGt0ZF9oZWFkW05SX1NUQUJfSEFTSF0gPSB7TlVMTCx9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHN0YWJfaGFzaCggY29uc3QgY2hhciAqIG5hbWUgKQogewpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9pbnRlcm5hbHMgYi9kb2N1bWVudGF0aW9uL2ludGVybmFscwppbmRleCA1ZmZkODAwLi40MGNhNjkwIDEwMDY0NAotLS0gYS9kb2N1bWVudGF0aW9uL2ludGVybmFscworKysgYi9kb2N1bWVudGF0aW9uL2ludGVybmFscwpAQCAtNiw3ICs2LDM5IEBACiBHREkgTU9EVUxFCiA9PT09PT09PT09CiAKLS4uLgorMS4gWCBXaW5kb3dzIFN5c3RlbSBpbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBYIGxpYnJhcmllcyB1c2VkIHRvIGltcGxlbWVudCBYIGNsaWVudHMgKHN1Y2ggYXMgV2luZSkgZG8gbm90IHdvcmsKK3Byb3Blcmx5IGlmIG11bHRpcGxlIHRocmVhZHMgYWNjZXNzIHRoZSBzYW1lIGRpc3BsYXkgY29uY3VycmVudGx5LiBJdCBpcworcG9zc2libGUgdG8gY29tcGlsZSB0aGUgWCBsaWJyYXJpZXMgdG8gcGVyZm9ybSB0aGVpciBvd24gc3luY2hyb25pemF0aW9uCisoaW5pdGlhdGVkIGJ5IGNhbGxpbmcgWEluaXRUaHJlYWRzKCkpLiBIb3dldmVyLCBXaW5lIGRvZXMgbm90IHVzZSB0aGlzCithcHByb2FjaC4gSW5zdGVhZCBXaW5lIHBlcmZvcm1zIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHB5IHB1dHRpbmcgYQord3JhcHBlciBhcm91bmQgZXZlcnkgWCBjYWxsIHRoYXQgaXMgdXNlZC4gVGhpcyB3cmFwcGVyIHByb3RlY3RzIGxpYnJhcnkKK2FjY2VzcyB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbiwgYW5kIGFsc28gYXJyYW5nZXMgdGhpbmdzIHNvIHRoYXQgWAorbGlicmFyaWVzIGNvbXBpbGVkIHdpdGhvdXQgLURfUkVFTlRSQU5UIChlZy4gd2l0aCBnbG9iYWwgZXJybm8gdmFyaWFibGUpCit3aWxsIHdvcmsgd2l0aCBXaW5lLgorCitUbyBtYWtlIHRoaXMgc2NoZW1lIHdvcmssIGFsbCBjYWxscyB0byBYIG11c3QgdXNlIHRoZSBwcm9wZXIgd3JhcHBlcgorZnVuY3Rpb25zIChvciBkbyB0aGVpciBvd24gc3luY2hyb25pemF0aW9uIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQord3JhcHBlcnMpLiBUaGUgd3JhcHBlciBmb3IgYSBmdW5jdGlvbiBYLi4uKCkgaXMgY2FsbGVzIFRTWC4uLigpIChmb3IKKyJUaHJlYWQgU2FmZSBYIC4uLiIpLiBTbyBmb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiBjYWxsaW5nIFhPcGVuRGlzcGxheSgpCitpbiB0aGUgY29kZSwgVFNYT3BlbkRpc3BsYXkoKSBtdXN0IGJlIHVzZWQuIExpa2V3aXNlLCBYIGluY2x1ZGUgZmlsZXMKK3RoYXQgY29udGFpbiBmdW5jdGlvbiBwcm90b3R5cGVzIGFyZSB3cmFwcGVkLCBzbyB0aGF0IGVnLiAiVFNYdXRpbC5oIiBtdXN0CitiZSBpbmNsdWRlZCByYXRoZXIgdGhhbiA8WDExL1h1dGlsLmg+LiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIHNjaGVtZQoraXMgdXNlZCBldmVyeXdoZXJlIHRvIGF2b2lkIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygbm9uZGV0ZXJtaW5pc3RpYyBhbmQKK2hhcmQtdG8tZmluZCBlcnJvcnMgaW4gV2luZS4KKworVGhlIGNvZGUgZm9yIHRoZSB0aHJlYWQgc2FmZSBYIHdyYXBwZXJzIGlzIGNvbnRhaW5lZCBpbiB0aGUgdHN4MTEvCitkaXJlY3RvcnkgYW5kIGluIGluY2x1ZGUvVFMqLmguIFRvIHVzZSBhIG5ldyAoaWUuIG5vdCBwcmV2aW91c2x5IHVzZWQpIFgKK2Z1bmN0aW9uIGluIFdpbmUsIGEgbmV3IHdyYXBwZXIgbXVzdCBiZSBjcmVhdGVkLiBUaGUgd3JhcHBlcnMgYXJlCitnZW5lcmF0ZWQgKHNlbWktKWF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgWDExUjYgaW5jbHVkZXMgdXNpbmcgdGhlCit0b29scy9tYWtlX1gxMXdyYXBwZXJzIHBlcmwgc2NyaXB0LiBJbiBzaW1wbGUgY2FzZXMgaXQgc2hvdWxkIGJlIGVub3VnaAordG8gYWRkIHRoZSBuYW1lIG9mIHRoZSBuZXcgZnVuY3Rpb24gdG8gdGhlIGxpc3QgaW4gdHN4MTEvWDExX2NhbGxzOyBpZgordGhpcyBkb2VzIG5vdCB3b3JrIHRoZSB3cmFwcGVyIG11c3QgYmUgYWRkZWQgbWFudWFsbHkgdG8gdGhlCittYWtlX1gxMXdyYXBwZXJzIHNjcmlwdC4gU2VlIGNvbW1lbnRzIGluIHRzeDExL1gxMV9jYWxscyBhbmQKK3Rvb2xzL21ha2VfWDExd3JhcHBlcnMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKwogCiBVU0VSIE1PRFVMRQogPT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vd2luZS5tYW4gYi9kb2N1bWVudGF0aW9uL3dpbmUubWFuCmluZGV4IGM0ZDI0ZWIuLjdlZWI1M2MgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vd2luZS5tYW4KKysrIGIvZG9jdW1lbnRhdGlvbi93aW5lLm1hbgpAQCAtMTA5LDcgKzEwOSw3IEBACiAuSSAtbGFuZ3VhZ2UgeHgKIFNldCB0aGUgbGFuZ3VhZ2UgdG8KIC5JIHh4Ci0ob25lIG9mIEVuLCBFcywgRGUsIE5vLCBGciwgRmksIERhLCBDeiwgRW8sIEl0LCBLbywgSHUsIFBsLCBQbykKKyhvbmUgb2YgRW4sIEVzLCBEZSwgTm8sIEZyLCBGaSwgRGEsIEN6LCBFbywgSXQsIEtvLCBIdSwgUGwsIFBvLCBTdywgQ2EpCiAuVFAKIC5JIC1tYW5hZ2VkCiBDcmVhdGUgZWFjaCB0b3AtbGV2ZWwgd2luZG93IGFzIGEgcHJvcGVybHkgbWFuYWdlZCBYIHdpbmRvdwpkaWZmIC0tZ2l0IGEvZmlsZXMvZHJpdmUuYyBiL2ZpbGVzL2RyaXZlLmMKaW5kZXggN2FjYThiNi4uMzQ4NTlhNyAxMDA2NDQKLS0tIGEvZmlsZXMvZHJpdmUuYworKysgYi9maWxlcy9kcml2ZS5jCkBAIC00MCw2ICs0MCw3IEBACiAgICAgY2hhciAgICAgKnJvb3Q7ICAgICAgLyogcm9vdCBkaXIgaW4gVW5peCBmb3JtYXQgd2l0aG91dCB0cmFpbGluZyAvICovCiAgICAgY2hhciAgICAgKmRvc19jd2Q7ICAgLyogY3dkIGluIERPUyBmb3JtYXQgd2l0aG91dCBsZWFkaW5nIG9yIHRyYWlsaW5nIFwgKi8KICAgICBjaGFyICAgICAqdW5peF9jd2Q7ICAvKiBjd2QgaW4gVW5peCBmb3JtYXQgd2l0aG91dCBsZWFkaW5nIG9yIHRyYWlsaW5nIC8gKi8KKyAgICBjaGFyICAgICAqZGV2aWNlOyAgICAvKiByYXcgZGV2aWNlIHBhdGggKi8KICAgICBjaGFyICAgICAgbGFiZWxbMTJdOyAvKiBkcml2ZSBsYWJlbCAqLwogICAgIERXT1JEICAgICBzZXJpYWw7ICAgIC8qIGRyaXZlIHNlcmlhbCBudW1iZXIgKi8KICAgICBEUklWRVRZUEUgdHlwZTsgICAgICAvKiBkcml2ZSB0eXBlICovCkBAIC0xMjYsNyArMTI3LDcgQEAKICAgICBpbnQgaSwgbGVuLCBjb3VudCA9IDA7CiAgICAgY2hhciBuYW1lW10gPSAiRHJpdmUgQSI7CiAgICAgY2hhciBwYXRoW01BWF9QQVRITkFNRV9MRU5dOwotICAgIGNoYXIgYnVmZmVyWzIwXTsKKyAgICBjaGFyIGJ1ZmZlcls4MF07CiAgICAgc3RydWN0IHN0YXQgZHJpdmVfc3RhdF9idWZmZXI7CiAgICAgY2hhciAqcDsKICAgICBET1NEUklWRSAqZHJpdmU7CkBAIC0xNTcsNiArMTU4LDcgQEAKICAgICAgICAgICAgIGRyaXZlLT5kb3NfY3dkICA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgIiIgKTsKICAgICAgICAgICAgIGRyaXZlLT51bml4X2N3ZCA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgIiIgKTsKICAgICAgICAgICAgIGRyaXZlLT50eXBlICAgICA9IERSSVZFX0dldERyaXZlVHlwZSggbmFtZSApOworICAgICAgICAgICAgZHJpdmUtPmRldmljZSAgID0gTlVMTDsKICAgICAgICAgICAgIGRyaXZlLT5mbGFncyAgICA9IDA7CiAgICAgICAgICAgICBkcml2ZS0+ZGV2ICAgICAgPSBkcml2ZV9zdGF0X2J1ZmZlci5zdF9kZXY7CiAgICAgICAgICAgICBkcml2ZS0+aW5vICAgICAgPSBkcml2ZV9zdGF0X2J1ZmZlci5zdF9pbm87CkBAIC0xODAsNiArMTgyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKICAgICAgICAgICAgIGRyaXZlLT5mbGFncyA9IERSSVZFX0dldEZTRmxhZ3MoIG5hbWUsIGJ1ZmZlciApOwogCisgICAgICAgICAgICAvKiBHZXQgdGhlIGRldmljZSAqLworICAgICAgICAgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCBuYW1lLCAiRGV2aWNlIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJbMF0pCisgICAgICAgICAgICAgICAgZHJpdmUtPmRldmljZSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgYnVmZmVyICk7CisKICAgICAgICAgICAgIC8qIE1ha2UgdGhlIGZpcnN0IGhhcmQgZGlzayB0aGUgY3VycmVudCBkcml2ZSAqLwogICAgICAgICAgICAgaWYgKChEUklWRV9DdXJEcml2ZSA9PSAtMSkgJiYgKGRyaXZlLT50eXBlID09IFRZUEVfSEQpKQogICAgICAgICAgICAgICAgIERSSVZFX0N1ckRyaXZlID0gaTsKQEAgLTU1MCw2ICs1NTgsMTcgQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBEUklWRV9PcGVuRGV2aWNlCisgKgorICogT3BlbiB0aGUgZHJpdmUgcmF3IGRldmljZSBhbmQgcmV0dXJuIGEgVW5peCBmZCAob3IgLTEgb24gZXJyb3IpLgorICovCitpbnQgRFJJVkVfT3BlbkRldmljZSggaW50IGRyaXZlLCBpbnQgZmxhZ3MgKQoreworICAgIGlmICghRFJJVkVfSXNWYWxpZCggZHJpdmUgKSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG9wZW4oIERPU0RyaXZlc1tkcml2ZV0uZGV2aWNlLCBmbGFncyApOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERSSVZFX0dldEZyZWVTcGFjZQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZGRyYXcuYyBiL2dyYXBoaWNzL2RkcmF3LmMKaW5kZXggZDJmZDBiZC4uY2U0MTdmNyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvZGRyYXcuYworKysgYi9ncmFwaGljcy9kZHJhdy5jCkBAIC0xMywxMCArMTMsMTAgQEAKICAqLwogLyogUHJvZ3Jlc3Mgb24gZm9sbG93aW5nIHByb2dyYW1zOgogICoKLSAqIC0gRGlhYmxvOgotICogICBUaGUgbW92aWVzIHBsYXkuIFRoZSBnYW1lIGRvZXNuJ3QgeWV0LiBObyBzb3VuZC4gKE5lZWRzIGNsb25lKCkpCisgKiAtIERpYWJsbyBbNjQweDQ4MHg4XToKKyAqICAgVGhlIG1vdmllcyBwbGF5LiBUaGUgZ2FtZSBkb2Vzbid0IHdvcmsgeWV0LgogICoKLSAqIC0gV2luZ0NvbW1hbmRlciA0IChub3QgNSEpIC8gV2luOTUgUGF0Y2g6CisgKiAtIFdpbmdDb21tYW5kZXIgNCAvIFdpbjk1IFBhdGNoIFs2NDB4NDgweDhdOgogICogICBUaGUgaW50cm9tb3ZpZSBwbGF5cywgaW4gOCBiaXQgbW9kZSAodG8gcmVjb25maWd1cmUgd2M0LCBydW4gd2luZQogICogICAid2M0dy5leGUgLUkiKS4gVGhlIDE2Yml0IG1vZGUgbG9va3MgYnJva2VuLCBidXQgSSB0aGluayB0aGlzIGlzIGR1ZSB0bwogICogICBteSBNYXRyb3ggTXlzdGlxdWUgd2hpY2ggdXNlcyA1NjUgKHJnYikgY29sb3J3ZWlnaHQgaW5zdGVhZCBvZiB0aGUgdXN1YWwKQEAgLTI0LDIyICsyNCwyOSBAQAogICogICBSZXF1aXJlcyB0byBiZSBydW4gaW4gNjQweDQ4MHhkZXB0aCBtb2RlIChkb2Vzbid0IHNlZW0gdG8gaGVlZAogICogICBERFNVUkZBQ0VERVNDLmxQaXRjaCkuCiAgKgotICogLSBNb25rZXkgSXNsYW5kIDM6CisgKiAtIE1vbmtleSBJc2xhbmQgMyBbNjQweDQ4MHg4XToKICAqICAgR29lcyB0byB0aGUgZWFzeS9oYXJkIHNlbGVjdGlvbiBzY3JlZW4sIHRoZW4gaGFuZ3MgZHVlIHRvIG5vdCBNVCBzYWZlCiAgKiAgIFhMaWJzLgogICogCi0gKiAtIERhcmsgQW5nZWwgRGVtbyAoU29tZSBzaG9vdCBhbmQgcnVuIGdhbWUpOgotICogICBUaGUgZ3JhcGhpY3Mgc3R1ZmYgd29ya3MgZmluZSwgeW91IGNhbiBwbGF5IGl0LgorICogLSBEaXNjV29ybGQgMiBbNjQweDQ4MHg4XToKKyAqICAgUGxheXMgdGhyb3VnaCBuZWFybHkgYWxsIGludHJvIG1vdmllcy4gU291bmQgYW5kIGFuaW1hdGlvbiBhIGJpdCBicm9rZW4uCisgKiAKKyAqIC0gWHZUIFs2NDB4NDgweDE2XToKKyAqICAgU2hvd3MgdGhlIHNwbGFzaCBzY3JlZW4sIHRoZW4gZmFpbHMgd2l0aCBtaXNzaW5nIEpveXN0aWNrLgogICoKLSAqIC0gWHZUOgotICogICBEb2Vzbid0IHdvcmssIEkgYW0gc3RpbGwgdW5zdXJlIHdoeSBub3QuCisgKiAtIFRvbWIgUmFpZGVyIDIgRGVtbyAodXNpbmcgOCBiaXQgcmVuZGVyZXIpIFs2NDB4NDgweDhdOgorICogICBTaG93cyBzZWxlY3Rpb24gc2NyZWVuLCBidXQga2V5Ym9hcmQgaW5wdXQgZG9lc24ndCB3b3JrLgorICoKKyAqIC0gV2luZ0NvbW1hbmRlciBQcm9waGVjeSBEZW1vICh1c2luZyBzb2Z0d2FyZSByZW5kZXJlcikgWzY0MHg0ODB4MTZdOgorICogICBQbGF5cyBpbnRyb21vdmllLCBoYW5ncyBpbiBzZWxlY3Rpb24gc2NyZWVuIChubyBrZXlib2FyZCBpbnB1dCwgcHJvYmFibHkKKyAqICAgRGlyZWN0SW5wdXQgcHJvYmxlbSkuCiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlICJ0c194bGliLmgiCiAjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgpAQCAtNTAsMzAgKzU3LDM1IEBACiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAiZGMuaCIKICNpbmNsdWRlICJ3aW4uaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiAjaW5jbHVkZSAiZGRyYXcuaCIKKyNpbmNsdWRlICJkM2QuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAKICNpZmRlZiBIQVZFX0xJQlhYRjg2REdBCiAjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMveGY4NmRnYS5oPgogI2VuZGlmCiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRSxSRUZJSUQsTFBWT0lEKik7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1REUkFXIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaik7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0NyZWF0ZVN1cmZhY2UoIExQRElSRUNURFJBVzIgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuayk7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSggTFBESVJFQ1REUkFXIHRoaXMsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZixJVW5rbm93biAqbHB1bmspOwotc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2UyX1ZUYWJsZSBkZHMydnQ7Ci1zdGF0aWMgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZV9WVGFibGUgZGRzdnQ7CisvKiByZXN0b3JlIHNpZ25hbCBoYW5kbGVycyBvdmVyd3JpdHRlbiBieSBYRjg2REdBIAorICogdGhpcyBpcyBhIGRlZmluZSwgZm9yIGl0IHdpbGwgb25seSB3b3JrIGluIGVtdWxhdG9yIG1vZGUKKyAqLworI3VuZGVmIFJFU1RPUkVfU0lHTkFMUworCitzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTNfVlRhYmxlCWRkczN2dDsKK3N0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlMl9WVGFibGUJZGRzMnZ0Oworc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VfVlRhYmxlCQlkZHN2dDsKK3N0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdfVlRhYmxlCQlkZHZ0Oworc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhdzJfVlRhYmxlCQlkZDJ2dDsKK3N0YXRpYyBzdHJ1Y3QgSURpcmVjdDNEX1ZUYWJsZQkJCWQzZHZ0Oworc3RhdGljIHN0cnVjdCBJRGlyZWN0M0QyX1ZUYWJsZQkJCWQzZDJ2dDsKIAogCiBIUkVTVUxUIFdJTkFQSQogRGlyZWN0RHJhd0VudW1lcmF0ZTMyQShMUERERU5VTUNBTExCQUNLMzJBIGRkZW51bXByb2MsTFBWT0lEIGRhdGEpIHsKLQlmcHJpbnRmKHN0ZGVyciwiRGlyZWN0RHJhd0VudW1lcmF0ZUEoJXAsJXApLlxuIixkZGVudW1wcm9jLGRhdGEpOworCS8qIHdlIGhhdmUganVzdCBvbmUgZGlzcGxheSBkcml2ZXIgcmlnaHQgbm93IC4uLiAqLwogCWRkZW51bXByb2MoMCwiV0lORSBEaXNwbGF5IiwiZGlzcGxheSIsZGF0YSk7Ci0JZGRlbnVtcHJvYygodm9pZCopJklJRF9JRGlyZWN0RHJhdywiV0lORSBEaXJlY3REcmF3IiwiZGlyZWN0ZHJhdyIsZGF0YSk7Ci0JZGRlbnVtcHJvYygodm9pZCopJklJRF9JRGlyZWN0RHJhd1BhbGV0dGUsIldJTkUgRGlyZWN0UGFsZXR0ZSIsImRpcmVjdHBhbGV0dGUiLGRhdGEpOwogCXJldHVybiAwOwogfQogCkBAIC04Myw4ICs5NSw5MCBAQAogCXJldHVybiAwOwogfQogCisKICNpZmRlZiBIQVZFX0xJQlhYRjg2REdBCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIF9kdW1wX0REQkxURlgoRFdPUkQgZmxhZ21hc2spIHsKKwlpbnQJaTsKKwljb25zdCBzdHJ1Y3QgeworCQlEV09SRAltYXNrOworCQljaGFyCSpuYW1lOworCX0gZmxhZ3NbXSA9IHsKKyNkZWZpbmUgRkUoeCkgeyB4LCAjeH0sCisJCUZFKEREQkxURlhfQVJJVEhTVFJFVENIWSkKKwkJRkUoRERCTFRGWF9NSVJST1JMRUZUUklHSFQpCisJCUZFKEREQkxURlhfTUlSUk9SVVBET1dOKQorCQlGRShEREJMVEZYX05PVEVBUklORykKKwkJRkUoRERCTFRGWF9ST1RBVEUxODApCisJCUZFKEREQkxURlhfUk9UQVRFMjcwKQorCQlGRShEREJMVEZYX1JPVEFURTkwKQorCQlGRShEREJMVEZYX1pCVUZGRVJSQU5HRSkKKwkJRkUoRERCTFRGWF9aQlVGRkVSQkFTRURFU1QpCisJfTsKKwlmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCisJCWlmIChmbGFnc1tpXS5tYXNrICYgZmxhZ21hc2spCisJCQlmcHJpbnRmKHN0ZGVyciwiJXMgIixmbGFnc1tpXS5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX2R1bXBfRERCTFRGQVNUKERXT1JEIGZsYWdtYXNrKSB7CisJaW50CWk7CisJY29uc3Qgc3RydWN0IHsKKwkJRFdPUkQJbWFzazsKKwkJY2hhcgkqbmFtZTsKKwl9IGZsYWdzW10gPSB7CisjZGVmaW5lIEZFKHgpIHsgeCwgI3h9LAorCQlGRShEREJMVEZBU1RfTk9DT0xPUktFWSkKKwkJRkUoRERCTFRGQVNUX1NSQ0NPTE9SS0VZKQorCQlGRShEREJMVEZBU1RfREVTVENPTE9SS0VZKQorCQlGRShEREJMVEZBU1RfV0FJVCkKKwl9OworCWZvciAoaT0wO2k8c2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pO2krKykKKwkJaWYgKGZsYWdzW2ldLm1hc2sgJiBmbGFnbWFzaykKKwkJCWZwcmludGYoc3RkZXJyLCIlcyAiLGZsYWdzW2ldLm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBfZHVtcF9EREJMVChEV09SRCBmbGFnbWFzaykgeworCWludAlpOworCWNvbnN0IHN0cnVjdCB7CisJCURXT1JECW1hc2s7CisJCWNoYXIJKm5hbWU7CisJfSBmbGFnc1tdID0geworI2RlZmluZSBGRSh4KSB7IHgsICN4fSwKKwkJRkUoRERCTFRfQUxQSEFERVNUKQorCQlGRShEREJMVF9BTFBIQURFU1RDT05TVE9WRVJSSURFKQorCQlGRShEREJMVF9BTFBIQURFU1RORUcpCisJCUZFKEREQkxUX0FMUEhBREVTVFNVUkZBQ0VPVkVSUklERSkKKwkJRkUoRERCTFRfQUxQSEFFREdFQkxFTkQpCisJCUZFKEREQkxUX0FMUEhBU1JDKQorCQlGRShEREJMVF9BTFBIQVNSQ0NPTlNUT1ZFUlJJREUpCisJCUZFKEREQkxUX0FMUEhBU1JDTkVHKQorCQlGRShEREJMVF9BTFBIQVNSQ1NVUkZBQ0VPVkVSUklERSkKKwkJRkUoRERCTFRfQVNZTkMpCisJCUZFKEREQkxUX0NPTE9SRklMTCkKKwkJRkUoRERCTFRfRERGWCkKKwkJRkUoRERCTFRfRERST1BTKQorCQlGRShEREJMVF9LRVlERVNUKQorCQlGRShEREJMVF9LRVlERVNUT1ZFUlJJREUpCisJCUZFKEREQkxUX0tFWVNSQykKKwkJRkUoRERCTFRfS0VZU1JDT1ZFUlJJREUpCisJCUZFKEREQkxUX1JPUCkKKwkJRkUoRERCTFRfUk9UQVRJT05BTkdMRSkKKwkJRkUoRERCTFRfWkJVRkZFUikKKwkJRkUoRERCTFRfWkJVRkZFUkRFU1RDT05TVE9WRVJSSURFKQorCQlGRShEREJMVF9aQlVGRkVSREVTVE9WRVJSSURFKQorCQlGRShEREJMVF9aQlVGRkVSU1JDQ09OU1RPVkVSUklERSkKKwkJRkUoRERCTFRfWkJVRkZFUlNSQ09WRVJSSURFKQorCQlGRShEREJMVF9XQUlUKQorCQlGRShEREJMVF9ERVBUSEZJTEwpCisJfTsKKwlmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCisJCWlmIChmbGFnc1tpXS5tYXNrICYgZmxhZ21hc2spCisJCQlmcHJpbnRmKHN0ZGVyciwiJXMgIixmbGFnc1tpXS5uYW1lKTsKK30KKwogc3RhdGljIHZvaWQgX2R1bXBfRERTQ0FQUyhEV09SRCBmbGFnbWFzaykgewogCWludAlpOwogCWNvbnN0IHN0cnVjdCB7CkBAIC05Miw3ICsxODYsNyBAQAogCQljaGFyCSpuYW1lOwogCX0gZmxhZ3NbXSA9IHsKICNkZWZpbmUgRkUoeCkgeyB4LCAjeH0sCi0JCUZFKEREU0NBUFNfM0QpCisJCUZFKEREU0NBUFNfUkVTRVJWRUQxKQogCQlGRShERFNDQVBTX0FMUEhBKQogCQlGRShERFNDQVBTX0JBQ0tCVUZGRVIpCiAJCUZFKEREU0NBUFNfQ09NUExFWCkKQEAgLTExNSw3ICsyMDksMTMgQEAKIAkJRkUoRERTQ0FQU19IV0NPREVDKQogCQlGRShERFNDQVBTX01PREVYKQogCQlGRShERFNDQVBTX01JUE1BUCkKKwkJRkUoRERTQ0FQU19SRVNFUlZFRDIpCiAJCUZFKEREU0NBUFNfQUxMT0NPTkxPQUQpCisJCUZFKEREU0NBUFNfVklERU9QT1JUKQorCQlGRShERFNDQVBTX0xPQ0FMVklETUVNKQorCQlGRShERFNDQVBTX05PTkxPQ0FMVklETUVNKQorCQlGRShERFNDQVBTX1NUQU5EQVJEVkdBTU9ERSkKKwkJRkUoRERTQ0FQU19PUFRJTUlaRUQpCiAJfTsKIAlmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCiAJCWlmIChmbGFnc1tpXS5tYXNrICYgZmxhZ21hc2spCkBAIC0xODcsNiArMjg3LDggQEAKIAkJRkUoRERTRF9DS1NSQ0JMVCkKIAkJRkUoRERTRF9NSVBNQVBDT1VOVCkKIAkJRkUoRERTRF9SRUZSRVNIUkFURSkKKwkJRkUoRERTRF9MSU5FQVJTSVpFKQorCQlGRShERFNEX0xQU1VSRkFDRSkKIAl9OwogCWZvciAoaT0wO2k8c2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pO2krKykKIAkJaWYgKGZsYWdzW2ldLm1hc2sgJiBmbGFnbWFzaykKQEAgLTIyMiwxMzEgKzMyNCwxNDUgQEAKIAlyZXR1cm4gRERFUlJfR0VORVJJQzsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlJRGlyZWN0RHJhd1N1cmZhY2UKKyAqLwogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0xvY2soCiAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLExQUkVDVDMyIGxwcmVjdCxMUEREU1VSRkFDRURFU0MgbHBkZHNkLERXT1JEIGZsYWdzLCBIQU5ETEUzMiBobmQKICkgewotCS8qCi0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkxvY2soJXAsJXAsJTA4bHgsJTA4bHgpXG4iLAotCQl0aGlzLGxwcmVjdCxscGRkc2QsZmxhZ3MsKERXT1JEKWhuZAotCSk7Ci0JZnByaW50ZihzdGRlcnIsIi4iKTsKLQkqLwotCWlmIChscHJlY3QpIHsKLQkJLyoKLQkJZnByaW50ZihzdGRlcnIsIglscHJlY3Q6ICVkeCVkLSVkeCVkXG4iLAotCQkJbHByZWN0LT50b3AsbHByZWN0LT5sZWZ0LGxwcmVjdC0+Ym90dG9tLGxwcmVjdC0+cmlnaHQKKwlpZiAoZGVidWdnaW5nX2RkcmF3IHx8IChmbGFncyAmIH4oRERMT0NLX1dBSVR8RERMT0NLX1JFQURPTkxZfERETE9DS19XUklURU9OTFkpKSkKKwkJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkxvY2soJXAsJXAsJTA4bHgsJTA4bHgpXG4iLAorCQkJdGhpcyxscHJlY3QsbHBkZHNkLGZsYWdzLChEV09SRClobmQKIAkJKTsKLQkJICovCi0JCWxwZGRzZC0+bHBTdXJmYWNlID0JdGhpcy0+c3VyZmFjZSsKLQkJCQkJKGxwcmVjdC0+dG9wKnRoaXMtPmxwaXRjaCkrCi0JCQkJCShscHJlY3QtPmxlZnQqKHRoaXMtPmRkcmF3LT5kLmRlcHRoLzgpKTsKLQl9IGVsc2UKLQkJbHBkZHNkLT5scFN1cmZhY2UgPSB0aGlzLT5zdXJmYWNlOwotCWxwZGRzZC0+ZHdXaWR0aAkJPSB0aGlzLT53aWR0aDsKLQlscGRkc2QtPmR3SGVpZ2h0CT0gdGhpcy0+aGVpZ2h0OwotCWxwZGRzZC0+bFBpdGNoCQk9IHRoaXMtPmxwaXRjaDsKLQlfZ2V0cGl4ZWxmb3JtYXQodGhpcy0+ZGRyYXcsJihscGRkc2QtPmRkcGZQaXhlbEZvcm1hdCkpOwotCXJldHVybiAwOwotfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlMl9Mb2NrKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0UyIHRoaXMsTFBSRUNUMzIgbHByZWN0LExQRERTVVJGQUNFREVTQyBscGRkc2QsRFdPUkQgZmxhZ3MsIEhBTkRMRTMyIGhuZAotKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5Mb2NrKCVwLCVwLCUwOGx4LCUwOGx4KVxuIiwKLQkJdGhpcyxscHJlY3QsbHBkZHNkLGZsYWdzLChEV09SRClobmQKLQkpOwotCS8qZnByaW50ZihzdGRlcnIsIi4iKTsqLwogCWlmIChscHJlY3QpIHsKIAkJLyoKIAkJZnByaW50ZihzdGRlcnIsIglscHJlY3Q6ICVkeCVkLSVkeCVkXG4iLAogCQkJbHByZWN0LT50b3AsbHByZWN0LT5sZWZ0LGxwcmVjdC0+Ym90dG9tLGxwcmVjdC0+cmlnaHQKIAkJKTsKIAkJICovCi0JCWxwZGRzZC0+bHBTdXJmYWNlID0JdGhpcy0+c3VyZmFjZSsKLQkJCQkJKGxwcmVjdC0+dG9wKnRoaXMtPmxwaXRjaCkrCi0JCQkJCShscHJlY3QtPmxlZnQqKHRoaXMtPmRkcmF3LT5kLmRlcHRoLzgpKTsKKwkJbHBkZHNkLT55LmxwU3VyZmFjZSA9CXRoaXMtPnMuc3VyZmFjZSsKKwkJCQkJKGxwcmVjdC0+dG9wKnRoaXMtPnMubHBpdGNoKSsKKwkJCQkJKGxwcmVjdC0+bGVmdCoodGhpcy0+cy5kZHJhdy0+ZC5kZXB0aC84KSk7CiAJfSBlbHNlCi0JCWxwZGRzZC0+bHBTdXJmYWNlID0gdGhpcy0+c3VyZmFjZTsKLQlscGRkc2QtPmR3V2lkdGgJCT0gdGhpcy0+d2lkdGg7Ci0JbHBkZHNkLT5kd0hlaWdodAk9IHRoaXMtPmhlaWdodDsKLQlscGRkc2QtPmxQaXRjaAkJPSB0aGlzLT5scGl0Y2g7Ci0JX2dldHBpeGVsZm9ybWF0KHRoaXMtPmRkcmF3LCYobHBkZHNkLT5kZHBmUGl4ZWxGb3JtYXQpKTsKKwkJbHBkZHNkLT55LmxwU3VyZmFjZSA9IHRoaXMtPnMuc3VyZmFjZTsKKwlscGRkc2QtPmR3V2lkdGgJCT0gdGhpcy0+cy53aWR0aDsKKwlscGRkc2QtPmR3SGVpZ2h0CT0gdGhpcy0+cy5oZWlnaHQ7CisJbHBkZHNkLT5sUGl0Y2gJCT0gdGhpcy0+cy5scGl0Y2g7CisJX2dldHBpeGVsZm9ybWF0KHRoaXMtPnMuZGRyYXcsJihscGRkc2QtPmRkcGZQaXhlbEZvcm1hdCkpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX1VubG9jaygKIAlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBWT0lEIHN1cmZhY2UKICkgewotCWRwcmludGZfcmVsYXkoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5VbmxvY2soJXApXG4iLHRoaXMsc3VyZmFjZSk7CisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPlVubG9jayglcClcbiIsdGhpcyxzdXJmYWNlKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9GbGlwKAogCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUERJUkVDVERSQVdTVVJGQUNFIGZsaXB0byxEV09SRCBkd0ZsYWdzCiApIHsKLS8qCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5GbGlwKCVwLCUwOGx4KSxTVFVCXG4iLHRoaXMsZmxpcHRvLGR3RmxhZ3MpOyovCisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkZsaXAoJXAsJTA4bHgpXG4iLHRoaXMsZmxpcHRvLGR3RmxhZ3MpOwogCWlmICghZmxpcHRvKSB7Ci0JCWlmICh0aGlzLT5iYWNrYnVmZmVyKQotCQkJZmxpcHRvID0gdGhpcy0+YmFja2J1ZmZlcjsKKwkJaWYgKHRoaXMtPnMuYmFja2J1ZmZlcikKKwkJCWZsaXB0byA9IHRoaXMtPnMuYmFja2J1ZmZlcjsKIAkJZWxzZQogCQkJZmxpcHRvID0gdGhpczsKIAl9Ci0vKglmcHJpbnRmKHN0ZGVyciwiZj4lbGQiLGZsaXB0by0+ZmJfaGVpZ2h0KTsqLwotCVhGODZER0FTZXRWaWV3UG9ydChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMCxmbGlwdG8tPmZiX2hlaWdodCk7Ci0JaWYgKGZsaXB0by0+cGFsZXR0ZSAmJiBmbGlwdG8tPnBhbGV0dGUtPmNtKQotCQlYRjg2REdBSW5zdGFsbENvbG9ybWFwKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSxmbGlwdG8tPnBhbGV0dGUtPmNtKTsKKwlYRjg2REdBU2V0Vmlld1BvcnQoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLDAsZmxpcHRvLT5zLmZiX2hlaWdodCk7CisJaWYgKGZsaXB0by0+cy5wYWxldHRlICYmIGZsaXB0by0+cy5wYWxldHRlLT5jbSkKKwkJWEY4NkRHQUluc3RhbGxDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksZmxpcHRvLT5zLnBhbGV0dGUtPmNtKTsKIAl3aGlsZSAoIVhGODZER0FWaWV3UG9ydENoYW5nZWQoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLDIpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJ3Iik7CiAJfQotCS8qIGlzIHRoaXMgYSBnb29kIGlkZWEgPyAqLwogCWlmIChmbGlwdG8hPXRoaXMpIHsKIAkJaW50CXRtcDsKIAkJTFBWT0lECXB0bXA7CiAKLQkJdG1wID0gdGhpcy0+ZmJfaGVpZ2h0OwotCQl0aGlzLT5mYl9oZWlnaHQgPSBmbGlwdG8tPmZiX2hlaWdodDsKLQkJZmxpcHRvLT5mYl9oZWlnaHQgPSB0bXA7CisJCXRtcCA9IHRoaXMtPnMuZmJfaGVpZ2h0OworCQl0aGlzLT5zLmZiX2hlaWdodCA9IGZsaXB0by0+cy5mYl9oZWlnaHQ7CisJCWZsaXB0by0+cy5mYl9oZWlnaHQgPSB0bXA7CiAKLQkJcHRtcCA9IHRoaXMtPnN1cmZhY2U7Ci0JCXRoaXMtPnN1cmZhY2UgPSBmbGlwdG8tPnN1cmZhY2U7Ci0JCWZsaXB0by0+c3VyZmFjZSA9IHB0bXA7CisJCXB0bXAgPSB0aGlzLT5zLnN1cmZhY2U7CisJCXRoaXMtPnMuc3VyZmFjZSA9IGZsaXB0by0+cy5zdXJmYWNlOworCQlmbGlwdG8tPnMuc3VyZmFjZSA9IHB0bXA7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlMl9VbmxvY2soCi0JTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcyxMUFZPSUQgc3VyZmFjZQotKSB7Ci0JZHByaW50Zl9yZWxheShzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5VbmxvY2soJXApXG4iLHRoaXMsc3VyZmFjZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfU2V0UGFsZXR0ZSgKIAlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBESVJFQ1REUkFXUEFMRVRURSBwYWwKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5TZXRQYWxldHRlKCVwKVxuIix0aGlzLHBhbCk7Ci0JdGhpcy0+cGFsZXR0ZSA9IHBhbDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfU2V0UGFsZXR0ZSgKLQlMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzLExQRElSRUNURFJBV1BBTEVUVEUgcGFsCi0pIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlMiglcCktPlNldFBhbGV0dGUoJXApXG4iLHRoaXMscGFsKTsKLQl0aGlzLT5wYWxldHRlID0gcGFsOworCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5TZXRQYWxldHRlKCVwKVxuIix0aGlzLHBhbCk7CisJdGhpcy0+cy5wYWxldHRlID0gcGFsOyAvKiBwcm9iYWJseSBhZGRyZWYgaXQgdG9vICovCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KAogCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUFJFQ1QzMiByZHN0LExQRElSRUNURFJBV1NVUkZBQ0Ugc3JjLExQUkVDVDMyIHJzcmMsRFdPUkQgZHdGbGFncyxMUEREQkxURlggbHBibHRmeAogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkJsdCglcCwlcCwlcCwlMDhseCwlcCksc3R1YiFcbiIsCi0JCXRoaXMscmRzdCxzcmMscnNyYyxkd0ZsYWdzLGxwYmx0ZngKLQkpOwotCWlmIChyZHN0KSBmcHJpbnRmKHN0ZGVyciwiCWRlc3RyZWN0IDolZHglZC0lZHglZFxuIixyZHN0LT5sZWZ0LHJkc3QtPnRvcCxyZHN0LT5yaWdodCxyZHN0LT5ib3R0b20pOwotCWlmIChyc3JjKSBmcHJpbnRmKHN0ZGVyciwiCXNyY3JlY3QgIDolZHglZC0lZHglZFxuIixyc3JjLT5sZWZ0LHJzcmMtPnRvcCxyc3JjLT5yaWdodCxyc3JjLT5ib3R0b20pOwotCWZwcmludGYoc3RkZXJyLCIJYmxpdGZ4OiAweCUwOGx4XG4iLGxwYmx0ZngtPmR3RERGWCk7CisJUkVDVDMyCXhkc3QseHNyYzsKKwlpbnQJaSxqOworCisJaWYgKHJkc3QpCisJCW1lbWNweSgmeGRzdCxyZHN0LHNpemVvZih4ZHN0KSk7CisJZWxzZSB7CisJCXhkc3QudG9wCT0gMDsKKwkJeGRzdC5ib3R0b20JPSB0aGlzLT5zLmhlaWdodDsKKwkJeGRzdC5sZWZ0CT0gMDsKKwkJeGRzdC5yaWdodAk9IHRoaXMtPnMud2lkdGg7CisJfQorCWlmIChyc3JjKQorCQltZW1jcHkoJnhzcmMscnNyYyxzaXplb2YoeHNyYykpOworCWVsc2UgaWYgKHNyYykgeworCQl4c3JjLnRvcAk9IDA7CisJCXhzcmMuYm90dG9tCT0gc3JjLT5zLmhlaWdodDsKKwkJeHNyYy5sZWZ0CT0gMDsKKwkJeHNyYy5yaWdodAk9IHNyYy0+cy53aWR0aDsKKwl9CisKKwlpZiAoZHdGbGFncyAmIEREQkxUX0NPTE9SRklMTCkgeworCQlpbnQJYnBwID0gdGhpcy0+cy5kZHJhdy0+ZC5kZXB0aC84OworCQlMUEJZVEUJeGxpbmUseHBpeGVsOworCisJCXhsaW5lID0gKExQQllURSl0aGlzLT5zLnN1cmZhY2UreGRzdC50b3AqdGhpcy0+cy5scGl0Y2g7CisJCWZvciAoaT14ZHN0LnRvcDtpPHhkc3QuYm90dG9tO2krKykgeworCQkJeHBpeGVsID0geGxpbmUrYnBwKnhkc3QubGVmdDsKKworCQkJZm9yIChqPXhkc3QubGVmdDtqPHhkc3QucmlnaHQ7aisrKSB7CisJCQkJLyogRklYTUU6IHRoaXMgb25seSB3b3JrcyBvbiBsaXR0bGUgZW5kaWFuCisJCQkJICogYXJjaGl0ZWN0dXJlcywgd2hlcmUgRFdPUkQgc3RhcnRzIHdpdGggbG93CisJCQkJICogYnl0ZSBmaXJzdCEKKwkJCQkgKi8KKwkJCQltZW1jcHkoeHBpeGVsLCYobHBibHRmeC0+Yi5kd0ZpbGxDb2xvciksYnBwKTsKKwkJCQl4cGl4ZWwgKz0gYnBwOworCQkJfQorCQkJeGxpbmUgKz0gdGhpcy0+cy5scGl0Y2g7CisJCX0KKwkJZHdGbGFncyAmPSB+KEREQkxUX0NPTE9SRklMTCk7CisJfQorCWR3RmxhZ3MgJj0gfihEREJMVF9XQUlUfEREQkxUX0FTWU5DKTsvKiBGSVhNRTogY2FuJ3QgaGFuZGxlIHJpZ2h0IG5vdyAqLworCWlmICgJKHhzcmMudG9wID09MCkgJiYgKHhzcmMuYm90dG9tID09dGhpcy0+cy5oZWlnaHQpICYmCisJCSh4c3JjLmxlZnQ9PTApICYmICh4c3JjLnJpZ2h0ICA9PXRoaXMtPnMud2lkdGgpICYmCisJCSh4ZHN0LnRvcCA9PTApICYmICh4ZHN0LmJvdHRvbSA9PXRoaXMtPnMuaGVpZ2h0KSAmJgorCQkoeGRzdC5sZWZ0PT0wKSAmJiAoeGRzdC5yaWdodCAgPT10aGlzLT5zLndpZHRoKSAgJiYKKwkJIWR3RmxhZ3MKKwkpIHsKKwkJbWVtY3B5KHRoaXMtPnMuc3VyZmFjZSxzcmMtPnMuc3VyZmFjZSx0aGlzLT5zLmhlaWdodCp0aGlzLT5zLmxwaXRjaCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoZHdGbGFncykgeworCQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+Qmx0KCVwLCVwLCVwLCUwOGx4LCVwKSxzdHViIVxuIiwKKwkJCXRoaXMscmRzdCxzcmMscnNyYyxkd0ZsYWdzLGxwYmx0ZngKKwkJKTsKKwkJaWYgKHJkc3QpIGZwcmludGYoc3RkZXJyLCIJZGVzdHJlY3QgOiVkeCVkLSVkeCVkXG4iLHJkc3QtPmxlZnQscmRzdC0+dG9wLHJkc3QtPnJpZ2h0LHJkc3QtPmJvdHRvbSk7CisJCWlmIChyc3JjKSBmcHJpbnRmKHN0ZGVyciwiCXNyY3JlY3QgIDolZHglZC0lZHglZFxuIixyc3JjLT5sZWZ0LHJzcmMtPnRvcCxyc3JjLT5yaWdodCxyc3JjLT5ib3R0b20pOworCQlmcHJpbnRmKHN0ZGVyciwiXHRmbGFnczogIik7X2R1bXBfRERCTFQoZHdGbGFncyk7ZnByaW50ZihzdGRlcnIsIlxuIik7CisJfQorCWlmIChkd0ZsYWdzICYgRERCTFRfRERGWCkgeworCQlmcHJpbnRmKHN0ZGVyciwiCWJsaXRmeDogIik7X2R1bXBfRERCTFRGWChscGJsdGZ4LT5kd0RERlgpO2ZwcmludGYoc3RkZXJyLCJcbiIpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzU3LDExICs0NzMsMTIgQEAKIAlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+Qmx0RmFzdCglbGQsJWxkLCVwLCVwLCUwOGx4KSxzdHViIVxuIiwKIAkJdGhpcyxkc3R4LGRzdHksc3JjLHJzcmMsdHJhbnMKIAkpOworCWZwcmludGYoc3RkZXJyLCIJdHJhbnM6Iik7X2R1bXBfRERCTFRGQVNUKHRyYW5zKTtmcHJpbnRmKHN0ZGVyciwiXG4iKTsKIAlmcHJpbnRmKHN0ZGVyciwiCXNyY3JlY3Q6ICVkeCVkLSVkeCVkXG4iLHJzcmMtPmxlZnQscnNyYy0+dG9wLHJzcmMtPnJpZ2h0LHJzcmMtPmJvdHRvbSk7Ci0JYnBwID0gdGhpcy0+ZGRyYXctPmQuZGVwdGgvODsKKwlicHAgPSB0aGlzLT5zLmRkcmF3LT5kLmRlcHRoLzg7CiAJZm9yIChpPTA7aTxyc3JjLT5ib3R0b20tcnNyYy0+dG9wO2krKykgewotCQltZW1jcHkoCXRoaXMtPnN1cmZhY2UrKChpK2RzdHkpKnRoaXMtPndpZHRoKmJwcCkrZHN0eCpicHAsCi0JCQlzcmMtPnN1cmZhY2UgKyhyc3JjLT50b3AraSkqc3JjLT53aWR0aCpicHArcnNyYy0+bGVmdCpicHAsCisJCW1lbWNweSgJdGhpcy0+cy5zdXJmYWNlKygoaStkc3R5KSp0aGlzLT5zLndpZHRoKmJwcCkrZHN0eCpicHAsCisJCQlzcmMtPnMuc3VyZmFjZSArKHJzcmMtPnRvcCtpKSpzcmMtPnMud2lkdGgqYnBwK3JzcmMtPmxlZnQqYnBwLAogCQkJKHJzcmMtPnJpZ2h0LXJzcmMtPmxlZnQpKmJwcAogCQkpOwogCX0KQEAgLTM4MCw3ICs0OTcsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9HZXRDYXBzKAogCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUEREU0NBUFMgY2FwcwogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkdldENhcHMoJXApXG4iLHRoaXMsY2Fwcyk7CisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkdldENhcHMoJXApXG4iLHRoaXMsY2Fwcyk7CiAJY2Fwcy0+ZHdDYXBzID0gRERDQVBTX1BBTEVUVEU7IC8qIHByb2JhYmx5IG1vcmUgKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTM4OCw5OSArNTA1LDY5IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKAogCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUEREU1VSRkFDRURFU0MgZGRzZAogKSB7IAotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5HZXRTdXJmYWNlRGVzYyglcClcbiIsdGhpcyxkZHNkKTsKLQlmcHJpbnRmKHN0ZGVyciwiCWZsYWdzOiAiKTsKLQlfZHVtcF9ERFNEKGRkc2QtPmR3RmxhZ3MpOwotCWZwcmludGYoc3RkZXJyLCJcbiIpOworCWlmIChkZWJ1Z2dpbmdfZGRyYXcpIHsKKwkJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkdldFN1cmZhY2VEZXNjKCVwKVxuIix0aGlzLGRkc2QpOworCQlmcHJpbnRmKHN0ZGVyciwiCWZsYWdzOiAiKTsKKwkJX2R1bXBfRERTRChkZHNkLT5kd0ZsYWdzKTsKKwkJZnByaW50ZihzdGRlcnIsIlxuIik7CisJfQogCiAJZGRzZC0+ZHdGbGFncyB8PSBERFNEX1BJWEVMRk9STUFUfEREU0RfQ0FQU3xERFNEX0JBQ0tCVUZGRVJDT1VOVHxERFNEX0hFSUdIVHxERFNEX1dJRFRIOwogCWRkc2QtPmRkc0NhcHMuZHdDYXBzCT0gRERTQ0FQU19QQUxFVFRFOwogCWRkc2QtPmR3QmFja0J1ZmZlckNvdW50CT0gMTsKLQlkZHNkLT5kd0hlaWdodAkJPSB0aGlzLT5oZWlnaHQ7Ci0JZGRzZC0+ZHdXaWR0aAkJPSB0aGlzLT53aWR0aDsKLQlkZHNkLT5sUGl0Y2gJCT0gdGhpcy0+bHBpdGNoOwotCWlmICh0aGlzLT5iYWNrYnVmZmVyKQorCWRkc2QtPmR3SGVpZ2h0CQk9IHRoaXMtPnMuaGVpZ2h0OworCWRkc2QtPmR3V2lkdGgJCT0gdGhpcy0+cy53aWR0aDsKKwlkZHNkLT5sUGl0Y2gJCT0gdGhpcy0+cy5scGl0Y2g7CisJaWYgKHRoaXMtPnMuYmFja2J1ZmZlcikKIAkJZGRzZC0+ZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19QUklNQVJZU1VSRkFDRXxERFNDQVBTX0ZMSVA7Ci0JX2dldHBpeGVsZm9ybWF0KHRoaXMtPmRkcmF3LCYoZGRzZC0+ZGRwZlBpeGVsRm9ybWF0KSk7CisJX2dldHBpeGVsZm9ybWF0KHRoaXMtPnMuZGRyYXcsJihkZHNkLT5kZHBmUGl4ZWxGb3JtYXQpKTsKIAkKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmKExQRElSRUNURFJBV1NVUkZBQ0UgdGhpcykgewotCWRwcmludGZfcmVsYXkoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKKwlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CiAJcmV0dXJuICsrKHRoaXMtPnJlZik7CiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzKSB7Ci0JZHByaW50Zl9yZWxheShzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKKwlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOwogCWlmICghLS0odGhpcy0+cmVmKSkgewotCQl0aGlzLT5kZHJhdy0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+ZGRyYXcpOworCQl0aGlzLT5zLmRkcmF3LT5scHZ0YmwtPmZuUmVsZWFzZSh0aGlzLT5zLmRkcmF3KTsKIAkJLyogY2xlYXIgb3V0IG9mIHN1cmZhY2UgbGlzdCAqLwotCQl0aGlzLT5kZHJhdy0+ZC52cG1hc2sgJj0gfigxPDwodGhpcy0+ZmJfaGVpZ2h0L3RoaXMtPmRkcmF3LT5kLmZiX2hlaWdodCkpOworCQl0aGlzLT5zLmRkcmF3LT5kLnZwbWFzayAmPSB+KDE8PCh0aGlzLT5zLmZiX2hlaWdodC90aGlzLT5zLmRkcmF3LT5kLmZiX2hlaWdodCkpOwogCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gdGhpcy0+cmVmOwogfQogCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfQWRkUmVmKExQRElSRUNURFJBV1NVUkZBQ0UyIHRoaXMpIHsKLQlkcHJpbnRmX3JlbGF5KHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlMiglcCktPkFkZFJlZigpXG4iLHRoaXMpOwotCXJldHVybiArKyh0aGlzLT5yZWYpOwotfQotCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfUmVsZWFzZShMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzKSB7Ci0JZHByaW50Zl9yZWxheShzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7Ci0JaWYgKCEtLSh0aGlzLT5yZWYpKSB7Ci0JCXRoaXMtPmRkcmF3LT5scHZ0YmwtPmZuUmVsZWFzZSh0aGlzLT5kZHJhdyk7Ci0JCXRoaXMtPmRkcmF3LT5kLnZwbWFzayAmPSB+KDE8PCh0aGlzLT5mYl9oZWlnaHQvdGhpcy0+ZGRyYXctPmQuZmJfaGVpZ2h0KSk7Ci0JCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiB0aGlzLT5yZWY7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UyX0dldEF0dGFjaGVkU3VyZmFjZSgKLQlMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzLExQRERTQ0FQUyBscGRkc2QsTFBESVJFQ1REUkFXU1VSRkFDRTIgKmxwZHNmCi0pIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlMiglcCktPkdldEF0dGFjaGVkU3VyZmFjZSglcCwlcClcbiIsdGhpcyxscGRkc2QsbHBkc2YpOwotCWZwcmludGYoc3RkZXJyLCIJY2FwcyAiKTtfZHVtcF9ERFNDQVBTKGxwZGRzZC0+ZHdDYXBzKTtmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLQlpZiAoIShscGRkc2QtPmR3Q2FwcyAmIEREU0NBUFNfQkFDS0JVRkZFUikpIHsKLQkJZnByaW50ZihzdGRlcnIsIndob29wcywgY2FuIG9ubHkgaGFuZGxlIGJhY2tidWZmZXJzIGZvciBub3dcbiIpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KLQkvKiBGSVhNRTogc2hvdWxkIGhhbmRsZSBtb3JlIHRoYW4gb25lIGJhY2tidWZmZXIgKi8KLQkqbHBkc2YgPSB0aGlzLT5iYWNrYnVmZmVyOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0dldEF0dGFjaGVkU3VyZmFjZSgKIAlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBERFNDQVBTIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZgogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkdldEF0dGFjaGVkU3VyZmFjZSglcCwlcClcbiIsdGhpcyxscGRkc2QsbHBkc2YpOwotCWZwcmludGYoc3RkZXJyLCIJY2FwcyAiKTtfZHVtcF9ERFNDQVBTKGxwZGRzZC0+ZHdDYXBzKTtmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwlpZiAoZGVidWdnaW5nX2RkcmF3KSB7CisJCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5HZXRBdHRhY2hlZFN1cmZhY2UoJXAsJXApXG4iLHRoaXMsbHBkZHNkLGxwZHNmKTsKKwkJZnByaW50ZihzdGRlcnIsIgljYXBzICIpO19kdW1wX0REU0NBUFMobHBkZHNkLT5kd0NhcHMpO2ZwcmludGYoc3RkZXJyLCJcbiIpOworCX0KIAlpZiAoIShscGRkc2QtPmR3Q2FwcyAmIEREU0NBUFNfQkFDS0JVRkZFUikpIHsKLQkJZnByaW50ZihzdGRlcnIsIndob29wcywgY2FuIG9ubHkgaGFuZGxlIGJhY2tidWZmZXJzIGZvciBub3dcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlOjpHZXRBdHRhY2hlZFN1cmZhY2UoKTp3aG9vcHMsIGNhbiBvbmx5IGhhbmRsZSBiYWNrYnVmZmVycyBmb3Igbm93XG4iKTsKIAkJcmV0dXJuIEVfRkFJTDsKIAl9CiAJLyogRklYTUU6IHNob3VsZCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBiYWNrYnVmZmVyICovCi0JKmxwZHNmID0gdGhpcy0+YmFja2J1ZmZlcjsKKwkqbHBkc2YgPSB0aGlzLT5zLmJhY2tidWZmZXI7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfSW5pdGlhbGl6ZSgKIAlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBESVJFQ1REUkFXIGRkcmF3LExQRERTVVJGQUNFREVTQyBscGRzZmQKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5Jbml0aWFsaXplKCVwLCVwKVxuIiwKLQkJdGhpcyxkZHJhdyxscGRzZmQKLQkpOwogCXJldHVybiBEREVSUl9BTFJFQURZSU5JVElBTElaRUQ7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGl4ZWxGb3JtYXQoCiAJTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLExQRERQSVhFTEZPUk1BVCBwZgogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkdldFBpeGVsRm9ybWF0KCVwKVxuIix0aGlzLHBmKTsKLQlyZXR1cm4gX2dldHBpeGVsZm9ybWF0KHRoaXMtPmRkcmF3LHBmKTsKKwlyZXR1cm4gX2dldHBpeGVsZm9ybWF0KHRoaXMtPnMuZGRyYXcscGYpOwogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0dldEJsdFN0YXR1cyhMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsRFdPUkQgZHdGbGFncykgewpAQCAtNDk5LDE4ICs1ODYsMTY3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q2xpcHBlcigKKwlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBESVJFQ1REUkFXQ0xJUFBFUiBjbGlwcGVyCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+U2V0Q2xpcHBlciglcCksc3R1YiFcbiIsdGhpcyxjbGlwcGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9BZGRBdHRhY2hlZFN1cmZhY2UoCisJTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLExQRElSRUNURFJBV1NVUkZBQ0Ugc3VyZgorKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkFkZEF0dGFjaGVkU3VyZmFjZSglcCksc3R1YiFcbiIsdGhpcyxzdXJmKTsKKwl0aGlzLT5zLmJhY2tidWZmZXIgPSBzdXJmOworCXJldHVybiAwOworfQorCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0dldERDKExQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxIREMzMiogbHBoZGMpIHsKIAlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+R2V0REMoJXApLHN0dWIhXG4iLHRoaXMsbHBoZGMpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlMl9FbnVtQXR0YWNoZWRTdXJmYWNlcyhMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzLExQVk9JRCBjb250ZXh0LExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSyBlc2ZjYikgewotCS8qIG5vbmUgeWV0PyAqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaikgeworICAgICAgICBjaGFyICAgIHhyZWZpaWRbNTBdOworCisgICAgICAgIFN0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7CisgICAgICAgIGRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisJCisJLyogdGhhdHMgdmVyc2lvbiAzIChEaXJlY3RYIDUpICovCisJaWYgKAkhbWVtY21wKCZJSURfSURpcmVjdERyYXdTdXJmYWNlMyxyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0RHJhd1N1cmZhY2UzKSkpIHsKKwkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKKwkJdGhpcy0+bHB2dGJsID0gKExQRElSRUNURFJBV1NVUkZBQ0VfVlRBQkxFKSZkZHMzdnQ7CisJCSpvYmogPSB0aGlzOworCQlyZXR1cm4gMDsKKwl9CisJLyogdGhhdHMgdmVyc2lvbiAyIChEaXJlY3RYIDMpICovCisJaWYgKAkhbWVtY21wKCZJSURfSURpcmVjdERyYXdTdXJmYWNlMixyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0RHJhd1N1cmZhY2UyKSkpIHsKKwkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKKwkJdGhpcy0+bHB2dGJsID0gKExQRElSRUNURFJBV1NVUkZBQ0VfVlRBQkxFKSZkZHMydnQ7CisJCSpvYmogPSB0aGlzOworCQlyZXR1cm4gMDsKKwl9CisJLyogdGhhdHMgdXMgKi8KKwlpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3REcmF3U3VyZmFjZSxyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0RHJhd1N1cmZhY2UpKSkgeworCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOworCQkqb2JqID0gdGhpczsKKwkJcmV0dXJuIDA7CisJfQorCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApOmludGVyZmFjZSBmb3IgSUlEICVzIF9OT1RfIGZvdW5kIVxuIix0aGlzLHhyZWZpaWQpOworICAgIAlyZXR1cm4gT0xFX0VfRU5VTV9OT01PUkU7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfSXNMb3N0KExQRElSRUNURFJBV1NVUkZBQ0UgdGhpcykgeworCXJldHVybiAwOyAvKiBobW0gKi8KK30KKworc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VfVlRhYmxlIGRkc3Z0ID0geworCUlEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZSwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmLAorCUlEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlLAorCUlEaXJlY3REcmF3U3VyZmFjZV9BZGRBdHRhY2hlZFN1cmZhY2UsCisJKHZvaWQqKTUsCisJSURpcmVjdERyYXdTdXJmYWNlX0JsdCwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfQmx0QmF0Y2gsCisJSURpcmVjdERyYXdTdXJmYWNlX0JsdEZhc3QsCisJKHZvaWQqKTksCisJKHZvaWQqKTEwLAorCSh2b2lkKikxMSwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfRmxpcCwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlLAorCUlEaXJlY3REcmF3U3VyZmFjZV9HZXRCbHRTdGF0dXMsCisJSURpcmVjdERyYXdTdXJmYWNlX0dldENhcHMsCisJKHZvaWQqKTE2LAorCSh2b2lkKikxNywKKwlJRGlyZWN0RHJhd1N1cmZhY2VfR2V0REMsCisJKHZvaWQqKTE5LAorCUlEaXJlY3REcmF3U3VyZmFjZV9HZXRPdmVybGF5UG9zaXRpb24sCisJKHZvaWQqKTIxLAorCUlEaXJlY3REcmF3U3VyZmFjZV9HZXRQaXhlbEZvcm1hdCwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MsCisJSURpcmVjdERyYXdTdXJmYWNlX0luaXRpYWxpemUsCisJSURpcmVjdERyYXdTdXJmYWNlX0lzTG9zdCwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfTG9jaywKKwkodm9pZCopMjcsCisJKHZvaWQqKTI4LAorCUlEaXJlY3REcmF3U3VyZmFjZV9TZXRDbGlwcGVyLAorCSh2b2lkKikzMCwKKwkodm9pZCopMzEsCisJSURpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUsCisJSURpcmVjdERyYXdTdXJmYWNlX1VubG9jaywKKwkodm9pZCopMzQsCisJKHZvaWQqKTM1LAorCSh2b2lkKikzNiwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJSURpcmVjdERyYXdTdXJmYWNlMgorICoKKyAqIGNhbGxzIElEaXJlY3REcmF3U3VyZmFjZSBtZXRob2RzIHdoZXJlIHBvc3NpYmxlCisgKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UyX0xvY2soCisgICAgTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcyxMUFJFQ1QzMiBscHJlY3QsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxEV09SRCBmbGFncywgSEFORExFMzIgaG5kCispIHsKKwlyZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlX0xvY2soKExQRElSRUNURFJBV1NVUkZBQ0UpdGhpcyxscHJlY3QsbHBkZHNkLGZsYWdzLGhuZCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UyX1VubG9jaygKKwlMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzLExQVk9JRCBzdXJmYWNlCispIHsKKwlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlMiglcCktPlVubG9jayglcClcbiIsdGhpcyxzdXJmYWNlKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfU2V0UGFsZXR0ZSgKKwlMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzLExQRElSRUNURFJBV1BBTEVUVEUgcGFsCispIHsKKwlyZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUoKExQRElSRUNURFJBV1NVUkZBQ0UpdGhpcyxwYWwpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfQWRkUmVmKExQRElSRUNURFJBV1NVUkZBQ0UyIHRoaXMpIHsKKwlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlMiglcCktPkFkZFJlZigpXG4iLHRoaXMpOworCXJldHVybiArKyh0aGlzLT5yZWYpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfUmVsZWFzZShMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzKSB7CisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CisJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CisJCXRoaXMtPnMuZGRyYXctPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPnMuZGRyYXcpOworCQl0aGlzLT5zLmRkcmF3LT5kLnZwbWFzayAmPSB+KDE8PCh0aGlzLT5zLmZiX2hlaWdodC90aGlzLT5zLmRkcmF3LT5kLmZiX2hlaWdodCkpOworCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGhpcy0+cmVmOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlMl9HZXRBdHRhY2hlZFN1cmZhY2UoCisJTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcyxMUEREU0NBUFMgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UyICpscGRzZgorKSB7CisJSFJFU1VMVAlyZXQgPSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlKChMUERJUkVDVERSQVdTVVJGQUNFKXRoaXMsbHBkZHNkLChMUERJUkVDVERSQVdTVVJGQUNFKilscGRzZik7CisKKwlpZiAoIXJldCkKKwkJKCpscGRzZiktPmxwdnRibCA9ICZkZHMydnQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfRW51bUF0dGFjaGVkU3VyZmFjZXMoTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcyxMUFZPSUQgY29udGV4dCxMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0sgZXNmY2IpIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+RW51bUF0dGFjaGVkU3VyZmFjZXMoJXAsJXApLHN0dWIhXG4iLHRoaXMsY29udGV4dCxlc2ZjYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UyX1F1ZXJ5SW50ZXJmYWNlKAorCUxQRElSRUNURFJBV1NVUkZBQ0UyIHRoaXMsUkVGSUlEIHJpaWQsTFBWT0lEICpwcG9iagorKSB7CisJcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZSgoTFBESVJFQ1REUkFXU1VSRkFDRSl0aGlzLHJpaWQscHBvYmopOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlMl9Jc0xvc3QoTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcykgeworCXJldHVybiAwOyAvKiBobW0gKi8KK30KKworCiBzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTJfVlRhYmxlIGRkczJ2dCA9IHsKLQkodm9pZCopMS8qSURpcmVjdERyYXdTdXJmYWNlMl9RdWVyeUludGVyZmFjZSovLAorCUlEaXJlY3REcmF3U3VyZmFjZTJfUXVlcnlJbnRlcmZhY2UsCiAJSURpcmVjdERyYXdTdXJmYWNlMl9BZGRSZWYsCiAJSURpcmVjdERyYXdTdXJmYWNlMl9SZWxlYXNlLAogCSh2b2lkKik0LApAQCAtNTM0LDcgKzc3MCw3IEBACiAJKHZvaWQqKTIyLAogCSh2b2lkKikyMy8qSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKi8sCiAJKHZvaWQqKTI0LAotCSh2b2lkKikyNSwKKwlJRGlyZWN0RHJhd1N1cmZhY2UyX0lzTG9zdCwKIAlJRGlyZWN0RHJhd1N1cmZhY2UyX0xvY2ssCiAJKHZvaWQqKTI3LAogCSh2b2lkKikyOCwKQEAgLTU1MSw3OCArNzg3LDMyNiBAQAogCSh2b2lkKikzOSwKIH07CiAKLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaikgewotICAgICAgICBjaGFyICAgIHhyZWZpaWRbNTBdOwotCi0gICAgICAgIFN0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7Ci0JCi0JLyogdGhhdHMgdmVyc2lvbiAyICovCi0JaWYgKAkhbWVtY21wKCZJSURfSURpcmVjdERyYXdTdXJmYWNlMixyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0RHJhd1N1cmZhY2UyKSkpIHsKLQkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKLQkJdGhpcy0+bHB2dGJsID0gKExQRElSRUNURFJBV1NVUkZBQ0VfVlRBQkxFKSZkZHMydnQ7Ci0JCSpvYmogPSB0aGlzOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogdGhhdHMgdXMgKi8KLQlpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3REcmF3U3VyZmFjZSxyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0RHJhd1N1cmZhY2UpKSkgewotCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOwotCQkqb2JqID0gdGhpczsKLQkJcmV0dXJuIDA7Ci0JfQotICAgIAlyZXR1cm4gT0xFX0VfRU5VTV9OT01PUkU7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCUlEaXJlY3REcmF3U3VyZmFjZTMKKyAqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTNfU2V0UGFsZXR0ZSgKKwlMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzLExQRElSRUNURFJBV1BBTEVUVEUgcGFsCispIHsKKwlyZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUoKExQRElSRUNURFJBV1NVUkZBQ0UpdGhpcyxwYWwpOwogfQogCi1zdGF0aWMgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZV9WVGFibGUgZGRzdnQgPSB7Ci0JSURpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlLAotCUlEaXJlY3REcmF3U3VyZmFjZV9BZGRSZWYsCi0JSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UsCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19HZXRQaXhlbEZvcm1hdCgKKwlMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzLExQRERQSVhFTEZPUk1BVCBwZgorKSB7CisJcmV0dXJuIF9nZXRwaXhlbGZvcm1hdCh0aGlzLT5zLmRkcmF3LHBmKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTNfR2V0QXR0YWNoZWRTdXJmYWNlKAorCUxQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMsTFBERFNDQVBTIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFMyAqbHBkc2YKKykgeworCUhSRVNVTFQJcmV0ID0gSURpcmVjdERyYXdTdXJmYWNlX0dldEF0dGFjaGVkU3VyZmFjZSgoTFBESVJFQ1REUkFXU1VSRkFDRSl0aGlzLGxwZGRzZCwoTFBESVJFQ1REUkFXU1VSRkFDRSopbHBkc2YpOworCisJaWYgKCFyZXQpCisJCSgqbHBkc2YpLT5scHZ0YmwgPSAmZGRzM3Z0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19BZGRSZWYoTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcykgeworCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UzKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CisJcmV0dXJuICsrKHRoaXMtPnJlZik7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19SZWxlYXNlKExQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMpIHsKKwlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlMyglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKKwlpZiAoIS0tKHRoaXMtPnJlZikpIHsKKwkJdGhpcy0+cy5kZHJhdy0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+cy5kZHJhdyk7CisJCXRoaXMtPnMuZGRyYXctPmQudnBtYXNrICY9IH4oMTw8KHRoaXMtPnMuZmJfaGVpZ2h0L3RoaXMtPnMuZGRyYXctPmQuZmJfaGVpZ2h0KSk7CisJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiB0aGlzLT5yZWY7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UzX0JsdCgKKyAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcyxMUFJFQ1QzMiByZHN0LExQRElSRUNURFJBV1NVUkZBQ0UzIHNyYywKKwlMUFJFQ1QzMiByc3JjLERXT1JEIGR3RmxhZ3MsTFBEREJMVEZYIGxwYmx0ZngKKykgeworCXJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KChMUERJUkVDVERSQVdTVVJGQUNFKXRoaXMscmRzdCwoTFBESVJFQ1REUkFXU1VSRkFDRSlzcmMscnNyYyxkd0ZsYWdzLGxwYmx0ZngpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19Jc0xvc3QoTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcykgeworCXJldHVybiAwOyAvKiBobW0gKi8KK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTNfUmVzdG9yZShMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzKSB7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UzX0dldEJsdFN0YXR1cygKKwlMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzLERXT1JEIGR3ZmxhZ3MKKykgeworCXJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0Qmx0U3RhdHVzKChMUERJUkVDVERSQVdTVVJGQUNFKXRoaXMsZHdmbGFncyk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UzX0ZsaXAoCisJTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcyxMUERJUkVDVERSQVdTVVJGQUNFMyBmbGlwdG8sRFdPUkQgZHdGbGFncworKSB7CisJcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZV9GbGlwKChMUERJUkVDVERSQVdTVVJGQUNFKXRoaXMsKExQRElSRUNURFJBV1NVUkZBQ0UpZmxpcHRvLGR3RmxhZ3MpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19Mb2NrKAorICAgIExQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMsTFBSRUNUMzIgbHByZWN0LExQRERTVVJGQUNFREVTQyBscGRkc2QsRFdPUkQgZmxhZ3MsIEhBTkRMRTMyIGhuZAorKSB7CisJcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKChMUERJUkVDVERSQVdTVVJGQUNFKXRoaXMsbHByZWN0LGxwZGRzZCxmbGFncyxobmQpOyAKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTNfVW5sb2NrKAorCUxQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMsTFBWT0lEIHN1cmZhY2UKKykgeworCXJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKChMUERJUkVDVERSQVdTVVJGQUNFKXRoaXMsc3VyZmFjZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UzX0VudW1BdHRhY2hlZFN1cmZhY2VzKExQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMsTFBWT0lEIGNvbnRleHQsTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLIGVzZmNiKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZTMoJXApLT5FbnVtQXR0YWNoZWRTdXJmYWNlcyglcCwlcCksc3R1YiFcbiIsdGhpcyxjb250ZXh0LGVzZmNiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTNfU2V0Q2xpcHBlcigKKwlMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzLExQRElSRUNURFJBV0NMSVBQRVIgY2xpcHBlcgorKSB7CisJcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZV9TZXRDbGlwcGVyKChMUERJUkVDVERSQVdTVVJGQUNFKXRoaXMsY2xpcHBlcik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UzX1F1ZXJ5SW50ZXJmYWNlKAorCUxQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMsUkVGSUlEIHJpaWQsTFBWT0lEICpwcG9iagorKSB7CisJcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZSgoTFBESVJFQ1REUkFXU1VSRkFDRSl0aGlzLHJpaWQscHBvYmopOworfQorCitzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTNfVlRhYmxlIGRkczN2dCA9IHsKKwlJRGlyZWN0RHJhd1N1cmZhY2UzX1F1ZXJ5SW50ZXJmYWNlLAorCUlEaXJlY3REcmF3U3VyZmFjZTNfQWRkUmVmLAorCUlEaXJlY3REcmF3U3VyZmFjZTNfUmVsZWFzZSwKIAkodm9pZCopNCwKIAkodm9pZCopNSwKLQlJRGlyZWN0RHJhd1N1cmZhY2VfQmx0LAotCUlEaXJlY3REcmF3U3VyZmFjZV9CbHRCYXRjaCwKLQlJRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdCwKKwlJRGlyZWN0RHJhd1N1cmZhY2UzX0JsdCwKKwkodm9pZCopNywKKwkodm9pZCopOCwKIAkodm9pZCopOSwKLQkodm9pZCopMTAsCisJSURpcmVjdERyYXdTdXJmYWNlM19FbnVtQXR0YWNoZWRTdXJmYWNlcywKIAkodm9pZCopMTEsCi0JSURpcmVjdERyYXdTdXJmYWNlX0ZsaXAsCi0JSURpcmVjdERyYXdTdXJmYWNlX0dldEF0dGFjaGVkU3VyZmFjZSwKLQlJRGlyZWN0RHJhd1N1cmZhY2VfR2V0Qmx0U3RhdHVzLAotCUlEaXJlY3REcmF3U3VyZmFjZV9HZXRDYXBzLAorCUlEaXJlY3REcmF3U3VyZmFjZTNfRmxpcCwKKwlJRGlyZWN0RHJhd1N1cmZhY2UzX0dldEF0dGFjaGVkU3VyZmFjZSwKKwlJRGlyZWN0RHJhd1N1cmZhY2UzX0dldEJsdFN0YXR1cywKKwkodm9pZCopMTUsCiAJKHZvaWQqKTE2LAogCSh2b2lkKikxNywKLQlJRGlyZWN0RHJhd1N1cmZhY2VfR2V0REMsCisJKHZvaWQqKTE4LAogCSh2b2lkKikxOSwKLQlJRGlyZWN0RHJhd1N1cmZhY2VfR2V0T3ZlcmxheVBvc2l0aW9uLAorCSh2b2lkKikyMCwKIAkodm9pZCopMjEsCi0JSURpcmVjdERyYXdTdXJmYWNlX0dldFBpeGVsRm9ybWF0LAotCUlEaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYywKLQlJRGlyZWN0RHJhd1N1cmZhY2VfSW5pdGlhbGl6ZSwKLQkodm9pZCopMjUsCi0JSURpcmVjdERyYXdTdXJmYWNlX0xvY2ssCisJSURpcmVjdERyYXdTdXJmYWNlM19HZXRQaXhlbEZvcm1hdCwKKwkodm9pZCopMjMsCisJKHZvaWQqKTI0LAorCUlEaXJlY3REcmF3U3VyZmFjZTNfSXNMb3N0LAorCUlEaXJlY3REcmF3U3VyZmFjZTNfTG9jaywKIAkodm9pZCopMjcsCi0JKHZvaWQqKTI4LAotCSh2b2lkKikyOSwKKwlJRGlyZWN0RHJhd1N1cmZhY2UzX1Jlc3RvcmUsCisJSURpcmVjdERyYXdTdXJmYWNlM19TZXRDbGlwcGVyLAogCSh2b2lkKikzMCwKIAkodm9pZCopMzEsCi0JSURpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUsCi0JSURpcmVjdERyYXdTdXJmYWNlX1VubG9jaywKKwlJRGlyZWN0RHJhd1N1cmZhY2UzX1NldFBhbGV0dGUsCisJSURpcmVjdERyYXdTdXJmYWNlM19VbmxvY2ssCiAJKHZvaWQqKTM0LAogCSh2b2lkKikzNSwKIAkodm9pZCopMzYsCisJKHZvaWQqKTM3LAorCSh2b2lkKikzOCwKKwkodm9pZCopMzksCisJKHZvaWQqKTQwLAogfTsKIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCUlEaXJlY3REcmF3Q2xpcHBlcgorICovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVyX1NldEh3bmQoCisJTFBESVJFQ1REUkFXQ0xJUFBFUiB0aGlzLERXT1JEIHgsSFdORDMyIGh3bmQKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd0NsaXBwZXIoJXApLT5TZXRId25kKDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIsdGhpcyx4LChEV09SRClod25kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJfUmVsZWFzZShMUERJUkVDVERSQVdDTElQUEVSIHRoaXMpIHsKKwl0aGlzLT5yZWYtLTsKKwlpZiAodGhpcy0+cmVmKQorCQlyZXR1cm4gdGhpcy0+cmVmOworCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd0NsaXBwZXJfVlRhYmxlIGRkY2xpcHZ0ID0geworCSh2b2lkKikxLAorCSh2b2lkKikyLAorCUlEaXJlY3REcmF3Q2xpcHBlcl9SZWxlYXNlLAorCSh2b2lkKik0LAorCSh2b2lkKik1LAorCSh2b2lkKik2LAorCSh2b2lkKik3LAorCSh2b2lkKik4LAorCUlEaXJlY3REcmF3Q2xpcHBlcl9TZXRId25kCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCUlEaXJlY3REcmF3UGFsZXR0ZQorICovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlX0dldEVudHJpZXMoCisJTFBESVJFQ1REUkFXUEFMRVRURSB0aGlzLERXT1JEIHgsRFdPUkQgeSxEV09SRCB6LExQUEFMRVRURUVOVFJZIHBhbGVudAorKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3UGFsZXR0ZSglcCktPkdldEVudHJpZXMoJTA4bHgsJTA4bHgsJTA4bHgsJXApLHN0dWIhXG4iLAorCQl0aGlzLHgseSx6LHBhbGVudAorCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcygKKwlMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsRFdPUkQgeCxEV09SRCBzdGFydCxEV09SRCBlbmQsTFBQQUxFVFRFRU5UUlkgcGFsZW50CispIHsKKwlYQ29sb3IJCXhjOworCWludAkJaTsKKworCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1BhbGV0dGUoJXApLT5TZXRFbnRyaWVzKCUwOGx4LCVsZCwlbGQsJXApXG4iLAorCQl0aGlzLHgsc3RhcnQsZW5kLHBhbGVudAorCSk7CisJaWYgKCF0aGlzLT5jbSkgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8geworCQlmcHJpbnRmKHN0ZGVyciwibm8gY29sb3JtYXAgaW4gU2V0RW50cmllcz8/P1xuIik7CisJCXJldHVybiBEREVSUl9HRU5FUklDOworCX0KKy8qIEZJWE1FOiBmcmVlIGNvbG9yY2VsbHMgaW5zdGVhZCBvZiBmcmVlaW5nIHdob2xlIG1hcCAqLworCVhGcmVlQ29sb3JtYXAoZGlzcGxheSx0aGlzLT5jbSk7CisJdGhpcy0+Y20gPSBUU1hDcmVhdGVDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLEFsbG9jQWxsKTsKKwlpZiAoc3RhcnQ+MCkgeworCQl4Yy5yZWQgPSB4Yy5ibHVlID0geGMuZ3JlZW4gPSAwOyB4Yy5mbGFncyA9IERvUmVkfERvR3JlZW58RG9CbHVlOyB4Yy5waXhlbCA9IDA7IFRTWFN0b3JlQ29sb3IoZGlzcGxheSx0aGlzLT5jbSwmeGMpOworCX0KKwlpZiAoZW5kPDI1NikgeworCQl4Yy5yZWQgPSB4Yy5ibHVlID0geGMuZ3JlZW4gPSAweGZmZmY7IHhjLmZsYWdzID0gRG9SZWR8RG9HcmVlbnxEb0JsdWU7IHhjLnBpeGVsID0gMjU1OyBUU1hTdG9yZUNvbG9yKGRpc3BsYXksdGhpcy0+Y20sJnhjKTsKKwl9CisJZm9yIChpPXN0YXJ0O2k8ZW5kO2krKykgeworCQl4Yy5yZWQgPSBwYWxlbnRbaS1zdGFydF0ucGVSZWQ8PDg7CisJCXhjLmJsdWUgPSBwYWxlbnRbaS1zdGFydF0ucGVCbHVlPDw4OworCQl4Yy5ncmVlbiA9IHBhbGVudFtpLXN0YXJ0XS5wZUdyZWVuPDw4OworCQl4Yy5mbGFncyA9IERvUmVkfERvQmx1ZXxEb0dyZWVuOworCQl4Yy5waXhlbCA9IGk7CisJCVRTWFN0b3JlQ29sb3IoZGlzcGxheSx0aGlzLT5jbSwmeGMpOworCX0KKwlYRjg2REdBSW5zdGFsbENvbG9ybWFwKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSx0aGlzLT5jbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlX1JlbGVhc2UoTFBESVJFQ1REUkFXUEFMRVRURSB0aGlzKSB7CisJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CisJCWlmICh0aGlzLT5jbSkgeworCQkJWEZyZWVDb2xvcm1hcChkaXNwbGF5LHRoaXMtPmNtKTsKKwkJCXRoaXMtPmNtID0gMDsKKwkJfQorCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGhpcy0+cmVmOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoTFBESVJFQ1REUkFXUEFMRVRURSB0aGlzKSB7CisJcmV0dXJuICsrKHRoaXMtPnJlZik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZSgKKwlMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsTFBESVJFQ1REUkFXIGRkcmF3LERXT1JEIHgsTFBQQUxFVFRFRU5UUlkgcGFsZW50CispIHsKKwlyZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOworfQorCitzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZV9WVGFibGUgZGRwYWx2dCA9IHsKKwkodm9pZCopMSwKKwlJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmLAorCUlEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlLAorCSh2b2lkKik0LAorCUlEaXJlY3REcmF3UGFsZXR0ZV9HZXRFbnRyaWVzLAorCUlEaXJlY3REcmF3UGFsZXR0ZV9Jbml0aWFsaXplLAorCUlEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJSURpcmVjdDNECisgKi8KK3N0YXRpYyBzdHJ1Y3QgSURpcmVjdDNEX1ZUYWJsZSBkM2R2dCA9IHsKKwkodm9pZCopMSwKKwkodm9pZCopMiwKKwkodm9pZCopMywKKwkodm9pZCopNCwKKwkodm9pZCopNSwKKwkodm9pZCopNiwKKwkodm9pZCopNywKKwkodm9pZCopOCwKKwkodm9pZCopOSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlJRGlyZWN0M0QyCisgKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdDNEMl9SZWxlYXNlKExQRElSRUNUM0QyIHRoaXMpIHsKKwl0aGlzLT5yZWYtLTsKKwlpZiAoIXRoaXMtPnJlZikgeworCQl0aGlzLT5kZHJhdy0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+ZGRyYXcpOworCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGhpcy0+cmVmOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdDNEMl9FbnVtRGV2aWNlcygKKwlMUERJUkVDVDNEMiB0aGlzLExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBjYiwgTFBWT0lEIGNvbnRleHQKKykgeworCUQzRERFVklDRURFU0MJZDEsZDI7CisKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdDNEMiglcCktPkVudW1EZXZpY2VzKCVwLCVwKSxzdHViIVxuIix0aGlzLGNiLGNvbnRleHQpOworCWQxLmR3U2l6ZQk9IHNpemVvZihkMSk7CisJZDEuZHdGbGFncwk9IDA7CisKKwlkMi5kd1NpemUJPSBzaXplb2YoZDIpOworCWQyLmR3RmxhZ3MJPSAwOworCWNiKCZJSURfSURpcmVjdDNESEFMRGV2aWNlLCJXSU5FIERpcmVjdDNEIEhBTCIsImRpcmVjdDNkIiwmZDEsJmQyLGNvbnRleHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IElEaXJlY3QzRDJfVlRhYmxlIGQzZDJ2dCA9IHsKKwkodm9pZCopMSwKKwkodm9pZCopMiwKKwlJRGlyZWN0M0QyX1JlbGVhc2UsCisJSURpcmVjdDNEMl9FbnVtRGV2aWNlcywKKwkodm9pZCopNSwKKwkodm9pZCopNiwKKwkodm9pZCopNywKKwkodm9pZCopOCwKKwkodm9pZCopOSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlJRGlyZWN0RHJhdworICovCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSgKIAlMUERJUkVDVERSQVcgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuawogKSB7CiAJaW50CWk7CiAKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5DcmVhdGVTdXJmYWNlKCVwLCVwLCVwKVxuIix0aGlzLGxwZGRzZCxscGRzZixscHVuayk7Ci0JZnByaW50ZihzdGRlcnIsIiBbdz0lbGQsaD0lbGQsZmxhZ3MgIixscGRkc2QtPmR3V2lkdGgsbHBkZHNkLT5kd0hlaWdodCk7Ci0JX2R1bXBfRERTRChscGRkc2QtPmR3RmxhZ3MpOwotCWZwcmludGYoc3RkZXJyLCJjYXBzICIpO19kdW1wX0REU0NBUFMobHBkZHNkLT5kZHNDYXBzLmR3Q2Fwcyk7Ci0JZnByaW50ZihzdGRlcnIsIl1cbiIpOworCWlmIChkZWJ1Z2dpbmdfZGRyYXcpIHsKKwkJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+Q3JlYXRlU3VyZmFjZSglcCwlcCwlcClcbiIsdGhpcyxscGRkc2QsbHBkc2YsbHB1bmspOworCQlmcHJpbnRmKHN0ZGVyciwiIFt3PSVsZCxoPSVsZCxmbGFncyAiLGxwZGRzZC0+ZHdXaWR0aCxscGRkc2QtPmR3SGVpZ2h0KTsKKwkJX2R1bXBfRERTRChscGRkc2QtPmR3RmxhZ3MpOworCQlmcHJpbnRmKHN0ZGVyciwiY2FwcyAiKTsKKwkJX2R1bXBfRERTQ0FQUyhscGRkc2QtPmRkc0NhcHMuZHdDYXBzKTsKKwkJZnByaW50ZihzdGRlcnIsIl1cbiIpOworCX0KIAogCSpscGRzZiA9IChMUERJUkVDVERSQVdTVVJGQUNFKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKElEaXJlY3REcmF3U3VyZmFjZSkpOwogCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CkBAIC02MzEsNDEgKzExMTUsNDEgQEAKIAlmb3IgKGk9MDtpPDMyO2krKykKIAkJaWYgKCEodGhpcy0+ZC52cG1hc2sgJiAoMTw8aSkpKQogCQkJYnJlYWs7Ci0JZnByaW50ZihzdGRlcnIsInVzaW5nIHZpZXdwb3J0ICVkIGZvciBhIHByaW1hcnkgc3VyZmFjZVxuIixpKTsKKwlkcHJpbnRmX2RkcmF3KHN0ZGVyciwidXNpbmcgdmlld3BvcnQgJWQgZm9yIGEgcHJpbWFyeSBzdXJmYWNlXG4iLGkpOwogCS8qIGlmIGkgPT0gMzIgb3IgbWF4aW11bSAuLi4gcmV0dXJuIGVycm9yICovCiAJdGhpcy0+ZC52cG1hc2t8PSgxPDxpKTsKLQkoKmxwZHNmKS0+c3VyZmFjZSA9IHRoaXMtPmQuZmJfYWRkcisoKGkqdGhpcy0+ZC52cF9oZWlnaHQpKnRoaXMtPmQuZmJfd2lkdGgqdGhpcy0+ZC5kZXB0aC84KTsKLQkoKmxwZHNmKS0+ZmJfaGVpZ2h0ID0gaSp0aGlzLT5kLmZiX2hlaWdodDsKKwkoKmxwZHNmKS0+cy5zdXJmYWNlID0gdGhpcy0+ZC5mYl9hZGRyKygoaSp0aGlzLT5kLnZwX2hlaWdodCkqdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzgpOworCSgqbHBkc2YpLT5zLmZiX2hlaWdodCA9IGkqdGhpcy0+ZC5mYl9oZWlnaHQ7CiAKLQkoKmxwZHNmKS0+d2lkdGggPSB0aGlzLT5kLndpZHRoOwotCSgqbHBkc2YpLT5oZWlnaHQgPSB0aGlzLT5kLmhlaWdodDsKLQkoKmxwZHNmKS0+ZGRyYXcgPSB0aGlzOwotCSgqbHBkc2YpLT5scGl0Y2ggPSB0aGlzLT5kLmZiX3dpZHRoKnRoaXMtPmQuZGVwdGgvODsKLQkoKmxwZHNmKS0+YmFja2J1ZmZlciA9IE5VTEw7CisJKCpscGRzZiktPnMud2lkdGggPSB0aGlzLT5kLndpZHRoOworCSgqbHBkc2YpLT5zLmhlaWdodCA9IHRoaXMtPmQuaGVpZ2h0OworCSgqbHBkc2YpLT5zLmRkcmF3ID0gdGhpczsKKwkoKmxwZHNmKS0+cy5scGl0Y2ggPSB0aGlzLT5kLmZiX3dpZHRoKnRoaXMtPmQuZGVwdGgvODsKKwkoKmxwZHNmKS0+cy5iYWNrYnVmZmVyID0gTlVMTDsKIAlpZiAobHBkZHNkLT5kd0ZsYWdzICYgRERTRF9CQUNLQlVGRkVSQ09VTlQpIHsKIAkJTFBESVJFQ1REUkFXU1VSRkFDRQliYWNrOwogCiAJCWlmIChscGRkc2QtPmR3QmFja0J1ZmZlckNvdW50PjEpCiAJCQlmcHJpbnRmKHN0ZGVyciwidXJrcywgd2FudHMgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIGJhY2tidWZmZXIgKCVsZCkhXG4iLGxwZGRzZC0+ZHdCYWNrQnVmZmVyQ291bnQpOwogCi0JCSgqbHBkc2YpLT5iYWNrYnVmZmVyID0gYmFjayA9IChMUERJUkVDVERSQVdTVVJGQUNFKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKElEaXJlY3REcmF3U3VyZmFjZSkpOworCQkoKmxwZHNmKS0+cy5iYWNrYnVmZmVyID0gYmFjayA9IChMUERJUkVDVERSQVdTVVJGQUNFKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKElEaXJlY3REcmF3U3VyZmFjZSkpOwogCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOwogCQliYWNrLT5yZWYgPSAxOwogCQliYWNrLT5scHZ0YmwgPSAmZGRzdnQ7CiAJCWZvciAoaT0wO2k8MzI7aSsrKQogCQkJaWYgKCEodGhpcy0+ZC52cG1hc2sgJiAoMTw8aSkpKQogCQkJCWJyZWFrOwotCQlmcHJpbnRmKHN0ZGVyciwidXNpbmcgdmlld3BvcnQgJWQgZm9yIGJhY2tidWZmZXJcbiIsaSk7CisJCWRwcmludGZfZGRyYXcoc3RkZXJyLCJ1c2luZyB2aWV3cG9ydCAlZCBmb3IgYmFja2J1ZmZlclxuIixpKTsKIAkJLyogaWYgaSA9PSAzMiBvciBtYXhpbXVtIC4uLiByZXR1cm4gZXJyb3IgKi8KIAkJdGhpcy0+ZC52cG1hc2t8PSgxPDxpKTsKLQkJYmFjay0+c3VyZmFjZSA9IHRoaXMtPmQuZmJfYWRkcisoKGkqdGhpcy0+ZC52cF9oZWlnaHQpKnRoaXMtPmQuZmJfd2lkdGgqdGhpcy0+ZC5kZXB0aC84KTsKLQkJYmFjay0+ZmJfaGVpZ2h0ID0gaSp0aGlzLT5kLmZiX2hlaWdodDsKKwkJYmFjay0+cy5zdXJmYWNlID0gdGhpcy0+ZC5mYl9hZGRyKygoaSp0aGlzLT5kLnZwX2hlaWdodCkqdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzgpOworCQliYWNrLT5zLmZiX2hlaWdodCA9IGkqdGhpcy0+ZC5mYl9oZWlnaHQ7CiAKLQkJYmFjay0+d2lkdGggPSB0aGlzLT5kLndpZHRoOwotCQliYWNrLT5oZWlnaHQgPSB0aGlzLT5kLmhlaWdodDsKLQkJYmFjay0+ZGRyYXcgPSB0aGlzOwotCQliYWNrLT5scGl0Y2ggPSB0aGlzLT5kLmZiX3dpZHRoKnRoaXMtPmQuZGVwdGgvODsKLQkJYmFjay0+YmFja2J1ZmZlciA9IE5VTEw7IC8qIGRvZXMgbm90IGhhdmUgYSBiYWNrYnVmZmVyLCBpdCBpcworCQliYWNrLT5zLndpZHRoID0gdGhpcy0+ZC53aWR0aDsKKwkJYmFjay0+cy5oZWlnaHQgPSB0aGlzLT5kLmhlaWdodDsKKwkJYmFjay0+cy5kZHJhdyA9IHRoaXM7CisJCWJhY2stPnMubHBpdGNoID0gdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzg7CisJCWJhY2stPnMuYmFja2J1ZmZlciA9IE5VTEw7IC8qIGRvZXMgbm90IGhhdmUgYSBiYWNrYnVmZmVyLCBpdCBpcwogCQkJCQkgICogb25lISAqLwogCX0KIAlyZXR1cm4gMDsKQEAgLTY3OSw1OSArMTE2Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfQ3JlYXRlU3VyZmFjZSgKLQlMUERJUkVDVERSQVcyIHRoaXMsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZixJVW5rbm93biAqbHB1bmsKLSkgewotCWludAlpOwotCi0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3MiglcCktPkNyZWF0ZVN1cmZhY2UoJXAsJXAsJXApXG4iLHRoaXMsbHBkZHNkLGxwZHNmLGxwdW5rKTsKLQkqbHBkc2YgPSAoTFBESVJFQ1REUkFXU1VSRkFDRSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0RHJhd1N1cmZhY2UpKTsKLQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOwotCSgqbHBkc2YpLT5yZWYgPSAxOwotCSgqbHBkc2YpLT5scHZ0YmwgPSAmZGRzdnQ7Ci0KLQlmb3IgKGk9MDtpPDMyO2krKykKLQkJaWYgKCEodGhpcy0+ZC52cG1hc2sgJiAoMTw8aSkpKQotCQkJYnJlYWs7Ci0JZnByaW50ZihzdGRlcnIsInVzaW5nIHZpZXdwb3J0ICVkIGZvciBwcmltYXJ5XG4iLGkpOwotCS8qIGlmIGkgPT0gMzIgb3IgbWF4aW11bSAuLi4gcmV0dXJuIGVycm9yICovCi0JdGhpcy0+ZC52cG1hc2t8PSgxPDxpKTsKLQkoKmxwZHNmKS0+c3VyZmFjZSA9IHRoaXMtPmQuZmJfYWRkcisoKGkqdGhpcy0+ZC5mYl9oZWlnaHQpKnRoaXMtPmQuZmJfd2lkdGgqdGhpcy0+ZC5kZXB0aC84KTsKLQkoKmxwZHNmKS0+d2lkdGggPSB0aGlzLT5kLndpZHRoOwotCSgqbHBkc2YpLT5oZWlnaHQgPSB0aGlzLT5kLmhlaWdodDsKLQkoKmxwZHNmKS0+ZGRyYXcgPSAoTFBESVJFQ1REUkFXKXRoaXM7Ci0JKCpscGRzZiktPmZiX2hlaWdodCA9IGkqdGhpcy0+ZC5mYl9oZWlnaHQ7Ci0JKCpscGRzZiktPmxwaXRjaCA9IHRoaXMtPmQuZmJfd2lkdGgqdGhpcy0+ZC5kZXB0aC84OwotCSgqbHBkc2YpLT5iYWNrYnVmZmVyID0gTlVMTDsKLQlpZiAobHBkZHNkLT5kd0ZsYWdzICYgRERTRF9CQUNLQlVGRkVSQ09VTlQpIHsKLQkJTFBESVJFQ1REUkFXU1VSRkFDRQliYWNrOwotCi0JCWlmIChscGRkc2QtPmR3QmFja0J1ZmZlckNvdW50PjEpCi0JCQlmcHJpbnRmKHN0ZGVyciwidXJrcywgd2FudHMgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIGJhY2tidWZmZXIgKCVsZCkhXG4iLGxwZGRzZC0+ZHdCYWNrQnVmZmVyQ291bnQpOwotCi0JCSgqbHBkc2YpLT5iYWNrYnVmZmVyID0gYmFjayA9IChMUERJUkVDVERSQVdTVVJGQUNFKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKElEaXJlY3REcmF3U3VyZmFjZTIpKTsKLQkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKLQkJYmFjay0+cmVmID0gMTsKLQkJYmFjay0+bHB2dGJsID0gJmRkc3Z0OwotCQlmb3IgKGk9MDtpPDMyO2krKykKLQkJCWlmICghKHRoaXMtPmQudnBtYXNrICYgKDE8PGkpKSkKLQkJCQlicmVhazsKLQkJZnByaW50ZihzdGRlcnIsInVzaW5nIHZpZXdwb3J0ICVkIGZvciBiYWNrYnVmZmVyXG4iLGkpOwotCQkvKiBpZiBpID09IDMyIG9yIG1heGltdW0gLi4uIHJldHVybiBlcnJvciAqLwotCQl0aGlzLT5kLnZwbWFza3w9KDE8PGkpOwotCQliYWNrLT5zdXJmYWNlID0gdGhpcy0+ZC5mYl9hZGRyKygoaSp0aGlzLT5kLnZwX2hlaWdodCkqdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzgpOwotCQliYWNrLT5mYl9oZWlnaHQgPSBpKnRoaXMtPmQuZmJfaGVpZ2h0OwotCi0JCWJhY2stPndpZHRoID0gdGhpcy0+ZC53aWR0aDsKLQkJYmFjay0+aGVpZ2h0ID0gdGhpcy0+ZC5oZWlnaHQ7Ci0JCWJhY2stPmRkcmF3ID0gKExQRElSRUNURFJBVyl0aGlzOwotCQliYWNrLT5scGl0Y2ggPSB0aGlzLT5kLmZiX3dpZHRoKnRoaXMtPmQuZGVwdGgvODsKLQkJYmFjay0+YmFja2J1ZmZlciA9IE5VTEw7IC8qIGRvZXMgbm90IGhhdmUgYSBiYWNrYnVmZmVyLCBpdCBpcwotCQkJCQkgICogb25lISAqLwotCX0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X1NldENvb3BlcmF0aXZlTGV2ZWwoCiAJTFBESVJFQ1REUkFXIHRoaXMsSFdORDMyIGh3bmQsRFdPUkQgY29vcGxldmVsCiApIHsKQEAgLTc0NiwyMCArMTE3NywyMyBAQAogCQlGRShERFNDTF9OT1JNQUwpCiAJCUZFKEREU0NMX0FMTE9XTU9ERVgpCiAJCUZFKEREU0NMX0VYQ0xVU0lWRSkKKwkJRkUoRERTQ0xfU0VURk9DVVNXSU5ET1cpCisJCUZFKEREU0NMX1NFVERFVklDRVdJTkRPVykKKwkJRkUoRERTQ0xfQ1JFQVRFREVWSUNFV0lORE9XKQogCX07Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+U2V0Q29vcGVyYXRpdmVMZXZlbCglMDhseCwlMDhseCksc3R1YiFcbiIsCisKKwlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCUwOGx4KVxuIiwKIAkJdGhpcywoRFdPUkQpaHduZCxjb29wbGV2ZWwKIAkpOwotCWZwcmludGYoc3RkZXJyLCIJY29vcGVyYXRpdmUgbGV2ZWwgIik7CisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIgljb29wZXJhdGl2ZSBsZXZlbCAiKTsKIAlmb3IgKGk9MDtpPHNpemVvZihmbGFnbWFwKS9zaXplb2YoZmxhZ21hcFswXSk7aSsrKQogCQlpZiAoZmxhZ21hcFtpXS5tYXNrICYgY29vcGxldmVsKQotCQkJZnByaW50ZihzdGRlcnIsIiVzICIsZmxhZ21hcFtpXS5uYW1lKTsKLQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwkJCWRwcmludGZfZGRyYXcoc3RkZXJyLCIlcyAiLGZsYWdtYXBbaV0ubmFtZSk7CisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIlxuIik7CiAJdGhpcy0+ZC5tYWlud2luZG93ID0gaHduZDsKIAlyZXR1cm4gMDsKIH0KIAotZXh0ZXJuIEJPT0wzMiBTSUdOQUxfSW5pdEVtdWxhdG9yKHZvaWQpOwogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoCiAJTFBESVJFQ1REUkFXIHRoaXMsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoCkBAIC03NjcsMTMgKzEyMDEsMTMgQEAKIAlpbnQJaSwqZGVwdGhzLGRlcGNvdW50OwogCWNoYXIJYnVmWzIwMF07CiAKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5TZXREaXNwbGF5TW9kZSglbGQsJWxkLCVsZCksc3R1YiFcbiIsdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgpOworCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPlNldERpc3BsYXlNb2RlKCVsZCwlbGQsJWxkKSxzdHViIVxuIix0aGlzLHdpZHRoLGhlaWdodCxkZXB0aCk7CiAKLQlkZXB0aHMgPSBYTGlzdERlcHRocyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksJmRlcGNvdW50KTsKKwlkZXB0aHMgPSBUU1hMaXN0RGVwdGhzKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmZGVwY291bnQpOwogCWZvciAoaT0wO2k8ZGVwY291bnQ7aSsrKQogCQlpZiAoZGVwdGhzW2ldPT1kZXB0aCkKIAkJCWJyZWFrOwotCVhGcmVlKGRlcHRocyk7CisJVFNYRnJlZShkZXB0aHMpOwogCWlmIChpPT1kZXBjb3VudCkgey8qIG5vdCBmb3VuZCAqLwogCQlzcHJpbnRmKGJ1ZiwiU2V0RGlzcGxheU1vZGUodz0lbGQsaD0lbGQsZD0lbGQpLCB1bnN1cHBvcnRlZCBkZXB0aCEiLHdpZHRoLGhlaWdodCxkZXB0aCk7CiAJCU1lc3NhZ2VCb3gzMkEoMCxidWYsIldJTkUgRGlyZWN0RHJhdyIsTUJfT0t8TUJfSUNPTlNUT1ApOwpAQCAtNzk2LDQwICsxMjMwLDI3IEBACiAJICogaXQgd29ya3MgZm9yIHRoZSBsaWJyYXJ5IHRvbz8KIAkgKi8KIAlYRjg2REdBRGlyZWN0VmlkZW8oZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLFhGODZER0FEaXJlY3RHcmFwaGljcyk7Ci0vKiBGSVhNRTogIGNhbid0IGNhbGwgdGhpcyBpbiB3aW5lbGliLi4uIHNvIGNvbW1lbnQgb25seSBpbiBmb3IgZGVidWdnaW5nLgorI2lmZGVmIFJFU1RPUkVfU0lHTkFMUwogCVNJR05BTF9Jbml0RW11bGF0b3IoKTsKLSAqLworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19HZXRDYXBzKAogCUxQRElSRUNURFJBVyB0aGlzLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCiApICB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+R2V0Q2FwcyglcCwlcCksc3R1YiFcbiIsdGhpcyxjYXBzMSxjYXBzMik7CisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+R2V0Q2FwcyglcCwlcClcbiIsdGhpcyxjYXBzMSxjYXBzMik7CiAJY2FwczEtPmR3VmlkTWVtVG90YWwgPSB0aGlzLT5kLmZiX21lbXNpemU7Ci0JY2FwczEtPmR3Q2FwcyA9IDA7IC8qIHdlIGNhbm5vdCBkbyBhbnl0aGluZyAqLwotCWNhcHMxLT5kZHNDYXBzLmR3Q2FwcyA9IDA7IC8qIHdlIGNhbm5vdCBkbyBhbnl0aGluZyAqLworCWNhcHMxLT5kd0NhcHMgPSAweGZmZmZmZmZmJn4oRERDQVBTX0JBTktTV0lUQ0hFRCk7CQkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KKwljYXBzMS0+ZGRzQ2Fwcy5kd0NhcHMgPSAweGZmZmZmZmZmOwkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KKwlpZiAoY2FwczIpIHsKKwkJY2FwczItPmR3VmlkTWVtVG90YWwgPSB0aGlzLT5kLmZiX21lbXNpemU7CisJCWNhcHMyLT5kd0NhcHMgPSAweGZmZmZmZmZmJn4oRERDQVBTX0JBTktTV0lUQ0hFRCk7CQkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KKwkJY2FwczItPmRkc0NhcHMuZHdDYXBzID0gMHhmZmZmZmZmZjsJLyogd2UgY2FuIGRvIGFueXRoaW5nICovCisJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0dldENhcHMoCi0JTFBESVJFQ1REUkFXMiB0aGlzLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCi0pICB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3MiglcCktPkdldENhcHMoJXAsJXApLHN0dWIhXG4iLHRoaXMsY2FwczEsY2FwczIpOwotCWNhcHMxLT5kd1ZpZE1lbVRvdGFsID0gdGhpcy0+ZC5mYl9tZW1zaXplOwotCWNhcHMxLT5kd0NhcHMgPSAwOyAvKiB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgKi8KLQljYXBzMS0+ZGRzQ2Fwcy5kd0NhcHMgPSAwOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdDbGlwcGVyX1ZUYWJsZSBkZGNsaXB2dCA9IHsKLQkodm9pZCopMSwKLQkodm9pZCopMiwodm9pZCopMywodm9pZCopNCwodm9pZCopNSwKLQkodm9pZCopNiwKLQkodm9pZCopNywodm9pZCopOCwodm9pZCopOQotfTsKLQogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0NyZWF0ZUNsaXBwZXIoCiAJTFBESVJFQ1REUkFXIHRoaXMsRFdPUkQgeCxMUERJUkVDVERSQVdDTElQUEVSICpscGRkY2xpcCxMUFVOS05PV04gbHB1bmsKICkgewpAQCAtODQyLDkxICsxMjYzLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcygKLQlMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsRFdPUkQgeCxEV09SRCB5LERXT1JEIHosTFBQQUxFVFRFRU5UUlkgcGFsZW50Ci0pIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdQYWxldHRlKCVwKS0+R2V0RW50cmllcyglMDhseCwlMDhseCwlMDhseCwlcCksc3R1YiFcbiIsCi0JCXRoaXMseCx5LHoscGFsZW50Ci0JKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzKAotCUxQRElSRUNURFJBV1BBTEVUVEUgdGhpcyxEV09SRCB4LERXT1JEIHN0YXJ0LERXT1JEIGVuZCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQKLSkgewotCVhDb2xvcgkJeGM7Ci0JaW50CQlpOwotCi0vKgotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1BhbGV0dGUoJXApLT5TZXRFbnRyaWVzKCUwOGx4LCVsZCwlbGQsJXApXG4iLAotCQl0aGlzLHgsc3RhcnQsZW5kLHBhbGVudAotCSk7Ci0gKi8KLQlpZiAoIXRoaXMtPmNtKSAvKiBzaG91bGQgbm90IGhhcHBlbiAqLyB7Ci0JCWZwcmludGYoc3RkZXJyLCJubyBjb2xvcm1hcCBpbiBTZXRFbnRyaWVzPz8/XG4iKTsKLQkJcmV0dXJuIERERVJSX0dFTkVSSUM7Ci0JfQotLyogRklYTUU6IGZyZWUgY29sb3JjZWxscyBpbnN0ZWFkIG9mIGZyZWVpbmcgd2hvbGUgbWFwICovCi0JWEZyZWVDb2xvcm1hcChkaXNwbGF5LHRoaXMtPmNtKTsKLQl0aGlzLT5jbSA9IFhDcmVhdGVDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLERlZmF1bHRWaXN1YWwoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKSxBbGxvY0FsbCk7Ci0JaWYgKHN0YXJ0PjApIHsKLQkJeGMucmVkID0geGMuYmx1ZSA9IHhjLmdyZWVuID0gMDsgeGMuZmxhZ3MgPSBEb1JlZHxEb0dyZWVufERvQmx1ZTsgeGMucGl4ZWwgPSAwOyBYU3RvcmVDb2xvcihkaXNwbGF5LHRoaXMtPmNtLCZ4Yyk7Ci0JfQotCWlmIChlbmQ8MjU2KSB7Ci0JCXhjLnJlZCA9IHhjLmJsdWUgPSB4Yy5ncmVlbiA9IDB4ZmZmZjsgeGMuZmxhZ3MgPSBEb1JlZHxEb0dyZWVufERvQmx1ZTsgeGMucGl4ZWwgPSAyNTU7IFhTdG9yZUNvbG9yKGRpc3BsYXksdGhpcy0+Y20sJnhjKTsKLQl9Ci0JZm9yIChpPXN0YXJ0O2k8ZW5kO2krKykgewotCQl4Yy5yZWQgPSBwYWxlbnRbaS1zdGFydF0ucGVSZWQ8PDg7Ci0JCXhjLmJsdWUgPSBwYWxlbnRbaS1zdGFydF0ucGVCbHVlPDw4OwotCQl4Yy5ncmVlbiA9IHBhbGVudFtpLXN0YXJ0XS5wZUdyZWVuPDw4OwotCQl4Yy5mbGFncyA9IERvUmVkfERvQmx1ZXxEb0dyZWVuOwotCQl4Yy5waXhlbCA9IGk7Ci0JCVhTdG9yZUNvbG9yKGRpc3BsYXksdGhpcy0+Y20sJnhjKTsKLQl9Ci0JWEY4NkRHQUluc3RhbGxDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksdGhpcy0+Y20pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKExQRElSRUNURFJBV1BBTEVUVEUgdGhpcykgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1BhbGV0dGUoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7Ci0JaWYgKCEtLSh0aGlzLT5yZWYpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1BhbGV0dGUoJXApIGZyZWVkIVxuIix0aGlzKTsKLQkJaWYgKHRoaXMtPmNtKSB7Ci0JCQlYRnJlZUNvbG9ybWFwKGRpc3BsYXksdGhpcy0+Y20pOwotCQkJdGhpcy0+Y20gPSAwOwotCQl9Ci0JCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiB0aGlzLT5yZWY7Ci19Ci0KLXN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZihMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMpIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdQYWxldHRlKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7Ci0JcmV0dXJuICsrKHRoaXMtPnJlZik7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZSgKLQlMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsTFBESVJFQ1REUkFXIGRkcmF3LERXT1JEIHgsTFBQQUxFVFRFRU5UUlkgcGFsZW50Ci0pIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdQYWxldHRlKCVwKS0+SW5pdGlhbGl6ZSglcCwweCUwOGx4LCVwKVxuIix0aGlzLGRkcmF3LHgscGFsZW50KTsKLQlyZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZV9WVGFibGUgZGRwYWx2dCA9IHsKLQkodm9pZCopMSwKLQlJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmLAotCUlEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlLAotCSh2b2lkKik0LAotCUlEaXJlY3REcmF3UGFsZXR0ZV9HZXRFbnRyaWVzLAotCUlEaXJlY3REcmF3UGFsZXR0ZV9Jbml0aWFsaXplLAotCUlEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzCi19OwotCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZSgKIAlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuawogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+Q3JlYXRlUGFsZXR0ZSglMDhseCwlcCwlcCwlcCksc3R1YiFcbiIsCisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+Q3JlYXRlUGFsZXR0ZSglMDhseCwlcCwlcCwlcClcbiIsCiAJCXRoaXMseCxwYWxlbnQsbHBkZHBhbCxscHVuawogCSk7CiAJKmxwZGRwYWwgPSAoTFBESVJFQ1REUkFXUEFMRVRURSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0RHJhd1BhbGV0dGUpKTsKQEAgLTkzNCwyMCArMTI3NCwyNCBAQAogCSgqbHBkZHBhbCktPmxwdnRibCA9ICZkZHBhbHZ0OwogCSgqbHBkZHBhbCktPmRkcmF3ID0gdGhpczsKIAlpZiAodGhpcy0+ZC5kZXB0aDw9OCkgewotCQkoKmxwZGRwYWwpLT5jbSA9IFhDcmVhdGVDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLERlZmF1bHRWaXN1YWwoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKSxBbGxvY0FsbCk7Ci0JCWZwcmludGYoc3RkZXJyLCJjcmVhdGVkIGNvbG9ybWFwLi4uXG4iKTsKKwkJKCpscGRkcGFsKS0+Y20gPSBUU1hDcmVhdGVDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLEFsbG9jQWxsKTsKIAl9IGVsc2UgLyogd2UgZG9uJ3Qgd2FudCBwYWxldHRlcyBpbiBoaWNvbG9yIG9yIHRydWVjb2xvciAqLwogCQkoKmxwZGRwYWwpLT5jbSA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9DcmVhdGVQYWxldHRlKAotCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuawotKSB7Ci0JcmV0dXJuIElEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoKExQRElSRUNURFJBVyl0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmspOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcgdGhpcykgeworCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPlJlc3RvcmVEaXNwbGF5TW9kZSgpLHN0dWIhXG4iLHRoaXMpOworCVNsZWVwKDEwMDApOworCVhGODZER0FEaXJlY3RWaWRlbyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMCk7CisjaWZkZWYgUkVTVE9SRV9TSUdOQUxTCisJU0lHTkFMX0luaXRFbXVsYXRvcigpOworI2VuZGlmCisJcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rKAogCUxQRElSRUNURFJBVyB0aGlzLERXT1JEIHgsSEFORExFMzIgaAogKSB7CkBAIC05NTYsMTE4ICsxMzAwLDY3IEBACiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdfQWRkUmVmKExQRElSRUNURFJBVyB0aGlzKSB7Ci0JZHByaW50Zl9yZWxheShzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CiAJcmV0dXJuICsrKHRoaXMtPnJlZik7CiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdfUmVsZWFzZShMUERJUkVDVERSQVcgdGhpcykgewotCWRwcmludGZfcmVsYXkoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKIAlpZiAoIS0tKHRoaXMtPnJlZikpIHsKLQkJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3OjpSZWxlYXNlOmZyZWVpbmcgSURpcmVjdERyYXcoJXApXG4iLHRoaXMpOwogCQlYRjg2REdBRGlyZWN0VmlkZW8oZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLDApOworI2lmZGVmIFJFU1RPUkVfU0lHTkFMUworCQlTSUdOQUxfSW5pdEVtdWxhdG9yKCk7CisjZW5kaWYKIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIHRoaXMtPnJlZjsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSgKLQlMUERJUkVDVERSQVcyIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagotKSB7Ci0JcmV0dXJuIElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKChMUERJUkVDVERSQVcpdGhpcyxyZWZpaWQsb2JqKTsKLX0KLQotc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhdzJfQWRkUmVmKExQRElSRUNURFJBVzIgdGhpcykgewotCXJldHVybiBJRGlyZWN0RHJhd19BZGRSZWYoKExQRElSRUNURFJBVyl0aGlzKTsKLX0KLQotc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhdzJfUmVsZWFzZShMUERJUkVDVERSQVcyIHRoaXMpIHsKLQlyZXR1cm4gSURpcmVjdERyYXdfUmVsZWFzZSgoTFBESVJFQ1REUkFXKXRoaXMpOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX1NldENvb3BlcmF0aXZlTGV2ZWwoCi0JTFBESVJFQ1REUkFXMiB0aGlzLEhXTkQzMiBod25kLERXT1JEIHgKLSkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdzIoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCUwOGx4KSxzdHViIVxuIiwKLQkJdGhpcywoRFdPUkQpaHduZCx4Ci0JKTsKLQl0aGlzLT5kLm1haW53aW5kb3cgPSBod25kOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX1NldERpc3BsYXlNb2RlKAotCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB3aWR0aCxEV09SRCBoZWlnaHQsRFdPUkQgZGVwdGgsRFdPUkQgeHgsRFdPUkQgeXkKLSkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdzIoJXApLT5TZXREaXNwbGF5TW9kZSglbGQsJWxkLCVsZCwlMDhseCwlMDhseCksc3R1YiFcbiIsdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgseHgseXkpOwotCi0JcmV0dXJuIElEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgpOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcyIHRoaXMpIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcyKCVwKS0+UmVzdG9yZURpc3BsYXlNb2RlKCksc3R1YiFcbiIsdGhpcyk7Ci0JWEY4NkRHQURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcgdGhpcykgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPlJlc3RvcmVEaXNwbGF5TW9kZSgpLHN0dWIhXG4iLHRoaXMpOwotCVhGODZER0FEaXJlY3RWaWRlbyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfRW51bVN1cmZhY2VzKAotCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB4LExQRERTVVJGQUNFREVTQyBkZHNmZCxMUFZPSUQgY29udGV4dCxMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0sgZGRzZmNiCi0pIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcyKCVwKS0+RW51bVN1cmZhY2VzKDB4JTA4bHgsJXAsJXAsJXApLHN0dWIhXG4iLHRoaXMseCxkZHNmZCxjb250ZXh0LGRkc2ZjYik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBJRGlyZWN0RHJhdzJfVlRhYmxlIGRkMnZ0ID0gewotCUlEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSwKLQlJRGlyZWN0RHJhdzJfQWRkUmVmLAotCUlEaXJlY3REcmF3Ml9SZWxlYXNlLAotCSh2b2lkKik0LAotCSh2b2lkKik1LypJRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyKi8sCi0JSURpcmVjdERyYXcyX0NyZWF0ZVBhbGV0dGUsCi0JSURpcmVjdERyYXcyX0NyZWF0ZVN1cmZhY2UsCi0JKHZvaWQqKTgsCi0JKHZvaWQqKTksCi0JSURpcmVjdERyYXcyX0VudW1TdXJmYWNlcywKLQkodm9pZCopMTEsCi0JSURpcmVjdERyYXcyX0dldENhcHMsCi0JKHZvaWQqKTEzLAotCSh2b2lkKikxNCwKLQkodm9pZCopMTUsCi0JKHZvaWQqKTE2LAotCSh2b2lkKikxNywKLQkodm9pZCopMTgsCi0JKHZvaWQqKTE5LAotCUlEaXJlY3REcmF3Ml9SZXN0b3JlRGlzcGxheU1vZGUsCi0JSURpcmVjdERyYXcyX1NldENvb3BlcmF0aXZlTGV2ZWwsCi0JSURpcmVjdERyYXcyX1NldERpc3BsYXlNb2RlLAotCSh2b2lkKikyMy8qSURpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmsqLywKLQkodm9pZCopMjQKLX07Ci0KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSgKIAlMUERJUkVDVERSQVcgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqCiApIHsKICAgICAgICAgY2hhciAgICB4cmVmaWlkWzUwXTsKIAogICAgICAgICBTdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmVmaWlkLHhyZWZpaWQpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisgICAgICAgIGRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKyAgICAgICAgaWYgKCFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpKSB7CisgICAgICAgICAgICAgICAgKm9iaiA9IHRoaXM7CisJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAgICAgaWYgKCFtZW1jbXAoJklJRF9JRGlyZWN0RHJhdyxyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0RHJhdykpKSB7CiAgICAgICAgICAgICAgICAgKm9iaiA9IHRoaXM7CiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtZW1jbXAoJklJRF9JRGlyZWN0RHJhdzIscmVmaWlkLHNpemVvZihJSURfSURpcmVjdERyYXcyKSkpIHsKLQkJLyogRklYTUUgRklYTUUgRklYTUUgKi8KIAkJdGhpcy0+bHB2dGJsID0gKExQRElSRUNURFJBV19WVEFCTEUpJmRkMnZ0OwogCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOwogICAgICAgICAgICAgICAgICpvYmogPSB0aGlzOwogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CisJaWYgKCFtZW1jbXAoJklJRF9JRGlyZWN0M0QscmVmaWlkLHNpemVvZihJSURfSURpcmVjdDNEKSkpIHsKKwkJTFBESVJFQ1QzRAlkM2Q7CisKKwkJZDNkID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoKmQzZCkpOworCQlkM2QtPnJlZiA9IDE7CisJCWQzZC0+ZGRyYXcgPSB0aGlzOworCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOworCQlkM2QtPmxwdnRibCA9ICZkM2R2dDsKKwkJKm9iaiA9IGQzZDsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghbWVtY21wKCZJSURfSURpcmVjdDNEMixyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0M0QpKSkgeworCQlMUERJUkVDVDNEMglkM2Q7CisKKwkJZDNkID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoKmQzZCkpOworCQlkM2QtPnJlZiA9IDE7CisJCWQzZC0+ZGRyYXcgPSB0aGlzOworCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOworCQlkM2QtPmxwdnRibCA9ICZkM2QydnQ7CisJCSpvYmogPSBkM2Q7CisJCXJldHVybiAwOworCX0KKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApOmludGVyZmFjZSBmb3IgSUlEICVzIF9OT1RfIGZvdW5kIVxuIix0aGlzLHhyZWZpaWQpOwogICAgICAgICByZXR1cm4gT0xFX0VfRU5VTV9OT01PUkU7CiB9CiAKQEAgLTEwODQsMjYgKzEzNzcsNDIgQEAKICkgewogCUREU1VSRkFDRURFU0MJZGRzZmQ7CiAKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5FbnVtRGlzcGxheU1vZGVzKDB4JTA4bHgsJXAsJXAsJXApLHN0dWIhXG4iLHRoaXMsZHdGbGFncyxscGRkc2ZkLGNvbnRleHQsbW9kZXNjYik7Ci0JZGRzZmQuZHdTaXplID0gc2l6ZW9mKGRkc2ZkKTsKLQlmcHJpbnRmKHN0ZGVyciwic2l6ZSBpcyAlZFxuIixzaXplb2YoZGRzZmQpKTsKLQlkZHNmZC5kd0ZsYWdzID0gRERTRF9IRUlHSFR8RERTRF9XSURUSHxERFNEX1BJVENIfEREU0RfQkFDS0JVRkZFUkNPVU5UfEREU0RfUElYRUxGT1JNQVR8RERTRF9DQVBTOwotCWRkc2ZkLmR3SGVpZ2h0ID0gNDgwOwotCWRkc2ZkLmR3V2lkdGggPSA2NDA7Ci0JZGRzZmQubFBpdGNoID0gNjQwOwotCWRkc2ZkLmR3QmFja0J1ZmZlckNvdW50ID0gMTsKLQlkZHNmZC54LmR3UmVmcmVzaFJhdGUgPSA2MDsKLQlkZHNmZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfUEFMRVRURTsKLQl0aGlzLT5kLmRlcHRoID0gODsKKwlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5FbnVtRGlzcGxheU1vZGVzKDB4JTA4bHgsJXAsJXAsJXApXG4iLHRoaXMsZHdGbGFncyxscGRkc2ZkLGNvbnRleHQsbW9kZXNjYik7CisKKwogCV9nZXRwaXhlbGZvcm1hdCh0aGlzLCYoZGRzZmQuZGRwZlBpeGVsRm9ybWF0KSk7Ci0JZnByaW50ZihzdGRlcnIsIm1vZGVzY2IgcmV0dXJuZWQ6IDB4JWx4XG4iLChEV09SRCltb2Rlc2NiKCZkZHNmZCxjb250ZXh0KSk7CisJZGRzZmQuZHdTaXplID0gc2l6ZW9mKGRkc2ZkKTsKKwlkZHNmZC5kd0ZsYWdzID0gRERTRF9IRUlHSFR8RERTRF9XSURUSHxERFNEX0JBQ0tCVUZGRVJDT1VOVHxERFNEX1BJWEVMRk9STUFUfEREU0RfQ0FQUzsKKwlpZiAoZHdGbGFncyAmIERERURNX1JFRlJFU0hSQVRFUykgeworCQlkZHNmZC5kd0ZsYWdzIHw9IEREU0RfUkVGUkVTSFJBVEU7CisJCWRkc2ZkLnguZHdSZWZyZXNoUmF0ZSA9IDYwOworCX0KKworCWRkc2ZkLmR3V2lkdGggPSA2NDA7CisJZGRzZmQuZHdIZWlnaHQgPSA0ODA7CisJZGRzZmQuZHdCYWNrQnVmZmVyQ291bnQgPSAxOworCWRkc2ZkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19QQUxFVFRFOworCisJaWYgKCFtb2Rlc2NiKCZkZHNmZCxjb250ZXh0KSkgcmV0dXJuIDA7CisKKwlkZHNmZC5kd1dpZHRoID0gODAwOworCWRkc2ZkLmR3SGVpZ2h0ID0gNjAwOworCWlmICghbW9kZXNjYigmZGRzZmQsY29udGV4dCkpIHJldHVybiAwOworCisJaWYgKCEoZHdGbGFncyAmIERERURNX1NUQU5EQVJEVkdBTU9ERVMpKSB7CisJCS8qIG1vZGVYIGlzIG5vdCBzdGFuZGFyZCBWR0EgKi8KKworCQlkZHNmZC5kd0hlaWdodCA9IDIwMDsKKwkJZGRzZmQuZHdXaWR0aCA9IDMyMDsKKwkJaWYgKCFtb2Rlc2NiKCZkZHNmZCxjb250ZXh0KSkgcmV0dXJuIDA7CisJfQogCXJldHVybiBERF9PSzsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0dldERpc3BsYXlNb2RlKAogCUxQRElSRUNURFJBVyB0aGlzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5HZXREaXNwbGF5TW9kZSglcCksc3R1YiFcbiIsdGhpcyxscGRkc2ZkKTsKKwlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5HZXREaXNwbGF5TW9kZSglcClcbiIsdGhpcyxscGRkc2ZkKTsKIAlscGRkc2ZkLT5kd0ZsYWdzID0gRERTRF9IRUlHSFR8RERTRF9XSURUSHxERFNEX1BJVENIfEREU0RfQkFDS0JVRkZFUkNPVU5UfEREU0RfUElYRUxGT1JNQVR8RERTRF9DQVBTOwogCWxwZGRzZmQtPmR3SGVpZ2h0ID0gdGhpcy0+ZC52cF9oZWlnaHQ7CiAJbHBkZHNmZC0+ZHdXaWR0aCA9IHRoaXMtPmQudnBfd2lkdGg7CkBAIC0xMTE1LDYgKzE0MjQsMTEgQEAKIAlyZXR1cm4gRERfT0s7CiB9CiAKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19GbGlwVG9HRElTdXJmYWNlKExQRElSRUNURFJBVyB0aGlzKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+RmxpcFRvR0RJU3VyZmFjZSgpLHN0dWIhXG4iLHRoaXMpOworCXJldHVybiBERF9PSzsKK30KKwogCiBzdGF0aWMgSURpcmVjdERyYXdfVlRhYmxlIGRkdnQgPSB7CiAJSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UsCkBAIC0xMTI3LDcgKzE0NDEsNyBAQAogCUlEaXJlY3REcmF3X0R1cGxpY2F0ZVN1cmZhY2UsCiAJSURpcmVjdERyYXdfRW51bURpc3BsYXlNb2RlcywKIAkodm9pZCopMTAsCi0JKHZvaWQqKTExLAorCUlEaXJlY3REcmF3X0ZsaXBUb0dESVN1cmZhY2UsCiAJSURpcmVjdERyYXdfR2V0Q2FwcywKIAlJRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZSwKIAkodm9pZCopMTQsCkBAIC0xMTQyLDIyICsxNDU2LDE1MSBAQAogCUlEaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAogfTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJSURpcmVjdERyYXcyCisgKgorICovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0NyZWF0ZUNsaXBwZXIoCisJTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHgsTFBESVJFQ1REUkFXQ0xJUFBFUiAqbHBkZGNsaXAsTFBVTktOT1dOIGxwdW5rCispIHsKKwlyZXR1cm4gSURpcmVjdERyYXdfQ3JlYXRlQ2xpcHBlcigoTFBESVJFQ1REUkFXKXRoaXMseCxscGRkY2xpcCxscHVuayk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfQ3JlYXRlU3VyZmFjZSgKKwlMUERJUkVDVERSQVcyIHRoaXMsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZixJVW5rbm93biAqbHB1bmsKKykgeworCXJldHVybiBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKChMUERJUkVDVERSQVcpdGhpcyxscGRkc2QsKExQRElSRUNURFJBV1NVUkZBQ0UqKWxwZHNmLGxwdW5rKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSgKKwlMUERJUkVDVERSQVcyIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagorKSB7CisJcmV0dXJuIElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKChMUERJUkVDVERSQVcpdGhpcyxyZWZpaWQsb2JqKTsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhdzJfQWRkUmVmKExQRElSRUNURFJBVzIgdGhpcykgeworCXJldHVybiBJRGlyZWN0RHJhd19BZGRSZWYoKExQRElSRUNURFJBVyl0aGlzKTsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhdzJfUmVsZWFzZShMUERJUkVDVERSQVcyIHRoaXMpIHsKKwlyZXR1cm4gSURpcmVjdERyYXdfUmVsZWFzZSgoTFBESVJFQ1REUkFXKXRoaXMpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0dldENhcHMoCisJTFBESVJFQ1REUkFXMiB0aGlzLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCispICB7CisJcmV0dXJuIElEaXJlY3REcmF3X0dldENhcHMoKExQRElSRUNURFJBVyl0aGlzLGNhcHMxLGNhcHMyKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9TZXRDb29wZXJhdGl2ZUxldmVsKAorCUxQRElSRUNURFJBVzIgdGhpcyxIV05EMzIgaHduZCxEV09SRCB4CispIHsKKwlyZXR1cm4gSURpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbCgoTFBESVJFQ1REUkFXKXRoaXMsaHduZCx4KTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9DcmVhdGVQYWxldHRlKAorCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuaworKSB7CisJcmV0dXJuIElEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoKExQRElSRUNURFJBVyl0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmspOworfQorCisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfU2V0RGlzcGxheU1vZGUoCisJTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHdpZHRoLERXT1JEIGhlaWdodCxEV09SRCBkZXB0aCxEV09SRCB4eCxEV09SRCB5eQorKSB7CisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3MiglcCktPlNldERpc3BsYXlNb2RlKCVsZCwlbGQsJWxkLCUwOGx4LCUwOGx4KSxzdHViIVxuIix0aGlzLHdpZHRoLGhlaWdodCxkZXB0aCx4eCx5eSk7CisKKwlyZXR1cm4gSURpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoKExQRElSRUNURFJBVyl0aGlzLHdpZHRoLGhlaWdodCxkZXB0aCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVzIgdGhpcykgeworCXJldHVybiBJRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUoKExQRElSRUNURFJBVyl0aGlzKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9FbnVtU3VyZmFjZXMoCisJTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHgsTFBERFNVUkZBQ0VERVNDIGRkc2ZkLExQVk9JRCBjb250ZXh0LExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSyBkZHNmY2IKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdzIoJXApLT5FbnVtU3VyZmFjZXMoMHglMDhseCwlcCwlcCwlcCksc3R1YiFcbiIsdGhpcyx4LGRkc2ZkLGNvbnRleHQsZGRzZmNiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9FbnVtRGlzcGxheU1vZGVzKAorCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCBkd0ZsYWdzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkLExQVk9JRCBjb250ZXh0LExQRERFTlVNTU9ERVNDQUxMQkFDSyBtb2Rlc2NiCispIHsKKwlyZXR1cm4gSURpcmVjdERyYXdfRW51bURpc3BsYXlNb2RlcygoTFBESVJFQ1REUkFXKXRoaXMsZHdGbGFncyxscGRkc2ZkLGNvbnRleHQsbW9kZXNjYik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfR2V0RGlzcGxheU1vZGUoCisJTFBESVJFQ1REUkFXMiB0aGlzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkCispIHsKKwlyZXR1cm4gSURpcmVjdERyYXdfR2V0RGlzcGxheU1vZGUoKExQRElSRUNURFJBVyl0aGlzLGxwZGRzZmQpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0dldEF2YWlsYWJsZVZpZE1lbSgKKwlMUERJUkVDVERSQVcyIHRoaXMsTFBERFNDQVBTIGRkc2NhcHMsTFBEV09SRCB0b3RhbCxMUERXT1JEIGZyZWUKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdzIoJXApLT5HZXRBdmFpbGFibGVWaWRNZW0oJXAsJXAsJXApLHN0dWIhXG4iLAorCQl0aGlzLGRkc2NhcHMsdG90YWwsZnJlZQorCSk7CisJaWYgKHRvdGFsKSAqdG90YWwgPSB0aGlzLT5kLmZiX21lbXNpemUgKiAxMDI0OworCWlmIChmcmVlKSAqZnJlZSA9IHRoaXMtPmQuZmJfbWVtc2l6ZSAqIDEwMjQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfR2V0TW9uaXRvckZyZXF1ZW5jeSgKKwlMUERJUkVDVERSQVcyIHRoaXMsTFBEV09SRCBmcmVxCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcyKCVwKS0+R2V0TW9uaXRvckZyZXF1ZW5jeSglcClcbiIsdGhpcyxmcmVxKTsKKwkqZnJlcSA9IDYwOworCXJldHVybiAwOworfQorCitzdGF0aWMgSURpcmVjdERyYXcyX1ZUYWJsZSBkZDJ2dCA9IHsKKwlJRGlyZWN0RHJhdzJfUXVlcnlJbnRlcmZhY2UsCisJSURpcmVjdERyYXcyX0FkZFJlZiwKKwlJRGlyZWN0RHJhdzJfUmVsZWFzZSwKKwkodm9pZCopNCwKKwlJRGlyZWN0RHJhdzJfQ3JlYXRlQ2xpcHBlciwKKwlJRGlyZWN0RHJhdzJfQ3JlYXRlUGFsZXR0ZSwKKwlJRGlyZWN0RHJhdzJfQ3JlYXRlU3VyZmFjZSwKKwkodm9pZCopOCwKKwlJRGlyZWN0RHJhdzJfRW51bURpc3BsYXlNb2RlcywKKwlJRGlyZWN0RHJhdzJfRW51bVN1cmZhY2VzLAorCSh2b2lkKikxMSwKKwlJRGlyZWN0RHJhdzJfR2V0Q2FwcywKKwlJRGlyZWN0RHJhdzJfR2V0RGlzcGxheU1vZGUsCisJKHZvaWQqKTE0LAorCSh2b2lkKikxNSwKKwlJRGlyZWN0RHJhdzJfR2V0TW9uaXRvckZyZXF1ZW5jeSwKKwkodm9pZCopMTcsCisJKHZvaWQqKTE4LAorCSh2b2lkKikxOSwKKwlJRGlyZWN0RHJhdzJfUmVzdG9yZURpc3BsYXlNb2RlLAorCUlEaXJlY3REcmF3Ml9TZXRDb29wZXJhdGl2ZUxldmVsLAorCUlEaXJlY3REcmF3Ml9TZXREaXNwbGF5TW9kZSwKKwkodm9pZCopMjMvKklEaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rKi8sCisJSURpcmVjdERyYXcyX0dldEF2YWlsYWJsZVZpZE1lbQorCQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCURpcmVjdERyYXdDcmVhdGUKKyAqLwogCiBIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3Q3JlYXRlKCBMUEdVSUQgbHBHVUlELCBMUERJUkVDVERSQVcgKmxwbHBERCwgTFBVTktOT1dOIHBVbmtPdXRlciApIHsKIAogCWNoYXIJeGNsc2lkWzUwXTsKIAlpbnQJbWVtc2l6ZSxiYW5rc2l6ZSx3aWR0aCxldmJhc2UsZXZyZXQsbWFqb3IsbWlub3IsZmxhZ3MsaGVpZ2h0OwogCWNoYXIJKmFkZHI7Ci0JCiAKIAlpZiAobHBHVUlEKQogCQlTdHJpbmdGcm9tQ0xTSUQobHBHVUlELHhjbHNpZCk7CiAJZWxzZQogCQlzdHJjcHkoeGNsc2lkLCI8bnVsbD4iKTsKIAotCWZwcmludGYoc3RkZXJyLCJEaXJlY3REcmF3Q3JlYXRlKCVzLCVwLCVwKVxuIix4Y2xzaWQsbHBscERELHBVbmtPdXRlcik7CisJZHByaW50Zl9kZHJhdyhzdGRlcnIsIkRpcmVjdERyYXdDcmVhdGUoJXMsJXAsJXApXG4iLHhjbHNpZCxscGxwREQscFVua091dGVyKTsKIAlpZiAoZ2V0dWlkKCkpIHsKLQkJTWVzc2FnZUJveDMyQSgwLCJVc2luZyB0aGUgWEY4NkRHQSBleHRlbnNpb25zIHJlcXVpcmVzIHRoZSBwcm9ncmFtIHRvIGJlIHJ1biB1c2luZyBVSUQgMC4iLCJXSU5FIERpcmVjdERyYXciLE1CX09LfE1CX0lDT05TVE9QKTsKKwkJTWVzc2FnZUJveDMyQSgwLCJVc2luZyB0aGUgWEY4NkRHQSBleHRlbnNpb24gcmVxdWlyZXMgdGhlIHByb2dyYW0gdG8gYmUgcnVuIHVzaW5nIFVJRCAwLiIsIldJTkUgRGlyZWN0RHJhdyIsTUJfT0t8TUJfSUNPTlNUT1ApOwogCQlyZXR1cm4gRV9VTkVYUEVDVEVEOwogCX0KIAkqbHBscEREID0gKExQRElSRUNURFJBVylIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0RHJhdykpOwpAQCAtMTE2OCwxMiArMTYxMSwxMiBAQAogCQlyZXR1cm4gMDsKIAl9CiAJWEY4NkRHQVF1ZXJ5VmVyc2lvbihkaXNwbGF5LCZtYWpvciwmbWlub3IpOwotCWZwcmludGYoc3RkZXJyLCJYRjg2REdBIGlzIHZlcnNpb24gJWQuJWRcbiIsbWFqb3IsbWlub3IpOworCWRwcmludGZfZGRyYXcoc3RkZXJyLCJYRjg2REdBIGlzIHZlcnNpb24gJWQuJWRcbiIsbWFqb3IsbWlub3IpOwogCVhGODZER0FRdWVyeURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmZmxhZ3MpOwogCWlmICghKGZsYWdzICYgWEY4NkRHQURpcmVjdFByZXNlbnQpKQogCQlmcHJpbnRmKHN0ZGVyciwiZGlyZWN0IHZpZGVvIGlzIE5PVCBFTkFCTEVELlxuIik7CiAJWEY4NkRHQUdldFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmYWRkciwmd2lkdGgsJmJhbmtzaXplLCZtZW1zaXplKTsKLQlmcHJpbnRmKHN0ZGVyciwidmlkZW8gZnJhbWVidWZmZXI6IGJlZ2luICVwLCB3aWR0aCAlZCxiYW5rc2l6ZSAlZCxtZW1zaXplICVkXG4iLAorCWRwcmludGZfZGRyYXcoc3RkZXJyLCJ2aWRlbyBmcmFtZWJ1ZmZlcjogYmVnaW4gJXAsIHdpZHRoICVkLGJhbmtzaXplICVkLG1lbXNpemUgJWRcbiIsCiAJCWFkZHIsd2lkdGgsYmFua3NpemUsbWVtc2l6ZQogCSk7CiAJKCpscGxwREQpLT5kLmZiX3dpZHRoID0gd2lkdGg7CkBAIC0xMTg3LDYgKzE2MzAsMTIgQEAKIAkoKmxwbHBERCktPmQudnBfaGVpZ2h0ID0gaGVpZ2h0OwogCSgqbHBscEREKS0+ZC5mYl9oZWlnaHQgPSBoZWlnaHQ7CiAJKCpscGxwREQpLT5kLnZwbWFzayA9IDA7CisKKwkvKiBqdXN0IGFzc3VtZSB0aGUgZGVmYXVsdCBkZXB0aCBpcyB0aGUgREdBIGRlcHRoIHRvbyAqLworCSgqbHBscEREKS0+ZC5kZXB0aCA9IERlZmF1bHREZXB0aE9mU2NyZWVuKHNjcmVlbik7CisjaWZkZWYgUkVTVE9SRV9TSUdOQUxTCisJU0lHTkFMX0luaXRFbXVsYXRvcigpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvbWFwcGluZy5jIGIvZ3JhcGhpY3MvbWFwcGluZy5jCmluZGV4IDU3NmViMzQuLjBjZWQ5NTQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL21hcHBpbmcuYworKysgYi9ncmFwaGljcy9tYXBwaW5nLmMKQEAgLTU3LDEzICs1NywzNSBAQAogICovCiBCT09MMzIgV0lOQVBJIERQdG9MUDMyKCBIREMzMiBoZGMsIExQUE9JTlQzMiBwb2ludHMsIElOVDMyIGNvdW50ICkKIHsKKyAgICBGTE9BVCBkZXRlcm1pbmFudD0xLjAsIHgsIHk7CisgICAgCiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwogCisgICAgaWYgKGRjLT53LlVzZVdvcmxkWGZvcm0pCisgICAgeworICAgICAgICBkZXRlcm1pbmFudCA9IGRjLT53LldvcmxkWGZvcm0uZU0xMSpkYy0+dy5Xb3JsZFhmb3JtLmVNMjIgLQorICAgICAgICAgICAgZGMtPncuV29ybGRYZm9ybS5lTTEyKmRjLT53LldvcmxkWGZvcm0uZU0yMTsKKyAgICAgICAgaWYgKGRldGVybWluYW50ID4gLTFlLTEyICYmIGRldGVybWluYW50IDwgMWUtMTIpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCiAgICAgd2hpbGUgKGNvdW50LS0pCiAgICAgewotCXBvaW50cy0+eCA9IFhEUFRPTFAoIGRjLCBwb2ludHMtPnggKTsKLQlwb2ludHMtPnkgPSBZRFBUT0xQKCBkYywgcG9pbnRzLT55ICk7CisJaWYgKGRjLT53LlVzZVdvcmxkWGZvcm0pCisJeworICAgICAgICAgICAgeCA9IChGTE9BVClwb2ludHMtPnggLSBkYy0+dy5Xb3JsZFhmb3JtLmVEeDsKKwkgICAgeSA9IChGTE9BVClwb2ludHMtPnkgLSBkYy0+dy5Xb3JsZFhmb3JtLmVEeTsKKwkgICAgcG9pbnRzLT54ID0gKElOVDMyKSggKHgqZGMtPncuV29ybGRYZm9ybS5lTTIyIC0KKwkgICAgICAgeSpkYy0+dy5Xb3JsZFhmb3JtLmVNMjEpIC8gZGV0ZXJtaW5hbnQgKTsKKwkgICAgcG9pbnRzLT55ID0gKElOVDMyKSggKC14KmRjLT53LldvcmxkWGZvcm0uZU0xMiArCisJICAgICAgIHkqZGMtPncuV29ybGRYZm9ybS5lTTExKSAvIGRldGVybWluYW50ICk7CisJfQorCWVsc2UKKwl7CisJICAgIHBvaW50cy0+eCA9IFhMUFRPRFAoIGRjLCBwb2ludHMtPnggKTsKKwkgICAgcG9pbnRzLT55ID0gWUxQVE9EUCggZGMsIHBvaW50cy0+eSApOworCX0KICAgICAgICAgcG9pbnRzKys7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwpAQCAtOTMsMTMgKzExNSwzMCBAQAogICovCiBCT09MMzIgV0lOQVBJIExQdG9EUDMyKCBIREMzMiBoZGMsIExQUE9JTlQzMiBwb2ludHMsIElOVDMyIGNvdW50ICkKIHsKKyAgICBGTE9BVCB4LCB5OworCiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwogCiAgICAgd2hpbGUgKGNvdW50LS0pCiAgICAgewotCXBvaW50cy0+eCA9IFhMUFRPRFAoIGRjLCBwb2ludHMtPnggKTsKLQlwb2ludHMtPnkgPSBZTFBUT0RQKCBkYywgcG9pbnRzLT55ICk7CisJaWYgKGRjLT53LlVzZVdvcmxkWGZvcm0pCisJeworCSAgICB4ID0gKEZMT0FUKXBvaW50cy0+eCAqIGRjLT53LldvcmxkWGZvcm0uZU0xMSArCisJICAgIAkoRkxPQVQpcG9pbnRzLT55ICogZGMtPncuV29ybGRYZm9ybS5lTTIxICsKKwkJZGMtPncuV29ybGRYZm9ybS5lRHg7CisJICAgIHkgPSAoRkxPQVQpcG9pbnRzLT54ICogZGMtPncuV29ybGRYZm9ybS5lTTEyICsKKwkgICAgICAgIChGTE9BVClwb2ludHMtPnkgKiBkYy0+dy5Xb3JsZFhmb3JtLmVNMjIgKworCQlkYy0+dy5Xb3JsZFhmb3JtLmVEeTsKKwkgICAgcG9pbnRzLT54ID0gWERQVE9MUCggZGMsIChJTlQzMil4ICk7CisJICAgIHBvaW50cy0+eSA9IFlEUFRPTFAoIGRjLCAoSU5UMzIpeSApOworCSAgICAKKwl9CisJZWxzZQorCXsKKwkgICAgcG9pbnRzLT54ID0gWERQVE9MUCggZGMsIHBvaW50cy0+eCApOworCSAgICBwb2ludHMtPnkgPSBZRFBUT0xQKCBkYywgcG9pbnRzLT55ICk7CisJfQogICAgICAgICBwb2ludHMrKzsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMgYi9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMKaW5kZXggYzU1ODMyYS4uNTg1ODdmMCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jCisrKyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYwpAQCAtMTM1LDkgKzEzNSwxNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIENyZWF0ZU1ldGFmaWxlMTYgICAoR0RJLjEyNSkKKyAqCSAgICAgQ3JlYXRlTWV0YUZpbGUxNiAgIChHREkuMTI1KQorICoKKyAqICBDcmVhdGUgYSBuZXcgREMgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGEgbWV0YWZpbGUuIFBhc3MgYSBmaWxlbmFtZQorICogIHRvIGNyZWF0ZSBhIGRpc2stYmFzZWQgbWV0YWZpbGUsIE5VTEwgdG8gY3JlYXRlIGEgbWVtb3J5IG1ldGFmaWxlLgorICoKKyAqIFJFVFVSTlMKKyAqICBBIGhhbmRsZSB0byB0aGUgbWV0YWZpbGUgREMgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvbiBmYWlsdXJlLgogICovCi1IREMxNiBXSU5BUEkgQ3JlYXRlTWV0YUZpbGUxNiggTFBDU1RSIGZpbGVuYW1lICkKK0hEQzE2IFdJTkFQSSBDcmVhdGVNZXRhRmlsZTE2KCAKKwkJCSAgICAgIExQQ1NUUiBmaWxlbmFtZSAvKiBGaWxlbmFtZSBvZiBkaXNrIG1ldGFmaWxlICovCispCiB7CiAgICAgREMgKmRjOwogICAgIE1FVEFGSUxFRFJWX1BERVZJQ0UgKnBoeXNEZXY7CkBAIC0xNzQsOSArMTgyLDE3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgICBDbG9zZU1ldGFmaWxlMTYgICAoR0RJLjEyNikKKyAqCSAgICAgQ2xvc2VNZXRhRmlsZTE2ICAgKEdESS4xMjYpCisgKgorICogIFN0b3AgcmVjb3JkaW5nIGdyYXBoaWNzIG9wZXJhdGlvbnMgaW4gbWV0YWZpbGUgYXNzb2NpYXRlZCB3aXRoCisgKiAgaGRjIGFuZCByZXRyaWV2ZSBtZXRhZmlsZS4KKyAqCisgKiBSRVRVUk5TCisgKiAgSGFuZGxlIG9mIG5ld2x5IGNyZWF0ZWQgbWV0YWZpbGUgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgogICovCi1ITUVUQUZJTEUxNiBXSU5BUEkgQ2xvc2VNZXRhRmlsZTE2KCBIREMxNiBoZGMgKQorSE1FVEFGSUxFMTYgV0lOQVBJIENsb3NlTWV0YUZpbGUxNiggCisJCQkJICAgSERDMTYgaGRjIC8qIE1ldGFmaWxlIERDIHRvIGNsb3NlICovCispCiB7CiAgICAgREMgKmRjOwogICAgIEhNRVRBRklMRTE2IGhtZjsKQEAgLTIyOCw5ICsyNDQsMTYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIERlbGV0ZU1ldGFmaWxlMTYgICAoR0RJLjEyNykKKyAqCSAgICAgRGVsZXRlTWV0YUZpbGUxNiAgIChHREkuMTI3KQorICoKKyAqICBEZWxldGUgYSBtZW1vcnktYmFzZWQgbWV0YWZpbGUuCisgKgogICovCi1CT09MMTYgV0lOQVBJIERlbGV0ZU1ldGFGaWxlMTYoIEhNRVRBRklMRTE2IGhtZiApCitCT09MMTYgV0lOQVBJIERlbGV0ZU1ldGFGaWxlMTYoIAorCQkJICAgICAgIEhNRVRBRklMRTE2IGhtZiAKKwkJCSAgICAgICAvKiBIYW5kbGUgb2YgbWVtb3J5IG1ldGFmaWxlIHRvIGRlbGV0ZSAqLworKQogewogICAgIHJldHVybiAhR2xvYmFsRnJlZTE2KCBobWYgKTsKIH0KKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcGFpbnRpbmcuYyBiL2dyYXBoaWNzL3BhaW50aW5nLmMKaW5kZXggY2VjM2Q5Yy4uNjc1NmM0MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvcGFpbnRpbmcuYworKysgYi9ncmFwaGljcy9wYWludGluZy5jCkBAIC03LDggKzcsOCBAQAogCiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSA8WDExL1h1dGlsLmg+CisjaW5jbHVkZSAidHNfeGxpYi5oIgorI2luY2x1ZGUgInRzX3h1dGlsLmgiCiAjaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgogI2lmbmRlZiBQSQogI2RlZmluZSBQSSBNX1BJCkBAIC0xMTcsNiArMTE3LDExIEBACiB7CiAgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKICAgCisgICAgaWYoZGMgJiYgUEFUSF9Jc1BhdGhPcGVuKGRjLT53LnBhdGgpKQorICAgICAgICBpZighUEFUSF9BcmMoaGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHhzdGFydCwgeXN0YXJ0LCB4ZW5kLAorCSAgIHllbmQpKQorCSAgIHJldHVybiBGQUxTRTsKKyAgICAKICAgICByZXR1cm4gZGMgJiYgZGMtPmZ1bmNzLT5wQXJjICYmCiAgICAgCSAgIGRjLT5mdW5jcy0+cEFyYyhkYyxsZWZ0LHRvcCxyaWdodCxib3R0b20seHN0YXJ0LHlzdGFydCx4ZW5kLHllbmQpOwogfQpAQCAtNTMzLDcgKzUzOCw3IEBACiAgICAgZGMtPnUueC5wZW4ucGl4ZWwgPSAoMSA8PCBzY3JlZW5EZXB0aCkgLSAxOwogCiAgICAgaWYgKERDX1NldHVwR0NGb3JQZW4oIGRjICkpCi0JWERyYXdSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJVFNYRHJhd1JlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKIAkJICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyB0b3AsCiAJCSAgICAgICAgcmlnaHQtbGVmdC0xLCBib3R0b20tdG9wLTEgKTsKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcGF0aC5jIGIvZ3JhcGhpY3MvcGF0aC5jCmluZGV4IGU0ZTQwMTMuLmQ1M2FjZDkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BhdGguYworKysgYi9ncmFwaGljcy9wYXRoLmMKQEAgLTEsMTEgKzEsMTIgQEAKIC8qCiAgKiBHcmFwaGljcyBwYXRocyAoQmVnaW5QYXRoLCBFbmRQYXRoIGV0Yy4pCiAgKgotICogQ29weXJpZ2h0IDE5OTcgTWFydGluIEJvZWhtZQorICogQ29weXJpZ2h0IDE5OTcsIDE5OTggTWFydGluIEJvZWhtZQogICovCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKQEAgLTY0LDYgKzY1LDIyIEBACiBzdGF0aWMgQk9PTDMyIFBBVEhfQWRkRW50cnkoR2RpUGF0aCAqcFBhdGgsIFBPSU5UMzIgcG9pbnQsIEJZVEUgZmxhZ3MpOwogc3RhdGljIEJPT0wzMiBQQVRIX1Jlc2VydmVFbnRyaWVzKEdkaVBhdGggKnBQYXRoLCBJTlQzMiBudW1FbnRyaWVzKTsKIHN0YXRpYyBCT09MMzIgUEFUSF9HZXRQYXRoRnJvbUhEQyhIREMzMiBoZGMsIEdkaVBhdGggKipwcFBhdGgpOworc3RhdGljIEJPT0wzMiBQQVRIX0RvQXJjUGFydChHZGlQYXRoICpwUGF0aCwgUE9JTlQzMiBjb3JuZXJzW10sCisgICBkb3VibGUgYW5nbGVTdGFydCwgZG91YmxlIGFuZ2xlRW5kLCBCT09MMzIgYWRkTW92ZVRvKTsKK3N0YXRpYyB2b2lkIFBBVEhfU2NhbGVOb3JtYWxpemVkUG9pbnQoUE9JTlQzMiBjb3JuZXJzW10sIGRvdWJsZSB4LCBkb3VibGUgeSwKKyAgIFBPSU5UMzIgKnBQb2ludCk7CitzdGF0aWMgdm9pZCBQQVRIX05vcm1hbGl6ZVBvaW50KFBPSU5UMzIgY29ybmVyc1tdLCBjb25zdCBQT0lOVDMyICpwUG9pbnQsCisgICBkb3VibGUgKnBYLCBkb3VibGUgKnBZKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBCZWdpblBhdGgxNiAgICAoR0RJLjUxMikKKyAqLworQk9PTDE2IFdJTkFQSSBCZWdpblBhdGgxNihIREMxNiBoZGMpCit7CisgICByZXR1cm4gKEJPT0wxNilCZWdpblBhdGgzMigoSERDMzIpaGRjKTsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBCZWdpblBhdGgzMiAgICAoR0RJMzIuOSkKQEAgLTk1LDYgKzExMiwxNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEVuZFBhdGgxNiAgICAoR0RJLjUxNCkKKyAqLworQk9PTDE2IFdJTkFQSSBFbmRQYXRoMTYoSERDMTYgaGRjKQoreworICAgcmV0dXJuIChCT09MMTYpRW5kUGF0aDMyKChIREMzMiloZGMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEVuZFBhdGgzMiAgICAoR0RJMzIuNzgpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRW5kUGF0aDMyKEhEQzMyIGhkYykKQEAgLTEyMyw2ICsxNDksMTUgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBBYm9ydFBhdGgxNiAgICAoR0RJLjUxMSkKKyAqLworQk9PTDE2IFdJTkFQSSBBYm9ydFBhdGgxNihIREMxNiBoZGMpCit7CisgICByZXR1cm4gKEJPT0wxNilBYm9ydFBhdGgzMigoSERDMzIpaGRjKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBBYm9ydFBhdGgzMiAgICAoR0RJMzIuMSkKICAqLwogQk9PTDMyIFdJTkFQSSBBYm9ydFBhdGgzMihIREMzMiBoZGMpCkBAIC0xNDUsNiArMTgwLDE1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ2xvc2VGaWd1cmUxNiAgICAoR0RJLjUxMykKKyAqLworQk9PTDE2IFdJTkFQSSBDbG9zZUZpZ3VyZTE2KEhEQzE2IGhkYykKK3sKKyAgIHJldHVybiAoQk9PTDE2KUNsb3NlRmlndXJlMzIoKEhEQzMyKWhkYyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ2xvc2VGaWd1cmUzMiAgICAoR0RJMzIuMTYpCiAgKi8KIEJPT0wzMiBXSU5BUEkgQ2xvc2VGaWd1cmUzMihIREMzMiBoZGMpCkBAIC0xNzgsMTMgKzIyMiwyNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFBhdGgxNiAgICAoR0RJLjUxNykKKyAqLworSU5UMTYgV0lOQVBJIEdldFBhdGgxNihIREMxNiBoZGMsIExQUE9JTlQxNiBwUG9pbnRzLCBMUEJZVEUgcFR5cGVzLAorICAgSU5UMTYgblNpemUpCit7CisgICAvKiBGSVhNRTogTm90IGltcGxlbWVudGVkICovCisgICBmcHJpbnRmKHN0ZG5pbXAsICJHZXRQYXRoMTY6IFVuaW1wbGVtZW50ZWQgc3R1YlxuIik7CisKKyAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFBhdGgzMiAgICAoR0RJMzIuMjEwKQogICovCiBJTlQzMiBXSU5BUEkgR2V0UGF0aDMyKEhEQzMyIGhkYywgTFBQT0lOVDMyIHBQb2ludHMsIExQQllURSBwVHlwZXMsCiAgICBJTlQzMiBuU2l6ZSkKIHsKICAgIEdkaVBhdGggKnBQYXRoOwotICAgQk9PTDMyICB0ZW1wX2ZsYWc7CiAgICAKICAgIC8qIEdldCBwb2ludGVyIHRvIHBhdGggKi8KICAgIGlmKCFQQVRIX0dldFBhdGhGcm9tSERDKGhkYywgJnBQYXRoKSkKQEAgLTIxMywxMCArMjY5LDEyIEBACiAgICAgICBtZW1jcHkocFR5cGVzLCBwUGF0aC0+cEZsYWdzLCBzaXplb2YoQllURSkqcFBhdGgtPm51bUVudHJpZXNVc2VkKTsKIAogICAgICAgLyogQ29udmVydCB0aGUgcG9pbnRzIHRvIGxvZ2ljYWwgY29vcmRpbmF0ZXMgKi8KLSAgICAgIHRlbXBfZmxhZz1EUHRvTFAzMihoZGMsIHBQb2ludHMsIHBQYXRoLT5udW1FbnRyaWVzVXNlZCk7Ci0KLSAgICAgIC8qIFNpbmNlIGhkYyBpcyB2YWxpZCwgY29udmVyc2lvbiBzaG91bGQgbmV2ZXIgZmFpbCAqLwotICAgICAgYXNzZXJ0KHRlbXBfZmxhZyk7CisgICAgICBpZighRFB0b0xQMzIoaGRjLCBwUG9pbnRzLCBwUGF0aC0+bnVtRW50cmllc1VzZWQpKQorICAgICAgeworCSAvKiBGSVhNRTogSXMgdGhpcyB0aGUgY29ycmVjdCB2YWx1ZT8gKi8KKyAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQU5fTk9UX0NPTVBMRVRFKTsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KICAgICAgIAogICAgICAgcmV0dXJuIHBQYXRoLT5udW1FbnRyaWVzVXNlZDsKICAgIH0KQEAgLTI2Niw4ICszMjQsOSBAQAogLyogRklYTUU6IENoZWNrIHRoYXQgU2V0TGFzdEVycm9yIGlzIGJlaW5nIGNhbGxlZCBjb3JyZWN0bHkgKi8KIHsKICAgIEdkaVBhdGggKnBQYXRoOwotICAgSU5UMzIgICBtYXBNb2RlOworICAgSU5UMzIgICBtYXBNb2RlLCBncmFwaGljc01vZGU7CiAgICBQT0lOVDMyIHB0Vmlld3BvcnRFeHQsIHB0Vmlld3BvcnRPcmcsIHB0V2luZG93RXh0LCBwdFdpbmRvd09yZzsKKyAgIFhGT1JNICAgeGZvcm07CiAgICBIUkdOMzIgIGhyZ247CiAgICAKICAgIC8qIEdldCBwb2ludGVyIHRvIHBhdGggKi8KQEAgLTI5MCw2ICszNDksOSBAQAogICAgICAgLyogU2luY2UgUGFpbnRSZ24gaW50ZXJwcmV0cyB0aGUgcmVnaW9uIGFzIGJlaW5nIGluIGxvZ2ljYWwgY29vcmRpbmF0ZXMKICAgICAgICAqIGJ1dCB0aGUgcG9pbnRzIHdlIHN0b3JlIGZvciB0aGUgcGF0aCBhcmUgYWxyZWFkeSBpbiBkZXZpY2UKICAgICAgICAqIGNvb3JkaW5hdGVzLCB3ZSBoYXZlIHRvIHNldCB0aGUgbWFwcGluZyBtb2RlIHRvIE1NX1RFWFQgdGVtcG9yYXJpbHkuCisgICAgICAgKiBVc2luZyBTYXZlREMgdG8gc2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWFwcGluZyBtb2RlIC8gd29ybGQKKyAgICAgICAqIHRyYW5zZm9ybSB3b3VsZCBiZSBlYXNpZXIgYnV0IHdvdWxkIHJlcXVpcmUgbW9yZSBvdmVyaGVhZCwgZXNwZWNpYWxseQorICAgICAgICogbm93IHRoYXQgU2F2ZURDIHNhdmVzIHRoZSBjdXJyZW50IHBhdGguCiAgICAgICAgKi8KICAgICAgICAKICAgICAgIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvbGQgbWFwcGluZyBtb2RlICovCkBAIC0yOTksMTMgKzM2MSwxNCBAQAogICAgICAgR2V0V2luZG93RXh0RXgzMihoZGMsICZwdFdpbmRvd0V4dCk7CiAgICAgICBHZXRXaW5kb3dPcmdFeDMyKGhkYywgJnB0V2luZG93T3JnKTsKICAgICAgIAotICAgICAgLyogRklYTUU6IE9uY2Ugd29ybGQgdHJhbnNmb3JtcyBiZWNvbWUgYXZhaWxhYmxlLCB3ZSB3aWxsIGhhdmUgdG8gZG8KLSAgICAgICAqIGEgR2V0V29ybGRUcmFuc2Zvcm0sIHRvbyAoYWxvbmcgd2l0aCBhIFNldFdvcmxkVHJhbnNmb3JtIGxhdGVyIG9uKS4KLSAgICAgICAqIE1vcmFsOiBQZXJoYXBzIEkgc2hvdWxkIGhhdmUgdXNlZCBTYXZlREMgcmlnaHQgYXdheS4gVGhlIHJlYXNvbiB3aHkKLSAgICAgICAqIEkgZGlkbid0IGlzIHRoYXQgSSB3YW50ZWQgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGEgZnVsbCBTYXZlREMKLSAgICAgICAqIChlc3BlY2lhbGx5IHNpbmNlIFNhdmVEQyBub3cgc2F2ZXMgdGhlIGN1cnJlbnQgcGF0aCBhcyB3ZWxsKS4KKyAgICAgIC8qIFNhdmUgd29ybGQgdHJhbnNmb3JtCisgICAgICAgKiBOQjogVGhlIFdpbmRvd3MgZG9jdW1lbnRhdGlvbiBvbiB3b3JsZCB0cmFuc2Zvcm1zIHdvdWxkIGxlYWQgb25lIHRvCisgICAgICAgKiBiZWxpZXZlIHRoYXQgdGhpcyBoYXMgdG8gYmUgZG9uZSBvbmx5IGluIEdNX0FEVkFOQ0VEOyBob3dldmVyLCBteQorICAgICAgICogdGVzdHMgc2hvdyB0aGF0IHJlc2V0dGluZyB0aGUgZ3JhcGhpY3MgbW9kZSB0byBHTV9DT01QQVRJQkxFIGRvZXMKKyAgICAgICAqIG5vdCByZXNldCB0aGUgd29ybGQgdHJhbnNmb3JtLgogICAgICAgICovCi0KKyAgICAgIEdldFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKTsKKyAgICAgIAogICAgICAgLyogU2V0IE1NX1RFWFQgKi8KICAgICAgIFNldE1hcE1vZGUzMihoZGMsIE1NX1RFWFQpOwogICAgICAgCkBAIC0zMTksNiArMzgyLDEyIEBACiAgICAgICBTZXRXaW5kb3dFeHRFeDMyKGhkYywgcHRXaW5kb3dFeHQueCwgcHRXaW5kb3dFeHQueSwgTlVMTCk7CiAgICAgICBTZXRXaW5kb3dPcmdFeDMyKGhkYywgcHRXaW5kb3dPcmcueCwgcHRXaW5kb3dPcmcueSwgTlVMTCk7CiAKKyAgICAgIC8qIEdvIHRvIEdNX0FEVkFOQ0VEIHRlbXBvcmFyaWx5IHRvIHJlc3RvcmUgdGhlIHdvcmxkIHRyYW5zZm9ybSAqLworICAgICAgZ3JhcGhpY3NNb2RlPUdldEdyYXBoaWNzTW9kZShoZGMpOworICAgICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgR01fQURWQU5DRUQpOworICAgICAgU2V0V29ybGRUcmFuc2Zvcm0oaGRjLCAmeGZvcm0pOworICAgICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgZ3JhcGhpY3NNb2RlKTsKKwogICAgICAgLyogRW1wdHkgdGhlIHBhdGggKi8KICAgICAgIFBBVEhfRW1wdHlQYXRoKHBQYXRoKTsKICAgICAgIHJldHVybiBUUlVFOwpAQCAtMzM1LDEyICs0MDQsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNlbGVjdENsaXBQYXRoMzIgICAgKEdESTMyLjI5NikKICAqLwotQk9PTDMyIFdJTkFQSSBTZWxlY3RDbGlwUGF0aDMyKEhEQzMyIGhkYywgaW50IGlNb2RlKQorQk9PTDMyIFdJTkFQSSBTZWxlY3RDbGlwUGF0aDMyKEhEQzMyIGhkYywgSU5UMzIgaU1vZGUpCiAvKiBGSVhNRTogQ2hlY2sgdGhhdCBTZXRMYXN0RXJyb3IgaXMgYmVpbmcgY2FsbGVkIGNvcnJlY3RseSAqLwogewogICAgR2RpUGF0aCAqcFBhdGg7CiAgICBIUkdOMzIgIGhyZ25QYXRoLCBocmduQ2xpcDsKLSAgIEJPT0wzMiAgc3VjY2VzcyA9IEZBTFNFOworICAgQk9PTDMyICBzdWNjZXNzOwogICAgCiAgICAvKiBHZXQgcG9pbnRlciB0byBwYXRoICovCiAgICBpZighUEFUSF9HZXRQYXRoRnJvbUhEQyhoZGMsICZwUGF0aCkpCkBAIC0zNjAsNyArNDI5LDkgQEAKICAgIGlmKFBBVEhfUGF0aFRvUmVnaW9uKHBQYXRoLCBHZXRQb2x5RmlsbE1vZGUzMihoZGMpLCAmaHJnblBhdGgpKQogICAgewogICAgICAgaHJnbkNsaXA9Q3JlYXRlUmVjdFJnbjMyKDAsIDAsIDAsIDApOwotICAgICAgaWYoaHJnbkNsaXAhPU5VTEwpCisgICAgICBpZihocmduQ2xpcD09TlVMTCkKKyAgICAgICAgIHN1Y2Nlc3M9RkFMU0U7CisgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgICBzdWNjZXNzPShHZXRDbGlwUmduMzIoaGRjLCBocmduQ2xpcCkhPS0xKSAmJgogCSAgICAoQ29tYmluZVJnbjMyKGhyZ25DbGlwLCBocmduQ2xpcCwgaHJnblBhdGgsIGlNb2RlKSE9RVJST1IpICYmCkBAIC01MTAsNiArNTgxLDE1MiBAQAogICAgcmV0dXJuIFBBVEhfQWRkRW50cnkocFBhdGgsIHBvaW50LCBQVF9MSU5FVE8pOwogfQogCisvKiBQQVRIX0VsbGlwc2UKKyAqIAorICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgY2FsbCB0byBFbGxpcHNlIGlzIHBlcmZvcm1lZCBvbiBhIERDIHRoYXQgaGFzCisgKiBhbiBvcGVuIHBhdGguIFRoaXMgYWRkcyBmb3VyIEJlemllciBzcGxpbmVzIHJlcHJlc2VudGluZyB0aGUgZWxsaXBzZQorICogdG8gdGhlIHBhdGguIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBlbHNlIEZBTFNFLgorICovCitCT09MMzIgUEFUSF9FbGxpcHNlKEhEQzMyIGhkYywgSU5UMzIgeDEsIElOVDMyIHkxLCBJTlQzMiB4MiwgSU5UMzIgeTIpCit7CisgICByZXR1cm4gUEFUSF9BcmMoaGRjLCB4MSwgeTEsIHgyLCB5MiwgeDEsIDAsIHgxLCAwKTsKK30KKworLyogUEFUSF9BcmMKKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBjYWxsIHRvIEFyYyBpcyBwZXJmb3JtZWQgb24gYSBEQyB0aGF0IGhhcworICogYW4gb3BlbiBwYXRoLiBUaGlzIGFkZHMgdXAgdG8gZml2ZSBCZXppZXIgc3BsaW5lcyByZXByZXNlbnRpbmcgdGhlIGFyYworICogdG8gdGhlIHBhdGguIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBlbHNlIEZBTFNFLgorICovCitCT09MMzIgUEFUSF9BcmMoSERDMzIgaGRjLCBJTlQzMiB4MSwgSU5UMzIgeTEsIElOVDMyIHgyLCBJTlQzMiB5MiwKKyAgIElOVDMyIHhTdGFydCwgSU5UMzIgeVN0YXJ0LCBJTlQzMiB4RW5kLCBJTlQzMiB5RW5kKQoreworICAgR2RpUGF0aCAqcFBhdGg7CisgICBkb3VibGUgIGFuZ2xlU3RhcnQsIGFuZ2xlRW5kLCBhbmdsZVN0YXJ0UXVhZHJhbnQsIGFuZ2xlRW5kUXVhZHJhbnQ9MC4wOworICAgICAgICAgICAvKiBJbml0aWFsaXplIGFuZ2xlRW5kUXVhZHJhbnQgdG8gc2lsZW5jZSBnY2MncyB3YXJuaW5nICovCisgICBkb3VibGUgIHgsIHk7CisgICBQT0lOVDMyIGNvcm5lcnNbMl0sIHBvaW50U3RhcnQsIHBvaW50RW5kOworICAgQk9PTDMyICBzdGFydCwgZW5kOworICAgSU5UMzIgICB0ZW1wOworCisgICAvKiBGSVhNRTogVGhpcyBmdW5jdGlvbiBzaG91bGQgY2hlY2sgZm9yIGFsbCBwb3NzaWJsZSBlcnJvciByZXR1cm5zICovCisgICAKKyAgIC8qIEdldCBwb2ludGVyIHRvIHBhdGggKi8KKyAgIGlmKCFQQVRIX0dldFBhdGhGcm9tSERDKGhkYywgJnBQYXRoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIAorICAgLyogQ2hlY2sgdGhhdCBwYXRoIGlzIG9wZW4gKi8KKyAgIGlmKHBQYXRoLT5zdGF0ZSE9UEFUSF9PcGVuKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAvKiBDaGVjayBmb3IgemVybyBoZWlnaHQgLyB3aWR0aCAqLworICAgLyogRklYTUU6IFNob3VsZCB3ZSBkbyB0aGlzIGJlZm9yZSBvciBhZnRlciBMUHRvRFA/ICovCisgICBpZih4MT09eDIgfHwgeTE9PXkyKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAKKyAgIC8qIEluIEdNX0NPTVBBVElCTEUsIGRvbid0IGluY2x1ZGUgYm90dG9tIGFuZCByaWdodCBlZGdlcyAqLworICAgaWYoR2V0R3JhcGhpY3NNb2RlKGhkYyk9PUdNX0NPTVBBVElCTEUpCisgICB7CisgICAgICAvKiBGSVhNRTogU2hvdWxkIHdlIGRvIHRoaXMgYmVmb3JlIG9yIGFmdGVyIExQdG9EUD8gKi8KKyAgICAgIHgyLS07CisgICAgICB5Mi0tOworICAgfQorCisgICAvKiBDb252ZXJ0IHBvaW50cyB0byBkZXZpY2UgY29vcmRpbmF0ZXMgKi8KKyAgIGNvcm5lcnNbMF0ueD14MTsKKyAgIGNvcm5lcnNbMF0ueT15MTsKKyAgIGNvcm5lcnNbMV0ueD14MjsKKyAgIGNvcm5lcnNbMV0ueT15MjsKKyAgIHBvaW50U3RhcnQueD14U3RhcnQ7CisgICBwb2ludFN0YXJ0Lnk9eVN0YXJ0OworICAgcG9pbnRFbmQueD14RW5kOworICAgcG9pbnRFbmQueT15RW5kOworICAgaWYoIUxQdG9EUDMyKGhkYywgY29ybmVycywgMikgfHwgIUxQdG9EUDMyKGhkYywgJnBvaW50U3RhcnQsIDEpIHx8CisgICAgICAhTFB0b0RQMzIoaGRjLCAmcG9pbnRFbmQsIDEpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAvKiBNYWtlIHN1cmUgZmlyc3QgY29ybmVyIGlzIHRvcCBsZWZ0IGFuZCByaWdodCBjb3JuZXIgaXMgYm90dG9tIHJpZ2h0ICovCisgICAvKiBGSVhNRTogU2hvdWxkIHdlIGRvIHRoaXMgYmVmb3JlIG9yIGFmdGVyIExQdG9EUD8gKi8KKyAgIGlmKGNvcm5lcnNbMF0ueD5jb3JuZXJzWzFdLngpCisgICB7CisgICAgICB0ZW1wPWNvcm5lcnNbMF0ueDsKKyAgICAgIGNvcm5lcnNbMF0ueD1jb3JuZXJzWzFdLng7CisgICAgICBjb3JuZXJzWzFdLng9dGVtcDsKKyAgIH0KKyAgIGlmKGNvcm5lcnNbMF0ueT5jb3JuZXJzWzFdLnkpCisgICB7CisgICAgICB0ZW1wPWNvcm5lcnNbMF0ueTsKKyAgICAgIGNvcm5lcnNbMF0ueT1jb3JuZXJzWzFdLnk7CisgICAgICBjb3JuZXJzWzFdLnk9dGVtcDsKKyAgIH0KKworICAgLyogQ29tcHV0ZSBzdGFydCBhbmQgZW5kIGFuZ2xlICovCisgICBQQVRIX05vcm1hbGl6ZVBvaW50KGNvcm5lcnMsICZwb2ludFN0YXJ0LCAmeCwgJnkpOworICAgYW5nbGVTdGFydD1hdGFuMih5LCB4KTsKKyAgIFBBVEhfTm9ybWFsaXplUG9pbnQoY29ybmVycywgJnBvaW50RW5kLCAmeCwgJnkpOworICAgYW5nbGVFbmQ9YXRhbjIoeSwgeCk7CisKKyAgIC8qIE1ha2Ugc3VyZSB0aGUgZW5kIGFuZ2xlIGlzICJvbiB0aGUgcmlnaHQgc2lkZSIgb2YgdGhlIHN0YXJ0IGFuZ2xlICovCisgICBpZihHZXRBcmNEaXJlY3Rpb24zMihoZGMpPT1BRF9DTE9DS1dJU0UpCisgICB7CisgICAgICBpZihhbmdsZUVuZDw9YW5nbGVTdGFydCkKKyAgICAgIHsKKyAgICAgICAgIGFuZ2xlRW5kKz0yKk1fUEk7CisJIGFzc2VydChhbmdsZUVuZD49YW5nbGVTdGFydCk7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZihhbmdsZUVuZD49YW5nbGVTdGFydCkKKyAgICAgIHsKKyAgICAgICAgIGFuZ2xlRW5kLT0yKk1fUEk7CisJIGFzc2VydChhbmdsZUVuZDw9YW5nbGVTdGFydCk7CisgICAgICB9CisgICB9CisKKyAgIC8qIEFkZCB0aGUgYXJjIHRvIHRoZSBwYXRoIHdpdGggb25lIEJlemllciBzcGxpbmUgcGVyIHF1YWRyYW50IHRoYXQgdGhlCisgICAgKiBhcmMgc3BhbnMgKi8KKyAgIHN0YXJ0PVRSVUU7CisgICBlbmQ9RkFMU0U7CisgICBkbworICAgeworICAgICAgLyogRGV0ZXJtaW5lIHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlcyBmb3IgdGhpcyBxdWFkcmFudCAqLworICAgICAgaWYoc3RhcnQpCisgICAgICB7CisgICAgICAgICBhbmdsZVN0YXJ0UXVhZHJhbnQ9YW5nbGVTdGFydDsKKwkgaWYoR2V0QXJjRGlyZWN0aW9uMzIoaGRjKT09QURfQ0xPQ0tXSVNFKQorCSAgICBhbmdsZUVuZFF1YWRyYW50PShmbG9vcihhbmdsZVN0YXJ0L01fUElfMikrMS4wKSpNX1BJXzI7CisJIGVsc2UKKwkgICAgYW5nbGVFbmRRdWFkcmFudD0oY2VpbChhbmdsZVN0YXJ0L01fUElfMiktMS4wKSpNX1BJXzI7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJIGFuZ2xlU3RhcnRRdWFkcmFudD1hbmdsZUVuZFF1YWRyYW50OworCSBpZihHZXRBcmNEaXJlY3Rpb24zMihoZGMpPT1BRF9DTE9DS1dJU0UpCisJICAgIGFuZ2xlRW5kUXVhZHJhbnQrPU1fUElfMjsKKwkgZWxzZQorCSAgICBhbmdsZUVuZFF1YWRyYW50LT1NX1BJXzI7CisgICAgICB9CisKKyAgICAgIC8qIEhhdmUgd2UgcmVhY2hlZCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBhcmM/ICovCisgICAgICBpZigoR2V0QXJjRGlyZWN0aW9uMzIoaGRjKT09QURfQ0xPQ0tXSVNFICYmCisgICAgICAgICBhbmdsZUVuZDw9YW5nbGVFbmRRdWFkcmFudCkgfHwKKwkgKEdldEFyY0RpcmVjdGlvbjMyKGhkYyk9PUFEX0NPVU5URVJDTE9DS1dJU0UgJiYKKwkgYW5nbGVFbmQ+PWFuZ2xlRW5kUXVhZHJhbnQpKQorICAgICAgeworCSAvKiBBZGp1c3QgdGhlIGVuZCBhbmdsZSBmb3IgdGhpcyBxdWFkcmFudCAqLworICAgICAgICAgYW5nbGVFbmRRdWFkcmFudD1hbmdsZUVuZDsKKwkgZW5kPVRSVUU7CisgICAgICB9CisKKyAgICAgIC8qIEFkZCB0aGUgQmV6aWVyIHNwbGluZSB0byB0aGUgcGF0aCAqLworICAgICAgUEFUSF9Eb0FyY1BhcnQocFBhdGgsIGNvcm5lcnMsIGFuZ2xlU3RhcnRRdWFkcmFudCwgYW5nbGVFbmRRdWFkcmFudCwKKyAgICAgICAgIHN0YXJ0KTsKKyAgICAgIHN0YXJ0PUZBTFNFOworICAgfSAgd2hpbGUoIWVuZCk7CisKKyAgIHJldHVybiBUUlVFOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEludGVybmFsIGZ1bmN0aW9ucwpAQCAtNzAyLDMgKzkxOSw4NSBAQAogICAgZWxzZQogICAgICAgcmV0dXJuIEZBTFNFOwogfQorCisvKiBQQVRIX0RvQXJjUGFydAorICoKKyAqIENyZWF0ZXMgYSBCZXppZXIgc3BsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gcGFydCBvZiBhbiBhcmMgYW5kIGFwcGVuZHMgdGhlCisgKiBjb3JyZXNwb25kaW5nIHBvaW50cyB0byB0aGUgcGF0aC4gVGhlIHN0YXJ0IGFuZCBlbmQgYW5nbGVzIGFyZSBwYXNzZWQgaW4KKyAqICJhbmdsZVN0YXJ0IiBhbmQgImFuZ2xlRW5kIjsgdGhlc2UgYW5nbGVzIHNob3VsZCBzcGFuIGEgcXVhcnRlciBjaXJjbGUKKyAqIGF0IG1vc3QuIElmICJhZGRNb3ZlVG8iIGlzIHRydWUsIGEgUFRfTU9WRVRPIGVudHJ5IGZvciB0aGUgZmlyc3QgY29udHJvbAorICogcG9pbnQgaXMgYWRkZWQgdG8gdGhlIHBhdGg7IG90aGVyd2lzZSwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBjdXJyZW50CisgKiBwb3NpdGlvbiBpcyBlcXVhbCB0byB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAqLworc3RhdGljIEJPT0wzMiBQQVRIX0RvQXJjUGFydChHZGlQYXRoICpwUGF0aCwgUE9JTlQzMiBjb3JuZXJzW10sCisgICBkb3VibGUgYW5nbGVTdGFydCwgZG91YmxlIGFuZ2xlRW5kLCBCT09MMzIgYWRkTW92ZVRvKQoreworICAgZG91YmxlICBoYWxmQW5nbGUsIGE7CisgICBkb3VibGUgIHhOb3JtWzRdLCB5Tm9ybVs0XTsKKyAgIFBPSU5UMzIgcG9pbnQ7CisgICBpbnQgICAgIGk7CisKKyAgIGFzc2VydChmYWJzKGFuZ2xlRW5kLWFuZ2xlU3RhcnQpPD1NX1BJXzIpOworCisgICAvKiBGSVhNRTogSXMgdGhlcmUgYW4gZWFzaWVyIHdheSBvZiBjb21wdXRpbmcgdGhpcz8gKi8KKworICAgLyogQ29tcHV0ZSBjb250cm9sIHBvaW50cyAqLworICAgaGFsZkFuZ2xlPShhbmdsZUVuZC1hbmdsZVN0YXJ0KS8yLjA7CisgICBhPTQuMC8zLjAqKDEtY29zKGhhbGZBbmdsZSkpL3NpbihoYWxmQW5nbGUpOworICAgeE5vcm1bMF09Y29zKGFuZ2xlU3RhcnQpOworICAgeU5vcm1bMF09c2luKGFuZ2xlU3RhcnQpOworICAgeE5vcm1bMV09eE5vcm1bMF0gLSBhKnlOb3JtWzBdOworICAgeU5vcm1bMV09eU5vcm1bMF0gKyBhKnhOb3JtWzBdOworICAgeE5vcm1bM109Y29zKGFuZ2xlRW5kKTsKKyAgIHlOb3JtWzNdPXNpbihhbmdsZUVuZCk7CisgICB4Tm9ybVsyXT14Tm9ybVszXSArIGEqeU5vcm1bM107CisgICB5Tm9ybVsyXT15Tm9ybVszXSAtIGEqeE5vcm1bM107CisgICAKKyAgIC8qIEFkZCBzdGFydGluZyBwb2ludCB0byBwYXRoIGlmIGRlc2lyZWQgKi8KKyAgIGlmKGFkZE1vdmVUbykKKyAgIHsKKyAgICAgIFBBVEhfU2NhbGVOb3JtYWxpemVkUG9pbnQoY29ybmVycywgeE5vcm1bMF0sIHlOb3JtWzBdLCAmcG9pbnQpOworICAgICAgaWYoIVBBVEhfQWRkRW50cnkocFBhdGgsIHBvaW50LCBQVF9NT1ZFVE8pKQorICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgfQorCisgICAvKiBBZGQgcmVtYWluaW5nIGNvbnRyb2wgcG9pbnRzICovCisgICBmb3IoaT0xOyBpPDQ7IGkrKykKKyAgIHsKKyAgICAgIFBBVEhfU2NhbGVOb3JtYWxpemVkUG9pbnQoY29ybmVycywgeE5vcm1baV0sIHlOb3JtW2ldLCAmcG9pbnQpOworICAgICAgaWYoIVBBVEhfQWRkRW50cnkocFBhdGgsIHBvaW50LCBQVF9CRVpJRVJUTykpCisgICAgICAgICByZXR1cm4gRkFMU0U7CisgICB9CisKKyAgIHJldHVybiBUUlVFOworfQorCisvKiBQQVRIX1NjYWxlTm9ybWFsaXplZFBvaW50CisgKgorICogU2NhbGVzIGEgbm9ybWFsaXplZCBwb2ludCAoeCwgeSkgd2l0aCByZXNwZWN0IHRvIHRoZSBib3ggd2hvc2UgY29ybmVycyBhcmUKKyAqIHBhc3NlZCBpbiAiY29ybmVycyIuIFRoZSBwb2ludCBpcyBzdG9yZWQgaW4gIipwUG9pbnQiLiBUaGUgbm9ybWFsaXplZAorICogY29vcmRpbmF0ZXMgKC0xLjAsIC0xLjApIGNvcnJlc3BvbmQgdG8gY29ybmVyc1swXSwgdGhlIGNvb3JkaW5hdGVzCisgKiAoMS4wLCAxLjApIGNvcnJlc3BvbmQgdG8gY29ybmVyc1sxXS4KKyAqLworc3RhdGljIHZvaWQgUEFUSF9TY2FsZU5vcm1hbGl6ZWRQb2ludChQT0lOVDMyIGNvcm5lcnNbXSwgZG91YmxlIHgsIGRvdWJsZSB5LAorICAgUE9JTlQzMiAqcFBvaW50KQoreworICAgcFBvaW50LT54PShJTlQzMilmbG9vciggKGRvdWJsZSljb3JuZXJzWzBdLnggKworICAgICAgKGRvdWJsZSkoY29ybmVyc1sxXS54LWNvcm5lcnNbMF0ueCkqMC41Kih4KzEuMCkgKTsKKyAgIHBQb2ludC0+eT0oSU5UMzIpZmxvb3IoIChkb3VibGUpY29ybmVyc1swXS55ICsKKyAgICAgIChkb3VibGUpKGNvcm5lcnNbMV0ueS1jb3JuZXJzWzBdLnkpKjAuNSooeSsxLjApICk7Cit9CisKKy8qIFBBVEhfTm9ybWFsaXplUG9pbnQKKyAqCisgKiBOb3JtYWxpemVzIGEgcG9pbnQgd2l0aCByZXNwZWN0IHRvIHRoZSBib3ggd2hvc2UgY29ybmVycyBhcmUgcGFzc2VkIGluCisgKiAiY29ybmVycyIuIFRoZSBub3JtYWxpemVkIGNvb3JkaW5hdGVzIGFyZSBzdG9yZWQgaW4gIipwWCIgYW5kICIqcFkiLgorICovCitzdGF0aWMgdm9pZCBQQVRIX05vcm1hbGl6ZVBvaW50KFBPSU5UMzIgY29ybmVyc1tdLCBjb25zdCBQT0lOVDMyICpwUG9pbnQsCisgICBkb3VibGUgKnBYLCBkb3VibGUgKnBZKQoreworICAgKnBYPShkb3VibGUpKHBQb2ludC0+eC1jb3JuZXJzWzBdLngpLyhkb3VibGUpKGNvcm5lcnNbMV0ueC1jb3JuZXJzWzBdLngpICoKKyAgICAgIDIuMCAtIDEuMDsKKyAgICpwWT0oZG91YmxlKShwUG9pbnQtPnktY29ybmVyc1swXS55KS8oZG91YmxlKShjb3JuZXJzWzFdLnktY29ybmVyc1swXS55KSAqCisgICAgICAyLjAgLSAxLjA7Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9icnVzaC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvYnJ1c2guYwppbmRleCA3ZWRjOGI3Li4zMDVjZGU1IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9icnVzaC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2JydXNoLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAiYnJ1c2guaCIKICNpbmNsdWRlICJ3aW4xNmRydi5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTIxLDE0ICsyMiwyNiBAQAogICAgIGxCcnVzaDE2LmxiU3R5bGUgPSBicnVzaC0+bG9nYnJ1c2gubGJTdHlsZTsKICAgICBsQnJ1c2gxNi5sYkNvbG9yID0gYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3I7CiAgICAgbEJydXNoMTYubGJIYXRjaCA9IGJydXNoLT5sb2dicnVzaC5sYkhhdGNoOwotICAgIG5TaXplID0gUFJURFJWX1JlYWxpemVPYmplY3QgKHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIERSVk9CSl9CUlVTSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbEJydXNoMTYsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAKLSAgICAvKiAgbWF5IG5lZWQgdG8gcmVhbGxvYyBzZWdwdHJGT250SW5mbyovCi0gICAgcGh5c0Rldi0+c2VncHRyQnJ1c2hJbmZvID0gV0lOMTZfR2xvYmFsTG9jazE2KEdsb2JhbEFsbG9jMTYoR0hORCwgblNpemUpKTsKKworCisgICAgaWYgKCBwaHlzRGV2LT5CcnVzaEluZm8gKQorICAgIHsKKyAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJVblJlYWxpemluZyBCcnVzaEluZm9cbiIpOworICAgICAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0IChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCAtRFJWT0JKX0JSVVNILAorCQkJCSAgICAgIHBoeXNEZXYtPkJydXNoSW5mbywKKwkJCQkgICAgICBwaHlzRGV2LT5CcnVzaEluZm8sIDApOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgblNpemUgPSBQUlREUlZfUmVhbGl6ZU9iamVjdCAocGh5c0Rldi0+c2VncHRyUERFVklDRSwgRFJWT0JKX0JSVVNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsQnJ1c2gxNiwgMCwgMCk7IAorCXBoeXNEZXYtPkJydXNoSW5mbyA9IFNFR1BUUl9BTExPQyggblNpemUgKTsKKyAgICB9CisKKwogICAgIG5TaXplID0gUFJURFJWX1JlYWxpemVPYmplY3QocGh5c0Rldi0+c2VncHRyUERFVklDRSwgRFJWT0JKX0JSVVNILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxCcnVzaDE2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpcGh5c0Rldi0+c2VncHRyQnJ1c2hJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNEZXYtPkJydXNoSW5mbywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW4xNmRydl9TZWdQdHJfVGV4dFhGb3JtKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgcmV0dXJuIHByZXZIYW5kbGU7CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9mb250LmMgYi9ncmFwaGljcy93aW4xNmRydi9mb250LmMKaW5kZXggODVlZGZmNC4uYTY2OWY0YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2ZvbnQuYwpAQCAtMiwxMyArMiwxOCBAQAogICogV2luZG93cyBkcml2ZXIgZm9udCBmdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5NiBKb2huIEhhcnZleQorICogICAgICAgICAgIDE5OTggSHV3IERhdmllcwogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW4xNmRydi5oIgogI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgImZvbnQuaCIKKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjAsMjIgKzI1LDE4IEBACiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAgICAgRFdPUkQgZHdSZXQ7CiAgICAgCi0gICAgcHJpbnRmKCJMUEdESV9HZXRUZXh0RXh0UG9pbnQ6ICUwNHggJXMgJWQgJXBcbiIsIGRjLT5oU2VsZiwgc3RyLCBjb3VudCwgc2l6ZSk7Ci0KLQkvKiBUVEQgc3VwcG9ydCBQUyBmb250cyAqLwotCS8qIEFzc3VtZSBmaXhlZCBmb250ICovCi0gICAgc2l6ZS0+Y3ggPSBjb3VudCAqIHBoeXNEZXYtPnRtLnRtQXZlQ2hhcldpZHRoOwotICAgIHNpemUtPmN5ID0gcGh5c0Rldi0+dG0udG1IZWlnaHQ7Ci0KLQotICAgIHByaW50ZigiTFBHRElfR2V0VGV4dEV4dFBvaW50OiBjeD0lZCwgY3k9JWRcbiIsIHNpemUtPmN4LHNpemUtPmN5KTsKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIldJTjE2RFJWX0dldFRleHRFeHRQb2ludDogJTA0eCAlcyAlZCAlcFxuIiwKKwkJICAgICAgICAgICAgICAgIGRjLT5oU2VsZiwgc3RyLCBjb3VudCwgc2l6ZSk7CiAKICAgICBkd1JldCA9IFBSVERSVl9FeHRUZXh0T3V0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIDAsIDAsIAogCQkJICAgICAgTlVMTCwgc3RyLCAKLQkJCSAgICAgIC1jb3VudCwgIHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvLCB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIAorCQkJICAgICAgLWNvdW50LCAgcGh5c0Rldi0+Rm9udEluZm8sIAorCQkJICAgICAgd2luMTZkcnZfU2VnUHRyX0RyYXdNb2RlLCAKIAkJCSAgICAgIHdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm0sIE5VTEwsIE5VTEwsIDApOwotICAgIHByaW50ZigiTFBHRElfR2V0VGV4dEV4dFBvaW50OiBjeD0weCV4LCBjeT0weCV4IFJldCAweCVseFxuIiwgc2l6ZS0+Y3gsIHNpemUtPmN5LCBkd1JldCk7Ci0KKyAgICBzaXplLT5jeCA9IFhEU1RPTFMoZGMsTE9XT1JEKGR3UmV0KSk7CisgICAgc2l6ZS0+Y3kgPSBZRFNUT0xTKGRjLEhJV09SRChkd1JldCkpOworICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiV0lOMTZEUlZfR2V0VGV4dEV4dFBvaW50OiBjeD0weCV4LCBjeT0weCV4XG4iLAorCQlzaXplLT5jeCwgc2l6ZS0+Y3kgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNDcsMzAgKzQ4LDkwIEBACiB7CiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAKLSAgICBwcmludGYoIkxQR0RJX0dldFRleHRNZXRyaWNzOiAlMDR4IFxuIiwgZGMtPmhTZWxmKTsKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIldJTjE2RFJWX0dldFRleHRNZXRyaWNzOiAlMDR4IFxuIiwgZGMtPmhTZWxmKTsKIAotICAgIG1ldHJpY3MtPnRtSGVpZ2h0ICAgICAgICAgICA9IHBoeXNEZXYtPnRtLnRtSGVpZ2h0OwotICAgIG1ldHJpY3MtPnRtQXNjZW50ICAgICAgICAgICA9IHBoeXNEZXYtPnRtLnRtQXNjZW50OwotICAgIG1ldHJpY3MtPnRtRGVzY2VudCAgICAgICAgICA9IHBoeXNEZXYtPnRtLnRtRGVzY2VudDsKLSAgICBtZXRyaWNzLT50bUludGVybmFsTGVhZGluZyAgPSBwaHlzRGV2LT50bS50bUludGVybmFsTGVhZGluZzsKLSAgICBtZXRyaWNzLT50bUV4dGVybmFsTGVhZGluZyAgPSBwaHlzRGV2LT50bS50bUV4dGVybmFsTGVhZGluZzsKLSAgICBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aCAgICAgPSBwaHlzRGV2LT50bS50bUF2ZUNoYXJXaWR0aDsKLSAgICBtZXRyaWNzLT50bU1heENoYXJXaWR0aCAgICAgPSBwaHlzRGV2LT50bS50bU1heENoYXJXaWR0aDsKLSAgICBtZXRyaWNzLT50bVdlaWdodCAgICAgICAgICAgPSBwaHlzRGV2LT50bS50bVdlaWdodDsKLSAgICBtZXRyaWNzLT50bU92ZXJoYW5nICAgICAgICAgPSBwaHlzRGV2LT50bS50bU92ZXJoYW5nOwotICAgIG1ldHJpY3MtPnRtRGlnaXRpemVkQXNwZWN0WCA9IHBoeXNEZXYtPnRtLnRtRGlnaXRpemVkQXNwZWN0WDsKLSAgICBtZXRyaWNzLT50bURpZ2l0aXplZEFzcGVjdFkgPSBwaHlzRGV2LT50bS50bURpZ2l0aXplZEFzcGVjdFk7Ci0gICAgbWV0cmljcy0+dG1GaXJzdENoYXIgICAgICAgID0gcGh5c0Rldi0+dG0udG1GaXJzdENoYXI7Ci0gICAgbWV0cmljcy0+dG1MYXN0Q2hhciAgICAgICAgID0gcGh5c0Rldi0+dG0udG1MYXN0Q2hhcjsKLSAgICBtZXRyaWNzLT50bURlZmF1bHRDaGFyICAgICAgPSBwaHlzRGV2LT50bS50bURlZmF1bHRDaGFyOwotICAgIG1ldHJpY3MtPnRtQnJlYWtDaGFyICAgICAgICA9IHBoeXNEZXYtPnRtLnRtQnJlYWtDaGFyOwotICAgIG1ldHJpY3MtPnRtSXRhbGljICAgICAgICAgICA9IHBoeXNEZXYtPnRtLnRtSXRhbGljOwotICAgIG1ldHJpY3MtPnRtVW5kZXJsaW5lZCAgICAgICA9IHBoeXNEZXYtPnRtLnRtVW5kZXJsaW5lZDsKLSAgICBtZXRyaWNzLT50bVN0cnVja091dCAgICAgICAgPSBwaHlzRGV2LT50bS50bVN0cnVja091dDsKLSAgICBtZXRyaWNzLT50bVBpdGNoQW5kRmFtaWx5ICAgPSBwaHlzRGV2LT50bS50bVBpdGNoQW5kRmFtaWx5OwotICAgIG1ldHJpY3MtPnRtQ2hhclNldCAgICAgICAgICA9IHBoeXNEZXYtPnRtLnRtQ2hhclNldDsKKyAgICBGT05UX1RleHRNZXRyaWMxNnRvMzJBKCAmcGh5c0Rldi0+dG0sIG1ldHJpY3MgKTsKIAotICAgIHByaW50ZigiSCAlZCwgQSAlZCwgRCAlZCwgSW50ICVkLCBFeHQgJWQsIEFXICVkLCBNVyAlZCwgVyAlZFxuIiwKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwKKwkgICAiSCAlZCwgQSAlZCwgRCAlZCwgSW50ICVkLCBFeHQgJWQsIEFXICVkLCBNVyAlZCwgVyAlZFxuIiwKKyAgICAgICAgICAgbWV0cmljcy0+dG1IZWlnaHQsCisgICAgICAgICAgIG1ldHJpY3MtPnRtQXNjZW50LAorICAgICAgICAgICBtZXRyaWNzLT50bURlc2NlbnQsCisgICAgICAgICAgIG1ldHJpY3MtPnRtSW50ZXJuYWxMZWFkaW5nLAorICAgICAgICAgICBtZXRyaWNzLT50bUV4dGVybmFsTGVhZGluZywKKyAgICAgICAgICAgbWV0cmljcy0+dG1BdmVDaGFyV2lkdGgsCisgICAgICAgICAgIG1ldHJpY3MtPnRtTWF4Q2hhcldpZHRoLAorICAgICAgICAgICBtZXRyaWNzLT50bVdlaWdodCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworSEZPTlQzMiBXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEZPTlQzMiBoZm9udCwgRk9OVE9CSiAqIGZvbnQpCit7CisgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CisgICAgSFBFTjMyIHByZXZIYW5kbGUgPSBkYy0+dy5oRm9udDsKKyAgICBpbnQJblNpemU7CisKKyAgICBkYy0+dy5oRm9udCA9IGhmb250OworCisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdCAnJXMnIGg9JWRcbiIsCisJCSAgICAgZm9udC0+bG9nZm9udC5sZkZhY2VOYW1lLCBmb250LT5sb2dmb250LmxmSGVpZ2h0KTsKKworCisgICAgaWYoIHBoeXNEZXYtPkZvbnRJbmZvICkKKyAgICB7CisgICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiVW5SZWFsaXppbmcgRm9udEluZm9cbiIpOworICAgICAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0IChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCAtRFJWT0JKX0ZPTlQsCisJCQkJICAgICAgcGh5c0Rldi0+Rm9udEluZm8sCisJCQkJICAgICAgcGh5c0Rldi0+Rm9udEluZm8sIDApOworICAgIH0KKworICAgIG1lbWNweSgmcGh5c0Rldi0+bGYsICZmb250LT5sb2dmb250LCBzaXplb2YoTE9HRk9OVDE2KSk7CisgICAgblNpemUgPSBQUlREUlZfUmVhbGl6ZU9iamVjdCAocGh5c0Rldi0+c2VncHRyUERFVklDRSwgRFJWT0JKX0ZPTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNEZXYtPmxmLCAwLCAwKTsgCisKKyAgICBpZiggcGh5c0Rldi0+Rm9udEluZm8gJiYgCisJSGVhcFNpemUoIFNlZ3B0ckhlYXAsIDAsIHBoeXNEZXYtPkZvbnRJbmZvICkgPCBuU2l6ZSApCisgICAgeworICAgICAgICBTRUdQVFJfRlJFRSggcGh5c0Rldi0+Rm9udEluZm8gKTsKKwlwaHlzRGV2LT5Gb250SW5mbyA9IE5VTEw7CisgICAgfQorICAgIAorICAgIGlmKCAhcGh5c0Rldi0+Rm9udEluZm8gKQorICAgICAgICBwaHlzRGV2LT5Gb250SW5mbyA9IFNFR1BUUl9BTExPQyggblNpemUgKTsKKworCisgICAgblNpemUgPSBQUlREUlZfUmVhbGl6ZU9iamVjdChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCBEUlZPQkpfRk9OVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzRGV2LT5sZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzRGV2LT5Gb250SW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW4xNmRydl9TZWdQdHJfVGV4dFhGb3JtICk7IAorCisjZGVmaW5lIGZpIHBoeXNEZXYtPkZvbnRJbmZvICAgIAorICAgIHBoeXNEZXYtPnRtLnRtSGVpZ2h0ICAgICAgICAgICA9IFlEU1RPTFMoZGMsIGZpLT5kZlBpeEhlaWdodCk7CisgICAgcGh5c0Rldi0+dG0udG1Bc2NlbnQgICAgICAgICAgID0gWURTVE9MUyhkYywgZmktPmRmQXNjZW50KTsKKyAgICBwaHlzRGV2LT50bS50bURlc2NlbnQgICAgICAgICAgPSBwaHlzRGV2LT50bS50bUhlaWdodCAtCisJCQkJCSAgICBwaHlzRGV2LT50bS50bUFzY2VudDsgCisgICAgcGh5c0Rldi0+dG0udG1JbnRlcm5hbExlYWRpbmcgID0gWURTVE9MUyhkYywgZmktPmRmSW50ZXJuYWxMZWFkaW5nKTsKKyAgICBwaHlzRGV2LT50bS50bUV4dGVybmFsTGVhZGluZyAgPSBZRFNUT0xTKGRjLCBmaS0+ZGZFeHRlcm5hbExlYWRpbmcpOworICAgIHBoeXNEZXYtPnRtLnRtQXZlQ2hhcldpZHRoICAgICA9IFhEU1RPTFMoZGMsIGZpLT5kZkF2Z1dpZHRoKTsKKyAgICBwaHlzRGV2LT50bS50bU1heENoYXJXaWR0aCAgICAgPSBYRFNUT0xTKGRjLCBmaS0+ZGZNYXhXaWR0aCk7CisgICAgcGh5c0Rldi0+dG0udG1XZWlnaHQgICAgICAgICAgID0gZmktPmRmV2VpZ2h0OworICAgIHBoeXNEZXYtPnRtLnRtT3ZlcmhhbmcgICAgICAgICA9IDA7IC8qRklYTUUqLworICAgIHBoeXNEZXYtPnRtLnRtRGlnaXRpemVkQXNwZWN0WCA9IGZpLT5kZkhvcml6UmVzOworICAgIHBoeXNEZXYtPnRtLnRtRGlnaXRpemVkQXNwZWN0WSA9IGZpLT5kZlZlcnRSZXM7CisgICAgcGh5c0Rldi0+dG0udG1GaXJzdENoYXIgICAgICAgID0gZmktPmRmRmlyc3RDaGFyOworICAgIHBoeXNEZXYtPnRtLnRtTGFzdENoYXIgICAgICAgICA9IGZpLT5kZkxhc3RDaGFyOworICAgIHBoeXNEZXYtPnRtLnRtRGVmYXVsdENoYXIgICAgICA9IGZpLT5kZkRlZmF1bHRDaGFyOworICAgIHBoeXNEZXYtPnRtLnRtQnJlYWtDaGFyICAgICAgICA9IGZpLT5kZkJyZWFrQ2hhcjsKKyAgICBwaHlzRGV2LT50bS50bUl0YWxpYyAgICAgICAgICAgPSBmaS0+ZGZJdGFsaWM7CisgICAgcGh5c0Rldi0+dG0udG1VbmRlcmxpbmVkICAgICAgID0gZmktPmRmVW5kZXJsaW5lOworICAgIHBoeXNEZXYtPnRtLnRtU3RydWNrT3V0ICAgICAgICA9IGZpLT5kZlN0cmlrZU91dDsKKyAgICBwaHlzRGV2LT50bS50bVBpdGNoQW5kRmFtaWx5ICAgPSBmaS0+ZGZQaXRjaEFuZEZhbWlseTsKKyAgICBwaHlzRGV2LT50bS50bUNoYXJTZXQgICAgICAgICAgPSBmaS0+ZGZDaGFyU2V0OworI3VuZGVmIGZpCisKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwKKyAgICAgICAgICAgIkggJWQsIEEgJWQsIEQgJWQsIEludCAlZCwgRXh0ICVkLCBBVyAlZCwgTVcgJWQsIFcgJWRcbiIsCiAgICAgICAgICAgIHBoeXNEZXYtPnRtLnRtSGVpZ2h0LAogICAgICAgICAgICBwaHlzRGV2LT50bS50bUFzY2VudCwKICAgICAgICAgICAgcGh5c0Rldi0+dG0udG1EZXNjZW50LApAQCAtODAsMTQgKzE0MSw3IEBACiAgICAgICAgICAgIHBoeXNEZXYtPnRtLnRtTWF4Q2hhcldpZHRoLAogICAgICAgICAgICBwaHlzRGV2LT50bS50bVdlaWdodCk7CiAKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotSEZPTlQzMiBXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEZPTlQzMiBoZm9udCwgRk9OVE9CSiAqIGZvbnQpCi17Ci0gICAgLyogVFREICovCi0gICAgcHJpbnRmKCJJbiBXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdFxuIik7Ci0gICAgcmV0dXJuIEdldFN0b2NrT2JqZWN0MzIoU1lTVEVNX0ZJWEVEX0ZPTlQpOworICAgIHJldHVybiBwcmV2SGFuZGxlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk3LDEyICsxNTEsNjQgQEAKIAkJCSAgICBMUElOVDMyIGJ1ZmZlciApCiB7CiAgICAgaW50IGk7CisgICAgV09SRCB3UmV0OworCiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7Ci0gICAgLyogVFREIE5lZWQgdG8gY29wZSB3aXRoIFBTIGZvbnRzICovICAgIAotICAgIGZvciAoaSA9IGZpcnN0Q2hhcjsgaSA8PSBsYXN0Q2hhcjsgaSsrKQotICAgICAgICAgKmJ1ZmZlcisrID0gcGh5c0Rldi0+dG0udG1BdmVDaGFyV2lkdGg7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgCisgICAgZHByaW50Zl93aW4xNmRydiggc3RkZGViLCAiV0lOMTZEUlZfR2V0Q2hhcldpZHRoOiAlZCAtICVkIGludG8gJXBcbiIsCisJCSAgICAgIGZpcnN0Q2hhciwgbGFzdENoYXIsIGJ1ZmZlciApOworCisgICAgd1JldCA9IFBSVERSVl9HZXRDaGFyV2lkdGgoIHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIGJ1ZmZlciwgZmlyc3RDaGFyLCAKKwkJCQlsYXN0Q2hhciwgcGh5c0Rldi0+Rm9udEluZm8sIAorCQkJCXdpbjE2ZHJ2X1NlZ1B0cl9EcmF3TW9kZSwgCisJCQkJd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSApOworICAgIGlmKCBkZWJ1Z2dpbmdfd2luMTZkcnYgKQorICAgICAgICBmb3IoaSA9IDA7IGkgPD0gbGFzdENoYXIgLSBmaXJzdENoYXI7IGkrKykKKwkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJDaGFyICV4OiB3aWR0aCAlZFxuIiwgaSArIGZpcnN0Q2hhciwKKwkJCSAgICAgICAgICAgICAgICAgYnVmZmVyW2ldKTsKKworICAgIHJldHVybiB3UmV0OwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgICAgICAgV0lOMTZEUlZfRW51bURldmljZUZvbnRzCisgKi8KIAorQk9PTDMyCVdJTjE2RFJWX0VudW1EZXZpY2VGb250cyggREMqIGRjLCBMUExPR0ZPTlQxNiBwbGYsIAorCQkJCSAgICAgICAgREVWSUNFRk9OVEVOVU1QUk9DIHByb2MsIExQQVJBTSBscCApCit7CisgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CisgICAgV09SRCB3UmV0OworICAgIFdFUEZDIHdlcGZjID0ge3Byb2MsIGxwfTsKKworICAgIC8qIEVudW1ERm9udENhbGxiYWNrIGlzIEdESS4xNTggKi8KKyAgICBGQVJQUk9DMTYgcGZuQ2FsbGJhY2sgPSBNT0RVTEVfR2V0RW50cnlQb2ludCggR2V0TW9kdWxlSGFuZGxlMTYoIkdESSIpLAorCQkJCQkJICAgICAgICAgICAgICAxNTggKTsKKworICAgIHdSZXQgPSBQUlREUlZfRW51bURGb250cyhwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCBwbGYtPmxmRmFjZU5hbWVbMF0gPworCQkJICAgICBwbGYtPmxmRmFjZU5hbWUgOiBOVUxMICwgcGZuQ2FsbGJhY2sgLCAmd2VwZmMgKTsKKyAgICByZXR1cm4gd1JldDsKK30KKworLyoKKyAqIEVudW1DYWxsYmFjayAoR0RJLjE1OCkKKyAqIAorICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCB3aGVuIEVudW1ERm9udHMgaXMgY2FsbGVkLiAKKyAqIChUaGUgcHJpbnRlciBkcml2ZXJzIHVzZXMgaXQgdG8gcGFzcyBpbmZvIG9uIGF2YWlsYWJsZSBmb250cykuCisgKgorICogbHB2Q2xpZW50RGF0YSBpcyB0aGUgcG9pbnRlciBwYXNzZWQgdG8gRW51bURGb250cywgd2hpY2ggcG9pbnRzIHRvIGEgV0VQRkMKKyAqIHN0cnVjdHVyZSAoV0VQRkMgPSBXSU5FX0VOVU1fUFJJTlRFUl9GT05UX0NBTExCQUNLKS4KKyAqCisgKi8KKworCitXT1JEIFdJTkFQSSBXaW5lRW51bURGb250Q2FsbGJhY2soTFBMT0dGT05UMTYgbHBMb2dGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVEVYVE1FVFJJQzE2IGxwVGV4dE1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3Rm9udFR5cGUsIExPTkcgbHBDbGllbnREYXRhKSAKK3sKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkluIFdpbmVFbnVtREZvbnRDYWxsYmFjayBwbGY9JXBcbiIsIGxwTG9nRm9udCk7CisgICAgcmV0dXJuICgqKCgoV0VQRkMgKilscENsaWVudERhdGEpLT5wcm9jKSkoIGxwTG9nRm9udCwgbHBUZXh0TWV0cmljcywgCisJCQkJICAgICB3Rm9udFR5cGUsICgoV0VQRkMgKilscENsaWVudERhdGEpLT5scCApOworfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9ncmFwaGljcy5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZ3JhcGhpY3MuYwppbmRleCAyNDUyNTQyLi43Mjk0YWNiIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9ncmFwaGljcy5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2dyYXBoaWNzLmMKQEAgLTQxLDkgKzQxLDkgQEAKICAgICBwb2ludHNbMV0ueSA9IGRjLT53LkRDT3JnWSArIFlMUFRPRFAoIGRjLCB5ICk7CiAgICAgYlJldCA9IFBSVERSVl9PdXRwdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBPU19QT0xZTElORSwgMiwgcG9pbnRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzRGV2LT5zZWdwdHJQZW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNEZXYtPlBlbkluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgIHdpbjE2ZHJ2X1NlZ1B0cl9EcmF3TW9kZSwgZGMtPncuaENsaXBSZ24pOwogCiAgICAgZGMtPncuQ3Vyc1Bvc1ggPSB4OwogICAgIGRjLT53LkN1cnNQb3NZID0geTsKQEAgLTYwLDYgKzYwLDcgQEAKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKICAgICBCT09MMzIgYlJldCA9IDA7CiAgICAgUE9JTlQxNiBwb2ludHNbMl07CisKICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkluIFdJTjE2RFJWX1JlY3RhbmdsZSwgeCAlZCB5ICVkIERDT3JnWCAlZCB5ICVkXG4iLAogICAgICAgICAgICBsZWZ0LCB0b3AsIGRjLT53LkRDT3JnWCwgZGMtPncuRENPcmdZKTsKICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkluIFdJTjE2RFJWX1JlY3RhbmdsZSwgVlBvcnRPcmdYICVkIHkgJWRcbiIsCkBAIC03MCwxMCArNzEsMTAgQEAKICAgICBwb2ludHNbMV0ueCA9IFhMUFRPRFAoZGMsIHJpZ2h0KTsKICAgICBwb2ludHNbMV0ueSA9IFlMUFRPRFAoZGMsIGJvdHRvbSk7CiAgICAgYlJldCA9IFBSVERSVl9PdXRwdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBPU19SRUNUQU5HTEUsIDIsIHBvaW50cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGh5c0Rldi0+c2VncHRyUGVuSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzRGV2LT5zZWdwdHJCcnVzaEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2luMTZkcnZfU2VnUHRyX0RyYXdNb2RlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TX1JFQ1RBTkdMRSwgMiwgcG9pbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNEZXYtPlBlbkluZm8sCisJCQkgICBwaHlzRGV2LT5CcnVzaEluZm8sCisJCQkgICB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIGRjLT53LmhDbGlwUmduKTsKICAgICByZXR1cm4gYlJldDsKIH0KIApAQCAtOTAsMTcgKzkxLDkwIEBACiAgICAgQk9PTDMyIGJSZXQgPSAwOwogICAgIExQUE9JTlQxNiBwb2ludHM7CiAgICAgaW50IGk7CisKKyAgICBpZihjb3VudCA8IDIpIHJldHVybiBUUlVFOworICAgIGlmKHB0WzBdLnggIT0gcHRbY291bnQtMV0ueCB8fCBwdFswXS55ICE9IHB0W2NvdW50LTFdLnkpCisgICAgICAgIGNvdW50Kys7IC8qIEVuc3VyZSBwb2x5Z29uIGlzIGNsb3NlZCAqLworCiAgICAgcG9pbnRzID0gSEVBUF94YWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNvdW50ICogc2l6ZW9mKFBPSU5UMTYpICk7Ci0gICAgZm9yIChpID0gMDsgaTxjb3VudCA7IGkrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspCiAgICAgewotICAgICAgcG9pbnRzW2ldLnggPSAoKHB0W2ldLnggLSBkYy0+d25kT3JnWCkgKiBkYy0+dnBvcnRFeHRYLyBkYy0+d25kRXh0WCkgKyBkYy0+dnBvcnRPcmdYOwotICAgICAgcG9pbnRzW2ldLnkgPSAoKHB0W2ldLnkgLSBkYy0+d25kT3JnWSkgKiBkYy0+dnBvcnRFeHRZLyBkYy0+d25kRXh0WSkgKyBkYy0+dnBvcnRPcmdZOworICAgICAgcG9pbnRzW2ldLnggPSBYTFBUT0RQKCBkYywgcHRbaV0ueCApOworICAgICAgcG9pbnRzW2ldLnkgPSBZTFBUT0RQKCBkYywgcHRbaV0ueSApOwogICAgIH0KKyAgICBwb2ludHNbY291bnQtMV0ueCA9IHBvaW50c1swXS54OworICAgIHBvaW50c1tjb3VudC0xXS55ID0gcG9pbnRzWzBdLnk7CiAgICAgYlJldCA9IFBSVERSVl9PdXRwdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBPU19XSU5EUE9MWUdPTiwgMiwgcG9pbnRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzRGV2LT5zZWdwdHJQZW5JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNEZXYtPnNlZ3B0ckJydXNoSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgIE9TX1dJTkRQT0xZR09OLCBjb3VudCwgcG9pbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzRGV2LT5QZW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNEZXYtPkJydXNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIGRjLT53LmhDbGlwUmduKTsKICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcG9pbnRzICk7CiAgICAgcmV0dXJuIGJSZXQ7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV0lOMTZEUlZfUG9seWxpbmUKKyAqLworQk9PTDMyCitXSU4xNkRSVl9Qb2x5bGluZShEQyAqZGMsIExQUE9JTlQzMiBwdCwgSU5UMzIgY291bnQgKQoreworICAgIFdJTjE2RFJWX1BERVZJQ0UgKnBoeXNEZXYgPSAoV0lOMTZEUlZfUERFVklDRSAqKWRjLT5waHlzRGV2OworICAgIEJPT0wzMiBiUmV0ID0gMDsKKyAgICBMUFBPSU5UMTYgcG9pbnRzOworICAgIGludCBpOworCisgICAgaWYoY291bnQgPCAyKSByZXR1cm4gVFJVRTsKKworICAgIHBvaW50cyA9IEhFQVBfeGFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBjb3VudCAqIHNpemVvZihQT0lOVDE2KSApOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIHBvaW50c1tpXS54ID0gWExQVE9EUCggZGMsIHB0W2ldLnggKTsKKyAgICAgIHBvaW50c1tpXS55ID0gWUxQVE9EUCggZGMsIHB0W2ldLnkgKTsKKyAgICB9CisgICAgYlJldCA9IFBSVERSVl9PdXRwdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPU19QT0xZTElORSwgY291bnQsIHBvaW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c0Rldi0+UGVuSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpbjE2ZHJ2X1NlZ1B0cl9EcmF3TW9kZSwgZGMtPncuaENsaXBSZ24pOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwb2ludHMgKTsKKyAgICByZXR1cm4gYlJldDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJTjE2RFJWX0VsbGlwc2UKKyAqLworQk9PTDMyCitXSU4xNkRSVl9FbGxpcHNlKERDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tKQoreworICAgIFdJTjE2RFJWX1BERVZJQ0UgKnBoeXNEZXYgPSAoV0lOMTZEUlZfUERFVklDRSAqKWRjLT5waHlzRGV2OworICAgIEJPT0wzMiBiUmV0ID0gMDsKKyAgICBQT0lOVDE2IHBvaW50c1syXTsKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkluIFdJTjE2RFJWX0VsbGlwc2UsIHggJWQgeSAlZCBEQ09yZ1ggJWQgeSAlZFxuIiwKKyAgICAgICAgICAgbGVmdCwgdG9wLCBkYy0+dy5EQ09yZ1gsIGRjLT53LkRDT3JnWSk7CisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJJbiBXSU4xNkRSVl9FbGxpcHNlLCBWUG9ydE9yZ1ggJWQgeSAlZFxuIiwKKyAgICAgICAgICAgZGMtPnZwb3J0T3JnWCwgZGMtPnZwb3J0T3JnWSk7CisgICAgcG9pbnRzWzBdLnggPSBYTFBUT0RQKGRjLCBsZWZ0KTsKKyAgICBwb2ludHNbMF0ueSA9IFlMUFRPRFAoZGMsIHRvcCk7CisKKyAgICBwb2ludHNbMV0ueCA9IFhMUFRPRFAoZGMsIHJpZ2h0KTsKKyAgICBwb2ludHNbMV0ueSA9IFlMUFRPRFAoZGMsIGJvdHRvbSk7CisKKyAgICBiUmV0ID0gUFJURFJWX091dHB1dChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9TX0VMTElQU0UsIDIsIHBvaW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c0Rldi0+UGVuSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzRGV2LT5CcnVzaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgd2luMTZkcnZfU2VnUHRyX0RyYXdNb2RlLCBkYy0+dy5oQ2xpcFJnbik7CisgICAgcmV0dXJuIGJSZXQ7Cit9CisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCmluZGV4IGZhYWMyNmUuLmU4MWU1NjUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKQEAgLTIsNiArMiw3IEBACiAgKiBXaW5kb3dzIERldmljZSBDb250ZXh0IGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTk2IEpvaG4gSGFydmV5CisgKiAgICAgICAgICAgMTk5OCBIdXcgRGF2aWVzCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMTIsNyArMTMsNiBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIndpbjE2ZHJ2LmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSAiY29sb3IuaCIKICNpbmNsdWRlICJmb250LmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC01NCw4ICs1NSw4IEBACiAgICAgV0lOMTZEUlZfQ3JlYXRlREMsICAgICAgICAgICAgICAgLyogcENyZWF0ZURDICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcERlbGV0ZURDICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcERlbGV0ZU9iamVjdCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBFbGxpcHNlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEVudW1EZXZpY2VGb250cyAqLworICAgIFdJTjE2RFJWX0VsbGlwc2UsICAgICAgICAgICAgICAgIC8qIHBFbGxpcHNlICovCisgICAgV0lOMTZEUlZfRW51bURldmljZUZvbnRzLCAgICAgICAgLyogcEVudW1EZXZpY2VGb250cyAqLwogICAgIFdJTjE2RFJWX0VzY2FwZSwgICAgICAgICAgICAgICAgIC8qIHBFc2NhcGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXhjbHVkZUNsaXBSZWN0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEV4Y2x1ZGVWaXNSZWN0ICovCkBAIC03Nyw5ICs3OCw5IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFBpZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQb2x5UG9seWdvbiAqLwogICAgIFdJTjE2RFJWX1BvbHlnb24sICAgICAgICAgICAgICAgIC8qIHBQb2x5Z29uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFBvbHlsaW5lICovCisgICAgV0lOMTZEUlZfUG9seWxpbmUsICAgICAgICAgICAgICAgLyogcFBvbHlsaW5lICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFJlYWxpemVQYWxldHRlICovCi0gICAgV0lOMTZEUlZfUmVjdGFuZ2xlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUmVjdGFuZ2xlICovCisgICAgV0lOMTZEUlZfUmVjdGFuZ2xlLCAgICAgICAgICAgICAgLyogcFJlY3RhbmdsZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBSZXN0b3JlREMgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUm91bmRSZWN0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNhdmVEQyAqLwpAQCAtMTU5LDc0ICsxNjAsMTUgQEAKICAgICBscERyYXdNb2RlLT5MVGV4dENvbG9yCT0gMHgwMDAwMDAwMDsgICAgIAogfQogCi0vKgotICogRW51bUNhbGxiYWNrIChHREkuMTU4KQotICogCi0gKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIHdoZW4gRW51bURGb250cyBpcyBjYWxsZWQuIAotICogKFRoZSBwcmludGVyIGRyaXZlcnMgdXNlcyBpdCB0byBwYXNzIGluZm8gb24gYXZhaWxhYmxlIGZvbnRzKS4KLSAqCi0gKiBscHZDbGllbnREYXRhIGlzIHRoZSBwb2ludGVyIHBhc3NlZCB0byBFbnVtREZvbnRzLCB3aGljaCBwb2ludHMgdG8gYSBXRVBGQwotICogc3RydWN0dXJlIChXRVBGQyA9IFdJTkVfRU5VTV9QUklOVEVSX0ZPTlRfQ0FMTEJBQ0spLiAgVGhpcyBzdHJ1Y3R1cmUgCi0gKiBjb250YWlucyBpbmZvbWF0aW9uIG9uIGhvdyB0byBzdG9yZSB0aGUgZGF0YSBwYXNzZWQgLgotICoKLSAqIFRoZXJlIGFyZSB0d28gbW9kZXM6Ci0gKiAJMSkgSnVzdCBjb3VudCB0aGUgbnVtYmVyIG9mIGZvbnRzIGF2YWlsYWJsZS4KLSAqIAkyKSBTdG9yZSBhbGwgZm9udCBkYXRhIHBhc3NlZC4KLSAqLwotV09SRCBXSU5BUEkgV2luZUVudW1ERm9udENhbGxiYWNrKExQTE9HRk9OVDE2IGxwTG9nRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRFWFRNRVRSSUMxNiBscFRleHRNZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgd0ZvbnRUeXBlLCBMT05HIGxwdkNsaWVudERhdGEpIAotewotICAgIGludCB3UmV0ID0gMDsKLSAgICBXRVBGQyAqcFdFUEZDID0gKFdFUEZDICopbHB2Q2xpZW50RGF0YTsgCi0gICAgCi0gICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IHN0cnVjdHVyZSAqLwotICAgIGlmIChwV0VQRkMgIT0gTlVMTCApCi0gICAgewotICAgICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIm1vZGUgaXMgMHgleFxuIixwV0VQRkMtPm5Nb2RlKTsKLSAgICAgICAgCi0Jc3dpdGNoIChwV0VQRkMtPm5Nb2RlKQotCXsKLQkgICAgLyogQ291bnQgaG93IG1hbnkgZm9udHMgKi8KLQkgIGNhc2UgMToKLQkgICAgcFdFUEZDLT5uQ291bnQrKzsKLQkgICAgYnJlYWs7Ci0KLQkgICAgLyogU3RvcmUgdGhlIGZvbnRzIGluIHRoZSBwcmludGVyIGRyaXZlciBzdHJ1Y3R1cmUgKi8KLQkgIGNhc2UgMjoKLQkgIHsKLQkgICAgICBQUklOVEVSX0ZPTlRTX0lORk8gKnBQRkk7Ci0gICAgICAgICAgICAgICAgICAKLQkgICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIldpbmVFbnVtREZvbnRDYWxsYmFjazogRm91bmQgJXMgJXhcbiIsIAotCQkgICAgIGxwTG9nRm9udC0+bGZGYWNlTmFtZSwgd0ZvbnRUeXBlKTsKLQkgICAgICAKLQkgICAgICBwUEZJID0gJnBXRVBGQy0+cExQRC0+cGFQcmludGVyRm9udHNbcFdFUEZDLT5uQ291bnRdOwotCSAgICAgIG1lbWNweSgmKHBQRkktPmxmKSwgbHBMb2dGb250LCBzaXplb2YoTE9HRk9OVDE2KSk7Ci0JICAgICAgbWVtY3B5KCYocFBGSS0+dG0pLCBscFRleHRNZXRyaWNzLCBzaXplb2YoVEVYVE1FVFJJQzE2KSk7CSAgICAgIAotCSAgICAgIHBXRVBGQy0+bkNvdW50Kys7Ci0gICAgICAgICAgICAgIAotCSAgfQotCSAgICBicmVhazsKLQl9Ci0Jd1JldCA9IDE7Ci0gICAgfQotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiV2luZUVudW1ERm9udENhbGxiYWNrOiByZXR1cm5kICVkXG4iLCB3UmV0KTsKLSAgICByZXR1cm4gd1JldDsKLX0KLQogQk9PTDMyIFdJTjE2RFJWX0NyZWF0ZURDKCBEQyAqZGMsIExQQ1NUUiBkcml2ZXIsIExQQ1NUUiBkZXZpY2UsIExQQ1NUUiBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERFVk1PREUxNiogaW5pdERhdGEgKQogewogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRDsKICAgICBXT1JEIHdSZXQ7CiAgICAgRGV2aWNlQ2FwcyAqcHJpbnRlckRldkNhcHM7Ci0gICAgRkFSUFJPQzE2IHBmbkNhbGxiYWNrOwogICAgIGludCBuUERFVklDRXNpemU7CiAgICAgUERFVklDRV9IRUFERVIgKnBQREg7CiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldjsKLSAgICBpbnQgbnVtRm9udHM7Ci0gICAgLyogUmVhbGl6aW5nIGZvbnRzICovCi0gICAgaW50IG5TaXplOwogICAgIGNoYXIgcHJpbnRlckVuYWJsZWRbMjBdOwogICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggIndpbmUiLCAicHJpbnRlciIsICJvZmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGVyRW5hYmxlZCwgc2l6ZW9mKHByaW50ZXJFbmFibGVkKSApOwpAQCAtMjkwLDkzICsyMzIsMTQgQEAKICAgICAvKiBOb3cgZ2V0IHRoZSBwcmludGVyIGRyaXZlciB0byBpbml0aWFsaXNlIHRoaXMgZGF0YSAqLwogICAgIHdSZXQgPSBQUlREUlZfRW5hYmxlKChMUFZPSUQpcGh5c0Rldi0+c2VncHRyUERFVklDRSwgSU5JVFBERVZJQ0UsIGRldmljZSwgZHJpdmVyLCBvdXRwdXQsIE5VTEwpOyAKIAotICAgIC8qIE5vdyBlbnVtZXJhdGUgdGhlIGZvbnRzIHN1cHBvcnRlZCBieSB0aGUgcHJpbnRlciBkcml2ZXIqLwotICAgIC8qIEdESS4xNTggaXMgRW51bUNhbGxiYWNrLCB3aGljaCBpcyBjYWxsZWQgYnkgdGhlIDE2Yml0IHByaW50ZXIgZHJpdmVyICovCi0gICAgLyogcGFzc2luZyBpbmZvcm1hdGlvbiBvbiB0aGUgYXZhaWxhYmxlIGZvbnRzICovCi0gICAgaWYgKHBMUEQtPnBhUHJpbnRlckZvbnRzID09IE5VTEwpCi0gICAgewotCXBmbkNhbGxiYWNrID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIEdldE1vZHVsZUhhbmRsZTE2KCJHREkiKSwgMTU4ICk7Ci0gICAgICAgIAotCWlmIChwZm5DYWxsYmFjayAhPSBOVUxMKQotCXsKLQkgICAgV0VQRkMgd2VwZmM7Ci0JICAgIAotCSAgICB3ZXBmYy5uTW9kZSA9IDE7Ci0JICAgIHdlcGZjLm5Db3VudCA9IDA7Ci0JICAgIHdlcGZjLnBMUEQgPSBwTFBEOwotCSAgICAKLQkgICAgLyogRmlyc3QgY291bnQgdGhlIG51bWJlciBvZiBmb250cyAqLwotICAgICAgICAgICAgCi0JICAgIFBSVERSVl9FbnVtREZvbnRzKHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIE5VTEwsIHBmbkNhbGxiYWNrLCAKLQkJCSAgICAgICh2b2lkICopJndlcGZjKTsKLQkgICAgCi0JICAgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRvIHN0b3JlIGFsbCBvZiB0aGUgZm9udHMgKi8KLQkgICAgcExQRC0+blByaW50ZXJGb250cyA9IHdlcGZjLm5Db3VudDsKLSAgICAgICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiR290ICVkIGZvbnRzXG4iLHdlcGZjLm5Db3VudCk7Ci0gICAgICAgICAgICAKLQkgICAgaWYgKHdlcGZjLm5Db3VudCA+IDApCi0JICAgIHsKLQotCQlwTFBELT5wYVByaW50ZXJGb250cyA9IG1hbGxvYyhzaXplb2YoUFJJTlRFUl9GT05UU19JTkZPKSAqIHdlcGZjLm5Db3VudCk7Ci0JCQotCQkvKiBOb3cgZ2V0IGFsbCBvZiB0aGUgZm9udHMgKi8KLQkJd2VwZmMubk1vZGUgPSAyOwotCQl3ZXBmYy5uQ291bnQgPSAwOwotCQlQUlREUlZfRW51bURGb250cyhwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCBOVUxMLCBwZm5DYWxsYmFjaywgCi0JCQkJICAodm9pZCAqKSZ3ZXBmYyk7Ci0gICAgICAgICAgICAgICAgbnVtRm9udHMgPSB3ZXBmYy5uQ291bnQ7Ci0JICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiB0aGUgbnVtYmVyIG9mIGZvbnRzIHJldHVybmVkIGFyZSB6ZXJvIHdlIGNhbiBub3QgY29udGludWUgKi8KLSAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJObyBmb250cz8gQWJvcnRpbmcgQ3JlYXRlREMuLi5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCQkKLSAgICAvKiBTZWxlY3QgdGhlIGZpcnN0IGZvbnQgaW50byB0aGUgREMgKi8KLSAgICAvKiBTZXQgdXAgdGhlIGxvZ2ZvbnQgKi8KLSAgICBtZW1jcHkoJnBoeXNEZXYtPmxmLCAKLQkgICAmcExQRC0+cGFQcmludGVyRm9udHNbMF0ubGYsIAotCSAgIHNpemVvZihMT0dGT05UMTYpKTsKLQotICAgIC8qIFNldCB1cCB0aGUgdGV4dG1ldHJpY3MgKi8KLSAgICBtZW1jcHkoJnBoeXNEZXYtPnRtLCAKLQkgICAmcExQRC0+cGFQcmludGVyRm9udHNbMF0udG0sIAotCSAgIHNpemVvZihURVhUTUVUUklDMTYpKTsKLQorICAgIHBoeXNEZXYtPkZvbnRJbmZvID0gTlVMTDsKKyAgICBwaHlzRGV2LT5CcnVzaEluZm8gPSBOVUxMOworICAgIHBoeXNEZXYtPlBlbkluZm8gPSBOVUxMOwogICAgIHdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm0gPSBXSU4xNl9HbG9iYWxMb2NrMTYoR2xvYmFsQWxsb2MxNihHSE5ELCBzaXplb2YoVEVYVFhGT1JNMTYpKSk7CiAgICAgd2luMTZkcnZfVGV4dFhGb3JtUCA9IFBUUl9TRUdfVE9fTElOKHdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm0pOwogICAgIAogICAgIEluaXRUZXh0WEZvcm0od2luMTZkcnZfVGV4dFhGb3JtUCk7Ci0jaWZkZWYgU1VQUE9SVF9SRUFMSVpFRF9GT05UUwotICAgIC8qIFRURCBzaG91bGQgY2FsY3VsYXRlIHRoaXMgKi8KLSAgICAKLSAgICAvKiBGaXJzdCBnZXQgdGhlIHNpemUgb2YgdGhlIHJlYWxpemVkIGZvbnQgKi8KLSAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIERSVk9CSl9GT05ULAotCQkJCSAmcExQRC0+cGFQcmludGVyRm9udHNbMF0sIE5VTEwsIAotCQkJCSAwKTsKLSAgICAKLSAgICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbyA9IFdJTjE2X0dsb2JhbExvY2sxNihHbG9iYWxBbGxvYzE2KEdITkQsIG5TaXplKSk7Ci0gICAgLyogUmVhbGl6ZSB0aGUgZm9udCAqLwotICAgIFBSVERSVl9SZWFsaXplT2JqZWN0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIERSVk9CSl9GT05ULAotCQkJICZwTFBELT5wYVByaW50ZXJGb250c1swXSwgCi0JCQkgKExQVk9JRClwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgCi0JCQkgd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSk7Ci0gICAgLyogUXVpY2sgbG9vayBhdCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAocGh5c0Rldi0+c2VncHRyRm9udEluZm8pCi0gICAgeyAgCi0JRk9OVElORk8xNiAqcCA9IChGT05USU5GTzE2ICopUFRSX1NFR19UT19MSU4ocGh5c0Rldi0+c2VncHRyRm9udEluZm8pOwogCi0JZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJUOiVkIFZSOiVkIEhSOiVkLCBGOiVkIEw6JWRcbiIsCi0JICAgICAgIHAtPmRmVHlwZSwKLQkgICAgICAgcC0+ZGZWZXJ0UmVzLCBwLT5kZkhvcml6UmVzLAotCSAgICAgICBwLT5kZkZpcnN0Q0hBUiwgcC0+ZGZMYXN0Q0hBUgotCSAgICAgICApOwotICAgIH0KLQotI2VuZGlmCiAgICAgLyogVFREIExvdHMgbW9yZSB0byBkbyBoZXJlICovCiAgICAgd2luMTZkcnZfU2VnUHRyX0RyYXdNb2RlID0gV0lOMTZfR2xvYmFsTG9jazE2KEdsb2JhbEFsbG9jMTYoR0hORCwgc2l6ZW9mKERSQVdNT0RFKSkpOwogICAgIHdpbjE2ZHJ2X0RyYXdNb2RlUCA9IFBUUl9TRUdfVE9fTElOKHdpbjE2ZHJ2X1NlZ1B0cl9EcmF3TW9kZSk7CkBAIC0zOTMsOCArMjU2LDggQEAKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKICAgICBCT09MMzIgYlJldCA9IDA7CiAKLSAgICBiUmV0ID0gUFJURFJWX1N0cmV0Y2hCbHQoIHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgTlVMTCwgMCwgMCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgUEFUQ09QWSwgcGh5c0Rldi0+c2VncHRyQnJ1c2hJbmZvLCB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIE5VTEwpOworICAgIGJSZXQgPSBQUlREUlZfU3RyZXRjaEJsdCggcGh5c0Rldi0+c2VncHRyUERFVklDRSwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LCAoU0VHUFRSKU5VTEwsIDAsIDAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIFBBVENPUFksIHBoeXNEZXYtPkJydXNoSW5mbywgd2luMTZkcnZfU2VnUHRyX0RyYXdNb2RlLCBOVUxMKTsKIAogICAgIHJldHVybiBiUmV0OwogfQpAQCAtNDE3LDYgKzI4MCwxMCBAQAogCSAgICBmcHJpbnRmKHN0ZGVyciwiRXNjYXBlOiBFTkFCTEVQQUlSS0VSTklORyBpZ25vcmVkLlxuIik7CiAgICAgICAgICAgICBuUmV0ID0gMTsKIAkgICAgYnJlYWs7CisJICBjYXNlIEdFVFBBSVJLRVJOVEFCTEU6CisJICAgIGZwcmludGYoc3RkZXJyLCJFc2NhcGU6IEdFVFBBSVJLRVJOVEFCTEUgaWdub3JlZC5cbiIpOworICAgICAgICAgICAgblJldCA9IDA7CisJICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgU0VUQUJPUlRQUk9DOgogCSAgICBwcmludGYoIkVzY2FwZTogU2V0QWJvcnRQcm9jIGlnbm9yZWQgc2hvdWxkIGJlIHN0b3JlZCBpbiBkYyBzb21ld2hlcmVcbiIpOwogICAgICAgICAgICAgLyogTWFrZSBjYWxsaW5nIGFwcGxpY2F0aW9uIGJlbGlldmUgdGhpcyB3b3JrZWQgKi8KQEAgLTQzOSw3ICszMDYsNyBAQAogCiAgICAgICAgICAgICAgIHRleHREYXRhLT5uU2l6ZSA9IGNiSW5wdXQ7CiAgICAgICAgICAgICAgIHRleHREYXRhLT5scGluZGF0YSA9IGxwSW5EYXRhOwotICAgICAgICAgICAgICB0ZXh0RGF0YS0+bHBGb250ID0gcGh5c0Rldi0+c2VncHRyRm9udEluZm87CisgICAgICAgICAgICAgIHRleHREYXRhLT5scEZvbnQgPSBTRUdQVFJfR0VUKCBwaHlzRGV2LT5Gb250SW5mbyApOwogICAgICAgICAgICAgICB0ZXh0RGF0YS0+bHBYRm9ybSA9IHdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm07CiAgICAgICAgICAgICAgIHRleHREYXRhLT5scERyYXdNb2RlID0gd2luMTZkcnZfU2VnUHRyX0RyYXdNb2RlOwogICAgICAgICAgICAgICBuUmV0ID0gUFJURFJWX0NvbnRyb2wocGh5c0Rldi0+c2VncHRyUERFVklDRSwgbkVzY2FwZSwKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3Blbi5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcGVuLmMKaW5kZXggYTI2ZWE5OS4uYzJlNTQ1NCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvcGVuLmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcGVuLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAicGVuLmgiCiAjaW5jbHVkZSAiY29sb3IuaCIKICNpbmNsdWRlICJ3aW4xNmRydi5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTIwLDIxICsyMSwzMCBAQAogICAgIGludAkJIG5TaXplOwogICAgIExPR1BFTjE2IAkgbFBlbjE2OwogICAgIGRjLT53LmhQZW4gPSBocGVuOwotICAgIHByaW50ZigiSW4gV0lOMTZEUlZfUEVOX1NlbGVjdE9iamVjdFxuIik7CisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJJbiBXSU4xNkRSVl9QRU5fU2VsZWN0T2JqZWN0XG4iKTsKICAgICBsUGVuMTYubG9wblN0eWxlICAgPSBwZW4tPmxvZ3Blbi5sb3BuU3R5bGU7CiAgICAgbFBlbjE2LmxvcG5XaWR0aC54ID0gcGVuLT5sb2dwZW4ubG9wbldpZHRoLng7CiAgICAgbFBlbjE2LmxvcG5XaWR0aC55ID0gcGVuLT5sb2dwZW4ubG9wbldpZHRoLnk7CiAgICAgbFBlbjE2LmxvcG5Db2xvciAgID0gcGVuLT5sb2dwZW4ubG9wbkNvbG9yOwotICAgIG5TaXplID0gUFJURFJWX1JlYWxpemVPYmplY3QgKHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIERSVk9CSl9QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxQZW4xNiwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IAotICAgIC8qICBtYXkgbmVlZCB0byByZWFsbG9jIHNlZ3B0ckZPbnRJbmZvKi8KLSAgICBwaHlzRGV2LT5zZWdwdHJQZW5JbmZvID0gV0lOMTZfR2xvYmFsTG9jazE2KEdsb2JhbEFsbG9jMTYoR0hORCwgblNpemUpKTsKKworICAgIGlmICggcGh5c0Rldi0+UGVuSW5mbyApCisgICAgeworICAgICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlVuUmVhbGl6aW5nIFBlbkluZm9cbiIpOworICAgICAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0IChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCAtRFJWT0JKX1BFTiwKKwkJCQkgICAgICBwaHlzRGV2LT5QZW5JbmZvLAorCQkJCSAgICAgIHBoeXNEZXYtPlBlbkluZm8sIDApOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgblNpemUgPSBQUlREUlZfUmVhbGl6ZU9iamVjdCAocGh5c0Rldi0+c2VncHRyUERFVklDRSwgRFJWT0JKX1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbFBlbjE2LCAwLCAwKTsgCisJcGh5c0Rldi0+UGVuSW5mbyA9IFNFR1BUUl9BTExPQyggblNpemUgKTsKKyAgICB9CisKICAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIERSVk9CSl9QRU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbFBlbjE2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpcGh5c0Rldi0+c2VncHRyUGVuSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzRGV2LT5QZW5JbmZvLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAgIHJldHVybiBwcmV2SGFuZGxlOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMgYi9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYwppbmRleCA4ZDdmNTUwLi5mYWMxNzU3IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgInBlbi5oIgogCiAjZGVmaW5lIE1BWF9QUklOVEVSX0RSSVZFUlMgCTE2CiBzdGF0aWMgTE9BREVEX1BSSU5URVJfRFJJVkVSICpnYXBMb2FkZWRQcmludGVyRHJpdmVyc1tNQVhfUFJJTlRFUl9EUklWRVJTXTsKQEAgLTI0NCwxMSArMjQ2LDExIEBACiAJbFA1ID0gKExPTkcpbHBEYXRhOwogICAgICAgICAKIAl3UmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJ2RW5hYmxlUHJvYyhwTFBELT5mbltGVU5DX0VOQUJMRV0sIAotCQkJCSAgICh3U3R5bGU9PUlOSVRQREVWSUNFKT9sUDE6U0VHUFRSX0dFVChsUDEpLAotCQkJCSAgIHdQMiwKLQkJCQkgICBTRUdQVFJfR0VUKGxQMyksCi0JCQkJICAgU0VHUFRSX0dFVChsUDQpLAotCQkJCSAgIGxQNSk7CisJCQkgICAgICh3U3R5bGU9PUlOSVRQREVWSUNFKT8oU0VHUFRSKWxQMTpTRUdQVFJfR0VUKGxQMSksCisJCQkgICAgIHdQMiwKKwkJCSAgICAgU0VHUFRSX0dFVChsUDMpLAorCQkJICAgICBTRUdQVFJfR0VUKGxQNCksCisJCQkgICAgIGxQNSk7CiAJU0VHUFRSX0ZSRUUobFAzKTsKIAlTRUdQVFJfRlJFRShsUDQpOwogCkBAIC0yNzIsNyArMjc0LDggQEAKICAgICBXT1JEIHdSZXQgPSAwOwogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CiAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbnVtREZvbnRzOlxuIik7CisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czogJTA4bHggJXMgJXAgJXBcbiIsCisJCSAgICAgbHBEZXN0RGV2LCBscEZhY2VOYW1lLCBscENhbGxiYWNrRnVuYywgbHBDbGllbnREYXRhKTsKIAogICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKICAgICB7CkBAIC0yODUsMTIgKzI4OCwxNSBAQAogCX0KIAogCWxQMSA9IChTRUdQVFIpbHBEZXN0RGV2OwotCWxQMiA9IFNFR1BUUl9TVFJEVVAobHBGYWNlTmFtZSk7CisJaWYobHBGYWNlTmFtZSkKKwkgICAgbFAyID0gU0VHUFRSX1NUUkRVUChscEZhY2VOYW1lKTsKKwllbHNlCisJICAgIGxQMiA9IE5VTEw7CiAJbFA0ID0gKExPTkcpbHBDbGllbnREYXRhOwogICAgICAgICB3UmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJ2RW51bURGb250c1Byb2MoIHBMUEQtPmZuW0ZVTkNfRU5VTURGT05UU10sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgU0VHUFRSX0dFVChsUDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2FsbGJhY2tGdW5jLCBsUDQpOwotCVNFR1BUUl9GUkVFKGxQMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgU0VHUFRSX0dFVChsUDIpLCBscENhbGxiYWNrRnVuYywgbFA0KTsKKwlpZihscEZhY2VOYW1lKQorCSAgICBTRUdQVFJfRlJFRShsUDIpOwogICAgIH0gZWxzZSAKICAgICAgICAgZnByaW50ZihzdGRlcnIsIkZhaWxlZCB0byBmaW5kIGRldmljZVxuIik7CiAgICAgCkBAIC0zMDYsNyArMzEyLDcgQEAKICAgICBXT1JEIHdSZXQgPSAwOwogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CiAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbnVtREZvbnRzOlxuIik7CisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bU9iajpcbiIpOwogCiAgICAgaWYgKChwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tUERFVklDRShscERlc3REZXYpKSAhPSBOVUxMKQogICAgIHsKQEAgLTMxNCw5ICszMjAsOSBAQAogICAgICAgICBGQVJQUk9DMTYgbFAzOwogCVdPUkQgd1AyOwogCi0JaWYgKHBMUEQtPmZuW0ZVTkNfRU5VTURGT05UU10gPT0gTlVMTCkKKwlpZiAocExQRC0+Zm5bRlVOQ19FTlVNT0JKXSA9PSBOVUxMKQogCXsKLQkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbnVtT2JqOiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtMzM3LDcgKzM0Myw3IEBACiAgICAgZWxzZSAKICAgICAgICAgZnByaW50ZihzdGRlcnIsIkZhaWxlZCB0byBmaW5kIGRldmljZVxuIik7CiAgICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czogcmV0dXJuICV4XG4iLCB3UmV0KTsKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbnVtT2JqOiByZXR1cm4gJXhcbiIsIHdSZXQpOwogICAgIHJldHVybiB3UmV0OwogfQogCkBAIC0zNDcsMTYgKzM1MywxNiBAQAogV09SRCBQUlREUlZfT3V0cHV0KExQUERFVklDRSAJIGxwRGVzdERldiwKICAgICAgICAgICAgICAgICAgICBXT1JEIAkgd1N0eWxlLCAKICAgICAgICAgICAgICAgICAgICBXT1JEIAkgd0NvdW50LAotICAgICAgICAgICAgICAgICAgIFBPSU5UMTYgICAgICoqcG9pbnRzLCAKLSAgICAgICAgICAgICAgICAgICBTRUdQVFIgCSBscFBQZW4sCi0gICAgICAgICAgICAgICAgICAgU0VHUFRSCSBscFBCcnVzaCwKKyAgICAgICAgICAgICAgICAgICBQT0lOVDE2ICAgICAgKnBvaW50cywgCisgICAgICAgICAgICAgICAgICAgTFBMT0dQRU4xNiAJIGxwUGVuLAorICAgICAgICAgICAgICAgICAgIExQTE9HQlJVU0gxNgkgbHBCcnVzaCwKICAgICAgICAgICAgICAgICAgICBTRUdQVFIJIGxwRHJhd01vZGUsCi0gICAgICAgICAgICAgICAgICAgUkVDVDE2IAkqbHBDbGlwUmVjdCkKKyAgICAgICAgICAgICAgICAgICBIUkdOMzIgCSBoQ2xpcFJnbikKIHsKICAgICBXT1JEIHdSZXQgPSAwOwogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CiAgICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfT1VUUFVUXG4iKTsKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9PVVRQVVQgJWRcbiIsIHdTdHlsZSApOwogICAgIAogICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKICAgICB7CkBAIC0zNzcsMjQgKzM4Myw1OCBAQAogICAgICAgICBuU2l6ZSA9IHNpemVvZihQT0lOVDE2KSAqIHdDb3VudDsKICAJbFA0ID0gKExQUE9JTlQxNiApU0VHUFRSX0FMTE9DKG5TaXplKTsKICAJbWVtY3B5KGxQNCxwb2ludHMsblNpemUpOwotICAgICAgICBsUDUgPSBscFBQZW47Ci0gICAgICAgIGxQNiA9IGxwUEJydXNoOworICAgICAgICBsUDUgPSBTRUdQVFJfR0VUKCBscFBlbiApOworICAgICAgICBsUDYgPSBTRUdQVFJfR0VUKCBscEJydXNoICk7CiAgICAgICAgIGxQNyA9IGxwRHJhd01vZGU7CiAgICAgICAgIAotCWlmIChscENsaXBSZWN0ICE9IE5VTEwpCisJaWYgKGhDbGlwUmduKQogCXsKLQkgICAgbFA4ID0gU0VHUFRSX05FVyhSRUNUMTYpOwotCSAgICBtZW1jcHkobFA4LGxwQ2xpcFJlY3Qsc2l6ZW9mKFJFQ1QxNikpOworCSAgICBEV09SRCBzaXplOworCSAgICBSR05EQVRBICpjbGlwOwogCi0JfQotCWVsc2UKLQkgIGxQOCA9IDBMOwotCXdSZXQgPSBDYWxsYmFja3MtPkNhbGxEcnZPdXRwdXRQcm9jKHBMUEQtPmZuW0ZVTkNfT1VUUFVUXSwgCisJICAgIHNpemUgPSBHZXRSZWdpb25EYXRhKCBoQ2xpcFJnbiwgMCwgTlVMTCApOworCSAgICBjbGlwID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplICk7CisJICAgIGlmKCFjbGlwKSAKKwkgICAgeworCSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBhbGxvYyBjbGlwIGFycmF5IGluIFBSVERSVl9PdXRwdXRcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJICAgIH0KKwkgICAgR2V0UmVnaW9uRGF0YSggaENsaXBSZ24sIHNpemUsIGNsaXAgKTsKKwkgICAgaWYoIGNsaXAtPnJkaC5uQ291bnQgPT0gMCApCisJICAgIHsKKwkJd1JldCA9IENhbGxiYWNrcy0+Q2FsbERydk91dHB1dFByb2MocExQRC0+Zm5bRlVOQ19PVVRQVVRdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFAxLCB3UDIsIHdQMywgU0VHUFRSX0dFVChsUDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDUsIGxQNiwgbFA3LCAoU0VHUFRSKSBOVUxMKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIFJFQ1QzMiAqcFJlY3Q7CisJICAgICAgICBsUDggPSBTRUdQVFJfTkVXKFJFQ1QxNik7CisJICAgIAorCQlmb3IocFJlY3QgPSAoUkVDVDMyICopY2xpcC0+QnVmZmVyOyAKKwkJICAgIHBSZWN0IDwgKFJFQ1QzMiAqKWNsaXAtPkJ1ZmZlciArIGNsaXAtPnJkaC5uQ291bnQ7IHBSZWN0KyspCisJICAgICAgICB7CisJCSAgICBDT05WX1JFQ1QzMlRPMTYoIHBSZWN0LCBsUDggKTsKKworCQkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJyZWN0ID0gJWQsJWQgLSAlZCwlZFxuIiwKKwkJCSAgICBsUDgtPmxlZnQsIGxQOC0+dG9wLCBsUDgtPnJpZ2h0LCBsUDgtPmJvdHRvbSApOworCQkgICAgd1JldCA9IENhbGxiYWNrcy0+Q2FsbERydk91dHB1dFByb2MocExQRC0+Zm5bRlVOQ19PVVRQVVRdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFAxLCB3UDIsIHdQMywgU0VHUFRSX0dFVChsUDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDUsIGxQNiwgbFA3LCBTRUdQVFJfR0VUKGxQOCkpOworCQl9CisJCVNFR1BUUl9GUkVFKGxQOCk7CisJICAgIH0KKwkgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGNsaXAgKTsKKwl9CisJZWxzZQorCXsKKwkgICAgd1JldCA9IENhbGxiYWNrcy0+Q2FsbERydk91dHB1dFByb2MocExQRC0+Zm5bRlVOQ19PVVRQVVRdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFAxLCB3UDIsIHdQMywgU0VHUFRSX0dFVChsUDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDUsIGxQNiwgbFA3LCAoU0VHUFRSKSBOVUxMKTsKKwl9CiAgICAgICAgIFNFR1BUUl9GUkVFKGxQNCk7Ci0gICAgICAgIFNFR1BUUl9GUkVFKGxQOCk7CiAgICAgfQorICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX091dHB1dCByZXR1cm4gJWRcbiIsIHdSZXQpOwogICAgIHJldHVybiB3UmV0OwogfQogCkBAIC00MDgsMjUgKzQ0OCwyOCBAQAogICAgIFdPUkQgZHdSZXQgPSAwOwogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CiAgICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfUmVhbGl6ZU9iamVjdDpcbiIpOworICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLAorCQkgICAgICJQUlREUlZfUmVhbGl6ZU9iamVjdDogJTA4bHggJTA0eCAlcCAlcCAlMDhseFxuIiwKKwkJICAgICBscERlc3REZXYsIHdTdHlsZSwgbHBJbk9iaiwgbHBPdXRPYmosIGxwVGV4dFhGb3JtKTsKICAgICAKICAgICBpZiAoKHBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKGxwRGVzdERldikpICE9IE5VTEwpCiAgICAgewotCUxPTkcJbFAxLCBsUDQsIGxQNTsgIAotCUxQQllURQlsUDM7Ci0JV09SRAl3UDI7CisgICAgICAgIExPTkcgbFAxLCBsUDMsIGxQNCwgbFA1OyAgCisJV09SRCB3UDI7CisJTFBCWVRFIGxwQnVmID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQJblNpemU7CiAKIAlpZiAocExQRC0+Zm5bRlVOQ19SRUFMSVpFT0JKRUNUXSA9PSBOVUxMKQogCXsKLQkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfUmVhbGl6ZU9iamVjdDogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwKKwkJCSAgICAiUFJURFJWX1JlYWxpemVPYmplY3Q6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKIAkgICAgcmV0dXJuIDA7CiAJfQogCiAJbFAxID0gbHBEZXN0RGV2OwogCXdQMiA9IHdTdHlsZTsKIAkKLQlzd2l0Y2ggKHdTdHlsZSkKKwlzd2l0Y2ggKChJTlQxNil3U3R5bGUpCiAJewogICAgICAgICBjYXNlIERSVk9CSl9CUlVTSDoKICAgICAgICAgICAgIG5TaXplID0gc2l6ZW9mIChMT0dCUlVTSDE2KTsKQEAgLTQzNywyMyArNDgwLDQwIEBACiAgICAgICAgIGNhc2UgRFJWT0JKX1BFTjoKICAgICAgICAgICAgIG5TaXplID0gc2l6ZW9mKExPR1BFTjE2KTsgCiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIC1EUlZPQkpfQlJVU0g6CisgICAgICAgIGNhc2UgLURSVk9CSl9GT05UOiAKKyAgICAgICAgY2FzZSAtRFJWT0JKX1BFTjoKKwkgICAgblNpemUgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgRFJWT0JKX1BCSVRNQVA6CiAgICAgICAgIGRlZmF1bHQ6Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiUFJURFJWX1JlYWxpemVPYmplY3Q6IE9iamVjdCB0eXBlICVkIG5vdCBzdXBwb3J0ZWRcbiIsIHdTdHlsZSk7CisJICAgIGZwcmludGYoc3RkZXJyLCAKKwkgICAgICAgIlBSVERSVl9SZWFsaXplT2JqZWN0OiBPYmplY3QgdHlwZSAlZCBub3Qgc3VwcG9ydGVkXG4iLCB3U3R5bGUpOwogICAgICAgICAgICAgblNpemUgPSAwOwogICAgICAgICAgICAgCiAJfQotIAlsUDMgPSBTRUdQVFJfQUxMT0MoblNpemUpOwotIAltZW1jcHkobFAzLGxwSW5PYmosblNpemUpOwotCQotCWxQNCA9IChMT05HKWxwT3V0T2JqOworCisJaWYoblNpemUgIT0gLTEpCisJeworCSAgICBscEJ1ZiA9IFNFR1BUUl9BTExPQyhuU2l6ZSk7CisJICAgIG1lbWNweShscEJ1ZiwgbHBJbk9iaiwgblNpemUpOworCSAgICBsUDMgPSBTRUdQVFJfR0VUKGxwQnVmKTsKKwl9IAorCWVsc2UKKwkgICAgbFAzID0gU0VHUFRSX0dFVCggbHBJbk9iaiApOworCisJbFA0ID0gU0VHUFRSX0dFVCggbHBPdXRPYmogKTsKIAogICAgICAgICBsUDUgPSBscFRleHRYRm9ybTsKLQorCWRwcmludGZfd2luMTZkcnYoc3RkZGViLAorCQkJICJDYWxsaW5nIFJlYWxpemUgJTA4bHggJTA0eCAlMDhseCAlMDhseCAlMDhseFxuIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCBsUDMsIGxQNCwgbFA1KTsKIAlkd1JldCA9IENhbGxiYWNrcy0+Q2FsbERydlJlYWxpemVQcm9jKHBMUEQtPmZuW0ZVTkNfUkVBTElaRU9CSkVDVF0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCBTRUdQVFJfR0VUKGxQMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFA0LCBsUDUpOwotICAgICAgICBTRUdQVFJfRlJFRShsUDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCBsUDMsIGxQNCwgbFA1KTsKKwlpZihscEJ1ZikKKwkgICAgU0VHUFRSX0ZSRUUobHBCdWYpOwogCiAgICAgfQogICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX1JlYWxpemVPYmplY3Q6IHJldHVybiAleFxuIiwgZHdSZXQpOwpAQCAtNDcwLDcgKzUzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHdTcmNYLCBXT1JEIHdTcmNZLAogICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3U3JjWGV4dCwgV09SRCB3U3JjWWV4dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBSb3AzLAotICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSIGxwUEJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgTFBMT0dCUlVTSDE2IGxwQnJ1c2gsCiAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgbHBEcmF3TW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QxNiAqbHBDbGlwUmVjdCkKIHsKQEAgLTUwMSw3ICs1NjEsNyBAQAogICAgICAgICB3UDkgID0gd1NyY1hleHQ7CiAgICAgICAgIHdQMTAgPSB3U3JjWWV4dDsKICAgICAgICAgbFAxMSA9IFJvcDM7Ci0gICAgICAgIGxQMTIgPSBscFBCcnVzaDsKKyAgICAgICAgbFAxMiA9IFNFR1BUUl9HRVQoIGxwQnJ1c2ggKTsKICAgICAgICAgbFAxMyA9IGxwRHJhd01vZGU7CiAJaWYgKGxwQ2xpcFJlY3QgIT0gTlVMTCkKIAl7CkBAIC01MjQsNyArNTg0LDcgQEAKIAogRFdPUkQgUFJURFJWX0V4dFRleHRPdXQoTFBQREVWSUNFIGxwRGVzdERldiwgV09SRCB3RGVzdFhPcmcsIFdPUkQgd0Rlc3RZT3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDE2ICpscENsaXBSZWN0LCBMUENTVFIgbHBTdHJpbmcsIFdPUkQgd0NvdW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBscEZvbnRJbmZvLCBTRUdQVFIgbHBEcmF3TW9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICBMUEZPTlRJTkZPMTYgbHBGb250SW5mbywgU0VHUFRSIGxwRHJhd01vZGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSIGxwVGV4dFhGb3JtLCBTSE9SVCAqbHBDaGFyV2lkdGhzLAogICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDE2ICogICAgIGxwT3BhcXVlUmVjdCwgV09SRCB3T3B0aW9ucykKIHsKQEAgLTU2MCwyMCArNjIwLDIwIEBACiAJICBsUDQgPSAwTDsKIAogCWlmIChscFN0cmluZyAhPSBOVUxMKSB7Ci0JICAgIC8qIFRURCBXQVJOSU5HIFRISVMgU1RSSU5HIElTTlQgTlVMTCBURVJNSU5BVEVEICovCiAJICAgIG5TaXplID0gc3RybGVuKGxwU3RyaW5nKTsKIAkgICAgaWYgKG5TaXplPmFicyh3Q291bnQpKQogCSAgICAJblNpemUgPSBhYnMod0NvdW50KTsKLQkgICAgbFA1ID0gU0VHUFRSX0FMTE9DKG5TaXplKTsKKwkgICAgbFA1ID0gU0VHUFRSX0FMTE9DKG5TaXplKzEpOwogICAgICAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJBZGRpbmcgbHBTdHJpbmcgKG5TaXplIGlzICVkKVxuIixuU2l6ZSk7CiAJICAgIG1lbWNweShsUDUsbHBTdHJpbmcsblNpemUpOworCSAgICAqKChjaGFyICopbFA1ICsgblNpemUpID0gJ1wwJzsKIAl9IGVsc2UKIAkgIGxQNSA9IDBMOwogCQogCWlQNiA9IHdDb3VudDsKIAkKIAkvKiBUaGlzIHNob3VsZCBiZSByZWFsaXplZCBieSB0aGUgZHJpdmVyLCBzbyBpbiAxNmJpdCBkYXRhIGFyZWEgKi8KLQlsUDcgPSBscEZvbnRJbmZvOworCWxQNyA9IFNFR1BUUl9HRVQoIGxwRm9udEluZm8gKTsKICAgICAgICAgbFA4ID0gbHBEcmF3TW9kZTsKICAgICAgICAgbFA5ID0gbHBUZXh0WEZvcm07CiAJCkBAIC02MDMsMyArNjYzLDEzMSBAQAogICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0V4dFRleHRPdXQ6IHJldHVybiAlbHhcbiIsIGR3UmV0KTsKICAgICByZXR1cm4gZHdSZXQ7CiB9CisKK2ludCBXSU5BUEkgZG1FbnVtREZvbnRzKExQUERFVklDRSBscERlc3REZXYsIExQU1RSIGxwRmFjZU5hbWUsIEZBUlBST0MxNiBscENhbGxiYWNrRnVuYywgTFBWT0lEIGxwQ2xpZW50RGF0YSkKK3sKKyAgICAgICAgLyogV2luZG93cyAzLjEganVzdCByZXR1cm5zIDEgKi8KKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK2ludCBXSU5BUEkgZG1SZWFsaXplT2JqZWN0KExQUERFVklDRSBscERlc3REZXYsIElOVDE2IHdTdHlsZSwgTFBTVFIgbHBJbk9iaiwgTFBTVFIgbHBPdXRPYmosIFNFR1BUUiBscFRleHRYRm9ybSkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgImRtUmVhbGl6ZU9iamVjdChscERlc3REZXY6ICUwOHgsIHdTdHlsZTogJTA0eCwgbHBJbk9iajogJTA4eCwgbHBPdXRPYmo6ICUwOHgsIGxwVGV4dFhGb3JtOiAlMDh4KTogc3R1YjogIiwgKFVJTlQzMilscERlc3REZXYsIHdTdHlsZSwgKFVJTlQzMilscEluT2JqLCAoVUlOVDMyKWxwT3V0T2JqLCAoVUlOVDMyKWxwVGV4dFhGb3JtKTsKKyAgICBpZiAod1N0eWxlIDwgMCkgeyAvKiBGcmVlIGV4dHJhIG1lbW9yeSBvZiBnaXZlbiBvYmplY3QncyBzdHJ1Y3R1cmUgKi8KKwlzd2l0Y2ggKCAtd1N0eWxlICkgeworICAgICAgICAgICAgY2FzZSBEUlZPQkpfUEVOOiAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTE9HUEVOMTYgRGVsZXRlUGVuID0gKExQTE9HUEVOMTYpbHBJbk9iajsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9QRU5fZGVsZXRlXG4iKTsKKwkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEUlZPQkpfQlJVU0g6CXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9CUlVTSF9kZWxldGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQl9CisgICAgICAgICAgICBjYXNlIERSVk9CSl9GT05UOgl7CisJCQkJTFBURVhUWEZPUk0xNiBUZXh0WEZvcm0KKwkJCQkJPSAoTFBURVhUWEZPUk0xNilscFRleHRYRm9ybTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9GT05UX2RlbGV0ZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCX0KKyAgICAgICAgICAgIGNhc2UgRFJWT0JKX1BCSVRNQVA6ICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9QQklUTUFQX2RlbGV0ZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgZWxzZSB7IC8qIFJlYWxpemUgZ2l2ZW4gb2JqZWN0ICovCisKKwlzd2l0Y2ggKHdTdHlsZSkgeworCSAgICBjYXNlIERSVk9CSl9QRU46IHsKKwkJCQlMUExPR1BFTjE2IEluUGVuICA9IChMUExPR1BFTjE2KWxwSW5PYmo7CisKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9QRU5cbiIpOworCQkJCWlmIChscE91dE9iaikgeworCQkJCSAgICBpZiAoSW5QZW4tPmxvcG5TdHlsZSA9PSBQU19OVUxMKSB7CisJCQkJCSooRFdPUkQgKilscE91dE9iaiA9IDA7CisJCQkJCSooV09SRCAqKShscE91dE9iais0KSA9IEluUGVuLT5sb3BuU3R5bGU7CisJCQkJICAgIH0KKwkJCQkgICAgZWxzZQorCQkJCSAgICBpZiAoKEluUGVuLT5sb3BuV2lkdGgueCA+IDEpIHx8IChJblBlbi0+bG9wblN0eWxlID4gUFNfTlVMTCkgKSB7CisJCQkJCSooRFdPUkQgKilscE91dE9iaiA9IEluUGVuLT5sb3BuQ29sb3I7CisJCQkJCSooV09SRCAqKShscE91dE9iais0KSA9IDA7CisJCQkJICAgIH0KKwkJCQkgICAgZWxzZSB7CisJCQkJCSooRFdPUkQgKilscE91dE9iaiA9IEluUGVuLT5sb3BuQ29sb3IgJiAweGZmZmYwMDAwOworCQkJCQkqKFdPUkQgKikobHBPdXRPYmorNCkgPSBJblBlbi0+bG9wblN0eWxlOworCQkJCSAgICB9CisJCQkJfQorCQkJCXJldHVybiBzaXplb2YoTE9HUEVOMTYpOworCQkJICAgICB9CisJICAgIGNhc2UgRFJWT0JKX0JSVVNIOiB7CisJCQkJTFBMT0dCUlVTSDE2IEluQnJ1c2ggID0gKExQTE9HQlJVU0gxNilscEluT2JqOworCQkJCUxQTE9HQlJVU0gxNiBPdXRCcnVzaCA9IChMUExPR0JSVVNIMTYpbHBPdXRPYmo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUE9JTlQxNiBQb2ludCA9IChMUFBPSU5UMTYpbHBUZXh0WEZvcm07CisKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9CUlVTSFxuIik7CisJCQkJaWYgKCFscE91dE9iaikgcmV0dXJuIHNpemVvZihMT0dCUlVTSDE2KTsKKwkJCQllbHNlIHsKKwkJCQkgICAgT3V0QnJ1c2gtPmxiU3R5bGUgPSBJbkJydXNoLT5sYlN0eWxlOworCQkJCSAgICBPdXRCcnVzaC0+bGJDb2xvciA9IEluQnJ1c2gtPmxiQ29sb3I7CisJCQkJICAgIE91dEJydXNoLT5sYkhhdGNoID0gSW5CcnVzaC0+bGJIYXRjaDsKKwkJCQkgICAgaWYgKEluQnJ1c2gtPmxiU3R5bGUgPT0gQlNfU09MSUQpIAorCQkJCSAgICByZXR1cm4gMHg4MDAyOyAvKiBGSVhNRTogZGlmZiBtb25vLWNvbG9yICovCisJCQkJICAgIGVsc2UgcmV0dXJuIDB4ODAwMDsKKwkJCQl9CisJCSAgICAgICAgICAgICAgIH0KKwkgICAgY2FzZSBEUlZPQkpfRk9OVDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRFWFRYRk9STTE2IFRleHRYRm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKExQVEVYVFhGT1JNMTYpbHBUZXh0WEZvcm07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRFJWT0JKX0ZPTlRcbiIpOworCQkJCXJldHVybiAwOy8qIERJU1BMQVkuRFJWIGRvZXNuJ3QgcmVhbGl6ZSBmb250cyAqLworCQkJICAgICAgfQorCSAgICBjYXNlIERSVk9CSl9QQklUTUFQOglmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9QQklUTUFQXG4iKTsKKwkJCQkJcmV0dXJuIDA7IC8qIGNyZWF0ZSBtZW1vcnkgYml0bWFwICovCisJfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworCitXT1JEIFBSVERSVl9HZXRDaGFyV2lkdGgoTFBQREVWSUNFIGxwRGVzdERldiwgTFBJTlQzMiBscEJ1ZmZlciwgCisJCSAgICAgIFdPUkQgd0ZpcnN0Q2hhciwgV09SRCB3TGFzdENoYXIsIExQRk9OVElORk8xNiBscEZvbnRJbmZvLAorCQkgICAgICBTRUdQVFIgbHBEcmF3TW9kZSwgU0VHUFRSIGxwVGV4dFhGb3JtICkKK3sKKworICAgIFdPUkQgd1JldCA9IDA7CisgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKKyAgICAKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9HZXRDaGFyV2lkdGg6XG4iKTsKKyAgICAKKyAgICBpZiAoKHBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKGxwRGVzdERldikpICE9IE5VTEwpCisgICAgeworCUxPTkcJCWxQMSwgbFA1LCBsUDYsIGxQNzsgIAorCUxQV09SRAkJbFAyOworCVdPUkQJCXdQMywgd1A0LCBpOworCQorCWlmIChwTFBELT5mbltGVU5DX0dFVENIQVJXSURUSF0gPT0gTlVMTCkKKwl7CisJICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLAorCQkiUFJURFJWX0dldENoYXJXaWR0aDogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICByZXR1cm4gMDsKKwl9CisKKwlsUDEgPSBscERlc3REZXY7CisJbFAyID0gU0VHUFRSX0FMTE9DKCAod0xhc3RDaGFyIC0gd0ZpcnN0Q2hhciArIDEpICogc2l6ZW9mKFdPUkQpICk7CisJd1AzID0gd0ZpcnN0Q2hhcjsKKwl3UDQgPSB3TGFzdENoYXI7CisJbFA1ID0gU0VHUFRSX0dFVCggbHBGb250SW5mbyApOworICAgICAgICBsUDYgPSBscERyYXdNb2RlOworICAgICAgICBsUDcgPSBscFRleHRYRm9ybTsKKwkKKwl3UmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJ2R2V0Q2hhcldpZHRoUHJvYyhwTFBELT5mbltGVU5DX0dFVENIQVJXSURUSF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgU0VHUFRSX0dFVChsUDIpLCB3UDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1A0LCBsUDUsIGxQNiwgbFA3ICk7CisKKwlmb3IoaSA9IDA7IGkgPD0gd0xhc3RDaGFyIC0gd0ZpcnN0Q2hhcjsgaSsrKQorCSAgICBscEJ1ZmZlcltpXSA9IChJTlQzMikgbFAyW2ldOworCisJU0VHUFRSX0ZSRUUobFAyKTsKKyAgICB9CisgICAgcmV0dXJuIHdSZXQ7Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMgYi9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMKaW5kZXggZTRiMWNjNC4uNThkNzcxZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvdGV4dC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3RleHQuYwpAQCAtMiw2ICsyLDcgQEAKICAqIHdpbjE2IGRyaXZlciB0ZXh0IGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTk2IEpvaG4gSGFydmV5CisgKiAgICAgICAgICAgMTk5OCBIdXcgRGF2aWVzCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMTAsNyArMTEsNiBAQAogI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfV0lOMTZEUlYgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI3LDMyICsyNywxOSBAQAogICAgIFJFQ1QxNiAJKmxwT3BhcXVlUmVjdCA9IE5VTEw7IAogICAgIFdPUkQgd09wdGlvbnMgPSAwOwogICAgIFdPUkQgd0NvdW50ID0gY291bnQ7Ci0KLSAgICBzdGF0aWMgQk9PTDMyIGJJbml0ID0gRkFMU0U7Ci0gICAgCi0KKyAgICBJTlQxNiB3aWR0aDsKIAogICAgIGlmIChjb3VudCA9PSAwKQogICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJXSU4xNkRSVl9FeHRUZXh0T3V0OiAlMDR4ICVkICVkICV4ICVwICUqcyAlcFxuIiwgZGMtPmhTZWxmLCB4LCB5LCAKLQkgICBmbGFncywgIGxwcmVjdCwgY291bnQgPiAwID8gY291bnQgOiA4LCBzdHIsIGxwRHgpOworICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiV0lOMTZEUlZfRXh0VGV4dE91dDogJTA0eCAlZCAlZCAleCAlcCAlKnMgJXBcbiIsCisJICAgZGMtPmhTZWxmLCB4LCB5LCBmbGFncywgIGxwcmVjdCwgY291bnQgPiAwID8gY291bnQgOiA4LCBzdHIsIGxwRHgpOwogCiAKLSAgICBpZiAoYkluaXQgPT0gRkFMU0UpCi0gICAgewotCURXT1JEIGR3UmV0OwotCi0JZHdSZXQgPSBQUlREUlZfRXh0VGV4dE91dChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCAwLCAwLCAKLQkJCQkgIE5VTEwsICIgIiwgCi0JCQkJICAtMSwgIHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvLCB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIAotCQkJCSAgd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSwgTlVMTCwgTlVMTCwgMCk7Ci0JYkluaXQgPSBUUlVFOwotICAgIH0KLQogICAgIGlmIChkYyAhPSBOVUxMKSAgIAogICAgIHsKIAlEV09SRCBkd1JldDsKKwogCWNsaXBSZWN0LmxlZnQgPSAwOwogCWNsaXBSZWN0LnRvcCA9IDA7CiAgICAgICAgIApAQCAtNjgsMzkgKzU1LDY1IEBACiAgICAgICAgICAgICAKICAgICAgICAgfQogICAgICAgICAKLSNpZmRlZiBOT1RERUYKLSAgICB7Ci0gICAgICAgIFJFQ1QxNiByY1BhZ2VTaXplOwotCUZPTlRJTkZPMTYgKnAgPSAoRk9OVElORk8xNiAqKVBUUl9TRUdfVE9fTElOKHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvKTsKLSAgICAgICAgcmNQYWdlU2l6ZS5sZWZ0ID0gMDsKLSAgICAgICAgcmNQYWdlU2l6ZS5yaWdodCA9IDB4M2MwOwotICAgICAgICAKLSAgICAgICAgcmNQYWdlU2l6ZS50b3AgPSAwOwotICAgICAgICByY1BhZ2VTaXplLmJvdHRvbSA9IDB4NjMwOwotICAgICAgICAKKwlkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgInRleHRhbGlnbiA9ICVkXG4iLCBkYy0+dy50ZXh0QWxpZ24pOwogCisJaWYgKGRjLT53LnRleHRBbGlnbiAmIFRBX1VQREFURUNQKQorCXsKKwkgICAgeCA9IGRjLT53LkN1cnNQb3NYOworCSAgICB5ID0gZGMtPncuQ3Vyc1Bvc1k7CisJfQogCisJeCA9IFhMUFRPRFAoIGRjLCB4ICk7CisJeSA9IFlMUFRPRFAoIGRjLCB5ICk7CiAKLSAgICAgICAgaWYoeSA8IHJjUGFnZVNpemUudG9wICB8fCAgeSArIHAtPmRmUGl4SGVpZ2h0ID4gcmNQYWdlU2l6ZS5ib3R0b20pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiRmFpbGVkIDEgeSAlZCB0b3AgJWQgeSAraGVpZ2h0ICVkIGJvdHRvbSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICB5LCByY1BhZ2VTaXplLnRvcCAgLCAgeSArIHAtPmRmUGl4SGVpZ2h0ICwgcmNQYWdlU2l6ZS5ib3R0b20pOwotICAgICAgICB9Ci0gICAgICAgIAorCWR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgMCwgMCwgCisJCSBOVUxMLCBzdHIsIC1jb3VudCwgIHBoeXNEZXYtPkZvbnRJbmZvLCAKKwkJIHdpbjE2ZHJ2X1NlZ1B0cl9EcmF3TW9kZSwgd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSwKKwkJIE5VTEwsIE5VTEwsIDApOwogCi0gICAgICAgIGlmKHggPj0gcmNQYWdlU2l6ZS5yaWdodCAgfHwKLSAgICAgICAgICAgIHggKyB3Q291bnQgKiBwLT5kZlBpeFdpZHRoIDwgcmNQYWdlU2l6ZS5sZWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoIkZhaWxlIDJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSNlbmRpZiAgICAgICAgCisJd2lkdGggPSBMT1dPUkQoZHdSZXQpOwogCi0JZHdSZXQgPSBQUlREUlZfRXh0VGV4dE91dChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCBYTFBUT0RQKGRjLHgpLCBZTFBUT0RQKGRjLHkpLCAKLQkJCQkgICZjbGlwUmVjdCwgc3RyLCAKLQkJCQkgIHdDb3VudCwgIHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvLCB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIAotCQkJCSAgd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSwgTlVMTCwgbHBPcGFxdWVSZWN0LCB3T3B0aW9ucyk7CisJc3dpdGNoKCBkYy0+dy50ZXh0QWxpZ24gJiAoVEFfTEVGVCB8IFRBX1JJR0hUIHwgVEFfQ0VOVEVSKSApCisJeworCWNhc2UgVEFfTEVGVDoKKyAJICAgIGlmIChkYy0+dy50ZXh0QWxpZ24gJiBUQV9VUERBVEVDUCkKKwkgICAgICAgIGRjLT53LkN1cnNQb3NYID0gWERQVE9MUCggZGMsIHggKyB3aWR0aCApOworCSAgICBicmVhazsKKwljYXNlIFRBX1JJR0hUOgorCSAgICAgeCAtPSB3aWR0aDsKKwkgICAgIGlmIChkYy0+dy50ZXh0QWxpZ24gJiBUQV9VUERBVEVDUCkKKwkgICAgICAgICBkYy0+dy5DdXJzUG9zWCA9IFhEUFRPTFAoIGRjLCB4ICk7CisJICAgICBicmVhazsKKwljYXNlIFRBX0NFTlRFUjoKKwkgICAgeCAtPSB3aWR0aCAvIDI7CisJICAgIGJyZWFrOworCX0KKworCXN3aXRjaCggZGMtPncudGV4dEFsaWduICYgKFRBX1RPUCB8IFRBX0JPVFRPTSB8IFRBX0JBU0VMSU5FKSApCisJeworCWNhc2UgVEFfVE9QOgorCSAgICBicmVhazsKKwljYXNlIFRBX0JPVFRPTToKKwkgICAgeSAtPSBwaHlzRGV2LT5Gb250SW5mby0+ZGZQaXhIZWlnaHQ7CisJICAgIGJyZWFrOworCWNhc2UgVEFfQkFTRUxJTkU6CisJICAgIHkgLT0gcGh5c0Rldi0+Rm9udEluZm8tPmRmQXNjZW50OworCSAgICBicmVhazsgICAgCisJfQorCisJZHdSZXQgPSBQUlREUlZfRXh0VGV4dE91dChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCAKKwkgICAgICB4LCB5LCAmY2xpcFJlY3QsIHN0ciwgd0NvdW50LAorCSAgICAgIHBoeXNEZXYtPkZvbnRJbmZvLCB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIAorCSAgICAgIHdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm0sIE5VTEwsIGxwT3BhcXVlUmVjdCwgd09wdGlvbnMpOwogICAgIH0KICAgICByZXR1cm4gYlJldDsKIH0KKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbmcuYyBiL2dyYXBoaWNzL3dpbmcuYwppbmRleCBmMmI3MWRkLi5iZTNjOTAxIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW5nLmMKKysrIGIvZ3JhcGhpY3Mvd2luZy5jCkBAIC00LDggKzQsOCBAQAogICogU3RhcnRlZCBieSBSb2JlcnQgUG91bGlvdCA8a3J5bm9zQGNsaWMubmV0PgogICovCiAKLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hTaG0uaD4KKyNpbmNsdWRlICJ0c194bGliLmgiCisjaW5jbHVkZSAidHNfeHNobS5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9pcGMuaD4KICNpZm5kZWYgX19FTVhfXwpAQCAtNDgsMTAgKzQ4LDEwIEBACiB7CiAgIGlmKCBfX1dpbkdPSyA8IDAgKQogICB7Ci0gICAgU3RhdHVzIHMgPSBYU2htUXVlcnlFeHRlbnNpb24oZGlzcGxheSk7CisgICAgU3RhdHVzIHMgPSBUU1hTaG1RdWVyeUV4dGVuc2lvbihkaXNwbGF5KTsKICAgICBpZiggcyApCiAgICAgewotICAgICAgaW50IGkgPSBYU2htUGl4bWFwRm9ybWF0KGRpc3BsYXkpOworICAgICAgaW50IGkgPSBUU1hTaG1QaXhtYXBGb3JtYXQoZGlzcGxheSk7CiAgICAgICBpZiggaSA9PSBaUGl4bWFwICYmIHNjcmVlbkRlcHRoID09IDggKSAKICAgICAgIHsKICAgICAgICAgX19XaW5HT0sgPSBUcnVlOwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBwLT5zaS5zaG1hZGRyLCBieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR01FTlRfREFUQSwgRkFMU0UsIEZBTFNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWwpIHAtPmJpdHMgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoc2VsLDApOwotCQkJZWxzZSBYRnJlZVBpeG1hcCggZGlzcGxheSwgYm1wT2JqUHRyLT5waXhtYXAgKTsKKwkJCWVsc2UgVFNYRnJlZVBpeG1hcCggZGlzcGxheSwgYm1wT2JqUHRyLT5waXhtYXAgKTsKIAkJICAgIH0KIAkJICAgIGlmKCAhc2VsICkKIAkJICAgIHsKQEAgLTI3OCw4ICsyNzgsOCBAQAogICAgIHdpZERlc3QgPSB3aWREZXN0ICogZGNEc3QtPnZwb3J0RXh0WCAvIGRjRHN0LT53bmRFeHRYOwogICAgIGhlaURlc3QgPSBoZWlEZXN0ICogZGNEc3QtPnZwb3J0RXh0WSAvIGRjRHN0LT53bmRFeHRZOwogCi0gICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWGNvcHkgKTsKLSAgICBYQ29weUFyZWEoIGRpc3BsYXksIGRjU3JjLT51LnguZHJhd2FibGUsCisgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYY29weSApOworICAgIFRTWENvcHlBcmVhKCBkaXNwbGF5LCBkY1NyYy0+dS54LmRyYXdhYmxlLAogICAgICAgICAgICAgICAgZGNEc3QtPnUueC5kcmF3YWJsZSwgZGNEc3QtPnUueC5nYywKICAgICAgICAgICAgICAgIHhTcmMsIHlTcmMsIHdpZERlc3QsIGhlaURlc3QsIHhEZXN0LCB5RGVzdCApOwogICAgIHJldHVybiBUUlVFOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2JpdGJsdC5jIGIvZ3JhcGhpY3MveDExZHJ2L2JpdGJsdC5jCmluZGV4IGYyZjg5ZmQuLjk1MDM5YzMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9iaXRibHQuYworKysgYi9ncmFwaGljcy94MTFkcnYvYml0Ymx0LmMKQEAgLTcsNyArNyw3IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKICNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKQEAgLTU5NiwxNCArNTk2LDE0IEBACiAgICAgewogICAgICAgICBpZiAoQ09MT1JfUGl4ZWxUb1BhbGV0dGUgJiYgKGRlcHRoRHN0ICE9IDEpKQogICAgICAgICAgICAgaWYgKHN3YXApIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgICpwZGF0YS0tID0gQ09MT1JfUGl4ZWxUb1BhbGV0dGVbWEdldFBpeGVsKCBpbWFnZSwgaSwgcm93ICldOworICAgICAgICAgICAgICAgICpwZGF0YS0tID0gQ09MT1JfUGl4ZWxUb1BhbGV0dGVbVFNYR2V0UGl4ZWwoIGltYWdlLCBpLCByb3cgKV07CiAgICAgICAgICAgICBlbHNlIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgICpwZGF0YSsrID0gQ09MT1JfUGl4ZWxUb1BhbGV0dGVbWEdldFBpeGVsKCBpbWFnZSwgaSwgcm93ICldOworICAgICAgICAgICAgICAgICpwZGF0YSsrID0gQ09MT1JfUGl4ZWxUb1BhbGV0dGVbVFNYR2V0UGl4ZWwoIGltYWdlLCBpLCByb3cgKV07CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGlmIChzd2FwKSBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgICAqcGRhdGEtLSA9IFhHZXRQaXhlbCggaW1hZ2UsIGksIHJvdyApOworICAgICAgICAgICAgICAgICpwZGF0YS0tID0gVFNYR2V0UGl4ZWwoIGltYWdlLCBpLCByb3cgKTsKICAgICAgICAgICAgIGVsc2UgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgKnBkYXRhKysgPSBYR2V0UGl4ZWwoIGltYWdlLCBpLCByb3cgKTsKKyAgICAgICAgICAgICAgICAqcGRhdGErKyA9IFRTWEdldFBpeGVsKCBpbWFnZSwgaSwgcm93ICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC02MTUsMTYgKzYxNSwxNiBAQAogICAgICAgICAgICAgICAgIGJnID0gQ09MT1JfUGl4ZWxUb1BhbGV0dGVbYmddOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN3YXApIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgICpwZGF0YS0tID0gWEdldFBpeGVsKCBpbWFnZSwgaSwgcm93ICkgPyBiZyA6IGZnOworICAgICAgICAgICAgICAgICpwZGF0YS0tID0gVFNYR2V0UGl4ZWwoIGltYWdlLCBpLCByb3cgKSA/IGJnIDogZmc7CiAgICAgICAgICAgICBlbHNlIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgICpwZGF0YSsrID0gWEdldFBpeGVsKCBpbWFnZSwgaSwgcm93ICkgPyBiZyA6IGZnOworICAgICAgICAgICAgICAgICpwZGF0YSsrID0gVFNYR2V0UGl4ZWwoIGltYWdlLCBpLCByb3cgKSA/IGJnIDogZmc7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSAgLyogY29sb3IgLT4gbW9ub2Nocm9tZSAqLwogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoc3dhcCkgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgKnBkYXRhLS0gPSAoWEdldFBpeGVsKCBpbWFnZSwgaSwgcm93ICkgPT0gYmcpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgKnBkYXRhLS0gPSAoVFNYR2V0UGl4ZWwoIGltYWdlLCBpLCByb3cgKSA9PSBiZykgPyAxIDogMDsKICAgICAgICAgICAgIGVsc2UgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgKnBkYXRhKysgPSAoWEdldFBpeGVsKCBpbWFnZSwgaSwgcm93ICkgPT0gYmcpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgKnBkYXRhKysgPSAoVFNYR2V0UGl4ZWwoIGltYWdlLCBpLCByb3cgKSA9PSBiZykgPyAxIDogMDsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTcyMCw3ICs3MjAsNyBAQAogICAgICAgICAgICAgcGl4ZWwgPSByb3dEc3QgKyB2aXNSZWN0RHN0LT5yaWdodCAtIDE7CiAgICAgICAgICAgICB5ID0geWRzdCAtIHZpc1JlY3REc3QtPnRvcDsKICAgICAgICAgICAgIGZvciAoeCA9IHZpc1JlY3REc3QtPnJpZ2h0LXZpc1JlY3REc3QtPmxlZnQtMTsgeCA+PSAwOyB4LS0pCi0gICAgICAgICAgICAgICAgWFB1dFBpeGVsKCBkc3RJbWFnZSwgeCwgeSwgKnBpeGVsLS0gKTsKKyAgICAgICAgICAgICAgICBUU1hQdXRQaXhlbCggZHN0SW1hZ2UsIHgsIHksICpwaXhlbC0tICk7CiAgICAgICAgICAgICBpZiAobW9kZSAhPSBTVFJFVENIX0RFTEVURVNDQU5TKQogICAgICAgICAgICAgICAgIG1lbXNldCggcm93RHN0LCAobW9kZSA9PSBTVFJFVENIX0FORFNDQU5TKSA/IDB4ZmYgOiAweDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhEc3Qqc2l6ZW9mKGludCkgKTsKQEAgLTc5NCw3ICs3OTQsNyBAQAogICAgICAgICAgICAgcGl4ZWwgPSByb3dEc3QgKyB2aXNSZWN0RHN0LT5yaWdodCAtIDE7CiAgICAgICAgICAgICB5ID0gKHlkc3QgPj4gMTYpIC0gdmlzUmVjdERzdC0+dG9wOwogICAgICAgICAgICAgZm9yICh4ID0gdmlzUmVjdERzdC0+cmlnaHQtdmlzUmVjdERzdC0+bGVmdC0xOyB4ID49IDA7IHgtLSkKLSAgICAgICAgICAgICAgICBYUHV0UGl4ZWwoIGRzdEltYWdlLCB4LCB5LCAqcGl4ZWwtLSApOworICAgICAgICAgICAgICAgIFRTWFB1dFBpeGVsKCBkc3RJbWFnZSwgeCwgeSwgKnBpeGVsLS0gKTsKICAgICAgICAgICAgIGlmIChtb2RlICE9IFNUUkVUQ0hfREVMRVRFU0NBTlMpCiAgICAgICAgICAgICAgICAgbWVtc2V0KCByb3dEc3QsIChtb2RlID09IFNUUkVUQ0hfQU5EU0NBTlMpID8gMHhmZiA6IDB4MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aERzdCpzaXplb2YoaW50KSApOwpAQCAtODMxLDcgKzgzMSw3IEBACiAgICAgT2Zmc2V0UmVjdDMyKCAmcmVjdERzdCwgLXhEc3QsIC15RHN0ICk7CiAKICAgICAvKiBGSVhNRTogYXZvaWQgQmFkTWF0Y2ggZXJyb3JzICovCi0gICAgaW1hZ2VTcmMgPSBYR2V0SW1hZ2UoIGRpc3BsYXksIGRjU3JjLT51LnguZHJhd2FibGUsCisgICAgaW1hZ2VTcmMgPSBUU1hHZXRJbWFnZSggZGlzcGxheSwgZGNTcmMtPnUueC5kcmF3YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdFNyYy0+bGVmdCwgdmlzUmVjdFNyYy0+dG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLT5yaWdodCAtIHZpc1JlY3RTcmMtPmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1JlY3RTcmMtPmJvdHRvbSAtIHZpc1JlY3RTcmMtPnRvcCwKQEAgLTg0MywxMCArODQzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgZGNEc3QtPncudGV4dFBpeGVsLCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwgIT0gMSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY0RzdC0+dy5iYWNrZ3JvdW5kUGl4ZWwgOiBkY1NyYy0+dy5iYWNrZ3JvdW5kUGl4ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGNEc3QtPncuc3RyZXRjaEJsdE1vZGUgKTsKLSAgICBYUHV0SW1hZ2UoIGRpc3BsYXksIHBpeG1hcCwgZ2MsIGltYWdlRHN0LCAwLCAwLCAwLCAwLAorICAgIFRTWFB1dEltYWdlKCBkaXNwbGF5LCBwaXhtYXAsIGdjLCBpbWFnZURzdCwgMCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgIHJlY3REc3QucmlnaHQgLSByZWN0RHN0LmxlZnQsIHJlY3REc3QuYm90dG9tIC0gcmVjdERzdC50b3AgKTsKLSAgICBYRGVzdHJveUltYWdlKCBpbWFnZVNyYyApOwotICAgIFhEZXN0cm95SW1hZ2UoIGltYWdlRHN0ICk7CisgICAgVFNYRGVzdHJveUltYWdlKCBpbWFnZVNyYyApOworICAgIFRTWERlc3Ryb3lJbWFnZSggaW1hZ2VEc3QgKTsKIH0KIAogCkBAIC04NjksMzEgKzg2OSwzMSBAQAogICAgICAgICBpZiAoIUNPTE9SX1BpeGVsVG9QYWxldHRlIHx8CiAgICAgICAgICAgICAoZGNEc3QtPncuYml0c1BlclBpeGVsID09IDEpKSAgLyogbW9ub2Nocm9tZSAtPiBtb25vY2hyb21lICovCiAgICAgICAgIHsKLSAgICAgICAgICAgIFhDb3B5QXJlYSggZGlzcGxheSwgZGNTcmMtPnUueC5kcmF3YWJsZSwgcGl4bWFwLCBnYywKKyAgICAgICAgICAgIFRTWENvcHlBcmVhKCBkaXNwbGF5LCBkY1NyYy0+dS54LmRyYXdhYmxlLCBwaXhtYXAsIGdjLAogICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLT5sZWZ0LCB2aXNSZWN0U3JjLT50b3AsIHdpZHRoLCBoZWlnaHQsIDAsIDApOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgIC8qIGNvbG9yIC0+IGNvbG9yICovCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChkY1NyYy0+dy5mbGFncyAmIERDX01FTU9SWSkKLSAgICAgICAgICAgICAgICBpbWFnZVNyYyA9IFhHZXRJbWFnZSggZGlzcGxheSwgZGNTcmMtPnUueC5kcmF3YWJsZSwKKyAgICAgICAgICAgICAgICBpbWFnZVNyYyA9IFRTWEdldEltYWdlKCBkaXNwbGF5LCBkY1NyYy0+dS54LmRyYXdhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLT5sZWZ0LCB2aXNSZWN0U3JjLT50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIEFsbFBsYW5lcywgWlBpeG1hcCApOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYSBCYWRNYXRjaCBlcnJvciAqLwotICAgICAgICAgICAgICAgIFhDb3B5QXJlYSggZGlzcGxheSwgZGNTcmMtPnUueC5kcmF3YWJsZSwgcGl4bWFwLCBnYywKKyAgICAgICAgICAgICAgICBUU1hDb3B5QXJlYSggZGlzcGxheSwgZGNTcmMtPnUueC5kcmF3YWJsZSwgcGl4bWFwLCBnYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1JlY3RTcmMtPmxlZnQsIHZpc1JlY3RTcmMtPnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIDAsIDApOwotICAgICAgICAgICAgICAgIGltYWdlU3JjID0gWEdldEltYWdlKCBkaXNwbGF5LCBwaXhtYXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgaW1hZ2VTcmMgPSBUU1hHZXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxQbGFuZXMsIFpQaXhtYXAgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKLSAgICAgICAgICAgICAgICAgICAgWFB1dFBpeGVsKGltYWdlU3JjLCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfUGl4ZWxUb1BhbGV0dGVbWEdldFBpeGVsKGltYWdlU3JjLCB4LCB5KV0pOwotICAgICAgICAgICAgWFB1dEltYWdlKCBkaXNwbGF5LCBwaXhtYXAsIGdjLCBpbWFnZVNyYywKKyAgICAgICAgICAgICAgICAgICAgVFNYUHV0UGl4ZWwoaW1hZ2VTcmMsIHgsIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9QaXhlbFRvUGFsZXR0ZVtUU1hHZXRQaXhlbChpbWFnZVNyYywgeCwgeSldKTsKKyAgICAgICAgICAgIFRTWFB1dEltYWdlKCBkaXNwbGF5LCBwaXhtYXAsIGdjLCBpbWFnZVNyYywKICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCApOwotICAgICAgICAgICAgWERlc3Ryb3lJbWFnZSggaW1hZ2VTcmMgKTsKKyAgICAgICAgICAgIFRTWERlc3Ryb3lJbWFnZSggaW1hZ2VTcmMgKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC05MDIsMzUgKzkwMiwzNSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoQ09MT1JfUGl4ZWxUb1BhbGV0dGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNldEJhY2tncm91bmQoIGRpc3BsYXksIGdjLCAKKyAgICAgICAgICAgICAgICBUU1hTZXRCYWNrZ3JvdW5kKCBkaXNwbGF5LCBnYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfUGl4ZWxUb1BhbGV0dGVbZGNEc3QtPncudGV4dFBpeGVsXSApOwotICAgICAgICAgICAgICAgIFhTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBnYywKKyAgICAgICAgICAgICAgICBUU1hTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBnYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9QaXhlbFRvUGFsZXR0ZVtkY0RzdC0+dy5iYWNrZ3JvdW5kUGl4ZWxdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZ2MsIGRjRHN0LT53LnRleHRQaXhlbCApOwotICAgICAgICAgICAgICAgIFhTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBnYywgZGNEc3QtPncuYmFja2dyb3VuZFBpeGVsICk7CisgICAgICAgICAgICAgICAgVFNYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZ2MsIGRjRHN0LT53LnRleHRQaXhlbCApOworICAgICAgICAgICAgICAgIFRTWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGdjLCBkY0RzdC0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhDb3B5UGxhbmUoIGRpc3BsYXksIGRjU3JjLT51LnguZHJhd2FibGUsIHBpeG1hcCwgZ2MsCisgICAgICAgICAgICBUU1hDb3B5UGxhbmUoIGRpc3BsYXksIGRjU3JjLT51LnguZHJhd2FibGUsIHBpeG1hcCwgZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLT5sZWZ0LCB2aXNSZWN0U3JjLT50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAwLCAwLCAxICk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSAgLyogY29sb3IgLT4gbW9ub2Nocm9tZSAqLwogICAgICAgICB7CiAgICAgICAgICAgICAvKiBGSVhNRTogYXZvaWQgQmFkTWF0Y2ggZXJyb3IgKi8KLSAgICAgICAgICAgIGltYWdlU3JjID0gWEdldEltYWdlKCBkaXNwbGF5LCBkY1NyYy0+dS54LmRyYXdhYmxlLAorICAgICAgICAgICAgaW1hZ2VTcmMgPSBUU1hHZXRJbWFnZSggZGlzcGxheSwgZGNTcmMtPnUueC5kcmF3YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLT5sZWZ0LCB2aXNSZWN0U3JjLT50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgQWxsUGxhbmVzLCBaUGl4bWFwICk7CiAgICAgICAgICAgICBYQ1JFQVRFSU1BR0UoIGltYWdlRHN0LCB3aWR0aCwgaGVpZ2h0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwgKTsKICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKLSAgICAgICAgICAgICAgICAgICAgWFB1dFBpeGVsKGltYWdlRHN0LCB4LCB5LCAoWEdldFBpeGVsKGltYWdlU3JjLHgseSkgPT0KKyAgICAgICAgICAgICAgICAgICAgVFNYUHV0UGl4ZWwoaW1hZ2VEc3QsIHgsIHksIChUU1hHZXRQaXhlbChpbWFnZVNyYyx4LHkpID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjU3JjLT53LmJhY2tncm91bmRQaXhlbCkgKTsKLSAgICAgICAgICAgIFhQdXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCBnYywgaW1hZ2VEc3QsCisgICAgICAgICAgICBUU1hQdXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCBnYywgaW1hZ2VEc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKLSAgICAgICAgICAgIFhEZXN0cm95SW1hZ2UoIGltYWdlU3JjICk7Ci0gICAgICAgICAgICBYRGVzdHJveUltYWdlKCBpbWFnZURzdCApOworICAgICAgICAgICAgVFNYRGVzdHJveUltYWdlKCBpbWFnZVNyYyApOworICAgICAgICAgICAgVFNYRGVzdHJveUltYWdlKCBpbWFnZURzdCApOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtOTUwLDcgKzk1MCw3IEBACiAgICAgaWYgKCFDT0xPUl9QaXhlbFRvUGFsZXR0ZSB8fCAoZGMtPncuYml0c1BlclBpeGVsID09IDEpIHx8CiAJKENPTE9SX0dldFN5c3RlbVBhbGV0dGVGbGFncygpICYgQ09MT1JfVklSVFVBTCkgKQogICAgIHsKLSAgICAgICAgWENvcHlBcmVhKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBwaXhtYXAsIGdjLAorICAgICAgICBUU1hDb3B5QXJlYSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgcGl4bWFwLCBnYywKICAgICAgICAgICAgICAgICAgICB2aXNSZWN0RHN0LT5sZWZ0LCB2aXNSZWN0RHN0LT50b3AsIHdpZHRoLCBoZWlnaHQsIDAsIDAgKTsKICAgICB9CiAgICAgZWxzZQpAQCAtOTU5LDIzICs5NTksMjMgQEAKICAgICAgICAgWEltYWdlICppbWFnZTsKIAogICAgICAgICBpZiAoZGMtPncuZmxhZ3MgJiBEQ19NRU1PUlkpCi0gICAgICAgICAgICBpbWFnZSA9IFhHZXRJbWFnZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwKKyAgICAgICAgICAgIGltYWdlID0gVFNYR2V0SW1hZ2UoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdERzdC0+bGVmdCwgdmlzUmVjdERzdC0+dG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIEFsbFBsYW5lcywgWlBpeG1hcCApOwogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYSBCYWRNYXRjaCBlcnJvciAqLwotICAgICAgICAgICAgWENvcHlBcmVhKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBwaXhtYXAsIGdjLAorICAgICAgICAgICAgVFNYQ29weUFyZWEoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIHBpeG1hcCwgZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgIHZpc1JlY3REc3QtPmxlZnQsIHZpc1JlY3REc3QtPnRvcCwgd2lkdGgsIGhlaWdodCwgMCwgMCk7Ci0gICAgICAgICAgICBpbWFnZSA9IFhHZXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgaW1hZ2UgPSBUU1hHZXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFBsYW5lcywgWlBpeG1hcCApOwogICAgICAgICB9CiAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQotICAgICAgICAgICAgICAgIFhQdXRQaXhlbCggaW1hZ2UsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9QaXhlbFRvUGFsZXR0ZVtYR2V0UGl4ZWwoIGltYWdlLCB4LCB5ICldKTsKLSAgICAgICAgWFB1dEltYWdlKCBkaXNwbGF5LCBwaXhtYXAsIGdjLCBpbWFnZSwgMCwgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCApOwotCVhEZXN0cm95SW1hZ2UoIGltYWdlICk7CisgICAgICAgICAgICAgICAgVFNYUHV0UGl4ZWwoIGltYWdlLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfUGl4ZWxUb1BhbGV0dGVbVFNYR2V0UGl4ZWwoIGltYWdlLCB4LCB5ICldKTsKKyAgICAgICAgVFNYUHV0SW1hZ2UoIGRpc3BsYXksIHBpeG1hcCwgZ2MsIGltYWdlLCAwLCAwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7CisJVFNYRGVzdHJveUltYWdlKCBpbWFnZSApOwogICAgIH0KIH0KIApAQCAtOTk2LDIzICs5OTYsMjMgQEAKICAgICBpZiAoIUNPTE9SX1BhbGV0dGVUb1BpeGVsIHx8IChkYy0+dy5iaXRzUGVyUGl4ZWwgPT0gMSkgfHwgCiAgICAgICAgIChDT0xPUl9HZXRTeXN0ZW1QYWxldHRlRmxhZ3MoKSAmIENPTE9SX1ZJUlRVQUwpICkKICAgICB7Ci0gICAgICAgIFhDb3B5QXJlYSggZGlzcGxheSwgcGl4bWFwLCBkYy0+dS54LmRyYXdhYmxlLCBnYywgMCwgMCwKKyAgICAgICAgVFNYQ29weUFyZWEoIGRpc3BsYXksIHBpeG1hcCwgZGMtPnUueC5kcmF3YWJsZSwgZ2MsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgdmlzUmVjdERzdC0+bGVmdCwgdmlzUmVjdERzdC0+dG9wICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgIHJlZ2lzdGVyIElOVDMyIHgsIHk7Ci0gICAgICAgIFhJbWFnZSAqaW1hZ2UgPSBYR2V0SW1hZ2UoIGRpc3BsYXksIHBpeG1hcCwgMCwgMCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgWEltYWdlICppbWFnZSA9IFRTWEdldEltYWdlKCBkaXNwbGF5LCBwaXhtYXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFBsYW5lcywgWlBpeG1hcCApOwogICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCiAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYUHV0UGl4ZWwoIGltYWdlLCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfUGFsZXR0ZVRvUGl4ZWxbWEdldFBpeGVsKCBpbWFnZSwgeCwgeSApXSk7CisgICAgICAgICAgICAgICAgVFNYUHV0UGl4ZWwoIGltYWdlLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfUGFsZXR0ZVRvUGl4ZWxbVFNYR2V0UGl4ZWwoIGltYWdlLCB4LCB5ICldKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgWFB1dEltYWdlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBnYywgaW1hZ2UsIDAsIDAsCisgICAgICAgIFRTWFB1dEltYWdlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBnYywgaW1hZ2UsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgdmlzUmVjdERzdC0+bGVmdCwgdmlzUmVjdERzdC0+dG9wLCB3aWR0aCwgaGVpZ2h0ICk7Ci0gICAgICAgIFhEZXN0cm95SW1hZ2UoIGltYWdlICk7CisgICAgICAgIFRTWERlc3Ryb3lJbWFnZSggaW1hZ2UgKTsKICAgICB9CiB9CiAKQEAgLTExNzEsMTQgKzExNzEsMTQgQEAKICAgICB7CiAgICAgY2FzZSBCTEFDS05FU1M6ICAvKiAweDAwICovCiAgICAgICAgIGlmICgoZGNEc3QtPncuYml0c1BlclBpeGVsID09IDEpIHx8ICFDT0xPUl9QYWxldHRlVG9QaXhlbCkKLSAgICAgICAgICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1hjbGVhciApOworICAgICAgICAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYY2xlYXIgKTsKICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYY29weSApOwotICAgICAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIENPTE9SX1BhbGV0dGVUb1BpeGVsWzBdICk7Ci0gICAgICAgICAgICBYU2V0RmlsbFN0eWxlKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBGaWxsU29saWQgKTsKKyAgICAgICAgICAgIFRTWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWGNvcHkgKTsKKyAgICAgICAgICAgIFRTWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIENPTE9SX1BhbGV0dGVUb1BpeGVsWzBdICk7CisgICAgICAgICAgICBUU1hTZXRGaWxsU3R5bGUoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEZpbGxTb2xpZCApOwogICAgICAgICB9Ci0gICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkY0RzdC0+dS54LmRyYXdhYmxlLCBkY0RzdC0+dS54LmdjLAorICAgICAgICBUU1hGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkY0RzdC0+dS54LmRyYXdhYmxlLCBkY0RzdC0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdERzdC5sZWZ0LCB2aXNSZWN0RHN0LnRvcCwgd2lkdGgsIGhlaWdodCApOwogICAgICAgICByZXR1cm4gVFJVRTsKIApAQCAtMTE4NiwxMCArMTE4NiwxMCBAQAogICAgICAgICBpZiAoKGRjRHN0LT53LmJpdHNQZXJQaXhlbCA9PSAxKSB8fCAhQ09MT1JfUGFsZXR0ZVRvUGl4ZWwgfHwKICAgICAgICAgICAgICFPcHRpb25zLnBlcmZlY3RHcmFwaGljcykKICAgICAgICAgewotICAgICAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWGludmVydCApOworICAgICAgICAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYaW52ZXJ0ICk7CiAKICAgICAgICAgICAgIGlmKCBDT0xPUl9HZXRTeXN0ZW1QYWxldHRlRmxhZ3MoKSAmIChDT0xPUl9QUklWQVRFIHwgQ09MT1JfVklSVFVBTCkgKQotICAgICAgICAgICAgICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1hpbnZlcnQpOworICAgICAgICAgICAgICAgIFRTWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWGludmVydCk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogWG9yIGlzIG11Y2ggYmV0dGVyIHdoZW4gd2UgZG8gbm90IGhhdmUgZnVsbCBjb2xvcm1hcC4gICAqLwpAQCAtMTE5NywxMSArMTE5NywxMSBAQAogICAgICAgICAgICAgICAgIC8qIGFuZCB3aGl0ZS4gKi8KICAgICAgICAgICAgICAgICBQaXhlbCB4b3JfcGl4ID0gKFdoaXRlUGl4ZWxPZlNjcmVlbihzY3JlZW4pIF4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsYWNrUGl4ZWxPZlNjcmVlbihzY3JlZW4pKTsKLSAgICAgICAgICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYeG9yICk7Ci0gICAgICAgICAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIHhvcl9waXgpOwotICAgICAgICAgICAgICAgIFhTZXRGaWxsU3R5bGUoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEZpbGxTb2xpZCApOyAKKyAgICAgICAgICAgICAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1h4b3IgKTsKKyAgICAgICAgICAgICAgICBUU1hTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCB4b3JfcGl4KTsKKyAgICAgICAgICAgICAgICBUU1hTZXRGaWxsU3R5bGUoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEZpbGxTb2xpZCApOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkY0RzdC0+dS54LmRyYXdhYmxlLCBkY0RzdC0+dS54LmdjLAorICAgICAgICAgICAgVFNYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGNEc3QtPnUueC5kcmF3YWJsZSwgZGNEc3QtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0RHN0LmxlZnQsIHZpc1JlY3REc3QudG9wLCB3aWR0aCwgaGVpZ2h0ICk7IAogICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KQEAgLTEyMTEsOCArMTIxMSw4IEBACiAJaWYgKE9wdGlvbnMucGVyZmVjdEdyYXBoaWNzKSBicmVhazsKICAgICAgICAgaWYgKERDX1NldHVwR0NGb3JCcnVzaCggZGNEc3QgKSkKICAgICAgICAgewotICAgICAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWHhvciApOwotICAgICAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjRHN0LT51LnguZHJhd2FibGUsIGRjRHN0LT51LnguZ2MsCisgICAgICAgICAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1h4b3IgKTsKKyAgICAgICAgICAgIFRTWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjRHN0LT51LnguZHJhd2FibGUsIGRjRHN0LT51LnguZ2MsCiAJCQkgICAgdmlzUmVjdERzdC5sZWZ0LCB2aXNSZWN0RHN0LnRvcCwgd2lkdGgsIGhlaWdodCApOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBUUlVFOwpAQCAtMTIyMSw4ICsxMjIxLDggQEAKIAlpZiAoT3B0aW9ucy5wZXJmZWN0R3JhcGhpY3MpIGJyZWFrOwogCWlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjRHN0ICkpCiAJewotCSAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYZXF1aXYgKTsKLQkgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjRHN0LT51LnguZHJhd2FibGUsIGRjRHN0LT51LnguZ2MsCisJICAgIFRTWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWGVxdWl2ICk7CisJICAgIFRTWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjRHN0LT51LnguZHJhd2FibGUsIGRjRHN0LT51LnguZ2MsCiAJCQkgICAgdmlzUmVjdERzdC5sZWZ0LCB2aXNSZWN0RHN0LnRvcCwgd2lkdGgsIGhlaWdodCApOwogCX0KIAlyZXR1cm4gVFJVRTsKQEAgLTEyMzAsNTggKzEyMzAsNTggQEAKICAgICBjYXNlIFNSQ0NPUFk6ICAvKiAweGNjICovCiAgICAgICAgIGlmIChkY1NyYy0+dy5iaXRzUGVyUGl4ZWwgPT0gZGNEc3QtPncuYml0c1BlclBpeGVsKQogICAgICAgICB7Ci0gICAgICAgICAgICBYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIFRydWUgKTsKLSAgICAgICAgICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1hjb3B5ICk7Ci0JICAgIFhDb3B5QXJlYSggZGlzcGxheSwgZGNTcmMtPnUueC5kcmF3YWJsZSwKKyAgICAgICAgICAgIFRTWFNldEdyYXBoaWNzRXhwb3N1cmVzKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBUcnVlICk7CisgICAgICAgICAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1hjb3B5ICk7CisJICAgIFRTWENvcHlBcmVhKCBkaXNwbGF5LCBkY1NyYy0+dS54LmRyYXdhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICBkY0RzdC0+dS54LmRyYXdhYmxlLCBkY0RzdC0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLmxlZnQsIHZpc1JlY3RTcmMudG9wLAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB2aXNSZWN0RHN0LmxlZnQsIHZpc1JlY3REc3QudG9wICk7Ci0gICAgICAgICAgICBYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEZhbHNlICk7CisgICAgICAgICAgICBUU1hTZXRHcmFwaGljc0V4cG9zdXJlcyggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgRmFsc2UgKTsKICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmIChkY1NyYy0+dy5iaXRzUGVyUGl4ZWwgPT0gMSkKICAgICAgICAgewotICAgICAgICAgICAgWFNldEJhY2tncm91bmQoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIGRjRHN0LT53LnRleHRQaXhlbCApOwotICAgICAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIGRjRHN0LT53LmJhY2tncm91bmRQaXhlbCApOwotICAgICAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWGNvcHkgKTsKLSAgICAgICAgICAgIFhTZXRHcmFwaGljc0V4cG9zdXJlcyggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgVHJ1ZSApOwotCSAgICBYQ29weVBsYW5lKCBkaXNwbGF5LCBkY1NyYy0+dS54LmRyYXdhYmxlLAorICAgICAgICAgICAgVFNYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgZGNEc3QtPncudGV4dFBpeGVsICk7CisgICAgICAgICAgICBUU1hTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBkY0RzdC0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKKyAgICAgICAgICAgIFRTWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWGNvcHkgKTsKKyAgICAgICAgICAgIFRTWFNldEdyYXBoaWNzRXhwb3N1cmVzKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBUcnVlICk7CisJICAgIFRTWENvcHlQbGFuZSggZGlzcGxheSwgZGNTcmMtPnUueC5kcmF3YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGRjRHN0LT51LnguZHJhd2FibGUsIGRjRHN0LT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLmxlZnQsIHZpc1JlY3RTcmMudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgdmlzUmVjdERzdC5sZWZ0LCB2aXNSZWN0RHN0LnRvcCwgMSApOwotICAgICAgICAgICAgWFNldEdyYXBoaWNzRXhwb3N1cmVzKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBGYWxzZSApOworICAgICAgICAgICAgVFNYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEZhbHNlICk7CiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgUEFUQ09QWTogIC8qIDB4ZjAgKi8KICAgICAgICAgaWYgKCFEQ19TZXR1cEdDRm9yQnJ1c2goIGRjRHN0ICkpIHJldHVybiBUUlVFOwotICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYY29weSApOwotICAgICAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGNEc3QtPnUueC5kcmF3YWJsZSwgZGNEc3QtPnUueC5nYywKKyAgICAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYY29weSApOworICAgICAgICBUU1hGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkY0RzdC0+dS54LmRyYXdhYmxlLCBkY0RzdC0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdERzdC5sZWZ0LCB2aXNSZWN0RHN0LnRvcCwgd2lkdGgsIGhlaWdodCApOwogICAgICAgICByZXR1cm4gVFJVRTsKIAogICAgIGNhc2UgV0hJVEVORVNTOiAgLyogMHhmZiAqLwogICAgICAgICBpZiAoKGRjRHN0LT53LmJpdHNQZXJQaXhlbCA9PSAxKSB8fCAhQ09MT1JfUGFsZXR0ZVRvUGl4ZWwpCi0gICAgICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYc2V0ICk7CisgICAgICAgICAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1hzZXQgKTsKICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYY29weSApOwotICAgICAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIAorICAgICAgICAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYY29weSApOworICAgICAgICAgICAgVFNYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfUGFsZXR0ZVRvUGl4ZWxbQ09MT1JfR2V0U3lzdGVtUGFsZXR0ZVNpemUoKSAtIDFdKTsKLSAgICAgICAgICAgIFhTZXRGaWxsU3R5bGUoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEZpbGxTb2xpZCApOworICAgICAgICAgICAgVFNYU2V0RmlsbFN0eWxlKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBGaWxsU29saWQgKTsKICAgICAgICAgfQotICAgICAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGNEc3QtPnUueC5kcmF3YWJsZSwgZGNEc3QtPnUueC5nYywKKyAgICAgICAgVFNYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGNEc3QtPnUueC5kcmF3YWJsZSwgZGNEc3QtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1JlY3REc3QubGVmdCwgdmlzUmVjdERzdC50b3AsIHdpZHRoLCBoZWlnaHQgKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgdG1wR0MgPSBYQ3JlYXRlR0MoIGRpc3BsYXksIGRjRHN0LT51LnguZHJhd2FibGUsIDAsIE5VTEwgKTsKLSAgICBwaXhtYXBzW0RTVF0gPSBYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LCB3aWR0aCwgaGVpZ2h0LAorICAgIHRtcEdDID0gVFNYQ3JlYXRlR0MoIGRpc3BsYXksIGRjRHN0LT51LnguZHJhd2FibGUsIDAsIE5VTEwgKTsKKyAgICBwaXhtYXBzW0RTVF0gPSBUU1hDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNEc3QtPncuYml0c1BlclBpeGVsICk7CiAgICAgaWYgKHVzZVNyYykKICAgICB7Ci0gICAgICAgIHBpeG1hcHNbU1JDXSA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csIHdpZHRoLCBoZWlnaHQsCisgICAgICAgIHBpeG1hcHNbU1JDXSA9IFRTWENyZWF0ZVBpeG1hcCggZGlzcGxheSwgcm9vdFdpbmRvdywgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNEc3QtPncuYml0c1BlclBpeGVsICk7CiAgICAgICAgIGlmIChmU3RyZXRjaCkKICAgICAgICAgICAgIEJJVEJMVF9HZXRTcmNBcmVhU3RyZXRjaCggZGNTcmMsIGRjRHN0LCBwaXhtYXBzW1NSQ10sIHRtcEdDLApAQCAtMTMwMCwxMyArMTMwMCwxMyBAQAogICAgIGZvciAob3Bjb2RlID0gQklUQkxUX09wY29kZXNbKHJvcCA+PiAxNikgJiAweGZmXTsgKm9wY29kZTsgb3Bjb2RlKyspCiAgICAgewogICAgICAgICBpZiAoT1BfRFNUKCpvcGNvZGUpID09IERTVCkgZGVzdFVzZWQgPSBUUlVFOwotICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIHRtcEdDLCBPUF9ST1AoKm9wY29kZSkgKTsKKyAgICAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIHRtcEdDLCBPUF9ST1AoKm9wY29kZSkgKTsKICAgICAgICAgc3dpdGNoKE9QX1NSQ0RTVCgqb3Bjb2RlKSkKICAgICAgICAgewogICAgICAgICBjYXNlIE9QX0FSR1MoRFNULFRNUCk6CiAgICAgICAgIGNhc2UgT1BfQVJHUyhTUkMsVE1QKToKICAgICAgICAgICAgIGlmICghcGl4bWFwc1tUTVBdKQotICAgICAgICAgICAgICAgIHBpeG1hcHNbVE1QXSA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCisgICAgICAgICAgICAgICAgcGl4bWFwc1tUTVBdID0gVFNYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNEc3QtPncuYml0c1BlclBpeGVsICk7CiAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KQEAgLTEzMTQsMzIgKzEzMTQsMzIgQEAKICAgICAgICAgY2FzZSBPUF9BUkdTKFNSQyxEU1QpOgogICAgICAgICBjYXNlIE9QX0FSR1MoVE1QLFNSQyk6CiAgICAgICAgIGNhc2UgT1BfQVJHUyhUTVAsRFNUKToKLSAgICAgICAgICAgIFhDb3B5QXJlYSggZGlzcGxheSwgcGl4bWFwc1tPUF9TUkMoKm9wY29kZSldLAorICAgICAgICAgICAgVFNYQ29weUFyZWEoIGRpc3BsYXksIHBpeG1hcHNbT1BfU1JDKCpvcGNvZGUpXSwKICAgICAgICAgICAgICAgICAgICAgICAgcGl4bWFwc1tPUF9EU1QoKm9wY29kZSldLCB0bXBHQywKICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgMCApOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPUF9BUkdTKFBBVCxUTVApOgogICAgICAgICAgICAgaWYgKCFwaXhtYXBzW1RNUF0gJiYgIWZOdWxsQnJ1c2gpCi0gICAgICAgICAgICAgICAgcGl4bWFwc1tUTVBdID0gWENyZWF0ZVBpeG1hcCggZGlzcGxheSwgcm9vdFdpbmRvdywKKyAgICAgICAgICAgICAgICBwaXhtYXBzW1RNUF0gPSBUU1hDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwgKTsKICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgICAgICBjYXNlIE9QX0FSR1MoUEFULERTVCk6CiAgICAgICAgIGNhc2UgT1BfQVJHUyhQQVQsU1JDKToKICAgICAgICAgICAgIGlmICghZk51bGxCcnVzaCkKLSAgICAgICAgICAgICAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgcGl4bWFwc1tPUF9EU1QoKm9wY29kZSldLAorICAgICAgICAgICAgICAgIFRTWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIHBpeG1hcHNbT1BfRFNUKCpvcGNvZGUpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wR0MsIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1hjb3B5ICk7CisgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYY29weSApOwogICAgIEJJVEJMVF9QdXREc3RBcmVhKCBkY0RzdCwgcGl4bWFwc1tkZXN0VXNlZCA/IERTVCA6IFNSQ10sCiAgICAgICAgICAgICAgICAgICAgICAgIGRjRHN0LT51LnguZ2MsICZ2aXNSZWN0RHN0ICk7Ci0gICAgWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcHNbRFNUXSApOwotICAgIGlmIChwaXhtYXBzW1NSQ10pIFhGcmVlUGl4bWFwKCBkaXNwbGF5LCBwaXhtYXBzW1NSQ10gKTsKLSAgICBpZiAocGl4bWFwc1tUTVBdKSBYRnJlZVBpeG1hcCggZGlzcGxheSwgcGl4bWFwc1tUTVBdICk7Ci0gICAgWEZyZWVHQyggZGlzcGxheSwgdG1wR0MgKTsKKyAgICBUU1hGcmVlUGl4bWFwKCBkaXNwbGF5LCBwaXhtYXBzW0RTVF0gKTsKKyAgICBpZiAocGl4bWFwc1tTUkNdKSBUU1hGcmVlUGl4bWFwKCBkaXNwbGF5LCBwaXhtYXBzW1NSQ10gKTsKKyAgICBpZiAocGl4bWFwc1tUTVBdKSBUU1hGcmVlUGl4bWFwKCBkaXNwbGF5LCBwaXhtYXBzW1RNUF0gKTsKKyAgICBUU1hGcmVlR0MoIGRpc3BsYXksIHRtcEdDICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9iaXRtYXAuYyBiL2dyYXBoaWNzL3gxMWRydi9iaXRtYXAuYwppbmRleCAzM2JmMWY2Li4xYzNjYjhiIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvYml0bWFwLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2JpdG1hcC5jCkBAIC02LDggKzYsOCBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKKyNpbmNsdWRlICJ0c194dXRpbC5oIgogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAiZGMuaCIKQEAgLTI3LDIwICsyNywyMCBAQAogICAgIAogICAgICAgLyogQ3JlYXRlIHRoZSBuZWNlc3NhcnkgR0NzICovCiAgICAgCi0gICAgaWYgKCh0bXBQaXhtYXAgPSBYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LCAxLCAxLCAxICkpKQorICAgIGlmICgodG1wUGl4bWFwID0gVFNYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LCAxLCAxLCAxICkpKQogICAgIHsKLQlCSVRNQVBfbW9ub0dDID0gWENyZWF0ZUdDKCBkaXNwbGF5LCB0bXBQaXhtYXAsIDAsIE5VTEwgKTsKLQlYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIEJJVE1BUF9tb25vR0MsIEZhbHNlICk7Ci0JWEZyZWVQaXhtYXAoIGRpc3BsYXksIHRtcFBpeG1hcCApOworCUJJVE1BUF9tb25vR0MgPSBUU1hDcmVhdGVHQyggZGlzcGxheSwgdG1wUGl4bWFwLCAwLCBOVUxMICk7CisJVFNYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIEJJVE1BUF9tb25vR0MsIEZhbHNlICk7CisJVFNYRnJlZVBpeG1hcCggZGlzcGxheSwgdG1wUGl4bWFwICk7CiAgICAgfQogCiAgICAgaWYgKHNjcmVlbkRlcHRoICE9IDEpCiAgICAgewotCWlmICgodG1wUGl4bWFwID0gWENyZWF0ZVBpeG1hcChkaXNwbGF5LCByb290V2luZG93LCAxLDEsc2NyZWVuRGVwdGgpKSkKKwlpZiAoKHRtcFBpeG1hcCA9IFRTWENyZWF0ZVBpeG1hcChkaXNwbGF5LCByb290V2luZG93LCAxLDEsc2NyZWVuRGVwdGgpKSkKIAl7Ci0JICAgIEJJVE1BUF9jb2xvckdDID0gWENyZWF0ZUdDKCBkaXNwbGF5LCB0bXBQaXhtYXAsIDAsIE5VTEwgKTsKLQkgICAgWFNldEdyYXBoaWNzRXhwb3N1cmVzKCBkaXNwbGF5LCBCSVRNQVBfY29sb3JHQywgRmFsc2UgKTsKLQkgICAgWEZyZWVQaXhtYXAoIGRpc3BsYXksIHRtcFBpeG1hcCApOworCSAgICBCSVRNQVBfY29sb3JHQyA9IFRTWENyZWF0ZUdDKCBkaXNwbGF5LCB0bXBQaXhtYXAsIDAsIE5VTEwgKTsKKwkgICAgVFNYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIEJJVE1BUF9jb2xvckdDLCBGYWxzZSApOworCSAgICBUU1hGcmVlUGl4bWFwKCBkaXNwbGF5LCB0bXBQaXhtYXAgKTsKIAl9CiAgICAgfQogICAgIHJldHVybiBUUlVFOwpAQCAtNzQsOCArNzQsOCBAQAogCiAgICAgaWYgKGRjLT53LmJpdHNQZXJQaXhlbCAhPSBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCkKICAgICB7Ci0JWEZyZWVHQyggZGlzcGxheSwgZGMtPnUueC5nYyApOwotCWRjLT51LnguZ2MgPSBYQ3JlYXRlR0MoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIDAsIE5VTEwgKTsKKwlUU1hGcmVlR0MoIGRpc3BsYXksIGRjLT51LnguZ2MgKTsKKwlkYy0+dS54LmdjID0gVFNYQ3JlYXRlR0MoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIDAsIE5VTEwgKTsKIAlkYy0+dy5iaXRzUGVyUGl4ZWwgPSBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbDsKICAgICAgICAgRENfSW5pdERDKCBkYyApOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9icnVzaC5jIGIvZ3JhcGhpY3MveDExZHJ2L2JydXNoLmMKaW5kZXggNWIzOGZhNi4uZWZiN2JiMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2JydXNoLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2JydXNoLmMKQEAgLTEyMiwxNSArMTIyLDE1IEBACiAJCWludCBkciA9ICgociArIGQpIC8gTUFUUklYX1NJWkVfMikgLyAyNTY7CiAJCWludCBkZyA9ICgoZyArIGQpIC8gTUFUUklYX1NJWkVfMikgLyAyNTY7CiAJCWludCBkYiA9ICgoYiArIGQpIC8gTUFUUklYX1NJWkVfMikgLyAyNTY7Ci0JCVhQdXRQaXhlbCggZGl0aGVySW1hZ2UsIHgsIHksIFBJWEVMX1ZBTFVFKGRyLGRnLGRiKSApOworCQlUU1hQdXRQaXhlbCggZGl0aGVySW1hZ2UsIHgsIHksIFBJWEVMX1ZBTFVFKGRyLGRnLGRiKSApOwogCSAgICB9CiAJfQogCXByZXZDb2xvciA9IGNvbG9yOwogICAgIH0KICAgICAKLSAgICBwaXhtYXAgPSBYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAorICAgIHBpeG1hcCA9IFRTWENyZWF0ZVBpeG1hcCggZGlzcGxheSwgcm9vdFdpbmRvdywKIAkJCSAgICBNQVRSSVhfU0laRSwgTUFUUklYX1NJWkUsIHNjcmVlbkRlcHRoICk7Ci0gICAgWFB1dEltYWdlKCBkaXNwbGF5LCBwaXhtYXAsIEJJVE1BUF9jb2xvckdDLCBkaXRoZXJJbWFnZSwgMCwgMCwKKyAgICBUU1hQdXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCBCSVRNQVBfY29sb3JHQywgZGl0aGVySW1hZ2UsIDAsIDAsCiAJICAgICAgIDAsIDAsIE1BVFJJWF9TSVpFLCBNQVRSSVhfU0laRSApOwogICAgIHJldHVybiBwaXhtYXA7CiB9CkBAIC0xNjgsMTYgKzE2OCwxNiBAQAogICAgIGlmICgoZGMtPncuYml0c1BlclBpeGVsID09IDEpICYmIChibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCAhPSAxKSkKICAgICB7CiAgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogYSBjb2xvciBwYXR0ZXJuIG9uIGEgbW9ub2Nocm9tZSBEQyAqLwotICAgICAgICBkYy0+dS54LmJydXNoLnBpeG1hcCA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csIDgsIDgsIDEgKTsKKyAgICAgICAgZGMtPnUueC5icnVzaC5waXhtYXAgPSBUU1hDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csIDgsIDgsIDEgKTsKICAgICAgICAgLyogRklYTUU6IHNob3VsZCBwcm9iYWJseSBjb252ZXJ0IHRvIG1vbm9jaHJvbWUgaW5zdGVhZCAqLwotICAgICAgICBYQ29weVBsYW5lKCBkaXNwbGF5LCBibXAtPnBpeG1hcCwgZGMtPnUueC5icnVzaC5waXhtYXAsCisgICAgICAgIFRTWENvcHlQbGFuZSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguYnJ1c2gucGl4bWFwLAogICAgICAgICAgICAgICAgICAgICBCSVRNQVBfbW9ub0dDLCAwLCAwLCA4LCA4LCAwLCAwLCAxICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGRjLT51LnguYnJ1c2gucGl4bWFwID0gWENyZWF0ZVBpeG1hcCggZGlzcGxheSwgcm9vdFdpbmRvdywKKyAgICAgICAgZGMtPnUueC5icnVzaC5waXhtYXAgPSBUU1hDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgOCwgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgKTsKLSAgICAgICAgWENvcHlBcmVhKCBkaXNwbGF5LCBibXAtPnBpeG1hcCwgZGMtPnUueC5icnVzaC5waXhtYXAsCisgICAgICAgIFRTWENvcHlBcmVhKCBkaXNwbGF5LCBibXAtPnBpeG1hcCwgZGMtPnUueC5icnVzaC5waXhtYXAsCiAgICAgICAgICAgICAgICAgICAgQklUTUFQX0dDKGJtcCksIDAsIDAsIDgsIDgsIDAsIDAgKTsKICAgICB9CiAgICAgCkBAIC0yMzQsNyArMjM0LDcgQEAKIAogICAgIGlmIChkYy0+dS54LmJydXNoLnBpeG1hcCkKICAgICB7Ci0JWEZyZWVQaXhtYXAoIGRpc3BsYXksIGRjLT51LnguYnJ1c2gucGl4bWFwICk7CisJVFNYRnJlZVBpeG1hcCggZGlzcGxheSwgZGMtPnUueC5icnVzaC5waXhtYXAgKTsKIAlkYy0+dS54LmJydXNoLnBpeG1hcCA9IDA7CiAgICAgfQogICAgIGRjLT51LnguYnJ1c2guc3R5bGUgPSBicnVzaC0+bG9nYnJ1c2gubGJTdHlsZTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogICAgICAgY2FzZSBCU19IQVRDSEVEOgogCWRwcmludGZfZ2RpKCBzdGRkZWIsICJCU19IQVRDSEVEXG4iICk7CiAJZGMtPnUueC5icnVzaC5waXhlbCA9IENPTE9SX1RvUGh5c2ljYWwoIGRjLCBicnVzaC0+bG9nYnJ1c2gubGJDb2xvciApOwotCWRjLT51LnguYnJ1c2gucGl4bWFwID0gWENyZWF0ZUJpdG1hcEZyb21EYXRhKCBkaXNwbGF5LCByb290V2luZG93LAorCWRjLT51LnguYnJ1c2gucGl4bWFwID0gVFNYQ3JlYXRlQml0bWFwRnJvbURhdGEoIGRpc3BsYXksIHJvb3RXaW5kb3csCiAJCQkJIEhhdGNoQnJ1c2hlc1ticnVzaC0+bG9nYnJ1c2gubGJIYXRjaF0sIDgsIDggKTsKIAlkYy0+dS54LmJydXNoLmZpbGxTdHlsZSA9IEZpbGxTdGlwcGxlZDsKIAlicmVhazsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9jbGlwcGluZy5jIGIvZ3JhcGhpY3MveDExZHJ2L2NsaXBwaW5nLmMKaW5kZXggZDZjYmMwOC4uYTc3OGMxZSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2NsaXBwaW5nLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2NsaXBwaW5nLmMKQEAgLTE1LDcgKzE1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFgxMURSVl9TZXREZXZpY2VDbGlwcGluZwogICogICAgICAgICAgIENvcHkgUkVDVDMycyB0byBhIHRlbXBvcmFyeSBidWZmZXIgb2YgWFJlY3RhbmdsZXMgYW5kIGNhbGwKLSAqICAgICAgICAgICBYU2V0Q2xpcFJlY3RhbmdsZXMoKS4KKyAqICAgICAgICAgICBUU1hTZXRDbGlwUmVjdGFuZ2xlcygpLgogICoKICAqICAgICAgICAgICBDb3VsZCB3cml0ZSB1c2luZyBHZXRSZWdpb25EYXRhIGJ1dCB0aGlzIHdvdWxkIGJlIHNsb3dlci4KICAqLwpAQCAtNTQsNyArNTQsNyBAQAogICAgIGVsc2UKICAgICAgICAgcFhyZWN0ID0gTlVMTDsKIAotICAgIFhTZXRDbGlwUmVjdGFuZ2xlcyggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncuRENPcmdYLCBkYy0+dy5EQ09yZ1ksIAorICAgIFRTWFNldENsaXBSZWN0YW5nbGVzKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy5EQ09yZ1gsIGRjLT53LkRDT3JnWSwgCiAgICAgICAgICAgICAgICAgcFhyZWN0LCBvYmotPnJnbi0+bnVtUmVjdHMsIFlYQmFuZGVkICk7CiAKICAgICBpZihwWHJlY3QpCmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYyBiL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCmluZGV4IGFmM2ZkOTQuLmNkYjEwNzMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCkBAIC05LDggKzksOCBAQAogI2luY2x1ZGUgPGZsb2F0Lmg+CiAjZW5kaWYKICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKKyNpbmNsdWRlICJ0c194dXRpbC5oIgogI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KICNpZm5kZWYgUEkKICNkZWZpbmUgUEkgTV9QSQpAQCAtNTYsNyArNTYsNyBAQAogWDExRFJWX0xpbmVUbyggREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5ICkKIHsKICAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbiggZGMgKSkKLQlYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCiAJCSAgZGMtPncuRENPcmdYICsgWExQVE9EUCggZGMsIGRjLT53LkN1cnNQb3NYICksCiAJCSAgZGMtPncuRENPcmdZICsgWUxQVE9EUCggZGMsIGRjLT53LkN1cnNQb3NZICksCiAJCSAgZGMtPncuRENPcmdYICsgWExQVE9EUCggZGMsIHggKSwKQEAgLTEwOSw4ICsxMDksOCBAQAogCiAgICAgaWYgKChsaW5lcyA+IDApICYmIERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSkKICAgICB7Ci0gICAgICAgIFhTZXRBcmNNb2RlKCBkaXNwbGF5LCBkYy0+dS54LmdjLCAobGluZXM9PTEpID8gQXJjQ2hvcmQgOiBBcmNQaWVTbGljZSk7Ci0gICAgICAgIFhGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICBUU1hTZXRBcmNNb2RlKCBkaXNwbGF5LCBkYy0+dS54LmdjLCAobGluZXM9PTEpID8gQXJjQ2hvcmQgOiBBcmNQaWVTbGljZSk7CisgICAgICAgIFRTWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKICAgICAgICAgICAgICAgICAgcmlnaHQtbGVmdC0xLCBib3R0b20tdG9wLTEsIGlzdGFydF9hbmdsZSwgaWRpZmZfYW5nbGUgKTsKICAgICB9CkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICAgIC8qIERyYXcgYXJjIGFuZCBsaW5lcyAqLwogCiAgICAgaWYgKCFEQ19TZXR1cEdDRm9yUGVuKCBkYyApKSByZXR1cm4gVFJVRTsKLSAgICBYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICBUU1hEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogCSAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKIAkgICAgICByaWdodC1sZWZ0LTEsIGJvdHRvbS10b3AtMSwgaXN0YXJ0X2FuZ2xlLCBpZGlmZl9hbmdsZSApOwogICAgIGlmICghbGluZXMpIHJldHVybiBUUlVFOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJcG9pbnRzWzFdLnggPSBkYy0+dy5EQ09yZ1ggKyB4Y2VudGVyOwogCXBvaW50c1sxXS55ID0gZGMtPncuRENPcmdZICsgeWNlbnRlcjsKICAgICB9Ci0gICAgWERyYXdMaW5lcyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICBUU1hEcmF3TGluZXMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAJICAgICAgICBwb2ludHMsIGxpbmVzKzEsIENvb3JkTW9kZU9yaWdpbiApOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMjAwLDExICsyMDAsMTEgQEAKICAgICB9CiAKICAgICBpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQotCVhGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCVRTWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAJCSAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgdG9wLAogCQkgIHJpZ2h0LWxlZnQtMSwgYm90dG9tLXRvcC0xLCAwLCAzNjAqNjQgKTsKICAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbiggZGMgKSkKLQlYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKwlUU1hEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogCQkgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKIAkJICByaWdodC1sZWZ0LTEsIGJvdHRvbS10b3AtMSwgMCwgMzYwKjY0ICk7CiAgICAgcmV0dXJuIFRSVUU7CkBAIC0yMjksNyArMjI5LDcgQEAKICAgICBpZiAoKGxlZnQgPT0gcmlnaHQpIHx8ICh0b3AgPT0gYm90dG9tKSkKICAgICB7CiAJaWYgKERDX1NldHVwR0NGb3JQZW4oIGRjICkpCi0JICAgIFhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKKwkgICAgVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCiAJCSAgZGMtPncuRENPcmdYICsgbGVmdCwKIAkJICBkYy0+dy5EQ09yZ1kgKyB0b3AsCiAJCSAgZGMtPncuRENPcmdYICsgcmlnaHQsCkBAIC0yNTIsMTMgKzI1MiwxMyBAQAogICAgIGlmICgocmlnaHQgPiBsZWZ0ICsgd2lkdGgpICYmIChib3R0b20gPiB0b3AgKyB3aWR0aCkpCiAgICAgewogICAgICAgICBpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQotICAgICAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICBUU1hGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQgKyAod2lkdGggKyAxKSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgdG9wICsgKHdpZHRoICsgMSkgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LWxlZnQtd2lkdGgtMSwgYm90dG9tLXRvcC13aWR0aC0xKTsKICAgICB9CiAgICAgaWYgKERDX1NldHVwR0NGb3JQZW4oIGRjICkpCi0JWERyYXdSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJVFNYRHJhd1JlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKIAkJICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyB0b3AsCiAJCSAgICAgICAgcmlnaHQtbGVmdC0xLCBib3R0b20tdG9wLTEgKTsKICAgICByZXR1cm4gVFJVRTsKQEAgLTI5MiwzNCArMjkyLDM0IEBACiAgICAgewogICAgICAgICBpZiAoZWxsX3dpZHRoICYmIGVsbF9oZWlnaHQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFhGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgVFNYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCA5MCAqIDY0LCA5MCAqIDY0ICk7Ci0gICAgICAgICAgICBYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgIFRTWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDE4MCAqIDY0LCA5MCAqIDY0ICk7Ci0gICAgICAgICAgICBYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgIFRTWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDI3MCAqIDY0LCA5MCAqIDY0ICk7Ci0gICAgICAgICAgICBYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgIFRTWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGgsIGRjLT53LkRDT3JnWSArIHRvcCwKICAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDAsIDkwICogNjQgKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZWxsX3dpZHRoIDwgcmlnaHQgLSBsZWZ0KQogICAgICAgICB7Ci0gICAgICAgICAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgIFRTWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCAtIGVsbF93aWR0aCwgZWxsX2hlaWdodCAvIDIgKTsKLSAgICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgVFNYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0ICsgZWxsX3dpZHRoIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSAoZWxsX2hlaWdodCsxKSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgLSBsZWZ0IC0gZWxsX3dpZHRoLCAoZWxsX2hlaWdodCsxKSAvIDIgKTsKICAgICAgICAgfQogICAgICAgICBpZiAgKGVsbF9oZWlnaHQgPCBib3R0b20gLSB0b3ApCiAgICAgICAgIHsKLSAgICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgVFNYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCArIGVsbF9oZWlnaHQgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wIC0gZWxsX2hlaWdodCApOwpAQCAtMzI5LDI4ICszMjksMjggQEAKICAgICB7CiAgICAgICAgIGlmIChlbGxfd2lkdGggJiYgZWxsX2hlaWdodCkKICAgICAgICAgewotICAgICAgICAgICAgWERyYXdBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICBUU1hEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKICAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDkwICogNjQsIDkwICogNjQgKTsKLSAgICAgICAgICAgIFhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgVFNYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMTgwICogNjQsIDkwICogNjQgKTsKLSAgICAgICAgICAgIFhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgVFNYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMjcwICogNjQsIDkwICogNjQgKTsKLSAgICAgICAgICAgIFhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgVFNYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCwgZGMtPncuRENPcmdZICsgdG9wLAogICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMCwgOTAgKiA2NCApOwogCX0KICAgICAgICAgaWYgKGVsbF93aWR0aCA8IHJpZ2h0IC0gbGVmdCkKICAgICAgICAgewotICAgICAgICAgICAgWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKKyAgICAgICAgICAgIFRTWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGggLyAyLAogICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKTsKLSAgICAgICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisgICAgICAgICAgICBUU1hEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCiAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQgKyBlbGxfd2lkdGggLyAyLAogICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoIC8gMiwKQEAgLTM1OCwxMiArMzU4LDEyIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGVsbF9oZWlnaHQgPCBib3R0b20gLSB0b3ApCiAgICAgICAgIHsKLSAgICAgICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisgICAgICAgICAgICBUU1hEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCiAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIGVsbF9oZWlnaHQgLyAyICk7Ci0gICAgICAgICAgICBYRHJhd0xpbmUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAorICAgICAgICAgICAgVFNYRHJhd0xpbmUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAogICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwKQEAgLTM4Niw5ICszODYsOSBAQAogICAgIHkgPSBkYy0+dy5EQ09yZ1kgKyBZTFBUT0RQKCBkYywgeSApOwogICAgIHBpeGVsID0gQ09MT1JfVG9QaHlzaWNhbCggZGMsIGNvbG9yICk7CiAgICAgCi0gICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIHBpeGVsICk7Ci0gICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBHWGNvcHkgKTsKLSAgICBYRHJhd1BvaW50KCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCB4LCB5ICk7CisgICAgVFNYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgcGl4ZWwgKTsKKyAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgZGMtPnUueC5nYywgR1hjb3B5ICk7CisgICAgVFNYRHJhd1BvaW50KCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCB4LCB5ICk7CiAKICAgICAvKiBpbmVmZmljaWVudCBidXQgc2ltcGxlLi4uICovCiAKQEAgLTQxMCwyMSArNDEwLDIxIEBACiAgICAgeSA9IGRjLT53LkRDT3JnWSArIFlMUFRPRFAoIGRjLCB5ICk7CiAgICAgaWYgKGRjLT53LmZsYWdzICYgRENfTUVNT1JZKQogICAgIHsKLSAgICAgICAgaW1hZ2UgPSBYR2V0SW1hZ2UoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIHgsIHksIDEsIDEsCisgICAgICAgIGltYWdlID0gVFNYR2V0SW1hZ2UoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIHgsIHksIDEsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxQbGFuZXMsIFpQaXhtYXAgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgLyogSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgc2NyZWVuLCB1c2UgYSB0ZW1wb3JhcnkgY29weSAqLwogICAgICAgICAvKiB0byBhdm9pZCBhIEJhZE1hdGNoIGVycm9yICovCi0gICAgICAgIGlmICghcGl4bWFwKSBwaXhtYXAgPSBYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAorICAgICAgICBpZiAoIXBpeG1hcCkgcGl4bWFwID0gVFNYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgZGMtPncuYml0c1BlclBpeGVsICk7Ci0gICAgICAgIFhDb3B5QXJlYSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgcGl4bWFwLCBCSVRNQVBfY29sb3JHQywKKyAgICAgICAgVFNYQ29weUFyZWEoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIHBpeG1hcCwgQklUTUFQX2NvbG9yR0MsCiAgICAgICAgICAgICAgICAgICAgeCwgeSwgMSwgMSwgMCwgMCApOwotICAgICAgICBpbWFnZSA9IFhHZXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCAwLCAwLCAxLCAxLCBBbGxQbGFuZXMsIFpQaXhtYXAgKTsKKyAgICAgICAgaW1hZ2UgPSBUU1hHZXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCAwLCAwLCAxLCAxLCBBbGxQbGFuZXMsIFpQaXhtYXAgKTsKICAgICB9Ci0gICAgcGl4ZWwgPSBYR2V0UGl4ZWwoIGltYWdlLCAwLCAwICk7Ci0gICAgWERlc3Ryb3lJbWFnZSggaW1hZ2UgKTsKKyAgICBwaXhlbCA9IFRTWEdldFBpeGVsKCBpbWFnZSwgMCwgMCApOworICAgIFRTWERlc3Ryb3lJbWFnZSggaW1hZ2UgKTsKICAgICAKICAgICByZXR1cm4gQ09MT1JfVG9Mb2dpY2FsKHBpeGVsKTsKIH0KQEAgLTQ2MSw3ICs0NjEsNyBAQAogCiAgICAgR2V0UmduQm94MzIoIGRjLT53LmhHQ0NsaXBSZ24sICZib3ggKTsKICAgICBpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQotCVhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCVRTWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAJCSAgICAgICAgZGMtPncuRENPcmdYICsgYm94LmxlZnQsIGRjLT53LkRDT3JnWSArIGJveC50b3AsCiAJCSAgICAgICAgYm94LnJpZ2h0LWJveC5sZWZ0LCBib3guYm90dG9tLWJveC50b3AgKTsKIApAQCAtNDgxLDcgKzQ4MSw3IEBACiAKICAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbiggZGMgKSkKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQtMTsgaSArKykKLQkgICAgWERyYXdMaW5lIChkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAgCisJICAgIFRTWERyYXdMaW5lIChkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAgCiAJCSAgICAgICBkYy0+dy5EQ09yZ1ggKyBYTFBUT0RQKGRjLCBwdCBbaV0ueCksCiAJCSAgICAgICBkYy0+dy5EQ09yZ1kgKyBZTFBUT0RQKGRjLCBwdCBbaV0ueSksCiAJCSAgICAgICBkYy0+dy5EQ09yZ1ggKyBYTFBUT0RQKGRjLCBwdCBbaSsxXS54KSwKQEAgLTUwOCwxMSArNTA4LDExIEBACiAgICAgcG9pbnRzW2NvdW50XSA9IHBvaW50c1swXTsKIAogICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCi0JWEZpbGxQb2x5Z29uKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCVRTWEZpbGxQb2x5Z29uKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogCQkgICAgIHBvaW50cywgY291bnQrMSwgQ29tcGxleCwgQ29vcmRNb2RlT3JpZ2luKTsKIAogICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuICggZGMgKSkKLQlYRHJhd0xpbmVzKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCVRTWERyYXdMaW5lcyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKIAkJICAgcG9pbnRzLCBjb3VudCsxLCBDb29yZE1vZGVPcmlnaW4gKTsKIAogICAgIGZyZWUoIHBvaW50cyApOwpAQCAtNTU1LDcgKzU1NSw3IEBACiAJCXB0Kys7CiAJICAgIH0KIAkgICAgcG9pbnRzW2pdID0gcG9pbnRzWzBdOwotCSAgICBYRHJhd0xpbmVzKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCSAgICBUU1hEcmF3TGluZXMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAJCSAgICAgICAgcG9pbnRzLCBqICsgMSwgQ29vcmRNb2RlT3JpZ2luICk7CiAJfQogCWZyZWUoIHBvaW50cyApOwpAQCAtNTc5LDggKzU3OSw4IEBACiAgICAgaW50IGxlZnQsIHJpZ2h0OwogCiAjZGVmaW5lIFRPX0ZMT09EKHgseSkgICgoZmlsbFR5cGUgPT0gRkxPT0RGSUxMQk9SREVSKSA/IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChYR2V0UGl4ZWwoaW1hZ2UseCx5KSAhPSBwaXhlbCkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoWEdldFBpeGVsKGltYWdlLHgseSkgPT0gcGl4ZWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgKFRTWEdldFBpeGVsKGltYWdlLHgseSkgIT0gcGl4ZWwpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgKFRTWEdldFBpeGVsKGltYWdlLHgseSkgPT0gcGl4ZWwpKQogCiAgICAgaWYgKCFUT19GTE9PRCh4LHkpKSByZXR1cm47CiAKQEAgLTU4OSwxNSArNTg5LDE1IEBACiAgICAgbGVmdCA9IHJpZ2h0ID0geDsKICAgICB3aGlsZSAoKGxlZnQgPiAwKSAmJiBUT19GTE9PRCggbGVmdC0xLCB5ICkpIGxlZnQtLTsKICAgICB3aGlsZSAoKHJpZ2h0IDwgaW1hZ2UtPndpZHRoKSAmJiBUT19GTE9PRCggcmlnaHQsIHkgKSkgcmlnaHQrKzsKLSAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICBUU1hGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICB4T3JnICsgbGVmdCwgeU9yZyArIHksIHJpZ2h0LWxlZnQsIDEgKTsKIAogICAgICAgLyogU2V0IHRoZSBwaXhlbHMgb2YgdGhpcyBsaW5lIHNvIHdlIGRvbid0IGZpbGwgaXQgYWdhaW4gKi8KIAogICAgIGZvciAoeCA9IGxlZnQ7IHggPCByaWdodDsgeCsrKQogICAgIHsKLSAgICAgICAgaWYgKGZpbGxUeXBlID09IEZMT09ERklMTEJPUkRFUikgWFB1dFBpeGVsKCBpbWFnZSwgeCwgeSwgcGl4ZWwgKTsKLSAgICAgICAgZWxzZSBYUHV0UGl4ZWwoIGltYWdlLCB4LCB5LCB+cGl4ZWwgKTsKKyAgICAgICAgaWYgKGZpbGxUeXBlID09IEZMT09ERklMTEJPUkRFUikgVFNYUHV0UGl4ZWwoIGltYWdlLCB4LCB5LCBwaXhlbCApOworICAgICAgICBlbHNlIFRTWFB1dFBpeGVsKCBpbWFnZSwgeCwgeSwgfnBpeGVsICk7CiAgICAgfQogCiAgICAgICAvKiBGaWxsIHRoZSBsaW5lIGFib3ZlICovCkBAIC02NTYsNyArNjU2LDcgQEAKIAogICAgIGlmIChHZXRSZ25Cb3gzMiggZGMtPncuaEdDQ2xpcFJnbiwgJnJlY3QgKSA9PSBFUlJPUikgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKCEoaW1hZ2UgPSBYR2V0SW1hZ2UoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsCisgICAgaWYgKCEoaW1hZ2UgPSBUU1hHZXRJbWFnZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmVjdC5sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyByZWN0LnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwKQEAgLTY2Niw3ICs2NjYsNyBAQAogICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCiAgICAgewogICAgICAgICAgIC8qIFJPUCBtb2RlIGlzIGFsd2F5cyBHWGNvcHkgZm9yIGZsb29kLWZpbGwgKi8KLSAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBHWGNvcHkgKTsKKyAgICAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOwogICAgICAgICBYMTFEUlZfSW50ZXJuYWxGbG9vZEZpbGwoaW1hZ2UsIGRjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWExQVE9EUChkYyxwYXJhbXMtPngpIC0gcmVjdC5sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUxQVE9EUChkYyxwYXJhbXMtPnkpIC0gcmVjdC50b3AsCkBAIC02NzYsNyArNjc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZmlsbFR5cGUgKTsKICAgICB9CiAKLSAgICBYRGVzdHJveUltYWdlKCBpbWFnZSApOworICAgIFRTWERlc3Ryb3lJbWFnZSggaW1hZ2UgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3gxMWRydi9pbml0LmMKaW5kZXggZTQxNTEwNC4uODBlYTA0YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy94MTFkcnYvaW5pdC5jCkBAIC01LDYgKzUsNyBAQAogICovCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ0c3gxMWRlZnMuaCIKICNpbmNsdWRlICJ4MTFkcnYuaCIKICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgImJpdG1hcC5oIgpAQCAtMTA4LDYgKzEwOSw4IEBACiAgKi8KIEJPT0wzMiBYMTFEUlZfSW5pdCh2b2lkKQogeworICAgIGlmICghVFNYMTFfSW5pdCgpKSByZXR1cm4gRkFMU0U7CisKICAgICAvKiBGSVhNRTogY29sb3JtYXAgbWFuYWdlbWVudCBzaG91bGQgYmUgbWVyZ2VkIHdpdGggdGhlIFgxMURSViAqLwogCiAgICAgaWYoICFDT0xPUl9Jbml0KCkgKSByZXR1cm4gRkFMU0U7CkBAIC0xNzMsNyArMTc2LDcgQEAKICAgICAgICAgQklUTUFQT0JKICpibXAgPSAoQklUTUFQT0JKICopIEdESV9HZXRPYmpQdHIoIGRjLT53LmhCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRNQVBfTUFHSUMgKTsKICAgICAgICAgcGh5c0Rldi0+ZHJhd2FibGUgID0gYm1wLT5waXhtYXA7Ci0gICAgICAgIHBoeXNEZXYtPmdjICAgICAgICA9IFhDcmVhdGVHQyggZGlzcGxheSwgcGh5c0Rldi0+ZHJhd2FibGUsIDAsIE5VTEwgKTsKKyAgICAgICAgcGh5c0Rldi0+Z2MgICAgICAgID0gVFNYQ3JlYXRlR0MoIGRpc3BsYXksIHBoeXNEZXYtPmRyYXdhYmxlLCAwLCBOVUxMICk7CiAgICAgICAgIGRjLT53LmJpdHNQZXJQaXhlbCA9IGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsOwogICAgICAgICBkYy0+dy5oVmlzUmduICAgICAgPSBDcmVhdGVSZWN0UmduMzIoIDAsIDAsIGJtcC0+Yml0bWFwLmJtV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wLT5iaXRtYXAuYm1IZWlnaHQgKTsKQEAgLTE4MiwxOSArMTg1LDE5IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgcGh5c0Rldi0+ZHJhd2FibGUgID0gcm9vdFdpbmRvdzsKLSAgICAgICAgcGh5c0Rldi0+Z2MgICAgICAgID0gWENyZWF0ZUdDKCBkaXNwbGF5LCBwaHlzRGV2LT5kcmF3YWJsZSwgMCwgTlVMTCApOworICAgICAgICBwaHlzRGV2LT5nYyAgICAgICAgPSBUU1hDcmVhdGVHQyggZGlzcGxheSwgcGh5c0Rldi0+ZHJhd2FibGUsIDAsIE5VTEwgKTsKICAgICAgICAgZGMtPncuYml0c1BlclBpeGVsID0gc2NyZWVuRGVwdGg7CiAgICAgICAgIGRjLT53LmhWaXNSZ24gICAgICA9IENyZWF0ZVJlY3RSZ24zMiggMCwgMCwgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7CiAgICAgfQogCiAgICAgaWYgKCFkYy0+dy5oVmlzUmduKQogICAgIHsKLSAgICAgICAgWEZyZWVHQyggZGlzcGxheSwgcGh5c0Rldi0+Z2MgKTsKKyAgICAgICAgVFNYRnJlZUdDKCBkaXNwbGF5LCBwaHlzRGV2LT5nYyApOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCi0gICAgWFNldEdyYXBoaWNzRXhwb3N1cmVzKCBkaXNwbGF5LCBwaHlzRGV2LT5nYywgRmFsc2UgKTsKLSAgICBYU2V0U3Vid2luZG93TW9kZSggZGlzcGxheSwgcGh5c0Rldi0+Z2MsIEluY2x1ZGVJbmZlcmlvcnMgKTsKKyAgICBUU1hTZXRHcmFwaGljc0V4cG9zdXJlcyggZGlzcGxheSwgcGh5c0Rldi0+Z2MsIEZhbHNlICk7CisgICAgVFNYU2V0U3Vid2luZG93TW9kZSggZGlzcGxheSwgcGh5c0Rldi0+Z2MsIEluY2x1ZGVJbmZlcmlvcnMgKTsKIAogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMjA2LDcgKzIwOSw3IEBACiBzdGF0aWMgQk9PTDMyIFgxMURSVl9EZWxldGVEQyggREMgKmRjICkKIHsKICAgICBYMTFEUlZfUERFVklDRSAqcGh5c0RldiA9IChYMTFEUlZfUERFVklDRSAqKWRjLT5waHlzRGV2OwotICAgIFhGcmVlR0MoIGRpc3BsYXksIHBoeXNEZXYtPmdjICk7CisgICAgVFNYRnJlZUdDKCBkaXNwbGF5LCBwaHlzRGV2LT5nYyApOwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvdGV4dC5jIGIvZ3JhcGhpY3MveDExZHJ2L3RleHQuYwppbmRleCAzNTdkOGUyLi5jZDc2OTc0IDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvdGV4dC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKQEAgLTUsNyArNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSAidHNfeGxpYi5oIgogI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJkYy5oIgpAQCAtOTQsOCArOTQsOCBAQAogCiAgICAgaWYgKGZsYWdzICYgRVRPX09QQVFVRSkKICAgICB7Ci0gICAgICAgIFhTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKLSAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgIFRTWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LmJhY2tncm91bmRQaXhlbCApOworICAgICAgICBUU1hGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmVjdC5sZWZ0LCBkYy0+dy5EQ09yZ1kgKyByZWN0LnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LCByZWN0LmJvdHRvbS1yZWN0LnRvcCApOwogICAgIH0KQEAgLTExMSw3ICsxMTEsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotCVhUZXh0RXh0ZW50cyggZm9udCwgc3RyLCBjb3VudCwgJmRpciwgJmFzY2VudCwgJmRlc2NlbnQsICZpbmZvICk7CisJVFNYVGV4dEV4dGVudHMoIGZvbnQsIHN0ciwgY291bnQsICZkaXIsICZhc2NlbnQsICZkZXNjZW50LCAmaW5mbyApOwogICAgICAgICBpbmZvLndpZHRoICs9IGNvdW50KmRjLT53LmNoYXJFeHRyYSArIGRjLT53LmJyZWFrRXh0cmEqZGMtPncuYnJlYWtDb3VudDsKICAgICB9CiAKQEAgLTE2Niw4ICsxNjYsOCBAQAogICAgICAgICAgICAgICAgICh5LWZvbnQtPmFzY2VudCA8IHJlY3QudG9wKSB8fAogICAgICAgICAgICAgICAgICh5K2ZvbnQtPmRlc2NlbnQgPj0gcmVjdC5ib3R0b20pKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKLSAgICAgICAgICAgICAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICBUU1hTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKKyAgICAgICAgICAgICAgICBUU1hGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB5IC0gZm9udC0+YXNjZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLndpZHRoLApAQCAtMTc4LDEwICsxNzgsMTAgQEAKICAgICAKICAgICAvKiBEcmF3IHRoZSB0ZXh0IChjb3VudCA+IDAgdmVyaWZpZWQpICovCiAKLSAgICBYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncudGV4dFBpeGVsICk7CisgICAgVFNYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncudGV4dFBpeGVsICk7CiAgICAgaWYgKCFkYy0+dy5jaGFyRXh0cmEgJiYgIWRjLT53LmJyZWFrRXh0cmEgJiYgIWxwRHgpCiAgICAgewotICAgICAgICBYRHJhd1N0cmluZyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisgICAgICAgIFRTWERyYXdTdHJpbmcoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAogICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgeCwgZGMtPncuRENPcmdZICsgeSwgc3RyLCBjb3VudCApOwogICAgIH0KICAgICBlbHNlICAvKiBOb3cgdGhlIGZ1biBiZWdpbnMuLi4gKi8KQEAgLTIxNCw3ICsyMTQsNyBAQAogCQlkbwogCQl7CiAJCSAgICBkZWx0YSArPSAobHBEeFtpXSAqIGRjLT52cG9ydEV4dFggKyBleHRyYSkgLyBkYy0+d25kRXh0WAotCQkJCQkgICAgLSBYVGV4dFdpZHRoKCBmb250LCBzdHIgKyBpLCAxKTsKKwkJCQkJICAgIC0gVFNYVGV4dFdpZHRoKCBmb250LCBzdHIgKyBpLCAxKTsKIAkJICAgIHBpdGVtLT5uY2hhcnMrKzsKIAkJfSB3aGlsZSAoKCsraSA8IGNvdW50KSAmJiAhZGVsdGEpOwogCQlwaXRlbSsrOwpAQCAtMjQwLDcgKzI0MCw3IEBACiAgICAgICAgICAgICB9IAogICAgICAgICB9CiAKLSAgICAgICAgWERyYXdUZXh0KCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICBUU1hEcmF3VGV4dCggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyB4LCBkYy0+dy5EQ09yZ1kgKyB5LCBpdGVtcywgcGl0ZW0gLSBpdGVtcyApOwogICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgaXRlbXMgKTsKICAgICB9CkBAIC0yNTEsMjcgKzI1MSwyNyBAQAogICAgIHsKIAlsb25nIGxpbmVQb3MsIGxpbmVXaWR0aDsgICAgICAgCiAKLQlpZiAoIVhHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1VOREVSTElORV9QT1NJVElPTiwgJmxpbmVQb3MgKSkKKwlpZiAoIVRTWEdldEZvbnRQcm9wZXJ0eSggZm9udCwgWEFfVU5ERVJMSU5FX1BPU0lUSU9OLCAmbGluZVBvcyApKQogCSAgICBsaW5lUG9zID0gZm9udC0+ZGVzY2VudC0xOwotCWlmICghWEdldEZvbnRQcm9wZXJ0eSggZm9udCwgWEFfVU5ERVJMSU5FX1RISUNLTkVTUywgJmxpbmVXaWR0aCApKQorCWlmICghVFNYR2V0Rm9udFByb3BlcnR5KCBmb250LCBYQV9VTkRFUkxJTkVfVEhJQ0tORVNTLCAmbGluZVdpZHRoICkpCiAJICAgIGxpbmVXaWR0aCA9IDA7CiAJZWxzZSBpZiAobGluZVdpZHRoID09IDEpIGxpbmVXaWR0aCA9IDA7Ci0JWFNldExpbmVBdHRyaWJ1dGVzKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBsaW5lV2lkdGgsCisJVFNYU2V0TGluZUF0dHJpYnV0ZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIGxpbmVXaWR0aCwKIAkJCSAgICBMaW5lU29saWQsIENhcFJvdW5kLCBKb2luQmV2ZWwgKTsgCi0gICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgVFNYRHJhd0xpbmUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAJCSAgIGRjLT53LkRDT3JnWCArIHgsIGRjLT53LkRDT3JnWSArIHkgKyBsaW5lUG9zLAogCQkgICBkYy0+dy5EQ09yZ1ggKyB4ICsgaW5mby53aWR0aCwgZGMtPncuRENPcmdZICsgeSArIGxpbmVQb3MgKTsKICAgICB9CiAgICAgaWYgKGxmU3RyaWtlT3V0KQogICAgIHsKIAlsb25nIGxpbmVBc2NlbnQsIGxpbmVEZXNjZW50OwotCWlmICghWEdldEZvbnRQcm9wZXJ0eSggZm9udCwgWEFfU1RSSUtFT1VUX0FTQ0VOVCwgJmxpbmVBc2NlbnQgKSkKKwlpZiAoIVRTWEdldEZvbnRQcm9wZXJ0eSggZm9udCwgWEFfU1RSSUtFT1VUX0FTQ0VOVCwgJmxpbmVBc2NlbnQgKSkKIAkgICAgbGluZUFzY2VudCA9IGZvbnQtPmFzY2VudCAvIDI7Ci0JaWYgKCFYR2V0Rm9udFByb3BlcnR5KCBmb250LCBYQV9TVFJJS0VPVVRfREVTQ0VOVCwgJmxpbmVEZXNjZW50ICkpCisJaWYgKCFUU1hHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1NUUklLRU9VVF9ERVNDRU5ULCAmbGluZURlc2NlbnQgKSkKIAkgICAgbGluZURlc2NlbnQgPSAtbGluZUFzY2VudCAqIDIgLyAzOwotCVhTZXRMaW5lQXR0cmlidXRlcyggZGlzcGxheSwgZGMtPnUueC5nYywgbGluZUFzY2VudCArIGxpbmVEZXNjZW50LAorCVRTWFNldExpbmVBdHRyaWJ1dGVzKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBsaW5lQXNjZW50ICsgbGluZURlc2NlbnQsCiAJCQkgICAgTGluZVNvbGlkLCBDYXBSb3VuZCwgSm9pbkJldmVsICk7IAotCVhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKwlUU1hEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKIAkJICAgZGMtPncuRENPcmdYICsgeCwgZGMtPncuRENPcmdZICsgeSAtIGxpbmVBc2NlbnQsCiAJCSAgIGRjLT53LkRDT3JnWCArIHggKyBpbmZvLndpZHRoLCBkYy0+dy5EQ09yZ1kgKyB5IC0gbGluZUFzY2VudCApOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi94Zm9udC5jIGIvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMKaW5kZXggYmUzYmI2Ni4uMWE5OWI3ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlICJ0c194bGliLmgiCiAjaW5jbHVkZSA8WDExL1hhdG9tLmg+CiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKQEAgLTU0Myw3ICs1NDMsNyBAQAogICAgIEJPT0wzMiBiSGF2ZUNhcEhlaWdodCA9IChwRkktPmRmQ2hhclNldCA9PSBBTlNJX0NIQVJTRVQgJiYgJ1gnID49IG1pbiAmJiAnWCcgPD0gbWF4ICk7CiAKICAgICBpZiggcEVMICkgKnBFTCA9IDA7Ci0gICAgaWYoIFhHZXRGb250UHJvcGVydHkoeF9mcywgWEFfQ0FQX0hFSUdIVCwgJmhlaWdodCkgPT0gRmFsc2UgKQorICAgIGlmKCBUU1hHZXRGb250UHJvcGVydHkoeF9mcywgWEFfQ0FQX0hFSUdIVCwgJmhlaWdodCkgPT0gRmFsc2UgKQogICAgIHsKIAlpZiggeF9mcy0+cGVyX2NoYXIgKQogCSAgICBpZiggYkhhdmVDYXBIZWlnaHQgKQpAQCAtMTMyMiw3ICsxMzIyLDcgQEAKIAogICByZXMgPSBYRk9OVF9HZXRQb2ludFJlc29sdXRpb24oIHBEZXZDYXBzICk7CiAgICAgICAKLSAgeF9wYXR0ZXJuID0gWExpc3RGb250cyhkaXNwbGF5LCAiKiIsIE1BWF9GT05UX0ZBTUlMSUVTICogMTYsICZ4X2NvdW50ICk7CisgIHhfcGF0dGVybiA9IFRTWExpc3RGb250cyhkaXNwbGF5LCAiKiIsIE1BWF9GT05UX0ZBTUlMSUVTICogMTYsICZ4X2NvdW50ICk7CiAKICAgZHByaW50Zl9mb250KHN0ZGRlYiwiRm9udCBNYXBwZXI6IGluaXRpYWxpemluZyAlaSBmb250cyBbTFBZPSVpLCBYRFI9JWksIERSPSVpXVxuIiwgCiAJCQkJICAgIHhfY291bnQsIHBEZXZDYXBzLT5sb2dQaXhlbHNZLCBEZWZSZXNvbHV0aW9uLCByZXMpOwpAQCAtMTQzMywxMiArMTQzMywxMiBAQAogCX0KIAllbHNlIGxwc3RyID0gdHlwZWZhY2U7CiAKLQlpZiggKHhfZnMgPSBYTG9hZFF1ZXJ5Rm9udChkaXNwbGF5LCBscHN0cikpICkKKwlpZiggKHhfZnMgPSBUU1hMb2FkUXVlcnlGb250KGRpc3BsYXksIGxwc3RyKSkgKQogCXsKIAkgICBmaS0+ZGYuZGZIb3JpelJlcyA9IGZpLT5kZi5kZlZlcnRSZXMgPSByZXM7CiAKIAkgICBYRk9OVF9TZXRGb250TWV0cmljKCBmaSwgZnIsIHhfZnMgKTsKLSAgICAgICAgICAgWEZyZWVGb250KCBkaXNwbGF5LCB4X2ZzICk7CisgICAgICAgICAgIFRTWEZyZWVGb250KCBkaXNwbGF5LCB4X2ZzICk7CiAKICNpZmRlZiBERUJVR19GT05UX0lOSVQKIAkgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJcdFslIDJpcHRdICclcydcbiIsIGZpLT5kZi5kZlBvaW50cywgdHlwZWZhY2UgKTsKQEAgLTE0NjQsMTUgKzE0NjQsMTUgQEAKICAgfQogCiAgIGlmKCBmaSApIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIGZpKTsKLSAgWEZyZWVGb250TmFtZXMoeF9wYXR0ZXJuKTsKKyAgVFNYRnJlZUZvbnROYW1lcyh4X3BhdHRlcm4pOwogCiAgIC8qIGNoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBYMTEgUjYgc2VydmVyICovCiAKICAgbHN0cmNweTMyQShidWZmZXIsICItKi0qLSotKi1ub3JtYWwtKi1bMTIgMCAwIDEyXS0qLTcyLSotKi0qLWlzbzg4NTktMSIpOwotICBpZiggKHhfZnMgPSBYTG9hZFF1ZXJ5Rm9udChkaXNwbGF5LCBidWZmZXIpKSApCisgIGlmKCAoeF9mcyA9IFRTWExvYWRRdWVyeUZvbnQoZGlzcGxheSwgYnVmZmVyKSkgKQogICB7CiAgICAgICAgWFRleHRDYXBzIHw9IFRDX1NGX1hfWUlOREVQOwotICAgICAgIFhGcmVlRm9udChkaXNwbGF5LCB4X2ZzKTsKKyAgICAgICBUU1hGcmVlRm9udChkaXNwbGF5LCB4X2ZzKTsKICAgfQogCiAgIFhGT05UX1dpbmRvd3NOYW1lcyggYnVmZmVyICk7CkBAIC0xNjIyLDggKzE2MjIsNiBAQAogICAgfQogICAgZWxzZSBpZiggIShwZmktPmZpX2ZsYWdzICYgRklfTk9STUFMKSApIHBlbmFsdHkrKzsKIAotICAgaWYoIHBmaS0+bGZkX3Jlc29sdXRpb24gIT0gRGVmUmVzb2x1dGlvbiApIHBlbmFsdHkrKzsKLQogICAgaWYoIHBsZi0+bGZXZWlnaHQgIT0gRldfRE9OVENBUkUgKQogICAgewogICAgICAgIHBlbmFsdHkgKz0gYWJzKHBsZi0+bGZXZWlnaHQgLSBwZmktPmRmLmRmV2VpZ2h0KSAvIDQwOwpAQCAtMTYzOSw2ICsxNjM3LDkgQEAKICAgIGlmKCBwbGYtPmxmVW5kZXJsaW5lICkgcGZtLT5mbGFncyB8PSBGT19TWU5USF9VTkRFUkxJTkU7CiAgICBpZiggcGxmLT5sZlN0cmlrZU91dCApIHBmbS0+ZmxhZ3MgfD0gRk9fU1lOVEhfU1RSSUtFT1VUOwogCisgICBpZiggcGVuYWx0eSAmJiBwZmktPmxmZF9yZXNvbHV0aW9uICE9IERlZlJlc29sdXRpb24gKSAKKyAgICAgICBwZW5hbHR5Kys7CisKICAgIGRwcmludGZfZm9udChzdGRkZWIsIi0+ICVpXG4iLCBwZW5hbHR5ICk7CiAKICAgIHJldHVybiBwZW5hbHR5OwpAQCAtMTg3NSw3ICsxODc2LDcgQEAKIAkgICAgZWxzZSBmb250TVJVID0gKElOVDE2KWZvbnRDYWNoZVtqXS5scnU7CiAKIAkgICAgLyogRklYTUU6IGxwWEZvcm0sIGxwUGl4bWFwICovCi0JICAgIFhGcmVlRm9udCggZGlzcGxheSwgZm9udENhY2hlW2pdLmZzICk7CisJICAgIFRTWEZyZWVGb250KCBkaXNwbGF5LCBmb250Q2FjaGVbal0uZnMgKTsKIAogCSAgICBtZW1zZXQoIGZvbnRDYWNoZSArIGosIDAsIHNpemVvZihmb250T2JqZWN0KSApOwogCSAgICByZXR1cm4gKGZvbnRDYWNoZSArIGopOwpAQCAtMTk1Nyw3ICsxOTU4LDcgQEAKIAkJZG8KIAkJewogCQkgICAgTEZEX0NvbXBvc2VMRkQoIHBmbywgZm0uaGVpZ2h0LCBscExGRCwgdVJlbGF4TGV2ZWwrKyApOwotCQkgICAgaWYoIChwZm8tPmZzID0gWExvYWRRdWVyeUZvbnQoIGRpc3BsYXksIGxwTEZEICkpICkgYnJlYWs7CisJCSAgICBpZiggKHBmby0+ZnMgPSBUU1hMb2FkUXVlcnlGb250KCBkaXNwbGF5LCBscExGRCApKSApIGJyZWFrOwogCQl9IHdoaWxlKCB1UmVsYXhMZXZlbCApOwogCiAJCWlmKCBYRk9OVF9HZXRMZWFkaW5nKCAmcGZvLT5maS0+ZGYsIHBmby0+ZnMsICZpLCBOVUxMICkgKQpAQCAtMjExOCw2ICsyMTE5LDkgQEAKIH0KIAogCitzdGF0aWMgY2hhciogdGVzdF9zdHJpbmcgPSAiQWJjIERlZiBHaGkgSmtsIE1ubyBQcXIgU3R1IFZ3eCBZeiI7CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgWDExRFJWX0dldFRleHRFeHRlbnRQb2ludAogICovCkBAIC0yMTMwLDEwICsyMTM0LDExIEBACiAJaW50IGRpciwgYXNjZW50LCBkZXNjZW50OwogCVhDaGFyU3RydWN0IGluZm87CiAKLQlYVGV4dEV4dGVudHMoIHBmcywgc3RyLCBjb3VudCwgJmRpciwgJmFzY2VudCwgJmRlc2NlbnQsICZpbmZvICk7CisJVFNYVGV4dEV4dGVudHMoIHBmcywgc3RyLCBjb3VudCwgJmRpciwgJmFzY2VudCwgJmRlc2NlbnQsICZpbmZvICk7CiAJc2l6ZS0+Y3ggPSBhYnMoKGluZm8ud2lkdGggKyBkYy0+dy5icmVha1JlbSArIGNvdW50ICogZGMtPncuY2hhckV4dHJhKQogCQkJCQkJKiBkYy0+d25kRXh0WCAvIGRjLT52cG9ydEV4dFgpOwogCXNpemUtPmN5ID0gYWJzKChwZnMtPmFzY2VudCArIHBmcy0+ZGVzY2VudCkgKiBkYy0+d25kRXh0WSAvIGRjLT52cG9ydEV4dFkpOworCiAJcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKQEAgLTIxNDksNiArMjE1NCw3IEBACiAgICAgewogCWZvbnRPYmplY3QqIHBmbyA9IF9fUEZPTlQoZGMtPnUueC5mb250KTsKIAlYRk9OVF9HZXRUZXh0TWV0cmljKCBwZm8sIG1ldHJpY3MgKTsKKwogCXJldHVybiBUUlVFOwogICAgIH0KICAgICByZXR1cm4gRkFMU0U7CkBAIC0yMTg3LDYgKzIxOTMsNyBAQAogCQkqYnVmZmVyKysgPSBNQVgoY3MtPndpZHRoLCAwICk7CiAJICAgIH0KIAl9CisKIAlyZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2J1aWx0aW4uYyBiL2lmMTYzMi9idWlsdGluLmMKaW5kZXggNzA3NmIxZS4uMTU5ZGRjOSAxMDA2NDQKLS0tIGEvaWYxNjMyL2J1aWx0aW4uYworKysgYi9pZjE2MzIvYnVpbHRpbi5jCkBAIC0zNjEsNiArMzYxLDggQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFsc3RybmNtcGkzMkEoIHN0ciwgZGxsLT5kZXNjci0+bmFtZSwgKGludCkocCAtIHN0cikgKSkKICAgICAgICAgICAgIHsKKwkgICAgICAgIGlmIChkbGwtPmRlc2NyLT5uYW1lWyhpbnQpKHAtc3RyKV0pICAvKiBvbmx5IHBhcnRpYWwgbWF0Y2ggKi8KKwkJCWNvbnRpbnVlOwogICAgICAgICAgICAgICAgIGlmIChzdHJbLTFdID09ICctJykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkbGwtPmZsYWdzICYgRExMX0ZMQUdfQUxXQVlTX1VTRUQpIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL2lmMTYzMi9jb21wb2JqLnNwZWMgYi9pZjE2MzIvY29tcG9iai5zcGVjCmluZGV4IDE5NjlmMzguLjU1ZWI3ZTkgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9jb21wb2JqLnNwZWMKKysrIGIvaWYxNjMyL2NvbXBvYmouc3BlYwpAQCAtNSw3ICs1LDcgQEAKIDIgcGFzY2FsIENvSW5pdGlhbGl6ZShsb25nKSBDb0luaXRpYWxpemUKIDMgcGFzY2FsIENvVW5pbml0aWFsaXplKCkgQ29Vbml0aWFsaXplCiA0IHBhc2NhbCBDb0dldE1hbGxvYyhsb25nIHB0cikgQ29HZXRNYWxsb2MKLTUgc3R1YiBDT1JFR0lTVEVSQ0xBU1NPQkpFQ1QKKzUgcGFzY2FsIENvUmVnaXN0ZXJDbGFzc09iamVjdChwdHIgcHRyIGxvbmcgbG9uZyBwdHIpIENvUmVnaXN0ZXJDbGFzc09iamVjdAogNiBzdHViIENPUkVWT0tFQ0xBU1NPQkpFQ1QKIDcgc3R1YiBDT0dFVENMQVNTT0JKRUNUCiA4IHN0dWIgQ09NQVJTSEFMSU5URVJGQUNFCkBAIC0xMywxMSArMTMsMTEgQEAKIDEwIHN0dWIgQ09MT0FETElCUkFSWQogMTEgc3R1YiBDT0ZSRUVMSUJSQVJZCiAxMiBzdHViIENPRlJFRUFMTExJQlJBUklFUwotMTMgc3R1YiBDT0NSRUFURUlOU1RBTkNFCisxMyBwYXNjYWwgQ29DcmVhdGVJbnN0YW5jZShwdHIgcHRyIGxvbmcgcHRyIHB0cikgQ29DcmVhdGVJbnN0YW5jZQogMTQgc3R1YiBTVFJJTkdGUk9NSUlECiAxNSBwYXNjYWwgQ29EaXNjb25uZWN0T2JqZWN0KHB0ciBsb25nKSBDb0Rpc2Nvbm5lY3RPYmplY3QKIDE2IHN0dWIgQ09SRUxFQVNFTUFSU0hBTERBVEEKLTE3IHN0dWIgQ09GUkVFVU5VU0VETElCUkFSSUVTCisxNyBwYXNjYWwxNiBDT0ZSRUVVTlVTRURMSUJSQVJJRVMoKSBDb0ZyZWVVbnVzZWRMaWJyYXJpZXMKIDE4IHBhc2NhbDE2IElzRXF1YWxHVUlEKHB0ciBwdHIpIElzRXF1YWxHVUlECiAxOSBwYXNjYWwgU3RyaW5nRnJvbUNMU0lEKHB0ciBwdHIpIFN0cmluZ0Zyb21DTFNJRAogMjAgcGFzY2FsIENMU0lERnJvbVN0cmluZyhzdHIgcHRyKSBDTFNJREZyb21TdHJpbmcKQEAgLTI3LDExICsyNywxMSBAQAogMjQgc3R1YiBJU1ZBTElESUlECiAyNSBzdHViIFJFU1VMVEZST01TQ09ERQogMjYgc3R1YiBHRVRTQ09ERQotMjcgc3R1YiBDT1JFR0lTVEVSTUVTU0FHRUZJTFRFUgorMjcgcGFzY2FsIENvUmVnaXN0ZXJNZXNzYWdlRmlsdGVyKHB0ciBwdHIpIENvUmVnaXN0ZXJNZXNzYWdlRmlsdGVyMTYKIDI4IHN0dWIgQ09JU0hBTkRMRVJDT05ORUNURUQKICMyOSBXRVAKLTMwIHN0dWIgQ09GSUxFVElNRVRPRE9TREFURVRJTUUKLTMxIHN0dWIgQ09ET1NEQVRFVElNRVRPRklMRVRJTUUKKzMwIHBhc2NhbCBDb0ZpbGVUaW1lVG9Eb3NEYXRlVGltZShwdHIgcHRyIHB0cikgRmlsZVRpbWVUb0Rvc0RhdGVUaW1lCiszMSBwYXNjYWwgQ29Eb3NEYXRlVGltZVRvRmlsZVRpbWUod29yZCB3b3JkIHB0cikgRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lCiAzMiBzdHViIENPTUFSU0hBTEhSRVNVTFQKIDMzIHN0dWIgQ09VTk1BUlNIQUxIUkVTVUxUCiAzNCBzdHViIENPR0VUQ1VSUkVOVFBST0NFU1MKQEAgLTYxLDcgKzYxLDcgQEAKIDU4IHN0dWIgX0lJRF9JREZSRVNFUlZFRDIKIDU5IHN0dWIgX0lJRF9JREZSRVNFUlZFRDMKIDYwIHN0dWIgX0lJRF9JTUVTU0FHRUZJTFRFUgotNjEgc3R1YiBDTFNJREZST01QUk9HSUQKKzYxIHBhc2NhbCBDTFNJREZyb21Qcm9nSUQoc3RyIHB0cikgQ0xTSURGcm9tUHJvZ0lECiA2MiBzdHViIFBST0dJREZST01DTFNJRAogNjMgc3R1YiBDT0xPQ0tPQkpFQ1RFWFRFUk5BTAogNjQgc3R1YiBfQ0xTSURfU1RETUFSU0hBTApAQCAtODEsNyArODEsNyBAQAogNzkgc3R1YiBDTFNJREZST01PTEUxQ0xBU1MKIDgwIHN0dWIgQ09PUEVOQ0xBU1NLRVkKIDgxIHN0dWIgR1VJREZST01TVFJJTkcKLTgyIHN0dWIgQ09GSUxFVElNRU5PVworODIgcGFzY2FsIENvRmlsZVRpbWVOb3cocHRyKSBDb0ZpbGVUaW1lTm93CiA4MyBzdHViIFJFTUFMTE9DT0lECiA4NCBzdHViIFJFTUZSRUVPSUQKIDg1IHN0dWIgUkVNQ1JFQVRFUkVNT1RFSEFORExFUgpAQCAtOTMsNyArOTMsNyBAQAogOTEgc3R1YiBMUlBDUkVWT0tFTU9OSVRPUgogOTIgc3R1YiBMUlBDR0VUVEhSRUFEV0lORE9XCiA5MyBzdHViIFRJTUVSQ0FMTEJBQ0tQUk9DCi05NCBzdHViIExPT0tVUEVUQVNLCis5NCBwYXNjYWwgTG9va3VwRVRhc2socHRyIHB0cikgTG9va3VwRVRhc2sKIDk1IHN0dWIgU0VURVRBU0sKIDk2IHN0dWIgTFJQQ0ZSRUVNT05JVE9SREFUQQogOTcgc3R1YiBSRU1MT09LVVBTSFVOSwpAQCAtMTQzLDMgKzE0Myw3IEBACiAxNjAgc3R1YiBDT1JVTk1PREFMTE9PUAogMTYxIHN0dWIgQ09IQU5ETEVJTkNPTUlOR0NBTEwKIDE2MiBzdHViIENPU0VUQUNLU1RBVEUKKworMjAxIHBhc2NhbCBDQUxMT0JKRUNUSU5XT1cocHRyIHB0cikgQ2FsbE9iamVjdEluV09XCisyMDQgc3R1YiBDT01QT0JKXzIwNAorMjA3IHN0dWIgQ09NUE9CSl8yMDcKZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkuc3BlYyBiL2lmMTYzMi9nZGkuc3BlYwppbmRleCBmNzkyMDU5Li41ZmFmYzBkIDEwMDY0NAotLS0gYS9pZjE2MzIvZ2RpLnNwZWMKKysrIGIvaWYxNjMyL2dkaS5zcGVjCkBAIC0xNjYsMTEgKzE2NiwxMSBAQAogMTk2IHBhc2NhbDE2IFNldE1ldGFGaWxlQml0c0JldHRlcih3b3JkKSBTZXRNZXRhRmlsZUJpdHNCZXR0ZXIKIDIwMSBzdHViIERNQklUQkxUCiAyMDIgc3R1YiBETUNPTE9SSU5GTwotMjA2IHN0dWIgRE1FTlVNREZPTlRTCisyMDYgcGFzY2FsMTYgZG1FbnVtREZvbnRzKHB0ciBzdHIgcHRyIHB0cikgZG1FbnVtREZvbnRzCiAyMDcgc3R1YiBETUVOVU1PQkoKIDIwOCBzdHViIERNT1VUUFVUCiAyMDkgc3R1YiBETVBJWEVMCi0yMTAgc3R1YiBETVJFQUxJWkVPQkpFQ1QKKzIxMCBwYXNjYWwxNiBkbVJlYWxpemVPYmplY3QocHRyIHdvcmQgcHRyIHB0ciBzZWdwdHIpIGRtUmVhbGl6ZU9iamVjdAogMjExIHN0dWIgRE1TVFJCTFQKIDIxMiBzdHViIERNU0NBTkxSCiAyMTMgc3R1YiBCUlVURQpAQCAtMzMyLDIxICszMzIsMjEgQEAKIDUwNSBzdHViIFNldEVuaE1ldGFmaWxlQml0cwogNTA2IHN0dWIgU2V0TWV0YVJnbgogNTA4IHN0dWIgRXh0U2VsZWN0Q2xpcFJnbgotNTExIHN0dWIgQWJvcnRQYXRoCi01MTIgc3R1YiBCZWdpblBhdGgKLTUxMyBzdHViIENsb3NlRmlndXJlCi01MTQgc3R1YiBFbmRQYXRoCis1MTEgcGFzY2FsMTYgQWJvcnRQYXRoKHdvcmQpIEFib3J0UGF0aDE2Cis1MTIgcGFzY2FsMTYgQmVnaW5QYXRoKHdvcmQpIEJlZ2luUGF0aDE2Cis1MTMgcGFzY2FsMTYgQ2xvc2VGaWd1cmUod29yZCkgQ2xvc2VGaWd1cmUxNgorNTE0IHBhc2NhbDE2IEVuZFBhdGgod29yZCkgRW5kUGF0aDE2CiA1MTUgc3R1YiBGaWxsUGF0aAogNTE2IHN0dWIgRmxhdHRlblBhdGgKLTUxNyBzdHViIEdldFBhdGgKKzUxNyBwYXNjYWwxNiBHZXRQYXRoKHdvcmQgcHRyIHB0ciB3b3JkKSBHZXRQYXRoMTYKIDUxOCBzdHViIFBhdGhUb1JlZ2lvbgogNTE5IHN0dWIgU2VsZWN0Q2xpcFBhdGgKIDUyMCBzdHViIFN0cm9rZUFuZEZpbGxQYXRoCiA1MjEgc3R1YiBTdHJva2VQYXRoCiA1MjIgc3R1YiBXaWRlblBhdGgKIDUyMyBzdHViIEV4dENyZWF0ZVBlbgotNTI0IHN0dWIgR2V0QXJjRGlyZWN0aW9uCi01MjUgc3R1YiBTZXRBcmNEaXJlY3Rpb24KKzUyNCBwYXNjYWwxNiBHZXRBcmNEaXJlY3Rpb24od29yZCkgR2V0QXJjRGlyZWN0aW9uMTYKKzUyNSBwYXNjYWwxNiBTZXRBcmNEaXJlY3Rpb24od29yZCB3b3JkKSBTZXRBcmNEaXJlY3Rpb24xNgogNTI2IHN0dWIgR2V0TWl0ZXJMaW1pdAogNTI3IHN0dWIgU2V0TWl0ZXJMaW1pdAogNTI4IHN0dWIgR0RJUGFyYW1ldGVyc0luZm8KZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwuc3BlYyBiL2lmMTYzMi9rZXJuZWwuc3BlYwppbmRleCA2OWVlNTVmLi4zYzM0N2M3IDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbC5zcGVjCkBAIC03NCwxNyArNzQsMTggQEAKIDc0ICBwYXNjYWwxNiBPcGVuRmlsZShzdHIgcHRyIHdvcmQpIE9wZW5GaWxlMTYKIDc1ICBzdHViIE9wZW5QYXRoTmFtZQogNzYgIHN0dWIgRGVsZXRlUGF0aE5hbWUKLTc3IHN0dWIgS0VSTkVMXzc3CQkjUkVTRVJWRUQxCi03OCBzdHViIEtFUk5FTF83OCAJCSNSRVNFUlZFRDIKLSM3OSBSRVNFUlZFRDMKLSM4MCBSRVNFUlZFRDQKKyMgUmVzZXJ2ZWQqOiBvbGQgV2luIDIueCBmdW5jdGlvbnMgbm93IG1vdmVkIHRvIFVTRVIgKFdpbiAzLjArKQorNzcgIHBhc2NhbCBSZXNlcnZlZDEoc2VncHRyKSBBbnNpTmV4dDE2Cis3OCAgcGFzY2FsIFJlc2VydmVkMihzZWdwdHIgc2VncHRyKSBBbnNpUHJldjE2Cis3OSAgcGFzY2FsIFJlc2VydmVkMyhzZWdzdHIpIEFuc2lVcHBlcjE2Cis4MCAgcGFzY2FsIFJlc2VydmVkNChzZWdzdHIpIEFuc2lMb3dlcjE2CiA4MSAgcGFzY2FsMTYgX2xjbG9zZSh3b3JkKSBfbGNsb3NlMTYKIDgyICBwYXNjYWwxNiBfbHJlYWQod29yZCBzZWdwdHIgd29yZCkgV0lOMTZfbHJlYWQKIDgzICBwYXNjYWwxNiBfbGNyZWF0KHN0ciB3b3JkKSBfbGNyZWF0MTYKIDg0ICBwYXNjYWwgICBfbGxzZWVrKHdvcmQgbG9uZyB3b3JkKSBfbGxzZWVrMTYKIDg1ICBwYXNjYWwxNiBfbG9wZW4oc3RyIHdvcmQpIF9sb3BlbjE2CiA4NiAgcGFzY2FsMTYgX2x3cml0ZSh3b3JkIHB0ciB3b3JkKSBfbHdyaXRlMTYKLTg3ICBwYXNjYWwxNiBSRVNFUlZFRDUoc3RyIHN0cikgbHN0cmNtcDE2Cis4NyAgcGFzY2FsMTYgUmVzZXJ2ZWQ1KHN0ciBzdHIpIGxzdHJjbXAxNgogODggIHBhc2NhbCAgIGxzdHJjcHkoc2VncHRyIHN0cikgbHN0cmNweTE2CiA4OSAgcGFzY2FsICAgbHN0cmNhdChzZWdzdHIgc3RyKSBsc3RyY2F0MTYKIDkwICBwYXNjYWwxNiBsc3RybGVuKHN0cikgbHN0cmxlbjE2CkBAIC0xMjAsNyArMTIxLDcgQEAKIDEyMCBzdHViIFVuZGVmRHluTGluawogMTIxIHBhc2NhbDE2IExvY2FsU2hyaW5rKHdvcmQgd29yZCkgTG9jYWxTaHJpbmsxNgogMTIyIHBhc2NhbDE2IElzVGFza0xvY2tlZCgpIElzVGFza0xvY2tlZAotMTIzIHN0dWIgS2JkUnN0CisxMjMgcmV0dXJuIEtiZFJzdCAwIDAKIDEyNCByZXR1cm4gRW5hYmxlS2VybmVsIDAgMAogMTI1IHJldHVybiBEaXNhYmxlS2VybmVsIDAgMAogMTI2IHN0dWIgTWVtb3J5RnJlZWQKQEAgLTE1Nyw3ICsxNTgsNyBAQAogMTU2IHJldHVybiBMaW1pdEVNU1BhZ2VzIDQgMAogMTU3IHJldHVybiBHZXRDdXJQSUQgNCAwCiAxNTggcmV0dXJuIElzV2luT2xkQXBUYXNrIDIgMAotMTU5IHN0dWIgR2xvYmFsSGFuZGxlTm9SSVAKKzE1OSBwYXNjYWwgR2xvYmFsSGFuZGxlTm9SSVAod29yZCkgR2xvYmFsSGFuZGxlTm9SSVAKIDE2MCBzdHViIEVNU0NvcHkKIDE2MSBwYXNjYWwxNiBMb2NhbENvdW50RnJlZSgpIExvY2FsQ291bnRGcmVlCiAxNjIgcGFzY2FsMTYgTG9jYWxIZWFwU2l6ZSgpIExvY2FsSGVhcFNpemUKQEAgLTIzNywxMCArMjM4LDEwIEBACiAyNjIgc3R1YiBLRVJORUxfMjYyCiAyNjMgc3R1YiBLRVJORUxfMjYzCiAzMTAgcGFzY2FsMTYgTG9jYWxIYW5kbGVEZWx0YSh3b3JkKSBMb2NhbEhhbmRsZURlbHRhCi0zMTEgc3R1YiBHZXRTZXRLZXJuZWxEb3NQcm9jCiszMTEgcGFzY2FsIEdldFNldEtlcm5lbERPU1Byb2MocHRyKSBHZXRTZXRLZXJuZWxET1NQcm9jCiAzMTQgc3R1YiBEZWJ1Z0RlZmluZVNlZ21lbnQKIDMxNSBwYXNjYWwxNiBXcml0ZU91dFByb2ZpbGVzKCkgV3JpdGVPdXRQcm9maWxlcwotMzE2IHN0dWIgR2V0RnJlZU1lbUluZm8KKzMxNiBwYXNjYWwgR2V0RnJlZU1lbUluZm8oKSBHZXRGcmVlTWVtSW5mbwogMzE4IHN0dWIgRmF0YWxFeGl0SG9vawogMzE5IHN0dWIgRmx1c2hDYWNoZWRGaWxlSGFuZGxlCiAzMjAgcGFzY2FsMTYgSXNUYXNrKHdvcmQpIElzVGFzawpAQCAtMjUxLDE2ICsyNTIsMTYgQEAKIDMyNiByZXR1cm4gSXNSb21GaWxlIDIgMAogMzI3IHN0dWIgS0VSTkVMXzMyNwogMzI4IHN0dWIgX0RlYnVnT3V0cHV0Ci0jMzI5IEszMjkKKzMyOSBwYXNjYWwxNiBLMzI5KHN0ciB3b3JkKSBEZWJ1Z0ZpbGxCdWZmZXIKICMzMzIgc3R1YiBUSEhPT0sKIDMzNCBwYXNjYWwxNiBJc0JhZFJlYWRQdHIoc2VncHRyIHdvcmQpIElzQmFkUmVhZFB0cjE2CiAzMzUgcGFzY2FsMTYgSXNCYWRXcml0ZVB0cihzZWdwdHIgd29yZCkgSXNCYWRXcml0ZVB0cjE2CiAzMzYgcGFzY2FsMTYgSXNCYWRDb2RlUHRyKHNlZ3B0cikgSXNCYWRDb2RlUHRyMTYKIDMzNyBwYXNjYWwxNiBJc0JhZFN0cmluZ1B0cihzZWdwdHIgd29yZCkgSXNCYWRTdHJpbmdQdHIxNgogMzM4IHN0dWIgSGFzR1BIYW5kbGVyCi0zMzkgc3R1YiBEaWFnUXVlcnkKLTM0MCBzdHViIERpYWdPdXRwdXQKLTM0MSBzdHViIFRvb2xIZWxwSG9vaworMzM5IHBhc2NhbDE2IERpYWdRdWVyeSgpIERpYWdRdWVyeQorMzQwIHBhc2NhbDE2IERpYWdPdXRwdXQoKSBEaWFnT3V0cHV0CiszNDEgcGFzY2FsIFRvb2xIZWxwSG9vayhwdHIpIFRvb2xIZWxwSG9vawogMzQyIHN0dWIgX19HUAogMzQzIHN0dWIgUmVnaXN0ZXJXaW5PbGRBcEhvb2sKIDM0NCBzdHViIEdldFdpbk9sZEFwSG9va3MKZGlmZiAtLWdpdCBhL2lmMTYzMi9vbGUyZGlzcC5zcGVjIGIvaWYxNjMyL29sZTJkaXNwLnNwZWMKaW5kZXggOGI1MDUyMC4uNzk4NWFhMiAxMDA2NDQKLS0tIGEvaWYxNjMyL29sZTJkaXNwLnNwZWMKKysrIGIvaWYxNjMyL29sZTJkaXNwLnNwZWMKQEAgLTMxLDExICszMSwxMSBAQAogMjggc3R1YiBESVNQR0VUUEFSQU0KIDI5IHN0dWIgRElTUEdFVElEU09GTkFNRVMKIDMwIHN0dWIgRElTUElOVk9LRQotMzEgc3R1YiBDUkVBVEVESVNQVFlQRUlORk8KKzMxIHBhc2NhbCBDcmVhdGVEaXNwVHlwZUluZm8ocHRyIGxvbmcgcHRyKSBDcmVhdGVEaXNwVHlwZUluZm8KIDMyIHN0dWIgQ1JFQVRFU1RERElTUEFUQ0gKIDMzIHN0dWIgX0lJRF9JRElTUEFUQ0gKIDM0IHN0dWIgX0lJRF9JRU5VTVZBUklBTlQKLTM1IHN0dWIgUkVHSVNURVJBQ1RJVkVPQkpFQ1QKKzM1IHBhc2NhbCBSZWdpc3RlckFjdGl2ZU9iamVjdChwdHIgcHRyIGxvbmcgcHRyKSBSZWdpc3RlckFjdGl2ZU9iamVjdAogMzYgc3R1YiBSRVZPS0VBQ1RJVkVPQkpFQ1QKIDM3IHN0dWIgR0VUQUNUSVZFT0JKRUNUCiAzOCBzdHViIFNBRkVBUlJBWUFMTE9DREVTQ1JJUFRPUgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCA2ZTE4OGJiLi5iNDc1NzUzIDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMzQsMTAgKzM0LDkgQEAKICAgICAgIC8qIEFsbG9jYXRlIHRoZSBjb2RlIHNlbGVjdG9yIGZvciBDYWxsVG8xNiByb3V0aW5lcyAqLwogCiAgICAgZXh0ZXJuIHZvaWQgQ0FMTFRPMTZfU3RhcnQoKSwgQ0FMTFRPMTZfRW5kKCk7Ci0gICAgZXh0ZXJuIHZvaWQgQ0FMTFRPMTZfUmV0X3dvcmQoKSwgQ0FMTFRPMTZfUmV0X2xvbmcoKSwgQ0FMTFRPMTZfUmV0X3JlZ3MoKTsKKyAgICBleHRlcm4gdm9pZCBDQUxMVE8xNl9SZXRfd29yZCgpLCBDQUxMVE8xNl9SZXRfbG9uZygpOwogICAgIGV4dGVybiBEV09SRCBDQUxMVE8xNl9SZXRBZGRyX3dvcmQ7CiAgICAgZXh0ZXJuIERXT1JEIENBTExUTzE2X1JldEFkZHJfbG9uZzsKLSAgICBleHRlcm4gRFdPUkQgQ0FMTFRPMTZfUmV0QWRkcl9yZWdzOwogCiAgICAgY29kZXNlbCA9IEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgKHZvaWQgKilDQUxMVE8xNl9TdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClDQUxMVE8xNl9FbmQgLSAoaW50KUNBTExUTzE2X1N0YXJ0LApAQCAtNTAsOCArNDksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNlbCApOwogICAgIENBTExUTzE2X1JldEFkZHJfbG9uZz1NQUtFTE9ORyggKGludClDQUxMVE8xNl9SZXRfbG9uZy0oaW50KUNBTExUTzE2X1N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNlbCApOwotICAgIENBTExUTzE2X1JldEFkZHJfcmVncz1NQUtFTE9ORyggKGludClDQUxMVE8xNl9SZXRfcmVncy0oaW50KUNBTExUTzE2X1N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNlbCApOwogCiAgICAgLyogQ3JlYXRlIGJ1aWx0LWluIG1vZHVsZXMgKi8KICAgICBpZiAoIUJVSUxUSU5fSW5pdCgpKSByZXR1cm4gRkFMU0U7CkBAIC0yMzgsMTIgKzIzNSwxNSBAQAogICovCiB2b2lkIFJFTEFZX0RlYnVnQ2FsbFRvMTYoIGludCogc3RhY2ssIGludCBuYl9hcmdzICkKIHsKKyAgICBUSERCICp0aGRiOworCiAgICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKKyAgICB0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKIAogICAgIGlmIChuYl9hcmdzID09IC0xKSAgLyogUmVnaXN0ZXIgZnVuY3Rpb24gKi8KICAgICB7CiAgICAgICAgIENPTlRFWFQgKmNvbnRleHQgPSAoQ09OVEVYVCAqKXN0YWNrWzBdOwotICAgICAgICBXT1JEICpzdGFjazE2ID0gKFdPUkQgKilDVVJSRU5UX1NUQUNLMTY7CisgICAgICAgIFdPUkQgKnN0YWNrMTYgPSAoV09SRCAqKVRIUkVBRF9TVEFDSzE2KHRoZGIpOwogICAgICAgICBwcmludGYoICJDYWxsVG8xNihmdW5jPSUwNGx4OiUwNHgsZHM9JTA0bHgiLAogICAgICAgICAgICAgICAgIENTX3JlZyhjb250ZXh0KSwgSVBfcmVnKGNvbnRleHQpLCBEU19yZWcoY29udGV4dCkgKTsKICAgICAgICAgbmJfYXJncyA9IHN0YWNrWzFdIC8gc2l6ZW9mKFdPUkQpOwpAQCAtMjU4LDcgKzI1OCw3IEBACiAgICAgewogICAgICAgICBwcmludGYoICJDYWxsVG8xNihmdW5jPSUwNHg6JTA0eCxkcz0lMDR4IiwKICAgICAgICAgICAgICAgICBISVdPUkQoc3RhY2tbMF0pLCBMT1dPUkQoc3RhY2tbMF0pLAotICAgICAgICAgICAgICAgIFNFTEVDVE9ST0YoSUYxNjMyX1NhdmVkMTZfc3Nfc3ApICk7CisgICAgICAgICAgICAgICAgU0VMRUNUT1JPRih0aGRiLT5jdXJfc3RhY2spICk7CiAgICAgICAgIHN0YWNrKys7CiAgICAgICAgIHdoaWxlIChuYl9hcmdzLS0pIHByaW50ZiggIiwweCUwNHgiLCAqc3RhY2srKyApOwogICAgICAgICBwcmludGYoICIpXG4iICk7CkBAIC0yNzcsNyArMjc3LDYgQEAKICAgICBWQV9MSVNUMTYgdmFsaXN0OwogICAgIFNFR1BUUiBidWY7CiAgICAgTFBDQVRDSEJVRiBscGJ1ZjsKLSAgICBTVEFDSzE2RlJBTUUgKnBGcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKIAogICAgIFZBX1NUQVJUMTYoIHZhbGlzdCApOwogICAgIGJ1ZiAgID0gVkFfQVJHMTYoIHZhbGlzdCwgU0VHUFRSICk7CkBAIC0zMDIsMTMgKzMwMSwxMyBAQAogCiAgICAgbHBidWZbMF0gPSBJUF9yZWcoY29udGV4dCk7CiAgICAgbHBidWZbMV0gPSBDU19yZWcoY29udGV4dCk7Ci0gICAgbHBidWZbMl0gPSBMT1dPUkQocEZyYW1lLT5mcmFtZTMyKTsKKyAgICBscGJ1ZlsyXSA9IFNQX3JlZyhjb250ZXh0KTsKICAgICBscGJ1ZlszXSA9IEJQX3JlZyhjb250ZXh0KTsKICAgICBscGJ1Zls0XSA9IFNJX3JlZyhjb250ZXh0KTsKICAgICBscGJ1Zls1XSA9IERJX3JlZyhjb250ZXh0KTsKICAgICBscGJ1Zls2XSA9IERTX3JlZyhjb250ZXh0KTsKLSAgICBscGJ1Zls3XSA9IE9GRlNFVE9GKElGMTYzMl9TYXZlZDE2X3NzX3NwKTsKLSAgICBscGJ1Zls4XSA9IEhJV09SRChwRnJhbWUtPmZyYW1lMzIpOworICAgIGxwYnVmWzddID0gMDsKKyAgICBscGJ1Zls4XSA9IFNTX3JlZyhjb250ZXh0KTsKICAgICBBWF9yZWcoY29udGV4dCkgPSAwOyAgLyogUmV0dXJuIDAgKi8KIH0KIApAQCAtMzI1LDYgKzMyNCw4IEBACiAgICAgU0VHUFRSIGJ1ZjsKICAgICBMUENBVENIQlVGIGxwYnVmOwogICAgIFNUQUNLMTZGUkFNRSAqcEZyYW1lOworICAgIFNUQUNLMzJGUkFNRSAqZnJhbWUzMjsKKyAgICBUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKIAogICAgIFZBX1NUQVJUMTYoIHZhbGlzdCApOwogICAgIEFYX3JlZyhjb250ZXh0KSA9IFZBX0FSRzE2KCB2YWxpc3QsIFdPUkQgKTsgIC8qIHJldHZhbCAqLwpAQCAtMzMyLDEwICszMzMsMTcgQEAKICAgICBscGJ1ZiAgPSAoTFBDQVRDSEJVRilQVFJfU0VHX1RPX0xJTiggYnVmICk7CiAgICAgVkFfRU5EMTYoIHZhbGlzdCApOwogCi0gICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBNQUtFTE9ORyggbHBidWZbN10gLSBzaXplb2YoV09SRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElXT1JEKElGMTYzMl9TYXZlZDE2X3NzX3NwKSApOwotICAgIHBGcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKLSAgICBwRnJhbWUtPmZyYW1lMzIgPSBNQUtFTE9ORyggbHBidWZbMl0sIGxwYnVmWzhdICk7CisgICAgLyogRmluZCB0aGUgZnJhbWUzMiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmcmFtZTE2IHdlIGFyZSBqdW1waW5nIHRvICovCisgICAgZnJhbWUzMiA9IFRIUkVBRF9TVEFDSzE2KCB0aGRiICktPmZyYW1lMzI7CisgICAgd2hpbGUgKGZyYW1lMzIgJiYgZnJhbWUzMi0+ZnJhbWUxNikKKyAgICB7CisgICAgICAgIGlmIChPRkZTRVRPRihmcmFtZTMyLT5mcmFtZTE2KSA+IGxwYnVmWzJdKSBicmVhazsKKyAgICAgICAgZnJhbWUzMiA9ICgoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oZnJhbWUzMi0+ZnJhbWUxNikpLT5mcmFtZTMyOworICAgIH0KKworICAgIHRoZGItPmN1cl9zdGFjayA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggbHBidWZbOF0sIGxwYnVmWzJdLXNpemVvZihXT1JEKSApOworICAgIHBGcmFtZSA9IFRIUkVBRF9TVEFDSzE2KCB0aGRiICk7CisgICAgcEZyYW1lLT5mcmFtZTMyID0gZnJhbWUzMjsKICAgICBJUF9yZWcoY29udGV4dCkgPSBscGJ1ZlswXTsKICAgICBDU19yZWcoY29udGV4dCkgPSBscGJ1ZlsxXTsKICAgICBCUF9yZWcoY29udGV4dCkgPSBscGJ1ZlszXTsKQEAgLTM3Myw3ICszODEsNyBAQAogICAgICAgICBucm9mYXJncyAgICA9IFZBX0FSRzE2KCB2YWxpc3QsIERXT1JEICk7CiAgICAgICAgIGFyZ2NvbnZtYXNrID0gVkFfQVJHMTYoIHZhbGlzdCwgRFdPUkQgKTsKICAgICAgICAgcHJvYzMyICAgICAgPSBWQV9BUkcxNiggdmFsaXN0LCBGQVJQUk9DMzIgKTsKLQlmcHJpbnRmKHN0ZGVyciwiQ2FsbFByb2MzMlcoJWxkLCVsZCwlcCwgRXglZCBhcmdzWyIsbnJvZmFyZ3MsYXJnY29udm1hc2sscHJvYzMyLEV4KTsKKwlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiQ2FsbFByb2MzMlcoJWxkLCVsZCwlcCwgRXglZCBhcmdzWyIsbnJvZmFyZ3MsYXJnY29udm1hc2sscHJvYzMyLEV4KTsKIAlhcmdzID0gKERXT1JEKilIRUFQX3hhbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEV09SRCkqbnJvZmFyZ3MgKTsKIAlmb3IgKGk9MDtpPG5yb2ZhcmdzO2krKykgewpAQCAtMzgxLDE1ICszODksMTUgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBwdHIgPSBWQV9BUkcxNiggdmFsaXN0LCBTRUdQVFIgKTsKICAgICAgICAgICAgICAgICAgICAgYXJnc1tucm9mYXJncy1pLTFdID0gKERXT1JEKVBUUl9TRUdfVE9fTElOKHB0cik7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIlMDhseCglcCksIixwdHIsUFRSX1NFR19UT19MSU4ocHRyKSk7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGZfcmVsYXkoc3RkZGViLCIlMDhseCglcCksIixwdHIsUFRSX1NFR19UT19MSU4ocHRyKSk7CiAJCX0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBhcmdzW25yb2ZhcmdzLWktMV0gPSBWQV9BUkcxNiggdmFsaXN0LCBEV09SRCApOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJWxkLCIsYXJnc1tucm9mYXJncy1pLTFdKTsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9yZWxheShzdGRkZWIsIiVsZCwiLGFyZ3NbbnJvZmFyZ3MtaS0xXSk7CiAJCX0KIAl9Ci0JZnByaW50ZihzdGRlcnIsIl0pIC0gIik7CisJZHByaW50Zl9yZWxheShzdGRkZWIsIl0pIC0gIik7CiAgICAgICAgIFZBX0VORDE2KCB2YWxpc3QgKTsKIAogCXN3aXRjaCAobnJvZmFyZ3MpIHsKQEAgLTQyNCw5ICs0MzIsMTAgQEAKIAkJYnJlYWs7CiAJfQogCS8qIFBPUCBucm9mYXJncyBEV09SRCBhcmd1bWVudHMgYW5kIDMgRFdPUkQgcGFyYW1ldGVycyAqLwotICAgICAgICBpZiAoIUV4KSBTVEFDSzE2X1BPUCggKDMgKyBucm9mYXJncykgKiBzaXplb2YoRFdPUkQpICk7CisgICAgICAgIGlmICghRXgpIFNUQUNLMTZfUE9QKCBUSFJFQURfQ3VycmVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKyBucm9mYXJncykgKiBzaXplb2YoRFdPUkQpICk7CiAKLQlmcHJpbnRmKHN0ZGVyciwicmV0dXJucyAlMDhseFxuIixyZXQpOworCWRwcmludGZfcmVsYXkoc3RkZGViLCJyZXR1cm5zICUwOGx4XG4iLHJldCk7CiAJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGFyZ3MgKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3RodW5rLmMgYi9pZjE2MzIvdGh1bmsuYwppbmRleCA4OGIwMjgxLi45Y2Y5YmNmNCAxMDA2NDQKLS0tIGEvaWYxNjMyL3RodW5rLmMKKysrIGIvaWYxNjMyL3RodW5rLmMKQEAgLTI5LDM1ICsyOSw3MyBAQAogZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfc3JlZ18oY29uc3QgQ09OVEVYVCAqY29udGV4dCwgSU5UMzIgb2Zmc2V0KTsKIGV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xyZWdfKGNvbnN0IENPTlRFWFQgKmNvbnRleHQsIElOVDMyIG9mZnNldCk7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkXyAgICAgKEZBUlBST0MxNik7CitleHRlcm4gTE9ORyBDQUxMQkFDSyBDYWxsVG8xNl9sb25nXyAgICAgKEZBUlBST0MxNik7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX3cgICAgKEZBUlBST0MxNixXT1JEKTsKIGV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfbCAgICAoRkFSUFJPQzE2LExPTkcpOwogZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF93dyAgIChGQVJQUk9DMTYsV09SRCxXT1JEKTsKIGV4dGVybiBXT1JEIENBTExCQUNLIENhbGxUbzE2X3dvcmRfd2wgICAoRkFSUFJPQzE2LFdPUkQsTE9ORyk7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX2xsICAgKEZBUlBST0MxNixMT05HLExPTkcpOworZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfbG9uZ19sbCAgIChGQVJQUk9DMTYsTE9ORyxMT05HKTsKIGV4dGVybiBXT1JEIENBTExCQUNLIENhbGxUbzE2X3dvcmRfd3d3ICAoRkFSUFJPQzE2LFdPUkQsV09SRCxXT1JEKTsKIGV4dGVybiBXT1JEIENBTExCQUNLIENhbGxUbzE2X3dvcmRfd3dsICAoRkFSUFJPQzE2LFdPUkQsV09SRCxMT05HKTsKIGV4dGVybiBXT1JEIENBTExCQUNLIENhbGxUbzE2X3dvcmRfd2x3ICAoRkFSUFJPQzE2LFdPUkQsTE9ORyxXT1JEKTsKIGV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfd3dsICAoRkFSUFJPQzE2LFdPUkQsV09SRCxMT05HKTsKK2V4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfbGxsICAoRkFSUFJPQzE2LExPTkcsTE9ORyxMT05HKTsKIGV4dGVybiBXT1JEIENBTExCQUNLIENhbGxUbzE2X3dvcmRfbGx3bCAoRkFSUFJPQzE2LExPTkcsTE9ORyxXT1JELExPTkcpOwogZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF9sd2xsIChGQVJQUk9DMTYsTE9ORyxXT1JELExPTkcsTE9ORyk7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX2x3d3cgKEZBUlBST0MxNixMT05HLFdPUkQsV09SRCxXT1JEKTsKIGV4dGVybiBXT1JEIENBTExCQUNLIENhbGxUbzE2X3dvcmRfd3dsbCAoRkFSUFJPQzE2LFdPUkQsV09SRCxMT05HLExPTkcpOworZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF9sbGxsIChGQVJQUk9DMTYsTE9ORyxMT05HLExPTkcsTE9ORyk7CitleHRlcm4gTE9ORyBDQUxMQkFDSyBDYWxsVG8xNl9sb25nX2xsbGwgKEZBUlBST0MxNixMT05HLExPTkcsTE9ORyxMT05HKTsKIGV4dGVybiBXT1JEIENBTExCQUNLIENhbGxUbzE2X3dvcmRfd2xsd2woRkFSUFJPQzE2LFdPUkQsTE9ORyxMT05HLFdPUkQsTE9ORyk7CiBleHRlcm4gTE9ORyBDQUxMQkFDSyBDYWxsVG8xNl9sb25nX2x3d2xsKEZBUlBST0MxNixMT05HLFdPUkQsV09SRCxMT05HLExPTkcpOwogZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF93d2xsbChGQVJQUk9DMTYsV09SRCxXT1JELExPTkcsTE9ORyxMT05HKTsKIGV4dGVybiBXT1JEIENBTExCQUNLIENhbGxUbzE2X3dvcmRfd3d3d3coRkFSUFJPQzE2LFdPUkQsV09SRCxXT1JELFdPUkQsV09SRCk7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX2x3bGxsKEZBUlBST0MxNixMT05HLFdPUkQsTE9ORyxMT05HLExPTkcpOwotZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF9sbGxsIChGQVJQUk9DMTYsTE9ORyxMT05HLExPTkcsTE9ORyk7CiBleHRlcm4gTE9ORyBDQUxMQkFDSyBDYWxsVG8xNl9sb25nX2x3bGxsKEZBUlBST0MxNixMT05HLFdPUkQsTE9ORyxMT05HLExPTkcpOworZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfbG9uZ19sbGxsbChGQVJQUk9DMTYsTE9ORyxMT05HLExPTkcsTE9ORyxMT05HKTsKK2V4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfbGxsbGxsKEZBUlBST0MxNixMT05HLExPTkcsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HKTsKK2V4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfbGxsbGxsbChGQVJQUk9DMTYsTE9ORyxMT05HLExPTkcsTE9ORyxMT05HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcsTE9ORyk7CitleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX2xsd3dsbGwoRkFSUFJPQzE2LExPTkcsTE9ORyxXT1JELFdPUkQsTE9ORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLExPTkcpOwogZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF9sd3dsbGxsbChGQVJQUk9DMTYsTE9ORyxXT1JELFdPUkQsTE9ORyxMT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLExPTkcsV09SRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcsTE9ORyxMT05HKTsKK2V4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfbGxsbGxsbGwoRkFSUFJPQzE2LExPTkcsTE9ORyxMT05HLExPTkcsTE9ORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyxMT05HLExPTkcpOworZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfbG9uZ19sbGxsbGxsbGwoRkFSUFJPQzE2LExPTkcsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLExPTkcsTE9ORyxMT05HLExPTkcpOworZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfbG9uZ19sbGxsbGxsbGxsKEZBUlBST0MxNixMT05HLExPTkcsTE9ORyxMT05HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcsTE9ORyxMT05HLExPTkcsTE9ORyxMT05HKTsKK2V4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfbGxsbGxsbGxsbGwoRkFSUFJPQzE2LExPTkcsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcsTE9ORyxMT05HLExPTkcsTE9ORyxMT05HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HKTsKK2V4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfbGxsbGxsbGxsbGxsKEZBUlBST0MxNixMT05HLExPTkcsTE9ORyxMT05HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyxMT05HLExPTkcsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLExPTkcpOwogZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfbG9uZ19sd3dsbHdsbGxsbHcoRkFSUFJPQzE2LExPTkcsV09SRCxXT1JELExPTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLFdPUkQsTE9ORyxMT05HLExPTkcsTE9ORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcsV09SRCk7CitleHRlcm4gTE9ORyBDQUxMQkFDSyBDYWxsVG8xNl9sb25nX2xsbGxsbGxsbGxsbGwoRkFSUFJPQzE2LExPTkcsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyxMT05HLExPTkcsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyxMT05HLExPTkcpOworZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfbG9uZ19sbGxsbGxsbGxsbGxsbChGQVJQUk9DMTYsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcsTE9ORyxMT05HLExPTkcsTE9ORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyxMT05HLExPTkcsTE9ORyxMT05HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HKTsKIGV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X3dvcmRfbHd3d3dsd3d3d2xsbGwoRkFSUFJPQzE2LExPTkcsV09SRCxXT1JELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JELFdPUkQsTE9ORyxXT1JELFdPUkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQsV09SRCxMT05HLExPTkcsTE9ORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyk7CitleHRlcm4gTE9ORyBDQUxMQkFDSyBDYWxsVG8xNl9sb25nX2xsbGxsbGxsbGxsbGxsbChGQVJQUk9DMTYsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLExPTkcsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLExPTkcsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLExPTkcpOworZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfbG9uZ19sbGxsbGxsbGxsbGxsbGxsKEZBUlBST0MxNixMT05HLExPTkcsTE9ORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLExPTkcsTE9ORyxMT05HLExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyxMT05HLExPTkcsTE9ORyxMT05HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcsTE9ORyxMT05HKTsKIC8qICMjIyBzdG9wIGJ1aWxkICMjIyAqLwogCiAKQEAgLTg5LDYgKzEyNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG1zZywgV1BBUkFNMTYgd1BhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKTsKIHN0YXRpYyB2b2lkIFdJTkFQSSBUSFVOS19DYWxsVGFza1Jlc2NoZWR1bGUodm9pZCk7CitzdGF0aWMgQk9PTDMyIFdJTkFQSSBUSFVOS19XT1dDYWxsYmFjazE2RXgoIEZBUlBST0MxNixEV09SRCxEV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lELExQRFdPUkQgKTsKIAogLyogVEFTS19SZXNjaGVkdWxlKCkgMTYtYml0IGVudHJ5IHBvaW50ICovCiBzdGF0aWMgRkFSUFJPQzE2IFRBU0tfUmVzY2hlZHVsZVByb2M7CkBAIC0xMTIsNiArMTUyLDcgQEAKICAgICAodm9pZCAqKUNhbGxUbzE2X3dvcmRfd3d3LCAgICAgICAgICAgICAvKiBDYWxsTG9hZEFwcFNlZ1Byb2MgKi8KICAgICAodm9pZCAqKUNhbGxUbzE2X3dvcmRfLCAgICAgICAgICAgICAgICAvKiBDYWxsU3lzdGVtVGltZXJQcm9jICovCiAgICAgKHZvaWQgKilDYWxsVG8xNl9sb25nX2wsICAgICAgICAgICAgICAgLyogQ2FsbFdPV0NhbGxiYWNrUHJvYyAqLworICAgIFRIVU5LX1dPV0NhbGxiYWNrMTZFeCwgICAgICAgICAgICAgICAgIC8qIENhbGxXT1dDYWxsYmFjazE2RXggKi8KICAgICAodm9pZCAqKUNhbGxUbzE2X2xvbmdfbCwgICAgICAgICAgICAgICAvKiBDYWxsQVNQSVBvc3RQcm9jICovCiAgICAgKHZvaWQgKilDYWxsVG8xNl93b3JkX2x3bGwsICAgICAgICAgICAgLyogQ2FsbERydkNvbnRyb2xQcm9jICovCiAgICAgKHZvaWQgKilDYWxsVG8xNl93b3JkX2x3bGxsLCAgICAgICAgICAgLyogQ2FsbERydkVuYWJsZVByb2MgKi8KQEAgLTEyMCw3ICsxNjEsOCBAQAogICAgICh2b2lkICopQ2FsbFRvMTZfd29yZF9sd3dsbGxsbCwgICAgICAgIC8qIENhbGxEcnZPdXRwdXRQcm9jICovCiAgICAgKHZvaWQgKilDYWxsVG8xNl9sb25nX2x3bGxsLCAgICAgICAgICAgLyogQ2FsbERydlJlYWxpemVQcm9jICovCiAgICAgKHZvaWQgKilDYWxsVG8xNl93b3JkX2x3d3d3bHd3d3dsbGxsLCAgLyogQ2FsbERydlN0cmV0Y2hCbHRQcm9jICovCi0gICAgKHZvaWQgKilDYWxsVG8xNl9sb25nX2x3d2xsd2xsbGxsdyAgICAgLyogQ2FsbERydkV4dFRleHRPdXRQcm9jICovCisgICAgKHZvaWQgKilDYWxsVG8xNl9sb25nX2x3d2xsd2xsbGxsdywgICAgLyogQ2FsbERydkV4dFRleHRPdXRQcm9jICovCisgICAgKHZvaWQgKilDYWxsVG8xNl93b3JkX2xsd3dsbGwgICAgICAgICAgLyogQ2FsbERydkdldENoYXJXaWR0aCAqLyAKIH07CiAKIApAQCAtMjAzLDE1ICsyNDUsMTYgQEAKICAgICBXT1JEICphcmdzOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBEV09SRCBvZmZzZXQgPSAwOworICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOwogCiAgICAgLyogV2luZG93IHByb2NlZHVyZXMgd2FudCBheCA9IGhJbnN0YW5jZSwgZHMgPSBlcyA9IHNzICovCiAKLSAgICBEU19yZWcoJmNvbnRleHQpICA9IFNFTEVDVE9ST0YoSUYxNjMyX1NhdmVkMTZfc3Nfc3ApOworICAgIERTX3JlZygmY29udGV4dCkgID0gU0VMRUNUT1JPRih0aGRiLT5jdXJfc3RhY2spOwogICAgIEVTX3JlZygmY29udGV4dCkgID0gRFNfcmVnKCZjb250ZXh0KTsKICAgICBFQVhfcmVnKCZjb250ZXh0KSA9IHduZFB0ciA/IHduZFB0ci0+aEluc3RhbmNlIDogRFNfcmVnKCZjb250ZXh0KTsKICAgICBDU19yZWcoJmNvbnRleHQpICA9IFNFTEVDVE9ST0YocHJvYyk7CiAgICAgRUlQX3JlZygmY29udGV4dCkgPSBPRkZTRVRPRihwcm9jKTsKLSAgICBFQlBfcmVnKCZjb250ZXh0KSA9IE9GRlNFVE9GKElGMTYzMl9TYXZlZDE2X3NzX3NwKQorICAgIEVCUF9yZWcoJmNvbnRleHQpID0gT0ZGU0VUT0YodGhkYi0+Y3VyX3N0YWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgKyAoV09SRCkmKChTVEFDSzE2RlJBTUUqKTApLT5icDsKIAogICAgIGlmIChsUGFyYW0pCkBAIC0yMzUsMTIgKzI3OCwxMiBAQAogCWlmIChvZmZzZXQpCiAJewogCSAgICB2b2lkICpzID0gUFRSX1NFR19UT19MSU4obFBhcmFtKTsKLQkgICAgbFBhcmFtID0gU1RBQ0sxNl9QVVNIKCBvZmZzZXQgKTsKKwkgICAgbFBhcmFtID0gU1RBQ0sxNl9QVVNIKCB0aGRiLCBvZmZzZXQgKTsKIAkgICAgbWVtY3B5KCBQVFJfU0VHX1RPX0xJTihsUGFyYW0pLCBzLCBvZmZzZXQgKTsKIAl9CiAgICAgfQogCi0gICAgYXJncyA9IChXT1JEICopQ1VSUkVOVF9TVEFDSzE2IC0gNTsKKyAgICBhcmdzID0gKFdPUkQgKilUSFJFQURfU1RBQ0sxNih0aGRiKSAtIDU7CiAgICAgYXJnc1swXSA9IExPV09SRChsUGFyYW0pOwogICAgIGFyZ3NbMV0gPSBISVdPUkQobFBhcmFtKTsKICAgICBhcmdzWzJdID0gd1BhcmFtOwpAQCAtMjQ4LDcgKzI5MSw3IEBACiAgICAgYXJnc1s0XSA9IGh3bmQ7CiAKICAgICByZXQgPSBDYWxsVG8xNl9zcmVnXyggJmNvbnRleHQsIDUgKiBzaXplb2YoV09SRCkgKTsKLSAgICBpZiAob2Zmc2V0KSBTVEFDSzE2X1BPUChvZmZzZXQpOworICAgIGlmIChvZmZzZXQpIFNUQUNLMTZfUE9QKCB0aGRiLCBvZmZzZXQgKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC01NzMsMyArNjE2LDk0IEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFVOS19XT1dDYWxsYmFjazE2RXgJKFdPVzMyLjMpKEtFUk5FTDMyLjU1KQorICovCitzdGF0aWMgQk9PTDMyIFdJTkFQSSBUSFVOS19XT1dDYWxsYmFjazE2RXgoCisJRkFSUFJPQzE2IHByb2MsRFdPUkQgZHdGbGFncyxEV09SRCBjYkFyZ3MsTFBWT0lEIHhhcmdzLExQRFdPUkQgcGR3cmV0CispIHsKKyAgICBMUERXT1JEICAgICBhcmdzID0gKExQRFdPUkQpeGFyZ3M7CisgICAgRFdPUkQgICAgICAgcmV0LGk7CisKKyAgICBkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiV09XQ2FsbGJhY2sxNkV4KCVwLDB4JTA4bHgsJWxkLCVwLCVwKVxuIiwKKyAgICAJcHJvYyxkd0ZsYWdzLGNiQXJncyx4YXJncyxwZHdyZXQKKyAgICApOworICAgIGlmIChkd0ZsYWdzID09IFdDQjE2X0NERUNMKSB7CisJLyogc3dhcCB0aGUgYXJndW1lbnRzICovCisJYXJncyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsY2JBcmdzKnNpemVvZihEV09SRCkpOworCWZvciAoaT0wO2k8Y2JBcmdzO2krKykKKwkgICAgYXJnc1tpXSA9ICgoRFdPUkQqKXhhcmdzKVtjYkFyZ3MtaS0xXTsKKyAgICB9CisgICAgc3dpdGNoIChjYkFyZ3MpIHsKKyAgICBjYXNlIDA6IHJldCA9IENhbGxUbzE2X2xvbmdfKHByb2MpO2JyZWFrOworICAgIGNhc2UgMTogcmV0ID0gQ2FsbFRvMTZfbG9uZ19sKHByb2MsYXJnc1swXSk7YnJlYWs7CisgICAgY2FzZSAyOiByZXQgPSBDYWxsVG8xNl9sb25nX2xsKHByb2MsYXJnc1swXSxhcmdzWzFdKTticmVhazsKKyAgICBjYXNlIDM6IHJldCA9IENhbGxUbzE2X2xvbmdfbGxsKHByb2MsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2JyZWFrOworICAgIGNhc2UgNDogcmV0ID0gQ2FsbFRvMTZfbG9uZ19sbGxsKHByb2MsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7CisJICAgIGJyZWFrOworICAgIGNhc2UgNTogcmV0ID0gQ2FsbFRvMTZfbG9uZ19sbGxsbChwcm9jLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sCisJCWFyZ3NbNF0KKwkgICAgKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSA2OiByZXQgPSBDYWxsVG8xNl9sb25nX2xsbGxsbChwcm9jLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sCisJCWFyZ3NbNF0sYXJnc1s1XQorCSAgICApOworCSAgICBicmVhazsKKyAgICBjYXNlIDc6IHJldCA9IENhbGxUbzE2X2xvbmdfbGxsbGxsbChwcm9jLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sCisJCWFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdCisJICAgICk7CisJICAgIGJyZWFrOworICAgIGNhc2UgODogcmV0ID0gQ2FsbFRvMTZfbG9uZ19sbGxsbGxsbChwcm9jLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sCisgIAkJYXJnc1s0XSxhcmdzWzVdLGFyZ3NbNl0sYXJnc1s3XQorCSAgICApOworCSAgICBicmVhazsKKyAgICBjYXNlIDk6IHJldCA9IENhbGxUbzE2X2xvbmdfbGxsbGxsbGxsKHByb2MsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSwKKyAgICAJCWFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XQorCSAgICApOworCSAgICBicmVhazsKKyAgICBjYXNlIDEwOnJldCA9IENhbGxUbzE2X2xvbmdfbGxsbGxsbGxsbChwcm9jLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sCisgICAgCQlhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XQorCSAgICApOworCSAgICBicmVhazsKKyAgICBjYXNlIDExOnJldCA9IENhbGxUbzE2X2xvbmdfbGxsbGxsbGxsbGwocHJvYyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSwKKyAgICAJCWFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0KKwkgICAgKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSAxMjpyZXQgPSBDYWxsVG8xNl9sb25nX2xsbGxsbGxsbGxsbChwcm9jLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLAorICAgIAkJYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSwKKwkJYXJnc1sxMF0sYXJnc1sxMV0KKwkgICAgKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSAxMzpyZXQgPSBDYWxsVG8xNl9sb25nX2xsbGxsbGxsbGxsbGwocHJvYyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSwKKyAgICAJCWFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sCisJCWFyZ3NbMTBdLGFyZ3NbMTFdLGFyZ3NbMTJdCisJICAgICk7CisJICAgIGJyZWFrOworICAgIGNhc2UgMTQ6cmV0ID0gQ2FsbFRvMTZfbG9uZ19sbGxsbGxsbGxsbGxsbChwcm9jLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLAorICAgIAkJYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSwKKwkJYXJnc1sxMF0sYXJnc1sxMV0sYXJnc1sxMl0sYXJnc1sxM10KKwkgICAgKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSAxNTpyZXQgPSBDYWxsVG8xNl9sb25nX2xsbGxsbGxsbGxsbGxsbChwcm9jLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLAorICAgIAkJYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSwKKwkJYXJnc1sxMF0sYXJnc1sxMV0sYXJnc1sxMl0sYXJnc1sxM10sYXJnc1sxNF0KKwkgICAgKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSAxNjpyZXQgPSBDYWxsVG8xNl9sb25nX2xsbGxsbGxsbGxsbGxsbGwocHJvYyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSwKKyAgICAJCWFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sCisJCWFyZ3NbMTBdLGFyZ3NbMTFdLGFyZ3NbMTJdLGFyZ3NbMTNdLGFyZ3NbMTRdLGFyZ3NbMTVdCisJICAgICk7CisJICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisJICAgIGZwcmludGYoc3RkZXJyLCJDQUxMQkFDS19DYWxsV09XQ2FsbGJhY2sxNkV4KCksICVsZCBhcmd1bWVudHMgbm90IHN1cHBvcnRlZC4hbiIsY2JBcmdzKTsKKwkgICAgaWYgKGR3RmxhZ3MgPT0gV0NCMTZfQ0RFQ0wpCisJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxhcmdzKTsKKwkgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoZHdGbGFncyA9PSBXQ0IxNl9DREVDTCkKKyAgICAJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFyZ3MpOworICAgIGlmIChwZHdyZXQpIAorICAgIAkqcGR3cmV0ID0gcmV0OworICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggODE0YTE5Zi4uMzNkOGMzYyAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIuc3BlYworKysgYi9pZjE2MzIvdXNlci5zcGVjCkBAIC0zMDYsMTUgKzMwNiwyNSBAQAogIzMwNiBCRUFSMzA2CiAzMDggcGFzY2FsICAgRGVmRGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBEZWZEbGdQcm9jMTYKIDMwOSBwYXNjYWwxNiBHZXRDbGlwQ3Vyc29yKHB0cikgR2V0Q2xpcEN1cnNvcjE2CisjMzEwIENvbnRTY3JvbGwKKyMzMTIgU2VuZE1lc3NhZ2UyCisjMzEzIFBvc3RNZXNzYWdlMgogMzE0IHBhc2NhbDE2IFNpZ25hbFByb2Mod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkKSBVU0VSX1NpZ25hbFByb2MKKyMzMTUgWENTdG9EUworIzMxNiBDb21wVXBkYXRlUmVjdAorIzMxNyBDb21wVXBkYXRlUmduCisjMzE4IEdldFdDMgogMzE5IHBhc2NhbDE2IFNjcm9sbFdpbmRvd0V4KHdvcmQgc193b3JkIHNfd29yZCBwdHIgcHRyIHdvcmQgcHRyIHdvcmQpIFNjcm9sbFdpbmRvd0V4MTYKIDMyMCBzdHViIFN5c0Vycm9yQm94Ci0zMjEgc3R1YiBTZXRFdmVudEhvb2sKKzMyMSBwYXNjYWwgICBTZXRFdmVudEhvb2soc2VncHRyKSBTZXRFdmVudEhvb2sKIDMyMiBzdHViIFdpbk9sZEFwcEhhY2tPTWF0aWMKIDMyMyBzdHViIEdldE1lc3NhZ2UyCiAzMjQgcGFzY2FsMTYgRmlsbFdpbmRvdyh3b3JkIHdvcmQgd29yZCB3b3JkKSBGaWxsV2luZG93CiAzMjUgcGFzY2FsMTYgUGFpbnRSZWN0KHdvcmQgd29yZCB3b3JkIHdvcmQgcHRyKSBQYWludFJlY3QKIDMyNiBwYXNjYWwxNiBHZXRDb250cm9sQnJ1c2god29yZCB3b3JkIHdvcmQpIEdldENvbnRyb2xCcnVzaAorIzMyNyBLaWxsVGltZXIyCisjMzI4IFNldFRpbWVyMgorIzMzMCBTZXRHZXRLYmRTdGF0ZQogMzMxIHBhc2NhbDE2IEVuYWJsZUhhcmR3YXJlSW5wdXQod29yZCkgRW5hYmxlSGFyZHdhcmVJbnB1dAogMzMyIHBhc2NhbDE2IFVzZXJZaWVsZCgpIFVzZXJZaWVsZAogMzMzIHBhc2NhbDE2IElzVXNlcklkbGUoKSBJc1VzZXJJZGxlCkBAIC0zMjIsOCArMzMyLDExIEBACiAzMzUgcGFzY2FsMTYgR2V0SW5wdXRTdGF0ZSgpIEdldElucHV0U3RhdGUxNgogMzM2IHBhc2NhbDE2IExvYWRDdXJzb3JJY29uSGFuZGxlcih3b3JkIHdvcmQgd29yZCkgTG9hZEN1cnNvckljb25IYW5kbGVyCiAzMzcgcGFzY2FsICAgR2V0TW91c2VFdmVudFByb2MoKSBHZXRNb3VzZUV2ZW50UHJvYworIzM0MCBXaW5GYXJGcmFtZQogIzM0MSBfRkZGRV9GQVJGUkFNRQogMzQzIHN0dWIgR2V0RmlsZVBvcnROYW1lCisjMzU0IFRhYlRoZVRleHRPdXRGb3JXaW1wcworIzM1NSBCcm9hZGNhc3RNZXNzYWdlCiAzNTYgcGFzY2FsMTYgTG9hZERJQkN1cnNvckhhbmRsZXIod29yZCB3b3JkIHdvcmQpIExvYWRESUJDdXJzb3JIYW5kbGVyCiAzNTcgcGFzY2FsMTYgTG9hZERJQkljb25IYW5kbGVyKHdvcmQgd29yZCB3b3JkKSBMb2FkRElCSWNvbkhhbmRsZXIKIDM1OCBwYXNjYWwxNiBJc01lbnUod29yZCkgSXNNZW51MTYKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW4zMnMxNi5zcGVjIGIvaWYxNjMyL3dpbjMyczE2LnNwZWMKaW5kZXggYTgyYWZmMi4uNDY4YjU2ZSAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbjMyczE2LnNwZWMKKysrIGIvaWYxNjMyL3dpbjMyczE2LnNwZWMKQEAgLTQzLDcgKzQzLDcgQEAKIDQwIHN0dWIgUk1FTUNQWQogNDEgc3R1YiBJTklUUkVTTE9BREVSCiA0MiBzdHViIEZSRUVTRUxFQ1RPUk9GRlNFVAotNDMgc3R1YiBTVEFDS0xJTkVBUlRPU0VHTUVOVEVECis0MyBwYXNjYWwgU3RhY2tMaW5lYXJUb1NlZ21lbnRlZCh3b3JkIHdvcmQpIFN0YWNrTGluZWFyVG9TZWdtZW50ZWQKIDQ0IHN0dWIgR0VUTU9EVUxFRklMRU5BTUUzMlMKIDQ1IHN0dWIgRkFQSUxPRzE2CiA0NiBzdHViIEFMTE9DQ0FMTEJBQ0sKQEAgLTU2LDMgKzU2LDQgQEAKIDUzIHN0dWIgRklOREdMT0JBTEhBTkRMRQogCiAjNTQtMjg5IGV4aXN0LCBidXQgZnVuY3Rpb24gbmFtZXMgYmxhbmtlZCBvdXQKKzE0MyBlcXVhdGUgd2luMzJzMTZfMTQzICAweDEwMApkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbmFzcGkuc3BlYyBiL2lmMTYzMi93aW5hc3BpLnNwZWMKaW5kZXggOTQ3NGI3MS4uYWIyZDc3YiAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbmFzcGkuc3BlYworKysgYi9pZjE2MzIvd2luYXNwaS5zcGVjCkBAIC0zLDUgKzMsNiBAQAogCiAxCXBhc2NhbDE2IEdldEFTUElTdXBwb3J0SW5mbygpIEdldEFTUElTdXBwb3J0SW5mbzE2CiAyCXBhc2NhbDE2IFNlbmRBU1BJQ29tbWFuZChzZWdwdHIpIFNlbmRBU1BJQ29tbWFuZDE2Ci0jMwlzdHViIEdFVEFTUElETExWRVJTSU9OCi0jMwlzdHViIElOU0VSVElOQVNQSUNIQUlOCiszICAgICAgIHN0dWIgSU5TRVJUSU5BU1BJQ0hBSU4KKzQJcGFzY2FsIEdFVEFTUElETExWRVJTSU9OKCkgR2V0QVNQSURMTFZlcnNpb24KKzUJc3R1YiBfX19FWFBPUlRFRFNUVUIKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5kZWJ1Zy5zcGVjIGIvaWYxNjMyL3dpbmRlYnVnLnNwZWMKaW5kZXggN2I0ZmI2Yi4uNDM3MDY4ZiAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbmRlYnVnLnNwZWMKKysrIGIvaWYxNjMyL3dpbmRlYnVnLnNwZWMKQEAgLTMsNCArMyw0IEBACiAKICAgMSBzdHViICAgICBXSU5ERUJVRwogICAyIHN0dWIgICAgIFdFUAotICAzIHBhc2NhbCAgIFdpbk5vdGlmeSgpIFdpbk5vdGlmeQorICAzIHJlZ2lzdGVyIFdpbk5vdGlmeSgpIFdpbk5vdGlmeQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dwcm9jcy5zcGVjIGIvaWYxNjMyL3dwcm9jcy5zcGVjCmluZGV4IDYxY2U1ZjMuLmVlMjQyMjkgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93cHJvY3Muc3BlYworKysgYi9pZjE2MzIvd3Byb2NzLnNwZWMKQEAgLTQ4LDcgKzQ4LDcgQEAKIDEyOSByZWdpc3RlciBJTlRfSW50MWRIYW5kbGVyKHdvcmQpIEJVSUxUSU5fRGVmYXVsdEludEhhbmRsZXIKIDEzMCByZWdpc3RlciBJTlRfSW50MWVIYW5kbGVyKHdvcmQpIEJVSUxUSU5fRGVmYXVsdEludEhhbmRsZXIKIDEzMSByZWdpc3RlciBJTlRfSW50MWZIYW5kbGVyKHdvcmQpIEJVSUxUSU5fRGVmYXVsdEludEhhbmRsZXIKLTEzMiByZWdpc3RlciBJTlRfSW50MjBIYW5kbGVyKHdvcmQpIEJVSUxUSU5fRGVmYXVsdEludEhhbmRsZXIKKzEzMiByZWdpc3RlciBJTlRfSW50MjBIYW5kbGVyKHdvcmQpIElOVF9JbnQyMEhhbmRsZXIKIDEzMyByZWdpc3RlciBJTlRfSW50MjFIYW5kbGVyKHdvcmQpIERPUzNDYWxsCiAxMzQgcmVnaXN0ZXIgSU5UX0ludDIySGFuZGxlcih3b3JkKSBCVUlMVElOX0RlZmF1bHRJbnRIYW5kbGVyCiAxMzUgcmVnaXN0ZXIgSU5UX0ludDIzSGFuZGxlcih3b3JkKSBCVUlMVElOX0RlZmF1bHRJbnRIYW5kbGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcC5oIGIvaW5jbHVkZS9iaXRtYXAuaAppbmRleCBhZTAyZTc2Li4zNjkwZGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2JpdG1hcC5oCisrKyBiL2luY2x1ZGUvYml0bWFwLmgKQEAgLTEyLDcgKzEyLDcgQEAKIAogI2lmZGVmIFBSRUxJTUlOQVJZX1dJTkcxNl9TVVBQT1JUCiAvKiBGSVhNRTogdGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlICovCi0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWFNobS5oPgorI2luY2x1ZGUgInRzX3hzaG0uaCIKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTM4LDEyICszOCwxMyBAQAogICAoKChibXApLT5iaXRtYXAuYm1CaXRzUGl4ZWwgPT0gMSkgPyBCSVRNQVBfbW9ub0dDIDogQklUTUFQX2NvbG9yR0MpCiAKICNkZWZpbmUgQklUTUFQX1dJRFRIX0JZVEVTKHdpZHRoLGJwcCkgXAotICAgICgoKGJwcCkgPT0gMjQpID8gKHdpZHRoKSAqIDQgOiAoKHdpZHRoKSAqIChicHApICsgMTUpIC8gMTYgKiAyKQorICAgICgoKGJwcCkgPT0gMjQpID8gKHdpZHRoKSAqIDQgOiAoICgoYnBwKSA9PSAxNSkgPyAod2lkdGgpICogMiA6IFwKKwkJCQkgICAgKCh3aWR0aCkgKiAoYnBwKSArIDE1KSAvIDE2ICogMiApKQogCiAjZGVmaW5lIFhDUkVBVEVJTUFHRShpbWFnZSx3aWR0aCxoZWlnaHQsYnBwKSBcCiB7IFwKICAgICBpbnQgd2lkdGhfYnl0ZXMgPSBESUJfR2V0WEltYWdlV2lkdGhCeXRlcyggKHdpZHRoKSwgKGJwcCkgKTsgXAotICAgIChpbWFnZSkgPSBYQ3JlYXRlSW1hZ2UoZGlzcGxheSwgRGVmYXVsdFZpc3VhbE9mU2NyZWVuKHNjcmVlbiksIFwKKyAgICAoaW1hZ2UpID0gVFNYQ3JlYXRlSW1hZ2UoZGlzcGxheSwgRGVmYXVsdFZpc3VhbE9mU2NyZWVuKHNjcmVlbiksIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChicHApLCBaUGl4bWFwLCAwLCB4bWFsbG9jKCAoaGVpZ2h0KSp3aWR0aF9ieXRlcyApLFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aWR0aCksIChoZWlnaHQpLCAzMiwgd2lkdGhfYnl0ZXMgKTsgXAogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYWxsYmFjay5oIGIvaW5jbHVkZS9jYWxsYmFjay5oCmluZGV4IGMwMmFiY2MuLmE4NjY4YTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FsbGJhY2suaAorKysgYi9pbmNsdWRlL2NhbGxiYWNrLmgKQEAgLTM4LDYgKzM4LDggQEAKICAgICBXT1JEIChDQUxMQkFDSyAqQ2FsbExvYWRBcHBTZWdQcm9jKSggRkFSUFJPQzE2LCBIQU5ETEUxNiwgSEZJTEUxNiwgV09SRCApOwogICAgIFZPSUQgKENBTExCQUNLICpDYWxsU3lzdGVtVGltZXJQcm9jKSggRkFSUFJPQzE2ICk7CiAgICAgRFdPUkQgKENBTExCQUNLICpDYWxsV09XQ2FsbGJhY2tQcm9jKSggRkFSUFJPQzE2LCBEV09SRCApOworICAgIEJPT0wzMiAoQ0FMTEJBQ0sgKkNhbGxXT1dDYWxsYmFjazE2RXgpKCBGQVJQUk9DMTYsIERXT1JELCBEV09SRCwgTFBWT0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCApOwogICAgIExSRVNVTFQgKENBTExCQUNLICpDYWxsQVNQSVBvc3RQcm9jKSggRkFSUFJPQzE2LCBTRUdQVFIgKTsKICAgICAvKiBGb2xsb3dpbmcgYXJlIHRoZSBncmFwaGljcyBkcml2ZXIgY2FsbGJhY2tzICovCiAgICAgV09SRCAoQ0FMTEJBQ0sgKkNhbGxEcnZDb250cm9sUHJvYykoIEZBUlBST0MxNiwgU0VHUFRSLCBXT1JELApAQCAtNjAsNiArNjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSLCBTRUdQVFIsIElOVDE2LCBTRUdQVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIsIFNFR1BUUiwgU0VHUFRSLCBTRUdQVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICk7CisgICAgV09SRCAoQ0FMTEJBQ0sgKkNhbGxEcnZHZXRDaGFyV2lkdGhQcm9jKSggRkFSUFJPQzE2LCBTRUdQVFIsIFNFR1BUUiwgV09SRCwKKwkJCQkJICAgICAgV09SRCwgU0VHUFRSLCBTRUdQVFIsIFNFR1BUUiApOwogfSBDQUxMQkFDS1NfVEFCTEU7CiAKIGV4dGVybiBjb25zdCBDQUxMQkFDS1NfVEFCTEUgKkNhbGxiYWNrczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbWRsZy5oIGIvaW5jbHVkZS9jb21tZGxnLmgKaW5kZXggNGY2ZTc4ZS4uZjMzYTNhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21tZGxnLmgKKysrIGIvaW5jbHVkZS9jb21tZGxnLmgKQEAgLTI5LDYgKzI5LDE0IEBACiAjZGVmaW5lIE9GTl9OT1JFQURPTkxZUkVUVVJOICAgICAgICAgMHgwMDAwODAwMAogI2RlZmluZSBPRk5fTk9URVNURklMRUNSRUFURSAgICAgICAgIDB4MDAwMTAwMDAKIAorLyogICAgICBPRk5fPyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAgKi8KKworI2RlZmluZSBPRk5fTk9MT05HTkFNRVMgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgT0ZOX0VYUExPUkVSICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIE9GTl9OT0RFUkVGRVJFTkNFTElOS1MgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBPRk5fTE9OR05BTUVTICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKworLyogV0lORSBpbnRlcm5hbCBmbGFncyAqLwogI2RlZmluZSBPRk5fVU5JQ09ERQkJICAgICAweDQwMDAwMDAwCS8qdG8gZGlmZmVyIGJldHdlZW4gMzJXL0EgaG9vayovCiAjZGVmaW5lIE9GTl9XSU5FMzIJCSAgICAgMHg4MDAwMDAwMAkvKiBjb21kbGczMiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbXBvYmouaCBiL2luY2x1ZGUvY29tcG9iai5oCmluZGV4IDZmMjI4OWYuLjliNzRlZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tcG9iai5oCisrKyBiL2luY2x1ZGUvY29tcG9iai5oCkBAIC0xMSw3ICsxMSw3IEBACiAgICAgQllURSAgRGF0YTRbOF07CiB9OwogCi10eXBlZGVmIHN0cnVjdCB0YWdHVUlECUdVSUQsKkxQR1VJRDsKK3R5cGVkZWYgc3RydWN0IHRhZ0dVSUQJR1VJRCwqTFBHVUlELCpSRUZHVUlEOwogdHlwZWRlZiBzdHJ1Y3QgdGFnR1VJRAlDTFNJRCwqTFBDTFNJRCwqUkVGQ0xTSUQ7CiB0eXBlZGVmIHN0cnVjdCB0YWdHVUlECUlJRCwqUkVGSUlELCpMUElJRDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jdXJzb3JpY29uLmggYi9pbmNsdWRlL2N1cnNvcmljb24uaAppbmRleCA2OTE0ODdlLi41YTkzMTJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2N1cnNvcmljb24uaAorKysgYi9pbmNsdWRlL2N1cnNvcmljb24uaApAQCAtNyw3ICs3LDcgQEAKICNpZm5kZWYgX19XSU5FX0NVUlNPUklDT05fSAogI2RlZmluZSBfX1dJTkVfQ1VSU09SSUNPTl9ICiAKLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKICNwcmFnbWEgcGFjaygxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kM2QuaCBiL2luY2x1ZGUvZDNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxMGYzYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZDNkLmgKQEAgLTAsMCArMSw0MTggQEAKKyNpZm5kZWYgX1dJTkVfRDNEX0gKKyNkZWZpbmUgX1dJTkVfRDNEX0gKKwordHlwZWRlZiBMUFZPSUQgTFBESVJFQ1QzRE1BVEVSSUFMLExQRElSRUNUM0RWSUVXUE9SVDsKK3R5cGVkZWYgTFBWT0lEIExQRElSRUNUM0RNQVRFUklBTDIsTFBESVJFQ1QzRFZJRVdQT1JUMjsKK3R5cGVkZWYgTFBWT0lEIExQRElSRUNUM0RERVZJQ0UyOworCitERUZJTkVfR1VJRChJSURfSURpcmVjdDNELAkJMHgzQkJBMDA4MCwweDI0MjEsMHgxMUNGLDB4QTMsMHgxQSwweDAwLDB4QUEsMHgwMCwweEI5LDB4MzMsMHg1NiApOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3QzRDIsCQkweDZhYWUxZWMxLDB4NjYyYSwweDExZDAsMHg4OCwweDlkLDB4MDAsMHhhYSwweDAwLDB4YmIsMHhiNywweDZhKTsKKworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3QzRFJhbXBEZXZpY2UsCTB4RjIwODZCMjAsMHgyNTlGLDB4MTFDRiwweEEzLDB4MUEsMHgwMCwweEFBLDB4MDAsMHhCOSwweDMzLDB4NTYgKTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RSR0JEZXZpY2UsCTB4QTQ2NjVDNjAsMHgyNjczLDB4MTFDRiwweEEzLDB4MUEsMHgwMCwweEFBLDB4MDAsMHhCOSwweDMzLDB4NTYgKTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RIQUxEZXZpY2UsCTB4ODRFNjNkRTAsMHg0NkFBLDB4MTFDRiwweDgxLDB4NkYsMHgwMCwweDAwLDB4QzAsMHgyMCwweDE1LDB4NkUgKTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RNTVhEZXZpY2UsCTB4ODgxOTQ5YTEsMHhkNmYzLDB4MTFkMCwweDg5LDB4YWIsMHgwMCwweGEwLDB4YzksMHgwNSwweDQxLDB4MjkgKTsKKworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3QzRERldmljZSwJMHg2NDEwODgwMCwweDk1N2QsMHgxMUQwLDB4ODksMHhBQiwweDAwLDB4QTAsMHhDOSwweDA1LDB4NDEsMHgyOSApOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3QzRERldmljZTIsCTB4OTMyODE1MDEsMHg4Q0Y4LDB4MTFEMCwweDg5LDB4QUIsMHgwMCwweEEwLDB4QzksMHgwNSwweDQxLDB4MjkpOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3QzRFRleHR1cmUsCTB4MkNEQ0Q5RTAsMHgyNUEwLDB4MTFDRiwweEEzLDB4MUEsMHgwMCwweEFBLDB4MDAsMHhCOSwweDMzLDB4NTYpOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3QzRFRleHR1cmUyLAkweDkzMjgxNTAyLDB4OENGOCwweDExRDAsMHg4OSwweEFCLDB4MDAsMHhBMCwweEM5LDB4MDUsMHg0MSwweDI5KTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RMaWdodCwJCTB4NDQxN0MxNDIsMHgzM0FELDB4MTFDRiwweDgxLDB4NkYsMHgwMCwweDAwLDB4QzAsMHgyMCwweDE1LDB4NkUpOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3QzRE1hdGVyaWFsLAkweDQ0MTdDMTQ0LDB4MzNBRCwweDExQ0YsMHg4MSwweDZGLDB4MDAsMHgwMCwweEMwLDB4MjAsMHgxNSwweDZFKTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RNYXRlcmlhbDIsCTB4OTMyODE1MDMsMHg4Q0Y4LDB4MTFEMCwweDg5LDB4QUIsMHgwMCwweEEwLDB4QzksMHgwNSwweDQxLDB4MjkpOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3QzREV4ZWN1dGVCdWZmZXIsCTB4NDQxN0MxNDUsMHgzM0FELDB4MTFDRiwweDgxLDB4NkYsMHgwMCwweDAwLDB4QzAsMHgyMCwweDE1LDB4NkUpOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3QzRFZpZXdwb3J0LAkweDQ0MTdDMTQ2LDB4MzNBRCwweDExQ0YsMHg4MSwweDZGLDB4MDAsMHgwMCwweEMwLDB4MjAsMHgxNSwweDZFKTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RWaWV3cG9ydDIsCTB4OTMyODE1MDAsMHg4Q0Y4LDB4MTFEMCwweDg5LDB4QUIsMHgwMCwweEEwLDB4QzksMHgwNSwweDQxLDB4MjkpOworCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0QJSURpcmVjdDNEICwqTFBESVJFQ1QzRCA7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0QyCUlEaXJlY3QzRDIsKkxQRElSRUNUM0QyOwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNETGlnaHQJSURpcmVjdDNETGlnaHQsKkxQRElSRUNUM0RMSUdIVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCURXT1JECWR3U2l6ZTsKKwlEV09SRAlkd0NhcHM7Cit9IEQzRFRSQU5TRk9STUNBUFMsKkxQRDNEVFJBTlNGT1JNQ0FQUzsKKworI2RlZmluZSBEM0RUUkFOU0ZPUk1DQVBTX0NMSVAJMHgwMDAwMDAwMQorCit0eXBlZGVmIHN0cnVjdCB7CisJRFdPUkQJZHdTaXplOworCURXT1JECWR3Q2FwczsKKwlEV09SRAlkd0xpZ2h0aW5nTW9kZWw7CisJRFdPUkQJZHdOdW1MaWdodHM7Cit9IEQzRExJR0hUSU5HQ0FQUywgKkxQRDNETElHSFRJTkdDQVBTOworCisjZGVmaW5lIEQzRExJR0hUSU5HTU9ERUxfUkdCCQkweDAwMDAwMDAxCisjZGVmaW5lIEQzRExJR0hUSU5HTU9ERUxfTU9OTwkJMHgwMDAwMDAwMgorCisjZGVmaW5lIEQzRExJR0hUQ0FQU19QT0lOVAkJMHgwMDAwMDAwMQorI2RlZmluZSBEM0RMSUdIVENBUFNfU1BPVAkJMHgwMDAwMDAwMgorI2RlZmluZSBEM0RMSUdIVENBUFNfRElSRUNUSU9OQUwJMHgwMDAwMDAwNAorI2RlZmluZSBEM0RMSUdIVENBUFNfUEFSQUxMRUxQT0lOVAkweDAwMDAwMDA4CisKKworI2RlZmluZSBEM0RDT0xPUl9NT05PCTEKKyNkZWZpbmUgRDNEQ09MT1JfUkdCCTIKKwordHlwZWRlZiBEV09SRCBEM0RDT0xPUk1PREVMOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRFdPUkQgZHdTaXplOworICAgIERXT1JEIGR3TWlzY0NhcHM7ICAgICAgICAgICAgICAgICAvKiBDYXBhYmlsaXR5IGZsYWdzICovCisgICAgRFdPUkQgZHdSYXN0ZXJDYXBzOworICAgIERXT1JEIGR3WkNtcENhcHM7CisgICAgRFdPUkQgZHdTcmNCbGVuZENhcHM7CisgICAgRFdPUkQgZHdEZXN0QmxlbmRDYXBzOworICAgIERXT1JEIGR3QWxwaGFDbXBDYXBzOworICAgIERXT1JEIGR3U2hhZGVDYXBzOworICAgIERXT1JEIGR3VGV4dHVyZUNhcHM7CisgICAgRFdPUkQgZHdUZXh0dXJlRmlsdGVyQ2FwczsKKyAgICBEV09SRCBkd1RleHR1cmVCbGVuZENhcHM7CisgICAgRFdPUkQgZHdUZXh0dXJlQWRkcmVzc0NhcHM7CisgICAgRFdPUkQgZHdTdGlwcGxlV2lkdGg7ICAgICAgICAgICAgIC8qIG1heGltdW0gd2lkdGggYW5kIGhlaWdodCBvZiAqLworICAgIERXT1JEIGR3U3RpcHBsZUhlaWdodDsgICAgICAgICAgICAvKiBvZiBzdXBwb3J0ZWQgc3RpcHBsZSAodXAgdG8gMzJ4MzIpICovCit9IEQzRFBSSU1DQVBTLCAqTFBEM0RQUklNQ0FQUzsKKworLyogRDNEUFJJTUNBUFMuZHdNaXNjQ2FwcyAqLworI2RlZmluZSBEM0RQTUlTQ0NBUFNfTUFTS1BMQU5FUwkJMHgwMDAwMDAwMQorI2RlZmluZSBEM0RQTUlTQ0NBUFNfTUFTS1oJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRDNEUE1JU0NDQVBTX0xJTkVQQVRURVJOUkVQCTB4MDAwMDAwMDQKKyNkZWZpbmUgRDNEUE1JU0NDQVBTX0NPTkZPUk1BTlQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRDNEUE1JU0NDQVBTX0NVTExOT05FCQkweDAwMDAwMDEwCisjZGVmaW5lIEQzRFBNSVNDQ0FQU19DVUxMQ1cJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRDNEUE1JU0NDQVBTX0NVTExDQ1cJCTB4MDAwMDAwNDAKKworLyogRDNEUFJJTUNBUFMuZHdSYXN0ZXJDYXBzICovCisjZGVmaW5lIEQzRFBSQVNURVJDQVBTX0RJVEhFUgkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfUk9QMgkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfWE9SCQkJMHgwMDAwMDAwNAorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19QQVQJCQkweDAwMDAwMDA4CisjZGVmaW5lIEQzRFBSQVNURVJDQVBTX1pURVNUCQkJMHgwMDAwMDAxMAorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19TVUJQSVhFTAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfU1VCUElYRUxYCQkweDAwMDAwMDQwCisjZGVmaW5lIEQzRFBSQVNURVJDQVBTX0ZPR1ZFUlRFWAkJMHgwMDAwMDA4MAorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19GT0dUQUJMRQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfU1RJUFBMRQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfQU5USUFMSUFTU09SVERFUEVOREVOVAkweDAwMDAwNDAwCisjZGVmaW5lIEQzRFBSQVNURVJDQVBTX0FOVElBTElBU1NPUlRJTkRFUEVOREVOVAkweDAwMDAwODAwCisjZGVmaW5lIEQzRFBSQVNURVJDQVBTX0FOVElBTElBU0VER0VTCQkweDAwMDAxMDAwCisjZGVmaW5lIEQzRFBSQVNURVJDQVBTX01JUE1BUExPREJJQVMJCTB4MDAwMDIwMDAKKyNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfWkJJQVMJCQkweDAwMDA0MDAwCisjZGVmaW5lIEQzRFBSQVNURVJDQVBTX1pCVUZGRVJMRVNTSFNSCQkweDAwMDA4MDAwCisjZGVmaW5lIEQzRFBSQVNURVJDQVBTX0ZPR1JBTkdFCQkJMHgwMDAxMDAwMAorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19BTklTT1RST1BZCQkweDAwMDIwMDAwCisKKy8qIEQzRFBSSU1DQVBTLmR3WkNtcENhcHMgYW5kIGR3QWxwaGFDbXBDYXBzICovCisjZGVmaW5lIEQzRFBDTVBDQVBTX05FVkVSCQkweDAwMDAwMDAxCisjZGVmaW5lIEQzRFBDTVBDQVBTX0xFU1MJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRDNEUENNUENBUFNfRVFVQUwJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRDNEUENNUENBUFNfTEVTU0VRVUFMCQkweDAwMDAwMDA4CisjZGVmaW5lIEQzRFBDTVBDQVBTX0dSRUFURVIJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRDNEUENNUENBUFNfTk9URVFVQUwJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMCTB4MDAwMDAwNDAKKyNkZWZpbmUgRDNEUENNUENBUFNfQUxXQVlTCQkweDAwMDAwMDgwCisKKy8qIEQzRFBSSU1DQVBTLmR3U291cmNlQmxlbmRDYXBzLCBkd0Rlc3RCbGVuZENhcHMgKi8KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19aRVJPCQkweDAwMDAwMDAxCisjZGVmaW5lIEQzRFBCTEVORENBUFNfT05FCQkweDAwMDAwMDAyCisjZGVmaW5lIEQzRFBCTEVORENBUFNfU1JDQ09MT1IJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19JTlZTUkNDT0xPUgkweDAwMDAwMDA4CisjZGVmaW5lIEQzRFBCTEVORENBUFNfU1JDQUxQSEEJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQQkweDAwMDAwMDIwCisjZGVmaW5lIEQzRFBCTEVORENBUFNfREVTVEFMUEhBCQkweDAwMDAwMDQwCisjZGVmaW5lIEQzRFBCTEVORENBUFNfSU5WREVTVEFMUEhBCTB4MDAwMDAwODAKKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19JTlZERVNUQ09MT1IJMHgwMDAwMDIwMAorI2RlZmluZSBEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBU0FUCTB4MDAwMDA0MDAKKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19CT1RIU1JDQUxQSEEJMHgwMDAwMDgwMAorI2RlZmluZSBEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQQkweDAwMDAxMDAwCisKKy8qIEQzRFBSSU1DQVBTLmR3U2hhZGVDYXBzICovCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfQ09MT1JGTEFUTU9OTwkweDAwMDAwMDAxCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfQ09MT1JGTEFUUkdCCTB4MDAwMDAwMDIKKyNkZWZpbmUgRDNEUFNIQURFQ0FQU19DT0xPUkdPVVJBVURNT05PCTB4MDAwMDAwMDQKKyNkZWZpbmUgRDNEUFNIQURFQ0FQU19DT0xPUkdPVVJBVURSR0IJMHgwMDAwMDAwOAorI2RlZmluZSBEM0RQU0hBREVDQVBTX0NPTE9SUEhPTkdNT05PCTB4MDAwMDAwMTAKKyNkZWZpbmUgRDNEUFNIQURFQ0FQU19DT0xPUlBIT05HUkdCCTB4MDAwMDAwMjAKKworI2RlZmluZSBEM0RQU0hBREVDQVBTX1NQRUNVTEFSRkxBVE1PTk8JMHgwMDAwMDA0MAorI2RlZmluZSBEM0RQU0hBREVDQVBTX1NQRUNVTEFSRkxBVFJHQgkweDAwMDAwMDgwCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfU1BFQ1VMQVJHT1VSQVVETU9OTwkweDAwMDAwMTAwCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfU1BFQ1VMQVJHT1VSQVVEUkdCCTB4MDAwMDAyMDAKKyNkZWZpbmUgRDNEUFNIQURFQ0FQU19TUEVDVUxBUlBIT05HTU9OTwkweDAwMDAwNDAwCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfU1BFQ1VMQVJQSE9OR1JHQgkweDAwMDAwODAwCisKKyNkZWZpbmUgRDNEUFNIQURFQ0FQU19BTFBIQUZMQVRCTEVORAkweDAwMDAxMDAwCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfQUxQSEFGTEFUU1RJUFBMRUQJMHgwMDAwMjAwMAorI2RlZmluZSBEM0RQU0hBREVDQVBTX0FMUEhBR09VUkFVREJMRU5ECTB4MDAwMDQwMDAKKyNkZWZpbmUgRDNEUFNIQURFQ0FQU19BTFBIQUdPVVJBVURTVElQUExFRAkweDAwMDA4MDAwCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfQUxQSEFQSE9OR0JMRU5ECTB4MDAwMTAwMDAKKyNkZWZpbmUgRDNEUFNIQURFQ0FQU19BTFBIQVBIT05HU1RJUFBMRUQJMHgwMDAyMDAwMAorCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfRk9HRkxBVAkJMHgwMDA0MDAwMAorI2RlZmluZSBEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQJMHgwMDA4MDAwMAorI2RlZmluZSBEM0RQU0hBREVDQVBTX0ZPR1BIT05HCQkweDAwMTAwMDAwCisKKy8qIEQzRFBSSU1DQVBTLmR3VGV4dHVyZUNhcHMgKi8KKyNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFCTB4MDAwMDAwMDEKKyNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX1BPVzIJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX0FMUEhBCQkweDAwMDAwMDA0CisjZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19UUkFOU1BBUkVOQ1kJMHgwMDAwMDAwOAorI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfQk9SREVSCQkweDAwMDAwMDEwCisjZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19TUVVBUkVPTkxZCTB4MDAwMDAwMjAKKworLyogRDNEUFJJTUNBUFMuZHdUZXh0dXJlRmlsdGVyQ2FwcyAqLworI2RlZmluZSBEM0RQVEZJTFRFUkNBUFNfTkVBUkVTVAkJMHgwMDAwMDAwMQorI2RlZmluZSBEM0RQVEZJTFRFUkNBUFNfTElORUFSCQkweDAwMDAwMDAyCisjZGVmaW5lIEQzRFBURklMVEVSQ0FQU19NSVBORUFSRVNUCTB4MDAwMDAwMDQKKyNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX01JUExJTkVBUgkweDAwMDAwMDA4CisjZGVmaW5lIEQzRFBURklMVEVSQ0FQU19MSU5FQVJNSVBORUFSRVNUCTB4MDAwMDAwMTAKKyNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX0xJTkVBUk1JUExJTkVBUgkweDAwMDAwMDIwCisKKy8qIEQzRFBSSU1DQVBTLmR3VGV4dHVyZUJsZW5kQ2FwcyAqLworI2RlZmluZSBEM0RQVEJMRU5EQ0FQU19ERUNBTAkJMHgwMDAwMDAwMQorI2RlZmluZSBEM0RQVEJMRU5EQ0FQU19NT0RVTEFURQkJMHgwMDAwMDAwMgorI2RlZmluZSBEM0RQVEJMRU5EQ0FQU19ERUNBTEFMUEhBCTB4MDAwMDAwMDQKKyNkZWZpbmUgRDNEUFRCTEVORENBUFNfTU9EVUxBVEVBTFBIQQkweDAwMDAwMDA4CisjZGVmaW5lIEQzRFBUQkxFTkRDQVBTX0RFQ0FMTUFTSwkweDAwMDAwMDEwCisjZGVmaW5lIEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFTUFTSwkweDAwMDAwMDIwCisjZGVmaW5lIEQzRFBUQkxFTkRDQVBTX0NPUFkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgRDNEUFRCTEVORENBUFNfQURECQkweDAwMDAwMDgwCisKKy8qIEQzRFBSSU1DQVBTLmR3VGV4dHVyZUFkZHJlc3NDYXBzICovCisjZGVmaW5lIEQzRFBUQUREUkVTU0NBUFNfV1JBUAkJMHgwMDAwMDAwMQorI2RlZmluZSBEM0RQVEFERFJFU1NDQVBTX01JUlJPUgkJMHgwMDAwMDAwMgorI2RlZmluZSBEM0RQVEFERFJFU1NDQVBTX0NMQU1QCQkweDAwMDAwMDA0CisjZGVmaW5lIEQzRFBUQUREUkVTU0NBUFNfQk9SREVSCQkweDAwMDAwMDA4CisjZGVmaW5lIEQzRFBUQUREUkVTU0NBUFNfSU5ERVBFTkRFTlRVVgkweDAwMDAwMDEwCisKKworLyogRDNEREVWSUNFREVTQy5kd0ZsYWdzICovCisjZGVmaW5lIEQzREREX0NPTE9STU9ERUwJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRDNERERfREVWQ0FQUwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRDNERERfVFJBTlNGT1JNQ0FQUwkJMHgwMDAwMDAwNAorI2RlZmluZSBEM0RERF9MSUdIVElOR0NBUFMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRDNERERfQkNMSVBQSU5HCQkJMHgwMDAwMDAxMAorI2RlZmluZSBEM0RERF9MSU5FQ0FQUwkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRDNERERfVFJJQ0FQUwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgRDNERERfREVWSUNFUkVOREVSQklUREVQVEgJMHgwMDAwMDA4MAorI2RlZmluZSBEM0RERF9ERVZJQ0VaQlVGRkVSQklUREVQVEgJMHgwMDAwMDEwMAorI2RlZmluZSBEM0RERF9NQVhCVUZGRVJTSVpFCQkweDAwMDAwMjAwCisjZGVmaW5lIEQzREREX01BWFZFUlRFWENPVU5UCQkweDAwMDAwNDAwCisKKy8qIEQzRERFVklDRURFU0MuZHdEZXZDYXBzICovCisjZGVmaW5lIEQzRERFVkNBUFNfU09SVElOQ1JFQVNJTkdaICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBEM0RERVZDQVBTX1NPUlRERUNSRUFTSU5HWiAgICAgIDBYMDAwMDAwMDQKKyNkZWZpbmUgRDNEREVWQ0FQU19TT1JURVhBQ1QgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEQzRERFVkNBUFNfRVhFQ1VURVNZU1RFTU1FTU9SWSAgMHgwMDAwMDAxMAorI2RlZmluZSBEM0RERVZDQVBTX0VYRUNVVEVWSURFT01FTU9SWSAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRDNEREVWQ0FQU19UTFZFUlRFWFNZU1RFTU1FTU9SWSAweDAwMDAwMDQwCisjZGVmaW5lIEQzRERFVkNBUFNfVExWRVJURVhWSURFT01FTU9SWSAgMHgwMDAwMDA4MAorI2RlZmluZSBEM0RERVZDQVBTX1RFWFRVUkVTWVNURU1NRU1PUlkgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRDNEREVWQ0FQU19URVhUVVJFVklERU9NRU1PUlkgICAweDAwMDAwMjAwCisjZGVmaW5lIEQzRERFVkNBUFNfRFJBV1BSSU1UTFZFUlRFWCAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBEM0RERVZDQVBTX0NBTlJFTkRFUkFGVEVSRkxJUCAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgRDNEREVWQ0FQU19URVhUVVJFTk9OTE9DQUxWSURNRU0gMHgwMDAwMTAwMAorCit0eXBlZGVmIHN0cnVjdCBfRDNERGV2aWNlRGVzYyB7CisJRFdPUkQJCWR3U2l6ZTsKKwlEV09SRAkJZHdGbGFnczsKKwlEM0RDT0xPUk1PREVMCWRjbUNvbG9yTW9kZWw7CisJRFdPUkQJCWR3RGV2Q2FwczsKKwlEM0RUUkFOU0ZPUk1DQVBTIGR0Y1RyYW5zZm9ybUNhcHM7CisJQk9PTDMyCQliQ2xpcHBpbmc7CisJRDNETElHSFRJTkdDQVBTCWRsY0xpZ2h0aW5nQ2FwczsKKwlEM0RQUklNQ0FQUwlkcGNMaW5lQ2FwczsKKwlEM0RQUklNQ0FQUwlkcGNUcmlDYXBzOworCURXT1JECQlkd0RldmljZVJlbmRlckJpdERlcHRoOworCURXT1JECQlkd0RldmljZVpCdWZmZXJCaXREZXB0aDsKKwlEV09SRAkJZHdNYXhCdWZmZXJTaXplOworCURXT1JECQlkd01heFZlcnRleENvdW50OworCS8qICoqKiBOZXcgZmllbGRzIGZvciBEWDUgKioqICovCisJRFdPUkQJCWR3TWluVGV4dHVyZVdpZHRoLGR3TWluVGV4dHVyZUhlaWdodDsKKwlEV09SRAkJZHdNYXhUZXh0dXJlV2lkdGgsZHdNYXhUZXh0dXJlSGVpZ2h0OworCURXT1JECQlkd01pblN0aXBwbGVXaWR0aCxkd01heFN0aXBwbGVXaWR0aDsKKwlEV09SRAkJZHdNaW5TdGlwcGxlSGVpZ2h0LGR3TWF4U3RpcHBsZUhlaWdodDsKK30gRDNEREVWSUNFREVTQywqTFBEM0RERVZJQ0VERVNDOworIAordHlwZWRlZiBIUkVTVUxUIChDQUxMQkFDSyAqIExQRDNERU5VTURFVklDRVNDQUxMQkFDSykoTFBHVUlEIGxwR3VpZCxMUFNUUiBscERldmljZURlc2NyaXB0aW9uLExQU1RSIGxwRGV2aWNlTmFtZSxMUEQzRERFVklDRURFU0MsTFBEM0RERVZJQ0VERVNDLExQVk9JRCk7CisKKy8qIGR3ZmxhZ3MgZm9yIEZpbmREZXZpY2UgKi8KKyNkZWZpbmUgRDNERkRTX0NPTE9STU9ERUwJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRDNERkRTX0dVSUQJCQkweDAwMDAwMDAyCisjZGVmaW5lIEQzREZEU19IQVJEV0FSRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRDNERkRTX1RSSUFOR0xFUwkJMHgwMDAwMDAwOAorI2RlZmluZSBEM0RGRFNfTElORVMJCQkweDAwMDAwMDEwCisjZGVmaW5lIEQzREZEU19NSVNDQ0FQUwkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRDNERkRTX1JBU1RFUkNBUFMJCTB4MDAwMDAwNDAKKyNkZWZpbmUgRDNERkRTX1pDTVBDQVBTCQkJMHgwMDAwMDA4MAorI2RlZmluZSBEM0RGRFNfQUxQSEFDTVBDQVBTCQkweDAwMDAwMTAwCisjZGVmaW5lIEQzREZEU19EU1RCTEVORENBUFMJCTB4MDAwMDA0MDAKKyNkZWZpbmUgRDNERkRTX1NIQURFQ0FQUwkJMHgwMDAwMDgwMAorI2RlZmluZSBEM0RGRFNfVEVYVFVSRUNBUFMJCTB4MDAwMDEwMDAKKyNkZWZpbmUgRDNERkRTX1RFWFRVUkVGSUxURVJDQVBTCTB4MDAwMDIwMDAKKyNkZWZpbmUgRDNERkRTX1RFWFRVUkVCTEVORENBUFMJCTB4MDAwMDQwMDAKKyNkZWZpbmUgRDNERkRTX1RFWFRVUkVBRERSRVNTQ0FQUwkweDAwMDA4MDAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEV09SRAkJZHdTaXplOworICAgIERXT1JECQlkd0ZsYWdzOworICAgIEJPT0wzMgkJYkhhcmR3YXJlOworICAgIEQzRENPTE9STU9ERUwJZGNtQ29sb3JNb2RlbDsKKyAgICBHVUlECQlndWlkOworICAgIERXT1JECQlkd0NhcHM7CisgICAgRDNEUFJJTUNBUFMJCWRwY1ByaW1DYXBzOworfSBEM0RGSU5EREVWSUNFU0VBUkNILCpMUEQzREZJTkRERVZJQ0VTRUFSQ0g7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEV09SRAkJZHdTaXplOworICAgIEdVSUQJCWd1aWQ7CisgICAgRDNEREVWSUNFREVTQwlkZEh3RGVzYzsKKyAgICBEM0RERVZJQ0VERVNDCWRkU3dEZXNjOworfSBEM0RGSU5EREVWSUNFUkVTVUxULCpMUEQzREZJTkRERVZJQ0VSRVNVTFQ7CisKKyNkZWZpbmUgRDNEVkFMUCh2YWwsIHByZWMpCSgoZmxvYXQpKHZhbCkpCisjZGVmaW5lIEQzRFZBTCh2YWwpCQkoKGZsb2F0KSh2YWwpKQordHlwZWRlZiBmbG9hdCBEM0RWQUxVRSwqTFBEM0RWQUxVRTsKKyNkZWZpbmUgRDNERGl2aWRlKGEsIGIpCQkoZmxvYXQpKChkb3VibGUpIChhKSAvIChkb3VibGUpIChiKSkKKyNkZWZpbmUgRDNETXVsdGlwbHkoYSwgYikJKChhKSAqIChiKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuaW9uIHsKKwkJRDNEVkFMVUUgeDsKKwkJRDNEVkFMVUUgZHZYOworCX0geDsKKwl1bmlvbiB7CisJCUQzRFZBTFVFIHk7CisJCUQzRFZBTFVFIGR2WTsKKwl9IHk7CisJdW5pb24geworCQlEM0RWQUxVRSB6OworCQlEM0RWQUxVRSBkdlo7CisJfSB6OworCS8qIHRoZSBjKysgdmFyaWFudCBoYXMgb3BlcmF0b3Igb3ZlcmxvYWRzIGV0Yy4gdG9vICovCit9IEQzRFZFQ1RPUiwqTFBEM0RWRUNUT1I7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBEM0RMSUdIVF9QT0lOVCAgICAgICAgICA9IDEsCisgICAgRDNETElHSFRfU1BPVCAgICAgICAgICAgPSAyLAorICAgIEQzRExJR0hUX0RJUkVDVElPTkFMICAgID0gMywKKyAgICBEM0RMSUdIVF9QQVJBTExFTFBPSU5UICA9IDQsCisgICAgRDNETElHSFRfRk9SQ0VfRFdPUkQgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovCit9IEQzRExJR0hUVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgX0QzRENPTE9SVkFMVUUgeworCXVuaW9uIHsKKwkJRDNEVkFMVUUgcjsKKwkJRDNEVkFMVUUgZHZSOworCX0gcjsKKwl1bmlvbiB7CisJCUQzRFZBTFVFIGc7CisJCUQzRFZBTFVFIGR2RzsKKwl9IGc7CisJdW5pb24geworCQlEM0RWQUxVRSBiOworCQlEM0RWQUxVRSBkdkI7CisJfSBiOworCXVuaW9uIHsKKwkJRDNEVkFMVUUgYTsKKwkJRDNEVkFMVUUgZHZBOworCX0gYTsKK30gRDNEQ09MT1JWQUxVRSwqTFBEM0RDT0xPUlZBTFVFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRFdPUkQgICAgICAgICAgIGR3U2l6ZTsKKyAgICBEM0RMSUdIVFRZUEUgICAgZGx0VHlwZTsKKyAgICBEM0RDT0xPUlZBTFVFICAgZGN2Q29sb3I7CisgICAgRDNEVkVDVE9SICAgICAgIGR2UG9zaXRpb247CQkvKiBQb3NpdGlvbiBpbiB3b3JsZCBzcGFjZSAqLworICAgIEQzRFZFQ1RPUiAgICAgICBkdkRpcmVjdGlvbjsJLyogRGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlICovCisgICAgRDNEVkFMVUUgICAgICAgIGR2UmFuZ2U7CQkvKiBDdXRvZmYgcmFuZ2UgKi8KKyAgICBEM0RWQUxVRSAgICAgICAgZHZGYWxsb2ZmOwkJLyogRmFsbG9mZiAqLworICAgIEQzRFZBTFVFICAgICAgICBkdkF0dGVudWF0aW9uMDsJLyogQ29uc3RhbnQgYXR0ZW51YXRpb24gKi8KKyAgICBEM0RWQUxVRSAgICAgICAgZHZBdHRlbnVhdGlvbjE7CS8qIExpbmVhciBhdHRlbnVhdGlvbiAqLworICAgIEQzRFZBTFVFICAgICAgICBkdkF0dGVudWF0aW9uMjsJLyogUXVhZHJhdGljIGF0dGVudWF0aW9uICovCisgICAgRDNEVkFMVUUgICAgICAgIGR2VGhldGE7CQkvKiBJbm5lciBhbmdsZSBvZiBzcG90bGlnaHQgY29uZSAqLworICAgIEQzRFZBTFVFICAgICAgICBkdlBoaTsJCS8qIE91dGVyIGFuZ2xlIG9mIHNwb3RsaWdodCBjb25lICovCit9IEQzRExJR0hULCpMUEQzRExJR0hUOworCisvKiBmbGFncyBiaXRzICovCisjZGVmaW5lIEQzRExJR0hUX0FDVElWRQkJMHgwMDAwMDAwMQorI2RlZmluZSBEM0RMSUdIVF9OT19TUEVDVUxBUgkweDAwMDAwMDAyCisKKworI2RlZmluZSBTVERNRVRIT0QoeGZuKSBIUkVTVUxUIChDQUxMQkFDSyAqZm4jI3hmbikKKyNkZWZpbmUgU1RETUVUSE9EXyhyZXQseGZuKSByZXQgKENBTExCQUNLICpmbiMjeGZuKQorI2RlZmluZSBQVVJFCisjZGVmaW5lIEZBUgorI2RlZmluZSBUSElTXyBUSElTICwKKworI2RlZmluZSBUSElTIExQRElSRUNUM0QJdGhpcwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEX1ZUYWJsZSB7CisJLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKwlTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmopIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORywgQWRkUmVmKSAoVEhJUykgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLCBSZWxlYXNlKSAoVEhJUykgUFVSRTsKKwkvKioqIElEaXJlY3QzRCBtZXRob2RzICoqKi8KKwlTVERNRVRIT0QoSW5pdGlhbGl6ZSkgKFRISVNfIFJFRklJRCkgUFVSRTsKKwlTVERNRVRIT0QoRW51bURldmljZXMpKFRISVNfIExQRDNERU5VTURFVklDRVNDQUxMQkFDSywgTFBWT0lEKSBQVVJFOworCVNURE1FVEhPRChDcmVhdGVMaWdodCkgKFRISVNfIExQRElSRUNUM0RMSUdIVCosIElVbmtub3duKikgUFVSRTsKKwlTVERNRVRIT0QoQ3JlYXRlTWF0ZXJpYWwpIChUSElTXyBMUERJUkVDVDNETUFURVJJQUwqLCBJVW5rbm93biopIFBVUkU7CisJU1RETUVUSE9EKENyZWF0ZVZpZXdwb3J0KSAoVEhJU18gTFBESVJFQ1QzRFZJRVdQT1JUKiwgSVVua25vd24qKSBQVVJFOworCVNURE1FVEhPRChGaW5kRGV2aWNlKShUSElTXyBMUEQzREZJTkRERVZJQ0VTRUFSQ0gsIExQRDNERklORERFVklDRVJFU1VMVCkgUFVSRTsKK30gKkxQRElSRUNUM0RfVlRBQkxFLElEaXJlY3QzRF9WVGFibGU7CisKK3N0cnVjdCBJRGlyZWN0M0QgeworCUxQRElSRUNUM0RfVlRBQkxFCWxwdnRibDsKKwlEV09SRAkJCXJlZjsKKwlMUERJUkVDVERSQVcJCWRkcmF3OworfTsKKyN1bmRlZiBUSElTCisKKyNkZWZpbmUgVEhJUyBMUERJUkVDVDNEMiB0aGlzCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0QyX1ZUYWJsZSB7CisJLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKwlTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmopIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORywgQWRkUmVmKSAoVEhJUykgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLCBSZWxlYXNlKSAoVEhJUykgUFVSRTsKKwkvKioqIElEaXJlY3QzRDIgbWV0aG9kcyAqKiovCisJU1RETUVUSE9EKEVudW1EZXZpY2VzKShUSElTXyBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0ssIExQVk9JRCkgUFVSRTsKKwlTVERNRVRIT0QoQ3JlYXRlTGlnaHQpIChUSElTXyBMUERJUkVDVDNETElHSFQqLCBJVW5rbm93biopIFBVUkU7CisJU1RETUVUSE9EKENyZWF0ZU1hdGVyaWFsKSAoVEhJU18gTFBESVJFQ1QzRE1BVEVSSUFMMiosIElVbmtub3duKikgUFVSRTsKKwlTVERNRVRIT0QoQ3JlYXRlVmlld3BvcnQpIChUSElTXyBMUERJUkVDVDNEVklFV1BPUlQyKiwgSVVua25vd24qKSBQVVJFOworCVNURE1FVEhPRChGaW5kRGV2aWNlKShUSElTXyBMUEQzREZJTkRERVZJQ0VTRUFSQ0gsIExQRDNERklORERFVklDRVJFU1VMVCkgUFVSRTsKKwlTVERNRVRIT0QoQ3JlYXRlRGV2aWNlKShUSElTXyBSRUZDTFNJRCwgTFBESVJFQ1REUkFXU1VSRkFDRSwgTFBESVJFQ1QzRERFVklDRTIgKikgUFVSRTsKK30gKkxQRElSRUNUM0QyX1ZUQUJMRSxJRGlyZWN0M0QyX1ZUYWJsZTsKKworc3RydWN0IElEaXJlY3QzRDIgeworCUxQRElSRUNUM0QyX1ZUQUJMRQlscHZ0Ymw7CisJRFdPUkQJCQlyZWY7CisJTFBESVJFQ1REUkFXCQlkZHJhdzsKK307CisjdW5kZWYgVEhJUworCisjZGVmaW5lIFRISVMgTFBESVJFQ1QzRExJR0hUIHRoaXMKK3R5cGVkZWYgc3RydWN0IElEaXJlY3QzRExpZ2h0X1ZUYWJsZSB7CisJLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKwlTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmopIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORywgQWRkUmVmKSAoVEhJUykgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLCBSZWxlYXNlKSAoVEhJUykgUFVSRTsKKwkvKioqIElEaXJlY3QzRExpZ2h0IG1ldGhvZHMgKioqLworCVNURE1FVEhPRChJbml0aWFsaXplKSAoVEhJU18gTFBESVJFQ1QzRCkgUFVSRTsKKwlTVERNRVRIT0QoU2V0TGlnaHQpIChUSElTXyBMUEQzRExJR0hUKSBQVVJFOworCVNURE1FVEhPRChHZXRMaWdodCkgKFRISVNfIExQRDNETElHSFQpIFBVUkU7Cit9IElEaXJlY3QzRExpZ2h0X1ZUYWJsZSwqTFBESVJFQ1QzRExJR0hUX1ZUQUJMRTsKKworc3RydWN0IElEaXJlY3QzRExpZ2h0IHsKKwlMUERJUkVDVDNETElHSFRfVlRBQkxFCWxwdnRibDsKKwlEV09SRAkJCXJlZjsKK307CisKKyN1bmRlZiBUSElTCisKKyN1bmRlZiBUSElTXworI3VuZGVmIFNURE1FVEhPRAorI3VuZGVmIFNURE1FVEhPRF8KKyN1bmRlZiBQVVJFCisjdW5kZWYgRkFSCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGRyYXcuaCBiL2luY2x1ZGUvZGRyYXcuaAppbmRleCAyNmY3MmFjLi43MDc4NzU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RkcmF3LmgKKysrIGIvaW5jbHVkZS9kZHJhdy5oCkBAIC0xLDcgKzEsMTEgQEAKICNpZm5kZWYgX19XSU5FX0REUkFXX0gKICNkZWZpbmUgX19XSU5FX0REUkFXX0gKIAotI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSAidHNfeGxpYi5oIgorCisjaWZuZGVmCURJUkVDVERSQVdfVkVSU0lPTgorI2RlZmluZQlESVJFQ1REUkFXX1ZFUlNJT04JMHgwNTAwCisjZW5kaWYgLyogRElSRUNURFJBV19WRVJTSU9OICovCiAKIAogREVGSU5FX0dVSUQoIENMU0lEX0RpcmVjdERyYXcsCQkweEQ3QjcwRUUwLDB4NDM0MCwweDExQ0YsMHhCMCwweDYzLDB4MDAsMHgyMCwweEFGLDB4QzIsMHhDRCwweDM1ICk7CkBAIC0xMCw4ICsxNCwxMCBAQAogREVGSU5FX0dVSUQoIElJRF9JRGlyZWN0RHJhdzIsCQkweEIzQTZGM0UwLDB4MkI0MywweDExQ0YsMHhBMiwweERFLDB4MDAsMHhBQSwweDAwLDB4QjksMHgzMywweDU2ICk7CiBERUZJTkVfR1VJRCggSUlEX0lEaXJlY3REcmF3U3VyZmFjZSwJMHg2QzE0REI4MSwweEE3MzMsMHgxMUNFLDB4QTUsMHgyMSwweDAwLDB4MjAsMHhBRiwweDBCLDB4RTUsMHg2MCApOwogREVGSU5FX0dVSUQoIElJRF9JRGlyZWN0RHJhd1N1cmZhY2UyLAkweDU3ODA1ODg1LDB4NmVlYywweDExY2YsMHg5NCwweDQxLDB4YTgsMHgyMywweDAzLDB4YzEsMHgwZSwweDI3ICk7CitERUZJTkVfR1VJRCggSUlEX0lEaXJlY3REcmF3U3VyZmFjZTMsCTB4REEwNDRFMDAsMHg2OUIyLDB4MTFEMCwweEExLDB4RDUsMHgwMCwweEFBLDB4MDAsMHhCOCwweERGLDB4QkIgKTsKIERFRklORV9HVUlEKCBJSURfSURpcmVjdERyYXdQYWxldHRlLAkweDZDMTREQjg0LDB4QTczMywweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwICk7CiBERUZJTkVfR1VJRCggSUlEX0lEaXJlY3REcmF3Q2xpcHBlciwJMHg2QzE0REI4NSwweEE3MzMsMHgxMUNFLDB4QTUsMHgyMSwweDAwLDB4MjAsMHhBRiwweDBCLDB4RTUsMHg2MCApOworREVGSU5FX0dVSUQoIElJRF9JRGlyZWN0RHJhd0NvbG9yQ29udHJvbCwweDRCOUYwRUUwLDB4MEQ3RSwweDExRDAsMHg5QiwweDA2LDB4MDAsMHhBMCwweEM5LDB4MDMsMHhBMywweEI4ICk7CiAKIHR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3IElEaXJlY3REcmF3LCpMUERJUkVDVERSQVc7CiB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhdzIgSURpcmVjdERyYXcyLCpMUERJUkVDVERSQVcyOwpAQCAtMTksNiArMjUsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlIElEaXJlY3REcmF3UGFsZXR0ZSwqTFBESVJFQ1REUkFXUEFMRVRURTsKIHR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZSBJRGlyZWN0RHJhd1N1cmZhY2UsKkxQRElSRUNURFJBV1NVUkZBQ0U7CiB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2UyIElEaXJlY3REcmF3U3VyZmFjZTIsKkxQRElSRUNURFJBV1NVUkZBQ0UyOwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlMyBJRGlyZWN0RHJhd1N1cmZhY2UzLCpMUERJUkVDVERSQVdTVVJGQUNFMzsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q29sb3JDb250cm9sIElEaXJlY3REcmF3Q29sb3JDb250cm9sLCpMUERJUkVDVERSQVdDT0xPUkNPTlRST0w7CiAKICNkZWZpbmUgRERFTlVNUkVUX0NBTkNFTAkwCiAjZGVmaW5lIERERU5VTVJFVF9PSwkJMQpAQCAtMTI0LDEwICsxMzIsMTcgQEAKICNkZWZpbmUgRERFUlJfVU5TVVBQT1JURURNT0RFCQkJTUFLRV9EREhSRVNVTFQoIDU5MCApCiAjZGVmaW5lIERERVJSX05PTUlQTUFQSFcJCQlNQUtFX0RESFJFU1VMVCggNTkxICkKICNkZWZpbmUgRERFUlJfSU5WQUxJRFNVUkZBQ0VUWVBFCQlNQUtFX0RESFJFU1VMVCggNTkyICkKKyNkZWZpbmUgRERFUlJfTk9PUFRJTUlaRUhXCQkJTUFLRV9EREhSRVNVTFQoIDYwMCApCisjZGVmaW5lIERERVJSX05PVExPQURFRAkJCQlNQUtFX0RESFJFU1VMVCggNjAxICkKKyNkZWZpbmUgRERFUlJfTk9GT0NVU1dJTkRPVwkJCU1BS0VfRERIUkVTVUxUKCA2MDIgKQogI2RlZmluZSBEREVSUl9EQ0FMUkVBRFlDUkVBVEVECQkJTUFLRV9EREhSRVNVTFQoIDYyMCApCisjZGVmaW5lIERERVJSX05PTk9OTE9DQUxWSURNRU0JCQlNQUtFX0RESFJFU1VMVCggNjMwICkKICNkZWZpbmUgRERFUlJfQ0FOVFBBR0VMT0NLCQkJTUFLRV9EREhSRVNVTFQoIDY0MCApCiAjZGVmaW5lIERERVJSX0NBTlRQQUdFVU5MT0NLCQkJTUFLRV9EREhSRVNVTFQoIDY2MCApCiAjZGVmaW5lIERERVJSX05PVFBBR0VMT0NLRUQJCQlNQUtFX0RESFJFU1VMVCggNjgwICkKKyNkZWZpbmUgRERFUlJfTU9SRURBVEEJCQkJTUFLRV9EREhSRVNVTFQoIDY5MCApCisjZGVmaW5lIERERVJSX1ZJREVPTk9UQUNUSVZFCQkJTUFLRV9EREhSRVNVTFQoIDY5NSApCisjZGVmaW5lIERERVJSX0RFVklDRURPRVNOVE9XTlNVUkZBQ0UJCU1BS0VfRERIUkVTVUxUKCA2OTkgKQogI2RlZmluZSBEREVSUl9OT1RJTklUSUFMSVpFRAkJCUNPX0VfTk9USU5JVElBTElaRUQKIAogLyogZHdGbGFncyBmb3IgQmx0KiAqLwpAQCAtMTY1LDE0ICsxODAsMTcgQEAKICNkZWZpbmUgRERCTFRGQVNUX1dBSVQJCQkJMHgwMDAwMDAxMAogCiAvKiBkd0ZsYWdzIGZvciBGbGlwICovCi0jZGVmaW5lIERERkxJUF9XQUlUCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRERGTElQX1dBSVQJMHgwMDAwMDAwMQorI2RlZmluZSBEREZMSVBfRVZFTgkweDAwMDAwMDAyIC8qIG9ubHkgdmFsaWQgZm9yIG92ZXJsYXkgKi8KKyNkZWZpbmUgRERGTElQX09ERAkweDAwMDAwMDA0IC8qIG9ubHkgdmFsaWQgZm9yIG92ZXJsYXkgKi8KIAogLyogZHdGbGFncyBmb3IgR2V0Qmx0U3RhdHVzICovCiAjZGVmaW5lIERER0JTX0NBTkJMVAkJCQkweDAwMDAwMDAxCiAjZGVmaW5lIERER0JTX0lTQkxURE9ORQkJCQkweDAwMDAwMDAyCiAKLS8qIDNkIGNhcGFibGUgKG5vIG1lYW5pbmc/KSAqLwotI2RlZmluZSBERFNDQVBTXzNECQkJMHgwMDAwMDAwMQorLyogRERTQ0FQUy5kd0NhcHMgKi8KKy8qIHJlc2VydmVkMSwgd2FzIDNkIGNhcGFibGUgKi8KKyNkZWZpbmUgRERTQ0FQU19SRVNFUlZFRDEJCTB4MDAwMDAwMDEKIC8qIHN1cmZhY2UgY29udGFpbnMgYWxwaGEgaW5mb3JtYXRpb24gKi8KICNkZWZpbmUgRERTQ0FQU19BTFBIQQkJCTB4MDAwMDAwMDIKIC8qIHRoaXMgc3VyZmFjZSBpcyBhIGJhY2tidWZmZXIgKi8KQEAgLTIxNyw4ICsyMzUsMTkgQEAKICNkZWZpbmUgRERTQ0FQU19NT0RFWAkJCTB4MDAyMDAwMDAKIC8qIG9uZSBtaXBtYXAgc3VyZmFjZSAoMSBsZXZlbCkgKi8KICNkZWZpbmUgRERTQ0FQU19NSVBNQVAJCQkweDAwNDAwMDAwCisjZGVmaW5lIEREU0NBUFNfUkVTRVJWRUQyCQkweDAwODAwMDAwCiAvKiBtZW1vcnkgYWxsb2NhdGlvbiBkZWxheWVkIHVudGlsIExvYWQoKSAqLwogI2RlZmluZSBERFNDQVBTX0FMTE9DT05MT0FECQkweDA0MDAwMDAwCisvKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3VyZmFjZSB3aWxsIHJlY2lldmUgZGF0YSBmcm9tIGEgdmlkZW8gcG9ydCAqLworI2RlZmluZSBERFNDQVBTX1ZJREVPUE9SVAkJMHgwODAwMDAwMAorLyogc3VyZmFjZSBpcyBpbiBsb2NhbCB2aWRlb21lbW9yeSAqLworI2RlZmluZSBERFNDQVBTX0xPQ0FMVklETUVNCQkweDEwMDAwMDAwCisvKiBzdXJmYWNlIGlzIGluIG5vbmxvY2FsIHZpZGVvbWVtb3J5ICovCisjZGVmaW5lIEREU0NBUFNfTk9OTE9DQUxWSURNRU0JCTB4MjAwMDAwMDAKKy8qIHN1cmZhY2UgaXMgYSBzdGFuZGFyZCBWR0EgbW9kZSBzdXJmYWNlIChOT1QgTW9kZVgpICovCisjZGVmaW5lIEREU0NBUFNfU1RBTkRBUkRWR0FNT0RFCQkweDQwMDAwMDAwCisvKiBvcHRpbWl6ZWQ/IHN1cmZhY2UgKi8KKyNkZWZpbmUgRERTQ0FQU19PUFRJTUlaRUQJCTB4ODAwMDAwMDAKIAogdHlwZWRlZiBzdHJ1Y3QgX0REU0NBUFMgewogCURXT1JECWR3Q2FwczsJLyogY2FwYWJpbGl0aWVzIG9mIHN1cmZhY2Ugd2FudGVkICovCkBAIC0yMjYsNyArMjU1LDcgQEAKIAogI2RlZmluZQlERF9ST1BfU1BBQ0UJKDI1Ni8zMikJLyogc3BhY2UgcmVxdWlyZWQgdG8gc3RvcmUgUk9QIGFycmF5ICovCiAKLXR5cGVkZWYgc3RydWN0IF9ERENBUFMKK3R5cGVkZWYgc3RydWN0IF9ERENBUFNfRFgzCiB7CiAgICAgRFdPUkQJZHdTaXplOyAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiB0aGUgREREUklWRVJDQVBTIHN0cnVjdHVyZSAqLwogICAgIERXT1JECWR3Q2FwczsgICAgICAgICAgICAgICAgIC8qIGRyaXZlciBzcGVjaWZpYyBjYXBhYmlsaXRpZXMgKi8KQEAgLTI3OSwxMSArMzA4LDc3IEBACiAgICAgRFdPUkQJZHdSZXNlcnZlZDQ7CiAgICAgRFdPUkQJZHdSZXNlcnZlZDU7CiAgICAgRFdPUkQJZHdSZXNlcnZlZDY7Cit9IEREQ0FQU19EWDMsKkxQRERDQVBTX0RYMzsKKwordHlwZWRlZiBzdHJ1Y3QgX0REQ0FQUworeworLyogIDAqLyBEV09SRCAgZHdTaXplOwkJCS8qIHNpemUgb2YgdGhlIERERFJJVkVSQ0FQUyBzdHJ1Y3R1cmUgKi8KKy8qICA0Ki8gRFdPUkQgIGR3Q2FwczsJCQkvKiBkcml2ZXIgc3BlY2lmaWMgY2FwYWJpbGl0aWVzICovCisvKiAgOCovIERXT1JEICBkd0NhcHMyOwkJCS8qIG1vcmUgZHJpdmVyIHNwZWNpZmljIGNhcGFiaWxpdGVzICovCisvKiAgYyovIERXT1JEICBkd0NLZXlDYXBzOwkJLyogY29sb3Iga2V5IGNhcGFiaWxpdGllcyBvZiB0aGUgc3VyZmFjZSAqLworLyogMTAqLyBEV09SRCAgZHdGWENhcHM7CQkvKiBkcml2ZXIgc3BlY2lmaWMgc3RyZXRjaGluZyBhbmQgZWZmZWN0cyBjYXBhYmlsaXRlcyAqLworLyogMTQqLyBEV09SRCAgZHdGWEFscGhhQ2FwczsJCS8qIGFscGhhIGRyaXZlciBzcGVjaWZpYyBjYXBhYmlsaXRpZXMgKi8KKy8qIDE4Ki8gRFdPUkQgIGR3UGFsQ2FwczsJCS8qIHBhbGV0dGUgY2FwYWJpbGl0aWVzICovCisvKiAxYyovIERXT1JEICBkd1NWQ2FwczsJCS8qIHN0ZXJlbyB2aXNpb24gY2FwYWJpbGl0aWVzICovCisvKiAyMCovIERXT1JEICBkd0FscGhhQmx0Q29uc3RCaXREZXB0aHM7CS8qIEREQkRfMiw0LDggKi8KKy8qIDI0Ki8gRFdPUkQgIGR3QWxwaGFCbHRQaXhlbEJpdERlcHRoczsJLyogRERCRF8xLDIsNCw4ICovCisvKiAyOCovIERXT1JEICBkd0FscGhhQmx0U3VyZmFjZUJpdERlcHRoczsJLyogRERCRF8xLDIsNCw4ICovCisvKiAyYyovIERXT1JEICBkd0FscGhhT3ZlcmxheUNvbnN0Qml0RGVwdGhzOwkvKiBEREJEXzIsNCw4ICovCisvKiAzMCovIERXT1JEICBkd0FscGhhT3ZlcmxheVBpeGVsQml0RGVwdGhzOwkvKiBEREJEXzEsMiw0LDggKi8KKy8qIDM0Ki8gRFdPUkQgIGR3QWxwaGFPdmVybGF5U3VyZmFjZUJpdERlcHRoczsJLyogRERCRF8xLDIsNCw4ICovCisvKiAzOCovIERXT1JEICBkd1pCdWZmZXJCaXREZXB0aHM7CQkvKiBEREJEXzgsMTYsMjQsMzIgKi8KKy8qIDNjKi8gRFdPUkQgIGR3VmlkTWVtVG90YWw7CQkvKiB0b3RhbCBhbW91bnQgb2YgdmlkZW8gbWVtb3J5ICovCisvKiA0MCovIERXT1JEICBkd1ZpZE1lbUZyZWU7CQkvKiBhbW91bnQgb2YgZnJlZSB2aWRlbyBtZW1vcnkgKi8KKy8qIDQ0Ki8gRFdPUkQgIGR3TWF4VmlzaWJsZU92ZXJsYXlzOwkvKiBtYXhpbXVtIG51bWJlciBvZiB2aXNpYmxlIG92ZXJsYXlzICovCisvKiA0OCovIERXT1JEICBkd0N1cnJWaXNpYmxlT3ZlcmxheXM7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIHZpc2libGUgb3ZlcmxheXMgKi8KKy8qIDRjKi8gRFdPUkQgIGR3TnVtRm91ckNDQ29kZXM7CS8qIG51bWJlciBvZiBmb3VyIGNjIGNvZGVzICovCisvKiA1MCovIERXT1JEICBkd0FsaWduQm91bmRhcnlTcmM7CS8qIHNvdXJjZSByZWN0YW5nbGUgYWxpZ25tZW50ICovCisvKiA1NCovIERXT1JEICBkd0FsaWduU2l6ZVNyYzsJCS8qIHNvdXJjZSByZWN0YW5nbGUgYnl0ZSBzaXplICovCisvKiA1OCovIERXT1JEICBkd0FsaWduQm91bmRhcnlEZXN0OwkvKiBkZXN0IHJlY3RhbmdsZSBhbGlnbm1lbnQgKi8KKy8qIDVjKi8gRFdPUkQgIGR3QWxpZ25TaXplRGVzdDsJCS8qIGRlc3QgcmVjdGFuZ2xlIGJ5dGUgc2l6ZSAqLworLyogNjAqLyBEV09SRCAgZHdBbGlnblN0cmlkZUFsaWduOwkvKiBzdHJpZGUgYWxpZ25tZW50ICovCisvKiA2NCovIERXT1JEICBkd1JvcHNbRERfUk9QX1NQQUNFXTsJLyogUk9QUyBzdXBwb3J0ZWQgKi8KKy8qIDg0Ki8gRERTQ0FQUyBkZHNDYXBzOwkJLyogRERTQ0FQUyBzdHJ1Y3R1cmUgaGFzIGFsbCB0aGUgZ2VuZXJhbCBjYXBhYmlsaXRpZXMgKi8KKy8qIDg4Ki8gRFdPUkQgIGR3TWluT3ZlcmxheVN0cmV0Y2g7CS8qIG1pbmltdW0gb3ZlcmxheSBzdHJldGNoIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMDAsIGVnIDEwMDAgPT0gMS4wLCAxMzAwID09IDEuMyAqLworLyogOGMqLyBEV09SRCAgZHdNYXhPdmVybGF5U3RyZXRjaDsJLyogbWF4aW11bSBvdmVybGF5IHN0cmV0Y2ggZmFjdG9yIG11bHRpcGxpZWQgYnkgMTAwMCwgZWcgMTAwMCA9PSAxLjAsIDEzMDAgPT0gMS4zICovCisvKiA5MCovIERXT1JEICBkd01pbkxpdmVWaWRlb1N0cmV0Y2g7CS8qIG1pbmltdW0gbGl2ZSB2aWRlbyBzdHJldGNoIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMDAsIGVnIDEwMDAgPT0gMS4wLCAxMzAwID09IDEuMyAqLworLyogOTQqLyBEV09SRCAgZHdNYXhMaXZlVmlkZW9TdHJldGNoOwkvKiBtYXhpbXVtIGxpdmUgdmlkZW8gc3RyZXRjaCBmYWN0b3IgbXVsdGlwbGllZCBieSAxMDAwLCBlZyAxMDAwID09IDEuMCwgMTMwMCA9PSAxLjMgKi8KKy8qIDk4Ki8gRFdPUkQgIGR3TWluSHdDb2RlY1N0cmV0Y2g7CS8qIG1pbmltdW0gaGFyZHdhcmUgY29kZWMgc3RyZXRjaCBmYWN0b3IgbXVsdGlwbGllZCBieSAxMDAwLCBlZyAxMDAwID09IDEuMCwgMTMwMCA9PSAxLjMgKi8KKy8qIDljKi8gRFdPUkQgIGR3TWF4SHdDb2RlY1N0cmV0Y2g7CS8qIG1heGltdW0gaGFyZHdhcmUgY29kZWMgc3RyZXRjaCBmYWN0b3IgbXVsdGlwbGllZCBieSAxMDAwLCBlZyAxMDAwID09IDEuMCwgMTMwMCA9PSAxLjMgKi8KKy8qIGEwKi8gRFdPUkQgIGR3UmVzZXJ2ZWQxOworLyogYTQqLyBEV09SRCAgZHdSZXNlcnZlZDI7CisvKiBhOCovIERXT1JEICBkd1Jlc2VydmVkMzsKKy8qIGFjKi8gRFdPUkQgIGR3U1ZCQ2FwczsJLyogZHJpdmVyIHNwZWNpZmljIGNhcGFiaWxpdGllcyBmb3IgU3lzdGVtLT5WbWVtIGJsdHMgKi8KKy8qIGIwKi8gRFdPUkQgIGR3U1ZCQ0tleUNhcHM7CS8qIGRyaXZlciBjb2xvciBrZXkgY2FwYWJpbGl0aWVzIGZvciBTeXN0ZW0tPlZtZW0gYmx0cyAqLworLyogYjQqLyBEV09SRCAgZHdTVkJGWENhcHM7CS8qIGRyaXZlciBGWCBjYXBhYmlsaXRpZXMgZm9yIFN5c3RlbS0+Vm1lbSBibHRzICovCisvKiBiOCovIERXT1JEICBkd1NWQlJvcHNbRERfUk9QX1NQQUNFXTsvKiBST1BTIHN1cHBvcnRlZCBmb3IgU3lzdGVtLT5WbWVtIGJsdHMgKi8KKy8qIGQ4Ki8gRFdPUkQgIGR3VlNCQ2FwczsJLyogZHJpdmVyIHNwZWNpZmljIGNhcGFiaWxpdGllcyBmb3IgVm1lbS0+U3lzdGVtIGJsdHMgKi8KKy8qIGRjKi8gRFdPUkQgIGR3VlNCQ0tleUNhcHM7CS8qIGRyaXZlciBjb2xvciBrZXkgY2FwYWJpbGl0aWVzIGZvciBWbWVtLT5TeXN0ZW0gYmx0cyAqLworLyogZTAqLyBEV09SRCAgZHdWU0JGWENhcHM7CS8qIGRyaXZlciBGWCBjYXBhYmlsaXRpZXMgZm9yIFZtZW0tPlN5c3RlbSBibHRzICovCisvKiBlNCovIERXT1JEICBkd1ZTQlJvcHNbRERfUk9QX1NQQUNFXTsvKiBST1BTIHN1cHBvcnRlZCBmb3IgVm1lbS0+U3lzdGVtIGJsdHMgKi8KKy8qMTA0Ki8gRFdPUkQgIGR3U1NCQ2FwczsJLyogZHJpdmVyIHNwZWNpZmljIGNhcGFiaWxpdGllcyBmb3IgU3lzdGVtLT5TeXN0ZW0gYmx0cyAqLworLyoxMDgqLyBEV09SRCAgZHdTU0JDS2V5Q2FwczsJLyogZHJpdmVyIGNvbG9yIGtleSBjYXBhYmlsaXRpZXMgZm9yIFN5c3RlbS0+U3lzdGVtIGJsdHMgKi8KKy8qMTBjKi8gRFdPUkQgIGR3U1NCRlhDYXBzOwkvKiBkcml2ZXIgRlggY2FwYWJpbGl0aWVzIGZvciBTeXN0ZW0tPlN5c3RlbSBibHRzICovCisvKjExMCovIERXT1JEICBkd1NTQlJvcHNbRERfUk9QX1NQQUNFXTsvKiBST1BTIHN1cHBvcnRlZCBmb3IgU3lzdGVtLT5TeXN0ZW0gYmx0cyAqLworI2lmICAgICAgIERJUkVDVERSQVdfVkVSU0lPTiA+PSAweDA1MDAKKy8qMTMwKi8gRFdPUkQgIGR3TWF4VmlkZW9Qb3J0czsJLyogbWF4aW11bSBudW1iZXIgb2YgdXNhYmxlIHZpZGVvIHBvcnRzICovCisvKjEzNCovIERXT1JEICBkd0N1cnJWaWRlb1BvcnRzOy8qIGN1cnJlbnQgbnVtYmVyIG9mIHZpZGVvIHBvcnRzIHVzZWQgKi8KKy8qMTM4Ki8gRFdPUkQgIGR3U1ZCQ2FwczI7CS8qIG1vcmUgZHJpdmVyIHNwZWNpZmljIGNhcGFiaWxpdGllcyBmb3IgU3lzdGVtLT5WbWVtIGJsdHMgKi8KKy8qMTNjKi8gRFdPUkQgIGR3TkxWQkNhcHM7CS8qIGRyaXZlciBzcGVjaWZpYyBjYXBhYmlsaXRpZXMgZm9yIG5vbi1sb2NhbC0+bG9jYWwgdmlkbWVtIGJsdHMgKi8KKy8qMTQwKi8gRFdPUkQgIGR3TkxWQkNhcHMyOwkvKiBtb3JlIGRyaXZlciBzcGVjaWZpYyBjYXBhYmlsaXRpZXMgbm9uLWxvY2FsLT5sb2NhbCB2aWRtZW0gYmx0cyAqLworLyoxNDQqLyBEV09SRCAgZHdOTFZCQ0tleUNhcHM7CS8qIGRyaXZlciBjb2xvciBrZXkgY2FwYWJpbGl0aWVzIGZvciBub24tbG9jYWwtPmxvY2FsIHZpZG1lbSBibHRzICovCisvKjE0OCovIERXT1JEICBkd05MVkJGWENhcHM7CS8qIGRyaXZlciBGWCBjYXBhYmlsaXRpZXMgZm9yIG5vbi1sb2NhbC0+bG9jYWwgYmx0cyAqLworLyoxNGMqLyBEV09SRCAgZHdOTFZCUm9wc1tERF9ST1BfU1BBQ0VdOy8qIFJPUFMgc3VwcG9ydGVkIGZvciBub24tbG9jYWwtPmxvY2FsIGJsdHMgKi8KKyNlbHNlICAvKiBESVJFQ1REUkFXX1ZFUlNJT04gPj0gMHgwNTAwICovCisvKjEzMCovIERXT1JEICBkd1Jlc2VydmVkNDsKKy8qMTM0Ki8gRFdPUkQgIGR3UmVzZXJ2ZWQ1OworLyoxMzgqLyBEV09SRCAgZHdSZXNlcnZlZDY7CisjZW5kaWYgLyogRElSRUNURFJBV19WRVJTSU9OID49IDB4MDUwMCAqLwogfSBERENBUFMsKkxQRERDQVBTOwogCi0vKiBodyBoYXMgM2QgYWNjZWwgKi8KKworLyogRERDQVBTLmR3Q2FwcyAqLwogI2RlZmluZSBERENBUFNfM0QJCQkweDAwMDAwMDAxCi0vKiBzdXBwb3J0cyBvbmx5IGJvdW5kYXJ5IGFsaWduZWQgcmVjdGFuZ2xlcyAqLwogI2RlZmluZSBERENBUFNfQUxJR05CT1VOREFSWURFU1QJMHgwMDAwMDAwMgogI2RlZmluZSBERENBUFNfQUxJR05TSVpFREVTVAkJMHgwMDAwMDAwNAogI2RlZmluZSBERENBUFNfQUxJR05CT1VOREFSWVNSQwkJMHgwMDAwMDAwOApAQCAtMzE2LDExICs0MTEsMjIgQEAKICNkZWZpbmUgRERDQVBTX0NBTkNMSVBTVFJFVENIRUQJCTB4NDAwMDAwMDAKICNkZWZpbmUgRERDQVBTX0NBTkJMVFNZU01FTQkJMHg4MDAwMDAwMAogCi0vKiBkd0NhcHMyICovCi0vKiBkcml2ZXIgaXMgY2VydGlmaWVkICovCisvKiBERENBUFMuZHdDYXBzMiAqLwogI2RlZmluZSBERENBUFMyX0NFUlRJRklFRAkJMHgwMDAwMDAwMQotLyogbm8gMmQgb3BlcmF0aW9ucyBpbiAzZCBtb2RlICovCiAjZGVmaW5lIEREQ0FQUzJfTk8yRERVUklORzNEU0NFTkUgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBERENBUFMyX1ZJREVPUE9SVAkJMHgwMDAwMDAwNAorI2RlZmluZSBERENBUFMyX0FVVE9GTElQT1ZFUkxBWQkJMHgwMDAwMDAwOAorI2RlZmluZSBERENBUFMyX0NBTkJPQklOVEVSTEVBVkVECTB4MDAwMDAwMTAKKyNkZWZpbmUgRERDQVBTMl9DQU5CT0JOT05JTlRFUkxFQVZFRAkweDAwMDAwMDIwCisjZGVmaW5lIEREQ0FQUzJfQ09MT1JDT05UUk9MT1ZFUkxBWQkweDAwMDAwMDQwCisjZGVmaW5lIEREQ0FQUzJfQ09MT1JDT05UUk9MUFJJTUFSWQkweDAwMDAwMDgwCisjZGVmaW5lIEREQ0FQUzJfQ0FORFJPUFoxNkJJVAkJMHgwMDAwMDEwMAorI2RlZmluZSBERENBUFMyX05PTkxPQ0FMVklETUVNCQkweDAwMDAwMjAwCisjZGVmaW5lIEREQ0FQUzJfTk9OTE9DQUxWSURNRU1DQVBTCTB4MDAwMDA0MDAKKyNkZWZpbmUgRERDQVBTMl9OT1BBR0VMT0NLUkVRVUlSRUQJMHgwMDAwMDgwMAorI2RlZmluZSBERENBUFMyX1dJREVTVVJGQUNFUwkJMHgwMDAwMTAwMAorI2RlZmluZSBERENBUFMyX0NBTkZMSVBPRERFVkVOCQkweDAwMDAyMDAwCisjZGVmaW5lIEREQ0FQUzJfQ0FOQk9CSEFSRFdBUkUJCTB4MDAwMDQwMDAKIAogdHlwZWRlZiBzdHJ1Y3QgX0REQ09MT1JLRVkKIHsKQEAgLTM1NCwzMiArNDYwLDM0IEBACiAjZGVmaW5lIEREQ0tFWUNBUFNfTk9DT1NUT1ZFUkxBWQkJMHgwMDA0MDAwMAogCiB0eXBlZGVmIHN0cnVjdCBfRERQSVhFTEZPUk1BVCB7Ci0gICAgRFdPUkQJZHdTaXplOyAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBzdHJ1Y3R1cmUgKi8KLSAgICBEV09SRAlkd0ZsYWdzOyAgICAgICAgICAgICAgICAvKiBwaXhlbCBmb3JtYXQgZmxhZ3MgKi8KLSAgICBEV09SRAlkd0ZvdXJDQzsgICAgICAgICAgICAgICAvKiAoRk9VUkNDIGNvZGUpICovCisgICAgRFdPUkQJZHdTaXplOyAgICAgICAgICAgICAgICAgLyogMDogc2l6ZSBvZiBzdHJ1Y3R1cmUgKi8KKyAgICBEV09SRAlkd0ZsYWdzOyAgICAgICAgICAgICAgICAvKiA0OiBwaXhlbCBmb3JtYXQgZmxhZ3MgKi8KKyAgICBEV09SRAlkd0ZvdXJDQzsgICAgICAgICAgICAgICAvKiA4OiAoRk9VUkNDIGNvZGUpICovCiAgICAgdW5pb24gewotCURXT1JECWR3UkdCQml0Q291bnQ7ICAgICAgICAgIC8qIGhvdyBtYW55IGJpdHMgcGVyIHBpeGVsIChCRF80LDgsMTYsMjQsMzIpKi8KLQlEV09SRAlkd1lVVkJpdENvdW50OyAgICAgICAgICAvKiBob3cgbWFueSBiaXRzIHBlciBwaXhlbCAoQkRfNCw4LDE2LDI0LDMyKSovCi0JRFdPUkQJZHdaQnVmZmVyQml0RGVwdGg7ICAgICAgLyogaG93IG1hbnkgYml0cyBmb3IgeiBidWZmZXJzIChCRF84LDE2LDI0LDMyKSovCi0JRFdPUkQJZHdBbHBoYUJpdERlcHRoOyAgICAgICAgLyogaG93IG1hbnkgYml0cyBmb3IgYWxwaGEgY2hhbm5lbHMgKEJEXzEsMiw0LDgpKi8KKwlEV09SRAlkd1JHQkJpdENvdW50OyAgICAgICAgICAvKiBDOiBob3cgbWFueSBiaXRzIHBlciBwaXhlbCAqLworCURXT1JECWR3WVVWQml0Q291bnQ7ICAgICAgICAgIC8qIEM6IGhvdyBtYW55IGJpdHMgcGVyIHBpeGVsICovCisJRFdPUkQJZHdaQnVmZmVyQml0RGVwdGg7ICAgICAgLyogQzogaG93IG1hbnkgYml0cyBmb3IgeiBidWZmZXJzICovCisJRFdPUkQJZHdBbHBoYUJpdERlcHRoOyAgICAgICAgLyogQzogaG93IG1hbnkgYml0cyBmb3IgYWxwaGEgY2hhbm5lbHMqLwogICAgIH0geDsKICAgICB1bmlvbiB7Ci0JRFdPUkQJZHdSQml0TWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgcmVkIGJpdCovCi0JRFdPUkQJZHdZQml0TWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgWSBiaXRzKi8KKwlEV09SRAlkd1JCaXRNYXNrOyAgICAgICAgICAgICAvKiAxMDogbWFzayBmb3IgcmVkIGJpdCovCisJRFdPUkQJZHdZQml0TWFzazsgICAgICAgICAgICAgLyogMTA6IG1hc2sgZm9yIFkgYml0cyovCiAgICAgfSB5OwogICAgIHVuaW9uIHsKLQlEV09SRAlkd0dCaXRNYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBncmVlbiBiaXRzKi8KLQlEV09SRAlkd1VCaXRNYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBVIGJpdHMqLworCURXT1JECWR3R0JpdE1hc2s7ICAgICAgICAgICAgIC8qIDE0OiBtYXNrIGZvciBncmVlbiBiaXRzKi8KKwlEV09SRAlkd1VCaXRNYXNrOyAgICAgICAgICAgICAvKiAxNDogbWFzayBmb3IgVSBiaXRzKi8KICAgICB9IHo7CiAgICAgdW5pb24gewotCURXT1JEICAgZHdCQml0TWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgYmx1ZSBiaXRzKi8KLQlEV09SRCAgIGR3VkJpdE1hc2s7ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIFYgYml0cyovCisJRFdPUkQgICBkd0JCaXRNYXNrOyAgICAgICAgICAgICAvKiAxODogbWFzayBmb3IgYmx1ZSBiaXRzKi8KKwlEV09SRCAgIGR3VkJpdE1hc2s7ICAgICAgICAgICAgIC8qIDE4OiBtYXNrIGZvciBWIGJpdHMqLwogICAgIH0geHg7CiAgICAgdW5pb24gewotICAgIAlEV09SRAlkd1JHQkFscGhhQml0TWFzazsJLyogbWFzayBmb3IgYWxwaGEgY2hhbm5lbCAqLwotICAgIAlEV09SRAlkd1lVVkFscGhhQml0TWFzazsJLyogbWFzayBmb3IgYWxwaGEgY2hhbm5lbCAqLwotCisgICAgCURXT1JECWR3UkdCQWxwaGFCaXRNYXNrOwkvKiAxQzogbWFzayBmb3IgYWxwaGEgY2hhbm5lbCAqLworICAgIAlEV09SRAlkd1lVVkFscGhhQml0TWFzazsJLyogMUM6IG1hc2sgZm9yIGFscGhhIGNoYW5uZWwgKi8KKwlEV09SRAlkd1JHQlpCaXRNYXNrOwkJLyogMUM6IG1hc2sgZm9yIFogY2hhbm5lbCAqLworCURXT1JECWR3WVVWWkJpdE1hc2s7CQkvKiAxQzogbWFzayBmb3IgWiBjaGFubmVsICovCiAgICAgfSB4eTsKKyAgICAJCQkJCS8qIDIwOiBuZXh0IHN0cnVjdHVyZSAqLwogfSBERFBJWEVMRk9STUFULCpMUEREUElYRUxGT1JNQVQ7CiAKIC8qIEREQ0FQUy5kd0ZYQ2FwcyAqLwpAQCAtNDY4LDYgKzU3Niw3IEBACiAjZGVmaW5lIEREUEZfWkJVRkZFUgkJCTB4MDAwMDA0MDAKICNkZWZpbmUgRERQRl9QQUxFVFRFSU5ERVhFRDEJCTB4MDAwMDA4MDAKICNkZWZpbmUgRERQRl9QQUxFVFRFSU5ERVhFRDIJCTB4MDAwMDEwMDAKKyNkZWZpbmUgRERQRl9aUElYRUxTCQkJMHgwMDAwMjAwMAogCiAvKiBTZXRDb29wZXJhdGl2ZUxldmVsIGR3RmxhZ3MgKi8KICNkZWZpbmUgRERTQ0xfRlVMTFNDUkVFTgkJMHgwMDAwMDAwMQpAQCAtNDc2LDQwICs1ODUsMTIgQEAKICNkZWZpbmUgRERTQ0xfTk9STUFMCQkJMHgwMDAwMDAwOAogI2RlZmluZSBERFNDTF9FWENMVVNJVkUJCQkweDAwMDAwMDEwCiAjZGVmaW5lIEREU0NMX0FMTE9XTU9ERVgJCTB4MDAwMDAwNDAKKyNkZWZpbmUgRERTQ0xfU0VURk9DVVNXSU5ET1cJCTB4MDAwMDAwODAKKyNkZWZpbmUgRERTQ0xfU0VUREVWSUNFV0lORE9XCQkweDAwMDAwMTAwCisjZGVmaW5lIEREU0NMX0NSRUFURURFVklDRVdJTkRPVwkweDAwMDAwMjAwCiAKLXR5cGVkZWYgc3RydWN0IF9ERFNVUkZBQ0VERVNDCi17Ci0JRFdPUkQJZHdTaXplOwkvKiBzaXplIG9mIHRoZSBERFNVUkZBQ0VERVNDIHN0cnVjdHVyZSovCi0JRFdPUkQJZHdGbGFnczsvKiBkZXRlcm1pbmVzIHdoYXQgZmllbGRzIGFyZSB2YWxpZCovCi0JRFdPUkQJZHdIZWlnaHQ7LyogaGVpZ2h0IG9mIHN1cmZhY2UgdG8gYmUgY3JlYXRlZCovCi0JRFdPUkQJZHdXaWR0aDsvKiB3aWR0aCBvZiBpbnB1dCBzdXJmYWNlKi8KLQlMT05HCWxQaXRjaDsJLyogZGlzdGFuY2UgdG8gc3RhcnQgb2YgbmV4dCBsaW5lIChyZXR1cm4gdmFsdWUgb25seSkqLwotCURXT1JECWR3QmFja0J1ZmZlckNvdW50OwkvKiBudW1iZXIgb2YgYmFjayBidWZmZXJzIHJlcXVlc3RlZCovCi0JdW5pb24gewotCQlEV09SRAlkd01pcE1hcENvdW50OwkvKiBudW1iZXIgb2YgbWlwLW1hcCBsZXZlbHMgcmVxdWVzdGVkKi8KLQkJRFdPUkQJZHdaQnVmZmVyQml0RGVwdGg7LyogZGVwdGggb2YgWiBidWZmZXIgcmVxdWVzdGVkKi8KLQkJRFdPUkQJZHdSZWZyZXNoUmF0ZTsJLyogcmVmcmVzaCByYXRlICh1c2VkIHdoZW4gZGlzcGxheSBtb2RlIGlzIGRlc2NyaWJlZCkqLwotCX0geDsKLQlEV09SRAlkd0FscGhhQml0RGVwdGg7ICAgICAgICAvKiBkZXB0aCBvZiBhbHBoYSBidWZmZXIgcmVxdWVzdGVkKi8KLQlEV09SRAlkd1Jlc2VydmVkOyAgICAgICAgICAgICAvKiByZXNlcnZlZCovCi0JTFBWT0lECWxwU3VyZmFjZTsgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0ZWQgc3VyZmFjZSBtZW1vcnkqLwotCUREQ09MT1JLRVkJZGRja0NLRGVzdE92ZXJsYXk7LyogY29sb3Iga2V5IGZvciBkZXN0aW5hdGlvbiBvdmVybGF5IHVzZSovCi0JRERDT0xPUktFWQlkZGNrQ0tEZXN0Qmx0Oy8qIGNvbG9yIGtleSBmb3IgZGVzdGluYXRpb24gYmx0IHVzZSovCi0JRERDT0xPUktFWQlkZGNrQ0tTcmNPdmVybGF5Oy8qIGNvbG9yIGtleSBmb3Igc291cmNlIG92ZXJsYXkgdXNlKi8KLQlERENPTE9SS0VZCWRkY2tDS1NyY0JsdDsvKiBjb2xvciBrZXkgZm9yIHNvdXJjZSBibHQgdXNlKi8KLQlERFBJWEVMRk9STUFUCWRkcGZQaXhlbEZvcm1hdDsvKiBwaXhlbCBmb3JtYXQgZGVzY3JpcHRpb24gb2YgdGhlIHN1cmZhY2UqLwotCUREU0NBUFMJCWRkc0NhcHM7LyogZGlyZWN0IGRyYXcgc3VyZmFjZSBjYXBhYmlsaXRpZXMqLwotfSBERFNVUkZBQ0VERVNDLCpMUEREU1VSRkFDRURFU0M7CiAKLXR5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqIExQRERFTlVNQ0FMTEJBQ0szMkEpKEdVSUQgKiwgTFBTVFIsIExQU1RSLCBMUFZPSUQpOwotdHlwZWRlZiBCT09MMzIgKENBTExCQUNLICogTFBEREVOVU1DQUxMQkFDSzMyVykoR1VJRCAqLCBMUFdTVFIsIExQV1NUUiwgTFBWT0lEKTsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKExQRERFTlVNQ0FMTEJBQ0spCi0KLXR5cGVkZWYgSFJFU1VMVCAoQ0FMTEJBQ0sgKiBMUERERU5VTU1PREVTQ0FMTEJBQ0spKExQRERTVVJGQUNFREVTQywgTFBWT0lEKTsKLXR5cGVkZWYgSFJFU1VMVCAoQ0FMTEJBQ0sgKiBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0spKExQRElSRUNURFJBV1NVUkZBQ0UsIExQRERTVVJGQUNFREVTQywgTFBWT0lEKTsKLQotLyogZHdGbGFncyBmaWVsZC4uLiB3aGljaCBhcmUgdmFsaWQgKi8KLQorLyogRERTVVJGQUNFREVTQy5kd0ZsYWdzICovCiAjZGVmaW5lCUREU0RfQ0FQUwkJMHgwMDAwMDAwMQogI2RlZmluZQlERFNEX0hFSUdIVAkJMHgwMDAwMDAwMgogI2RlZmluZQlERFNEX1dJRFRICQkweDAwMDAwMDA0CkBAIC01MTcsNiArNTk4LDcgQEAKICNkZWZpbmUJRERTRF9CQUNLQlVGRkVSQ09VTlQJMHgwMDAwMDAyMAogI2RlZmluZQlERFNEX1pCVUZGRVJCSVRERVBUSAkweDAwMDAwMDQwCiAjZGVmaW5lCUREU0RfQUxQSEFCSVRERVBUSAkweDAwMDAwMDgwCisjZGVmaW5lCUREU0RfTFBTVVJGQUNFCQkweDAwMDAwODAwCiAjZGVmaW5lCUREU0RfUElYRUxGT1JNQVQJMHgwMDAwMTAwMAogI2RlZmluZQlERFNEX0NLREVTVE9WRVJMQVkJMHgwMDAwMjAwMAogI2RlZmluZQlERFNEX0NLREVTVEJMVAkJMHgwMDAwNDAwMApAQCAtNTI0LDcgKzYwNiw4NSBAQAogI2RlZmluZQlERFNEX0NLU1JDQkxUCQkweDAwMDEwMDAwCiAjZGVmaW5lCUREU0RfTUlQTUFQQ09VTlQJMHgwMDAyMDAwMAogI2RlZmluZQlERFNEX1JFRlJFU0hSQVRFCTB4MDAwNDAwMDAKLSNkZWZpbmUJRERTRF9BTEwJCTB4MDAwN2Y5ZWUKKyNkZWZpbmUJRERTRF9MSU5FQVJTSVpFCQkweDAwMDgwMDAwCisjZGVmaW5lCUREU0RfQUxMCQkweDAwMGZmOWVlCisKKy8qIFNldERpc3BsYXlNb2RlIGZsYWdzICovCisjZGVmaW5lIEREU0RNX1NUQU5EQVJEVkdBTU9ERQkweDAwMDAwMDAxCisKKy8qIEVudW1EaXNwbGF5TW9kZXMgZmxhZ3MgKi8KKyNkZWZpbmUgRERFRE1fUkVGUkVTSFJBVEVTCTB4MDAwMDAwMDEKKyNkZWZpbmUgRERFRE1fU1RBTkRBUkRWR0FNT0RFUwkweDAwMDAwMDAyCisKKwordHlwZWRlZiBzdHJ1Y3QgX0REU1VSRkFDRURFU0MKK3sKKwlEV09SRAlkd1NpemU7CQkvKiAwOiBzaXplIG9mIHRoZSBERFNVUkZBQ0VERVNDIHN0cnVjdHVyZSovCisJRFdPUkQJZHdGbGFnczsJLyogNDogZGV0ZXJtaW5lcyB3aGF0IGZpZWxkcyBhcmUgdmFsaWQqLworCURXT1JECWR3SGVpZ2h0OwkvKiA4OiBoZWlnaHQgb2Ygc3VyZmFjZSB0byBiZSBjcmVhdGVkKi8KKwlEV09SRAlkd1dpZHRoOwkvKiBDOiB3aWR0aCBvZiBpbnB1dCBzdXJmYWNlKi8KKwlMT05HCWxQaXRjaDsJCS8qMTA6IGRpc3RhbmNlIHRvIHN0YXJ0IG9mIG5leHQgbGluZSAocmV0dXJuIHZhbHVlIG9ubHkpKi8KKwlEV09SRAlkd0JhY2tCdWZmZXJDb3VudDsvKiAxNDogbnVtYmVyIG9mIGJhY2sgYnVmZmVycyByZXF1ZXN0ZWQqLworCXVuaW9uIHsKKwkJRFdPUkQJZHdNaXBNYXBDb3VudDsvKiAxODpudW1iZXIgb2YgbWlwLW1hcCBsZXZlbHMgcmVxdWVzdGVkKi8KKwkJRFdPUkQJZHdaQnVmZmVyQml0RGVwdGg7LyoxODogZGVwdGggb2YgWiBidWZmZXIgcmVxdWVzdGVkKi8KKwkJRFdPUkQJZHdSZWZyZXNoUmF0ZTsvKiAxODpyZWZyZXNoIHJhdGUgKHVzZWQgd2hlbiBkaXNwbGF5IG1vZGUgaXMgZGVzY3JpYmVkKSovCisJfSB4OwkJCisJRFdPUkQJZHdBbHBoYUJpdERlcHRoOy8qIDFDOmRlcHRoIG9mIGFscGhhIGJ1ZmZlciByZXF1ZXN0ZWQqLworCURXT1JECWR3UmVzZXJ2ZWQ7CS8qIDIwOnJlc2VydmVkKi8KKwl1bmlvbiB7CisJCUxQVk9JRAlscFN1cmZhY2U7CS8qIDI0OnBvaW50ZXIgdG8gdGhlIGFzc29jaWF0ZWQgc3VyZmFjZSBtZW1vcnkqLworCQlEV09SRAlkd0xpbmVhclNpemU7CS8qIDI0OkZvcm1sZXNzIGxhdGUtYWxsb2NhdGVkIG9wdGltaXplZCBzdXJmYWNlIHNpemUqLworCX0geTsKKwlERENPTE9SS0VZCWRkY2tDS0Rlc3RPdmVybGF5Oy8qIDI4OiBDSyBmb3IgZGVzdCBvdmVybGF5IHVzZSovCisJRERDT0xPUktFWQlkZGNrQ0tEZXN0Qmx0OwkvKiAzMDogQ0sgZm9yIGRlc3RpbmF0aW9uIGJsdCB1c2UqLworCUREQ09MT1JLRVkJZGRja0NLU3JjT3ZlcmxheTsvKiAzODogQ0sgZm9yIHNvdXJjZSBvdmVybGF5IHVzZSovCisJRERDT0xPUktFWQlkZGNrQ0tTcmNCbHQ7CS8qIDQwOiBDSyBmb3Igc291cmNlIGJsdCB1c2UqLworCUREUElYRUxGT1JNQVQJZGRwZlBpeGVsRm9ybWF0Oy8qIDQ4OiBwaXhlbCBmb3JtYXQgZGVzY3JpcHRpb24gb2YgdGhlIHN1cmZhY2UqLworCUREU0NBUFMJCWRkc0NhcHM7CS8qIDY4OiBkaXJlY3QgZHJhdyBzdXJmYWNlIGNhcHMgKi8KK30gRERTVVJGQUNFREVTQywqTFBERFNVUkZBQ0VERVNDOworCisvKiBERENPTE9SQ09OVFJPTC5kd0ZsYWdzICovCisjZGVmaW5lIEREQ09MT1JfQlJJR0hUTkVTUwkweDAwMDAwMDAxCisjZGVmaW5lIEREQ09MT1JfQ09OVFJBU1QJMHgwMDAwMDAwMgorI2RlZmluZSBERENPTE9SX0hVRQkJMHgwMDAwMDAwNAorI2RlZmluZSBERENPTE9SX1NBVFVSQVRJT04JMHgwMDAwMDAwOAorI2RlZmluZSBERENPTE9SX1NIQVJQTkVTUwkweDAwMDAwMDEwCisjZGVmaW5lIEREQ09MT1JfR0FNTUEJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRERDT0xPUl9DT0xPUkVOQUJMRQkweDAwMDAwMDQwCisKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRAlkd1NpemU7CisJRFdPUkQJZHdGbGFnczsKKwlMT05HCWxCcmlnaHRuZXNzOworCUxPTkcJbENvbnRyYXN0OworCUxPTkcJbEh1ZTsKKwlMT05HCWxTYXR1cmF0aW9uOworCUxPTkcJbFNoYXJwbmVzczsKKwlMT05HCWxHYW1tYTsKKwlMT05HCWxDb2xvckVuYWJsZTsKKwlEV09SRAlkd1Jlc2VydmVkMTsKK30gRERDT0xPUkNPTlRST0wsKkxQRERDT0xPUkNPTlRST0w7CisKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqIExQRERFTlVNQ0FMTEJBQ0szMkEpKEdVSUQgKiwgTFBTVFIsIExQU1RSLCBMUFZPSUQpOwordHlwZWRlZiBCT09MMzIgKENBTExCQUNLICogTFBEREVOVU1DQUxMQkFDSzMyVykoR1VJRCAqLCBMUFdTVFIsIExQV1NUUiwgTFBWT0lEKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQRERFTlVNQ0FMTEJBQ0spOworCit0eXBlZGVmIEhSRVNVTFQgKENBTExCQUNLICogTFBEREVOVU1NT0RFU0NBTExCQUNLKShMUEREU1VSRkFDRURFU0MsIExQVk9JRCk7Cit0eXBlZGVmIEhSRVNVTFQgKENBTExCQUNLICogTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLKShMUERJUkVDVERSQVdTVVJGQUNFLCBMUEREU1VSRkFDRURFU0MsIExQVk9JRCk7CisKK3R5cGVkZWYgSEFORExFMzIgSE1PTklUT1I7Cit0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgKiBMUERERU5VTUNBTExCQUNLRVgzMkEpKEdVSUQgKiwgTFBTVFIsIExQU1RSLCBMUFZPSUQsIEhNT05JVE9SKTsKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqIExQRERFTlVNQ0FMTEJBQ0tFWDMyVykoR1VJRCAqLCBMUFdTVFIsIExQV1NUUiwgTFBWT0lELCBITU9OSVRPUik7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERERU5VTUNBTExCQUNLRVgpOworCitIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3RW51bWVyYXRlRXhBKCBMUERERU5VTUNBTExCQUNLRVgzMkEgbHBDYWxsYmFjaywgTFBWT0lEIGxwQ29udGV4dCwgRFdPUkQgZHdGbGFncyk7CitIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3RW51bWVyYXRlRXhXKCBMUERERU5VTUNBTExCQUNLRVgzMlcgbHBDYWxsYmFjaywgTFBWT0lEIGxwQ29udGV4dCwgRFdPUkQgZHdGbGFncyk7CisKKy8qIGZsYWdzIGZvciBEaXJlY3REcmF3RW51bWVyYXRlRXggKi8KKyNkZWZpbmUgRERFTlVNX0FUVEFDSEVEU0VDT05EQVJZREVWSUNFUwkweDAwMDAwMDAxCisjZGVmaW5lIERERU5VTV9ERVRBQ0hFRFNFQ09OREFSWURFVklDRVMJMHgwMDAwMDAwMgorI2RlZmluZSBEREVOVU1fTk9ORElTUExBWURFVklDRVMJMHgwMDAwMDAwNAogCiB0eXBlZGVmIHN0cnVjdCBfRERCTFRGWAogewpAQCAtNTY4LDYgKzcyOCw3IEBACiAgICAgewogICAgICAgICBEV09SRCAgIGR3RmlsbENvbG9yOyAgICAgICAgICAgICAgICAgICAgLyogY29sb3IgaW4gUkdCIG9yIFBhbGV0dGl6ZWQgKi8KICAgICAgICAgRFdPUkQgICBkd0ZpbGxEZXB0aDsgICAgICAgICAgICAgICAgICAgIC8qIGRlcHRoIHZhbHVlIGZvciB6LWJ1ZmZlciAqLworCURXT1JEICAgZHdGaWxsUGl4ZWw7CQkJLyogcGl4ZWwgdmFsIGZvciBSR0JBIG9yIFJHQlogKi8KICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscEREU1BhdHRlcm47ICAgICAgIC8qIFN1cmZhY2UgdG8gdXNlIGFzIHBhdHRlcm4gKi8KICAgICB9IGI7CiAgICAgRERDT0xPUktFWSAgZGRja0Rlc3RDb2xvcmtleTsgICAgICAgICAgICAgICAvKiBEZXN0Q29sb3JrZXkgb3ZlcnJpZGUgKi8KQEAgLTYzMSw3ICs3OTIsNiBAQAogI2RlZmluZSBTVERNRVRIT0RfKHJldCx4Zm4pIHJldCAoQ0FMTEJBQ0sgKmZuIyN4Zm4pCiAjZGVmaW5lIFBVUkUKICNkZWZpbmUgRkFSCi0jZGVmaW5lIFVMT05HIERXT1JECiAjZGVmaW5lIFRISVNfIFRISVMgLAogCiAjZGVmaW5lIFRISVMgTFBESVJFQ1REUkFXUEFMRVRURSB0aGlzCkBAIC03MDQsNyArODY0LDcgQEAKICAgICBTVERNRVRIT0QoSW5pdGlhbGl6ZSkoVEhJU18gR1VJRCBGQVIgKikgUFVSRTsKICAgICBTVERNRVRIT0QoUmVzdG9yZURpc3BsYXlNb2RlKShUSElTKSBQVVJFOwogICAgIFNURE1FVEhPRChTZXRDb29wZXJhdGl2ZUxldmVsKShUSElTXyBIV05EMzIsIERXT1JEKSBQVVJFOwotICAgIFNURE1FVEhPRChTZXREaXNwbGF5TW9kZSkoVEhJU18gRFdPUkQgd2lkdGgsIERXT1JEIGhlaWdodCxEV09SRCBkZXB0aCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0RGlzcGxheU1vZGUpKFRISVNfIERXT1JEICwgRFdPUkQgLERXT1JEICkgUFVSRTsKICAgICBTVERNRVRIT0QoV2FpdEZvclZlcnRpY2FsQmxhbmspKFRISVNfIERXT1JELCBIQU5ETEUzMiApIFBVUkU7CiB9ICpMUERJUkVDVERSQVdfVlRBQkxFLElEaXJlY3REcmF3X1ZUYWJsZTsKIApAQCAtNzI0LDI4ICs4ODQsMTYgQEAKIAlEV09SRAkJCXJlZjsKIAlzdHJ1Y3QgX2RpcmVjdGRyYXdkYXRhCWQ7CiB9OworI3VuZGVmIFRISVMKIAogLyogZmxhZ3MgZm9yIExvY2soKSAqLwotLyogVGhlIGRlZmF1bHQuICBTZXQgdG8gaW5kaWNhdGUgdGhhdCBMb2NrIHNob3VsZCByZXR1cm4gYSB2YWxpZCBtZW1vcnkgcG9pbnRlcgotICogdG8gdGhlIHRvcCBvZiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZS4gIElmIG5vIHJlY3RhbmdsZSBpcyBzcGVjaWZpZWQgdGhlbiBhCi0gKiBwb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIHN1cmZhY2UgaXMgcmV0dXJuZWQuCi0gKi8KLSNkZWZpbmUgRERMT0NLX1NVUkZBQ0VNRU1PUllQVFIJMHgwMDAwMDAwMEwKLS8qIFNldCB0byBpbmRpY2F0ZSB0aGF0IExvY2sgc2hvdWxkIHdhaXQgdW50aWwgaXQgY2FuIG9idGFpbiBhIHZhbGlkIG1lbW9yeQotICogcG9pbnRlciBiZWZvcmUgcmV0dXJuaW5nLiAgSWYgdGhpcyBiaXQgaXMgc2V0LCBMb2NrIHdpbGwgbmV2ZXIgcmV0dXJuCi0gKiBEREVSUl9XQVNTVElMTERSQVdJTkcuCi0gKi8KLSNkZWZpbmUgRERMT0NLX1dBSVQJCTB4MDAwMDAwMDFMCi0vKiBTZXQgaWYgYW4gZXZlbnQgaGFuZGxlIGlzIGJlaW5nIHBhc3NlZCB0byBMb2NrLiAgTG9jayB3aWxsIHRyaWdnZXIgdGhlIGV2ZW50Ci0gKiB3aGVuIGl0IGNhbiByZXR1cm4gdGhlIHN1cmZhY2UgbWVtb3J5IHBvaW50ZXIgcmVxdWVzdGVkLgotICovCi0jZGVmaW5lIERETE9DS19FVkVOVAkJMHgwMDAwMDAwMkwKLS8qIEluZGljYXRlcyB0aGF0IHRoZSBzdXJmYWNlIGJlaW5nIGxvY2tlZCB3aWxsIG9ubHkgYmUgcmVhZCBmcm9tLiAgKi8KLSNkZWZpbmUgRERMT0NLX1JFQURPTkxZCQkweDAwMDAwMDEwTAotLyogSW5kaWNhdGVzIHRoYXQgdGhlIHN1cmZhY2UgYmVpbmcgbG9ja2VkIHdpbGwgb25seSBiZSB3cml0dGVuIHRvICovCi0jZGVmaW5lIERETE9DS19XUklURU9OTFkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgRERMT0NLX1NVUkZBQ0VNRU1PUllQVFIJMHgwMDAwMDAwMAorI2RlZmluZSBERExPQ0tfV0FJVAkJMHgwMDAwMDAwMQorI2RlZmluZSBERExPQ0tfRVZFTlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRERMT0NLX1JFQURPTkxZCQkweDAwMDAwMDEwCisjZGVmaW5lIERETE9DS19XUklURU9OTFkJMHgwMDAwMDAyMAorI2RlZmluZSBERExPQ0tfTk9TWVNMT0NLCTB4MDAwMDA4MDAKIAotI3VuZGVmIFRISVMKIAogI2RlZmluZSBUSElTIExQRElSRUNURFJBVzIgdGhpcwogdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXcyX1ZUYWJsZQpAQCAtNzc1LDcgKzkyMyw3IEBACiAgICAgU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIEdVSUQgRkFSICopIFBVUkU7CiAgICAgU1RETUVUSE9EKFJlc3RvcmVEaXNwbGF5TW9kZSkoVEhJUykgUFVSRTsKICAgICBTVERNRVRIT0QoU2V0Q29vcGVyYXRpdmVMZXZlbCkoVEhJU18gSFdORDMyLCBEV09SRCkgUFVSRTsKLSAgICBTVERNRVRIT0QoU2V0RGlzcGxheU1vZGUpKFRISVNfIERXT1JELCBEV09SRCxEV09SRCwgRFdPUkQsIERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChTZXREaXNwbGF5TW9kZSkoVEhJU18gRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JEKSBQVVJFOwogICAgIFNURE1FVEhPRChXYWl0Rm9yVmVydGljYWxCbGFuaykoVEhJU18gRFdPUkQsIEhBTkRMRTMyICkgUFVSRTsKICAgICAvKioqIEFkZGVkIGluIHRoZSB2MiBpbnRlcmZhY2UgKioqLwogICAgIFNURE1FVEhPRChHZXRBdmFpbGFibGVWaWRNZW0pKFRISVNfIExQRERTQ0FQUywgTFBEV09SRCwgTFBEV09SRCkgUFVSRTsKQEAgLTc5MCw2ICs5MzgsMTQgQEAKICN1bmRlZiBUSElTCiAKICNkZWZpbmUgVEhJUyBMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMKK3N0cnVjdCBfZGlyZWN0ZHJhd3N1cmZhY2UgeworICAgIExQVk9JRAkJc3VyZmFjZTsKKyAgICBMUERJUkVDVERSQVdQQUxFVFRFCXBhbGV0dGU7CisgICAgRFdPUkQJCWZiX2hlaWdodCxscGl0Y2gsd2lkdGgsaGVpZ2h0OworICAgIExQRElSRUNURFJBVwlkZHJhdzsKKyAgICBMUERJUkVDVERSQVdTVVJGQUNFCWJhY2tidWZmZXI7Cit9OworCiB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VfVlRhYmxlIHsKICAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgRkFSICogcHB2T2JqKSBQVVJFOwpAQCAtODMxLDEzICs5ODcsOSBAQAogfSAqTFBESVJFQ1REUkFXU1VSRkFDRV9WVEFCTEUsSURpcmVjdERyYXdTdXJmYWNlX1ZUYWJsZTsKIAogc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZSB7Ci0gICAgTFBESVJFQ1REUkFXU1VSRkFDRV9WVEFCTEUgbHB2dGJsOwotICAgIERXT1JECQlyZWY7Ci0gICAgTFBWT0lECQlzdXJmYWNlOwotICAgIExQRElSRUNURFJBV1BBTEVUVEUJcGFsZXR0ZTsKLSAgICBEV09SRAkJZmJfaGVpZ2h0LGxwaXRjaCx3aWR0aCxoZWlnaHQ7Ci0gICAgTFBESVJFQ1REUkFXCWRkcmF3OwotICAgIExQRElSRUNURFJBV1NVUkZBQ0UJYmFja2J1ZmZlcjsKKyAgICBMUERJUkVDVERSQVdTVVJGQUNFX1ZUQUJMRQlscHZ0Ymw7CisgICAgRFdPUkQJCQlyZWY7CisgICAgc3RydWN0IF9kaXJlY3RkcmF3c3VyZmFjZQlzOwogfTsKICN1bmRlZiBUSElTCiAjZGVmaW5lIFRISVMgTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcwpAQCAtODg4LDEyICsxMDQwLDc5IEBACiAKIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2UyIHsKICAgICBMUERJUkVDVERSQVdTVVJGQUNFMl9WVEFCTEUJbHB2dGJsOwotICAgIERXT1JECQlyZWY7Ci0gICAgTFBWT0lECQlzdXJmYWNlOwotICAgIExQRElSRUNURFJBV1BBTEVUVEUJcGFsZXR0ZTsKLSAgICBEV09SRAkJZmJfaGVpZ2h0LGxwaXRjaCx3aWR0aCxoZWlnaHQ7Ci0gICAgTFBESVJFQ1REUkFXCWRkcmF3OwotICAgIExQRElSRUNURFJBV1NVUkZBQ0UJYmFja2J1ZmZlcjsKKyAgICBEV09SRAkJCXJlZjsKKyAgICBzdHJ1Y3QgX2RpcmVjdGRyYXdzdXJmYWNlCXM7Cit9OworI3VuZGVmIFRISVMKKyNkZWZpbmUgVEhJUyBMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzCisKK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTNfVlRhYmxlIHsKKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLworICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgRkFSICogcHB2T2JqKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKyAgICAvKioqIElEaXJlY3REcmF3U3VyZmFjZSBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoQWRkQXR0YWNoZWRTdXJmYWNlKShUSElTXyBMUERJUkVDVERSQVdTVVJGQUNFMykgUFVSRTsKKyAgICBTVERNRVRIT0QoQWRkT3ZlcmxheURpcnR5UmVjdCkoVEhJU18gTFBSRUNUMzIpIFBVUkU7CisgICAgU1RETUVUSE9EKEJsdCkoVEhJU18gTFBSRUNUMzIsTFBESVJFQ1REUkFXU1VSRkFDRTMsIExQUkVDVDMyLERXT1JELCBMUEREQkxURlgpIFBVUkU7CisgICAgU1RETUVUSE9EKEJsdEJhdGNoKShUSElTXyBMUEREQkxUQkFUQ0gsIERXT1JELCBEV09SRCApIFBVUkU7CisgICAgU1RETUVUSE9EKEJsdEZhc3QpKFRISVNfIERXT1JELERXT1JELExQRElSRUNURFJBV1NVUkZBQ0UzLCBMUFJFQ1QzMixEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRGVsZXRlQXR0YWNoZWRTdXJmYWNlKShUSElTXyBEV09SRCxMUERJUkVDVERSQVdTVVJGQUNFMykgUFVSRTsKKyAgICBTVERNRVRIT0QoRW51bUF0dGFjaGVkU3VyZmFjZXMpKFRISVNfIExQVk9JRCxMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0spIFBVUkU7ICAgIFNURE1FVEhPRChFbnVtT3ZlcmxheVpPcmRlcnMpKFRISVNfIERXT1JELExQVk9JRCxMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0spIFBVUkU7CisgICAgU1RETUVUSE9EKEZsaXApKFRISVNfIExQRElSRUNURFJBV1NVUkZBQ0UzLCBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0QXR0YWNoZWRTdXJmYWNlKShUSElTXyBMUEREU0NBUFMsIExQRElSRUNURFJBV1NVUkZBQ0UzIEZBUiAqKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRCbHRTdGF0dXMpKFRISVNfIERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRDYXBzKShUSElTXyBMUEREU0NBUFMpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldENsaXBwZXIpKFRISVNfIExQRElSRUNURFJBV0NMSVBQRVIgRkFSKikgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0Q29sb3JLZXkpKFRISVNfIERXT1JELCBMUEREQ09MT1JLRVkpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldERDKShUSElTXyBIREMzMiBGQVIgKikgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0RmxpcFN0YXR1cykoVEhJU18gRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldE92ZXJsYXlQb3NpdGlvbikoVEhJU18gTFBMT05HLCBMUExPTkcgKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRQYWxldHRlKShUSElTXyBMUERJUkVDVERSQVdQQUxFVFRFIEZBUiopIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFBpeGVsRm9ybWF0KShUSElTXyBMUEREUElYRUxGT1JNQVQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFN1cmZhY2VEZXNjKShUSElTXyBMUEREU1VSRkFDRURFU0MpIFBVUkU7CisgICAgU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIExQRElSRUNURFJBVywgTFBERFNVUkZBQ0VERVNDKSBQVVJFOworICAgIFNURE1FVEhPRChJc0xvc3QpKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKExvY2spKFRISVNfIExQUkVDVDMyLExQRERTVVJGQUNFREVTQyxEV09SRCxIQU5ETEUzMikgUFVSRTsKKyAgICBTVERNRVRIT0QoUmVsZWFzZURDKShUSElTXyBIREMzMikgUFVSRTsKKyAgICBTVERNRVRIT0QoUmVzdG9yZSkoVEhJUykgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0Q2xpcHBlcikoVEhJU18gTFBESVJFQ1REUkFXQ0xJUFBFUikgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0Q29sb3JLZXkpKFRISVNfIERXT1JELCBMUEREQ09MT1JLRVkpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldE92ZXJsYXlQb3NpdGlvbikoVEhJU18gTE9ORywgTE9ORyApIFBVUkU7CisgICAgU1RETUVUSE9EKFNldFBhbGV0dGUpKFRISVNfIExQRElSRUNURFJBV1BBTEVUVEUpIFBVUkU7CisgICAgU1RETUVUSE9EKFVubG9jaykoVEhJU18gTFBWT0lEKSBQVVJFOworICAgIFNURE1FVEhPRChVcGRhdGVPdmVybGF5KShUSElTXyBMUFJFQ1QzMiwgTFBESVJFQ1REUkFXU1VSRkFDRTMsTFBSRUNUMzIsRFdPUkQsIExQRERPVkVSTEFZRlgpIFBVUkU7CisgICAgU1RETUVUSE9EKFVwZGF0ZU92ZXJsYXlEaXNwbGF5KShUSElTXyBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoVXBkYXRlT3ZlcmxheVpPcmRlcikoVEhJU18gRFdPUkQsIExQRElSRUNURFJBV1NVUkZBQ0UzKSBQVVJFOworICAgIC8qKiogQWRkZWQgaW4gdGhlIHYyIGludGVyZmFjZSAqKiovCisgICAgU1RETUVUSE9EKEdldERESW50ZXJmYWNlKShUSElTXyBMUFZPSUQgRkFSICopIFBVUkU7CisgICAgU1RETUVUSE9EKFBhZ2VMb2NrKShUSElTXyBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoUGFnZVVubG9jaykoVEhJU18gRFdPUkQpIFBVUkU7CisgICAgLyoqKiBBZGRlZCBpbiB0aGUgVjMgaW50ZXJmYWNlICoqKi8KKyAgICBTVERNRVRIT0QoU2V0U3VyZmFjZURlc2MpKFRISVNfIExQRERTVVJGQUNFREVTQywgRFdPUkQpIFBVUkU7Cit9ICpMUERJUkVDVERSQVdTVVJGQUNFM19WVEFCTEUsSURpcmVjdERyYXdTdXJmYWNlM19WVGFibGU7CisKK3N0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2UzIHsKKyAgICBMUERJUkVDVERSQVdTVVJGQUNFM19WVEFCTEUJbHB2dGJsOworICAgIERXT1JECQkJcmVmOworICAgIHN0cnVjdCBfZGlyZWN0ZHJhd3N1cmZhY2UJczsKK307CisjdW5kZWYgVEhJUworCisjZGVmaW5lIFRISVMgTFBESVJFQ1REUkFXQ09MT1JDT05UUk9MIHRoaXMKK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q29sb3JDb250cm9sX1ZUYWJsZSB7CisJLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKwlTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEIEZBUiAqIHBwdk9iaikgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpICBQVVJFOworCVNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkgKFRISVMpIFBVUkU7CisJLyoqKiBJRGlyZWN0RHJhd0NvbG9yQ29udHJvbCBtZXRob2RzICoqKi8KKwlTVERNRVRIT0QoR2V0Q29sb3JDb250cm9scykoVEhJU18gTFBERENPTE9SQ09OVFJPTCkgUFVSRTsKKwlTVERNRVRIT0QoU2V0Q29sb3JDb250cm9scykoVEhJU18gTFBERENPTE9SQ09OVFJPTCkgUFVSRTsKK30gSURpcmVjdERyYXdDb2xvckNvbnRyb2xfVlRhYmxlLCpMUERJUkVDVERSQVdDT0xPUkNPTlRST0xfVlRBQkxFOworCitzdHJ1Y3QgSURpcmVjdERyYXdDb2xvckNvbnRyb2wgIHsKKwlMUERJUkVDVERSQVdDT0xPUkNPTlRST0xfVlRBQkxFCWxwdnRibDsKKwlEV09SRAlyZWY7CiB9OwogI3VuZGVmIFRISVMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Zy5oIGIvaW5jbHVkZS9kZWJ1Zy5oCmluZGV4IGEzNDUxOWQuLjJmMzVjNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWcuaAorKysgYi9pbmNsdWRlL2RlYnVnLmgKQEAgLTIzLDEwICsyMywxMiBAQAogI3VuZGVmIERFQlVHX0NVUlNPUgogI3VuZGVmIERFQlVHX0RDCiAjdW5kZWYgREVCVUdfRERFCisjdW5kZWYgREVCVUdfRERSQVcKICN1bmRlZiBERUJVR19ESUFMT0cKICN1bmRlZiBERUJVR19ETEwKICN1bmRlZiBERUJVR19ET1NGUwogI3VuZGVmIERFQlVHX0RSSVZFUgorI3VuZGVmIERFQlVHX0RTT1VORAogI3VuZGVmIERFQlVHX0VESVQKICN1bmRlZiBERUJVR19FVkVOVAogI3VuZGVmIERFQlVHX0VYRUMKQEAgLTkwLDYgKzkyLDcgQEAKICN1bmRlZiBERUJVR19XSU4xNkRSVgogI3VuZGVmIERFQlVHX1dJTjMyCiAjdW5kZWYgREVCVUdfV0lOU09DSworI3VuZGVmIERFQlVHX1gxMQogI2VuZGlmCiAKICNpZmRlZiBERUJVR19BTExfRVhUCkBAIC0xMTAsMTAgKzExMywxMiBAQAogI2RlZmluZSBERUJVR19DVVJTT1IKICNkZWZpbmUgREVCVUdfREMKICNkZWZpbmUgREVCVUdfRERFCisjZGVmaW5lIERFQlVHX0REUkFXCiAjZGVmaW5lIERFQlVHX0RJQUxPRwogI2RlZmluZSBERUJVR19ETEwKICNkZWZpbmUgREVCVUdfRE9TRlMKICNkZWZpbmUgREVCVUdfRFJJVkVSCisjZGVmaW5lIERFQlVHX0RTT1VORAogI2RlZmluZSBERUJVR19FRElUCiAjZGVmaW5lIERFQlVHX0VWRU5UCiAjZGVmaW5lIERFQlVHX0VYRUMKQEAgLTE3Nyw2ICsxODIsNyBAQAogI2RlZmluZSBERUJVR19XSU4xNkRSVgogI2RlZmluZSBERUJVR19XSU4zMgogI2RlZmluZSBERUJVR19XSU5TT0NLCisjZGVmaW5lIERFQlVHX1gxMQogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCkBAIC0yNjcsNiArMjczLDExIEBACiAjZWxzZQogICAgIDAsCiAjZW5kaWYKKyNpZmRlZiBERUJVR19ERFJBVworICAgIDEsCisjZWxzZQorICAgIDAsCisjZW5kaWYKICNpZmRlZiBERUJVR19ESUFMT0cKICAgICAxLAogI2Vsc2UKQEAgLTI4Nyw2ICsyOTgsMTEgQEAKICNlbHNlCiAgICAgMCwKICNlbmRpZgorI2lmZGVmIERFQlVHX0RTT1VORAorICAgIDEsCisjZWxzZQorICAgIDAsCisjZW5kaWYKICNpZmRlZiBERUJVR19FRElUCiAgICAgMSwKICNlbHNlCkBAIC02MDIsNiArNjE4LDExIEBACiAjZWxzZQogICAgIDAsCiAjZW5kaWYKKyNpZmRlZiBERUJVR19YMTEKKyAgICAxLAorI2Vsc2UKKyAgICAwLAorI2VuZGlmCiAgICAgMAogfTsKICNlbHNlCkBAIC04MzEsOCArODUyLDIxIEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9kaWFsb2cgaWYoIWRlYnVnX21zZ19lbmFibGVkWzE3XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2RpYWxvZyBkZWJ1Z19tc2dfZW5hYmxlZFsxN10KKyNkZWZpbmUgZHByaW50Zl9kZHJhdyBpZighZGVidWdfbXNnX2VuYWJsZWRbMTddKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfZGRyYXcgZGVidWdfbXNnX2VuYWJsZWRbMTddCisjZWxzZQorI2lmZGVmIERFQlVHX0REUkFXCisjZGVmaW5lIGRwcmludGZfZGRyYXcgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfZGRyYXcgMQorI2Vsc2UKKyNkZWZpbmUgZHByaW50Zl9kZHJhdyB3aGlsZSgwKSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ19kZHJhdyAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUlVOVElNRQorI2RlZmluZSBkcHJpbnRmX2RpYWxvZyBpZighZGVidWdfbXNnX2VuYWJsZWRbMThdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfZGlhbG9nIGRlYnVnX21zZ19lbmFibGVkWzE4XQogI2Vsc2UKICNpZmRlZiBERUJVR19ESUFMT0cKICNkZWZpbmUgZHByaW50Zl9kaWFsb2cgZnByaW50ZgpAQCAtODQ0LDggKzg3OCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9kbGwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzE4XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2RsbCBkZWJ1Z19tc2dfZW5hYmxlZFsxOF0KKyNkZWZpbmUgZHByaW50Zl9kbGwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzE5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2RsbCBkZWJ1Z19tc2dfZW5hYmxlZFsxOV0KICNlbHNlCiAjaWZkZWYgREVCVUdfRExMCiAjZGVmaW5lIGRwcmludGZfZGxsIGZwcmludGYKQEAgLTg1Nyw4ICs4OTEsOCBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZG9zZnMgaWYoIWRlYnVnX21zZ19lbmFibGVkWzE5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2Rvc2ZzIGRlYnVnX21zZ19lbmFibGVkWzE5XQorI2RlZmluZSBkcHJpbnRmX2Rvc2ZzIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyMF0pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ19kb3NmcyBkZWJ1Z19tc2dfZW5hYmxlZFsyMF0KICNlbHNlCiAjaWZkZWYgREVCVUdfRE9TRlMKICNkZWZpbmUgZHByaW50Zl9kb3NmcyBmcHJpbnRmCkBAIC04NzAsOCArOTA0LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2RyaXZlciBpZighZGVidWdfbXNnX2VuYWJsZWRbMjBdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZHJpdmVyIGRlYnVnX21zZ19lbmFibGVkWzIwXQorI2RlZmluZSBkcHJpbnRmX2RyaXZlciBpZighZGVidWdfbXNnX2VuYWJsZWRbMjFdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfZHJpdmVyIGRlYnVnX21zZ19lbmFibGVkWzIxXQogI2Vsc2UKICNpZmRlZiBERUJVR19EUklWRVIKICNkZWZpbmUgZHByaW50Zl9kcml2ZXIgZnByaW50ZgpAQCAtODgzLDggKzkxNywyMSBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZWRpdCBpZighZGVidWdfbXNnX2VuYWJsZWRbMjFdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZWRpdCBkZWJ1Z19tc2dfZW5hYmxlZFsyMV0KKyNkZWZpbmUgZHByaW50Zl9kc291bmQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzIyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2Rzb3VuZCBkZWJ1Z19tc2dfZW5hYmxlZFsyMl0KKyNlbHNlCisjaWZkZWYgREVCVUdfRFNPVU5ECisjZGVmaW5lIGRwcmludGZfZHNvdW5kIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2Rzb3VuZCAxCisjZWxzZQorI2RlZmluZSBkcHJpbnRmX2Rzb3VuZCB3aGlsZSgwKSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ19kc291bmQgMAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1JVTlRJTUUKKyNkZWZpbmUgZHByaW50Zl9lZGl0IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyM10pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ19lZGl0IGRlYnVnX21zZ19lbmFibGVkWzIzXQogI2Vsc2UKICNpZmRlZiBERUJVR19FRElUCiAjZGVmaW5lIGRwcmludGZfZWRpdCBmcHJpbnRmCkBAIC04OTYsOCArOTQzLDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2V2ZW50IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyMl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19ldmVudCBkZWJ1Z19tc2dfZW5hYmxlZFsyMl0KKyNkZWZpbmUgZHByaW50Zl9ldmVudCBpZighZGVidWdfbXNnX2VuYWJsZWRbMjRdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfZXZlbnQgZGVidWdfbXNnX2VuYWJsZWRbMjRdCiAjZWxzZQogI2lmZGVmIERFQlVHX0VWRU5UCiAjZGVmaW5lIGRwcmludGZfZXZlbnQgZnByaW50ZgpAQCAtOTA5LDggKzk1Niw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9leGVjIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyM10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19leGVjIGRlYnVnX21zZ19lbmFibGVkWzIzXQorI2RlZmluZSBkcHJpbnRmX2V4ZWMgaWYoIWRlYnVnX21zZ19lbmFibGVkWzI1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2V4ZWMgZGVidWdfbXNnX2VuYWJsZWRbMjVdCiAjZWxzZQogI2lmZGVmIERFQlVHX0VYRUMKICNkZWZpbmUgZHByaW50Zl9leGVjIGZwcmludGYKQEAgLTkyMiw4ICs5NjksOCBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZmlsZSBpZighZGVidWdfbXNnX2VuYWJsZWRbMjRdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZmlsZSBkZWJ1Z19tc2dfZW5hYmxlZFsyNF0KKyNkZWZpbmUgZHByaW50Zl9maWxlIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyNl0pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ19maWxlIGRlYnVnX21zZ19lbmFibGVkWzI2XQogI2Vsc2UKICNpZmRlZiBERUJVR19GSUxFCiAjZGVmaW5lIGRwcmludGZfZmlsZSBmcHJpbnRmCkBAIC05MzUsOCArOTgyLDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2ZpeHVwIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyNV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19maXh1cCBkZWJ1Z19tc2dfZW5hYmxlZFsyNV0KKyNkZWZpbmUgZHByaW50Zl9maXh1cCBpZighZGVidWdfbXNnX2VuYWJsZWRbMjddKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfZml4dXAgZGVidWdfbXNnX2VuYWJsZWRbMjddCiAjZWxzZQogI2lmZGVmIERFQlVHX0ZJWFVQCiAjZGVmaW5lIGRwcmludGZfZml4dXAgZnByaW50ZgpAQCAtOTQ4LDggKzk5NSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9mb250IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyNl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19mb250IGRlYnVnX21zZ19lbmFibGVkWzI2XQorI2RlZmluZSBkcHJpbnRmX2ZvbnQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzI4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2ZvbnQgZGVidWdfbXNnX2VuYWJsZWRbMjhdCiAjZWxzZQogI2lmZGVmIERFQlVHX0ZPTlQKICNkZWZpbmUgZHByaW50Zl9mb250IGZwcmludGYKQEAgLTk2MSw4ICsxMDA4LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2dkaSBpZighZGVidWdfbXNnX2VuYWJsZWRbMjddKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZ2RpIGRlYnVnX21zZ19lbmFibGVkWzI3XQorI2RlZmluZSBkcHJpbnRmX2dkaSBpZighZGVidWdfbXNnX2VuYWJsZWRbMjldKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfZ2RpIGRlYnVnX21zZ19lbmFibGVkWzI5XQogI2Vsc2UKICNpZmRlZiBERUJVR19HREkKICNkZWZpbmUgZHByaW50Zl9nZGkgZnByaW50ZgpAQCAtOTc0LDggKzEwMjEsOCBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZ2xvYmFsIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyOF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19nbG9iYWwgZGVidWdfbXNnX2VuYWJsZWRbMjhdCisjZGVmaW5lIGRwcmludGZfZ2xvYmFsIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszMF0pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ19nbG9iYWwgZGVidWdfbXNnX2VuYWJsZWRbMzBdCiAjZWxzZQogI2lmZGVmIERFQlVHX0dMT0JBTAogI2RlZmluZSBkcHJpbnRmX2dsb2JhbCBmcHJpbnRmCkBAIC05ODcsOCArMTAzNCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9ncmFwaGljcyBpZighZGVidWdfbXNnX2VuYWJsZWRbMjldKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZ3JhcGhpY3MgZGVidWdfbXNnX2VuYWJsZWRbMjldCisjZGVmaW5lIGRwcmludGZfZ3JhcGhpY3MgaWYoIWRlYnVnX21zZ19lbmFibGVkWzMxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2dyYXBoaWNzIGRlYnVnX21zZ19lbmFibGVkWzMxXQogI2Vsc2UKICNpZmRlZiBERUJVR19HUkFQSElDUwogI2RlZmluZSBkcHJpbnRmX2dyYXBoaWNzIGZwcmludGYKQEAgLTEwMDAsOCArMTA0Nyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9oZWFwIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszMF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19oZWFwIGRlYnVnX21zZ19lbmFibGVkWzMwXQorI2RlZmluZSBkcHJpbnRmX2hlYXAgaWYoIWRlYnVnX21zZ19lbmFibGVkWzMyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2hlYXAgZGVidWdfbXNnX2VuYWJsZWRbMzJdCiAjZWxzZQogI2lmZGVmIERFQlVHX0hFQVAKICNkZWZpbmUgZHByaW50Zl9oZWFwIGZwcmludGYKQEAgLTEwMTMsOCArMTA2MCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9ob29rIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszMV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19ob29rIGRlYnVnX21zZ19lbmFibGVkWzMxXQorI2RlZmluZSBkcHJpbnRmX2hvb2sgaWYoIWRlYnVnX21zZ19lbmFibGVkWzMzXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2hvb2sgZGVidWdfbXNnX2VuYWJsZWRbMzNdCiAjZWxzZQogI2lmZGVmIERFQlVHX0hPT0sKICNkZWZpbmUgZHByaW50Zl9ob29rIGZwcmludGYKQEAgLTEwMjYsOCArMTA3Myw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9pY29uIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszMl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19pY29uIGRlYnVnX21zZ19lbmFibGVkWzMyXQorI2RlZmluZSBkcHJpbnRmX2ljb24gaWYoIWRlYnVnX21zZ19lbmFibGVkWzM0XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2ljb24gZGVidWdfbXNnX2VuYWJsZWRbMzRdCiAjZWxzZQogI2lmZGVmIERFQlVHX0lDT04KICNkZWZpbmUgZHByaW50Zl9pY29uIGZwcmludGYKQEAgLTEwMzksOCArMTA4Niw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9pbnQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzMzXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2ludCBkZWJ1Z19tc2dfZW5hYmxlZFszM10KKyNkZWZpbmUgZHByaW50Zl9pbnQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzM1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2ludCBkZWJ1Z19tc2dfZW5hYmxlZFszNV0KICNlbHNlCiAjaWZkZWYgREVCVUdfSU5UCiAjZGVmaW5lIGRwcmludGZfaW50IGZwcmludGYKQEAgLTEwNTIsOCArMTA5OSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9rZXkgaWYoIWRlYnVnX21zZ19lbmFibGVkWzM0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2tleSBkZWJ1Z19tc2dfZW5hYmxlZFszNF0KKyNkZWZpbmUgZHByaW50Zl9rZXkgaWYoIWRlYnVnX21zZ19lbmFibGVkWzM2XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2tleSBkZWJ1Z19tc2dfZW5hYmxlZFszNl0KICNlbHNlCiAjaWZkZWYgREVCVUdfS0VZCiAjZGVmaW5lIGRwcmludGZfa2V5IGZwcmludGYKQEAgLTEwNjUsOCArMTExMiw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9rZXlib2FyZCBpZighZGVidWdfbXNnX2VuYWJsZWRbMzVdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfa2V5Ym9hcmQgZGVidWdfbXNnX2VuYWJsZWRbMzVdCisjZGVmaW5lIGRwcmludGZfa2V5Ym9hcmQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzM3XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2tleWJvYXJkIGRlYnVnX21zZ19lbmFibGVkWzM3XQogI2Vsc2UKICNpZmRlZiBERUJVR19LRVlCT0FSRAogI2RlZmluZSBkcHJpbnRmX2tleWJvYXJkIGZwcmludGYKQEAgLTEwNzgsOCArMTEyNSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9sZHQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzM2XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2xkdCBkZWJ1Z19tc2dfZW5hYmxlZFszNl0KKyNkZWZpbmUgZHByaW50Zl9sZHQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzM4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2xkdCBkZWJ1Z19tc2dfZW5hYmxlZFszOF0KICNlbHNlCiAjaWZkZWYgREVCVUdfTERUCiAjZGVmaW5lIGRwcmludGZfbGR0IGZwcmludGYKQEAgLTEwOTEsOCArMTEzOCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9saXN0Ym94IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszN10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19saXN0Ym94IGRlYnVnX21zZ19lbmFibGVkWzM3XQorI2RlZmluZSBkcHJpbnRmX2xpc3Rib3ggaWYoIWRlYnVnX21zZ19lbmFibGVkWzM5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2xpc3Rib3ggZGVidWdfbXNnX2VuYWJsZWRbMzldCiAjZWxzZQogI2lmZGVmIERFQlVHX0xJU1RCT1gKICNkZWZpbmUgZHByaW50Zl9saXN0Ym94IGZwcmludGYKQEAgLTExMDQsOCArMTE1MSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9sb2NhbCBpZighZGVidWdfbXNnX2VuYWJsZWRbMzhdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbG9jYWwgZGVidWdfbXNnX2VuYWJsZWRbMzhdCisjZGVmaW5lIGRwcmludGZfbG9jYWwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQwXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX2xvY2FsIGRlYnVnX21zZ19lbmFibGVkWzQwXQogI2Vsc2UKICNpZmRlZiBERUJVR19MT0NBTAogI2RlZmluZSBkcHJpbnRmX2xvY2FsIGZwcmludGYKQEAgLTExMTcsOCArMTE2NCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tY2kgaWYoIWRlYnVnX21zZ19lbmFibGVkWzM5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21jaSBkZWJ1Z19tc2dfZW5hYmxlZFszOV0KKyNkZWZpbmUgZHByaW50Zl9tY2kgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21jaSBkZWJ1Z19tc2dfZW5hYmxlZFs0MV0KICNlbHNlCiAjaWZkZWYgREVCVUdfTUNJCiAjZGVmaW5lIGRwcmludGZfbWNpIGZwcmludGYKQEAgLTExMzAsOCArMTE3Nyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tY2lhbmltIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0MF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tY2lhbmltIGRlYnVnX21zZ19lbmFibGVkWzQwXQorI2RlZmluZSBkcHJpbnRmX21jaWFuaW0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzQyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21jaWFuaW0gZGVidWdfbXNnX2VuYWJsZWRbNDJdCiAjZWxzZQogI2lmZGVmIERFQlVHX01DSUFOSU0KICNkZWZpbmUgZHByaW50Zl9tY2lhbmltIGZwcmludGYKQEAgLTExNDMsOCArMTE5MCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tY2l3YXZlIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0MV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tY2l3YXZlIGRlYnVnX21zZ19lbmFibGVkWzQxXQorI2RlZmluZSBkcHJpbnRmX21jaXdhdmUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQzXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21jaXdhdmUgZGVidWdfbXNnX2VuYWJsZWRbNDNdCiAjZWxzZQogI2lmZGVmIERFQlVHX01DSVdBVkUKICNkZWZpbmUgZHByaW50Zl9tY2l3YXZlIGZwcmludGYKQEAgLTExNTYsOCArMTIwMyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tZGkgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21kaSBkZWJ1Z19tc2dfZW5hYmxlZFs0Ml0KKyNkZWZpbmUgZHByaW50Zl9tZGkgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ0XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21kaSBkZWJ1Z19tc2dfZW5hYmxlZFs0NF0KICNlbHNlCiAjaWZkZWYgREVCVUdfTURJCiAjZGVmaW5lIGRwcmludGZfbWRpIGZwcmludGYKQEAgLTExNjksOCArMTIxNiw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tZW51IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0M10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tZW51IGRlYnVnX21zZ19lbmFibGVkWzQzXQorI2RlZmluZSBkcHJpbnRmX21lbnUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21lbnUgZGVidWdfbXNnX2VuYWJsZWRbNDVdCiAjZWxzZQogI2lmZGVmIERFQlVHX01FTlUKICNkZWZpbmUgZHByaW50Zl9tZW51IGZwcmludGYKQEAgLTExODIsOCArMTIyOSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tZXNzYWdlIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0NF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tZXNzYWdlIGRlYnVnX21zZ19lbmFibGVkWzQ0XQorI2RlZmluZSBkcHJpbnRmX21lc3NhZ2UgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ2XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21lc3NhZ2UgZGVidWdfbXNnX2VuYWJsZWRbNDZdCiAjZWxzZQogI2lmZGVmIERFQlVHX01FU1NBR0UKICNkZWZpbmUgZHByaW50Zl9tZXNzYWdlIGZwcmludGYKQEAgLTExOTUsOCArMTI0Miw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tZXRhZmlsZSBpZighZGVidWdfbXNnX2VuYWJsZWRbNDVdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbWV0YWZpbGUgZGVidWdfbXNnX2VuYWJsZWRbNDVdCisjZGVmaW5lIGRwcmludGZfbWV0YWZpbGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ3XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21ldGFmaWxlIGRlYnVnX21zZ19lbmFibGVkWzQ3XQogI2Vsc2UKICNpZmRlZiBERUJVR19NRVRBRklMRQogI2RlZmluZSBkcHJpbnRmX21ldGFmaWxlIGZwcmludGYKQEAgLTEyMDgsOCArMTI1NSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9taWRpIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0Nl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19taWRpIGRlYnVnX21zZ19lbmFibGVkWzQ2XQorI2RlZmluZSBkcHJpbnRmX21pZGkgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21pZGkgZGVidWdfbXNnX2VuYWJsZWRbNDhdCiAjZWxzZQogI2lmZGVmIERFQlVHX01JREkKICNkZWZpbmUgZHByaW50Zl9taWRpIGZwcmludGYKQEAgLTEyMjEsOCArMTI2OCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tbWF1eCBpZighZGVidWdfbXNnX2VuYWJsZWRbNDddKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbW1hdXggZGVidWdfbXNnX2VuYWJsZWRbNDddCisjZGVmaW5lIGRwcmludGZfbW1hdXggaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21tYXV4IGRlYnVnX21zZ19lbmFibGVkWzQ5XQogI2Vsc2UKICNpZmRlZiBERUJVR19NTUFVWAogI2RlZmluZSBkcHJpbnRmX21tYXV4IGZwcmludGYKQEAgLTEyMzQsOCArMTI4MSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tbWlvIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0OF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tbWlvIGRlYnVnX21zZ19lbmFibGVkWzQ4XQorI2RlZmluZSBkcHJpbnRmX21taW8gaWYoIWRlYnVnX21zZ19lbmFibGVkWzUwXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21taW8gZGVidWdfbXNnX2VuYWJsZWRbNTBdCiAjZWxzZQogI2lmZGVmIERFQlVHX01NSU8KICNkZWZpbmUgZHByaW50Zl9tbWlvIGZwcmludGYKQEAgLTEyNDcsOCArMTI5NCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tbXN5cyBpZighZGVidWdfbXNnX2VuYWJsZWRbNDldKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbW1zeXMgZGVidWdfbXNnX2VuYWJsZWRbNDldCisjZGVmaW5lIGRwcmludGZfbW1zeXMgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21tc3lzIGRlYnVnX21zZ19lbmFibGVkWzUxXQogI2Vsc2UKICNpZmRlZiBERUJVR19NTVNZUwogI2RlZmluZSBkcHJpbnRmX21tc3lzIGZwcmludGYKQEAgLTEyNjAsOCArMTMwNyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tbXRpbWUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUwXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21tdGltZSBkZWJ1Z19tc2dfZW5hYmxlZFs1MF0KKyNkZWZpbmUgZHByaW50Zl9tbXRpbWUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21tdGltZSBkZWJ1Z19tc2dfZW5hYmxlZFs1Ml0KICNlbHNlCiAjaWZkZWYgREVCVUdfTU1USU1FCiAjZGVmaW5lIGRwcmludGZfbW10aW1lIGZwcmludGYKQEAgLTEyNzMsOCArMTMyMCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tb2R1bGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUxXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21vZHVsZSBkZWJ1Z19tc2dfZW5hYmxlZFs1MV0KKyNkZWZpbmUgZHByaW50Zl9tb2R1bGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUzXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21vZHVsZSBkZWJ1Z19tc2dfZW5hYmxlZFs1M10KICNlbHNlCiAjaWZkZWYgREVCVUdfTU9EVUxFCiAjZGVmaW5lIGRwcmludGZfbW9kdWxlIGZwcmludGYKQEAgLTEyODYsOCArMTMzMyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tc2cgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21zZyBkZWJ1Z19tc2dfZW5hYmxlZFs1Ml0KKyNkZWZpbmUgZHByaW50Zl9tc2cgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU0XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21zZyBkZWJ1Z19tc2dfZW5hYmxlZFs1NF0KICNlbHNlCiAjaWZkZWYgREVCVUdfTVNHCiAjZGVmaW5lIGRwcmludGZfbXNnIGZwcmludGYKQEAgLTEyOTksOCArMTM0Niw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9ub25jbGllbnQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUzXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX25vbmNsaWVudCBkZWJ1Z19tc2dfZW5hYmxlZFs1M10KKyNkZWZpbmUgZHByaW50Zl9ub25jbGllbnQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX25vbmNsaWVudCBkZWJ1Z19tc2dfZW5hYmxlZFs1NV0KICNlbHNlCiAjaWZkZWYgREVCVUdfTk9OQ0xJRU5UCiAjZGVmaW5lIGRwcmludGZfbm9uY2xpZW50IGZwcmludGYKQEAgLTEzMTIsOCArMTM1OSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9vbGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX29sZSBkZWJ1Z19tc2dfZW5hYmxlZFs1NF0KKyNkZWZpbmUgZHByaW50Zl9vbGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU2XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX29sZSBkZWJ1Z19tc2dfZW5hYmxlZFs1Nl0KICNlbHNlCiAjaWZkZWYgREVCVUdfT0xFCiAjZGVmaW5lIGRwcmludGZfb2xlIGZwcmludGYKQEAgLTEzMjUsOCArMTM3Miw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9wYWxldHRlIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1NV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wYWxldHRlIGRlYnVnX21zZ19lbmFibGVkWzU1XQorI2RlZmluZSBkcHJpbnRmX3BhbGV0dGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU3XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3BhbGV0dGUgZGVidWdfbXNnX2VuYWJsZWRbNTddCiAjZWxzZQogI2lmZGVmIERFQlVHX1BBTEVUVEUKICNkZWZpbmUgZHByaW50Zl9wYWxldHRlIGZwcmludGYKQEAgLTEzMzgsOCArMTM4NSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9wcm9maWxlIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1Nl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wcm9maWxlIGRlYnVnX21zZ19lbmFibGVkWzU2XQorI2RlZmluZSBkcHJpbnRmX3Byb2ZpbGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Byb2ZpbGUgZGVidWdfbXNnX2VuYWJsZWRbNThdCiAjZWxzZQogI2lmZGVmIERFQlVHX1BST0ZJTEUKICNkZWZpbmUgZHByaW50Zl9wcm9maWxlIGZwcmludGYKQEAgLTEzNTEsOCArMTM5OCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9wcm9ncmVzcyBpZighZGVidWdfbXNnX2VuYWJsZWRbNTddKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcHJvZ3Jlc3MgZGVidWdfbXNnX2VuYWJsZWRbNTddCisjZGVmaW5lIGRwcmludGZfcHJvZ3Jlc3MgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Byb2dyZXNzIGRlYnVnX21zZ19lbmFibGVkWzU5XQogI2Vsc2UKICNpZmRlZiBERUJVR19QUk9HUkVTUwogI2RlZmluZSBkcHJpbnRmX3Byb2dyZXNzIGZwcmludGYKQEAgLTEzNjQsOCArMTQxMSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9wcm9wIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1OF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wcm9wIGRlYnVnX21zZ19lbmFibGVkWzU4XQorI2RlZmluZSBkcHJpbnRmX3Byb3AgaWYoIWRlYnVnX21zZ19lbmFibGVkWzYwXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Byb3AgZGVidWdfbXNnX2VuYWJsZWRbNjBdCiAjZWxzZQogI2lmZGVmIERFQlVHX1BST1AKICNkZWZpbmUgZHByaW50Zl9wcm9wIGZwcmludGYKQEAgLTEzNzcsOCArMTQyNCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9yZWcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3JlZyBkZWJ1Z19tc2dfZW5hYmxlZFs1OV0KKyNkZWZpbmUgZHByaW50Zl9yZWcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzYxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3JlZyBkZWJ1Z19tc2dfZW5hYmxlZFs2MV0KICNlbHNlCiAjaWZkZWYgREVCVUdfUkVHCiAjZGVmaW5lIGRwcmludGZfcmVnIGZwcmludGYKQEAgLTEzOTAsOCArMTQzNyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9yZWdpb24gaWYoIWRlYnVnX21zZ19lbmFibGVkWzYwXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3JlZ2lvbiBkZWJ1Z19tc2dfZW5hYmxlZFs2MF0KKyNkZWZpbmUgZHByaW50Zl9yZWdpb24gaWYoIWRlYnVnX21zZ19lbmFibGVkWzYyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3JlZ2lvbiBkZWJ1Z19tc2dfZW5hYmxlZFs2Ml0KICNlbHNlCiAjaWZkZWYgREVCVUdfUkVHSU9OCiAjZGVmaW5lIGRwcmludGZfcmVnaW9uIGZwcmludGYKQEAgLTE0MDMsOCArMTQ1MCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9yZWxheSBpZighZGVidWdfbXNnX2VuYWJsZWRbNjFdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcmVsYXkgZGVidWdfbXNnX2VuYWJsZWRbNjFdCisjZGVmaW5lIGRwcmludGZfcmVsYXkgaWYoIWRlYnVnX21zZ19lbmFibGVkWzYzXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3JlbGF5IGRlYnVnX21zZ19lbmFibGVkWzYzXQogI2Vsc2UKICNpZmRlZiBERUJVR19SRUxBWQogI2RlZmluZSBkcHJpbnRmX3JlbGF5IGZwcmludGYKQEAgLTE0MTYsOCArMTQ2Myw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9yZXNvdXJjZSBpZighZGVidWdfbXNnX2VuYWJsZWRbNjJdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcmVzb3VyY2UgZGVidWdfbXNnX2VuYWJsZWRbNjJdCisjZGVmaW5lIGRwcmludGZfcmVzb3VyY2UgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY0XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Jlc291cmNlIGRlYnVnX21zZ19lbmFibGVkWzY0XQogI2Vsc2UKICNpZmRlZiBERUJVR19SRVNPVVJDRQogI2RlZmluZSBkcHJpbnRmX3Jlc291cmNlIGZwcmludGYKQEAgLTE0MjksOCArMTQ3Niw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zY3JvbGwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzYzXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Njcm9sbCBkZWJ1Z19tc2dfZW5hYmxlZFs2M10KKyNkZWZpbmUgZHByaW50Zl9zY3JvbGwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Njcm9sbCBkZWJ1Z19tc2dfZW5hYmxlZFs2NV0KICNlbHNlCiAjaWZkZWYgREVCVUdfU0NST0xMCiAjZGVmaW5lIGRwcmludGZfc2Nyb2xsIGZwcmludGYKQEAgLTE0NDIsOCArMTQ4OSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zZWxlY3RvciBpZighZGVidWdfbXNnX2VuYWJsZWRbNjRdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc2VsZWN0b3IgZGVidWdfbXNnX2VuYWJsZWRbNjRdCisjZGVmaW5lIGRwcmludGZfc2VsZWN0b3IgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY2XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3NlbGVjdG9yIGRlYnVnX21zZ19lbmFibGVkWzY2XQogI2Vsc2UKICNpZmRlZiBERUJVR19TRUxFQ1RPUgogI2RlZmluZSBkcHJpbnRmX3NlbGVjdG9yIGZwcmludGYKQEAgLTE0NTUsOCArMTUwMiw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zZW0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzY1XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NlbSBkZWJ1Z19tc2dfZW5hYmxlZFs2NV0KKyNkZWZpbmUgZHByaW50Zl9zZW0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzY3XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3NlbSBkZWJ1Z19tc2dfZW5hYmxlZFs2N10KICNlbHNlCiAjaWZkZWYgREVCVUdfU0VNCiAjZGVmaW5lIGRwcmludGZfc2VtIGZwcmludGYKQEAgLTE0NjgsOCArMTUxNSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zZW5kbXNnIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2Nl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zZW5kbXNnIGRlYnVnX21zZ19lbmFibGVkWzY2XQorI2RlZmluZSBkcHJpbnRmX3NlbmRtc2cgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3NlbmRtc2cgZGVidWdfbXNnX2VuYWJsZWRbNjhdCiAjZWxzZQogI2lmZGVmIERFQlVHX1NFTkRNU0cKICNkZWZpbmUgZHByaW50Zl9zZW5kbXNnIGZwcmludGYKQEAgLTE0ODEsOCArMTUyOCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zaG0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzY3XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NobSBkZWJ1Z19tc2dfZW5hYmxlZFs2N10KKyNkZWZpbmUgZHByaW50Zl9zaG0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzY5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3NobSBkZWJ1Z19tc2dfZW5hYmxlZFs2OV0KICNlbHNlCiAjaWZkZWYgREVCVUdfU0hNCiAjZGVmaW5lIGRwcmludGZfc2htIGZwcmludGYKQEAgLTE0OTQsOCArMTU0MSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zdHJlc3MgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY4XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3N0cmVzcyBkZWJ1Z19tc2dfZW5hYmxlZFs2OF0KKyNkZWZpbmUgZHByaW50Zl9zdHJlc3MgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcwXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3N0cmVzcyBkZWJ1Z19tc2dfZW5hYmxlZFs3MF0KICNlbHNlCiAjaWZkZWYgREVCVUdfU1RSRVNTCiAjZGVmaW5lIGRwcmludGZfc3RyZXNzIGZwcmludGYKQEAgLTE1MDcsOCArMTU1NCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zdHJpbmcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3N0cmluZyBkZWJ1Z19tc2dfZW5hYmxlZFs2OV0KKyNkZWZpbmUgZHByaW50Zl9zdHJpbmcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3N0cmluZyBkZWJ1Z19tc2dfZW5hYmxlZFs3MV0KICNlbHNlCiAjaWZkZWYgREVCVUdfU1RSSU5HCiAjZGVmaW5lIGRwcmludGZfc3RyaW5nIGZwcmludGYKQEAgLTE1MjAsOCArMTU2Nyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90YXNrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3MF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190YXNrIGRlYnVnX21zZ19lbmFibGVkWzcwXQorI2RlZmluZSBkcHJpbnRmX3Rhc2sgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Rhc2sgZGVidWdfbXNnX2VuYWJsZWRbNzJdCiAjZWxzZQogI2lmZGVmIERFQlVHX1RBU0sKICNkZWZpbmUgZHByaW50Zl90YXNrIGZwcmludGYKQEAgLTE1MzMsOCArMTU4MCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90ZXh0IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3MV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190ZXh0IGRlYnVnX21zZ19lbmFibGVkWzcxXQorI2RlZmluZSBkcHJpbnRmX3RleHQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzczXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3RleHQgZGVidWdfbXNnX2VuYWJsZWRbNzNdCiAjZWxzZQogI2lmZGVmIERFQlVHX1RFWFQKICNkZWZpbmUgZHByaW50Zl90ZXh0IGZwcmludGYKQEAgLTE1NDYsOCArMTU5Myw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90aHVuayBpZighZGVidWdfbXNnX2VuYWJsZWRbNzJdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdGh1bmsgZGVidWdfbXNnX2VuYWJsZWRbNzJdCisjZGVmaW5lIGRwcmludGZfdGh1bmsgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc0XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3RodW5rIGRlYnVnX21zZ19lbmFibGVkWzc0XQogI2Vsc2UKICNpZmRlZiBERUJVR19USFVOSwogI2RlZmluZSBkcHJpbnRmX3RodW5rIGZwcmludGYKQEAgLTE1NTksOCArMTYwNiw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90aW1lciBpZighZGVidWdfbXNnX2VuYWJsZWRbNzNdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdGltZXIgZGVidWdfbXNnX2VuYWJsZWRbNzNdCisjZGVmaW5lIGRwcmludGZfdGltZXIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3RpbWVyIGRlYnVnX21zZ19lbmFibGVkWzc1XQogI2Vsc2UKICNpZmRlZiBERUJVR19USU1FUgogI2RlZmluZSBkcHJpbnRmX3RpbWVyIGZwcmludGYKQEAgLTE1NzIsOCArMTYxOSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90b29saGVscCBpZighZGVidWdfbXNnX2VuYWJsZWRbNzRdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdG9vbGhlbHAgZGVidWdfbXNnX2VuYWJsZWRbNzRdCisjZGVmaW5lIGRwcmludGZfdG9vbGhlbHAgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc2XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Rvb2xoZWxwIGRlYnVnX21zZ19lbmFibGVkWzc2XQogI2Vsc2UKICNpZmRlZiBERUJVR19UT09MSEVMUAogI2RlZmluZSBkcHJpbnRmX3Rvb2xoZWxwIGZwcmludGYKQEAgLTE1ODUsOCArMTYzMiw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90d2VhayBpZighZGVidWdfbXNnX2VuYWJsZWRbNzVdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdHdlYWsgZGVidWdfbXNnX2VuYWJsZWRbNzVdCisjZGVmaW5lIGRwcmludGZfdHdlYWsgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc3XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3R3ZWFrIGRlYnVnX21zZ19lbmFibGVkWzc3XQogI2Vsc2UKICNpZmRlZiBERUJVR19UV0VBSwogI2RlZmluZSBkcHJpbnRmX3R3ZWFrIGZwcmludGYKQEAgLTE1OTgsOCArMTY0NSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl91cGRvd24gaWYoIWRlYnVnX21zZ19lbmFibGVkWzc2XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3VwZG93biBkZWJ1Z19tc2dfZW5hYmxlZFs3Nl0KKyNkZWZpbmUgZHByaW50Zl91cGRvd24gaWYoIWRlYnVnX21zZ19lbmFibGVkWzc4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3VwZG93biBkZWJ1Z19tc2dfZW5hYmxlZFs3OF0KICNlbHNlCiAjaWZkZWYgREVCVUdfVVBET1dOCiAjZGVmaW5lIGRwcmludGZfdXBkb3duIGZwcmludGYKQEAgLTE2MTEsOCArMTY1OCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl92ZXIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc3XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3ZlciBkZWJ1Z19tc2dfZW5hYmxlZFs3N10KKyNkZWZpbmUgZHByaW50Zl92ZXIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3ZlciBkZWJ1Z19tc2dfZW5hYmxlZFs3OV0KICNlbHNlCiAjaWZkZWYgREVCVUdfVkVSCiAjZGVmaW5lIGRwcmludGZfdmVyIGZwcmludGYKQEAgLTE2MjQsOCArMTY3MSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl92aXJ0dWFsIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3OF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ192aXJ0dWFsIGRlYnVnX21zZ19lbmFibGVkWzc4XQorI2RlZmluZSBkcHJpbnRmX3ZpcnR1YWwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzgwXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3ZpcnR1YWwgZGVidWdfbXNnX2VuYWJsZWRbODBdCiAjZWxzZQogI2lmZGVmIERFQlVHX1ZJUlRVQUwKICNkZWZpbmUgZHByaW50Zl92aXJ0dWFsIGZwcmludGYKQEAgLTE2MzcsOCArMTY4NCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl92eGQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Z4ZCBkZWJ1Z19tc2dfZW5hYmxlZFs3OV0KKyNkZWZpbmUgZHByaW50Zl92eGQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzgxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Z4ZCBkZWJ1Z19tc2dfZW5hYmxlZFs4MV0KICNlbHNlCiAjaWZkZWYgREVCVUdfVlhECiAjZGVmaW5lIGRwcmludGZfdnhkIGZwcmludGYKQEAgLTE2NTAsOCArMTY5Nyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW4gaWYoIWRlYnVnX21zZ19lbmFibGVkWzgwXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbiBkZWJ1Z19tc2dfZW5hYmxlZFs4MF0KKyNkZWZpbmUgZHByaW50Zl93aW4gaWYoIWRlYnVnX21zZ19lbmFibGVkWzgyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbiBkZWJ1Z19tc2dfZW5hYmxlZFs4Ml0KICNlbHNlCiAjaWZkZWYgREVCVUdfV0lOCiAjZGVmaW5lIGRwcmludGZfd2luIGZwcmludGYKQEAgLTE2NjMsOCArMTcxMCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW4xNmRydiBpZighZGVidWdfbXNnX2VuYWJsZWRbODFdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfd2luMTZkcnYgZGVidWdfbXNnX2VuYWJsZWRbODFdCisjZGVmaW5lIGRwcmludGZfd2luMTZkcnYgaWYoIWRlYnVnX21zZ19lbmFibGVkWzgzXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbjE2ZHJ2IGRlYnVnX21zZ19lbmFibGVkWzgzXQogI2Vsc2UKICNpZmRlZiBERUJVR19XSU4xNkRSVgogI2RlZmluZSBkcHJpbnRmX3dpbjE2ZHJ2IGZwcmludGYKQEAgLTE2NzYsOCArMTcyMyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW4zMiBpZighZGVidWdfbXNnX2VuYWJsZWRbODJdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfd2luMzIgZGVidWdfbXNnX2VuYWJsZWRbODJdCisjZGVmaW5lIGRwcmludGZfd2luMzIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzg0XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbjMyIGRlYnVnX21zZ19lbmFibGVkWzg0XQogI2Vsc2UKICNpZmRlZiBERUJVR19XSU4zMgogI2RlZmluZSBkcHJpbnRmX3dpbjMyIGZwcmludGYKQEAgLTE2ODksOCArMTczNiw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW5zb2NrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs4M10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW5zb2NrIGRlYnVnX21zZ19lbmFibGVkWzgzXQorI2RlZmluZSBkcHJpbnRmX3dpbnNvY2sgaWYoIWRlYnVnX21zZ19lbmFibGVkWzg1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbnNvY2sgZGVidWdfbXNnX2VuYWJsZWRbODVdCiAjZWxzZQogI2lmZGVmIERFQlVHX1dJTlNPQ0sKICNkZWZpbmUgZHByaW50Zl93aW5zb2NrIGZwcmludGYKQEAgLTE3MDEsNiArMTc0OCwxOSBAQAogI2VuZGlmCiAjZW5kaWYKIAorI2lmZGVmIERFQlVHX1JVTlRJTUUKKyNkZWZpbmUgZHByaW50Zl94MTEgaWYoIWRlYnVnX21zZ19lbmFibGVkWzg2XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3gxMSBkZWJ1Z19tc2dfZW5hYmxlZFs4Nl0KKyNlbHNlCisjaWZkZWYgREVCVUdfWDExCisjZGVmaW5lIGRwcmludGZfeDExIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3gxMSAxCisjZWxzZQorI2RlZmluZSBkcHJpbnRmX3gxMSB3aGlsZSgwKSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ194MTEgMAorI2VuZGlmCisjZW5kaWYKKwogCiAjaWZkZWYgREVCVUdfUlVOVElNRQogI2lmZGVmIERFQlVHX0RFRklORV9WQVJJQUJMRVMKQEAgLTE3MjIsMTAgKzE3ODIsMTIgQEAKICAgICAiY3Vyc29yIiwKICAgICAiZGMiLAogICAgICJkZGUiLAorICAgICJkZHJhdyIsCiAgICAgImRpYWxvZyIsCiAgICAgImRsbCIsCiAgICAgImRvc2ZzIiwKICAgICAiZHJpdmVyIiwKKyAgICAiZHNvdW5kIiwKICAgICAiZWRpdCIsCiAgICAgImV2ZW50IiwKICAgICAiZXhlYyIsCkBAIC0xNzg5LDYgKzE4NTEsNyBAQAogICAgICJ3aW4xNmRydiIsCiAgICAgIndpbjMyIiwKICAgICAid2luc29jayIsCisgICAgIngxMSIsCiAgICAgIiIKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGlucHV0LmggYi9pbmNsdWRlL2RpbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2M3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RpbnB1dC5oCkBAIC0wLDAgKzEsNDMyIEBACisjaWZuZGVmIF9XSU5FX0RJTlBVVF9ICisjZGVmaW5lIF9XSU5FX0RJTlBVVF9ICisKKyNkZWZpbmUgU1RETUVUSE9EKHhmbikgSFJFU1VMVCAoQ0FMTEJBQ0sgKmZuIyN4Zm4pCisjZGVmaW5lIFNURE1FVEhPRF8ocmV0LHhmbikgcmV0IChDQUxMQkFDSyAqZm4jI3hmbikKKyNkZWZpbmUgUFVSRQorI2RlZmluZSBGQVIKKyNkZWZpbmUgVEhJU18gVEhJUywKKworI2RlZmluZSBESVJFQ1RJTlBVVF9WRVJTSU9OCTB4MDUwMAorCisvKiBDbGFzc2VzICovCitERUZJTkVfR1VJRChDTFNJRF9EaXJlY3RJbnB1dCwJCTB4MjVFNjA5RTAsMHhCMjU5LDB4MTFDRiwweEJGLDB4QzcsMHg0NCwweDQ1LDB4NTMsMHg1NCwweDAwLDB4MDApOworREVGSU5FX0dVSUQoQ0xTSURfRGlyZWN0SW5wdXREZXZpY2UsCTB4MjVFNjA5RTEsMHhCMjU5LDB4MTFDRiwweEJGLDB4QzcsMHg0NCwweDQ1LDB4NTMsMHg1NCwweDAwLDB4MDApOworCisvKiBJbnRlcmZhY2VzICovCitERUZJTkVfR1VJRChJSURfSURpcmVjdElucHV0QSwJCTB4ODk1MjEzNjAsMHhBQThBLDB4MTFDRiwweEJGLDB4QzcsMHg0NCwweDQ1LDB4NTMsMHg1NCwweDAwLDB4MDApOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3RJbnB1dFcsCQkweDg5NTIxMzYxLDB4QUE4QSwweDExQ0YsMHhCRiwweEM3LDB4NDQsMHg0NSwweDUzLDB4NTQsMHgwMCwweDAwKTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0SW5wdXQyQSwJCTB4NTk0NEU2NjIsMHhBQThBLDB4MTFDRiwweEJGLDB4QzcsMHg0NCwweDQ1LDB4NTMsMHg1NCwweDAwLDB4MDApOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3RJbnB1dDJXLAkJMHg1OTQ0RTY2MywweEFBOEEsMHgxMUNGLDB4QkYsMHhDNywweDQ0LDB4NDUsMHg1MywweDU0LDB4MDAsMHgwMCk7CitERUZJTkVfR1VJRChJSURfSURpcmVjdElucHV0RGV2aWNlQSwJMHg1OTQ0RTY4MCwweEM5MkUsMHgxMUNGLDB4QkYsMHhDNywweDQ0LDB4NDUsMHg1MywweDU0LDB4MDAsMHgwMCk7CitERUZJTkVfR1VJRChJSURfSURpcmVjdElucHV0RGV2aWNlVywJMHg1OTQ0RTY4MSwweEM5MkUsMHgxMUNGLDB4QkYsMHhDNywweDQ0LDB4NDUsMHg1MywweDU0LDB4MDAsMHgwMCk7CitERUZJTkVfR1VJRChJSURfSURpcmVjdElucHV0RGV2aWNlMkEsCTB4NTk0NEU2ODIsMHhDOTJFLDB4MTFDRiwweEJGLDB4QzcsMHg0NCwweDQ1LDB4NTMsMHg1NCwweDAwLDB4MDApOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3RJbnB1dERldmljZTJXLAkweDU5NDRFNjgzLDB4QzkyRSwweDExQ0YsMHhCRiwweEM3LDB4NDQsMHg0NSwweDUzLDB4NTQsMHgwMCwweDAwKTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0SW5wdXRFZmZlY3QsCTB4RTdFMUY3QzAsMHg4OEQyLDB4MTFEMCwweDlBLDB4RDAsMHgwMCwweEEwLDB4QzksMHhBMCwweDZFLDB4MzUpOworCisvKiBQcmVkZWZpbmVkIG9iamVjdCB0eXBlcyAqLworREVGSU5FX0dVSUQoR1VJRF9YQXhpcywJMHhBMzZEMDJFMCwweEM5RjMsMHgxMUNGLDB4QkYsMHhDNywweDQ0LDB4NDUsMHg1MywweDU0LDB4MDAsMHgwMCk7CitERUZJTkVfR1VJRChHVUlEX1lBeGlzLAkweEEzNkQwMkUxLDB4QzlGMywweDExQ0YsMHhCRiwweEM3LDB4NDQsMHg0NSwweDUzLDB4NTQsMHgwMCwweDAwKTsKK0RFRklORV9HVUlEKEdVSURfWkF4aXMsCTB4QTM2RDAyRTIsMHhDOUYzLDB4MTFDRiwweEJGLDB4QzcsMHg0NCwweDQ1LDB4NTMsMHg1NCwweDAwLDB4MDApOworREVGSU5FX0dVSUQoR1VJRF9SeEF4aXMsMHhBMzZEMDJGNCwweEM5RjMsMHgxMUNGLDB4QkYsMHhDNywweDQ0LDB4NDUsMHg1MywweDU0LDB4MDAsMHgwMCk7CitERUZJTkVfR1VJRChHVUlEX1J5QXhpcywweEEzNkQwMkY1LDB4QzlGMywweDExQ0YsMHhCRiwweEM3LDB4NDQsMHg0NSwweDUzLDB4NTQsMHgwMCwweDAwKTsKK0RFRklORV9HVUlEKEdVSURfUnpBeGlzLDB4QTM2RDAyRTMsMHhDOUYzLDB4MTFDRiwweEJGLDB4QzcsMHg0NCwweDQ1LDB4NTMsMHg1NCwweDAwLDB4MDApOworREVGSU5FX0dVSUQoR1VJRF9TbGlkZXIsMHhBMzZEMDJFNCwweEM5RjMsMHgxMUNGLDB4QkYsMHhDNywweDQ0LDB4NDUsMHg1MywweDU0LDB4MDAsMHgwMCk7CitERUZJTkVfR1VJRChHVUlEX0J1dHRvbiwweEEzNkQwMkYwLDB4QzlGMywweDExQ0YsMHhCRiwweEM3LDB4NDQsMHg0NSwweDUzLDB4NTQsMHgwMCwweDAwKTsKK0RFRklORV9HVUlEKEdVSURfS2V5LAkweDU1NzI4MjIwLDB4RDMzQywweDExQ0YsMHhCRiwweEM3LDB4NDQsMHg0NSwweDUzLDB4NTQsMHgwMCwweDAwKTsKK0RFRklORV9HVUlEKEdVSURfUE9WLAkweEEzNkQwMkYyLDB4QzlGMywweDExQ0YsMHhCRiwweEM3LDB4NDQsMHg0NSwweDUzLDB4NTQsMHgwMCwweDAwKTsKK0RFRklORV9HVUlEKEdVSURfVW5rbm93biwweEEzNkQwMkYzLDB4QzlGMywweDExQ0YsMHhCRiwweEM3LDB4NDQsMHg0NSwweDUzLDB4NTQsMHgwMCwweDAwKTsKKworLyogUHJlZGVmaW5lZCBwcm9kdWN0IEdVSURzICovCitERUZJTkVfR1VJRChHVUlEX1N5c01vdXNlLAkweDZGMUQyQjYwLDB4RDVBMCwweDExQ0YsMHhCRiwweEM3LDB4NDQsMHg0NSwweDUzLDB4NTQsMHgwMCwweDAwKTsKK0RFRklORV9HVUlEKEdVSURfU3lzS2V5Ym9hcmQsCTB4NkYxRDJCNjEsMHhENUEwLDB4MTFDRiwweEJGLDB4QzcsMHg0NCwweDQ1LDB4NTMsMHg1NCwweDAwLDB4MDApOworREVGSU5FX0dVSUQoR1VJRF9Kb3lzdGljaywJMHg2RjFEMkI3MCwweEQ1QTAsMHgxMUNGLDB4QkYsMHhDNywweDQ0LDB4NDUsMHg1MywweDU0LDB4MDAsMHgwMCk7CisKKy8qIHByZWRlZmluZWQgZm9yY2VmZWVkYmFjayBlZmZlY3RzICovCitERUZJTkVfR1VJRChHVUlEX0NvbnN0YW50Rm9yY2UsCTB4MTM1NDFDMjAsMHg4RTMzLDB4MTFEMCwweDlBLDB4RDAsMHgwMCwweEEwLDB4QzksMHhBMCwweDZFLDB4MzUpOworREVGSU5FX0dVSUQoR1VJRF9SYW1wRm9yY2UsCTB4MTM1NDFDMjEsMHg4RTMzLDB4MTFEMCwweDlBLDB4RDAsMHgwMCwweEEwLDB4QzksMHhBMCwweDZFLDB4MzUpOworREVGSU5FX0dVSUQoR1VJRF9TcXVhcmUsCTB4MTM1NDFDMjIsMHg4RTMzLDB4MTFEMCwweDlBLDB4RDAsMHgwMCwweEEwLDB4QzksMHhBMCwweDZFLDB4MzUpOworREVGSU5FX0dVSUQoR1VJRF9TaW5lLAkJMHgxMzU0MUMyMywweDhFMzMsMHgxMUQwLDB4OUEsMHhEMCwweDAwLDB4QTAsMHhDOSwweEEwLDB4NkUsMHgzNSk7CitERUZJTkVfR1VJRChHVUlEX1RyaWFuZ2xlLAkweDEzNTQxQzI0LDB4OEUzMywweDExRDAsMHg5QSwweEQwLDB4MDAsMHhBMCwweEM5LDB4QTAsMHg2RSwweDM1KTsKK0RFRklORV9HVUlEKEdVSURfU2F3dG9vdGhVcCwJMHgxMzU0MUMyNSwweDhFMzMsMHgxMUQwLDB4OUEsMHhEMCwweDAwLDB4QTAsMHhDOSwweEEwLDB4NkUsMHgzNSk7CitERUZJTkVfR1VJRChHVUlEX1Nhd3Rvb3RoRG93biwJMHgxMzU0MUMyNiwweDhFMzMsMHgxMUQwLDB4OUEsMHhEMCwweDAwLDB4QTAsMHhDOSwweEEwLDB4NkUsMHgzNSk7CitERUZJTkVfR1VJRChHVUlEX1NwcmluZywJMHgxMzU0MUMyNywweDhFMzMsMHgxMUQwLDB4OUEsMHhEMCwweDAwLDB4QTAsMHhDOSwweEEwLDB4NkUsMHgzNSk7CitERUZJTkVfR1VJRChHVUlEX0RhbXBlciwJMHgxMzU0MUMyOCwweDhFMzMsMHgxMUQwLDB4OUEsMHhEMCwweDAwLDB4QTAsMHhDOSwweEEwLDB4NkUsMHgzNSk7CitERUZJTkVfR1VJRChHVUlEX0luZXJ0aWEsCTB4MTM1NDFDMjksMHg4RTMzLDB4MTFEMCwweDlBLDB4RDAsMHgwMCwweEEwLDB4QzksMHhBMCwweDZFLDB4MzUpOworREVGSU5FX0dVSUQoR1VJRF9GcmljdGlvbiwJMHgxMzU0MUMyQSwweDhFMzMsMHgxMUQwLDB4OUEsMHhEMCwweDAwLDB4QTAsMHhDOSwweEEwLDB4NkUsMHgzNSk7CitERUZJTkVfR1VJRChHVUlEX0N1c3RvbUZvcmNlLAkweDEzNTQxQzJCLDB4OEUzMywweDExRDAsMHg5QSwweEQwLDB4MDAsMHhBMCwweEM5LDB4QTAsMHg2RSwweDM1KTsKKwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdElucHV0MzJBIElEaXJlY3RJbnB1dDMyQSwqTFBESVJFQ1RJTlBVVDMyQTsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3RJbnB1dERldmljZTMyQSBJRGlyZWN0SW5wdXREZXZpY2UzMkEsKkxQRElSRUNUSU5QVVRERVZJQ0UzMkE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEV09SRAlkd1NpemU7CisgICAgR1VJRAlndWlkVHlwZTsKKyAgICBEV09SRAlkd09mczsKKyAgICBEV09SRAlkd1R5cGU7CisgICAgRFdPUkQJZHdGbGFnczsKKyAgICBDSEFSCXRzek5hbWVbTUFYX1BBVEhdOworI2lmKERJUkVDVElOUFVUX1ZFUlNJT04gPj0gMHgwNTAwKQorICAgIERXT1JECWR3RkZNYXhGb3JjZTsKKyAgICBEV09SRAlkd0ZGRm9yY2VSZXNvbHV0aW9uOworICAgIFdPUkQJd0NvbGxlY3Rpb25OdW1iZXI7CisgICAgV09SRAl3RGVzaWduYXRvckluZGV4OworICAgIFdPUkQJd1VzYWdlUGFnZTsKKyAgICBXT1JECXdVc2FnZTsKKyAgICBEV09SRAlkd0RpbWVuc2lvbjsKKyAgICBXT1JECXdFeHBvbmVudDsKKyAgICBXT1JECXdSZXNlcnZlZDsKKyNlbmRpZiAvKiBESVJFQ1RJTlBVVF9WRVJTSU9OID49IDB4MDUwMCAqLworfSBESURFVklDRU9CSkVDVElOU1RBTkNFMzJBLCAqTFBESURFVklDRU9CSkVDVElOU1RBTkNFMzJBLCpMUENESURFVklDRU9CSkVDVElOU1RBTkNFMzJBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRFdPUkQJZHdTaXplOworICAgIEdVSUQJZ3VpZFR5cGU7CisgICAgRFdPUkQJZHdPZnM7CisgICAgRFdPUkQJZHdUeXBlOworICAgIERXT1JECWR3RmxhZ3M7CisgICAgV0NIQVIJdHN6TmFtZVtNQVhfUEFUSF07CisjaWYoRElSRUNUSU5QVVRfVkVSU0lPTiA+PSAweDA1MDApCisgICAgRFdPUkQJZHdGRk1heEZvcmNlOworICAgIERXT1JECWR3RkZGb3JjZVJlc29sdXRpb247CisgICAgV09SRAl3Q29sbGVjdGlvbk51bWJlcjsKKyAgICBXT1JECXdEZXNpZ25hdG9ySW5kZXg7CisgICAgV09SRAl3VXNhZ2VQYWdlOworICAgIFdPUkQJd1VzYWdlOworICAgIERXT1JECWR3RGltZW5zaW9uOworICAgIFdPUkQJd0V4cG9uZW50OworICAgIFdPUkQJd1Jlc2VydmVkOworI2VuZGlmIC8qIERJUkVDVElOUFVUX1ZFUlNJT04gPj0gMHgwNTAwICovCit9IERJREVWSUNFT0JKRUNUSU5TVEFOQ0UzMlcsICpMUERJREVWSUNFT0JKRUNUSU5TVEFOQ0UzMlcsKkxQQ0RJREVWSUNFT0JKRUNUSU5TVEFOQ0UzMlc7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERJREVWSUNFT0JKRUNUSU5TVEFOQ0UpOworREVDTF9XSU5FTElCX1RZUEVfQVcoRElERVZJQ0VPQkpFQ1RJTlNUQU5DRSk7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERXT1JECWR3U2l6ZTsKKyAgICBHVUlECWd1aWRJbnN0YW5jZTsKKyAgICBHVUlECWd1aWRQcm9kdWN0OworICAgIERXT1JECWR3RGV2VHlwZTsKKyAgICBDSEFSCXRzekluc3RhbmNlTmFtZVtNQVhfUEFUSF07CisgICAgQ0hBUgl0c3pQcm9kdWN0TmFtZVtNQVhfUEFUSF07CisjaWYoRElSRUNUSU5QVVRfVkVSU0lPTiA+PSAweDA1MDApCisgICAgR1VJRAlndWlkRkZEcml2ZXI7CisgICAgV09SRAl3VXNhZ2VQYWdlOworICAgIFdPUkQJd1VzYWdlOworI2VuZGlmIC8qIERJUkVDVElOUFVUX1ZFUlNJT04gPj0gMHgwNTAwICovCit9IERJREVWSUNFSU5TVEFOQ0UzMkEsICpMUERJREVWSUNFSU5TVEFOQ0UzMkEsICpMUENESURFVklDRUlOU1RBTkNFMzJBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRFdPUkQJZHdTaXplOworICAgIEdVSUQJZ3VpZEluc3RhbmNlOworICAgIEdVSUQJZ3VpZFByb2R1Y3Q7CisgICAgRFdPUkQJZHdEZXZUeXBlOworICAgIFdDSEFSCXRzekluc3RhbmNlTmFtZVtNQVhfUEFUSF07CisgICAgV0NIQVIJdHN6UHJvZHVjdE5hbWVbTUFYX1BBVEhdOworI2lmKERJUkVDVElOUFVUX1ZFUlNJT04gPj0gMHgwNTAwKQorICAgIEdVSUQJZ3VpZEZGRHJpdmVyOworICAgIFdPUkQJd1VzYWdlUGFnZTsKKyAgICBXT1JECXdVc2FnZTsKKyNlbmRpZiAvKiBESVJFQ1RJTlBVVF9WRVJTSU9OID49IDB4MDUwMCAqLworfSBESURFVklDRUlOU1RBTkNFMzJXLCAqTFBESURFVklDRUlOU1RBTkNFMzJXLCAqTFBDRElERVZJQ0VJTlNUQU5DRTMyVzsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKERJREVWSUNFSU5TVEFOQ0UpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBESURFVklDRUlOU1RBTkNFKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQQ0RJREVWSUNFSU5TVEFOQ0UpOworCit0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgKiBMUERJRU5VTURFVklDRVNDQUxMQkFDSzMyQSkoTFBDRElERVZJQ0VJTlNUQU5DRTMyQSxMUFZPSUQpOwordHlwZWRlZiBCT09MMzIgKENBTExCQUNLICogTFBESUVOVU1ERVZJQ0VTQ0FMTEJBQ0szMlcpKExQQ0RJREVWSUNFSU5TVEFOQ0UzMlcsTFBWT0lEKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQRElFTlVNREVWSUNFU0NBTExCQUNLKTsKKwordHlwZWRlZiBCT09MMzIgKENBTExCQUNLICogTFBESUVOVU1ERVZJQ0VPQkpFQ1RTQ0FMTEJBQ0szMkEpKExQQ0RJREVWSUNFT0JKRUNUSU5TVEFOQ0UzMkEsIExQVk9JRCk7Cit0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgKiBMUERJRU5VTURFVklDRU9CSkVDVFNDQUxMQkFDSzMyVykoTFBDRElERVZJQ0VPQkpFQ1RJTlNUQU5DRTMyVyxMUFZPSUQpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBESUVOVU1ERVZJQ0VPQkpFQ1RTQ0FMTEJBQ0spOworCisjZGVmaW5lIERJS19FU0NBUEUgICAgICAgICAgMHgwMQorI2RlZmluZSBESUtfMSAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRElLXzIgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIERJS18zICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBESUtfNCAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgRElLXzUgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIERJS182ICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBESUtfNyAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRElLXzggICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIERJS185ICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBESUtfMCAgICAgICAgICAgICAgIDB4MEIKKyNkZWZpbmUgRElLX01JTlVTICAgICAgICAgICAweDBDICAgIC8qIC0gb24gbWFpbiBrZXlib2FyZCAqLworI2RlZmluZSBESUtfRVFVQUxTICAgICAgICAgIDB4MEQKKyNkZWZpbmUgRElLX0JBQ0sgICAgICAgICAgICAweDBFICAgIC8qIGJhY2tzcGFjZSAqLworI2RlZmluZSBESUtfVEFCICAgICAgICAgICAgIDB4MEYKKyNkZWZpbmUgRElLX1EgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIERJS19XICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBESUtfRSAgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgRElLX1IgICAgICAgICAgICAgICAweDEzCisjZGVmaW5lIERJS19UICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBESUtfWSAgICAgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgRElLX1UgICAgICAgICAgICAgICAweDE2CisjZGVmaW5lIERJS19JICAgICAgICAgICAgICAgMHgxNworI2RlZmluZSBESUtfTyAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgRElLX1AgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lIERJS19MQlJBQ0tFVCAgICAgICAgMHgxQQorI2RlZmluZSBESUtfUkJSQUNLRVQgICAgICAgIDB4MUIKKyNkZWZpbmUgRElLX1JFVFVSTiAgICAgICAgICAweDFDICAgIC8qIEVudGVyIG9uIG1haW4ga2V5Ym9hcmQgKi8KKyNkZWZpbmUgRElLX0xDT05UUk9MICAgICAgICAweDFECisjZGVmaW5lIERJS19BICAgICAgICAgICAgICAgMHgxRQorI2RlZmluZSBESUtfUyAgICAgICAgICAgICAgIDB4MUYKKyNkZWZpbmUgRElLX0QgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIERJS19GICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBESUtfRyAgICAgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgRElLX0ggICAgICAgICAgICAgICAweDIzCisjZGVmaW5lIERJS19KICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBESUtfSyAgICAgICAgICAgICAgIDB4MjUKKyNkZWZpbmUgRElLX0wgICAgICAgICAgICAgICAweDI2CisjZGVmaW5lIERJS19TRU1JQ09MT04gICAgICAgMHgyNworI2RlZmluZSBESUtfQVBPU1RST1BIRSAgICAgIDB4MjgKKyNkZWZpbmUgRElLX0dSQVZFICAgICAgICAgICAweDI5ICAgIC8qIGFjY2VudCBncmF2ZSAqLworI2RlZmluZSBESUtfTFNISUZUICAgICAgICAgIDB4MkEKKyNkZWZpbmUgRElLX0JBQ0tTTEFTSCAgICAgICAweDJCCisjZGVmaW5lIERJS19aICAgICAgICAgICAgICAgMHgyQworI2RlZmluZSBESUtfWCAgICAgICAgICAgICAgIDB4MkQKKyNkZWZpbmUgRElLX0MgICAgICAgICAgICAgICAweDJFCisjZGVmaW5lIERJS19WICAgICAgICAgICAgICAgMHgyRgorI2RlZmluZSBESUtfQiAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgRElLX04gICAgICAgICAgICAgICAweDMxCisjZGVmaW5lIERJS19NICAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBESUtfQ09NTUEgICAgICAgICAgIDB4MzMKKyNkZWZpbmUgRElLX1BFUklPRCAgICAgICAgICAweDM0ICAgIC8qIC4gb24gbWFpbiBrZXlib2FyZCAqLworI2RlZmluZSBESUtfU0xBU0ggICAgICAgICAgIDB4MzUgICAgLyogLyBvbiBtYWluIGtleWJvYXJkICovCisjZGVmaW5lIERJS19SU0hJRlQgICAgICAgICAgMHgzNgorI2RlZmluZSBESUtfTVVMVElQTFkgICAgICAgIDB4MzcgICAgLyogKiBvbiBudW1lcmljIGtleXBhZCAqLworI2RlZmluZSBESUtfTE1FTlUgICAgICAgICAgIDB4MzggICAgLyogbGVmdCBBbHQgKi8KKyNkZWZpbmUgRElLX1NQQUNFICAgICAgICAgICAweDM5CisjZGVmaW5lIERJS19DQVBJVEFMICAgICAgICAgMHgzQQorI2RlZmluZSBESUtfRjEgICAgICAgICAgICAgIDB4M0IKKyNkZWZpbmUgRElLX0YyICAgICAgICAgICAgICAweDNDCisjZGVmaW5lIERJS19GMyAgICAgICAgICAgICAgMHgzRAorI2RlZmluZSBESUtfRjQgICAgICAgICAgICAgIDB4M0UKKyNkZWZpbmUgRElLX0Y1ICAgICAgICAgICAgICAweDNGCisjZGVmaW5lIERJS19GNiAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBESUtfRjcgICAgICAgICAgICAgIDB4NDEKKyNkZWZpbmUgRElLX0Y4ICAgICAgICAgICAgICAweDQyCisjZGVmaW5lIERJS19GOSAgICAgICAgICAgICAgMHg0MworI2RlZmluZSBESUtfRjEwICAgICAgICAgICAgIDB4NDQKKyNkZWZpbmUgRElLX05VTUxPQ0sgICAgICAgICAweDQ1CisjZGVmaW5lIERJS19TQ1JPTEwgICAgICAgICAgMHg0NiAgICAvKiBTY3JvbGwgTG9jayAqLworI2RlZmluZSBESUtfTlVNUEFENyAgICAgICAgIDB4NDcKKyNkZWZpbmUgRElLX05VTVBBRDggICAgICAgICAweDQ4CisjZGVmaW5lIERJS19OVU1QQUQ5ICAgICAgICAgMHg0OQorI2RlZmluZSBESUtfU1VCVFJBQ1QgICAgICAgIDB4NEEgICAgLyogLSBvbiBudW1lcmljIGtleXBhZCAqLworI2RlZmluZSBESUtfTlVNUEFENCAgICAgICAgIDB4NEIKKyNkZWZpbmUgRElLX05VTVBBRDUgICAgICAgICAweDRDCisjZGVmaW5lIERJS19OVU1QQUQ2ICAgICAgICAgMHg0RAorI2RlZmluZSBESUtfQUREICAgICAgICAgICAgIDB4NEUgICAgLyogKyBvbiBudW1lcmljIGtleXBhZCAqLworI2RlZmluZSBESUtfTlVNUEFEMSAgICAgICAgIDB4NEYKKyNkZWZpbmUgRElLX05VTVBBRDIgICAgICAgICAweDUwCisjZGVmaW5lIERJS19OVU1QQUQzICAgICAgICAgMHg1MQorI2RlZmluZSBESUtfTlVNUEFEMCAgICAgICAgIDB4NTIKKyNkZWZpbmUgRElLX0RFQ0lNQUwgICAgICAgICAweDUzICAgIC8qIC4gb24gbnVtZXJpYyBrZXlwYWQgKi8KKyNkZWZpbmUgRElLX0YxMSAgICAgICAgICAgICAweDU3CisjZGVmaW5lIERJS19GMTIgICAgICAgICAgICAgMHg1OAorI2RlZmluZSBESUtfRjEzICAgICAgICAgICAgIDB4NjQgICAgLyogICAgICAgICAgICAgICAgICAgICAoTkVDIFBDOTgpICovCisjZGVmaW5lIERJS19GMTQgICAgICAgICAgICAgMHg2NSAgICAvKiAgICAgICAgICAgICAgICAgICAgIChORUMgUEM5OCkgKi8KKyNkZWZpbmUgRElLX0YxNSAgICAgICAgICAgICAweDY2ICAgIC8qICAgICAgICAgICAgICAgICAgICAgKE5FQyBQQzk4KSAqLworI2RlZmluZSBESUtfS0FOQSAgICAgICAgICAgIDB4NzAgICAgLyogKEphcGFuZXNlIGtleWJvYXJkKSAgICAgICAgICAgICovCisjZGVmaW5lIERJS19DT05WRVJUICAgICAgICAgMHg3OSAgICAvKiAoSmFwYW5lc2Uga2V5Ym9hcmQpICAgICAgICAgICAgKi8KKyNkZWZpbmUgRElLX05PQ09OVkVSVCAgICAgICAweDdCICAgIC8qIChKYXBhbmVzZSBrZXlib2FyZCkgICAgICAgICAgICAqLworI2RlZmluZSBESUtfWUVOICAgICAgICAgICAgIDB4N0QgICAgLyogKEphcGFuZXNlIGtleWJvYXJkKSAgICAgICAgICAgICovCisjZGVmaW5lIERJS19OVU1QQURFUVVBTFMgICAgMHg4RCAgICAvKiA9IG9uIG51bWVyaWMga2V5cGFkIChORUMgUEM5OCkgKi8KKyNkZWZpbmUgRElLX0NJUkNVTUZMRVggICAgICAweDkwICAgIC8qIChKYXBhbmVzZSBrZXlib2FyZCkgICAgICAgICAgICAqLworI2RlZmluZSBESUtfQVQgICAgICAgICAgICAgIDB4OTEgICAgLyogICAgICAgICAgICAgICAgICAgICAoTkVDIFBDOTgpICovCisjZGVmaW5lIERJS19DT0xPTiAgICAgICAgICAgMHg5MiAgICAvKiAgICAgICAgICAgICAgICAgICAgIChORUMgUEM5OCkgKi8KKyNkZWZpbmUgRElLX1VOREVSTElORSAgICAgICAweDkzICAgIC8qICAgICAgICAgICAgICAgICAgICAgKE5FQyBQQzk4KSAqLworI2RlZmluZSBESUtfS0FOSkkgICAgICAgICAgIDB4OTQgICAgLyogKEphcGFuZXNlIGtleWJvYXJkKSAgICAgICAgICAgICovCisjZGVmaW5lIERJS19TVE9QICAgICAgICAgICAgMHg5NSAgICAvKiAgICAgICAgICAgICAgICAgICAgIChORUMgUEM5OCkgKi8KKyNkZWZpbmUgRElLX0FYICAgICAgICAgICAgICAweDk2ICAgIC8qICAgICAgICAgICAgICAgICAgICAgKEphcGFuIEFYKSAqLworI2RlZmluZSBESUtfVU5MQUJFTEVEICAgICAgIDB4OTcgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAoSjMxMDApICovCisjZGVmaW5lIERJS19OVU1QQURFTlRFUiAgICAgMHg5QyAgICAvKiBFbnRlciBvbiBudW1lcmljIGtleXBhZCAqLworI2RlZmluZSBESUtfUkNPTlRST0wgICAgICAgIDB4OUQKKyNkZWZpbmUgRElLX05VTVBBRENPTU1BICAgICAweEIzICAgIC8qICwgb24gbnVtZXJpYyBrZXlwYWQgKE5FQyBQQzk4KSAqLworI2RlZmluZSBESUtfRElWSURFICAgICAgICAgIDB4QjUgICAgLyogLyBvbiBudW1lcmljIGtleXBhZCAqLworI2RlZmluZSBESUtfU1lTUlEgICAgICAgICAgIDB4QjcKKyNkZWZpbmUgRElLX1JNRU5VICAgICAgICAgICAweEI4ICAgIC8qIHJpZ2h0IEFsdCAqLworI2RlZmluZSBESUtfUEFVU0UgICAgICAgICAgIDB4QzUgICAgLyogUGF1c2UgKi8KKyNkZWZpbmUgRElLX0hPTUUgICAgICAgICAgICAweEM3ICAgIC8qIEhvbWUgb24gYXJyb3cga2V5cGFkICovCisjZGVmaW5lIERJS19VUCAgICAgICAgICAgICAgMHhDOCAgICAvKiBVcEFycm93IG9uIGFycm93IGtleXBhZCAqLworI2RlZmluZSBESUtfUFJJT1IgICAgICAgICAgIDB4QzkgICAgLyogUGdVcCBvbiBhcnJvdyBrZXlwYWQgKi8KKyNkZWZpbmUgRElLX0xFRlQgICAgICAgICAgICAweENCICAgIC8qIExlZnRBcnJvdyBvbiBhcnJvdyBrZXlwYWQgKi8KKyNkZWZpbmUgRElLX1JJR0hUICAgICAgICAgICAweENEICAgIC8qIFJpZ2h0QXJyb3cgb24gYXJyb3cga2V5cGFkICovCisjZGVmaW5lIERJS19FTkQgICAgICAgICAgICAgMHhDRiAgICAvKiBFbmQgb24gYXJyb3cga2V5cGFkICovCisjZGVmaW5lIERJS19ET1dOICAgICAgICAgICAgMHhEMCAgICAvKiBEb3duQXJyb3cgb24gYXJyb3cga2V5cGFkICovCisjZGVmaW5lIERJS19ORVhUICAgICAgICAgICAgMHhEMSAgICAvKiBQZ0RuIG9uIGFycm93IGtleXBhZCAqLworI2RlZmluZSBESUtfSU5TRVJUICAgICAgICAgIDB4RDIgICAgLyogSW5zZXJ0IG9uIGFycm93IGtleXBhZCAqLworI2RlZmluZSBESUtfREVMRVRFICAgICAgICAgIDB4RDMgICAgLyogRGVsZXRlIG9uIGFycm93IGtleXBhZCAqLworI2RlZmluZSBESUtfTFdJTiAgICAgICAgICAgIDB4REIgICAgLyogTGVmdCBXaW5kb3dzIGtleSAqLworI2RlZmluZSBESUtfUldJTiAgICAgICAgICAgIDB4REMgICAgLyogUmlnaHQgV2luZG93cyBrZXkgKi8KKyNkZWZpbmUgRElLX0FQUFMgICAgICAgICAgICAweEREICAgIC8qIEFwcE1lbnUga2V5ICovCisjZGVmaW5lIERJS19QT1dFUiAgICAgICAgICAgMHhERQorI2RlZmluZSBESUtfU0xFRVAgICAgICAgICAgIDB4REYKKyNkZWZpbmUgRElLX0JBQ0tTUEFDRSAgICAgICBESUtfQkFDSyAgICAgICAgICAgIC8qIGJhY2tzcGFjZSAqLworI2RlZmluZSBESUtfTlVNUEFEU1RBUiAgICAgIERJS19NVUxUSVBMWSAgICAgICAgLyogKiBvbiBudW1lcmljIGtleXBhZCAqLworI2RlZmluZSBESUtfTEFMVCAgICAgICAgICAgIERJS19MTUVOVSAgICAgICAgICAgLyogbGVmdCBBbHQgKi8KKyNkZWZpbmUgRElLX0NBUFNMT0NLICAgICAgICBESUtfQ0FQSVRBTCAgICAgICAgIC8qIENhcHNMb2NrICovCisjZGVmaW5lIERJS19OVU1QQURNSU5VUyAgICAgRElLX1NVQlRSQUNUICAgICAgICAvKiAtIG9uIG51bWVyaWMga2V5cGFkICovCisjZGVmaW5lIERJS19OVU1QQURQTFVTICAgICAgRElLX0FERCAgICAgICAgICAgICAvKiArIG9uIG51bWVyaWMga2V5cGFkICovCisjZGVmaW5lIERJS19OVU1QQURQRVJJT0QgICAgRElLX0RFQ0lNQUwgICAgICAgICAvKiAuIG9uIG51bWVyaWMga2V5cGFkICovCisjZGVmaW5lIERJS19OVU1QQURTTEFTSCAgICAgRElLX0RJVklERSAgICAgICAgICAvKiAvIG9uIG51bWVyaWMga2V5cGFkICovCisjZGVmaW5lIERJS19SQUxUICAgICAgICAgICAgRElLX1JNRU5VICAgICAgICAgICAvKiByaWdodCBBbHQgKi8KKyNkZWZpbmUgRElLX1VQQVJST1cgICAgICAgICBESUtfVVAgICAgICAgICAgICAgIC8qIFVwQXJyb3cgb24gYXJyb3cga2V5cGFkICovCisjZGVmaW5lIERJS19QR1VQICAgICAgICAgICAgRElLX1BSSU9SICAgICAgICAgICAvKiBQZ1VwIG9uIGFycm93IGtleXBhZCAqLworI2RlZmluZSBESUtfTEVGVEFSUk9XICAgICAgIERJS19MRUZUICAgICAgICAgICAgLyogTGVmdEFycm93IG9uIGFycm93IGtleXBhZCAqLworI2RlZmluZSBESUtfUklHSFRBUlJPVyAgICAgIERJS19SSUdIVCAgICAgICAgICAgLyogUmlnaHRBcnJvdyBvbiBhcnJvdyBrZXlwYWQgKi8KKyNkZWZpbmUgRElLX0RPV05BUlJPVyAgICAgICBESUtfRE9XTiAgICAgICAgICAgIC8qIERvd25BcnJvdyBvbiBhcnJvdyBrZXlwYWQgKi8KKyNkZWZpbmUgRElLX1BHRE4gICAgICAgICAgICBESUtfTkVYVCAgICAgICAgICAgIC8qIFBnRG4gb24gYXJyb3cga2V5cGFkICovCisKKyNkZWZpbmUgRElERlRfQUxMCQkweDAwMDAwMDAwCisjZGVmaW5lIERJREZUX1JFTEFYSVMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRElERlRfQUJTQVhJUwkJMHgwMDAwMDAwMgorI2RlZmluZSBESURGVF9BWElTCQkweDAwMDAwMDAzCisjZGVmaW5lIERJREZUX1BTSEJVVFRPTgkJMHgwMDAwMDAwNAorI2RlZmluZSBESURGVF9UR0xCVVRUT04JCTB4MDAwMDAwMDgKKyNkZWZpbmUgRElERlRfQlVUVE9OCQkweDAwMDAwMDBDCisjZGVmaW5lIERJREZUX1BPVgkJMHgwMDAwMDAxMAorI2RlZmluZSBESURGVF9DT0xMRUNUSU9OCTB4MDAwMDAwNDAKKyNkZWZpbmUgRElERlRfTk9EQVRBCQkweDAwMDAwMDgwCisjZGVmaW5lIERJREZUX0FOWUlOU1RBTkNFCTB4MDBGRkZGMDAKKyNkZWZpbmUgRElERlRfSU5TVEFOQ0VNQVNLCURJREZUX0FOWUlOU1RBTkNFCisjZGVmaW5lIERJREZUX01BS0VJTlNUQU5DRShuKQkoKFdPUkQpKG4pIDw8IDgpCisjZGVmaW5lIERJREZUX0dFVFRZUEUobikJTE9CWVRFKG4pCisjZGVmaW5lIERJREZUX0dFVElOU1RBTkNFKG4pCUxPV09SRCgobikgPj4gOCkKKyNkZWZpbmUgRElERlRfRkZBQ1RVQVRPUgkweDAxMDAwMDAwCisjZGVmaW5lIERJREZUX0ZGRUZGRUNUVFJJR0dFUgkweDAyMDAwMDAwCisjZGVmaW5lIERJREZUX09VVFBVVAkJMHgxMDAwMDAwMAorI2RlZmluZSBESURGVF9FTlVNQ09MTEVDVElPTihuKQkoKFdPUkQpKG4pIDw8IDgpCisjZGVmaW5lIERJREZUX05PQ09MTEVDVElPTgkweDAwRkZGRjAwCisjZGVmaW5lIERJREZfQUJTQVhJUwkJMHgwMDAwMDAwMQorI2RlZmluZSBESURGX1JFTEFYSVMJCTB4MDAwMDAwMDIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERXT1JECWR3T2ZzOworICAgIERXT1JECWR3RGF0YTsKKyAgICBEV09SRAlkd1RpbWVTdGFtcDsKKyAgICBEV09SRAlkd1NlcXVlbmNlOworfSBESURFVklDRU9CSkVDVERBVEEsKkxQRElERVZJQ0VPQkpFQ1REQVRBLCpMUENESURFVklDRU9CSkVDVERBVEE7CisKK3R5cGVkZWYgc3RydWN0IF9ESU9CSkVDVERBVEFGT1JNQVQgeworICAgIGNvbnN0IEdVSUQgKnBndWlkOworICAgIERXT1JECWR3T2ZzOworICAgIERXT1JECWR3VHlwZTsKKyAgICBEV09SRAlkd0ZsYWdzOworfSBESU9CSkVDVERBVEFGT1JNQVQsICpMUERJT0JKRUNUREFUQUZPUk1BVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERXT1JECQkJZHdTaXplOworICAgIERXT1JECQkJZHdPYmpTaXplOworICAgIERXT1JECQkJZHdGbGFnczsKKyAgICBEV09SRAkJCWR3RGF0YVNpemU7CisgICAgRFdPUkQJCQlkd051bU9ianM7CisgICAgTFBESU9CSkVDVERBVEFGT1JNQVQJcmdvZGY7Cit9IERJREFUQUZPUk1BVCwgKkxQRElEQVRBRk9STUFULCpMUENESURBVEFGT1JNQVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEV09SRAlkd1NpemU7CisgICAgRFdPUkQJZHdIZWFkZXJTaXplOworICAgIERXT1JECWR3T2JqOworICAgIERXT1JECWR3SG93OworfSBESVBST1BIRUFERVIsKkxQRElQUk9QSEVBREVSLCpMUENESVBST1BIRUFERVI7CisKKyNkZWZpbmUgRElQSF9ERVZJQ0UJMAorI2RlZmluZSBESVBIX0JZT0ZGU0VUCTEKKyNkZWZpbmUgRElQSF9CWUlECTIKKyNkZWZpbmUgRElQSF9CWVVTQUdFCTMKKwordHlwZWRlZiBzdHJ1Y3QgRElERVZDQVBTIHsKKyAgICBEV09SRAlkd1NpemU7CisgICAgRFdPUkQJZHdGbGFnczsKKyAgICBEV09SRAlkd0RldlR5cGU7CisgICAgRFdPUkQJZHdBeGVzOworICAgIERXT1JECWR3QnV0dG9uczsKKyAgICBEV09SRAlkd1BPVnM7CisjaWYoRElSRUNUSU5QVVRfVkVSU0lPTiA+PSAweDA1MDApCisgICAgRFdPUkQJZHdGRlNhbXBsZVBlcmlvZDsKKyAgICBEV09SRAlkd0ZGTWluVGltZVJlc29sdXRpb247CisgICAgRFdPUkQJZHdGaXJtd2FyZVJldmlzaW9uOworICAgIERXT1JECWR3SGFyZHdhcmVSZXZpc2lvbjsKKyAgICBEV09SRAlkd0ZGRHJpdmVyVmVyc2lvbjsKKyNlbmRpZiAvKiBESVJFQ1RJTlBVVF9WRVJTSU9OID49IDB4MDUwMCAqLworfSBESURFVkNBUFMsKkxQRElERVZDQVBTOworCisjZGVmaW5lIERJRENfQVRUQUNIRUQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRElEQ19QT0xMRURERVZJQ0UJMHgwMDAwMDAwMgorI2RlZmluZSBESURDX0VNVUxBVEVECQkweDAwMDAwMDA0CisjZGVmaW5lIERJRENfUE9MTEVEREFUQUZPUk1BVAkweDAwMDAwMDA4CisjZGVmaW5lIERJRENfRk9SQ0VGRUVEQkFDSwkweDAwMDAwMTAwCisjZGVmaW5lIERJRENfRkZBVFRBQ0sJCTB4MDAwMDAyMDAKKyNkZWZpbmUgRElEQ19GRkZBREUJCTB4MDAwMDA0MDAKKyNkZWZpbmUgRElEQ19TQVRVUkFUSU9OCQkweDAwMDAwODAwCisjZGVmaW5lIERJRENfUE9TTkVHQ09FRkZJQ0lFTlRTCTB4MDAwMDEwMDAKKyNkZWZpbmUgRElEQ19QT1NORUdTQVRVUkFUSU9OCTB4MDAwMDIwMDAKKyNkZWZpbmUgRElEQ19ERUFEQkFORAkJMHgwMDAwNDAwMAorCisvKiBTZXRDb29wZXJhdGl2ZUxldmVsIGR3RmxhZ3MgKi8KKyNkZWZpbmUgRElTQ0xfRVhDTFVTSVZFCQkweDAwMDAwMDAxCisjZGVmaW5lIERJU0NMX05PTkVYQ0xVU0lWRQkweDAwMDAwMDAyCisjZGVmaW5lIERJU0NMX0ZPUkVHUk9VTkQJMHgwMDAwMDAwNAorI2RlZmluZSBESVNDTF9CQUNLR1JPVU5ECTB4MDAwMDAwMDgKKworI2RlZmluZSBUSElTIExQRElSRUNUSU5QVVRERVZJQ0UzMkEgdGhpcwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdElucHV0RGV2aWNlQV9WVGFibGUgeworICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsKKworICAgIC8qKiogSURpcmVjdElucHV0RGV2aWNlQSBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoR2V0Q2FwYWJpbGl0aWVzKShUSElTXyBMUERJREVWQ0FQUykgUFVSRTsKKyAgICBTVERNRVRIT0QoRW51bU9iamVjdHMpKFRISVNfIExQRElFTlVNREVWSUNFT0JKRUNUU0NBTExCQUNLMzJBLExQVk9JRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0UHJvcGVydHkpKFRISVNfIFJFRkdVSUQsTFBESVBST1BIRUFERVIpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldFByb3BlcnR5KShUSElTXyBSRUZHVUlELExQQ0RJUFJPUEhFQURFUikgUFVSRTsKKyAgICBTVERNRVRIT0QoQWNxdWlyZSkoVEhJUykgUFVSRTsKKyAgICBTVERNRVRIT0QoVW5hY3F1aXJlKShUSElTKSBQVVJFOworICAgIFNURE1FVEhPRChHZXREZXZpY2VTdGF0ZSkoVEhJU18gRFdPUkQsTFBWT0lEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXREZXZpY2VEYXRhKShUSElTXyBEV09SRCxMUERJREVWSUNFT0JKRUNUREFUQSxMUERXT1JELERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChTZXREYXRhRm9ybWF0KShUSElTXyBMUENESURBVEFGT1JNQVQpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldEV2ZW50Tm90aWZpY2F0aW9uKShUSElTXyBIQU5ETEUzMikgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0Q29vcGVyYXRpdmVMZXZlbCkoVEhJU18gSFdORDMyLERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRPYmplY3RJbmZvKShUSElTXyBMUERJREVWSUNFT0JKRUNUSU5TVEFOQ0UzMkEsRFdPUkQsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldERldmljZUluZm8pKFRISVNfIExQRElERVZJQ0VJTlNUQU5DRTMyQSkgUFVSRTsKKyAgICBTVERNRVRIT0QoUnVuQ29udHJvbFBhbmVsKShUSElTXyBIV05EMzIsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIEhJTlNUQU5DRTMyLERXT1JELFJFRkdVSUQpIFBVUkU7Cit9IElEaXJlY3RJbnB1dERldmljZUFfVlRhYmxlLCpMUERJUkVDVElOUFVUREVWSUNFQV9WVEFCTEU7CisKK3N0cnVjdCBJRGlyZWN0SW5wdXREZXZpY2UzMkEgeworCUxQRElSRUNUSU5QVVRERVZJQ0VBX1ZUQUJMRQlscHZ0Ymw7CisJRFdPUkQJCQkJcmVmOworCUdVSUQJCQkJZ3VpZDsKK307CisjdW5kZWYgVEhJUworCisjZGVmaW5lIFRISVMgTFBESVJFQ1RJTlBVVDMyQSB0aGlzCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0SW5wdXRBX1ZUYWJsZSB7CisJLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKwlTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpKFRISVMpIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOworCisJLyoqKiBJRGlyZWN0SW5wdXRBIG1ldGhvZHMgKioqLworCVNURE1FVEhPRChDcmVhdGVEZXZpY2UpKFRISVNfIFJFRkdVSUQsTFBESVJFQ1RJTlBVVERFVklDRTMyQSosTFBVTktOT1dOKSBQVVJFOworCVNURE1FVEhPRChFbnVtRGV2aWNlcykoVEhJU18gRFdPUkQsTFBESUVOVU1ERVZJQ0VTQ0FMTEJBQ0szMkEsTFBWT0lELERXT1JEKSBQVVJFOworCVNURE1FVEhPRChHZXREZXZpY2VTdGF0dXMpKFRISVNfIFJFRkdVSUQpIFBVUkU7CisJU1RETUVUSE9EKFJ1bkNvbnRyb2xQYW5lbCkoVEhJU18gSFdORDMyLERXT1JEKSBQVVJFOworCVNURE1FVEhPRChJbml0aWFsaXplKShUSElTXyBISU5TVEFOQ0UzMixEV09SRCkgUFVSRTsKK30gSURpcmVjdElucHV0QV9WVGFibGUsKkxQRElSRUNUSU5QVVRBX1ZUQUJMRTsKKworc3RydWN0IElEaXJlY3RJbnB1dDMyQSB7CisJTFBESVJFQ1RJTlBVVEFfVlRBQkxFCWxwdnRibDsKKwlEV09SRAkJCXJlZjsKK307CisjdW5kZWYgVEhJUworI3VuZGVmIFRISVNfCisjdW5kZWYgU1RETUVUSE9EKHhmbikgSFJFU1VMVCAoQ0FMTEJBQ0sgKmZuIyN4Zm4pCisjdW5kZWYgU1RETUVUSE9EXyhyZXQseGZuKSByZXQgKENBTExCQUNLICpmbiMjeGZuKQorI3VuZGVmIFBVUkUKKyN1bmRlZiBGQVIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcml2ZS5oIGIvaW5jbHVkZS9kcml2ZS5oCmluZGV4IDM1MjBhMWIuLjU4NDllM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJpdmUuaAorKysgYi9pbmNsdWRlL2RyaXZlLmgKQEAgLTQ0LDUgKzQ0LDYgQEAKIGV4dGVybiBpbnQgRFJJVkVfRGlzYWJsZSggaW50IGRyaXZlICApOwogZXh0ZXJuIGludCBEUklWRV9FbmFibGUoIGludCBkcml2ZSAgKTsKIGV4dGVybiBpbnQgRFJJVkVfU2V0TG9naWNhbE1hcHBpbmcgKCBpbnQgZXhpc3RpbmdfZHJpdmUsIGludCBuZXdfZHJpdmUgKTsKK2V4dGVybiBpbnQgRFJJVkVfT3BlbkRldmljZSggaW50IGRyaXZlLCBpbnQgZmxhZ3MgKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfRFJJVkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kc291bmQuaCBiL2luY2x1ZGUvZHNvdW5kLmgKaW5kZXggZjRkNjgwMS4uMDEzZjAzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kc291bmQuaAorKysgYi9pbmNsdWRlL2Rzb3VuZC5oCkBAIC0zLDIwICszLDI3IEBACiAKICNpbmNsdWRlICJtbXN5c3RlbS5oIgogCi0vKiBEaXJlY3QgU291bmQgQ29tcG9uZW50IEdVSUQgICAgezQ3RDREOTQ2LTYyRTgtMTFjZi05M0JDLTQ0NDU1MzU0MDAwMH0gKi8KLURFRklORV9HVUlEKENMU0lEX0RpcmVjdFNvdW5kLDB4NDdkNGQ5NDYsIDB4NjJlOCwgMHgxMWNmLCAweDkzLCAweGJjLCAweDQ0LCAweDQ1LCAweDUzLCAweDU0LCAweDAsIDB4MCk7CitERUZJTkVfR1VJRChDTFNJRF9EaXJlY3RTb3VuZCwJCTB4NDdkNGQ5NDYsIDB4NjJlOCwgMHgxMWNmLCAweDkzLCAweGJjLCAweDQ0LCAweDQ1LCAweDUzLCAweDU0LCAweDAsIDB4MCk7CiAKLS8qIERpcmVjdFNvdW5kIDI3OWFmYTgzLTQ5ODEtMTFjZS1hNTIxLTAwMjBhZjBiZTU2MCAqLwotREVGSU5FX0dVSUQoSUlEX0lEaXJlY3RTb3VuZCwweDI3OUFGQTgzLDB4NDk4MSwweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwKTsKLS8qIERpcmVjdFNvdW5kQnVmZmVyIDI3OWFmYTg1LTQ5ODEtMTFjZS1hNTIxLTAwMjBhZjBiZTU2MCAqLwotREVGSU5FX0dVSUQoSUlEX0lEaXJlY3RTb3VuZEJ1ZmZlciwweDI3OUFGQTg1LDB4NDk4MSwweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwKTsgCitERUZJTkVfR1VJRChJSURfSURpcmVjdFNvdW5kLAkJMHgyNzlBRkE4MywweDQ5ODEsMHgxMUNFLDB4QTUsMHgyMSwweDAwLDB4MjAsMHhBRiwweDBCLDB4RTUsMHg2MCk7CitERUZJTkVfR1VJRChJSURfSURpcmVjdFNvdW5kQnVmZmVyLAkweDI3OUFGQTg1LDB4NDk4MSwweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwKTsgCitERUZJTkVfR1VJRChJSURfSURpcmVjdFNvdW5kTm90aWZ5LAkweEIwMjEwNzgzLDB4ODljZCwweDExZDAsMHhBRiwweDA4LDB4MDAsMHhBMCwweEM5LDB4MjUsMHhDRCwweDE2KTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0U291bmQzRExpc3RlbmVyLAkweDI3OUFGQTg0LDB4NDk4MSwweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwKTsKK0RFRklORV9HVUlEKElJRF9JRGlyZWN0U291bmQzREJ1ZmZlciwJMHgyNzlBRkE4NiwweDQ5ODEsMHgxMUNFLDB4QTUsMHgyMSwweDAwLDB4MjAsMHhBRiwweDBCLDB4RTUsMHg2MCk7IAorREVGSU5FX0dVSUQoSUlEX0lEaXJlY3RTb3VuZENhcHR1cmUsCTB4QjAyMTA3ODEsMHg4OUNELDB4MTFEMCwweEFGLDB4MDgsMHgwMCwweEEwLDB4QzksMHgyNSwweENELDB4MTYpOworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3RTb3VuZENhcHR1cmVCdWZmZXIsMHhCMDIxMDc4MiwweDg5Q0QsMHgxMUQwLDB4QUYsMHgwOCwweDAwLDB4QTAsMHhDOSwweDI1LDB4Q0QsMHgxNik7CitERUZJTkVfR1VJRChJSURfSUtzUHJvcGVydHlTZXQsCQkweDMxRUZBQzMwLDB4NTE1QywweDExRDAsMHhBOSwweEFBLDB4MDAsMHhBQSwweDAwLDB4NjEsMHhCRSwweDkzKTsKKworCiAKIHR5cGVkZWYgc3RydWN0IElEaXJlY3RTb3VuZCBJRGlyZWN0U291bmQsKkxQRElSRUNUU09VTkQ7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0U291bmROb3RpZnkgSURpcmVjdFNvdW5kTm90aWZ5LCpMUERJUkVDVFNPVU5ETk9USUZZOwogdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdFNvdW5kQnVmZmVyIElEaXJlY3RTb3VuZEJ1ZmZlciwqTFBESVJFQ1RTT1VOREJVRkZFUiwqKkxQTFBESVJFQ1RTT1VOREJVRkZFUjsKIAogI2RlZmluZQlfRkFDRFMJCTB4ODc4CiAjZGVmaW5lCU1BS0VfRFNIUkVTVUxUKGNvZGUpCQlNQUtFX0hSRVNVTFQoMSxfRkFDRFMsY29kZSkKIAorI2RlZmluZSBEU19PSwkJCQkwCiAjZGVmaW5lIERTRVJSX0FMTE9DQVRFRAkJCU1BS0VfRFNIUkVTVUxUKDEwKQogI2RlZmluZSBEU0VSUl9DT05UUk9MVU5BVkFJTAkJTUFLRV9EU0hSRVNVTFQoMzApCiAjZGVmaW5lIERTRVJSX0lOVkFMSURQQVJBTQkJRV9JTlZBTElEQVJHCkBAIC0xMjIsNyArMTI5LDEzIEBACiAgICAgTFBXQVZFRk9STUFURVgJbHB3ZnhGb3JtYXQ7CiB9IERTQlVGRkVSREVTQywqTFBEU0JVRkZFUkRFU0M7CiAKK3R5cGVkZWYgc3RydWN0IF9EU0JQT1NJVElPTk5PVElGWQoreworCURXT1JECQlkd09mZnNldDsKKwlIQU5ETEUzMgloRXZlbnROb3RpZnk7Cit9IERTQlBPU0lUSU9OTk9USUZZLCpMUERTQlBPU0lUSU9OTk9USUZZOwogCit0eXBlZGVmIGNvbnN0IERTQlBPU0lUSU9OTk9USUZZICpMUENEU0JQT1NJVElPTk5PVElGWTsKIAogI2RlZmluZSBEU1NQRUFLRVJfSEVBRFBIT05FICAgICAxCiAjZGVmaW5lIERTU1BFQUtFUl9NT05PICAgICAgICAgIDIKQEAgLTEzMSw3ICsxNDQsNiBAQAogI2RlZmluZSBEU1NQRUFLRVJfU1VSUk9VTkQgICAgICA1CiAKIAotCiB0eXBlZGVmIExQVk9JRCogTFBMUFZPSUQ7CiAKIHR5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqTFBEU0VOVU1DQUxMQkFDSzMyVykoTFBHVUlELExQV1NUUixMUFdTVFIsTFBWT0lEKTsKQEAgLTE0MywxMSArMTU1LDkgQEAKICNkZWZpbmUgU1RETUVUSE9EXyhyZXQseGZuKSByZXQgKENBTExCQUNLICpmbiMjeGZuKQogI2RlZmluZSBQVVJFCiAjZGVmaW5lIEZBUgotI2RlZmluZSBVTE9ORyBEV09SRAorI2RlZmluZSBUSElTXyBUSElTLAogCiAjZGVmaW5lIFRISVMgTFBESVJFQ1RTT1VORCB0aGlzCi0jZGVmaW5lIFRISVNfIExQRElSRUNUU09VTkQgdGhpcywKLQogdHlwZWRlZiBzdHJ1Y3QgdGFnTFBESVJFQ1RTT1VORF9WVEFCTEUKIHsKICAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwpAQCAtMTcxLDEyICsxODEsMTEgQEAKIAlEV09SRAkJCXJlZjsKIAlpbnQJCQlucm9mYnVmZmVyczsKIAlMUERJUkVDVFNPVU5EQlVGRkVSCSpidWZmZXJzOworCVdBVkVGT1JNQVRFWAkJd2Z4OyAvKiBjdXJyZW50IG1haW4gd2F2ZWZvcm1hdCAqLwogfTsKLQogI3VuZGVmIFRISVMKLSN1bmRlZiBUSElTXworCiAjZGVmaW5lIFRISVMgTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzCi0jZGVmaW5lIFRISVNfIExQRElSRUNUU09VTkRCVUZGRVIgdGhpcywKIHR5cGVkZWYgc3RydWN0IHRhZ0xQRElSRUNUU09VTkRCVUZGRVJfVlRBQkxFCiB7CiAgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KQEAgLTIxMCw4ICsyMTksMzYgQEAKIAlXQVZFRk9STUFURVgJCQl3Zng7CiAJRFdPUkQJCQkJcmVmOwogCUxQQllURQkJCQlidWZmZXI7Ci0JRFdPUkQJCQkJcGxheWluZyxwbGF5cG9zLHdyaXRlcG9zLGJ1ZmxlbjsKKwlEV09SRAkJCQlwbGF5ZmxhZ3MscGxheWluZyxwbGF5cG9zLHdyaXRlcG9zLGJ1ZmxlbjsKKwlMT05HCQkJCXZvbHVtZSxwYW47CiAJTFBESVJFQ1RTT1VORAkJCWRzb3VuZDsKKwlEU0JVRkZFUkRFU0MJCQlkc2JkOworCUxQRFNCUE9TSVRJT05OT1RJRlkJCW5vdGlmaWVzOworCWludAkJCQlucm9mbm90aWZpZXM7CiB9OworI3VuZGVmIFRISVMKIAorI2RlZmluZSBUSElTIExQRElSRUNUU09VTkROT1RJRlkgdGhpcwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdFNvdW5kTm90aWZ5X1ZUYWJsZSB7CisJLyogSVVua25vd24gbWV0aG9kcyAqLworCVNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgICAgICAgICAgIChUSElTXyBSRUZJSUQsIExQVk9JRCAqKSBQVVJFOworCVNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAgICAgICAgICAgIChUSElTKSBQVVJFOworCVNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkgICAgICAgICAgIChUSElTKSBQVVJFOworCisJLyogSURpcmVjdFNvdW5kTm90aWZ5IG1ldGhvZHMgKi8KKwlTVERNRVRIT0QoU2V0Tm90aWZpY2F0aW9uUG9zaXRpb25zKSAoVEhJU18gRFdPUkQsIExQQ0RTQlBPU0lUSU9OTk9USUZZKSBQVVJFOworfSAqTFBESVJFQ1RTT1VORE5PVElGWV9WVEFCTEUsSURpcmVjdFNvdW5kTm90aWZ5X1ZUYWJsZTsKKworc3RydWN0IElEaXJlY3RTb3VuZE5vdGlmeSB7CisJTFBESVJFQ1RTT1VORE5PVElGWV9WVEFCTEUJbHB2dGJsOworCURXT1JECQkJCXJlZjsKKwlMUERJUkVDVFNPVU5EQlVGRkVSCQlkc2I7Cit9OworI3VuZGVmIFRISVMKKworI3VuZGVmIFNURE1FVEhPRAorI3VuZGVmIFNURE1FVEhPRF8KKyN1bmRlZiBQVVJFCisjdW5kZWYgRkFSCisjdW5kZWYgVEhJU18KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mb250LmggYi9pbmNsdWRlL2ZvbnQuaAppbmRleCBjYWU0MTFjLi43Y2NjNjVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZvbnQuaAorKysgYi9pbmNsdWRlL2ZvbnQuaApAQCAtMjYsNCArMjYsMTYgQEAKIGV4dGVybiBJTlQxNiAgRk9OVF9HZXRPYmplY3QxNiggRk9OVE9CSiAqIGZvbnQsIElOVDE2IGNvdW50LCBMUFNUUiBidWZmZXIgKTsKIGV4dGVybiBJTlQzMiAgRk9OVF9HZXRPYmplY3QzMkEoIEZPTlRPQkogKiBmb250LCBJTlQzMiBjb3VudCwgTFBTVFIgYnVmZmVyICk7CiAKK2V4dGVybiB2b2lkIEZPTlRfTG9nRm9udDMyQVRvMTYoIGNvbnN0IExPR0ZPTlQzMkEqIGZvbnQzMiwgTFBMT0dGT05UMTYgZm9udDE2ICk7CitleHRlcm4gdm9pZCBGT05UX0xvZ0ZvbnQzMldUbzE2KCBjb25zdCBMT0dGT05UMzJXKiBmb250MzIsIExQTE9HRk9OVDE2IGZvbnQxNiApOworZXh0ZXJuIHZvaWQgRk9OVF9Mb2dGb250MTZUbzMyQSggY29uc3QgTFBMT0dGT05UMTYgZm9udDE2LCBMUExPR0ZPTlQzMkEgZm9udDMyICk7CitleHRlcm4gdm9pZCBGT05UX0xvZ0ZvbnQxNlRvMzJXKCBjb25zdCBMUExPR0ZPTlQxNiBmb250MTYsIExQTE9HRk9OVDMyVyBmb250MzIgKTsKK2V4dGVybiB2b2lkIEZPTlRfVGV4dE1ldHJpYzMyQXRvMTYoY29uc3QgTFBURVhUTUVUUklDMzJBIHB0bTMyLCBMUFRFWFRNRVRSSUMxNiBwdG0xNiApOworZXh0ZXJuIHZvaWQgRk9OVF9UZXh0TWV0cmljMzJXdG8xNihjb25zdCBMUFRFWFRNRVRSSUMzMlcgcHRtMzIsIExQVEVYVE1FVFJJQzE2IHB0bTE2ICk7CitleHRlcm4gdm9pZCBGT05UX1RleHRNZXRyaWMxNnRvMzJBKGNvbnN0IExQVEVYVE1FVFJJQzE2IHB0bTE2LCBMUFRFWFRNRVRSSUMzMkEgcHRtMzIgKTsKK2V4dGVybiB2b2lkIEZPTlRfVGV4dE1ldHJpYzE2dG8zMlcoY29uc3QgTFBURVhUTUVUUklDMTYgcHRtMTYsIExQVEVYVE1FVFJJQzMyVyBwdG0zMiApOworZXh0ZXJuIHZvaWQgRk9OVF9UZXh0TWV0cmljMzJBdG8zMlcoY29uc3QgTFBURVhUTUVUUklDMzJBIHB0bTMyQSwgTFBURVhUTUVUUklDMzJXIHB0bTMyVyApOworCisKKwogI2VuZGlmIC8qIF9fV0lORV9GT05UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2RpLmggYi9pbmNsdWRlL2dkaS5oCmluZGV4IGVkOTBiOTQuLmNjZTQyNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ2RpLmgKKysrIGIvaW5jbHVkZS9nZGkuaApAQCAtMTMxLDYgKzEzMSwxMSBAQAogICAgIElOVDMyICAgICAgICAgRENPcmdZOwogICAgIElOVDMyICAgICAgICAgQ3Vyc1Bvc1g7ICAgICAgICAgIC8qIEN1cnJlbnQgcG9zaXRpb24gKi8KICAgICBJTlQzMiAgICAgICAgIEN1cnNQb3NZOworICAgIElOVDMyICAgICAgICAgQXJjRGlyZWN0aW9uOworICAgIEJPT0wzMiAgICAgICAgVXNlV29ybGRYZm9ybTsgICAgIC8qIFNob3VsZCB3ZSB1c2UgdGhlIHdvcmxkIHRyYW5zZm9ybT8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS5lLiBpcyBpdCBub3QgZXF1YWwgdG8gdGhlICAgICAgICovCisJCQkJICAgICAvKiBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbj8pICAgICAgICAgICovCisgICAgWEZPUk0gICAgICAgICBXb3JsZFhmb3JtOyAgICAgICAgLyogV29ybGQgdHJhbnNmb3JtICovCiB9IFdJTl9EQ19JTkZPOwogCiB0eXBlZGVmIFgxMURSVl9QREVWSUNFIFhfRENfSU5GTzsgIC8qIFRlbXBvcmFyeSAqLwpAQCAtMjg2LDYgKzI5MSwxNiBAQAogI2RlZmluZSBZTFBUT0RQKGRjLHkpIFwKICAgICAoKCh5KS0oZGMpLT53bmRPcmdZKSAqIChkYyktPnZwb3J0RXh0WSAvIChkYyktPnduZEV4dFkrKGRjKS0+dnBvcnRPcmdZKQogCisgIC8qIERldmljZSA8LT4gbG9naWNhbCBzaXplIGNvbnZlcnNpb24gKi8KKworI2RlZmluZSBYRFNUT0xTKGRjLHgpIFwKKyAgICAoKHgpICogKGRjKS0+d25kRXh0WCAvIChkYyktPnZwb3J0RXh0WCkKKyNkZWZpbmUgWURTVE9MUyhkYyx5KSBcCisgICAgKCh5KSAqIChkYyktPnduZEV4dFkgLyAoZGMpLT52cG9ydEV4dFkpCisjZGVmaW5lIFhMU1RPRFMoZGMseCkgXAorICAgICgoeCkgKiAoZGMpLT52cG9ydEV4dFggLyAoZGMpLT53bmRFeHRYKQorI2RlZmluZSBZTFNUT0RTKGRjLHkpIFwKKyAgICAoKHkpICogKGRjKS0+dnBvcnRFeHRZIC8gKGRjKS0+d25kRXh0WSkKIAogICAvKiBHREkgbG9jYWwgaGVhcCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21vZHVsZS5oIGIvaW5jbHVkZS9tb2R1bGUuaAppbmRleCAyNzM3NTAxLi43ZTdhNzQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbW9kdWxlLmgKQEAgLTEyOSw3ICsxMjksNyBAQAogZXh0ZXJuIEJPT0wxNiBNT0RVTEVfU2V0RW50cnlQb2ludCggSE1PRFVMRTMyIGhNb2R1bGUsIFdPUkQgb3JkaW5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgb2Zmc2V0ICk7CiBleHRlcm4gRkFSUFJPQzE2IE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNiggY29uc3QgY2hhciAqbmFtZSApOwotZXh0ZXJuIEZBUlBST0MxNiBXSU4zMl9HZXRQcm9jQWRkcmVzczE2KCBITU9EVUxFMzIgaG1vZHVsZSwgTFBTVFIgbmFtZSApOworZXh0ZXJuIEZBUlBST0MxNiBXSU5BUEkgV0lOMzJfR2V0UHJvY0FkZHJlc3MxNiggSE1PRFVMRTMyIGhtb2R1bGUsIExQU1RSIG5hbWUgKTsKIAogLyogYnVpbHRpbi5jICovCiBleHRlcm4gQk9PTDMyIEJVSUxUSU5fSW5pdCh2b2lkKTsKQEAgLTE0Nyw0ICsxNDcsNyBAQAogZXh0ZXJuIHZvaWQgTkVfRml4dXBQcm9sb2dzKCBORV9NT0RVTEUgKnBNb2R1bGUgKTsKIGV4dGVybiB2b2lkIE5FX0luaXRpYWxpemVETExzKCBITU9EVUxFMTYgaE1vZHVsZSApOwogCisvKiByZWxheTMyL2J1aWx0aW4uYyAqLworZXh0ZXJuIEhNT0RVTEUzMiBCVUlMVElOMzJfTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIEJPT0wzMiBmb3JjZSApOworCiAjZW5kaWYgIC8qIF9fV0lORV9NT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vbGUuaCBiL2luY2x1ZGUvb2xlLmgKaW5kZXggMGQ5MDk2MC4uNzFjMTY1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vbGUuaAorKysgYi9pbmNsdWRlL29sZS5oCkBAIC03LDEwICs3LDE1IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKK3R5cGVkZWYgQ0hBUglPTEVfQ0hBUixPTEVDSEFSOwogdHlwZWRlZiBMUENTVFIJT0xFX0xQQ1NUUjsKIHR5cGVkZWYgTFBTVFIJTFBPTEVTVFI7CiB0eXBlZGVmIExQQ1NUUglMUENPTEVTVFI7CiAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVkFSVFlQRTsKK3R5cGVkZWYgTE9ORyBESVNQSUQ7CisKKwogLyogb2JqZWN0IHR5cGVzICovCiAjZGVmaW5lIE9UX0xJTksJCTEKICNkZWZpbmUgT1RfRU1CRURERUQJMgpAQCAtMjYwLDQgKzI2NSwzOSBAQAogT0xFU1RBVFVTIFdJTkFQSSBPbGVSZXZva2VDbGllbnREb2MoTEhDTElFTlRET0MpOwogT0xFU1RBVFVTIFdJTkFQSSBPbGVSZXZva2VTZXJ2ZXIoTEhTRVJWRVIpOwogCit0eXBlZGVmIGVudW0gdGFnQ0FMTENPTlYgeworICAgIENDX0NERUNMCQk9IDEsCisgICAgQ0NfTVNDUEFTQ0FMCT0gQ0NfQ0RFQ0wgKyAxLAorICAgIENDX1BBU0NBTAkJPSBDQ19NU0NQQVNDQUwsCisgICAgQ0NfTUFDUEFTQ0FMCT0gQ0NfUEFTQ0FMICsgMSwKKyAgICBDQ19TVERDQUxMCQk9IENDX01BQ1BBU0NBTCArIDEsCisgICAgQ0NfUkVTRVJWRUQJCT0gQ0NfU1REQ0FMTCArIDEsCisgICAgQ0NfU1lTQ0FMTAkJPSBDQ19SRVNFUlZFRCArIDEsCisgICAgQ0NfTVBXQ0RFQ0wJCT0gQ0NfU1lTQ0FMTCArIDEsCisgICAgQ0NfTVBXUEFTQ0FMCT0gQ0NfTVBXQ0RFQ0wgKyAxLAorICAgIENDX01BWCAJCT0gQ0NfTVBXUEFTQ0FMICsgMQorfSBDQUxMQ09OVjsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUEFSQU1EQVRBIHsKKyAgICBPTEVDSEFSICogc3pOYW1lOyAgICAvKiBwYXJhbWV0ZXIgbmFtZSAqLworICAgIFZBUlRZUEUgdnQ7ICAgICAgICAgLyogcGFyYW1ldGVyIHR5cGUgKi8KK30gUEFSQU1EQVRBLCAqIExQUEFSQU1EQVRBOworCit0eXBlZGVmIHN0cnVjdCB0YWdNRVRIT0REQVRBIHsKKyAgICBPTEVDSEFSICogc3pOYW1lOyAgICAvKiBtZXRob2QgbmFtZSAqLworICAgIFBBUkFNREFUQSAqIHBwZGF0YTsgIC8qIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgUEFSQU1EQVRBcyAqLworICAgIERJU1BJRCBkaXNwaWQ7ICAgICAgLyogbWV0aG9kIElEICovCisgICAgVUlOVDE2IGlNZXRoOyAgICAgICAgIC8qIG1ldGhvZCBpbmRleCAqLworICAgIENBTExDT05WIGNjOyAgICAgICAgLyogY2FsbGluZyBjb252ZW50aW9uICovCisgICAgVUlOVDE2IGNBcmdzOyAgICAgICAgIC8qIGNvdW50IG9mIGFyZ3VtZW50cyAqLworICAgIFdPUkQgd0ZsYWdzOyAgICAgICAgLyogc2FtZSB3RmxhZ3MgYXMgb24gSURpc3BhdGNoOjpJbnZva2UoKSAqLworICAgIFZBUlRZUEUgdnRSZXR1cm47Cit9IE1FVEhPRERBVEEsICogTFBNRVRIT0REQVRBOworCit0eXBlZGVmIHN0cnVjdCB0YWdJTlRFUkZBQ0VEQVRBIHsKKyAgICBNRVRIT0REQVRBICogcG1ldGhkYXRhOyAgLyogcG9pbnRlciB0byBhbiBhcnJheSBvZiBNRVRIT0REQVRBcyAqLworICAgIFVJTlQxNiBjTWVtYmVyczsgICAgICAvKiBjb3VudCBvZiBtZW1iZXJzICovCit9IElOVEVSRkFDRURBVEEsICogTFBJTlRFUkZBQ0VEQVRBOworCisKICNlbmRpZiAgLyogX19XSU5FX09MRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wdGlvbnMuaCBiL2luY2x1ZGUvb3B0aW9ucy5oCmluZGV4IDc4NDYxNGMuLjJiOWZjZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvb3B0aW9ucy5oCisrKyBiL2luY2x1ZGUvb3B0aW9ucy5oCkBAIC0yNSw3ICsyNSw5IEBACiAgICAgTEFOR19LbywgIC8qIEtvcmVhbiAqLwogICAgIExBTkdfSHUsICAvKiBIdW5nYXJpYW4gKi8KICAgICBMQU5HX1BsLCAgLyogUG9saXNoICovCi0gICAgTEFOR19QbyAgIC8qIFBvcnR1Z3Vlc2UgKi8KKyAgICBMQU5HX1BvLCAgLyogUG9ydHVndWVzZSAqLworICAgIExBTkdfU3csICAvKiBTd2VkaXNoICovCisgICAgTEFOR19DYSAgIC8qIENhdGFsYW4gKi8KIH0gV0lORV9MQU5HVUFHRTsKIAogdHlwZWRlZiBzdHJ1Y3QKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGF0aC5oIGIvaW5jbHVkZS9wYXRoLmgKaW5kZXggZmJmMDBlMS4uNGRkZmMyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wYXRoLmgKKysrIGIvaW5jbHVkZS9wYXRoLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogR3JhcGhpY3MgcGF0aHMgKEJlZ2luUGF0aCwgRW5kUGF0aCBldGMuKQogICoKLSAqIENvcHlyaWdodCAxOTk3IE1hcnRpbiBCb2VobWUKKyAqIENvcHlyaWdodCAxOTk3LCAxOTk4IE1hcnRpbiBCb2VobWUKICAqLwogCiAjaWZuZGVmIF9fV0lORV9QQVRIX0gKQEAgLTM5LDcgKzM5LDEyIEBACiBleHRlcm4gdm9pZCAgIFBBVEhfRGVzdHJveUdkaVBhdGgoR2RpUGF0aCAqcFBhdGgpOwogZXh0ZXJuIEJPT0wzMiBQQVRIX0Fzc2lnbkdkaVBhdGgoR2RpUGF0aCAqcFBhdGhEZXN0LAogICAgY29uc3QgR2RpUGF0aCAqcFBhdGhTcmMpOworCiBleHRlcm4gQk9PTDMyIFBBVEhfTW92ZVRvKEhEQzMyIGhkYyk7CiBleHRlcm4gQk9PTDMyIFBBVEhfTGluZVRvKEhEQzMyIGhkYywgSU5UMzIgeCwgSU5UMzIgeSk7CitleHRlcm4gQk9PTDMyIFBBVEhfRWxsaXBzZShIREMzMiBoZGMsIElOVDMyIHgxLCBJTlQzMiB5MSwKKyAgIElOVDMyIHgyLCBJTlQzMiB5Mik7CitleHRlcm4gQk9PTDMyIFBBVEhfQXJjKEhEQzMyIGhkYywgSU5UMzIgeDEsIElOVDMyIHkxLCBJTlQzMiB4MiwgSU5UMzIgeTIsCisgICBJTlQzMiB4U3RhcnQsIElOVDMyIHlTdGFydCwgSU5UMzIgeEVuZCwgSU5UMzIgeUVuZCk7CiAKICNlbmRpZiAvKiBfX1dJTkVfUEFUSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BlX2ltYWdlLmggYi9pbmNsdWRlL3BlX2ltYWdlLmgKaW5kZXggYjY4NzZlOS4uYWFmYWIxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wZV9pbWFnZS5oCisrKyBiL2luY2x1ZGUvcGVfaW1hZ2UuaApAQCAtMjAsOCArMjAsMTIgQEAKICNkZWZpbmUgUEVfTU9EUkVGX1BST0NFU1NfQVRUQUNIRUQJMHgwMDAwMDAwMQogI2RlZmluZSBQRV9NT0RSRUZfTk9fRExMX0NBTExTCQkweDAwMDAwMDAyCiAjZGVmaW5lIFBFX01PRFJFRl9SRUxPQ1NfRE9ORQkJMHgwMDAwMDAwNAorI2RlZmluZSBQRV9NT0RSRUZfVExTX0FMTE9DRUQJCTB4MDAwMDAwMDgKKwlpbnQJCQkJdGxzaW5kZXg7CiB9OwogCitzdHJ1Y3QgX1BEQjMyOworCiB0eXBlZGVmIHN0cnVjdCBwZV9tb2RyZWYgUEVfTU9EUkVGOwogCiBleHRlcm4gaW50IFBFX3VubG9hZEltYWdlKEhNT0RVTEUzMiBoTW9kdWxlKTsKQEAgLTM1LDExICszOSwxMyBAQAogZXh0ZXJuIEJPT0wzMiBQRV9FbnVtUmVzb3VyY2VMYW5ndWFnZXMzMlcoSE1PRFVMRTMyLExQQ1dTVFIsTFBDV1NUUixFTlVNUkVTTEFOR1BST0MzMlcsTE9ORyk7CiBleHRlcm4gSFJTUkMzMiBQRV9GaW5kUmVzb3VyY2VFeDMyVyhISU5TVEFOQ0UzMixMUENXU1RSLExQQ1dTVFIsV09SRCk7CiBleHRlcm4gRFdPUkQgUEVfU2l6ZW9mUmVzb3VyY2UzMihISU5TVEFOQ0UzMixIUlNSQzMyKTsKLWV4dGVybiBITU9EVUxFMzIgUEVfTG9hZExpYnJhcnlFeDMyQShMUENTVFIsSEZJTEUzMixEV09SRCk7CitleHRlcm4gSE1PRFVMRTMyIFBFX0xvYWRMaWJyYXJ5RXgzMkEoTFBDU1RSLHN0cnVjdCBfUERCMzIqLEhGSUxFMzIsRFdPUkQpOwogZXh0ZXJuIEhHTE9CQUwzMiBQRV9Mb2FkUmVzb3VyY2UzMihISU5TVEFOQ0UzMixIUlNSQzMyKTsKIAogc3RydWN0IF9QREIzMjsgLyogZm9yd2FyZCBkZWZpbml0aW9uICovCitzdHJ1Y3QgX1RIREI7IC8qIGZvcndhcmQgZGVmaW5pdGlvbiAqLwogZXh0ZXJuIHZvaWQgUEVfSW5pdGlhbGl6ZURMTHMoc3RydWN0IF9QREIzMiosRFdPUkQsTFBWT0lEKTsKK2V4dGVybiB2b2lkIFBFX0luaXRUbHMoc3RydWN0IF9USERCKik7CiAKIGV4dGVybiBMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSBHZXRSZXNEaXJFbnRyeVcoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlksTFBDV1NUUixEV09SRCxCT09MMzIpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Byb2Nlc3MuaCBiL2luY2x1ZGUvcHJvY2Vzcy5oCmluZGV4IDIxODkzZGIuLjg0OGY3NzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJvY2Vzcy5oCisrKyBiL2luY2x1ZGUvcHJvY2Vzcy5oCkBAIC05OCw2ICs5OCwxMSBAQAogICAgIExDSUQgICAgICAgICAgICAgbG9jYWxlOyAgICAgICAgICAgLyogYzQgTG9jYWxlIHRvIGJlIHF1ZXJpZWQgYnkgR2V0VGhyZWFkTG9jYWxlIChOVCkgKi8KIH0gUERCMzI7CiAKKy8qIFBEQiA8LT4gUHJvY2VzcyBpZCBjb252ZXJzaW9uIG1hY3JvcyAqLworI2RlZmluZSBQUk9DRVNTX09CRlVTQ0FUT1IgICAgICgoRFdPUkQpMHhkZWFkYmVlZikKKyNkZWZpbmUgUFJPQ0VTU19JRF9UT19QREIoaWQpICAoKFBEQjMyICopKChpZCkgXiBQUk9DRVNTX09CRlVTQ0FUT1IpKQorI2RlZmluZSBQREJfVE9fUFJPQ0VTU19JRChwZGIpICgoRFdPUkQpKHBkYikgXiBQUk9DRVNTX09CRlVTQ0FUT1IpCisKIC8qIHNjaGVkdWxlci9wcm9jZXNzLmMgKi8KIGV4dGVybiBQREIzMiAqUFJPQ0VTU19DdXJyZW50KHZvaWQpOwogZXh0ZXJuIFBEQjMyICpQUk9DRVNTX0lkVG9QREIoIERXT1JEIGlkICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0YWNrZnJhbWUuaCBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCmluZGV4IDE0MzViYmIuLjUzOTRjMDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3RhY2tmcmFtZS5oCisrKyBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgogCiAjcHJhZ21hIHBhY2soMSkKIApAQCAtNDYsMTEgKzQ3LDkgQEAKIAogI3ByYWdtYSBwYWNrKDQpCiAKLSAgLyogU2F2ZWQgMTYtYml0IHN0YWNrIGZvciBjdXJyZW50IHByb2Nlc3MgKFdpbjE2IG9ubHkpICovCi1leHRlcm4gRFdPUkQgSUYxNjMyX1NhdmVkMTZfc3Nfc3A7Ci0KLSNkZWZpbmUgQ1VSUkVOVF9TVEFDSzE2ICgoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oSUYxNjMyX1NhdmVkMTZfc3Nfc3ApKQotI2RlZmluZSBDVVJSRU5UX0RTICAgICAgKENVUlJFTlRfU1RBQ0sxNi0+ZHMpCisjZGVmaW5lIFRIUkVBRF9TVEFDSzE2KHRoZGIpICgoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTigodGhkYiktPmN1cl9zdGFjaykpCisjZGVmaW5lIENVUlJFTlRfU1RBQ0sxNiAgICAgIChUSFJFQURfU1RBQ0sxNihUSFJFQURfQ3VycmVudCgpKSkKKyNkZWZpbmUgQ1VSUkVOVF9EUyAgICAgICAgICAgKENVUlJFTlRfU1RBQ0sxNi0+ZHMpCiAKIC8qIHZhcmFyZ3MgbGlzdHMgb24gdGhlIDE2LWJpdCBzdGFjayAqLwogCkBAIC02NCwxNSArNjMsMTkgQEAKICAgICAgKigodHlwZSAqKSh2b2lkICopKChjaGFyICopKGxpc3QpIC0gX19WQV9ST1VOREVEMTYodHlwZSkpKSkKICNkZWZpbmUgVkFfRU5EMTYobGlzdCkgKCh2b2lkKTApCiAKLS8qIFB1c2ggYnl0ZXMgb24gdGhlIDE2LWJpdCBzdGFjazsgcmV0dXJuIGEgc2VncHRyIHRvIHRoZSBmaXJzdCBwdXNoZWQgYnl0ZSAqLwotI2RlZmluZSBTVEFDSzE2X1BVU0goc2l6ZSkgXAotIChtZW1tb3ZlKChjaGFyKilDVVJSRU5UX1NUQUNLMTYtKHNpemUpLENVUlJFTlRfU1RBQ0sxNixzaXplb2YoU1RBQ0sxNkZSQU1FKSksXAotICBJRjE2MzJfU2F2ZWQxNl9zc19zcCAtPSAoc2l6ZSksIFwKLSAgKFNFR1BUUikoSUYxNjMyX1NhdmVkMTZfc3Nfc3AgKyBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpCisvKiBQdXNoIGJ5dGVzIG9uIHRoZSAxNi1iaXQgc3RhY2sgb2YgYSB0aHJlYWQ7CisgKiByZXR1cm4gYSBzZWdwdHIgdG8gdGhlIGZpcnN0IHB1c2hlZCBieXRlCisgKi8KKyNkZWZpbmUgU1RBQ0sxNl9QVVNIKHRoZGIsc2l6ZSkgXAorIChtZW1tb3ZlKChjaGFyKilUSFJFQURfU1RBQ0sxNih0aGRiKS0oc2l6ZSksVEhSRUFEX1NUQUNLMTYodGhkYiksIFwKKyAgICAgICAgICBzaXplb2YoU1RBQ0sxNkZSQU1FKSksIFwKKyAgKHRoZGIpLT5jdXJfc3RhY2sgLT0gKHNpemUpLCBcCisgIChTRUdQVFIpKCh0aGRiKS0+Y3VyX3N0YWNrICsgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKQogCi0vKiBQb3AgYnl0ZXMgZnJvbSB0aGUgMTYtYml0IHN0YWNrICovCi0jZGVmaW5lIFNUQUNLMTZfUE9QKHNpemUpIFwKLSAobWVtbW92ZSgoY2hhciopQ1VSUkVOVF9TVEFDSzE2KyhzaXplKSxDVVJSRU5UX1NUQUNLMTYsc2l6ZW9mKFNUQUNLMTZGUkFNRSkpLFwKLSAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgKz0gKHNpemUpKQorLyogUG9wIGJ5dGVzIGZyb20gdGhlIDE2LWJpdCBzdGFjayBvZiBhIHRocmVhZCAqLworI2RlZmluZSBTVEFDSzE2X1BPUCh0aGRiLHNpemUpIFwKKyAobWVtbW92ZSgoY2hhciopVEhSRUFEX1NUQUNLMTYodGhkYikrKHNpemUpLFRIUkVBRF9TVEFDSzE2KHRoZGIpLCBcCisgICAgICAgICAgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpLCBcCisgICh0aGRiKS0+Y3VyX3N0YWNrICs9IChzaXplKSkKIAogI2VuZGlmIC8qIF9fV0lORV9TVEFDS0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3RkZGVidWcuaCBiL2luY2x1ZGUvc3RkZGVidWcuaAppbmRleCAwZjUxOTk0Li43MWM2MDkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0ZGRlYnVnLmgKKysrIGIvaW5jbHVkZS9zdGRkZWJ1Zy5oCkBAIC05MywxMCArOTMsMTIgQEAKICN1bmRlZiBERUJVR19DVVJTT1IKICN1bmRlZiBERUJVR19EQwogI3VuZGVmIERFQlVHX0RERQorI3VuZGVmIERFQlVHX0REUkFXCiAjdW5kZWYgREVCVUdfRElBTE9HCiAjdW5kZWYgREVCVUdfRExMCiAjdW5kZWYgREVCVUdfRE9TRlMKICN1bmRlZiBERUJVR19EUklWRVIKKyN1bmRlZiBERUJVR19EU09VTkQKICN1bmRlZiBERUJVR19FRElUCiAjdW5kZWYgREVCVUdfRVZFTlQKICN1bmRlZiBERUJVR19FWEVDCkBAIC0xNjAsNiArMTYyLDcgQEAKICN1bmRlZiBERUJVR19XSU4xNkRSVgogI3VuZGVmIERFQlVHX1dJTjMyCiAjdW5kZWYgREVCVUdfV0lOU09DSworI3VuZGVmIERFQlVHX1gxMQogI2VuZGlmCiAKICNpZmRlZiBERUJVR19BTEwKQEAgLTE4MCwxMCArMTgzLDEyIEBACiAjZGVmaW5lIERFQlVHX0NVUlNPUgogI2RlZmluZSBERUJVR19EQwogI2RlZmluZSBERUJVR19EREUKKyNkZWZpbmUgREVCVUdfRERSQVcKICNkZWZpbmUgREVCVUdfRElBTE9HCiAjZGVmaW5lIERFQlVHX0RMTAogI2RlZmluZSBERUJVR19ET1NGUwogI2RlZmluZSBERUJVR19EUklWRVIKKyNkZWZpbmUgREVCVUdfRFNPVU5ECiAjZGVmaW5lIERFQlVHX0VESVQKICNkZWZpbmUgREVCVUdfRVZFTlQKICNkZWZpbmUgREVCVUdfRVhFQwpAQCAtMjQ3LDQgKzI1Miw1IEBACiAjZGVmaW5lIERFQlVHX1dJTjE2RFJWCiAjZGVmaW5lIERFQlVHX1dJTjMyCiAjZGVmaW5lIERFQlVHX1dJTlNPQ0sKKyNkZWZpbmUgREVCVUdfWDExCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGhyZWFkLmggYi9pbmNsdWRlL3RocmVhZC5oCmluZGV4IDM2MWQxNjUuLmMxNzM0OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGhyZWFkLmgKKysrIGIvaW5jbHVkZS90aHJlYWQuaApAQCAtNTAsNyArNTAsNyBAQAogICAgIHN0cnVjdCBfUERCMzIgKnByb2Nlc3M7ICAgICAgICAvKiAgMDggUHJvY2VzcyBvd25pbmcgdGhpcyB0aHJlYWQgKi8KICAgICBLMzJPQkogICAgICAgICpldmVudDsgICAgICAgICAgLyogIDBjIFRocmVhZCBldmVudCAqLwogICAgIFRFQiAgICAgICAgICAgIHRlYjsgICAgICAgICAgICAvKiAgMTAgVGhyZWFkIGV4Y2VwdGlvbiBibG9jayAqLwotICAgIHN0cnVjdCBfUERCMzIgKnByb2Nlc3MyOyAgICAgICAvKiAgNDAgU2FtZSBhcyBvZmZzZXQgMDggKD8pICovCisgICAgRFdPUkQgICAgICAgICAgY3VyX3N0YWNrOyAgICAgIC8qICA0MCBDdXJyZW50IHN0YWNrICh3YXM6IHByb2Nlc3MyKSAqLwogICAgIERXT1JEICAgICAgICAgIGZsYWdzOyAgICAgICAgICAvKiAgNDQgRmxhZ3MgKi8KICAgICBEV09SRCAgICAgICAgICBleGl0X2NvZGU7ICAgICAgLyogIDQ4IFRlcm1pbmF0aW9uIHN0YXR1cyAqLwogICAgIFdPUkQgICAgICAgICAgIHRlYl9zZWw7ICAgICAgICAvKiAgNGMgU2VsZWN0b3IgdG8gVEVCICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RzX3hsaWIuaCBiL2luY2x1ZGUvdHNfeGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjlhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RzX3hsaWIuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIFRocmVhZCBzYWZlIHdyYXBwZXJzIGFyb3VuZCBYbGliIGNhbGxzLgorICogQWx3YXlzIGluY2x1ZGUgdGhpcyBmaWxlIGluc3RlYWQgb2YgPFgxMS9YbGliLmg+LgorICogVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0b29scy9tYWtlX1gxMXdyYXBwZXJzCisgKgorICogQ29weXJpZ2h0IDE5OTggS3Jpc3RpYW4gTmllbHNlbgorICovCisKKyNpZm5kZWYgX19XSU5FX1RTWExJQl9ICisjZGVmaW5lIF9fV0lORV9UU1hMSUJfSAorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKworZXh0ZXJuIFhGb250U3RydWN0ICogVFNYTG9hZFF1ZXJ5Rm9udChEaXNwbGF5KiwgY29uc3QgIGNoYXIqKTsKK2V4dGVybiBYTW9kaWZpZXJLZXltYXAJKiBUU1hHZXRNb2RpZmllck1hcHBpbmcoRGlzcGxheSopOworZXh0ZXJuIFhJbWFnZSAqIFRTWENyZWF0ZUltYWdlKERpc3BsYXkqLCBWaXN1YWwqLCB1bnNpZ25lZCBpbnQsIGludCwgaW50LCBjaGFyKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGludCwgaW50KTsKK2V4dGVybiBYSW1hZ2UgKiBUU1hHZXRJbWFnZShEaXNwbGF5KiwgRHJhd2FibGUsIGludCwgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZywgaW50KTsKK2V4dGVybiBEaXNwbGF5ICogVFNYT3BlbkRpc3BsYXkoY29uc3QgIGNoYXIqKTsKK2V4dGVybiB2b2lkICBUU1hybUluaXRpYWxpemUodm9pZCk7CitleHRlcm4gY2hhciAqIFRTWEdldEF0b21OYW1lKERpc3BsYXkqLCBBdG9tKTsKK2V4dGVybiBjaGFyICogVFNYS2V5c3ltVG9TdHJpbmcoS2V5U3ltKTsKK2V4dGVybiBBdG9tICBUU1hJbnRlcm5BdG9tKERpc3BsYXkqLCBjb25zdCAgY2hhciosIGludCk7CitleHRlcm4gQ29sb3JtYXAgIFRTWENyZWF0ZUNvbG9ybWFwKERpc3BsYXkqLCBXaW5kb3csIFZpc3VhbCosIGludCk7CitleHRlcm4gQ3Vyc29yICBUU1hDcmVhdGVQaXhtYXBDdXJzb3IoRGlzcGxheSosIFBpeG1hcCwgUGl4bWFwLCBYQ29sb3IqLCBYQ29sb3IqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gQ3Vyc29yICBUU1hDcmVhdGVGb250Q3Vyc29yKERpc3BsYXkqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIEdDICBUU1hDcmVhdGVHQyhEaXNwbGF5KiwgRHJhd2FibGUsIHVuc2lnbmVkIGxvbmcsIFhHQ1ZhbHVlcyopOworZXh0ZXJuIFBpeG1hcCAgVFNYQ3JlYXRlUGl4bWFwKERpc3BsYXkqLCBEcmF3YWJsZSwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gUGl4bWFwICBUU1hDcmVhdGVCaXRtYXBGcm9tRGF0YShEaXNwbGF5KiwgRHJhd2FibGUsIGNvbnN0ICBjaGFyKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIFdpbmRvdyAgVFNYR2V0U2VsZWN0aW9uT3duZXIoRGlzcGxheSosIEF0b20pOworZXh0ZXJuIFdpbmRvdyAgVFNYQ3JlYXRlV2luZG93KERpc3BsYXkqLCBXaW5kb3csIGludCwgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBpbnQsIHVuc2lnbmVkIGludCwgVmlzdWFsKiwgdW5zaWduZWQgbG9uZywgWFNldFdpbmRvd0F0dHJpYnV0ZXMqKTsKK2V4dGVybiBjaGFyICoqIFRTWExpc3RGb250cyhEaXNwbGF5KiwgY29uc3QgIGNoYXIqLCBpbnQsIGludCopOworZXh0ZXJuIEtleVN5bSAgVFNYS2V5Y29kZVRvS2V5c3ltKERpc3BsYXkqLCB1bnNpZ25lZCBpbnQsIGludCk7CitleHRlcm4gS2V5U3ltICBUU1hMb29rdXBLZXlzeW0oWEtleUV2ZW50KiwgaW50KTsKK2V4dGVybiBLZXlTeW0gKiBUU1hHZXRLZXlib2FyZE1hcHBpbmcoRGlzcGxheSosIHVuc2lnbmVkIGludCwgaW50LCBpbnQqKTsKK2V4dGVybiBjaGFyICogVFNYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nKERpc3BsYXkqKTsKK2V4dGVybiBpbnQgICBUU1hJbml0VGhyZWFkcyh2b2lkKTsKK2V4dGVybiBpbnQgKiBUU1hMaXN0RGVwdGhzKERpc3BsYXkqLCBpbnQsIGludCopOworZXh0ZXJuIGludCAgIFRTWFJlY29uZmlndXJlV01XaW5kb3coRGlzcGxheSosIFdpbmRvdywgaW50LCB1bnNpZ25lZCBpbnQsIFhXaW5kb3dDaGFuZ2VzKik7CitleHRlcm4gaW50ICAgVFNYU2V0V01Qcm90b2NvbHMoRGlzcGxheSosIFdpbmRvdywgQXRvbSosIGludCk7CitleHRlcm4gaW50ICBUU1hTZXRUcmFuc2llbnRGb3JIaW50KERpc3BsYXkqLCBXaW5kb3csIFdpbmRvdyk7CitleHRlcm4gaW50ICBUU1hBY3RpdmF0ZVNjcmVlblNhdmVyKERpc3BsYXkqKTsKK2V4dGVybiBpbnQgICBUU1hBbGxvY0NvbG9yKERpc3BsYXkqLCBDb2xvcm1hcCwgWENvbG9yKik7CitleHRlcm4gaW50ICAgVFNYQWxsb2NDb2xvckNlbGxzKERpc3BsYXkqLCBDb2xvcm1hcCwgaW50LCB1bnNpZ25lZCBsb25nKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgIFRTWEJlbGwoRGlzcGxheSosIGludCk7CitleHRlcm4gaW50ICBUU1hDaGFuZ2VHQyhEaXNwbGF5KiwgR0MsIHVuc2lnbmVkIGxvbmcsIFhHQ1ZhbHVlcyopOworZXh0ZXJuIGludCAgVFNYQ2hhbmdlS2V5Ym9hcmRDb250cm9sKERpc3BsYXkqLCB1bnNpZ25lZCBsb25nLCBYS2V5Ym9hcmRDb250cm9sKik7CitleHRlcm4gaW50ICBUU1hDaGFuZ2VQcm9wZXJ0eShEaXNwbGF5KiwgV2luZG93LCBBdG9tLCBBdG9tLCBpbnQsIGludCwgY29uc3QgIHVuc2lnbmVkIGNoYXIqLCBpbnQpOworZXh0ZXJuIGludCAgVFNYQ2hhbmdlV2luZG93QXR0cmlidXRlcyhEaXNwbGF5KiwgV2luZG93LCB1bnNpZ25lZCBsb25nLCBYU2V0V2luZG93QXR0cmlidXRlcyopOworZXh0ZXJuIGludCAgIFRTWENoZWNrVHlwZWRXaW5kb3dFdmVudChEaXNwbGF5KiwgV2luZG93LCBpbnQsIFhFdmVudCopOworZXh0ZXJuIGludCAgIFRTWENoZWNrV2luZG93RXZlbnQoRGlzcGxheSosIFdpbmRvdywgbG9uZywgWEV2ZW50Kik7CitleHRlcm4gaW50ICBUU1hDb252ZXJ0U2VsZWN0aW9uKERpc3BsYXkqLCBBdG9tLCBBdG9tLCBBdG9tLCBXaW5kb3csIFRpbWUpOworZXh0ZXJuIGludCAgVFNYQ29weUFyZWEoRGlzcGxheSosIERyYXdhYmxlLCBEcmF3YWJsZSwgR0MsIGludCwgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50LCBpbnQpOworZXh0ZXJuIGludCAgVFNYQ29weVBsYW5lKERpc3BsYXkqLCBEcmF3YWJsZSwgRHJhd2FibGUsIEdDLCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGludCwgaW50LCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBpbnQgIFRTWERlZmluZUN1cnNvcihEaXNwbGF5KiwgV2luZG93LCBDdXJzb3IpOworZXh0ZXJuIGludCAgVFNYRGVzdHJveVdpbmRvdyhEaXNwbGF5KiwgV2luZG93KTsKK2V4dGVybiBpbnQgIFRTWERpc3BsYXlLZXljb2RlcyhEaXNwbGF5KiwgaW50KiwgaW50Kik7CitleHRlcm4gaW50ICBUU1hEcmF3QXJjKERpc3BsYXkqLCBEcmF3YWJsZSwgR0MsIGludCwgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50LCBpbnQpOworZXh0ZXJuIGludCAgVFNYRHJhd0xpbmUoRGlzcGxheSosIERyYXdhYmxlLCBHQywgaW50LCBpbnQsIGludCwgaW50KTsKK2V4dGVybiBpbnQgIFRTWERyYXdMaW5lcyhEaXNwbGF5KiwgRHJhd2FibGUsIEdDLCBYUG9pbnQqLCBpbnQsIGludCk7CitleHRlcm4gaW50ICBUU1hEcmF3UG9pbnQoRGlzcGxheSosIERyYXdhYmxlLCBHQywgaW50LCBpbnQpOworZXh0ZXJuIGludCAgVFNYRHJhd1JlY3RhbmdsZShEaXNwbGF5KiwgRHJhd2FibGUsIEdDLCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCAgVFNYRHJhd1NlZ21lbnRzKERpc3BsYXkqLCBEcmF3YWJsZSwgR0MsIFhTZWdtZW50KiwgaW50KTsKK2V4dGVybiBpbnQgIFRTWERyYXdTdHJpbmcoRGlzcGxheSosIERyYXdhYmxlLCBHQywgaW50LCBpbnQsIGNvbnN0ICBjaGFyKiwgaW50KTsKK2V4dGVybiBpbnQgIFRTWERyYXdUZXh0KERpc3BsYXkqLCBEcmF3YWJsZSwgR0MsIGludCwgaW50LCBYVGV4dEl0ZW0qLCBpbnQpOworZXh0ZXJuIGludCAgVFNYRmlsbEFyYyhEaXNwbGF5KiwgRHJhd2FibGUsIEdDLCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGludCwgaW50KTsKK2V4dGVybiBpbnQgIFRTWEZpbGxQb2x5Z29uKERpc3BsYXkqLCBEcmF3YWJsZSwgR0MsIFhQb2ludCosIGludCwgaW50LCBpbnQpOworZXh0ZXJuIGludCAgVFNYRmlsbFJlY3RhbmdsZShEaXNwbGF5KiwgRHJhd2FibGUsIEdDLCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCAgVFNYRmx1c2goRGlzcGxheSopOworZXh0ZXJuIGludCAgVFNYRnJlZSh2b2lkKik7CitleHRlcm4gaW50ICBUU1hGcmVlQ29sb3JzKERpc3BsYXkqLCBDb2xvcm1hcCwgdW5zaWduZWQgbG9uZyosIGludCwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50ICBUU1hGcmVlQ3Vyc29yKERpc3BsYXkqLCBDdXJzb3IpOworZXh0ZXJuIGludCAgVFNYRnJlZUZvbnQoRGlzcGxheSosIFhGb250U3RydWN0Kik7CitleHRlcm4gaW50ICBUU1hGcmVlRm9udE5hbWVzKGNoYXIqKik7CitleHRlcm4gaW50ICBUU1hGcmVlR0MoRGlzcGxheSosIEdDKTsKK2V4dGVybiBpbnQgIFRTWEZyZWVNb2RpZmllcm1hcChYTW9kaWZpZXJLZXltYXAqKTsKK2V4dGVybiBpbnQgIFRTWEZyZWVQaXhtYXAoRGlzcGxheSosIFBpeG1hcCk7CitleHRlcm4gaW50ICAgVFNYR2V0Rm9udFByb3BlcnR5KFhGb250U3RydWN0KiwgQXRvbSwgdW5zaWduZWQgbG9uZyopOworZXh0ZXJuIGludCAgIFRTWEdldEdlb21ldHJ5KERpc3BsYXkqLCBEcmF3YWJsZSwgV2luZG93KiwgaW50KiwgaW50KiwgdW5zaWduZWQgaW50KiwgdW5zaWduZWQgaW50KiwgdW5zaWduZWQgaW50KiwgdW5zaWduZWQgaW50Kik7CitleHRlcm4gaW50ICBUU1hHZXRJbnB1dEZvY3VzKERpc3BsYXkqLCBXaW5kb3cqLCBpbnQqKTsKK2V4dGVybiBpbnQgIFRTWEdldEtleWJvYXJkQ29udHJvbChEaXNwbGF5KiwgWEtleWJvYXJkU3RhdGUqKTsKK2V4dGVybiBpbnQgIFRTWEdldFNjcmVlblNhdmVyKERpc3BsYXkqLCBpbnQqLCBpbnQqLCBpbnQqLCBpbnQqKTsKK2V4dGVybiBpbnQgIFRTWEdldFdpbmRvd1Byb3BlcnR5KERpc3BsYXkqLCBXaW5kb3csIEF0b20sIGxvbmcsIGxvbmcsIGludCwgQXRvbSwgQXRvbSosIGludCosIHVuc2lnbmVkIGxvbmcqLCB1bnNpZ25lZCBsb25nKiwgdW5zaWduZWQgY2hhcioqKTsKK2V4dGVybiBpbnQgICBUU1hHZXRXaW5kb3dBdHRyaWJ1dGVzKERpc3BsYXkqLCBXaW5kb3csIFhXaW5kb3dBdHRyaWJ1dGVzKik7CitleHRlcm4gaW50ICBUU1hHcmFiUG9pbnRlcihEaXNwbGF5KiwgV2luZG93LCBpbnQsIHVuc2lnbmVkIGludCwgaW50LCBpbnQsIFdpbmRvdywgQ3Vyc29yLCBUaW1lKTsKK2V4dGVybiBpbnQgIFRTWEdyYWJTZXJ2ZXIoRGlzcGxheSopOworZXh0ZXJuIGludCAgVFNYSW5zdGFsbENvbG9ybWFwKERpc3BsYXkqLCBDb2xvcm1hcCk7CitleHRlcm4gS2V5Q29kZSAgVFNYS2V5c3ltVG9LZXljb2RlKERpc3BsYXkqLCBLZXlTeW0pOworZXh0ZXJuIGludCAgVFNYTWFwV2luZG93KERpc3BsYXkqLCBXaW5kb3cpOworZXh0ZXJuIGludCAgVFNYTmV4dEV2ZW50KERpc3BsYXkqLCBYRXZlbnQqKTsKK2V4dGVybiBpbnQgIFRTWFBhcnNlR2VvbWV0cnkoY29uc3QgIGNoYXIqLCBpbnQqLCBpbnQqLCB1bnNpZ25lZCBpbnQqLCB1bnNpZ25lZCBpbnQqKTsKK2V4dGVybiBpbnQgIFRTWFBlbmRpbmcoRGlzcGxheSopOworZXh0ZXJuIGludCAgVFNYUHV0QmFja0V2ZW50KERpc3BsYXkqLCBYRXZlbnQqKTsKK2V4dGVybiBpbnQgIFRTWFB1dEltYWdlKERpc3BsYXkqLCBEcmF3YWJsZSwgR0MsIFhJbWFnZSosIGludCwgaW50LCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCAgVFNYUXVlcnlDb2xvcihEaXNwbGF5KiwgQ29sb3JtYXAsIFhDb2xvciopOworZXh0ZXJuIGludCAgIFRTWFF1ZXJ5UG9pbnRlcihEaXNwbGF5KiwgV2luZG93LCBXaW5kb3cqLCBXaW5kb3cqLCBpbnQqLCBpbnQqLCBpbnQqLCBpbnQqLCB1bnNpZ25lZCBpbnQqKTsKK2V4dGVybiBpbnQgICBUU1hRdWVyeVRyZWUoRGlzcGxheSosIFdpbmRvdywgV2luZG93KiwgV2luZG93KiwgV2luZG93KiosIHVuc2lnbmVkIGludCopOworZXh0ZXJuIGludCAgVFNYUmVzZXRTY3JlZW5TYXZlcihEaXNwbGF5Kik7CitleHRlcm4gaW50ICBUU1hSZXN0YWNrV2luZG93cyhEaXNwbGF5KiwgV2luZG93KiwgaW50KTsKK2V4dGVybiBpbnQgICBUU1hTZW5kRXZlbnQoRGlzcGxheSosIFdpbmRvdywgaW50LCBsb25nLCBYRXZlbnQqKTsKK2V4dGVybiBpbnQgIFRTWFNldEFyY01vZGUoRGlzcGxheSosIEdDLCBpbnQpOworZXh0ZXJuIGludCAgVFNYU2V0QmFja2dyb3VuZChEaXNwbGF5KiwgR0MsIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIGludCAgVFNYU2V0Q2xpcE1hc2soRGlzcGxheSosIEdDLCBQaXhtYXApOworZXh0ZXJuIGludCAgVFNYU2V0Q2xpcE9yaWdpbihEaXNwbGF5KiwgR0MsIGludCwgaW50KTsKK2V4dGVybiBpbnQgIFRTWFNldENsaXBSZWN0YW5nbGVzKERpc3BsYXkqLCBHQywgaW50LCBpbnQsIFhSZWN0YW5nbGUqLCBpbnQsIGludCk7CitleHRlcm4gaW50ICBUU1hTZXREYXNoZXMoRGlzcGxheSosIEdDLCBpbnQsIGNvbnN0ICBjaGFyKiwgaW50KTsKK2V4dGVybiBpbnQgIFRTWFNldEZpbGxTdHlsZShEaXNwbGF5KiwgR0MsIGludCk7CitleHRlcm4gaW50ICBUU1hTZXRGb3JlZ3JvdW5kKERpc3BsYXkqLCBHQywgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50ICBUU1hTZXRGdW5jdGlvbihEaXNwbGF5KiwgR0MsIGludCk7CitleHRlcm4gaW50ICBUU1hTZXRHcmFwaGljc0V4cG9zdXJlcyhEaXNwbGF5KiwgR0MsIGludCk7CitleHRlcm4gaW50ICBUU1hTZXRJY29uTmFtZShEaXNwbGF5KiwgV2luZG93LCBjb25zdCAgY2hhciopOworZXh0ZXJuIGludCAgVFNYU2V0SW5wdXRGb2N1cyhEaXNwbGF5KiwgV2luZG93LCBpbnQsIFRpbWUpOworZXh0ZXJuIGludCAgVFNYU2V0TGluZUF0dHJpYnV0ZXMoRGlzcGxheSosIEdDLCB1bnNpZ25lZCBpbnQsIGludCwgaW50LCBpbnQpOworZXh0ZXJuIGludCAgVFNYU2V0U2NyZWVuU2F2ZXIoRGlzcGxheSosIGludCwgaW50LCBpbnQsIGludCk7CitleHRlcm4gaW50ICBUU1hTZXRTZWxlY3Rpb25Pd25lcihEaXNwbGF5KiwgQXRvbSwgV2luZG93LCBUaW1lKTsKK2V4dGVybiBpbnQgIFRTWFNldFN1YndpbmRvd01vZGUoRGlzcGxheSosIEdDLCBpbnQpOworZXh0ZXJuIGludCAgVFNYU3RvcmVDb2xvcihEaXNwbGF5KiwgQ29sb3JtYXAsIFhDb2xvciopOworZXh0ZXJuIGludCAgVFNYU3RvcmVOYW1lKERpc3BsYXkqLCBXaW5kb3csIGNvbnN0ICBjaGFyKik7CitleHRlcm4gaW50ICBUU1hTeW5jKERpc3BsYXkqLCBpbnQpOworZXh0ZXJuIGludCAgVFNYVGV4dEV4dGVudHMoWEZvbnRTdHJ1Y3QqLCBjb25zdCAgY2hhciosIGludCwgaW50KiwgaW50KiwgaW50KiwgWENoYXJTdHJ1Y3QqKTsKK2V4dGVybiBpbnQgIFRTWFRleHRXaWR0aChYRm9udFN0cnVjdCosIGNvbnN0ICBjaGFyKiwgaW50KTsKK2V4dGVybiBpbnQgIFRTWFVuZ3JhYlBvaW50ZXIoRGlzcGxheSosIFRpbWUpOworZXh0ZXJuIGludCAgVFNYVW5ncmFiU2VydmVyKERpc3BsYXkqKTsKK2V4dGVybiBpbnQgIFRTWFVuaW5zdGFsbENvbG9ybWFwKERpc3BsYXkqLCBDb2xvcm1hcCk7CitleHRlcm4gaW50ICBUU1hVbm1hcFdpbmRvdyhEaXNwbGF5KiwgV2luZG93KTsKK2V4dGVybiBpbnQgIFRTWFdhcnBQb2ludGVyKERpc3BsYXkqLCBXaW5kb3csIFdpbmRvdywgaW50LCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBpbnQsIGludCk7CitleHRlcm4gaW50ICgqVFNYU3luY2hyb25pemUoRGlzcGxheSAqLCBCb29sKSkoRGlzcGxheSAqKTsKK2V4dGVybiB2b2lkIFRTX1hJbml0SW1hZ2VGdW5jUHRycyhYSW1hZ2UgKik7CisKKyNlbmRpZiAvKiBfX1dJTkVfVFNYTElCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHNfeHBtLmggYi9pbmNsdWRlL3RzX3hwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YWVlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RzX3hwbS5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBUaHJlYWQgc2FmZSB3cmFwcGVycyBhcm91bmQgeHBtIGNhbGxzLgorICogQWx3YXlzIGluY2x1ZGUgdGhpcyBmaWxlIGluc3RlYWQgb2YgPFgxMS94cG0uaD4uCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRvb2xzL21ha2VfWDExd3JhcHBlcnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBLcmlzdGlhbiBOaWVsc2VuCisgKi8KKworI2lmbmRlZiBfX1dJTkVfVFNYUE1fSAorI2RlZmluZSBfX1dJTkVfVFNYUE1fSAorCisjaW5jbHVkZSA8WDExL3hwbS5oPgorCitleHRlcm4gaW50IFRTWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEoRGlzcGxheSAqLCBEcmF3YWJsZSwgY2hhciAqKiwgUGl4bWFwICosIFBpeG1hcCAqLCBYcG1BdHRyaWJ1dGVzICopOworZXh0ZXJuIGludCBUU1hwbUF0dHJpYnV0ZXNTaXplKHZvaWQpOworCisjZW5kaWYgLyogX19XSU5FX1RTWFBNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHNfeHJlc291cmNlLmggYi9pbmNsdWRlL3RzX3hyZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYWNkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RzX3hyZXNvdXJjZS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBUaHJlYWQgc2FmZSB3cmFwcGVycyBhcm91bmQgWHJlc291cmNlIGNhbGxzLgorICogQWx3YXlzIGluY2x1ZGUgdGhpcyBmaWxlIGluc3RlYWQgb2YgPFgxMS9YcmVzb3VyY2UuaD4uCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRvb2xzL21ha2VfWDExd3JhcHBlcnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBLcmlzdGlhbiBOaWVsc2VuCisgKi8KKworI2lmbmRlZiBfX1dJTkVfVFNYUkVTT1VSQ0VfSAorI2RlZmluZSBfX1dJTkVfVFNYUkVTT1VSQ0VfSAorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHJlc291cmNlLmg+CisKK2V4dGVybiBYcm1RdWFyayAgVFNYcm1VbmlxdWVRdWFyayh2b2lkKTsKK2V4dGVybiBpbnQgICBUU1hybUdldFJlc291cmNlKFhybURhdGFiYXNlLCBjb25zdCAgY2hhciosIGNvbnN0ICBjaGFyKiwgY2hhcioqLCBYcm1WYWx1ZSopOworZXh0ZXJuIFhybURhdGFiYXNlICBUU1hybUdldEZpbGVEYXRhYmFzZShjb25zdCAgY2hhciopOworZXh0ZXJuIFhybURhdGFiYXNlICBUU1hybUdldFN0cmluZ0RhdGFiYXNlKGNvbnN0ICBjaGFyKik7CitleHRlcm4gdm9pZCAgVFNYcm1NZXJnZURhdGFiYXNlcyhYcm1EYXRhYmFzZSwgWHJtRGF0YWJhc2UqKTsKK2V4dGVybiB2b2lkICBUU1hybVBhcnNlQ29tbWFuZChYcm1EYXRhYmFzZSosIFhybU9wdGlvbkRlc2NMaXN0LCBpbnQsIGNvbnN0ICBjaGFyKiwgaW50KiwgY2hhcioqKTsKKworI2VuZGlmIC8qIF9fV0lORV9UU1hSRVNPVVJDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RzX3hzaG0uaCBiL2luY2x1ZGUvdHNfeHNobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTJiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RzX3hzaG0uaApAQCAtMCwwICsxLDIwIEBACisvKgorICogVGhyZWFkIHNhZmUgd3JhcHBlcnMgYXJvdW5kIFhTaG0gY2FsbHMuCisgKiBBbHdheXMgaW5jbHVkZSB0aGlzIGZpbGUgaW5zdGVhZCBvZiA8WDExL1hTaG0uaD4uCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRvb2xzL21ha2VfWDExd3JhcHBlcnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBLcmlzdGlhbiBOaWVsc2VuCisgKi8KKworI2lmbmRlZiBfX1dJTkVfVFNYU0hNX0gKKyNkZWZpbmUgX19XSU5FX1RTWFNITV9ICisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hTaG0uaD4KKworZXh0ZXJuIEJvb2wgVFNYU2htUXVlcnlFeHRlbnNpb24oRGlzcGxheSAqKTsKK2V4dGVybiBpbnQgVFNYU2htUGl4bWFwRm9ybWF0KERpc3BsYXkgKik7CitleHRlcm4gU3RhdHVzIFRTWFNobURldGFjaChEaXNwbGF5ICosIFhTaG1TZWdtZW50SW5mbyAqKTsKK2V4dGVybiBTdGF0dXMgVFNYU2htQXR0YWNoKERpc3BsYXkgKiwgWFNobVNlZ21lbnRJbmZvICopOworCisjZW5kaWYgLyogX19XSU5FX1RTWFNITV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RzX3h1dGlsLmggYi9pbmNsdWRlL3RzX3h1dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzZjIxMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHNfeHV0aWwuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogVGhyZWFkIHNhZmUgd3JhcHBlcnMgYXJvdW5kIFh1dGlsIGNhbGxzLgorICogQWx3YXlzIGluY2x1ZGUgdGhpcyBmaWxlIGluc3RlYWQgb2YgPFgxMS9YdXRpbC5oPi4KKyAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdG9vbHMvbWFrZV9YMTF3cmFwcGVycworICoKKyAqIENvcHlyaWdodCAxOTk4IEtyaXN0aWFuIE5pZWxzZW4KKyAqLworCisjaWZuZGVmIF9fV0lORV9UU1hVVElMX0gKKyNkZWZpbmUgX19XSU5FX1RTWFVUSUxfSAorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHJlc291cmNlLmg+CisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisKK2V4dGVybiBYQ2xhc3NIaW50ICogVFNYQWxsb2NDbGFzc0hpbnQodm9pZCk7CitleHRlcm4gWFNpemVIaW50cyAqIFRTWEFsbG9jU2l6ZUhpbnRzKHZvaWQpOworZXh0ZXJuIFhXTUhpbnRzICogVFNYQWxsb2NXTUhpbnRzKHZvaWQpOworZXh0ZXJuIGludCAgVFNYQ2xpcEJveChSZWdpb24sIFhSZWN0YW5nbGUqKTsKK2V4dGVybiBSZWdpb24gIFRTWENyZWF0ZVJlZ2lvbih2b2lkKTsKK2V4dGVybiBpbnQgIFRTWERlbGV0ZUNvbnRleHQoRGlzcGxheSosIFhJRCwgWENvbnRleHQpOworZXh0ZXJuIGludCAgVFNYRGVzdHJveVJlZ2lvbihSZWdpb24pOworZXh0ZXJuIGludCAgVFNYRW1wdHlSZWdpb24oUmVnaW9uKTsKK2V4dGVybiBpbnQgIFRTWEVxdWFsUmVnaW9uKFJlZ2lvbiwgUmVnaW9uKTsKK2V4dGVybiBpbnQgIFRTWEZpbmRDb250ZXh0KERpc3BsYXkqLCBYSUQsIFhDb250ZXh0LCBYUG9pbnRlciopOworZXh0ZXJuIGludCAgIFRTWEdldFdNU2l6ZUhpbnRzKERpc3BsYXkqLCBXaW5kb3csIFhTaXplSGludHMqLCBsb25nKiwgQXRvbSk7CitleHRlcm4gaW50ICBUU1hJbnRlcnNlY3RSZWdpb24oUmVnaW9uLCBSZWdpb24sIFJlZ2lvbik7CitleHRlcm4gaW50ICBUU1hMb29rdXBTdHJpbmcoWEtleUV2ZW50KiwgY2hhciosIGludCwgS2V5U3ltKiwgWENvbXBvc2VTdGF0dXMqKTsKK2V4dGVybiBpbnQgIFRTWE9mZnNldFJlZ2lvbihSZWdpb24sIGludCwgaW50KTsKK2V4dGVybiBpbnQgICBUU1hQb2ludEluUmVnaW9uKFJlZ2lvbiwgaW50LCBpbnQpOworZXh0ZXJuIFJlZ2lvbiAgVFNYUG9seWdvblJlZ2lvbihYUG9pbnQqLCBpbnQsIGludCk7CitleHRlcm4gaW50ICBUU1hSZWN0SW5SZWdpb24oUmVnaW9uLCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCAgVFNYU2F2ZUNvbnRleHQoRGlzcGxheSosIFhJRCwgWENvbnRleHQsIGNvbnN0ICBjaGFyKik7CitleHRlcm4gdm9pZCAgVFNYU2V0V01Qcm9wZXJ0aWVzKERpc3BsYXkqLCBXaW5kb3csIFhUZXh0UHJvcGVydHkqLCBYVGV4dFByb3BlcnR5KiwgY2hhcioqLCBpbnQsIFhTaXplSGludHMqLCBYV01IaW50cyosIFhDbGFzc0hpbnQqKTsKK2V4dGVybiB2b2lkICBUU1hTZXRXTVNpemVIaW50cyhEaXNwbGF5KiwgV2luZG93LCBYU2l6ZUhpbnRzKiwgQXRvbSk7CitleHRlcm4gaW50ICBUU1hTZXRSZWdpb24oRGlzcGxheSosIEdDLCBSZWdpb24pOworZXh0ZXJuIGludCAgVFNYU2hyaW5rUmVnaW9uKFJlZ2lvbiwgaW50LCBpbnQpOworZXh0ZXJuIGludCAgIFRTWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eShjaGFyKiosIGludCwgWFRleHRQcm9wZXJ0eSopOworZXh0ZXJuIGludCAgVFNYU3VidHJhY3RSZWdpb24oUmVnaW9uLCBSZWdpb24sIFJlZ2lvbik7CitleHRlcm4gaW50ICBUU1hVbmlvblJlY3RXaXRoUmVnaW9uKFhSZWN0YW5nbGUqLCBSZWdpb24sIFJlZ2lvbik7CitleHRlcm4gaW50ICBUU1hVbmlvblJlZ2lvbihSZWdpb24sIFJlZ2lvbiwgUmVnaW9uKTsKK2V4dGVybiBpbnQgIFRTWFhvclJlZ2lvbihSZWdpb24sIFJlZ2lvbiwgUmVnaW9uKTsKK2V4dGVybiBpbnQgVFNYRGVzdHJveUltYWdlKHN0cnVjdCBfWEltYWdlICopOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgVFNYR2V0UGl4ZWwoc3RydWN0IF9YSW1hZ2UgKiwgaW50LCBpbnQpOworZXh0ZXJuIGludCBUU1hQdXRQaXhlbChzdHJ1Y3QgX1hJbWFnZSAqLCBpbnQsIGludCwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gc3RydWN0IF9YSW1hZ2UgKiBUU1hTdWJJbWFnZShzdHJ1Y3QgX1hJbWFnZSAqLCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBUU1hBZGRQaXhlbChzdHJ1Y3QgX1hJbWFnZSAqLCBsb25nKTsKK2V4dGVybiBYQ29udGV4dCBUU1hVbmlxdWVDb250ZXh0KHZvaWQpOworCisjZW5kaWYgLyogX19XSU5FX1RTWFVUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90c3gxMWRlZnMuaCBiL2luY2x1ZGUvdHN4MTFkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczOTZhNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHN4MTFkZWZzLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIFRocmVhZCBzYWZlIHdyYXBwZXJzIGFyb3VuZCBYMTEgY2FsbHMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBLcmlzdGlhbiBOaWVsc2VuCisgKi8KKworI2lmbmRlZiBfX1dJTkVfVFNYMTFERUZTX0gKKyNkZWZpbmUgX19XSU5FX1RTWDExREVGU19ICisKKyNpbmNsdWRlICJ3aW5iYXNlLmgiCisKK2V4dGVybiBDUklUSUNBTF9TRUNUSU9OICpUU1gxMV9TZWN0aW9uUHRyOworCitleHRlcm4gaW50IFRTWDExX0luaXQodm9pZCk7CisKKyNkZWZpbmUgWDExX0xPQ0soKSBcCisgICAgKFRTWDExX1NlY3Rpb25QdHIgPyBFbnRlckNyaXRpY2FsU2VjdGlvbihUU1gxMV9TZWN0aW9uUHRyKSA6IDApCisKKyNkZWZpbmUgWDExX1VOTE9DSygpIFwKKyAgICAoVFNYMTFfU2VjdGlvblB0ciA/IExlYXZlQ3JpdGljYWxTZWN0aW9uKFRTWDExX1NlY3Rpb25QdHIpIDogMCkKKworI2VuZGlmICAvKiBfX1dJTkVfVFNYMTFERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmVyc2lvbi5oIGIvaW5jbHVkZS92ZXJzaW9uLmgKaW5kZXggNjg2YTkxMy4uMDU4MTc4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS92ZXJzaW9uLmgKQEAgLTEgKzEgQEAKLSNkZWZpbmUgV0lORV9SRUxFQVNFX0lORk8gIldpbmUgcmVsZWFzZSA5ODAxMTgiCisjZGVmaW5lIFdJTkVfUkVMRUFTRV9JTkZPICJXaW5lIHJlbGVhc2UgOTgwMjAxIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW4uaCBiL2luY2x1ZGUvd2luLmgKaW5kZXggNWE1N2I0My4uYzFmOTE4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW4uaAorKysgYi9pbmNsdWRlL3dpbi5oCkBAIC03LDcgKzcsNyBAQAogI2lmbmRlZiBfX1dJTkVfV0lOX0gKICNkZWZpbmUgX19XSU5FX1dJTl9ICiAKLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKIAogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgImNsYXNzLmgiCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbjE2ZHJ2LmggYi9pbmNsdWRlL3dpbjE2ZHJ2LmgKaW5kZXggZDIxOTM1OC4uZDM0ZTE3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW4xNmRydi5oCisrKyBiL2luY2x1ZGUvd2luMTZkcnYuaApAQCAtOTUsMTIgKzk1LDYgQEAKICAgICBUT1RBTF9QUklOVEVSX0RSSVZFUl9GVU5DVElPTlMgLyogaW5zZXJ0IGZ1bmN0aW9ucyBiZWZvcmUgaGVyZSAqLwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUFJJTlRFUl9GT05UU19JTkZPCi17Ci0gICAgTE9HRk9OVDE2CQlsZjsJCQkvKiBMb2dGb250IGluZm9tYXRpb24gKi8KLSAgICBURVhUTUVUUklDMTYJdG07CQkJLyogVGV4dCBtZXRyaWNzIGluZm9tYXRpb24gKi8KLX0gUFJJTlRFUl9GT05UU19JTkZPOwotCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExQU1RSIAlzekRyaXZlcjsJCS8qIERyaXZlciBuYW1lIGVnIEVQU09OICovCkBAIC0xMDgsOCArMTAyLDYgQEAKICAgICBXT1JECWRzX3JlZzsJCQkvKiBEUyBvZiBkcml2ZXIgKi8KICAgICBGQVJQUk9DMTYgCWZuW1RPVEFMX1BSSU5URVJfRFJJVkVSX0ZVTkNUSU9OU107CS8qIFByaW50ZXIgZnVuY3Rpb25zICovCiAgICAgaW50CQluVXNhZ2VDb3VudDsJCS8qIFVzYWdlIGNvdW50LCB1bmxvYWQgPT0gMCAqLwotICAgIGludAkJblByaW50ZXJGb250czsJCS8qIE51bWJlciBvZiBwcmludGVyIGZvbnRzICovCi0gICAgUFJJTlRFUl9GT05UU19JTkZPICpwYVByaW50ZXJGb250czsgLyogYXJyYXkgb2YgcHJpbnRlciBmb250cyAqLwogICAgIGludAkJbkluZGV4OwkJCS8qIEluZGV4IGluIGdsb2JhbCBkcml2ZXIgYXJyYXkgKi8KIH0gTE9BREVEX1BSSU5URVJfRFJJVkVSOwogCkBAIC0xNDMsMTAgKzEzNSw4IEBACiAKIHR5cGVkZWYgc3RydWN0IFdJTkVfRU5VTV9QUklOVEVSX0ZPTlRfQ0FMTEJBQ0sKIHsKLSAgICBEV09SRAltYWdpYzsJCQkvKiBtYWdpYyBudW1iZXIgKi8KLSAgICBpbnQgCW5Nb2RlOwkJCS8qIE1vZGUgMD1jb3VudCwgMT1zdG9yZSAqLwotICAgIGludCAJbkNvdW50OwkJCS8qIENhbGxiYWNrIGNvdW50ICovCi0gICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEOyAgICAJLyogUHJpbnRlciBkcml2ZXIgaW5mbyAqLworICAgIGludCAoKnByb2MpKExQRU5VTUxPR0ZPTlQxNiwgTFBORVdURVhUTUVUUklDMTYsIFVJTlQxNiwgTFBBUkFNKTsKKyAgICBMUEFSQU0gbHA7CiB9IFdFUEZDOwogCiAjZGVmaW5lIERSVk9CSl9QRU4gCTEgICAgICAgCkBAIC0xNjAsOSArMTUwLDkgQEAKICAgICBTRUdQVFIJCXNlZ3B0clBERVZJQ0U7CS8qIFBERVZJQ0UgdXNlZCBieSAxNiBiaXQgcHJpbnRlciBkcml2ZXJzICovCiAgICAgTE9HRk9OVDE2CQlsZjsJCS8qIEN1cnJlbnQgZm9udCBkZXRhaWxzICovCiAgICAgVEVYVE1FVFJJQzE2CXRtOwkJLyogQ3VycmVudCBmb250IG1ldHJpY3MgKi8KLSAgICBTRUdQVFIJCXNlZ3B0ckZvbnRJbmZvOyAvKiBDdXJyZW50IGZvbnQgcmVhbGl6ZWQgYnkgcHJpbnRlciBkcml2ZXIgKi8KLSAgICBTRUdQVFIJCXNlZ3B0ckJydXNoSW5mbzsgLyogQ3VycmVudCBicnVzaCByZWFsaXplZCBieSBwcmludGVyIGRyaXZlciAqLwotICAgIFNFR1BUUgkJc2VncHRyUGVuSW5mbzsgICAvKiBDdXJyZW50IHBlbiByZWFsaXplZCBieSBwcmludGVyIGRyaXZlciAqLworICAgIExQRk9OVElORk8xNiAgICAgICAJRm9udEluZm87ICAgICAgIC8qIEN1cnJlbnQgZm9udCByZWFsaXplZCBieSBwcmludGVyIGRyaXZlciAqLworICAgIExQTE9HQlJVU0gxNglCcnVzaEluZm87ICAgICAgLyogQ3VycmVudCBicnVzaCByZWFsaXplZCBieSBwcmludGVyIGRyaXZlciAqLworICAgIExQTE9HUEVOMTYJCVBlbkluZm87ICAgICAgICAvKiBDdXJyZW50IHBlbiByZWFsaXplZCBieSBwcmludGVyIGRyaXZlciAqLwogfSBXSU4xNkRSVl9QREVWSUNFOwogCiAvKgpAQCAtMTgzLDEwICsxNzMsMzMgQEAKIGV4dGVybiBCT09MMTYgUFJURFJWX0VudW1PYmooTFBQREVWSUNFIGxwRGVzdERldiwgV09SRCBpU3R5bGUsIEZBUlBST0MxNiBscGZuLCBMUFZPSUQgbHBiKTsKIGV4dGVybiBEV09SRCBQUlREUlZfRXh0VGV4dE91dChMUFBERVZJQ0UgbHBEZXN0RGV2LCBXT1JEIHdEZXN0WE9yZywgV09SRCB3RGVzdFlPcmcsCiAJCQkgICAgICAgUkVDVDE2ICpscENsaXBSZWN0LCBMUENTVFIgbHBTdHJpbmcsIFdPUkQgd0NvdW50LCAKLQkJCSAgICAgICBTRUdQVFIgbHBGb250SW5mbyxTRUdQVFIgbHBEcmF3TW9kZSwgCisJCQkgICAgICAgTFBGT05USU5GTzE2IGxwRm9udEluZm8sIFNFR1BUUiBscERyYXdNb2RlLCAKIAkJCSAgICAgICBTRUdQVFIgbHBUZXh0WEZvcm0sIFNIT1JUICpscENoYXJXaWR0aHMsCiAJCQkgICAgICAgUkVDVDE2ICogICAgIGxwT3BhcXVlUmVjdCwgV09SRCB3T3B0aW9ucyk7CiAKK2V4dGVybiBXT1JEIFBSVERSVl9PdXRwdXQoTFBQREVWSUNFIAkgbHBEZXN0RGV2LAorCQkJICBXT1JEIAkgd1N0eWxlLCAKKwkJCSAgV09SRCAJIHdDb3VudCwKKwkJCSAgUE9JTlQxNiAgICAgICAqcG9pbnRzLCAKKwkJCSAgTFBMT0dQRU4xNiAJIGxwUGVuLAorCQkJICBMUExPR0JSVVNIMTYJIGxwQnJ1c2gsCisJCQkgIFNFR1BUUgkgbHBEcmF3TW9kZSwKKwkJCSAgSFJHTjMyIAkgaENsaXBSZ24pOworCitEV09SRCBQUlREUlZfU3RyZXRjaEJsdChMUFBERVZJQ0UgbHBEZXN0RGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3RGVzdFgsIFdPUkQgd0Rlc3RZLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3RGVzdFhleHQsIFdPUkQgd0Rlc3RZZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIExQUERFVklDRSBscFNyY0RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgd1NyY1gsIFdPUkQgd1NyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHdTcmNYZXh0LCBXT1JEIHdTcmNZZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFJvcDMsCisgICAgICAgICAgICAgICAgICAgICAgICBMUExPR0JSVVNIMTYgbHBCcnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBscERyYXdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDE2ICpscENsaXBSZWN0KTsKKworZXh0ZXJuIFdPUkQgUFJURFJWX0dldENoYXJXaWR0aChMUFBERVZJQ0UgbHBEZXN0RGV2LCBMUElOVDMyIGxwQnVmZmVyLCAKKwkJICAgICAgV09SRCB3Rmlyc3RDaGFyLCBXT1JEIHdMYXN0Q2hhciwgTFBGT05USU5GTzE2IGxwRm9udEluZm8sCisJCSAgICAgIFNFR1BUUiBscERyYXdNb2RlLCBTRUdQVFIgbHBUZXh0WEZvcm0gKTsKIAogLyogV2luZSBkcml2ZXIgZnVuY3Rpb25zICovCiAKQEAgLTIwMywxMSArMjE2LDE0IEBACiBleHRlcm4gQk9PTDMyIFdJTjE2RFJWX0xpbmVUbyggREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5ICk7CiBleHRlcm4gQk9PTDMyIFdJTjE2RFJWX01vdmVUb0V4KERDICpkYyxJTlQzMiB4LElOVDMyIHksTFBQT0lOVDMyIHB0KTsKIGV4dGVybiBCT09MMzIgV0lOMTZEUlZfUG9seWdvbihEQyAqZGMsIExQUE9JTlQzMiBwdCwgSU5UMzIgY291bnQgKTsKK2V4dGVybiBCT09MMzIgV0lOMTZEUlZfUG9seWxpbmUoREMgKmRjLCBMUFBPSU5UMzIgcHQsIElOVDMyIGNvdW50ICk7CiBleHRlcm4gQk9PTDMyIFdJTjE2RFJWX1JlY3RhbmdsZShEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSk7CiBleHRlcm4gSEdESU9CSjMyIFdJTjE2RFJWX1NlbGVjdE9iamVjdCggREMgKmRjLCBIR0RJT0JKMzIgaGFuZGxlICk7CiBleHRlcm4gQk9PTDMyIFdJTjE2RFJWX1BhdEJsdCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQsIERXT1JEIHJvcCApOwotCitleHRlcm4gQk9PTDMyIFdJTjE2RFJWX0VsbGlwc2UoREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20pOworZXh0ZXJuIEJPT0wzMiBXSU4xNkRSVl9FbnVtRGV2aWNlRm9udHMoIERDKiBkYywgTFBMT0dGT05UMTYgcGxmLCAKKwkJCQkgICAgICAgIERFVklDRUZPTlRFTlVNUFJPQyBwcm9jLCBMUEFSQU0gbHAgKTsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5jb24uaCBiL2luY2x1ZGUvd2luY29uLmgKaW5kZXggMGViODRhOS4uYjdjNDZlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5jb24uaAorKysgYi9pbmNsdWRlL3dpbmNvbi5oCkBAIC01NCw1ICs1NCw2NCBAQAogICAgIENPT1JEICAgICAgIGR3TWF4aW11bVdpbmRvd1NpemU7CiB9IENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPLCpMUENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPOwogCit0eXBlZGVmIHN0cnVjdCB0YWdDSEFSX0lORk8KK3sKKyAgICB1bmlvbgorCXsKKwlXQ0hBUiBVbmljb2RlQ2hhcjsKKwlDSEFSIEFzY2lpQ2hhcjsKKwl9IENoYXI7CisgICAgV09SRAlBdHRyaWJ1dGVzOworfSBDSEFSX0lORk8sKkxQQ0hBUl9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB0YWdLRVlfRVZFTlRfUkVDT1JECit7CisgICAgQk9PTDMyCWJLZXlEb3duOworICAgIFdPUkQJd1JlcGVhdENvdW50OworICAgIFdPUkQJd1ZpcnR1YWxLZXlDb2RlOworICAgIFdPUkQJd1ZpcnR1YWxTY2FuQ29kZTsKKyAgICB1bmlvbgorCXsKKwlXQ0hBUiBVbmlDb2RlQ2hhcjsKKwlDSEFSIEFzY2lpQ2hhcjsKKwl9IHVDaGFyOworICAgIERXT1JECWR3Q29udHJvbEtleVN0YXRlOworfSBLRVlfRVZFTlRfUkVDT1JELCpMUEtFWV9FVkVOVF9SRUNPUkQ7CisKK3R5cGVkZWYgc3RydWN0IHRhZ01PVVNFX0VWRU5UX1JFQ09SRAoreworICAgIENPT1JECWR3TW91c2VQb3NpdGlvbjsKKyAgICBEV09SRAlkd0J1dHRvblN0YXRlOworICAgIERXT1JECWR3Q29udHJvbEtleVN0YXRlOworICAgIERXT1JECWR3RXZlbnRGbGFnczsKK30gTU9VU0VfRVZFTlRfUkVDT1JELCpMUE1PVVNFX0VWRU5UX1JFQ09SRDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnV0lORE9XX0JVRkZFUl9TSVpFX1JFQ09SRAoreworICAgIENPT1JECWR3U2l6ZTsKK30gV0lORE9XX0JVRkZFUl9TSVpFX1JFQ09SRCwqTFBXSU5ET1dfQlVGRkVSX1NJWkVfUkVDT1JEOworCit0eXBlZGVmIHN0cnVjdCB0YWdNRU5VX0VWRU5UX1JFQ09SRAoreworICAgIFVJTlQzMglkd0NvbW1hbmRJZDsgLyogcGVyaGFwcyBVSU5UMTYgPz8/ICovCit9IE1FTlVfRVZFTlRfUkVDT1JELCpMUE1FTlVfRVZFTlRfUkVDT1JEOworCit0eXBlZGVmIHN0cnVjdCB0YWdGT0NVU19FVkVOVF9SRUNPUkQKK3sKKyAgICBCT09MMzIgICAgICBiU2V0Rm9jdXM7IC8qIHBlcmhhcHMgQk9PTDE2ID8/PyAqLworfSBGT0NVU19FVkVOVF9SRUNPUkQsKkxQRk9DVVNfRVZFTlRfUkVDT1JEOworCit0eXBlZGVmIHN0cnVjdCB0YWdJTlBVVF9SRUNPUkQKK3sKKyAgICBXT1JECQlFdmVudFR5cGU7CisgICAgdW5pb24KKwl7CisJS0VZX0VWRU5UX1JFQ09SRCBLZXlFdmVudDsKKwlNT1VTRV9FVkVOVF9SRUNPUkQgTW91c2VFdmVudDsKKwlXSU5ET1dfQlVGRkVSX1NJWkVfUkVDT1JEIFdpbmRvd0J1ZmZlclNpemVFdmVudDsKKwlNRU5VX0VWRU5UX1JFQ09SRCBNZW51RXZlbnQ7CisJRk9DVVNfRVZFTlRfUkVDT1JEIEZvY3VzRXZlbnQ7CisJfSBFdmVudDsKK30gSU5QVVRfUkVDT1JELCpMUElOUFVUX1JFQ09SRDsKIAogI2VuZGlmICAvKiBfX1dJTkVfV0lOQ09OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggNDNhMDBiOC4uMTFmN2Q2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTMwNSw2ICszMDUsMTIgQEAKICNkZWZpbmUgUkRXX0ZSQU1FICAgICAgICAgICAgMHgwNDAwCiAjZGVmaW5lIFJEV19OT0ZSQU1FICAgICAgICAgIDB4MDgwMAogCisvKiBkZWJ1ZyBmbGFncyAqLworI2RlZmluZSBEQkdGSUxMX0FMTE9DICAweGZkCisjZGVmaW5lIERCR0ZJTExfRlJFRSAgIDB4ZmIKKyNkZWZpbmUgREJHRklMTF9CVUZGRVIgMHhmOQorI2RlZmluZSBEQkdGSUxMX1NUQUNLICAweGY3CisKICAgLyogV01fV0lORE9XUE9TQ0hBTkdJTkcvQ0hBTkdFRCBzdHJ1Y3QgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xMTY4LDE2ICsxMTc0LDE2IEBACiAgICAgQ0hBUiAgZGZVbmRlcmxpbmU7CiAgICAgQ0hBUiAgZGZTdHJpa2VPdXQ7CiAgICAgSU5UMTYgZGZXZWlnaHQ7Ci0gICAgQ0hBUiAgZGZDSEFSU2V0OworICAgIENIQVIgIGRmQ2hhclNldDsKICAgICBJTlQxNiBkZlBpeFdpZHRoOwogICAgIElOVDE2IGRmUGl4SGVpZ2h0OwogICAgIENIQVIgIGRmUGl0Y2hBbmRGYW1pbHk7CiAgICAgSU5UMTYgZGZBdmdXaWR0aDsKICAgICBJTlQxNiBkZk1heFdpZHRoOwotICAgIENIQVIgIGRmRmlyc3RDSEFSOwotICAgIENIQVIgIGRmTGFzdENIQVI7Ci0gICAgQ0hBUiAgZGZEZWZhdWx0Q0hBUjsKLSAgICBDSEFSICBkZkJyZWFrQ0hBUjsKKyAgICBDSEFSICBkZkZpcnN0Q2hhcjsKKyAgICBDSEFSICBkZkxhc3RDaGFyOworICAgIENIQVIgIGRmRGVmYXVsdENoYXI7CisgICAgQ0hBUiAgZGZCcmVha0NoYXI7CiAgICAgSU5UMTYgZGZXaWR0aEJ5dGVzOwogICAgIExPTkcgIGRmRGV2aWNlOwogICAgIExPTkcgIGRmRmFjZTsKQEAgLTE2NTksNiArMTY2NSwxMCBAQAogI2RlZmluZSBHTV9BRFZBTkNFRCAgICAgICAyCiAjZGVmaW5lIEdNX0xBU1QgICAgICAgICAgIDIKIAorICAvKiBBcmMgZGlyZWN0aW9uIG1vZGVzICovCisjZGVmaW5lIEFEX0NPVU5URVJDTE9DS1dJU0UgMQorI2RlZmluZSBBRF9DTE9DS1dJU0UgICAgICAgIDIKKwogICAvKiBNYXAgbW9kZXMgKi8KICNkZWZpbmUgTU1fVEVYVAkJICAxCiAjZGVmaW5lIE1NX0xPTUVUUklDCSAgMgpAQCAtNTQ2Niw2ICs1NDc2LDMxIEBACiBERUNMX1dJTkVMSUJfVFlQRV9BVyhNU0dCT1hQQVJBTVMpOwogREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNU0dCT1hQQVJBTVMpOwogCisvKiBmb3IgV09XSGFuZGxlezE2LDMyfSAqLwordHlwZWRlZiBlbnVtIF9XT1dfSEFORExFX1RZUEUgeyAvKiBXT1cgKi8KKyAgICBXT1dfVFlQRV9IV05ELAorICAgIFdPV19UWVBFX0hNRU5VLAorICAgIFdPV19UWVBFX0hEV1AsCisgICAgV09XX1RZUEVfSERST1AsCisgICAgV09XX1RZUEVfSERDLAorICAgIFdPV19UWVBFX0hGT05ULAorICAgIFdPV19UWVBFX0hNRVRBRklMRSwKKyAgICBXT1dfVFlQRV9IUkdOLAorICAgIFdPV19UWVBFX0hCSVRNQVAsCisgICAgV09XX1RZUEVfSEJSVVNILAorICAgIFdPV19UWVBFX0hQQUxFVFRFLAorICAgIFdPV19UWVBFX0hQRU4sCisgICAgV09XX1RZUEVfSEFDQ0VMLAorICAgIFdPV19UWVBFX0hUQVNLLAorICAgIFdPV19UWVBFX0ZVTExIV05ECit9IFdPV19IQU5ETEVfVFlQRTsKKworLyogV09XQ2FsbGJhY2sxNkV4IGRlZmluZXMgKi8KKyNkZWZpbmUgV0NCMTZfTUFYX0NCQVJHUwkxNgorLyogLi4uIGR3RmxhZ3MgKi8KKyNkZWZpbmUgV0NCMTZfUEFTQ0FMCQkweDAKKyNkZWZpbmUgV0NCMTZfQ0RFQ0wJCTB4MQorCiAjcHJhZ21hIHBhY2soNCkKIAogLyogRGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgdGhhdCBleGlzdCBvbmx5IGluIFdpbjE2ICovCkBAIC01NTQ1LDYgKzU1ODAsNyBAQAogRFdPUkQgICAgICAgV0lOQVBJIEdsb2JhbERPU0FsbG9jKERXT1JEKTsKIFdPUkQgICAgICAgIFdJTkFQSSBHbG9iYWxET1NGcmVlKFdPUkQpOwogdm9pZCAgICAgICAgV0lOQVBJIEdsb2JhbEZyZWVBbGwoSEdMT0JBTDE2KTsKK0RXT1JEICAgICAgIFdJTkFQSSBHbG9iYWxIYW5kbGVOb1JJUChXT1JEKTsKIEhHTE9CQUwxNiAgIFdJTkFQSSBHbG9iYWxMUlVOZXdlc3QoSEdMT0JBTDE2KTsKIEhHTE9CQUwxNiAgIFdJTkFQSSBHbG9iYWxMUlVPbGRlc3QoSEdMT0JBTDE2KTsKIFZPSUQgICAgICAgIFdJTkFQSSBHbG9iYWxOb3RpZnkoRkFSUFJPQzE2KTsKQEAgLTU2NTcsNiArNTY5Myw3IEBACiBIQU5ETEUzMiAgICBXSU5BUEkgQ3JlYXRlU2VtYXBob3JlMzJBKExQU0VDVVJJVFlfQVRUUklCVVRFUyxMT05HLExPTkcsTFBDU1RSKTsKIEhBTkRMRTMyICAgIFdJTkFQSSBDcmVhdGVTZW1hcGhvcmUzMlcoTFBTRUNVUklUWV9BVFRSSUJVVEVTLExPTkcsTE9ORyxMUENXU1RSKTsKICNkZWZpbmUgICAgIENyZWF0ZVNlbWFwaG9yZSBXSU5FTElCX05BTUVfQVcoQ3JlYXRlU2VtYXBob3JlKQorSEFORExFMzIgICAgV0lOQVBJIENyZWF0ZVRocmVhZChMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsTFBUSFJFQURfU1RBUlRfUk9VVElORSxMUFZPSUQsRFdPUkQsTFBEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgRGVzdHJveUFjY2VsZXJhdG9yVGFibGUoSEFDQ0VMMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIERpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMoSE1PRFVMRTMyKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBEb3NEYXRlVGltZVRvRmlsZVRpbWUoV09SRCxXT1JELExQRklMRVRJTUUpOwpAQCAtNTczOCw2ICs1Nzc1LDcgQEAKIERXT1JEICAgICAgIFdJTkFQSSBHZXRGdWxsUGF0aE5hbWUzMkEoTFBDU1RSLERXT1JELExQU1RSLExQU1RSKik7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0RnVsbFBhdGhOYW1lMzJXKExQQ1dTVFIsRFdPUkQsTFBXU1RSLExQV1NUUiopOwogI2RlZmluZSAgICAgR2V0RnVsbFBhdGhOYW1lIFdJTkVMSUJfTkFNRV9BVyhHZXRGdWxsUGF0aE5hbWUpCitJTlQzMiAgICAgICBXSU5BUEkgR2V0R3JhcGhpY3NNb2RlKEhEQzMyKTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRMYXJnZXN0Q29uc29sZVdpbmRvd1NpemUoSEFORExFMzIpOwogVk9JRCAgICAgICAgV0lOQVBJIEdldExvY2FsVGltZShMUFNZU1RFTVRJTUUpOwogRFdPUkQgICAgICAgV0lOQVBJIEdldExvZ2ljYWxEcml2ZXModm9pZCk7CkBAIC01Nzc2LDYgKzU4MTQsNyBAQAogQk9PTDMyICAgICAgV0lOQVBJIEdldFVzZXJOYW1lMzJXKExQV1NUUixMUERXT1JEKTsKICNkZWZpbmUgICAgIEdldFVzZXJOYW1lIFdJTkVMSUJfTkFNRV9BVyhHZXRVc2VyTmFtZSkKIERXT1JEICAgICAgIFdJTkFQSSBHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQoSFdORDMyLExQRFdPUkQpOworQk9PTDMyICAgICAgV0lOQVBJIEdldFdvcmxkVHJhbnNmb3JtKEhEQzMyLExQWEZPUk0pOwogVk9JRCAgICAgICAgV0lOQVBJIEdsb2JhbE1lbW9yeVN0YXR1cyhMUE1FTU9SWVNUQVRVUyk7CiBMUFZPSUQgICAgICBXSU5BUEkgSGVhcEFsbG9jKEhBTkRMRTMyLERXT1JELERXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBIZWFwQ29tcGFjdChIQU5ETEUzMixEV09SRCk7CkBAIC01ODc3LDYgKzU5MTYsNyBAQAogRFdPUkQgICAgICAgV0lOQVBJIFNldEZpbGVQb2ludGVyKEhGSUxFMzIsTE9ORyxMUExPTkcsRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFNldEZpbGVUaW1lKEhGSUxFMzIsY29uc3QgRklMRVRJTUUqLGNvbnN0IEZJTEVUSU1FKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSUxFVElNRSopOworSU5UMzIgICAgICAgV0lOQVBJIFNldEdyYXBoaWNzTW9kZShIREMzMixJTlQzMik7CiBWT0lEICAgICAgICBXSU5BUEkgU2V0TGFzdEVycm9yRXgoRFdPUkQsRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFNldE1lbnVJdGVtSW5mbzMyQShITUVOVTMyLFVJTlQzMixCT09MMzIsY29uc3QgTUVOVUlURU1JTkZPMzJBKik7CiBCT09MMzIgICAgICBXSU5BUEkgU2V0TWVudUl0ZW1JbmZvMzJXKEhNRU5VMzIsVUlOVDMyLEJPT0wzMixjb25zdCBNRU5VSVRFTUlORk8zMlcqKTsKQEAgLTU4ODcsNiArNTkyNyw3IEBACiBCT09MMzIgICAgICBXSU5BUEkgU2V0U3lzdGVtVGltZShjb25zdCBTWVNURU1USU1FKik7CiBCT09MMzIgICAgICBXSU5BUEkgU2V0VGhyZWFkUHJpb3JpdHkoSEFORExFMzIsSU5UMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIFNldFRpbWVab25lSW5mb3JtYXRpb24oY29uc3QgTFBUSU1FX1pPTkVfSU5GT1JNQVRJT04pOworQk9PTDMyICAgICAgV0lOQVBJIFNldFdvcmxkVHJhbnNmb3JtKEhEQzMyLGNvbnN0IFhGT1JNKik7CiBWT0lEICAgICAgICBXSU5BUEkgU2xlZXAoRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKGNvbnN0IFNZU1RFTVRJTUUqLExQRklMRVRJTUUpOwogQk9PTDMyICAgICAgV0lOQVBJIFRyYWNrUG9wdXBNZW51RXgoSE1FTlUzMixVSU5UMzIsSU5UMzIsSU5UMzIsSFdORDMyLApAQCAtNTkxMCwxMiArNTk1MSwxNiBAQAogRFdPUkQgICAgICAgV0lOQVBJIFdhaXRGb3JNdWx0aXBsZU9iamVjdHNFeChEV09SRCxjb25zdCBIQU5ETEUzMiosQk9PTDMyLERXT1JELEJPT0wzMik7CiBEV09SRCAgICAgICBXSU5BUEkgV2FpdEZvclNpbmdsZU9iamVjdChIQU5ETEUzMixEV09SRCk7CiBEV09SRCAgICAgICBXSU5BUEkgV2FpdEZvclNpbmdsZU9iamVjdEV4KEhBTkRMRTMyLERXT1JELEJPT0wzMik7CitTRUdQVFIgICAgICBXSU5BUEkgV09XR2xvYmFsQWxsb2NMb2NrMTYoRFdPUkQsRFdPUkQsSEdMT0JBTDE2Kik7CitEV09SRCAgICAgICBXSU5BUEkgV09XQ2FsbGJhY2sxNihGQVJQUk9DMTYsRFdPUkQpOworQk9PTDMyICAgICAgV0lOQVBJIFdPV0NhbGxiYWNrMTZFeChGQVJQUk9DMTYsRFdPUkQsRFdPUkQsTFBWT0lELExQRFdPUkQpOworSEFORExFMzIgICAgV0lOQVBJIFdPV0hhbmRsZTMyKFdPUkQsV09XX0hBTkRMRV9UWVBFKTsKK1dPUkQgICAgICAgIFdJTkFQSSBXT1dIYW5kbGUxNihIQU5ETEUzMixXT1dfSEFORExFX1RZUEUpOwogQk9PTDMyICAgICAgV0lOQVBJIFdyaXRlQ29uc29sZTMyQShIQU5ETEUzMixMUENWT0lELERXT1JELExQRFdPUkQsTFBWT0lEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUNvbnNvbGUzMlcoSEFORExFMzIsTFBDVk9JRCxEV09SRCxMUERXT1JELExQVk9JRCk7CiAjZGVmaW5lICAgICBXcml0ZUNvbnNvbGUgV0lORUxJQl9OQU1FX0FXKFdyaXRlQ29uc29sZSkKIEJPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUZpbGUoSEZJTEUzMixMUFZPSUQsRFdPUkQsTFBEV09SRCxMUE9WRVJMQVBQRUQpOwogCi0KIC8qIERlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIHRoZSBzYW1lIGluIFdpbjE2IGFuZCBXaW4zMiAqLwogCiBWT0lEICAgICAgICBXSU5BUEkgQ2xvc2VTb3VuZChWT0lEKTsKQEAgLTY2MzQsNiArNjY3OSw5IEBACiBEV09SRCAgICAgICBXSU5BUEkgR2V0QXBwQ29tcGF0RmxhZ3MxNihIVEFTSzE2KTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRBcHBDb21wYXRGbGFnczMyKEhUQVNLMzIpOwogI2RlZmluZSAgICAgR2V0QXBwQ29tcGF0RmxhZ3MgV0lORUxJQl9OQU1FKEdldEFwcENvbXBhdEZsYWdzKQorSU5UMTYgICAgICAgV0lOQVBJIEdldEFyY0RpcmVjdGlvbjE2KEhEQzE2KTsKK0lOVDMyICAgICAgIFdJTkFQSSBHZXRBcmNEaXJlY3Rpb24zMihIREMzMik7CisjZGVmaW5lICAgICBHZXRBcmNEaXJlY3Rpb24gV0lORUxJQl9OQU1FKEdldEFyY0RpcmVjdGlvbikKIFdPUkQgICAgICAgIFdJTkFQSSBHZXRBc3luY0tleVN0YXRlMTYoSU5UMTYpOwogV09SRCAgICAgICAgV0lOQVBJIEdldEFzeW5jS2V5U3RhdGUzMihJTlQzMik7CiAjZGVmaW5lICAgICBHZXRBc3luY0tleVN0YXRlIFdJTkVMSUJfTkFNRShHZXRBc3luY0tleVN0YXRlKQpAQCAtNzMxNCw2ICs3MzYyLDEwIEBACiBISUNPTjMyICAgICBXSU5BUEkgTG9hZEljb24zMkEoSElOU1RBTkNFMzIsTFBDU1RSKTsKIEhJQ09OMzIgICAgIFdJTkFQSSBMb2FkSWNvbjMyVyhISU5TVEFOQ0UzMixMUENXU1RSKTsKICNkZWZpbmUgICAgIExvYWRJY29uIFdJTkVMSUJfTkFNRV9BVyhMb2FkSWNvbikKK0hBTkRMRTE2ICAgIFdJTkFQSSBMb2FkSW1hZ2UxNihISU5TVEFOQ0UxNixMUENTVFIsVUlOVDE2LElOVDE2LElOVDE2LFVJTlQxNik7CitIQU5ETEUzMiAgICBXSU5BUEkgTG9hZEltYWdlMzJBKEhJTlNUQU5DRTMyLExQQ1NUUixVSU5UMzIsSU5UMzIsSU5UMzIsVUlOVDMyKTsKK0hBTkRMRTMyICAgIFdJTkFQSSBMb2FkSW1hZ2UzMlcoSElOU1RBTkNFMzIsTFBDV1NUUixVSU5UMzIsSU5UMzIsSU5UMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgIExvYWRJbWFnZSBXSU5FTElCX05BTUVfQVcoTG9hZEltYWdlKQogSElOU1RBTkNFMTYgV0lOQVBJIExvYWRMaWJyYXJ5MTYoTFBDU1RSKTsKIEhNT0RVTEUzMiAgIFdJTkFQSSBMb2FkTGlicmFyeTMyQShMUENTVFIpOwogSE1PRFVMRTMyICAgV0lOQVBJIExvYWRMaWJyYXJ5MzJXKExQQ1dTVFIpOwpAQCAtNzY5Nyw2ICs3NzQ5LDkgQEAKIEhXTkQxNiAgICAgIFdJTkFQSSBTZXRBY3RpdmVXaW5kb3cxNihIV05EMTYpOwogSFdORDMyICAgICAgV0lOQVBJIFNldEFjdGl2ZVdpbmRvdzMyKEhXTkQzMik7CiAjZGVmaW5lICAgICBTZXRBY3RpdmVXaW5kb3cgV0lORUxJQl9OQU1FKFNldEFjdGl2ZVdpbmRvdykKK0lOVDE2ICAgICAgIFdJTkFQSSBTZXRBcmNEaXJlY3Rpb24xNihIREMxNixJTlQxNik7CitJTlQzMiAgICAgICBXSU5BUEkgU2V0QXJjRGlyZWN0aW9uMzIoSERDMzIsSU5UMzIpOworI2RlZmluZSAgICAgU2V0QXJjRGlyZWN0aW9uIFdJTkVMSUJfTkFNRShTZXRBcmNEaXJlY3Rpb24pCiBMT05HICAgICAgICBXSU5BUEkgU2V0Qml0bWFwQml0czE2KEhCSVRNQVAxNixMT05HLExQQ1ZPSUQpOwogTE9ORyAgICAgICAgV0lOQVBJIFNldEJpdG1hcEJpdHMzMihIQklUTUFQMzIsTE9ORyxMUENWT0lEKTsKICNkZWZpbmUgICAgIFNldEJpdG1hcEJpdHMgV0lORUxJQl9OQU1FKFNldEJpdG1hcEJpdHMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbm50LmggYi9pbmNsdWRlL3dpbm50LmgKaW5kZXggYmUwMDc4NC4uZTE4ZWViMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5udC5oCisrKyBiL2luY2x1ZGUvd2lubnQuaApAQCAtMjUsMTAgKzI1LDEzIEBACiAjZGVmaW5lIEhFQVBfV0lORV9DT0RFU0VHICAgICAgICAgICAgICAgMHgwMjAwMDAwMCAgLyogTm90IGEgV2luMzIgZmxhZyAqLwogCiAvKiBQcm9jZXNzb3IgZmVhdHVyZSBmbGFncy4gICovCi0jZGVmaW5lIFBGX0ZMT0FUSU5HX1BPSU5UX1BSRUNJU0lPTl9FUlJBVEEgICAgMAotI2RlZmluZSBQRl9GTE9BVElOR19QT0lOVF9FTVVMQVRFRCAgICAgICAgICAgIDEKLSNkZWZpbmUgUEZfQ09NUEFSRV9FWENIQU5HRV9ET1VCTEUgICAgICAgICAgICAyCi0jZGVmaW5lIFBGX01NWF9JTlNUUlVDVElPTlNfQVZBSUxBQkxFICAgICAgICAgMworI2RlZmluZSBQRl9GTE9BVElOR19QT0lOVF9QUkVDSVNJT05fRVJSQVRBCTAKKyNkZWZpbmUgUEZfRkxPQVRJTkdfUE9JTlRfRU1VTEFURUQJCTEKKyNkZWZpbmUgUEZfQ09NUEFSRV9FWENIQU5HRV9ET1VCTEUJCTIKKyNkZWZpbmUgUEZfTU1YX0lOU1RSVUNUSU9OU19BVkFJTEFCTEUJCTMKKyNkZWZpbmUgUEZfUFBDX01PVkVNRU1fNjRCSVRfT0sJCQk0CisjZGVmaW5lIFBGX0FMUEhBX0JZVEVfSU5TVFJVQ1RJT05TCQk1CisKIAogLyogVGhlIFdpbjMyIHJlZ2lzdGVyIGNvbnRleHQgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5zb2NrLmggYi9pbmNsdWRlL3dpbnNvY2suaAppbmRleCBjYTczNTdjLi42M2ExODc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnNvY2suaAorKysgYi9pbmNsdWRlL3dpbnNvY2suaApAQCAtNDc1LDggKzQ3NSw4IEBACiAKIC8qIHdzXy4uLiBzdHJ1Y3QgY29udmVyc2lvbiBmbGFncyAqLwogCi0jZGVmaW5lIFdTX0RVUF9MSU5FQVIJCTB4MDAwMAotI2RlZmluZSBXU19EVVBfTkFUSVZFICAgICAgICAgICAweDAwMDEJCS8qIG5hdGl2ZSBzdHJ1Y3R1cmUgZm9ybWF0IChub3Qgd3NfLi4pICovCisjZGVmaW5lIFdTX0RVUF9MSU5FQVIJCTB4MDAwMQorI2RlZmluZSBXU19EVVBfTkFUSVZFICAgICAgICAgICAweDAwMDAJCS8qIG5vdCB1c2VkIGFueW1vcmUgKi8KICNkZWZpbmUgV1NfRFVQX09GRlNFVCAgICAgICAgICAgMHgwMDAyCQkvKiBpbnRlcm5hbCBwb2ludGVycyBhcmUgb2Zmc2V0cyAqLwogI2RlZmluZSBXU19EVVBfU0VHUFRSICAgICAgICAgICAweDAwMDQJCS8qIGludGVybmFsIHBvaW50ZXJzIGFyZSBTRUdQVFJzICovCiAJCQkJCQkvKiBieSBkZWZhdWx0LCBpbnRlcm5hbCBwb2ludGVycyBhcmUgbGluZWFyICovCkBAIC01MzcsNyArNTM3LDcgQEAKICAgd3Nfc2VsZWN0X29wKglwc29wOwogfSB3c19zb2NrZXQ7CiAKLSNkZWZpbmUgV1NfTUFYX1NPQ0tFVFNfUEVSX1RIUkVBRCAgICAgICAxNgorI2RlZmluZSBXU19NQVhfU09DS0VUU19QRVJfUFJPQ0VTUyAgICAgIDE2CiAjZGVmaW5lIFdTX01BWF9VRFBfREFUQUdSQU0gICAgICAgICAgICAgMTAyNAogCiAjZGVmaW5lIFdTSV9CTE9DS0lOR0NBTEwJMHgwMDAwMDAwMQkvKiBwZXItdGhyZWFkIGluZm8gZmxhZ3MgKi8KQEAgLTU1Niw3ICs1NTYsNyBAQAogICBjaGFyKgkJCWJ1ZmZlcjsJCQkvKiBhbGxvY2F0ZWQgZnJvbSBTRUdQVFIgaGVhcCAqLwogICBjaGFyKgkJCWRidWZmZXI7CQkvKiBidWZmZXIgZm9yIGR1bW1pZXMgKDMyIGJ5dGVzKSAqLwogCi0gIHdzX3NvY2tldAkJc29ja1tXU19NQVhfU09DS0VUU19QRVJfVEhSRUFEXTsKKyAgd3Nfc29ja2V0CQlzb2NrW1dTX01BWF9TT0NLRVRTX1BFUl9QUk9DRVNTXTsKICAgRFdPUkQJCQlibG9ja2luZ19ob29rOwogICBIVEFTSzE2ICAgICAgICAgICAgICAgdGlkOyAgICAJCS8qIG93bmluZyB0YXNrIGlkIC0gcHJvY2VzcyBtaWdodCBiZSBiZXR0ZXIgKi8KIH0gV1NJTkZPLCAqTFBXU0lORk87CkBAIC01NzksNyArNTc5LDcgQEAKIAogdm9pZCBXSU5TT0NLX2NhbmNlbF90YXNrX2FvcHMoSFRBU0sxNiwgdm9pZCAoKl9fbWVtZnJlZSkodm9pZCopICk7CiAKLUJPT0wzMiBXSU5TT0NLX0hhbmRsZUlPKGludCogZmRfbWF4LCBpbnQgbnVtX3BlbmRpbmcsIGZkX3NldCBpb19zZXRbM10gKTsKK0JPT0wzMiBXSU5TT0NLX0hhbmRsZUlPKGludCogZmRfbWF4LCBpbnQgbnVtX3BlbmRpbmcsIGZkX3NldCBwZW5kaW5nX3NldFszXSwgZmRfc2V0IG1hc3Rlcl9zZXRbM10gKTsKIHZvaWQgICBXSU5TT0NLX1NodXRkb3duKHZvaWQpOwogVUlOVDE2IHdzYUVycm5vKHZvaWQpOwogVUlOVDE2IHdzYUhlcnJubyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd25ldC5oIGIvaW5jbHVkZS93bmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2Yjk1MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvd25ldC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiBEZWZpbml0aW9ucyBmb3Igd2luZG93cyBuZXR3b3JrIHNlcnZpY2UKKyAqIAorICogQ29weXJpZ2h0IDE5OTcgQW5kcmVhcyBNb2hyCisgKi8KKyNpZm5kZWYgX19XSU5FX1dORVRfSAorI2RlZmluZSBfX1dJTkVfV05FVF9ICisKKyNkZWZpbmUgV05fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBXTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFdOX05FVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV05fTU9SRV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBXTl9CQURfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdOX0JBRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgV05fQkFEX1BBU1NXT1JEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBXTl9BQ0NFU1NfREVOSUVEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIFdOX0ZVTkNUSU9OX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV05fV0lORE9XU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBXTl9CQURfVVNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIFdOX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEIKKyNkZWZpbmUgV05fQ0FOQ0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBXTl9DT05USU5VRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBECisjZGVmaW5lIFdOX05PVF9DT05ORUNURUQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV05fT1BFTl9GSUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMQorI2RlZmluZSBXTl9CQURfTkVUTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMyCisjZGVmaW5lIFdOX0JBRF9MT0NBTE5BTUUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzMKKyNkZWZpbmUgV05fQUxSRUFEWV9DT05ORUNURUQgICAgICAgICAgICAgICAgICAgIDB4MDAzNAorI2RlZmluZSBXTl9ERVZJQ0VfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM1CisjZGVmaW5lIFdOX0NPTk5FQ1RJT05fQ0xPU0VEICAgICAgICAgICAgICAgICAgICAweDAwMzYKKyNkZWZpbmUgV05fTk9fTkVUV09SSyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk9SX05PX05FVFdPUksKKworI2RlZmluZSBXTk5DX1NQRUNfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTk5DX05FVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBXTk5DX0RSSVZFUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBXTk5DX1VTRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorLyojZGVmaW5lIFdOTkNfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSovCisjZGVmaW5lIFdOTkNfQ09OTkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIFdOTkNfUFJJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIFdOTkNfRElBTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFdOTkNfQURNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIFdOTkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBhCisjZGVmaW5lIFdOTkNfUFJJTlRNR1JFWFQgICAgICAgICAgICAgICAgICAgICAgICAweDBiCisKKyNkZWZpbmUgV05OQ19ORVRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBXTk5DX05FVF9NU05ldCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFdOTkNfTkVUX0xhbk1hbiAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgV05OQ19ORVRfTmV0V2FyZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MworI2RlZmluZSBXTk5DX05FVF9WaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIFdOTkNfTkVUXzEwTkVUICAgICAgICAgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgV05OQ19ORVRfTG9jdXMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NgorI2RlZmluZSBXTk5DX05FVF9TVU5fUENfTkZTICAgICAgICAgICAgICAgICAgICAgMHg3CisjZGVmaW5lIFdOTkNfTkVUX0xBTnN0ZXAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgV05OQ19ORVRfOVRJTEVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4OQorI2RlZmluZSBXTk5DX05FVF9MQU50YXN0aWMgICAgICAgICAgICAgICAgICAgICAgMHhhCisjZGVmaW5lIFdOTkNfTkVUX0FTNDAwICAgICAgICAgICAgICAgICAgICAgICAgICAweGIKKyNkZWZpbmUgV05OQ19ORVRfRlRQX05GUyAgICAgICAgICAgICAgICAgICAgICAgIDB4YworI2RlZmluZSBXTk5DX05FVF9QQVRIV09SS1MgICAgICAgICAgICAgICAgICAgICAgMHhkCisjZGVmaW5lIFdOTkNfTkVUX0xpZmVOZXQgICAgICAgICAgICAgICAgICAgICAgICAweGUKKyNkZWZpbmUgV05OQ19ORVRfUE9XRVJMYW4gICAgICAgICAgICAgICAgICAgICAgIDB4ZgorI2RlZmluZSBXTk5DX05FVF9NdWx0aU5ldCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisKKyNkZWZpbmUgV05OQ19TVUJORVRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgV05OQ19TVUJORVRfTVNOZXQgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgV05OQ19TVUJORVRfTGFuTWFuICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgV05OQ19TVUJORVRfV2luV29ya2dyb3VwcyAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgV05OQ19TVUJORVRfTmV0V2FyZSAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgV05OQ19TVUJORVRfVmluZXMgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgV05OQ19TVUJORVRfT3RoZXIgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBXTk5DX0NPTl9BZGRDb25uZWN0aW9uICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFdOTkNfQ09OX0NhbmNlbENvbm5lY3Rpb24gICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV05OQ19DT05fR2V0Q29ubmVjdGlvbnMgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTk5DX0NPTl9BdXRvQ29ubmVjdCAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdOTkNfQ09OX0Jyb3dzZURpYWxvZyAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV05OQ19DT05fUmVzdG9yZUNvbm5lY3Rpb24gICAgICAgICAgICAgIDB4MDAyMAorCisjZGVmaW5lIFdOTkNfUFJUX09wZW5Kb2IgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV05OQ19QUlRfQ2xvc2VKb2IgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTk5DX1BSVF9Ib2xkSm9iICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdOTkNfUFJUX1JlbGVhc2VKb2IgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV05OQ19QUlRfQ2FuY2VsSm9iICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTk5DX1BSVF9TZXRKb2JDb3BpZXMgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdOTkNfUFJUX1dhdGNoUXVldWUgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV05OQ19QUlRfVW53YXRjaFF1ZXVlICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTk5DX1BSVF9Mb2NrUXVldWVEYXRhICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdOTkNfUFJUX1VubG9ja1F1ZXVlRGF0YSAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV05OQ19QUlRfQ2hhbmdlTXNnICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTk5DX1BSVF9BYm9ydEpvYiAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdOTkNfUFJUX05vQXJiaXRyYXJ5TG9jayAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV05OQ19QUlRfV3JpdGVKb2IgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIFdOTkNfRExHX0RldmljZU1vZGUgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgV05OQ19ETEdfQnJvd3NlRGlhbG9nICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTk5DX0RMR19Db25uZWN0RGlhbG9nICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdOTkNfRExHX0Rpc2Nvbm5lY3REaWFsb2cgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV05OQ19ETEdfVmlld1F1ZXVlRGlhbG9nICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTk5DX0RMR19Qcm9wZXJ0eURpYWxvZyAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdOTkNfRExHX0Nvbm5lY3Rpb25EaWFsb2cgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV05OQ19ETEdfUHJpbnRlckNvbm5lY3REaWFsb2cgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTk5DX0RMR19TaGFyZXNEaWFsb2cgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdOTkNfRExHX1NoYXJlQXNEaWFsb2cgICAgICAgICAgICAgICAgICAweDAyMDAKKworI2RlZmluZSBXTk5DX0FETV9HZXREaXJlY3RvcnlUeXBlICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFdOTkNfQURNX0RpcmVjdG9yeU5vdGlmeSAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV05OQ19BRE1fTG9uZ05hbWVzICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTk5DX0FETV9TZXREZWZhdWx0RHJpdmUgICAgICAgICAgICAgICAgMHgwMDA4CisKKyNkZWZpbmUgV05OQ19FUlJfR2V0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBXTk5DX0VSUl9HZXRFcnJvclRleHQgICAgICAgICAgICAgICAgICAgMHgwMDAyCisKKyNkZWZpbmUgV0lOMzBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBXSU4zMVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFdJTjMxMVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgV0lOOTVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MworI2RlZmluZSBXSU5OVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIFdJTk9USEVSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgV0lOMzJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NgorCit0eXBlZGVmIExQVk9JRCAgTFBORVRSRVNPVVJDRTE2OworCisjZW5kaWYJLyogX19XSU5FX1dORVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94MTFkcnYuaCBiL2luY2x1ZGUveDExZHJ2LmgKaW5kZXggMGRiNmI4Ni4uODg1YTU5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS94MTFkcnYuaAorKysgYi9pbmNsdWRlL3gxMWRydi5oCkBAIC01LDggKzUsOSBAQAogI2lmbmRlZiBfX1dJTkVfWDExRFJWX0gKICNkZWZpbmUgX19XSU5FX1gxMURSVl9ICiAKLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKKyNpbmNsdWRlICJ0c194dXRpbC5oIgorI2luY2x1ZGUgInRzeDExZGVmcy5oIgogCiAjaW5jbHVkZSAid2luZG93cy5oIgogCmRpZmYgLS1naXQgYS9pcGMvZGRlX3Byb2MuYyBiL2lwYy9kZGVfcHJvYy5jCmluZGV4IGQ5ZmMyNTYuLjU3MTQyYjEgMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfcHJvYy5jCisrKyBiL2lwYy9kZGVfcHJvYy5jCkBAIC0yMzEsNyArMjMxLDcgQEAKICAgICAgZHByaW50Zl9tc2coc3RkZGViLCJEREVfRG9PbmVNZXNzYWdlOiAiCiAJCSAiVHJ5aW5nIHRvIGdldCBhY2tub3dsZWRnbWVudCBmcm9tIG1zZyBxdWV1ZT0lZFxuIiwKIAkJIHByb2MtPm1zZyk7Ci0gICAgIFlpZWxkKCk7CQkJLyogZm9yY2UgdGFzayBzd2l0Y2gsIGFuZCAqLworICAgICBZaWVsZDE2KCk7CQkJLyogZm9yY2UgdGFzayBzd2l0Y2gsIGFuZCAqLwogCQkJCS8qIGFja25vd2xlZGdtZW50IHNlbmRpbmcgKi8KICAgICAgaWYgKGdldF9hY2soKSkgewogCXJldHVybiBUUlVFOwpkaWZmIC0tZ2l0IGEvbGlicmFyeS93aW5lc3R1Yi5jIGIvbGlicmFyeS93aW5lc3R1Yi5jCmluZGV4IDc4OWM3YmYuLmUzOWI3YmUgMTAwNjQ0Ci0tLSBhL2xpYnJhcnkvd2luZXN0dWIuYworKysgYi9saWJyYXJ5L3dpbmVzdHViLmMKQEAgLTEsMTMgKzEsMTYgQEAKIC8qIFNhbXBsZSB3aW5lc3R1Yi5jIGZpbGUgZm9yIGNvbXBpbGluZyBwcm9ncmFtcyB3aXRoIGxpYndpbmUuc28uICovCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKIC8qIFN0dWIgbmVlZGVkIGZvciBsaW5raW5nIHdpdGggV2luZWxpYiAqLwogLyogRklYTUU6IHRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgKi8KLUhNT0RVTEUzMiBCVUlMVElOX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBCT09MMzIgZm9yY2UgKSB7IHJldHVybiAwOyB9Ci0KK0hNT0RVTEUzMiBCVUlMVElOX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBCT09MMzIgZm9yY2UgKSB7IAorCWZwcmludGYoc3RkZXJyLCJCVUlMVElOX0xvYWRNb2R1bGUoJXMsJWQpIGNhbGxlZCBpbiBhIGxpYnJhcnkhXG4iLG5hbWUsZm9yY2UpOworCXJldHVybiAwOworfQogCiBleHRlcm4gaW50IFBBU0NBTCBXaW5NYWluKEhJTlNUQU5DRTMyLEhJTlNUQU5DRTMyLExQU1RSLGludCk7CiBleHRlcm4gaW50IE1BSU5fV2luZWxpYkluaXQodm9pZCk7CmRpZmYgLS1naXQgYS9saWJ0ZXN0L01ha2VmaWxlLmluIGIvbGlidGVzdC9NYWtlZmlsZS5pbgppbmRleCAxMWRlZWVhLi5mNjhjZDEyIDEwMDY0NAotLS0gYS9saWJ0ZXN0L01ha2VmaWxlLmluCisrKyBiL2xpYnRlc3QvTWFrZWZpbGUuaW4KQEAgLTQsNyArNCw3IEBACiBWUEFUSCAgICAgPSBAc3JjZGlyQAogTU9EVUxFICAgID0gbm9uZQogUkNGTEFHUyAgID0gLXcxNiAtaAotUFJPR1JBTVMgID0gZXhwYW5kIGhlbGxvIGhlbGxvMiBoZWxsbzMgaGVsbG80IG5ldyByb2xleAorUFJPR1JBTVMgID0gZXhwYW5kIGhlbGxvIGhlbGxvMiBoZWxsbzMgaGVsbG80IGhlbGxvNSBuZXcgcm9sZXgKIEFMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExJQlMpCiAKIENfU1JDUyA9IFwKQEAgLTEzLDYgKzEzLDcgQEAKIAloZWxsbzIuYyBcCiAJaGVsbG8zLmMgXAogCWhlbGxvNC5jIFwKKwloZWxsbzUuYyBcCiAJbmV3LmMgXAogCXJvbGV4LmMKIApAQCAtNDIsNiArNDMsOSBAQAogaGVsbG80OiBoZWxsbzQubwogCSQoQ0MpIC1vIGhlbGxvNCBoZWxsbzQubyAkKExET1BUSU9OUykgJChBTExfTElCUykKIAoraGVsbG81OiBoZWxsbzUubworCSQoQ0MpIC1vIGhlbGxvNSBoZWxsbzUubyAkKExET1BUSU9OUykgJChBTExfTElCUykKKwogbmV3OiBuZXcubwogCSQoQ0MpIC1vIG5ldyBuZXcubyAkKExET1BUSU9OUykgJChBTExfTElCUykKIApkaWZmIC0tZ2l0IGEvbGlidGVzdC9oZWxsbzUuYyBiL2xpYnRlc3QvaGVsbG81LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMWFkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnRlc3QvaGVsbG81LmMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgZHluYW1pY2FsIGxvYWRpbmcgb2YgKGludGVybmFsKSBXaW4zMiBETExTLgorICovCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBQQVNDQUwgV2luTWFpbiAoSEFORExFIGluc3QsIEhBTkRMRSBwcmV2LCBMUFNUUiBjbWRsaW5lLCBpbnQgc2hvdykKK3sKKwlTWVNURU1fSU5GTwlzaTsKKwl2b2lkIChDQUxMQkFDSyAqZm5HZXRTeXN0ZW1JbmZvKShMUFNZU1RFTV9JTkZPIHNpKTsKKwlITU9EVUxFMzIJa2VybmVsMzI7CisKKwlrZXJuZWwzMiA9IExvYWRMaWJyYXJ5KCJLRVJORUwzMiIpOworCWlmIChrZXJuZWwzMjwzMikgeworCQlmcHJpbnRmKHN0ZGVyciwiRkFUQUw6IGNvdWxkIG5vdCBsb2FkIEtFUk5FTDMyIVxuIik7CisJCXJldHVybiAwOworCX0KKwlmbkdldFN5c3RlbUluZm8gPSAodm9pZCAoQ0FMTEJBQ0sqKShMUFNZU1RFTV9JTkZPKSlHZXRQcm9jQWRkcmVzcyhrZXJuZWwzMiwiR2V0U3lzdGVtSW5mbyIpOworCWlmICghZm5HZXRTeXN0ZW1JbmZvKSB7CisJCWZwcmludGYoc3RkZXJyLCJGQVRBTDogY291bGQgbm90IGZpbmQgR2V0U3lzdGVtSW5mbyFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZm5HZXRTeXN0ZW1JbmZvKCZzaSk7CisJZnByaW50ZihzdGRlcnIsIlF1ZXJ5U3lzdGVtSW5mbyByZXR1cm5zOlxuIik7CisJZnByaW50ZihzdGRlcnIsIgl3UHJvY2Vzc29yQXJjaGl0ZWN0dXJlOiAlZFxuIixzaS51Lngud1Byb2Nlc3NvckFyY2hpdGVjdHVyZSk7CisJZnByaW50ZihzdGRlcnIsIglkd1BhZ2VTaXplOiAlbGRcbiIsc2kuZHdQYWdlU2l6ZSk7CisJZnByaW50ZihzdGRlcnIsIglscE1pbmltdW1BcHBsaWNhdGlvbkFkZHJlc3M6ICVwXG4iLHNpLmxwTWluaW11bUFwcGxpY2F0aW9uQWRkcmVzcyk7CisJZnByaW50ZihzdGRlcnIsIglscE1heGltdW1BcHBsaWNhdGlvbkFkZHJlc3M6ICVwXG4iLHNpLmxwTWF4aW11bUFwcGxpY2F0aW9uQWRkcmVzcyk7CisJZnByaW50ZihzdGRlcnIsIglkd0FjdGl2ZVByb2Nlc3Nvck1hc2s6ICVsZFxuIixzaS5kd0FjdGl2ZVByb2Nlc3Nvck1hc2spOworCWZwcmludGYoc3RkZXJyLCIJZHdOdW1iZXJPZlByb2Nlc3NvcnM6ICVsZFxuIixzaS5kd051bWJlck9mUHJvY2Vzc29ycyk7CisJZnByaW50ZihzdGRlcnIsIglkd1Byb2Nlc3NvclR5cGU6ICVsZFxuIixzaS5kd1Byb2Nlc3NvclR5cGUpOworCWZwcmludGYoc3RkZXJyLCIJZHdBbGxvY2F0aW9uR3JhbnVsYXJpdHk6ICVsZFxuIixzaS5kd0FsbG9jYXRpb25HcmFudWxhcml0eSk7CisJZnByaW50ZihzdGRlcnIsIgl3UHJvY2Vzc29yTGV2ZWw6ICVkXG4iLHNpLndQcm9jZXNzb3JMZXZlbCk7CisJZnByaW50ZihzdGRlcnIsIgl3UHJvY2Vzc29yUmV2aXNpb246ICVkXG4iLHNpLndQcm9jZXNzb3JSZXZpc2lvbik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9sb2FkZXIvbW9kdWxlLmMgYi9sb2FkZXIvbW9kdWxlLmMKaW5kZXggODMxYTAwMS4uMzUxMzRmZCAxMDA2NDQKLS0tIGEvbG9hZGVyL21vZHVsZS5jCisrKyBiL2xvYWRlci9tb2R1bGUuYwpAQCAtMTQxOCw3ICsxNDE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKIHsKICAgICBmcHJpbnRmKHN0ZGVyciwiTG9hZExpYnJhcnlFeDMyVyglcywlZCwlMDhseClcbiIsbGlibmFtZSxoZixmbGFncyk7Ci0gICAgcmV0dXJuIExvYWRMaWJyYXJ5RXgzMkEobGlibmFtZSxoZixmbGFncyk7CisgICAgcmV0dXJuIExvYWRMaWJyYXJ5RXgzMkEobGlibmFtZSwgaGYsZmxhZ3MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE0MjgsMTMgKzE0MjgsMTMgQEAKIHsKICAgICBITU9EVUxFMzIgaG1vZDsKICAgICAKLSAgICBobW9kID0gUEVfTG9hZExpYnJhcnlFeDMyQShsaWJuYW1lLGhmaWxlLGZsYWdzKTsKKyAgICBobW9kID0gUEVfTG9hZExpYnJhcnlFeDMyQShsaWJuYW1lLFBST0NFU1NfQ3VycmVudCgpLGhmaWxlLGZsYWdzKTsKICAgICBpZiAoaG1vZCA8PSAzMikgewogCWNoYXIgYnVmZmVyWzI1Nl07CiAKIAlzdHJjcHkoIGJ1ZmZlciwgbGlibmFtZSApOwogCXN0cmNhdCggYnVmZmVyLCAiLmRsbCIgKTsKLQlobW9kID0gUEVfTG9hZExpYnJhcnlFeDMyQShidWZmZXIsaGZpbGUsZmxhZ3MpOworCWhtb2QgPSBQRV9Mb2FkTGlicmFyeUV4MzJBKGJ1ZmZlcixQUk9DRVNTX0N1cnJlbnQoKSxoZmlsZSxmbGFncyk7CiAgICAgfQogICAgIC8qIGluaXRpYWxpemUgYWxsIERMTHMsIHdoaWNoIGhhdmVuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuICovCiAgICAgUEVfSW5pdGlhbGl6ZURMTHMoIFBST0NFU1NfQ3VycmVudCgpLCBETExfUFJPQ0VTU19BVFRBQ0gsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL25lX2ltYWdlLmMgYi9sb2FkZXIvbmVfaW1hZ2UuYwppbmRleCAxNDI3OGM4Li5kMDkyYjNkIDEwMDY0NAotLS0gYS9sb2FkZXIvbmVfaW1hZ2UuYworKysgYi9sb2FkZXIvbmVfaW1hZ2UuYwpAQCAtNjksMTUgKzY5LDE2IEBACiAgICAgICAgIFNUQUNLMTZGUkFNRSAqc3RhY2sxNlRvcDsKICAgICAgICAgRFdPUkQgb2xkc3RhY2s7CiAgCVdPUkQgb2xkc2VsZWN0b3IsIG5ld3NlbGVjdG9yOworICAgICAgICBUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKICAgICAgICAgSEZJTEUzMiBoZiA9IEZJTEVfRHVwVW5peEhhbmRsZSggZmQgKTsKIAogIAlzZWxmbG9hZGhlYWRlciA9IChTRUxGTE9BREhFQURFUiAqKQogIAkJUFRSX1NFR19PRkZfVE9fTElOKHBTZWdUYWJsZS0+c2VsZWN0b3IsMCk7Ci0gCW9sZHN0YWNrID0gSUYxNjMyX1NhdmVkMTZfc3Nfc3A7CisgCW9sZHN0YWNrID0gdGhkYi0+Y3VyX3N0YWNrOwogIAlvbGRzZWxlY3RvciA9IHBTZWctPnNlbGVjdG9yOwotIAlJRjE2MzJfU2F2ZWQxNl9zc19zcCA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihwTW9kdWxlLT5zZWxmX2xvYWRpbmdfc2VsLAorIAl0aGRiLT5jdXJfc3RhY2sgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIocE1vZHVsZS0+c2VsZl9sb2FkaW5nX3NlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmMDAgLSBzaXplb2YoKnN0YWNrMTZUb3ApKTsKLSAgICAgICAgc3RhY2sxNlRvcCA9IENVUlJFTlRfU1RBQ0sxNjsKKyAgICAgICAgc3RhY2sxNlRvcCA9IChTVEFDSzE2RlJBTUUgKilQVFJfU0VHX1RPX0xJTih0aGRiLT5jdXJfc3RhY2spOwogICAgICAgICBzdGFjazE2VG9wLT5mcmFtZTMyID0gMDsKICAgICAgICAgc3RhY2sxNlRvcC0+ZHMgPSBzdGFjazE2VG9wLT5lcyA9IHBNb2R1bGUtPnNlbGZfbG9hZGluZ19zZWw7CiAgICAgICAgIHN0YWNrMTZUb3AtPmVudHJ5X3BvaW50ID0gMDsKQEAgLTEwNyw3ICsxMDgsNyBAQAogIAkgIH0KICAJfSAKICAJCi0gCUlGMTYzMl9TYXZlZDE2X3NzX3NwID0gb2xkc3RhY2s7CisgCXRoZGItPmN1cl9zdGFjayA9IG9sZHN0YWNrOwogICAgIH0KICAgICBlbHNlIGlmICghKHBTZWctPmZsYWdzICYgTkVfU0VHRkxBR1NfSVRFUkFURUQpKQogICAgICAgcmVhZChmZCwgbWVtLCBzaXplKTsKQEAgLTM2OCw2ICszNjksNyBAQAogICAgICAgICBTRUdUQUJMRUVOVFJZICogcFNlZ1RhYmxlID0gKFNFR1RBQkxFRU5UUlkgKikgTkVfU0VHX1RBQkxFKHBNb2R1bGUpOwogICAgICAgICBTRUxGTE9BREhFQURFUiAqc2VsZmxvYWRoZWFkZXI7CiAgICAgICAgIFNUQUNLMTZGUkFNRSAqc3RhY2sxNlRvcDsKKyAgICAgICAgVEhEQiAqdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CiAgICAgICAgIEhNT0RVTEUxNiBoc2VsZmxvYWQgPSBHZXRNb2R1bGVIYW5kbGUxNigiV1BST0NTIik7CiAgICAgICAgIERXT1JEIG9sZHN0YWNrOwogICAgICAgICBXT1JEIHNhdmVkX2Rncm91cCA9IHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAgLSAxXS5zZWxlY3RvcjsKQEAgLTM4MiwxMCArMzg0LDEwIEBACiAgICAgICAgIHNlbGZsb2FkaGVhZGVyLT5NeUFsbG9jICA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KGhzZWxmbG9hZCwyOCk7CiAgICAgICAgIHNlbGZsb2FkaGVhZGVyLT5TZXRPd25lciA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KEdldE1vZHVsZUhhbmRsZTE2KCJLRVJORUwiKSw0MDMpOwogICAgICAgICBwTW9kdWxlLT5zZWxmX2xvYWRpbmdfc2VsID0gR2xvYmFsSGFuZGxlVG9TZWwoR0xPQkFMX0FsbG9jKEdNRU1fWkVST0lOSVQsIDB4RkYwMCwgcE1vZHVsZS0+c2VsZiwgRkFMU0UsIEZBTFNFLCBGQUxTRSkpOwotICAgICAgICBvbGRzdGFjayA9IElGMTYzMl9TYXZlZDE2X3NzX3NwOwotICAgICAgICBJRjE2MzJfU2F2ZWQxNl9zc19zcCA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihwTW9kdWxlLT5zZWxmX2xvYWRpbmdfc2VsLAorICAgICAgICBvbGRzdGFjayA9IHRoZGItPmN1cl9zdGFjazsKKyAgICAgICAgdGhkYi0+Y3VyX3N0YWNrID0gUFRSX1NFR19PRkZfVE9fU0VHUFRSKHBNb2R1bGUtPnNlbGZfbG9hZGluZ19zZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmMDAgLSBzaXplb2YoKnN0YWNrMTZUb3ApICk7Ci0gICAgICAgIHN0YWNrMTZUb3AgPSBDVVJSRU5UX1NUQUNLMTY7CisgICAgICAgIHN0YWNrMTZUb3AgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4odGhkYi0+Y3VyX3N0YWNrKTsKICAgICAgICAgc3RhY2sxNlRvcC0+ZnJhbWUzMiA9IDA7CiAgICAgICAgIHN0YWNrMTZUb3AtPmVicCA9IDA7CiAgICAgICAgIHN0YWNrMTZUb3AtPmRzID0gc3RhY2sxNlRvcC0+ZXMgPSBwTW9kdWxlLT5zZWxmX2xvYWRpbmdfc2VsOwpAQCAtNDAxLDcgKzQwMyw3IEBACiAgICAgICAgIF9sY2xvc2UzMihoZik7CiAgICAgICAgIC8qIHNvbWUgQm9vdEFwcCBwcm9jcyBvdmVyd3JpdGUgdGhlIHNlbGVjdG9yIG9mIGRncm91cCAqLwogICAgICAgICBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uc2VsZWN0b3IgPSBzYXZlZF9kZ3JvdXA7Ci0gICAgICAgIElGMTYzMl9TYXZlZDE2X3NzX3NwID0gb2xkc3RhY2s7CisgICAgICAgIHRoZGItPmN1cl9zdGFjayA9IG9sZHN0YWNrOwogICAgICAgICBmb3IgKGkgPSAyOyBpIDw9IHBNb2R1bGUtPnNlZ19jb3VudDsgaSsrKQogICAgICAgICAgICAgaWYgKCFORV9Mb2FkU2VnbWVudCggcE1vZHVsZSwgaSApKSByZXR1cm4gRkFMU0U7CiAgICAgfQpAQCAtNjIyLDcgKzYyNCw3IEBACiAKICAgICBDU19yZWcoJmNvbnRleHQpICA9IHBTZWdUYWJsZVtwTW9kdWxlLT5jcy0xXS5zZWxlY3RvcjsKICAgICBFSVBfcmVnKCZjb250ZXh0KSA9IHBNb2R1bGUtPmlwOwotICAgIEVCUF9yZWcoJmNvbnRleHQpID0gT0ZGU0VUT0YoSUYxNjMyX1NhdmVkMTZfc3Nfc3ApCisgICAgRUJQX3JlZygmY29udGV4dCkgPSBPRkZTRVRPRihUSFJFQURfQ3VycmVudCgpLT5jdXJfc3RhY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFdPUkQpJigoU1RBQ0sxNkZSQU1FKikwKS0+YnA7CiAgICAgRURJX3JlZygmY29udGV4dCkgPSBEU19yZWcoJmNvbnRleHQpID8gRFNfcmVnKCZjb250ZXh0KSA6IGhNb2R1bGU7CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9pbWFnZS5jIGIvbG9hZGVyL3BlX2ltYWdlLmMKaW5kZXggZTNmMzFkNC4uYWNjOGE2NiAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX2ltYWdlLmMKKysrIGIvbG9hZGVyL3BlX2ltYWdlLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgInBlZXhlLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgorI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgInBlX2ltYWdlLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCkBAIC0xNjYsOCArMTY3LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCAKLWZpeHVwX2ltcG9ydHMgKFBEQjMyICpwcm9jZXNzLFBFX01PRFJFRiAqcGVtLEhNT0RVTEUzMiBoTW9kdWxlKQorRFdPUkQgZml4dXBfaW1wb3J0cyAoUERCMzIgKnByb2Nlc3MsUEVfTU9EUkVGICpwZW0sSE1PRFVMRTMyIGhNb2R1bGUpCiB7CiAgICAgSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1IJKnBlX2ltcDsKICAgICBpbnQJZml4dXBfZmFpbGVkCQk9IDA7CkBAIC0yMDUsNyArMjA1LDcgQEAKICAJY2hhciAqbmFtZSA9IChjaGFyICopIFJWQShwZV9pbXAtPk5hbWUpOwogCiAJLyogZG9uJ3QgdXNlIE1PRFVMRV9Mb2FkLCBXaW4zMiBjcmVhdGVzIG5ldyB0YXNrIGRpZmZlcmVudGx5ICovCi0JcmVzID0gUEVfTG9hZExpYnJhcnlFeDMyQSggbmFtZSwgMCwgMCApOworCXJlcyA9IFBFX0xvYWRMaWJyYXJ5RXgzMkEoIG5hbWUsIHByb2Nlc3MsIDAsIDAgKTsKIAlpZiAocmVzIDw9IChITU9EVUxFMzIpIDMyKSB7CiAJICAgIGNoYXIgKnAsIGJ1ZmZlclsxMDI0XTsKIApAQCAtMjE0LDExICsyMTQsMTEgQEAKIAkgICAgaWYgKCEocCA9IHN0cnJjaHIgKGJ1ZmZlciwgJ1xcJykpKQogCQlwID0gYnVmZmVyOwogCSAgICBzdHJjcHkgKHAgKyAxLCBuYW1lKTsKLQkgICAgcmVzID0gUEVfTG9hZExpYnJhcnlFeDMyQSggYnVmZmVyLCAwLCAwICk7CisJICAgIHJlcyA9IFBFX0xvYWRMaWJyYXJ5RXgzMkEoIGJ1ZmZlciwgcHJvY2VzcywgMCwgMCApOwogCX0KIAlpZiAocmVzIDw9IChITU9EVUxFMzIpIDMyKSB7CiAJICAgIGZwcmludGYgKHN0ZGVyciwgIk1vZHVsZSAlcyBub3QgZm91bmRcbiIsIG5hbWUpOwotCSAgICBleGl0ICgwKTsKKwkgICAgcmV0dXJuIHJlczsKIAl9CiAJcmVzID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTMyKHJlcyk7CiAJeHBlbSA9IHBlbS0+bmV4dDsKQEAgLTMyOCw3ICszMjgsOCBAQAogCX0KIAlwZV9pbXArKzsKICAgICB9Ci0gICAgaWYgKGZpeHVwX2ZhaWxlZCkgZXhpdCgxKTsKKyAgICBpZiAoZml4dXBfZmFpbGVkKSByZXR1cm4gMjI7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY2FsY192bWFfc2l6ZSggSE1PRFVMRTMyIGhNb2R1bGUgKQpAQCAtNjI5LDEwICs2MzAsNiBAQAogCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkdsb2JhbCBQb2ludGVyIChNSVBTKSBpZ25vcmVkXG4iKTsKIAogCWlmKG50X2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQotCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX1RMU10uU2l6ZSkKLQkJIGZwcmludGYoc3RkbmltcCwiVGhyZWFkIGxvY2FsIHN0b3JhZ2UgaWdub3JlZFxuIik7Ci0KLQlpZihudF9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnkKIAkJW0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9MT0FEX0NPTkZJR10uU2l6ZSkKIAkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJMb2FkIENvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IGlnbm9yZWRcbiIpOwogCkBAIC02NTIsNyArNjQ5LDI4IEBACiAKIAlpZihwZW0tPnBlX3JlbG9jKQlkb19yZWxvY2F0aW9ucyhwZW0pOwogCWlmKHBlbS0+cGVfZXhwb3J0KQlkdW1wX2V4cG9ydHMocGVtLT5tb2R1bGUpOwotCWlmKHBlbS0+cGVfaW1wb3J0KQlmaXh1cF9pbXBvcnRzKHByb2Nlc3MscGVtLGhNb2R1bGUpOworCWlmKHBlbS0+cGVfaW1wb3J0KQl7CisJCWlmIChmaXh1cF9pbXBvcnRzKHByb2Nlc3MscGVtLGhNb2R1bGUpKSB7CisJCQlQRV9NT0RSRUYJKip4cGVtOworCisJCQkvKiByZW1vdmUgZW50cnkgZnJvbSBtb2RyZWYgY2hhaW4gKi8KKwkJCXhwZW0gPSAmKHByb2Nlc3MtPm1vZHJlZl9saXN0KTsKKwkJCXdoaWxlICgqeHBlbSkgeworCQkJCWlmICgqeHBlbT09cGVtKSB7CisJCQkJCSp4cGVtID0gcGVtLT5uZXh0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJeHBlbSA9ICYoKCp4cGVtKS0+bmV4dCk7CisJCQl9CisJCQkvKiBGSVhNRTogdGhlcmUgYXJlIHNldmVyYWwgbW9yZSBkYW5nbGluZyByZWZlcmVuY2VzCisJCQkgKiBsZWZ0LiBJbmNsdWRpbmcgZGxscyBsb2FkZWQgYnkgdGhpcyBkbGwgYmVmb3JlIHRoZQorCQkJICogZmFpbGVkIG9uZS4gVW5yb2xsaW5nIGlzIHJhdGhlciBkaWZmaWN1bHQgd2l0aCB0aGUKKwkJCSAqIGN1cnJlbnQgc3RydWN0dXJlIGFuZCB3ZSBjYW4gbGVhdmUgaXQgdGhlbSBseWluZworCQkJICogYXJvdW5kIHdpdGggbm8gcHJvYmxlbXMsIHNvIHdlIGRvbid0IGNhcmUKKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CiAgIAkJCiAJaWYgKHBlbS0+cGVfZXhwb3J0KQogCQltb2RuYW1lID0gKGNoYXIqKVJWQShwZW0tPnBlX2V4cG9ydC0+TmFtZSk7CkBAIC02NzgsOSArNjk2LDExIEBACiAgKiBGSVhNRTogaGFuZGxlIHRoZSBmbGFncy4KICAqICAgICAgICBpbnRlcm5hbCBtb2R1bGUgaGFuZGxpbmcgc2hvdWxkIGJlIG1hZGUgYmV0dGVyIGhlcmUgKGFuZCBpbiBidWlsdGluLmMpCiAgKi8KLUhNT0RVTEUzMiBQRV9Mb2FkTGlicmFyeUV4MzJBIChMUENTVFIgbmFtZSwgSEZJTEUzMiBoRmlsZSwgRFdPUkQgZmxhZ3MpIHsKK0hNT0RVTEUzMiBQRV9Mb2FkTGlicmFyeUV4MzJBIChMUENTVFIgbmFtZSwgUERCMzIgKnByb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEZJTEUzMiBoRmlsZSwgRFdPUkQgZmxhZ3MpCit7CiAJT0ZTVFJVQ1QJb2ZzOwotCUhNT0RVTEUzMgloTW9kdWxlOworCUhNT0RVTEUzMgloTW9kdWxlLHJldDsKIAlORV9NT0RVTEUJKnBNb2R1bGU7CiAJUEVfTU9EUkVGCSpwZW07CiAKQEAgLTY5MCwxNCArNzEwLDEzIEBACiAJCWlmICghSElXT1JEKGhNb2R1bGUpKSAvKiBpbnRlcm5hbCAob3IgYmFkKSAqLwogCQkJcmV0dXJuIGhNb2R1bGU7CiAJCS8qIGNoZWNrIGlmIHRoaXMgbW9kdWxlIGlzIGFscmVhZHkgbWFwcGVkICovCi0JCXBlbSAJPSBQUk9DRVNTX0N1cnJlbnQoKS0+bW9kcmVmX2xpc3Q7CisJCXBlbSAJPSBwcm9jZXNzLT5tb2RyZWZfbGlzdDsKIAkJd2hpbGUgKHBlbSkgewogCQkJaWYgKHBlbS0+bW9kdWxlID09IGhNb2R1bGUpIHJldHVybiBoTW9kdWxlOwogCQkJcGVtID0gcGVtLT5uZXh0OwogCQl9CiAJCXBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKGhNb2R1bGUpOwogCQlpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfQlVJTFRJTikgewotCQkJUERCMzIJKnByb2Nlc3MgPSBQUk9DRVNTX0N1cnJlbnQoKTsKIAkJCUlNQUdFX0RPU19IRUFERVIJKmRoOwogCQkJSU1BR0VfTlRfSEVBREVSUwkqbmg7CiAJCQlJTUFHRV9TRUNUSU9OX0hFQURFUgkqc2g7CkBAIC03MjAsMTMgKzczOSwxMyBAQAogCX0gZWxzZSB7CiAKIAkJLyogdHJ5IHRvIGxvYWQgYnVpbHRpbiwgZW5hYmxlZCBtb2R1bGVzIGZpcnN0ICovCi0JCWlmICgoaE1vZHVsZSA9IEJVSUxUSU5fTG9hZE1vZHVsZSggbmFtZSwgRkFMU0UgKSkpCisJCWlmICgoaE1vZHVsZSA9IEJVSUxUSU4zMl9Mb2FkTW9kdWxlKCBuYW1lLCBGQUxTRSApKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUzMiggaE1vZHVsZSApOwogCiAJCS8qIHRyeSB0byBvcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSAqLwogCQlpZiAoSEZJTEVfRVJST1IzMj09KGhGaWxlPU9wZW5GaWxlMzIobmFtZSwmb2ZzLE9GX1JFQUQpKSkgewogCQkJLyogTm93IHRyeSB0aGUgYnVpbHQtaW4gZXZlbiBpZiBkaXNhYmxlZCAqLwotCQkJaWYgKChoTW9kdWxlID0gQlVJTFRJTl9Mb2FkTW9kdWxlKCBuYW1lLCBUUlVFICkpKSB7CisJCQlpZiAoKGhNb2R1bGUgPSBCVUlMVElOMzJfTG9hZE1vZHVsZSggbmFtZSwgVFJVRSApKSkgewogCQkJCWZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGNvdWxkIG5vdCBsb2FkIFdpbmRvd3MgRExMICclcycsIHVzaW5nIGJ1aWx0LWluIG1vZHVsZS5cbiIsIG5hbWUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUzMiggaE1vZHVsZSApOwogCQkJfQpAQCAtNzQzLDkgKzc2MiwxMyBAQAogCQlpZiAocE1vZHVsZS0+bW9kdWxlMzIgPCAzMikgcmV0dXJuIDIxOwogCX0KIAkvKiByZWN1cnNlICovCi0JcE1vZHVsZS0+bW9kdWxlMzIgPSBQRV9NYXBJbWFnZSggcE1vZHVsZS0+bW9kdWxlMzIsIFBST0NFU1NfQ3VycmVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ZzLGZsYWdzKTsKLQlyZXR1cm4gcE1vZHVsZS0+bW9kdWxlMzI7CisJcmV0ID0gUEVfTWFwSW1hZ2UoIHBNb2R1bGUtPm1vZHVsZTMyLCBwcm9jZXNzLCAmb2ZzLGZsYWdzKTsKKwlpZiAoIXJldCkgeworCQkvKiBzaG91bGQgZnJlZSB0aGlzIG1vZHVsZSBhbmQgdGhlIGFscmVhZHkgcmVmZXJlbmNlZCBvbmVzICovCisJCXJldHVybiAwOworCX0KKwlwTW9kdWxlLT5tb2R1bGUzMiA9IHJldDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc1NiwxMCArNzc5LDExIEBACiBISU5TVEFOQ0UxNiBQRV9Mb2FkTW9kdWxlKCBIRklMRTMyIGhGaWxlLCBPRlNUUlVDVCAqb2ZzLCBMT0FEUEFSQU1TKiBwYXJhbXMgKQogewogICAgIEhNT0RVTEUxNiBoTW9kdWxlMTY7Ci0gICAgSE1PRFVMRTMyIGhNb2R1bGUzMjsKKyAgICBITU9EVUxFMzIgaE1vZHVsZTMyLCByZXQ7CiAgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLQorICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOworICAgIAogICAgIGlmICgoaE1vZHVsZTE2ID0gTU9EVUxFX0NyZWF0ZUR1bW15TW9kdWxlKCBvZnMgKSkgPCAzMikgcmV0dXJuIGhNb2R1bGUxNjsKICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2sxNiggaE1vZHVsZTE2ICk7CiAgICAgcE1vZHVsZS0+ZmxhZ3MgPSBORV9GRkxBR1NfV0lOMzI7CkBAIC03NzEsMTIgKzc5NSwyMSBAQAogICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZTE2LCBwYXJhbXMgKTsKICAgICBpZiAoIShQRV9IRUFERVIoaE1vZHVsZTMyKS0+RmlsZUhlYWRlci5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFX0RMTCkpCiAgICAgewotICAgICAgICBUQVNLX0NyZWF0ZVRhc2soIGhNb2R1bGUxNiwgaEluc3RhbmNlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+aEVudmlyb25tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIChMUFNUUilQVFJfU0VHX1RPX0xJTiggcGFyYW1zLT5jbWRMaW5lICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKigoV09SRCopUFRSX1NFR19UT19MSU4ocGFyYW1zLT5zaG93Q21kKSArIDEpICk7CisgICAgICAgIEhUQVNLMTYgaFRhc2sgPSBUQVNLX0NyZWF0ZVRhc2soIGhNb2R1bGUxNiwgaEluc3RhbmNlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmhFbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChXT1JEKilQVFJfU0VHX1RPX0xJTihwYXJhbXMtPnNob3dDbWQpICsgMSkgKTsKKyAgICAgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhUYXNrICk7CisgICAgICAgIHRoZGIgPSBwVGFzay0+dGhkYjsKICAgICB9Ci0gICAgcE1vZHVsZS0+bW9kdWxlMzIgPSBQRV9NYXBJbWFnZSggaE1vZHVsZTMyLCBQUk9DRVNTX0N1cnJlbnQoKSwgb2ZzLCAwICk7CisgICAgaWYgKCEocmV0ID0gUEVfTWFwSW1hZ2UoIGhNb2R1bGUzMiwgdGhkYi0+cHJvY2Vzcywgb2ZzLCAwICkpKQorICAgIHsKKyAgICAgCS8qIEZJWE1FOiBzaG91bGQgZGVzdHJveSB0aGUgdGFzayBjcmVhdGVkIC4uLiAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcE1vZHVsZS0+bW9kdWxlMzIgPSByZXQ7CisgICAgLyogeXVjay4gYnV0IHRoZXJlIGlzIG5vIG90aGVyIGdvb2QgcGxhY2UgdG8gZG8gdGhhdC4uLiAqLworICAgIFBFX0luaXRUbHMoIHRoZGIgKTsKICAgICByZXR1cm4gaEluc3RhbmNlOwogfQogCkBAIC04NDAsMTQgKzg3MywxNSBAQAogCX0KIH0KIAotdm9pZCBQRV9Jbml0VGxzKFBEQjMyICpwZGIpCit2b2lkIFBFX0luaXRUbHMoVEhEQiAqdGhkYikKIHsKIAkvKiBGSVhNRTogdGxzIGNhbGxiYWNrcyA/Pz8gKi8KIAlQRV9NT0RSRUYJCSpwZW07CiAJSU1BR0VfTlRfSEVBREVSUwkqcGVoOwotCURXT1JECQkJc2l6ZSxkYXRhc2l6ZSxpbmRleDsKKwlEV09SRAkJCXNpemUsZGF0YXNpemU7CiAJTFBWT0lECQkJbWVtOwogCUxQSU1BR0VfVExTX0RJUkVDVE9SWQlwZGlyOworCVBEQjMyCQkJKnBkYiA9IHRoZGItPnByb2Nlc3M7CiAKIAlwZW0gPSBwZGItPm1vZHJlZl9saXN0OwogCXdoaWxlIChwZW0pIHsKQEAgLTg1OCwxMyArODkyLDE4IEBACiAJCX0KIAkJcGRpciA9IChMUFZPSUQpKHBlbS0+bW9kdWxlICsgcGVoLT5PcHRpb25hbEhlYWRlci4KIAkJCURhdGFEaXJlY3RvcnlbSU1BR0VfRklMRV9USFJFQURfTE9DQUxfU1RPUkFHRV0uVmlydHVhbEFkZHJlc3MpOwotCQlpbmRleAk9IFRsc0FsbG9jKCk7CisJCQorCQlpZiAoIShwZW0tPmZsYWdzICYgUEVfTU9EUkVGX1RMU19BTExPQ0VEKSkgeworCQkJcGVtLT50bHNpbmRleCA9IFRsc0FsbG9jKCk7CisJCQkqKHBkaXItPkFkZHJlc3NPZkluZGV4KT1wZW0tPnRsc2luZGV4OyAgIAorCQl9CisJCXBlbS0+ZmxhZ3MgfD0gUEVfTU9EUkVGX1RMU19BTExPQ0VEOwogCQlkYXRhc2l6ZT0gcGRpci0+RW5kQWRkcmVzc09mUmF3RGF0YS1wZGlyLT5TdGFydEFkZHJlc3NPZlJhd0RhdGE7CiAJCXNpemUJPSBkYXRhc2l6ZSArIHBkaXItPlNpemVPZlplcm9GaWxsOwogCQltZW09VmlydHVhbEFsbG9jKDAsc2l6ZSxNRU1fUkVTRVJWRXxNRU1fQ09NTUlULFBBR0VfUkVBRFdSSVRFKTsKIAkJbWVtY3B5KG1lbSwoTFBWT0lEKSBwZGlyLT5TdGFydEFkZHJlc3NPZlJhd0RhdGEsIGRhdGFzaXplKTsKLQkJVGxzU2V0VmFsdWUoaW5kZXgsbWVtKTsKLQkJKihwZGlyLT5BZGRyZXNzT2ZJbmRleCk9aW5kZXg7ICAgCisJCS8qIGRvbid0IHVzZSBUbHNTZXRWYWx1ZSwgd2UgYXJlIGluIHRoZSB3cm9uZyB0aHJlYWQgKi8KKwkJdGhkYi0+dGxzX2FycmF5W3BlbS0+dGxzaW5kZXhdID0gbWVtOwogCQlwZW09cGVtLT5uZXh0OwogCX0KIH0KZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IDdjMzFmYWUuLmVlZWFlYjAgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtMzgsMTAgKzM4LDYgQEAKIAogZXh0ZXJuIElOVDMyIFdJTlNPQ0tfRGVsZXRlVGFza1dTSSggVERCKiBwVGFzaywgc3RydWN0IF9XU0lORk8qICk7CiBleHRlcm4gQk9PTDMyIE1PRFVMRV9GcmVlTW9kdWxlKCBITU9EVUxFMTYgaE1vZHVsZSwgVERCKiBwdGFza0NvbnRleHQgKTsKLWV4dGVybiB2b2lkIFBFX0luaXRUbHMoIFBEQjMyICpwZGIzMiApOwotCi0gIC8qIFNhdmVkIDE2LWJpdCBzdGFjayBmb3IgY3VycmVudCBwcm9jZXNzIChXaW4xNiBvbmx5KSAqLwotRFdPUkQgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSAwOwogCiAgIC8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gc3dpdGNoIHRvIGEgbGFyZ2VyIHN0YWNrICovCiBpbnQgKCpJRjE2MzJfQ2FsbExhcmdlU3RhY2spKCBpbnQgKCpmdW5jKSgpLCB2b2lkICphcmcgKSA9IE5VTEw7CkBAIC0zMzcsMTkgKzMzMywxOSBAQAogICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIHBUYXNrLT5oTW9kdWxlICk7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlID0gTkVfU0VHX1RBQkxFKCBwTW9kdWxlICk7CiAKLSAgICBJRjE2MzJfU2F2ZWQxNl9zc19zcCA9IHBUYXNrLT5zc19zcDsKLSAgICAvKiBUZXJtaW5hdGUgdGhlIHN0YWNrIGZyYW1lICovCi0gICAgQ1VSUkVOVF9TVEFDSzE2LT5mcmFtZTMyID0gTlVMTDsKICAgICBTRVRfQ1VSX1RIUkVBRCggcFRhc2stPnRoZGIgKTsKKyAgICAvKiBUZXJtaW5hdGUgdGhlIHN0YWNrIGZyYW1lICovCisgICAgVEhSRUFEX1NUQUNLMTYocFRhc2stPnRoZGIpLT5mcmFtZTMyID0gTlVMTDsKICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCiAgICAgewogICAgICAgICAvKiBGSVhNRTogYWxsIHRoaXMgaXMgYW4gdWdseSBoYWNrICovCiAKLSAgICAgICAgZXh0ZXJuIHZvaWQgSW5pdFRhc2soIENPTlRFWFQgKmNvbnRleHQgKTsKLQogICAgICAgICBGQVJQUk9DMzIgZW50cnkgPSAoRkFSUFJPQzMyKVJWQV9QVFIoIFBST0NFU1NfQ3VycmVudCgpLT5leGVfbW9kcmVmLT5tb2R1bGUsIE9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQgKTsKIAotICAgICAgICBJbml0VGFzayggTlVMTCApOworICAgICAgICBwVGFzay0+dXNlcmhhbmRsZXIgPSAoVVNFUlNJR05BTFBST0MpJlVTRVJfU2lnbmFsUHJvYzsKKyAgICAgICAgaWYgKHBNb2R1bGUtPmhlYXBfc2l6ZSkKKyAgICAgICAgICAgIExvY2FsSW5pdCggcFRhc2stPmhJbnN0YW5jZSwgMCwgcE1vZHVsZS0+aGVhcF9zaXplICk7CisKICAgICAgICAgSW5pdEFwcCggcFRhc2stPmhNb2R1bGUgKTsKICAgICAgICAgUEVfSW5pdGlhbGl6ZURMTHMoIFBST0NFU1NfQ3VycmVudCgpLCBETExfUFJPQ0VTU19BVFRBQ0gsIChMUFZPSUQpLTEgKTsKICAgICAgICAgZHByaW50Zl9yZWxheSggc3RkZGViLCAiQ2FsbFRvMzIoZW50cnlwcm9jPSVwKVxuIiwgZW50cnkgKTsKQEAgLTM4Myw4ICszNzksOCBAQAogCiAgICAgICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiU3RhcnRpbmcgbWFpbiBwcm9ncmFtOiBjczppcD0lMDRseDolMDR4IGRzPSUwNGx4IHNzOnNwPSUwNHg6JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBDU19yZWcoJmNvbnRleHQpLCBJUF9yZWcoJmNvbnRleHQpLCBEU19yZWcoJmNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVE9ST0YoSUYxNjMyX1NhdmVkMTZfc3Nfc3ApLAotICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVE9GKElGMTYzMl9TYXZlZDE2X3NzX3NwKSApOworICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVE9ST0YocFRhc2stPnRoZGItPmN1cl9zdGFjayksCisgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUT0YocFRhc2stPnRoZGItPmN1cl9zdGFjaykgKTsKIAogICAgICAgICBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYyggJmNvbnRleHQsIDAgKTsKICAgICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuICovCkBAIC01MjgsMTkgKzUyNCwzMSBAQAogICAgICAgICBwVGFzay0+dGhkYiA9IFRIUkVBRF9DcmVhdGUoIHBkYjMyLAogICAgICAgICAgIFBFX0hFQURFUihwTW9kdWxlLT5tb2R1bGUzMiktPk9wdGlvbmFsSGVhZGVyLlNpemVPZlN0YWNrUmVzZXJ2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMICk7Ci0gICAgICAgIC8qIEZJWE1FOiBzaG91bGQgbm90IGJlIGRvbmUgaGVyZSAqLwotICAgICAgICBQRV9Jbml0VGxzKCBwZGIzMiApOwogICAgIH0KICAgICBlbHNlCiAgICAgICAgIHBUYXNrLT50aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiMzIsIDAsIE5VTEwsIE5VTEwgKTsKLQogICAgIC8qIEZJWE1FOiBjaGVjayBmb3IgcFRhc2stPnRoZGIgPT0gTlVMTC4gICovCi0gICAgU0VUX0NVUl9USFJFQUQoIHBUYXNrLT50aGRiICk7CisKKyAgICAvKiBDcmVhdGUgdGhlIDE2LWJpdCBzdGFjayBmcmFtZSAqLworCisgICAgaWYgKCEoc3AgPSBwTW9kdWxlLT5zcCkpCisgICAgICAgIHNwID0gcFNlZ1RhYmxlW3BNb2R1bGUtPnNzLTFdLm1pbnNpemUgKyBwTW9kdWxlLT5zdGFja19zaXplOworICAgIHNwICY9IH4xOworICAgIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoIGhJbnN0YW5jZSwgc3AgKTsKKyAgICBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrIC09IHNpemVvZihTVEFDSzE2RlJBTUUpICsgc2l6ZW9mKFNUQUNLMzJGUkFNRSAqKTsKKyAgICBmcmFtZTE2ID0gKFNUQUNLMTZGUkFNRSAqKVBUUl9TRUdfVE9fTElOKCBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrICk7CisgICAgZnJhbWUxNi0+ZWJwID0gc3AgKyAoaW50KSYoKFNUQUNLMTZGUkFNRSAqKTApLT5icDsKKyAgICBmcmFtZTE2LT5icCA9IExPV09SRChmcmFtZTE2LT5lYnApOworICAgIGZyYW1lMTYtPmRzID0gZnJhbWUxNi0+ZXMgPSBwVGFzay0+aEluc3RhbmNlOworICAgIGZyYW1lMTYtPmVudHJ5X3BvaW50ID0gMDsKKyAgICBmcmFtZTE2LT5lbnRyeV9jcyA9IDA7CisgICAgLyogVGhlIHJlbWFpbmluZyBmaWVsZHMgd2lsbCBiZSBpbml0aWFsaXplZCBpbiBUQVNLX1Jlc2NoZWR1bGUgKi8KIAogICAgIC8qIENyZWF0ZSB0aGUgMzItYml0IHN0YWNrIGZyYW1lICovCiAKICAgICBzdGFjazMyVG9wID0gKGNoYXIqKXBUYXNrLT50aGRiLT50ZWIuc3RhY2tfdG9wOwotICAgIGZyYW1lMzIgPSAoU1RBQ0szMkZSQU1FICopc3RhY2szMlRvcCAtIDE7CisgICAgZnJhbWUxNi0+ZnJhbWUzMiA9IGZyYW1lMzIgPSAoU1RBQ0szMkZSQU1FICopc3RhY2szMlRvcCAtIDE7CisgICAgZnJhbWUzMi0+ZnJhbWUxNiA9IHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKyBzaXplb2YoU1RBQ0sxNkZSQU1FKTsKICAgICBmcmFtZTMyLT5lZGkgICAgID0gMDsKICAgICBmcmFtZTMyLT5lc2kgICAgID0gMDsKICAgICBmcmFtZTMyLT5lZHggICAgID0gMDsKQEAgLTU0OSwyOSArNTU3LDEwIEBACiAgICAgZnJhbWUzMi0+cmV0YWRkciA9IChEV09SRClUQVNLX0NhbGxUb1N0YXJ0OwogICAgIC8qIFRoZSByZW1haW5pbmcgZmllbGRzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gVEFTS19SZXNjaGVkdWxlICovCiAKLSAgICAvKiBDcmVhdGUgdGhlIDE2LWJpdCBzdGFjayBmcmFtZSAqLworICAgIGlmICghVEhSRUFEX0N1cnJlbnQoKS0+Y3VyX3N0YWNrKQorICAgICAgICBUSFJFQURfQ3VycmVudCgpLT5jdXJfc3RhY2sgPSBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrOwogCi0gICAgaWYgKCEoc3AgPSBwTW9kdWxlLT5zcCkpCi0gICAgICAgIHNwID0gcFNlZ1RhYmxlW3BNb2R1bGUtPnNzLTFdLm1pbnNpemUgKyBwTW9kdWxlLT5zdGFja19zaXplOwotICAgIHNwICY9IH4xOwotICAgIHBUYXNrLT5zc19zcCA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggaEluc3RhbmNlLCBzcCApOwotICAgIHBUYXNrLT5zc19zcCAtPSBzaXplb2YoU1RBQ0sxNkZSQU1FKTsKLSAgICBmcmFtZTE2ID0gKFNUQUNLMTZGUkFNRSAqKVBUUl9TRUdfVE9fTElOKCBwVGFzay0+c3Nfc3AgKTsKLSAgICBmcmFtZTE2LT5mcmFtZTMyID0gZnJhbWUzMjsKLSAgICBmcmFtZTE2LT5lYnAgPSBzcCArIChpbnQpJigoU1RBQ0sxNkZSQU1FICopMCktPmJwOwotICAgIGZyYW1lMTYtPmJwID0gTE9XT1JEKGZyYW1lMTYtPmVicCk7Ci0gICAgZnJhbWUxNi0+ZHMgPSBmcmFtZTE2LT5lcyA9IHBUYXNrLT5oSW5zdGFuY2U7Ci0gICAgZnJhbWUxNi0+ZW50cnlfcG9pbnQgPSAwOwotICAgIGZyYW1lMTYtPmVudHJ5X2NzID0gMDsKLSAgICAvKiBUaGUgcmVtYWluaW5nIGZpZWxkcyB3aWxsIGJlIGluaXRpYWxpemVkIGluIFRBU0tfUmVzY2hlZHVsZSAqLwotCi0gICAgICAvKiBJZiB0aGVyZSdzIG5vIDE2LWJpdCBzdGFjayB5ZXQsIHVzZSBhIHBhcnQgb2YgdGhlIG5ldyB0YXNrIHN0YWNrICovCi0gICAgICAvKiBUaGlzIGlzIG9ubHkgbmVlZGVkIHRvIGhhdmUgYSBzdGFjayB0byBzd2l0Y2ggZnJvbSBvbiB0aGUgZmlyc3QgICovCi0gICAgICAvKiBjYWxsIHRvIERpcmVjdGVkWWllbGQoKS4gKi8KLQotICAgIGlmICghSUYxNjMyX1NhdmVkMTZfc3Nfc3ApIElGMTYzMl9TYXZlZDE2X3NzX3NwID0gcFRhc2stPnNzX3NwOwotCi0gICAgICAvKiBBZGQgdGhlIHRhc2sgdG8gdGhlIGxpbmtlZCBsaXN0ICovCisgICAgLyogQWRkIHRoZSB0YXNrIHRvIHRoZSBsaW5rZWQgbGlzdCAqLwogCiAgICAgVEFTS19MaW5rVGFzayggaFRhc2sgKTsKIApAQCAtNTkzLDYgKzU4Miw4IEBACiAgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoVGFzayApKSkgcmV0dXJuOwogICAgIGhQREIgPSBwVGFzay0+aFBEQjsKIAorICAgIHBUYXNrLT5tYWdpYyA9IDB4ZGVhZDsgLyogaW52YWxpZGF0ZSBzaWduYXR1cmUgKi8KKwogICAgIC8qIERlbGV0ZSB0aGUgV2luMzIgcGFydCBvZiB0aGUgdGFzayAqLwogCiAgICAgSzMyT0JKX0RlY0NvdW50KCAmcFRhc2stPnRoZGItPnByb2Nlc3MtPmhlYWRlciApOwpAQCAtNzU2LDEwICs3NDcsNiBAQAogICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiU3dpdGNoaW5nIHRvIHRhc2sgJTA0eCAoJS44cylcbiIsCiAgICAgICAgICAgICAgICAgICBoVGFzaywgcE5ld1Rhc2stPm1vZHVsZV9uYW1lICk7CiAKLSAgICAgIC8qIFNhdmUgdGhlIHN0YWNrIG9mIHRoZSBwcmV2aW91cyB0YXNrIChpZiBhbnkpICovCi0KLSAgICBpZiAocE9sZFRhc2spIHBPbGRUYXNrLT5zc19zcCA9IElGMTYzMl9TYXZlZDE2X3NzX3NwOwotCiAgICAgIC8qIE1ha2UgdGhlIHRhc2sgdGhlIGxhc3QgaW4gdGhlIGxpbmtlZCBsaXN0IChyb3VuZC1yb2JpbiBzY2hlZHVsaW5nKSAqLwogCiAgICAgcE5ld1Rhc2stPnByaW9yaXR5Kys7CkBAIC03NjksNyArNzU2LDcgQEAKIAogICAgIC8qIEZpbmlzaCBpbml0aWFsaXppbmcgdGhlIG5ldyB0YXNrIHN0YWNrIGlmIG5lY2Vzc2FyeSAqLwogCi0gICAgbmV3ZnJhbWUxNiA9IChTVEFDSzE2RlJBTUUgKilQVFJfU0VHX1RPX0xJTiggcE5ld1Rhc2stPnNzX3NwICk7CisgICAgbmV3ZnJhbWUxNiA9IFRIUkVBRF9TVEFDSzE2KCBwTmV3VGFzay0+dGhkYiApOwogICAgIGlmICghbmV3ZnJhbWUxNi0+ZW50cnlfY3MpCiAgICAgewogICAgICAgICBTVEFDSzE2RlJBTUUgKm9sZGZyYW1lMTYgPSBDVVJSRU5UX1NUQUNLMTY7CkBAIC03ODgsNyArNzc1LDcgQEAKIAogICAgIGhDdXJyZW50VGFzayA9IGhUYXNrOwogICAgIFNFVF9DVVJfVEhSRUFEKCBwTmV3VGFzay0+dGhkYiApOwotICAgIElGMTYzMl9TYXZlZDE2X3NzX3NwID0gcE5ld1Rhc2stPnNzX3NwOworICAgIHBOZXdUYXNrLT5zc19zcCA9IHBOZXdUYXNrLT50aGRiLT5jdXJfc3RhY2s7CiB9CiAKIApAQCAtODc1LDcgKzg2Miw3IEBACiAgICAgcGluc3RhbmNlID0gKElOU1RBTkNFREFUQSAqKVBUUl9TRUdfT0ZGX1RPX0xJTihDVVJSRU5UX0RTLCAwKTsKICAgICBwaW5zdGFuY2UtPnN0YWNrYm90dG9tID0gc3RhY2toaTsgLyogeXVwLCB0aGF0J3MgcmlnaHQuIENvbmZ1c2VkIG1lIHRvby4gKi8KICAgICBwaW5zdGFuY2UtPnN0YWNrdG9wICAgID0gc3RhY2tsb3c7IAotICAgIHBpbnN0YW5jZS0+c3RhY2ttaW4gICAgPSBPRkZTRVRPRihJRjE2MzJfU2F2ZWQxNl9zc19zcCk7CisgICAgcGluc3RhbmNlLT5zdGFja21pbiAgICA9IE9GRlNFVE9GKCBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrICk7CiB9CiAKIApAQCAtMTEzMywxMyArMTEyMCwxMiBAQAogICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm47CiAgICAgaWYgKCEocERhdGEgPSAoSU5TVEFOQ0VEQVRBICopR2xvYmFsTG9jazE2KCBzZWcgKSkpIHJldHVybjsKICAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlN3aXRjaFN0YWNrVG86IG9sZD0lMDR4OiUwNHggbmV3PSUwNHg6JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgIFNFTEVDVE9ST0YoSUYxNjMyX1NhdmVkMTZfc3Nfc3ApLAotICAgICAgICAgICAgICAgICAgT0ZGU0VUT0YoSUYxNjMyX1NhdmVkMTZfc3Nfc3ApLCBzZWcsIHB0ciApOworICAgICAgICAgICAgICAgICAgU0VMRUNUT1JPRiggcFRhc2stPnRoZGItPmN1cl9zdGFjayApLAorICAgICAgICAgICAgICAgICAgT0ZGU0VUT0YoIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKSwgc2VnLCBwdHIgKTsKIAogICAgIC8qIFNhdmUgdGhlIG9sZCBzdGFjayAqLwogCi0gICAgb2xkRnJhbWUgICAgICAgICAgID0gQ1VSUkVOVF9TVEFDSzE2OwotICAgIHBEYXRhLT5vbGRfc3Nfc3AgICA9IElGMTYzMl9TYXZlZDE2X3NzX3NwOworICAgIHBEYXRhLT5vbGRfc3Nfc3AgICA9IHBUYXNrLT50aGRiLT5jdXJfc3RhY2s7CiAgICAgcERhdGEtPnN0YWNrdG9wICAgID0gdG9wOwogICAgIHBEYXRhLT5zdGFja21pbiAgICA9IHB0cjsKICAgICBwRGF0YS0+c3RhY2tib3R0b20gPSBwdHI7CkBAIC0xMTQ5LDkgKzExMzUsMTAgQEAKICAgICAvKiBOb3RlOiB3ZSBuZWVkIHRvIHRha2UgdGhlIDMgYXJndW1lbnRzIGludG8gYWNjb3VudDsgb3RoZXJ3aXNlLAogICAgICAqIHRoZSBzdGFjayB3aWxsIHVuZGVyZmxvdyB1cG9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgICAgICovCi0gICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoIHNlZywKKyAgICBvbGRGcmFtZSA9IChTVEFDSzE2RlJBTUUgKilQVFJfU0VHX1RPX0xJTiggcFRhc2stPnRoZGItPmN1cl9zdGFjayApOworICAgIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoIHNlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyIC0gc2l6ZW9mKFNUQUNLMTZGUkFNRSkgLSAzICogc2l6ZW9mKFdPUkQpICk7Ci0gICAgbmV3RnJhbWUgPSBDVVJSRU5UX1NUQUNLMTY7CisgICAgbmV3RnJhbWUgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKTsKIAogICAgIC8qIENvcHkgdGhlIHN0YWNrIGZyYW1lIGFuZCB0aGUgbG9jYWwgdmFyaWFibGVzIHRvIHRoZSBuZXcgc3RhY2sgKi8KIApAQCAtMTE3NCw3ICsxMTYxLDcgQEAKICAgICBJTlNUQU5DRURBVEEgKnBEYXRhOwogCiAgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoQ3VycmVudFRhc2sgKSkpIHJldHVybjsKLSAgICBpZiAoIShwRGF0YSA9IChJTlNUQU5DRURBVEEgKilHbG9iYWxMb2NrMTYoU0VMRUNUT1JPRihJRjE2MzJfU2F2ZWQxNl9zc19zcCkpKSkKKyAgICBpZiAoIShwRGF0YSA9IChJTlNUQU5DRURBVEEgKilHbG9iYWxMb2NrMTYoU0VMRUNUT1JPRihwVGFzay0+dGhkYi0+Y3VyX3N0YWNrKSkpKQogICAgICAgICByZXR1cm47CiAgICAgaWYgKCFwRGF0YS0+b2xkX3NzX3NwKQogICAgIHsKQEAgLTExODQsMTYgKzExNzEsMTYgQEAKICAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlN3aXRjaFN0YWNrQmFjazogcmVzdG9yaW5nIHN0YWNrICUwNHg6JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgIFNFTEVDVE9ST0YocERhdGEtPm9sZF9zc19zcCksIE9GRlNFVE9GKHBEYXRhLT5vbGRfc3Nfc3ApICk7CiAKLSAgICBvbGRGcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKKyAgICBvbGRGcmFtZSA9IChTVEFDSzE2RlJBTUUgKilQVFJfU0VHX1RPX0xJTiggcFRhc2stPnRoZGItPmN1cl9zdGFjayApOwogCiAgICAgLyogU3dpdGNoIGJhY2sgdG8gdGhlIG9sZCBzdGFjayAqLwogCi0gICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBwRGF0YS0+b2xkX3NzX3NwOworICAgIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgPSBwRGF0YS0+b2xkX3NzX3NwOwogICAgIHBEYXRhLT5vbGRfc3Nfc3AgPSAwOwogCiAgICAgLyogQnVpbGQgYSBzdGFjayBmcmFtZSBmb3IgdGhlIHJldHVybiAqLwogCi0gICAgbmV3RnJhbWUgPSBDVVJSRU5UX1NUQUNLMTY7CisgICAgbmV3RnJhbWUgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKTsKICAgICBuZXdGcmFtZS0+ZnJhbWUzMiA9IG9sZEZyYW1lLT5mcmFtZTMyOwogICAgIGlmIChkZWJ1Z2dpbmdfcmVsYXkpCiAgICAgewpAQCAtMTQ2OSw4ICsxNDU2LDggQEAKICAgICBscHRlLT5oVGFza1BhcmVudCAgID0gcFRhc2stPmhQYXJlbnQ7CiAgICAgbHB0ZS0+aEluc3QgICAgICAgICA9IHBUYXNrLT5oSW5zdGFuY2U7CiAgICAgbHB0ZS0+aE1vZHVsZSAgICAgICA9IHBUYXNrLT5oTW9kdWxlOwotICAgIGxwdGUtPndTUyAgICAgICAgICAgPSBTRUxFQ1RPUk9GKCBwVGFzay0+c3Nfc3AgKTsKLSAgICBscHRlLT53U1AgICAgICAgICAgID0gT0ZGU0VUT0YoIHBUYXNrLT5zc19zcCApOworICAgIGxwdGUtPndTUyAgICAgICAgICAgPSBTRUxFQ1RPUk9GKCBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrICk7CisgICAgbHB0ZS0+d1NQICAgICAgICAgICA9IE9GRlNFVE9GKCBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrICk7CiAgICAgbHB0ZS0+d1N0YWNrVG9wICAgICA9IHBJbnN0RGF0YS0+c3RhY2t0b3A7CiAgICAgbHB0ZS0+d1N0YWNrTWluaW11bSA9IHBJbnN0RGF0YS0+c3RhY2ttaW47CiAgICAgbHB0ZS0+d1N0YWNrQm90dG9tICA9IHBJbnN0RGF0YS0+c3RhY2tib3R0b207CmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggZWNiNmM5NS4uYWQ5ZDYwMCAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtNDgyLDYgKzQ4MiwxOCBAQAogICAgIHJldHVybiBNQUtFTE9ORyggR0VUX0FSRU5BX1BUUihzZWwpLT5oYW5kbGUsIEdsb2JhbEhhbmRsZVRvU2VsKHNlbCkgKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2xvYmFsSGFuZGxlTm9SSVAgICAoS0VSTkVMLjE1OSkKKyAqLworRFdPUkQgV0lOQVBJIEdsb2JhbEhhbmRsZU5vUklQKCBXT1JEIHNlbCApCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gZ2xvYmFsQXJlbmFTaXplLTEgOyBpPj0wIDsgaS0tKSB7CisgICAgICAgIGlmIChwR2xvYmFsQXJlbmFbaV0uc2l6ZSE9MCAmJiBwR2xvYmFsQXJlbmFbaV0uaGFuZGxlID09IHNlbCkKKwkJcmV0dXJuIE1BS0VMT05HKCBHRVRfQVJFTkFfUFRSKHNlbCktPmhhbmRsZSwgR2xvYmFsSGFuZGxlVG9TZWwoc2VsKSApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsRmxhZ3MxNiAgIChLRVJORUwuMjIpCkBAIC04MzIsNiArODQ0LDE2IEBACiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEZyZWVNZW1JbmZvICAgKEtFUk5FTC4zMTYpCisgKi8KK0RXT1JEIFdJTkFQSSBHZXRGcmVlTWVtSW5mbyh2b2lkKQoreworICAgIE1FTU1BTklORk8gaW5mbzsKKyAgICBNZW1NYW5JbmZvKCAmaW5mbyApOworICAgIHJldHVybiBNQUtFTE9ORyggaW5mby5kd1RvdGFsTGluZWFyU3BhY2UsIGluZm8uZHdNYXhQYWdlc0F2YWlsYWJsZSApOworfQorCiAvKgogICogV2luMzIgR2xvYmFsIGhlYXAgZnVuY3Rpb25zIChHbG9iYWxYWFgpLgogICogVGhlc2UgZnVuY3Rpb25zIGluY2x1ZGVkIGluIFdpbjMyIGZvciBjb21wYXRpYmlsaXR5IHdpdGggMTYgYml0IFdpbmRvd3MKQEAgLTk3MCw3ICs5OTIsMTAgQEAKICAqLwogSEdMT0JBTDMyIFdJTkFQSSBHbG9iYWxIYW5kbGUzMihMUENWT0lEIHBtZW0pCiB7Ci0gICAgSEdMT0JBTDMyIGhhbmRsZSA9IFBPSU5URVJfVE9fSEFORExFKHBtZW0pOworICAgIEhHTE9CQUwzMiBoYW5kbGU7CisKKyAgICBpZiAoIUhFQVBfSXNJbnNpZGVIZWFwKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwbWVtICkpIGdvdG8gZXJyb3I7CisgICAgaGFuZGxlID0gUE9JTlRFUl9UT19IQU5ETEUocG1lbSk7CiAgICAgaWYgKEhFQVBfSXNJbnNpZGVIZWFwKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBDVk9JRCloYW5kbGUgKSkKICAgICB7CiAgICAgICAgIGlmIChIQU5ETEVfVE9fSU5URVJOKGhhbmRsZSktPk1hZ2ljID09IE1BR0lDX0dMT0JBTF9VU0VEKQpAQCAtOTgwLDYgKzEwMDUsNyBAQAogICAgIGlmIChIZWFwVmFsaWRhdGUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHBtZW0gKSkKICAgICAgICAgcmV0dXJuIChIR0xPQkFMMzIpcG1lbTsgIC8qIHZhbGlkIGZpeGVkIGJsb2NrICovCiAKK2Vycm9yOgogICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9IQU5ETEUgKTsKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21lbW9yeS9zZWxlY3Rvci5jIGIvbWVtb3J5L3NlbGVjdG9yLmMKaW5kZXggMjhjOGE2MS4uZGI3Y2E3MCAxMDA2NDQKLS0tIGEvbWVtb3J5L3NlbGVjdG9yLmMKKysrIGIvbWVtb3J5L3NlbGVjdG9yLmMKQEAgLTYzMyw3ICs2MzMsNiBAQAogTFBWT0lEIFdJTkFQSSBXT1dHZXRWRE1Qb2ludGVyKERXT1JEIHZwLERXT1JEIG5yb2ZieXRlcyxCT09MMzIgcHJvdGVjdGVkKQogewogICAgIC8qIEZJWE1FOiBhZGQgc2l6ZSBjaGVjayB0b28gKi8KLSAgICBmcHJpbnRmKHN0ZG5pbXAsIldPV0dldFZETVBvaW50ZXIoJTA4bHgsJWxkLCVkKVxuIix2cCxucm9mYnl0ZXMscHJvdGVjdGVkKTsKICAgICBpZiAocHJvdGVjdGVkKQogCXJldHVybiBQVFJfU0VHX1RPX0xJTih2cCk7CiAgICAgZWxzZQpAQCAtNjU1LDcgKzY1NCw2IEBACiBMUFZPSUQgV0lOQVBJIFdPV0dldFZETVBvaW50ZXJGaXgoRFdPUkQgdnAsRFdPUkQgbnJvZmJ5dGVzLEJPT0wzMiBwcm90ZWN0ZWQpCiB7CiAgICAgLyogRklYTUU6IGZpeCBoZWFwc2VnbWVudCAqLwotICAgIGZwcmludGYoc3RkbmltcCwiV09XR2V0VkRNUG9pbnRlckZpeCglMDhseCwlbGQsJWQpXG4iLHZwLG5yb2ZieXRlcyxwcm90ZWN0ZWQpOwogICAgIHJldHVybiBXT1dHZXRWRE1Qb2ludGVyKHZwLG5yb2ZieXRlcyxwcm90ZWN0ZWQpOwogfQogCkBAIC02NjQsNyArNjYyLDYgQEAKICAqLwogdm9pZCBXSU5BUEkgV09XR2V0VkRNUG9pbnRlclVuZml4KERXT1JEIHZwKQogewotICAgIGZwcmludGYoc3RkbmltcCwiV09XR2V0VkRNUG9pbnRlclVuZml4KCUwOGx4KSwgU1RVQlxuIix2cCk7CiAgICAgLyogRklYTUU6IHVuZml4IGhlYXBzZWdtZW50ICovCiB9CiAKZGlmZiAtLWdpdCBhL21lbW9yeS9zdHJpbmcuYyBiL21lbW9yeS9zdHJpbmcuYwppbmRleCA5NjlhZWVlLi5mYjk0ODU5IDEwMDY0NAotLS0gYS9tZW1vcnkvc3RyaW5nLmMKKysrIGIvbWVtb3J5L3N0cmluZy5jCkBAIC04MCw2ICs4MCw3IEBACiB7CiAgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjYXQ6IEFwcGVuZCAlcyB0byAlc1xuIiwKIAkJICAgZGVidWdzdHJfYSAoc3JjKSwgZGVidWdzdHJfYSAoZHN0KSk7CisgICAgLyogV2luZG93cyBkb2VzIG5vdCBjaGVjayBmb3IgTlVMTCBwb2ludGVycyBoZXJlLCBzbyB3ZSBkb24ndCBlaXRoZXIgKi8KICAgICBzdHJjYXQoIGRzdCwgc3JjICk7CiAgICAgcmV0dXJuIGRzdDsKIH0KQEAgLTkzLDYgKzk0LDcgQEAKICAgICByZWdpc3RlciBMUFdTVFIgcCA9IGRzdDsKICAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNhdDogQXBwZW5kIEwlcyB0byBMJXNcbiIsCiAJCSAgIGRlYnVnc3RyX3cgKHNyYyksIGRlYnVnc3RyX3cgKGRzdCkpOworICAgIC8qIFdpbmRvd3MgZG9lcyBub3QgY2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgaGVyZSwgc28gd2UgZG9uJ3QgZWl0aGVyICovCiAgICAgd2hpbGUgKCpwKSBwKys7CiAgICAgd2hpbGUgKCgqcCsrID0gKnNyYysrKSk7CiAgICAgcmV0dXJuIGRzdDsKQEAgLTI1NSw3ICsyNTcsNyBAQAogTFBTVFIgV0lOQVBJIGxzdHJjcHkzMkEoIExQU1RSIGRzdCwgTFBDU1RSIHNyYyApCiB7CiAgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjcHkgJXNcbiIsIGRlYnVnc3RyX2EgKHNyYykpOwotICAgIGlmICghc3JjIHx8ICFkc3QpIHJldHVybiBOVUxMOworICAgIC8qIFdpbmRvd3MgZG9lcyBub3QgY2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgaGVyZSwgc28gd2UgZG9uJ3QgZWl0aGVyICovCiAgICAgc3RyY3B5KCBkc3QsIHNyYyApOwogICAgIHJldHVybiBkc3Q7CiB9CkBAIC0yNjgsNiArMjcwLDcgQEAKIHsKICAgICByZWdpc3RlciBMUFdTVFIgcCA9IGRzdDsKICAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNweSBMJXNcbiIsIGRlYnVnc3RyX3cgKHNyYykpOworICAgIC8qIFdpbmRvd3MgZG9lcyBub3QgY2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgaGVyZSwgc28gd2UgZG9uJ3QgZWl0aGVyICovCiAgICAgd2hpbGUgKCgqcCsrID0gKnNyYysrKSk7CiAgICAgcmV0dXJuIGRzdDsKIH0KQEAgLTI5MSw2ICsyOTQsNyBAQAogICAgIExQU1RSIHAgPSBkc3Q7CiAgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjcHluICVzIGZvciAlZCBjaGFyc1xuIiwKIAkJICAgZGVidWdzdHJfYW4gKHNyYyxuKSwgbik7CisgICAgLyogV2luZG93cyBkb2VzIG5vdCBjaGVjayBmb3IgTlVMTCBwb2ludGVycyBoZXJlLCBzbyB3ZSBkb24ndCBlaXRoZXIgKi8KICAgICB3aGlsZSAoKG4tLSA+IDEpICYmICpzcmMpICpwKysgPSAqc3JjKys7CiAgICAgaWYgKG4gPj0gMCkgKnAgPSAwOwogICAgIHJldHVybiBkc3Q7CkBAIC0zMDUsNiArMzA5LDcgQEAKICAgICBMUFdTVFIgcCA9IGRzdDsKICAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNweW4gTCVzIGZvciAlZCBjaGFyc1xuIiwKIAkJICAgZGVidWdzdHJfd24gKHNyYyxuKSwgbik7CisgICAgLyogV2luZG93cyBkb2VzIG5vdCBjaGVjayBmb3IgTlVMTCBwb2ludGVycyBoZXJlLCBzbyB3ZSBkb24ndCBlaXRoZXIgKi8KICAgICB3aGlsZSAoKG4tLSA+IDEpICYmICpzcmMpICpwKysgPSAqc3JjKys7CiAgICAgaWYgKG4gPj0gMCkgKnAgPSAwOwogICAgIHJldHVybiBkc3Q7CmRpZmYgLS1naXQgYS9tZW1vcnkvdmlydHVhbC5jIGIvbWVtb3J5L3ZpcnR1YWwuYwppbmRleCA2NWYxN2Q0Li5iYzc1NzYyIDEwMDY0NAotLS0gYS9tZW1vcnkvdmlydHVhbC5jCisrKyBiL21lbW9yeS92aXJ0dWFsLmMKQEAgLTI4MSw5ICsyODEsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgVklSVFVBTF9HZXRXaW4zMlByb3QoIEJZVEUgdnByb3QsIERXT1JEICpwcm90ZWN0LCBEV09SRCAqc3RhdGUgKQogewotICAgICpwcm90ZWN0ID0gVklSVFVBTF9XaW4zMkZsYWdzW3Zwcm90ICYgMHgwZl07Ci0gICAgaWYgKHZwcm90ICYgVlBST1RfR1VBUkQpICpwcm90ZWN0IHw9IFBBR0VfR1VBUkQ7Ci0gICAgaWYgKHZwcm90ICYgVlBST1RfTk9DQUNIRSkgKnByb3RlY3QgfD0gUEFHRV9OT0NBQ0hFOworICAgIGlmIChwcm90ZWN0KSB7CisgICAgCSpwcm90ZWN0ID0gVklSVFVBTF9XaW4zMkZsYWdzW3Zwcm90ICYgMHgwZl07CisgICAgCWlmICh2cHJvdCAmIFZQUk9UX0dVQVJEKSAqcHJvdGVjdCB8PSBQQUdFX0dVQVJEOworICAgIAlpZiAodnByb3QgJiBWUFJPVF9OT0NBQ0hFKSAqcHJvdGVjdCB8PSBQQUdFX05PQ0FDSEU7CisgICAgfQogCiAgICAgaWYgKHN0YXRlKSAqc3RhdGUgPSAodnByb3QgJiBWUFJPVF9DT01NSVRURUQpID8gTUVNX0NPTU1JVCA6IE1FTV9SRVNFUlZFOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9hc3BpLmMgYi9taXNjL2FzcGkuYwppbmRleCBmZTQ1M2E5Li45OTNjZDRhIDEwMDY0NAotLS0gYS9taXNjL2FzcGkuYworKysgYi9taXNjL2FzcGkuYwpAQCAtMzg0LDggKzM4NCw3IEBACiAgKiAgICAgICAgICAgICBHZXRBU1BJU3VwcG9ydEluZm8xNiAgIChXSU5BU1BJLjEpCiAgKi8KIAotV09SRAotR2V0QVNQSVN1cHBvcnRJbmZvMTYoKQorV09SRCBXSU5BUEkgR2V0QVNQSVN1cHBvcnRJbmZvMTYoKQogewogI2lmZGVmIGxpbnV4CiAgICAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIkdFVEFTUElTdXBwb3J0SW5mb1xuIik7CkBAIC00MDMsOCArNDAyLDcgQEAKICAqICAgICAgICAgICAgIFNlbmRBU1BJQ29tbWFuZDE2ICAgKFdJTkFTUEkuMikKICAqLwogCi1XT1JECi1TZW5kQVNQSUNvbW1hbmQxNihTRUdQVFIgc2VncHRyX3NyYikKK1dPUkQgV0lOQVBJIFNlbmRBU1BJQ29tbWFuZDE2KFNFR1BUUiBzZWdwdHJfc3JiKQogewogI2lmZGVmIGxpbnV4CiAgIExQU1JCMTYgbHBTUkIgPSBQVFJfU0VHX1RPX0xJTihzZWdwdHJfc3JiKTsKQEAgLTQzMCwzICs0MjgsMTYgQEAKICAgcmV0dXJuIFNTX0lOVkFMSURfU1JCOwogI2VuZGlmCiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgR2V0QVNQSURMTFZlcnNpb24gICAoV0lOQVNQSS40KQorICovCisKK0RXT1JEIFdJTkFQSSBHZXRBU1BJRExMVmVyc2lvbigpCit7CisjaWZkZWYgbGludXgKKwlyZXR1cm4gKERXT1JEKTI7CisjZWxzZQorCXJldHVybiAoRFdPUkQpMDsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbWlzYy9jYWxsYmFjay5jIGIvbWlzYy9jYWxsYmFjay5jCmluZGV4IDM0ZTVmMDIuLjg0MzU0ZDUgMTAwNjQ0Ci0tLSBhL21pc2MvY2FsbGJhY2suYworKysgYi9taXNjL2NhbGxiYWNrLmMKQEAgLTYsNiArNiw3IEBACiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgInRhc2suaCIKIApAQCAtMTM0LDYgKzEzNSw5MiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBDQUxMQkFDS19DYWxsV09XQ2FsbGJhY2sxNkV4CisgKgorICogV0NCMTZfTUFYX0NCQVJHUyAoMTYpIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhcmdzLgorICoKKyAqIENhbiBjYWxsIGZ1bmN0aW9ucyB1c2luZyBDREVDTCBvciBQQVNDQUwgY2FsbGluZyBjb252ZW50aW9ucy4gVGhlIENERUNMCisgKiBvbmVzIGFyZSByZXZlcnNlZCAobm90IDEwMCUgc3VyZSBhYm91dCB0aGF0KS4KKyAqLworc3RhdGljIEJPT0wzMiBXSU5BUEkgQ0FMTEJBQ0tfQ2FsbFdPV0NhbGxiYWNrMTZFeCggCisJRkFSUFJPQzE2IHByb2MsIERXT1JEIGR3RmxhZ3MsIERXT1JEIGNiQXJncywgTFBWT0lEIHhhcmdzLExQRFdPUkQgcGR3cmV0CispIHsKKyAgICBMUERXT1JECWFyZ3MgPSAoTFBEV09SRCl4YXJnczsKKyAgICBEV09SRAlyZXQsaTsKKworICAgIGlmIChkd0ZsYWdzID09IFdDQjE2X0NERUNMKSB7CisgICAgCS8qIHN3YXAgdGhlIGFyZ3VtZW50cyAqLworICAgIAlhcmdzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxjYkFyZ3Mqc2l6ZW9mKERXT1JEKSk7CisJZm9yIChpPTA7aTxjYkFyZ3M7aSsrKQorCQlhcmdzW2ldID0gKChEV09SRCopeGFyZ3MpW2NiQXJncy1pLTFdOworICAgIH0KKyAgICBzd2l0Y2ggKGNiQXJncykgeworICAgIGNhc2UgMDogcmV0ID0gcHJvYygpO2JyZWFrOworICAgIGNhc2UgMTogcmV0ID0gcHJvYyhhcmdzWzBdKTticmVhazsKKyAgICBjYXNlIDI6IHJldCA9IHByb2MoYXJnc1swXSxhcmdzWzFdKTticmVhazsKKyAgICBjYXNlIDM6IHJldCA9IHByb2MoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2JyZWFrOworICAgIGNhc2UgNDogcmV0ID0gcHJvYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdKTticmVhazsKKyAgICBjYXNlIDU6IHJldCA9IHByb2MoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdKTticmVhazsKKyAgICBjYXNlIDY6IHJldCA9IHByb2MoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pOworCSAgICBicmVhazsKKyAgICBjYXNlIDc6IHJldCA9IHByb2MoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisJCSAgICBhcmdzWzZdCisJICAgICk7CisJICAgIGJyZWFrOworICAgIGNhc2UgODogcmV0ID0gcHJvYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKKwkJICAgIGFyZ3NbNl0sYXJnc1s3XQorCSAgICApOworCSAgICBicmVhazsKKyAgICBjYXNlIDk6IHJldCA9IHByb2MoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisJCSAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XQorCSAgICApOworCSAgICBicmVhazsKKyAgICBjYXNlIDEwOnJldCA9IHByb2MoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisJCSAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldCisJICAgICk7CisJICAgIGJyZWFrOworICAgIGNhc2UgMTE6cmV0ID0gcHJvYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKKwkJICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0KKwkgICAgKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSAxMjpyZXQgPSBwcm9jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAorCQkgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSxhcmdzWzExXQorCSAgICApOworCSAgICBicmVhazsKKyAgICBjYXNlIDEzOnJldCA9IHByb2MoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisJCSAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdLGFyZ3NbMTFdLAorCQkgICAgYXJnc1sxMl0KKwkgICAgKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSAxNDpyZXQgPSBwcm9jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAorCQkgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSxhcmdzWzExXSwKKwkJICAgIGFyZ3NbMTJdLGFyZ3NbMTNdCisJICAgICk7CisJICAgIGJyZWFrOworICAgIGNhc2UgMTU6cmV0ID0gcHJvYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKKwkJICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sYXJnc1sxMV0sCisJCSAgICBhcmdzWzEyXSxhcmdzWzEzXSxhcmdzWzE0XQorCSAgICApOworCSAgICBicmVhazsKKyAgICBjYXNlIDE2OnJldCA9IHByb2MoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisJCSAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdLGFyZ3NbMTFdLAorCQkgICAgYXJnc1sxMl0sYXJnc1sxM10sYXJnc1sxNF0sYXJnc1sxNV0KKwkgICAgKTsKKwkgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKwkgICAgZnByaW50ZihzdGRlcnIsIkNBTExCQUNLX0NhbGxXT1dDYWxsYmFjazE2RXgoKSwgJWxkIGFyZ3VtZW50cyBub3Qgc3VwcG9ydGVkLiFuIixjYkFyZ3MpOworCSAgICBpZiAoZHdGbGFncyA9PSBXQ0IxNl9DREVDTCkKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFyZ3MpOworCSAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChkd0ZsYWdzID09IFdDQjE2X0NERUNMKQorICAgIAlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsYXJncyk7CisgICAgaWYgKHBkd3JldCkgCisgICAgCSpwZHdyZXQgPSByZXQ7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgIENBTExCQUNLX1dpbmVsaWJUYWJsZQogICoKICAqIFRoZSBjYWxsYmFja3MgZnVuY3Rpb24gdGFibGUgZm9yIFdpbmVsaWIKQEAgLTE1NCw2ICsyNDEsNyBAQAogICAgIENBTExCQUNLX0NhbGxMb2FkQXBwU2VnUHJvYywgICAvKiBDYWxsTG9hZEFwcFNlZ1Byb2MgKi8KICAgICBDQUxMQkFDS19DYWxsU3lzdGVtVGltZXJQcm9jLCAgLyogQ2FsbFN5c3RlbVRpbWVyUHJvYyAqLwogICAgIENBTExCQUNLX0NhbGxXT1dDYWxsYmFja1Byb2MsICAvKiBDYWxsV09XQ2FsbGJhY2tQcm9jICovCisgICAgQ0FMTEJBQ0tfQ2FsbFdPV0NhbGxiYWNrMTZFeCwgIC8qIENhbGxXT1dDYWxsYmFjazE2RXggKi8KICAgICBDQUxMQkFDS19DYWxsQVNQSVBvc3RQcm9jLCAgICAgLyogQ2FsbEFTUElQb3N0UHJvYyAqLwogICAgIC8qIFRoZSBncmFwaGljcyBkcml2ZXIgY2FsbGJhY2tzIGFyZSBuZXZlciB1c2VkIGluIFdpbmVsaWIgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbERydkNvbnRyb2xQcm9jICovCkBAIC0xNjMsNyArMjUxLDEwIEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxEcnZPdXRwdXRQcm9jICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxEcnZSZWFsaXplUHJvYyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsRHJ2U3RyZXRjaEJsdFByb2MgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbERydkV4dFRleHRPdXRQcm9jICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxEcnZFeHRUZXh0T3V0UHJvYyAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsRHJ2R2V0Q2hhcldpZHRoICovCiB9OwogCiBjb25zdCBDQUxMQkFDS1NfVEFCTEUgKkNhbGxiYWNrcyA9ICZDQUxMQkFDS19XaW5lbGliVGFibGU7CisKKwpkaWZmIC0tZ2l0IGEvbWlzYy9jb21tZGxnLmMgYi9taXNjL2NvbW1kbGcuYwppbmRleCBkNDIyYzg3Li5mODFjN2IxIDEwMDY0NAotLS0gYS9taXNjL2NvbW1kbGcuYworKysgYi9taXNjL2NvbW1kbGcuYwpAQCAtMzIyNCwzICszMjI0LDExIEBACiAKIEdFVF9YWFhfRklMRU5BTUUoR2V0T3BlbkZpbGVOYW1lKQogR0VUX1hYWF9GSUxFTkFNRShHZXRTYXZlRmlsZU5hbWUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENob29zZUZvbnRBICAgKENPTURMRzMyLjMpCisgKi8KK0RXT1JEIFdJTkFQSSBDaG9vc2VGb250MzJBKENIT09TRUZPTlQgcENob29zZWZvbnQpCit7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9taXNjL2NwdS5jIGIvbWlzYy9jcHUuYwppbmRleCA2YTc5MDk3Li45MjY1OTg2IDEwMDY0NAotLS0gYS9taXNjL2NwdS5jCisrKyBiL21pc2MvY3B1LmMKQEAgLTExLDYgKzExLDggQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2lubnQuaCIKIAorc3RhdGljIEJZVEUgUEZbNjRdID0gezAsfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQlHZXRTeXN0ZW1JbmZvICAgICAgICAgICAgCVtLRVJORUxMMzIuNDA0XQogICovCkBAIC0yMyw2ICsyNSw3IEBACiAJCW1lbWNweShzaSwmY2FjaGVkc2ksc2l6ZW9mKCpzaSkpOwogCQlyZXR1cm47CiAJfQorCW1lbXNldChQRiwwLHNpemVvZihQRikpOwogCiAJLyogY2hvb3NlIHNlbnNpYmxlIGRlZmF1bHRzIC4uLgogCSAqIEZJWE1FOiBwZXJoYXBzIG92ZXJyaWRlYWJsZSB3aXRoIHByZWNvbXBpbGVyIGZsYWdzPwpAQCAtNDMsNDMgKzQ2LDg3IEBACiAJY2FjaGUgPSAxOyAvKiBldmVuIGlmIHRoZXJlIGlzIG5vIG1vcmUgaW5mbywgd2Ugbm93IGhhdmUgYSBjYWNoZWVudHJ5ICovCiAJbWVtY3B5KHNpLCZjYWNoZWRzaSxzaXplb2YoKnNpKSk7CiAKKwkvKiBobW0sIHJlYXNvbmFibGUgcHJvY2Vzc29yIGZlYXR1cmUgZGVmYXVsdHM/ICovCisKICNpZmRlZiBsaW51eAogCXsKLQljaGFyIGxpbmVbMjAwXSxpbmZvWzIwMF0sdmFsdWVbMjAwXSxqdW5rWzIwMF07CisJY2hhciBsaW5lWzIwMF07CiAJRklMRSAqZiA9IGZvcGVuICgiL3Byb2MvY3B1aW5mbyIsICJyIik7CiAKIAlpZiAoIWYpCiAJCXJldHVybjsKIAl3aGlsZSAoZmdldHMobGluZSwyMDAsZikhPU5VTEwpIHsKLQkJaWYgKHNzY2FuZihsaW5lLCIlcyVbIFx0Ol0lcyIsaW5mbyxqdW5rLHZhbHVlKSE9MykKKwkJY2hhcgkqcywqdmFsdWU7CisKKwkJLyogTk9URTogdGhlICc6JyBpcyB0aGUgb25seSBjaGFyYWN0ZXIgd2UgY2FuIHJlbHkgb24gKi8KKwkJaWYgKCEodmFsdWUgPSBzdHJjaHIobGluZSwnOicpKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIWxzdHJuY21waTMyQShsaW5lLCAiY3B1IiwzKSkgewotCQkJaWYgKAlpc2RpZ2l0ICh2YWx1ZVswXSkgJiYgdmFsdWVbMV0gPT0gJzgnICYmIAotCQkJCXZhbHVlWzJdID09ICc2JyAmJiB2YWx1ZVszXSA9PSAwCi0JCQkpIHsKKwkJLyogdGVybWluYXRlIHRoZSB2YWx1ZW5hbWUgKi8KKwkJKnZhbHVlKysgPSAnXDAnOworCQkvKiBza2lwIGFueSBsZWFkaW5nIHNwYWNlcyAqLworCQl3aGlsZSAoKnZhbHVlPT0nICcpIHZhbHVlKys7CisJCWlmICgocz1zdHJjaHIodmFsdWUsJ1xuJykpKQorCQkJKnM9J1wwJzsKKworCQkvKiAyLjEgbWV0aG9kICovCisJCWlmICghbHN0cm5jbXBpMzJBKGxpbmUsICJjcHUgZmFtaWx5IixzdHJsZW4oImNwdSBmYW1pbHkiKSkpIHsKKwkJCWlmIChpc2RpZ2l0ICh2YWx1ZVswXSkpIHsKIAkJCQlzd2l0Y2ggKHZhbHVlWzBdIC0gJzAnKSB7Ci0JCQkJY2FzZSAzOgotCQkJCQljYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUgPSBQUk9DRVNTT1JfSU5URUxfMzg2OworCQkJCWNhc2UgMzogY2FjaGVkc2kuZHdQcm9jZXNzb3JUeXBlID0gUFJPQ0VTU09SX0lOVEVMXzM4NjsKIAkJCQkJY2FjaGVkc2kud1Byb2Nlc3NvckxldmVsPSAzOwogCQkJCQlicmVhazsKLQkJCQljYXNlIDQ6Ci0JCQkJCWNhY2hlZHNpLmR3UHJvY2Vzc29yVHlwZSA9IFBST0NFU1NPUl9JTlRFTF80ODY7CisJCQkJY2FzZSA0OiBjYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUgPSBQUk9DRVNTT1JfSU5URUxfNDg2OwogCQkJCQljYWNoZWRzaS53UHJvY2Vzc29yTGV2ZWw9IDQ7CiAJCQkJCWJyZWFrOwotCQkJCWNhc2UgNToKLQkJCQkJY2FjaGVkc2kuZHdQcm9jZXNzb3JUeXBlID0gUFJPQ0VTU09SX0lOVEVMX1BFTlRJVU07CisJCQkJY2FzZSA1OiBjYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUgPSBQUk9DRVNTT1JfSU5URUxfUEVOVElVTTsKIAkJCQkJY2FjaGVkc2kud1Byb2Nlc3NvckxldmVsPSA1OwogCQkJCQlicmVhazsKLQkJCQljYXNlIDY6IC8qIEZJWE1FIGRvZXMgdGhlIFBQcm8gaGF2ZSBhIHNwZWNpYWwgdHlwZT8gKi8KLQkJCQkJY2FjaGVkc2kuZHdQcm9jZXNzb3JUeXBlID0gUFJPQ0VTU09SX0lOVEVMX1BFTlRJVU07CisJCQkJY2FzZSA2OiBjYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUgPSBQUk9DRVNTT1JfSU5URUxfUEVOVElVTTsKIAkJCQkJY2FjaGVkc2kud1Byb2Nlc3NvckxldmVsPSA1OwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CisJCQljb250aW51ZTsKIAkJfQotCQlpZiAoIWxzdHJuY21waTMyQShpbmZvLCJwcm9jZXNzb3IiLDkpKSB7CisJCS8qIG9sZCAyLjAgbWV0aG9kICovCisJCWlmICghbHN0cm5jbXBpMzJBKGxpbmUsICJjcHUiLHN0cmxlbigiY3B1IikpKSB7CisJCQlpZiAoCWlzZGlnaXQgKHZhbHVlWzBdKSAmJiB2YWx1ZVsxXSA9PSAnOCcgJiYgCisJCQkJdmFsdWVbMl0gPT0gJzYnICYmIHZhbHVlWzNdID09IDAKKwkJCSkgeworCQkJCXN3aXRjaCAodmFsdWVbMF0gLSAnMCcpIHsKKwkJCQljYXNlIDM6IGNhY2hlZHNpLmR3UHJvY2Vzc29yVHlwZSA9IFBST0NFU1NPUl9JTlRFTF8zODY7CisJCQkJCWNhY2hlZHNpLndQcm9jZXNzb3JMZXZlbD0gMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OiBjYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUgPSBQUk9DRVNTT1JfSU5URUxfNDg2OworCQkJCQljYWNoZWRzaS53UHJvY2Vzc29yTGV2ZWw9IDQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNTogY2FjaGVkc2kuZHdQcm9jZXNzb3JUeXBlID0gUFJPQ0VTU09SX0lOVEVMX1BFTlRJVU07CisJCQkJCWNhY2hlZHNpLndQcm9jZXNzb3JMZXZlbD0gNTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA2OiBjYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUgPSBQUk9DRVNTT1JfSU5URUxfUEVOVElVTTsKKwkJCQkJY2FjaGVkc2kud1Byb2Nlc3NvckxldmVsPSA1OworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWxzdHJuY21waTMyQShsaW5lLCJmZGl2X2J1ZyIsc3RybGVuKCJmZGl2X2J1ZyIpKSkgeworCQkJaWYgKCFsc3RybmNtcGkzMkEodmFsdWUsInllcyIsMykpCisJCQkJUEZbUEZfRkxPQVRJTkdfUE9JTlRfUFJFQ0lTSU9OX0VSUkFUQV0gPSBUUlVFOworCisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWxzdHJuY21waTMyQShsaW5lLCJmcHUiLHN0cmxlbigiZnB1IikpKSB7CisJCQlpZiAoIWxzdHJuY21waTMyQSh2YWx1ZSwibm8iLDIpKQorCQkJCVBGW1BGX0ZMT0FUSU5HX1BPSU5UX0VNVUxBVEVEXSA9IFRSVUU7CisKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghbHN0cm5jbXBpMzJBKGxpbmUsInByb2Nlc3NvciIsc3RybGVuKCJwcm9jZXNzb3IiKSkpIHsKIAkJCS8qIHByb2Nlc3NvciBudW1iZXIgY291bnRzIHVwLi4uKi8KIAkJCWludAl4OwogCkBAIC04NywxMiArMTM0LDE5IEBACiAJCQkJaWYgKHgrMT5jYWNoZWRzaS5kd051bWJlck9mUHJvY2Vzc29ycykKIAkJCQkJY2FjaGVkc2kuZHdOdW1iZXJPZlByb2Nlc3NvcnM9eCsxOwogCQl9Ci0JCWlmICghbHN0cm5jbXBpMzJBKGluZm8sInN0ZXBwaW5nIiw4KSkgeworCQlpZiAoIWxzdHJuY21waTMyQShsaW5lLCJzdGVwcGluZyIsc3RybGVuKCJzdGVwcGluZyIpKSkgewogCQkJaW50CXg7CiAKIAkJCWlmIChzc2NhbmYodmFsdWUsIiVkIiwmeCkpCiAJCQkJY2FjaGVkc2kud1Byb2Nlc3NvclJldmlzaW9uID0geDsKIAkJfQorCQlpZiAoIWxzdHJuY21waTMyQShsaW5lLCJmbGFncyIsc3RybGVuKCJmbGFncyIpKSkgeworCQkJaWYgKHN0cnN0cih2YWx1ZSwiY3g4IikpCisJCQkJUEZbUEZfQ09NUEFSRV9FWENIQU5HRV9ET1VCTEVdID0gVFJVRTsKKwkJCWlmIChzdHJzdHIodmFsdWUsIm1teCIpKQorCQkJCVBGW1BGX01NWF9JTlNUUlVDVElPTlNfQVZBSUxBQkxFXSA9IFRSVUU7CisKKwkJfQogCX0KIAlmY2xvc2UgKGYpOwogCX0KQEAgLTEwNSw0OCArMTU5LDE1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgQ1BVX1Rlc3RQcm9jZXNzb3JGZWF0dXJlCi0gKi8KLXN0YXRpYyBCT09MMzIgQ1BVX1Rlc3RQcm9jZXNzb3JGZWF0dXJlKGNvbnN0IGNoYXIqIHF1ZXJ5X2luZm8sIGNvbnN0IGNoYXIqIHF1ZXJ5X3ZhbHVlKQotewotICAgIEJPT0wzMiBmbGFnPUZBTFNFOwotI2lmZGVmIGxpbnV4Ci0gICAgY2hhciBsaW5lWzIwMF0saW5mb1syMDBdLHZhbHVlWzIwMF0sanVua1syMDBdOwotICAgIEZJTEUgKmYgPSBmb3BlbiAoIi9wcm9jL2NwdWluZm8iLCAiciIpOwotICAgIAotICAgIGlmICghZikKLSAgICAgIHJldHVybiAwOwotICAgIHdoaWxlIChmZ2V0cyhsaW5lLDIwMCxmKSE9TlVMTCkgewotICAgICAgaWYgKHNzY2FuZihsaW5lLCIlcyVbIFx0Ol0lcyIsaW5mbyxqdW5rLHZhbHVlKSE9MykKLQljb250aW51ZTsKLSAgICAgIGlmIChzdHJjbXAoaW5mbyxxdWVyeV9pbmZvKT09MCkKLQlmbGFnID0gc3Ryc3RyKHZhbHVlLHF1ZXJ5X3ZhbHVlKSE9TlVMTDsKLSAgICB9Ci0gICAgZmNsb3NlIChmKTsKLSNlbHNlICAvKiBsaW51eCAqLwotICAgIC8qIEZJWE1FOiBob3cgZG8gd2UgZG8gdGhpcyBvbiBvdGhlciBzeXN0ZW1zPyAqLwotI2VuZGlmICAvKiBsaW51eCAqLwotICAgIHJldHVybiBmbGFnOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCUlzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQJW0tFUk5FTEwzMi44ODBdCiAgKi8KIEJPT0wzMiBXSU5BUEkgSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudCAoRFdPUkQgZmVhdHVyZSkKIHsKICAgU1lTVEVNX0lORk8gc2k7Ci0gIEdldFN5c3RlbUluZm8gKCZzaSk7Ci0gIHN3aXRjaCAoZmVhdHVyZSkKLSAgICB7Ci0gICAgY2FzZSBQRl9GTE9BVElOR19QT0lOVF9QUkVDSVNJT05fRVJSQVRBOiAKLSAgICAgIHJldHVybiBzaS53UHJvY2Vzc29yTGV2ZWwgPT0gNTsKLSAgICBjYXNlIFBGX0ZMT0FUSU5HX1BPSU5UX0VNVUxBVEVEOgotICAgICAgcmV0dXJuIENQVV9UZXN0UHJvY2Vzc29yRmVhdHVyZSgiZnB1Iiwibm8iKTsgYnJlYWs7Ci0gICAgY2FzZSBQRl9DT01QQVJFX0VYQ0hBTkdFX0RPVUJMRToKLSAgICAgIHJldHVybiBzaS53UHJvY2Vzc29yTGV2ZWwgPj0gNTsKLSAgICBjYXNlIFBGX01NWF9JTlNUUlVDVElPTlNfQVZBSUxBQkxFOgotICAgICAgcmV0dXJuIENQVV9UZXN0UHJvY2Vzc29yRmVhdHVyZSgiZmxhZ3MiLCJtbXgiKTsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIEdldFN5c3RlbUluZm8gKCZzaSk7IC8qIHRvIGVuc3VyZSB0aGUgaW5mb3JtYXRpb24gaXMgbG9hZGVkIGFuZCBjYWNoZWQgKi8KKworICBpZiAoZmVhdHVyZSA8IDY0KQorICAgIHJldHVybiBQRltmZWF0dXJlXTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL21pc2MvbWFpbi5jIGIvbWlzYy9tYWluLmMKaW5kZXggY2E2OGRlMS4uMmZmZmQwYiAxMDA2NDQKLS0tIGEvbWlzYy9tYWluLmMKKysrIGIvbWlzYy9tYWluLmMKQEAgLTEzLDkgKzEzLDkgQEAKICNpZmRlZiBNQUxMT0NfREVCVUdHSU5HCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjZW5kaWYKLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNpbmNsdWRlICJ0c194bGliLmgiCisjaW5jbHVkZSAidHNfeHJlc291cmNlLmgiCisjaW5jbHVkZSAidHNfeHV0aWwuaCIKICNpbmNsdWRlIDxYMTEvWGxvY2FsZS5oPgogI2luY2x1ZGUgPFgxMS9jdXJzb3Jmb250Lmg+CiAjaW5jbHVkZSAid2luc29jay5oIgpAQCAtNTIsNiArNTIsOCBAQAogICAgIHsiSHUiLDB4MDQzNn0sCS8qIExBTkdfSHUgKi8KICAgICB7IlBsIiwweDA0MTV9LCAgICAgIC8qIExBTkdfUGwgKi8KICAgICB7IlBvIiwweDA0MTZ9LCAgICAgIC8qIExBTkdfUG8gKi8KKyAgICB7IlN3IiwweDA0MTd9LCAgICAgIC8qIExBTkdfU3cgKi8KKyAgICB7IkNhIiwgICAgIDB9LCAgICAgIC8qIExBTkdfQ2EgKi8gLyogRklYTUUgbGFuZ3VhZ2VpZCAqLwogICAgIHtOVUxMLDB9CiB9OwogCkBAIC0xMjksNyArMTMxLDcgQEAKICAgIiAgICAtZmFpbHJlYWRvbmx5ICAgUmVhZCBvbmx5IGZpbGVzIG1heSBub3QgYmUgb3BlbmVkIGluIHdyaXRlIG1vZGVcbiIgXAogICAiICAgIC1maXhlZG1hcCAgICAgICBVc2UgYSBcInN0YW5kYXJkXCIgY29sb3IgbWFwXG4iIFwKICAgIiAgICAtaWNvbmljICAgICAgICAgU3RhcnQgYXMgYW4gaWNvblxuIiBcCi0gICIgICAgLWxhbmd1YWdlIHh4ICAgIFNldCB0aGUgbGFuZ3VhZ2UgKG9uZSBvZiBFbixFcyxEZSxObyxGcixGaSxEYSxDeixFbyxJdCxLbyxcbiAgICAgICAgICAgICAgICAgICAgSHUsUGwsUG8pXG4iIFwKKyAgIiAgICAtbGFuZ3VhZ2UgeHggICAgU2V0IHRoZSBsYW5ndWFnZSAob25lIG9mIEVuLEVzLERlLE5vLEZyLEZpLERhLEN6LEVvLEl0LEtvLFxuICAgICAgICAgICAgICAgICAgICBIdSxQbCxQbyxTdyxDYSlcbiIgXAogICAiICAgIC1tYW5hZ2VkICAgICAgICBBbGxvdyB0aGUgd2luZG93IG1hbmFnZXIgdG8gbWFuYWdlIGNyZWF0ZWQgd2luZG93c1xuIiBcCiAgICIgICAgLW1vZGUgbW9kZSAgICAgIFN0YXJ0IFdpbmUgaW4gYSBwYXJ0aWN1bGFyIG1vZGUgKHN0YW5kYXJkIG9yIGVuaGFuY2VkKVxuIiBcCiAgICIgICAgLW5hbWUgbmFtZSAgICAgIFNldCB0aGUgYXBwbGljYXRpb24gbmFtZVxuIiBcCkBAIC0xOTEsNyArMTkzLDcgQEAKICAgICBzdHJjYXQoIGJ1ZmZfaW5zdGFuY2UsIG5hbWUgKTsKICAgICBzdHJjcHkoIGJ1ZmZfY2xhc3MsIFdJTkVfQ0xBU1MgKTsKICAgICBzdHJjYXQoIGJ1ZmZfY2xhc3MsIG5hbWUgKTsKLSAgICByZXR2YWwgPSBYcm1HZXRSZXNvdXJjZSggZGIsIGJ1ZmZfaW5zdGFuY2UsIGJ1ZmZfY2xhc3MsICZkdW1teSwgdmFsdWUgKTsKKyAgICByZXR2YWwgPSBUU1hybUdldFJlc291cmNlKCBkYiwgYnVmZl9pbnN0YW5jZSwgYnVmZl9jbGFzcywgJmR1bW15LCB2YWx1ZSApOwogICAgIGZyZWUoIGJ1ZmZfaW5zdGFuY2UgKTsKICAgICBmcmVlKCBidWZmX2NsYXNzICk7CiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTMwMCw3ICszMDIsNyBAQAogewogICAgIGNoYXIgKmRpc3BsYXlfbmFtZSA9IE5VTEw7CiAgICAgWHJtVmFsdWUgdmFsdWU7Ci0gICAgWHJtRGF0YWJhc2UgZGIgPSBYcm1HZXRGaWxlRGF0YWJhc2UoV0lORV9BUFBfREVGQVVMVFMpOworICAgIFhybURhdGFiYXNlIGRiID0gVFNYcm1HZXRGaWxlRGF0YWJhc2UoV0lORV9BUFBfREVGQVVMVFMpOwogICAgIGludCBpOwogICAgIGNoYXIgKnhybV9zdHJpbmc7CiAKQEAgLTMyMyw3ICszMjUsNyBAQAogICAgIGlmIChkaXNwbGF5X25hbWUgPT0gTlVMTCAmJgogCU1BSU5fR2V0UmVzb3VyY2UoIGRiLCAiLmRpc3BsYXkiLCAmdmFsdWUgKSkgZGlzcGxheV9uYW1lID0gdmFsdWUuYWRkcjsKIAotICAgIGlmICghKGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoIGRpc3BsYXlfbmFtZSApKSkKKyAgICBpZiAoIShkaXNwbGF5ID0gVFNYT3BlbkRpc3BsYXkoIGRpc3BsYXlfbmFtZSApKSkKICAgICB7CiAJZnByaW50Ziggc3RkZXJyLCAiJXM6IENhbid0IG9wZW4gZGlzcGxheTogJXNcbiIsCiAJCSBhcmd2WzBdLCBkaXNwbGF5X25hbWUgPyBkaXNwbGF5X25hbWUgOiAiKG5vbmUgc3BlY2lmaWVkKSIgKTsKQEAgLTMzMSwxNCArMzMzLDE0IEBACiAgICAgfQogCiAgICAgICAvKiBNZXJnZSBmaWxlIGFuZCBzY3JlZW4gZGF0YWJhc2VzICovCi0gICAgaWYgKCh4cm1fc3RyaW5nID0gWFJlc291cmNlTWFuYWdlclN0cmluZyggZGlzcGxheSApKSAhPSBOVUxMKQorICAgIGlmICgoeHJtX3N0cmluZyA9IFRTWFJlc291cmNlTWFuYWdlclN0cmluZyggZGlzcGxheSApKSAhPSBOVUxMKQogICAgIHsKLSAgICAgICAgWHJtRGF0YWJhc2UgZGlzcGxheV9kYiA9IFhybUdldFN0cmluZ0RhdGFiYXNlKCB4cm1fc3RyaW5nICk7Ci0gICAgICAgIFhybU1lcmdlRGF0YWJhc2VzKCBkaXNwbGF5X2RiLCAmZGIgKTsKKyAgICAgICAgWHJtRGF0YWJhc2UgZGlzcGxheV9kYiA9IFRTWHJtR2V0U3RyaW5nRGF0YWJhc2UoIHhybV9zdHJpbmcgKTsKKyAgICAgICAgVFNYcm1NZXJnZURhdGFiYXNlcyggZGlzcGxheV9kYiwgJmRiICk7CiAgICAgfQogCiAgICAgICAvKiBQYXJzZSBjb21tYW5kIGxpbmUgKi8KLSAgICBYcm1QYXJzZUNvbW1hbmQoICZkYiwgb3B0aW9uc1RhYmxlLCBOQl9PUFRJT05TLAorICAgIFRTWHJtUGFyc2VDb21tYW5kKCAmZGIsIG9wdGlvbnNUYWJsZSwgTkJfT1BUSU9OUywKIAkJICAgICBPcHRpb25zLnByb2dyYW1OYW1lLCBhcmdjLCBhcmd2ICk7CiAKICAgICAgIC8qIEdldCBhbGwgb3B0aW9ucyAqLwpAQCAtNDMwLDcgKzQzMiw3IEBACiAgICAgWFRleHRQcm9wZXJ0eSB3aW5kb3dfbmFtZTsKICAgICBBdG9tIFhBX1dNX0RFTEVURV9XSU5ET1c7CiAKLSAgICBmbGFncyA9IFhQYXJzZUdlb21ldHJ5KCBPcHRpb25zLmRlc2t0b3BHZW9tZXRyeSwgJngsICZ5LCAmd2lkdGgsICZoZWlnaHQgKTsKKyAgICBmbGFncyA9IFRTWFBhcnNlR2VvbWV0cnkoIE9wdGlvbnMuZGVza3RvcEdlb21ldHJ5LCAmeCwgJnksICZ3aWR0aCwgJmhlaWdodCApOwogICAgIHNjcmVlbldpZHRoICA9IHdpZHRoOwogICAgIHNjcmVlbkhlaWdodCA9IGhlaWdodDsKIApAQCAtNDM5LDE4ICs0NDEsMTggQEAKICAgICB3aW5fYXR0ci5ldmVudF9tYXNrID0gRXhwb3N1cmVNYXNrIHwgS2V5UHJlc3NNYXNrIHwgS2V5UmVsZWFzZU1hc2sgfAogCSAgICAgICAgICAgICAgICAgUG9pbnRlck1vdGlvbk1hc2sgfCBCdXR0b25QcmVzc01hc2sgfAogCQkJIEJ1dHRvblJlbGVhc2VNYXNrIHwgRW50ZXJXaW5kb3dNYXNrOwotICAgIHdpbl9hdHRyLmN1cnNvciA9IFhDcmVhdGVGb250Q3Vyc29yKCBkaXNwbGF5LCBYQ190b3BfbGVmdF9hcnJvdyApOworICAgIHdpbl9hdHRyLmN1cnNvciA9IFRTWENyZWF0ZUZvbnRDdXJzb3IoIGRpc3BsYXksIFhDX3RvcF9sZWZ0X2Fycm93ICk7CiAKLSAgICByb290V2luZG93ID0gWENyZWF0ZVdpbmRvdyggZGlzcGxheSwgRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSksCisgICAgcm9vdFdpbmRvdyA9IFRTWENyZWF0ZVdpbmRvdyggZGlzcGxheSwgRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSksCiAJCQkgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIDAsCiAJCQkgICAgICAgIENvcHlGcm9tUGFyZW50LCBJbnB1dE91dHB1dCwgQ29weUZyb21QYXJlbnQsCiAJCQkgICAgICAgIENXRXZlbnRNYXNrIHwgQ1dDdXJzb3IsICZ3aW5fYXR0ciApOwogCiAgICAgICAvKiBTZXQgd2luZG93IG1hbmFnZXIgcHJvcGVydGllcyAqLwogCi0gICAgc2l6ZV9oaW50cyAgPSBYQWxsb2NTaXplSGludHMoKTsKLSAgICB3bV9oaW50cyAgICA9IFhBbGxvY1dNSGludHMoKTsKLSAgICBjbGFzc19oaW50cyA9IFhBbGxvY0NsYXNzSGludCgpOworICAgIHNpemVfaGludHMgID0gVFNYQWxsb2NTaXplSGludHMoKTsKKyAgICB3bV9oaW50cyAgICA9IFRTWEFsbG9jV01IaW50cygpOworICAgIGNsYXNzX2hpbnRzID0gVFNYQWxsb2NDbGFzc0hpbnQoKTsKICAgICBpZiAoIXNpemVfaGludHMgfHwgIXdtX2hpbnRzIHx8ICFjbGFzc19oaW50cykKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciB3aW5kb3cgbWFuYWdlciBoaW50cy5cbiIgKTsKQEAgLTQ2OSwxOCArNDcxLDE4IEBACiAgICAgY2xhc3NfaGludHMtPnJlc19uYW1lID0gYXJndlswXTsKICAgICBjbGFzc19oaW50cy0+cmVzX2NsYXNzID0gIldpbmUiOwogCi0gICAgWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSggJm5hbWUsIDEsICZ3aW5kb3dfbmFtZSApOwotICAgIFhTZXRXTVByb3BlcnRpZXMoIGRpc3BsYXksIHJvb3RXaW5kb3csICZ3aW5kb3dfbmFtZSwgJndpbmRvd19uYW1lLAorICAgIFRTWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSggJm5hbWUsIDEsICZ3aW5kb3dfbmFtZSApOworICAgIFRTWFNldFdNUHJvcGVydGllcyggZGlzcGxheSwgcm9vdFdpbmRvdywgJndpbmRvd19uYW1lLCAmd2luZG93X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgYXJndiwgYXJnYywgc2l6ZV9oaW50cywgd21faGludHMsIGNsYXNzX2hpbnRzICk7Ci0gICAgWEFfV01fREVMRVRFX1dJTkRPVyA9IFhJbnRlcm5BdG9tKCBkaXNwbGF5LCAiV01fREVMRVRFX1dJTkRPVyIsIEZhbHNlICk7Ci0gICAgWFNldFdNUHJvdG9jb2xzKCBkaXNwbGF5LCByb290V2luZG93LCAmWEFfV01fREVMRVRFX1dJTkRPVywgMSApOwotICAgIFhGcmVlKCBzaXplX2hpbnRzICk7Ci0gICAgWEZyZWUoIHdtX2hpbnRzICk7Ci0gICAgWEZyZWUoIGNsYXNzX2hpbnRzICk7CisgICAgWEFfV01fREVMRVRFX1dJTkRPVyA9IFRTWEludGVybkF0b20oIGRpc3BsYXksICJXTV9ERUxFVEVfV0lORE9XIiwgRmFsc2UgKTsKKyAgICBUU1hTZXRXTVByb3RvY29scyggZGlzcGxheSwgcm9vdFdpbmRvdywgJlhBX1dNX0RFTEVURV9XSU5ET1csIDEgKTsKKyAgICBUU1hGcmVlKCBzaXplX2hpbnRzICk7CisgICAgVFNYRnJlZSggd21faGludHMgKTsKKyAgICBUU1hGcmVlKCBjbGFzc19oaW50cyApOwogCiAgICAgICAvKiBNYXAgd2luZG93ICovCiAKLSAgICBYTWFwV2luZG93KCBkaXNwbGF5LCByb290V2luZG93ICk7CisgICAgVFNYTWFwV2luZG93KCBkaXNwbGF5LCByb290V2luZG93ICk7CiB9CiAKIApAQCAtNDkxLDcgKzQ5Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIE1BSU5fU2F2ZVNldHVwKHZvaWQpCiB7Ci0gICAgWEdldEtleWJvYXJkQ29udHJvbChkaXNwbGF5LCAma2V5Ym9hcmRfc3RhdGUpOworICAgIFRTWEdldEtleWJvYXJkQ29udHJvbChkaXNwbGF5LCAma2V5Ym9hcmRfc3RhdGUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUwNyw3ICs1MDksNyBAQAogICAgIGtleWJvYXJkX3ZhbHVlLmJlbGxfZHVyYXRpb24JPSBrZXlib2FyZF9zdGF0ZS5iZWxsX2R1cmF0aW9uOwogICAgIGtleWJvYXJkX3ZhbHVlLmF1dG9fcmVwZWF0X21vZGUJPSBrZXlib2FyZF9zdGF0ZS5nbG9iYWxfYXV0b19yZXBlYXQ7CiAKLSAgICBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sKGRpc3BsYXksIEtCS2V5Q2xpY2tQZXJjZW50IHwgS0JCZWxsUGVyY2VudCB8IAorICAgIFRTWENoYW5nZUtleWJvYXJkQ29udHJvbChkaXNwbGF5LCBLQktleUNsaWNrUGVyY2VudCB8IEtCQmVsbFBlcmNlbnQgfCAKICAgICAJS0JCZWxsUGl0Y2ggfCBLQkJlbGxEdXJhdGlvbiB8IEtCQXV0b1JlcGVhdE1vZGUsICZrZXlib2FyZF92YWx1ZSk7CiB9CiAKQEAgLTU1NCw3ICs1NTYsNyBAQAogICAgIGdldHRpbWVvZmRheSggJnR2LCBOVUxMKTsKICAgICBNU0dfV2luZVN0YXJ0VGlja3MgPSAodHYudHZfc2VjICogMTAwMCkgKyAodHYudHZfdXNlYyAvIDEwMDApOwogCi0gICAgWHJtSW5pdGlhbGl6ZSgpOworICAgIFRTWHJtSW5pdGlhbGl6ZSgpOwogCiAgICAgcHV0ZW52KCJYS0JfRElTQUJMRT0iKTsgLyogRGlzYWJsZSBYS0IgZXh0ZW5zaW9uIGlmIHByZXNlbnQuICovCiAKQEAgLTU3MiwxMCArNTc0LDEwIEBACiAgICAgc2NyZWVuSGVpZ2h0ID0gSGVpZ2h0T2ZTY3JlZW4oIHNjcmVlbiApOwogICAgIGlmIChzY3JlZW5EZXB0aCkgIC8qIC1kZXB0aCBvcHRpb24gc3BlY2lmaWVkICovCiAgICAgewotCWRlcHRoX2xpc3QgPSBYTGlzdERlcHRocyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksJmRlcHRoX2NvdW50KTsKKwlkZXB0aF9saXN0ID0gVFNYTGlzdERlcHRocyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksJmRlcHRoX2NvdW50KTsKIAlmb3IgKGkgPSAwOyBpIDwgZGVwdGhfY291bnQ7IGkrKykKIAkgICAgaWYgKGRlcHRoX2xpc3RbaV0gPT0gc2NyZWVuRGVwdGgpIGJyZWFrOwotCVhGcmVlKCBkZXB0aF9saXN0ICk7CisJVFNYRnJlZSggZGVwdGhfbGlzdCApOwogCWlmIChpID49IGRlcHRoX2NvdW50KQogCXsKIAkgICAgZnByaW50Ziggc3RkZXJyLCAiJXM6IERlcHRoICVkIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzY3JlZW4uXG4iLApAQCAtNTg0LDcgKzU4Niw3IEBACiAJfQogICAgIH0KICAgICBlbHNlIHNjcmVlbkRlcHRoICA9IERlZmF1bHREZXB0aE9mU2NyZWVuKCBzY3JlZW4gKTsKLSAgICBpZiAoT3B0aW9ucy5zeW5jaHJvbm91cykgWFN5bmNocm9uaXplKCBkaXNwbGF5LCBUcnVlICk7CisgICAgaWYgKE9wdGlvbnMuc3luY2hyb25vdXMpIFRTWFN5bmNocm9uaXplKCBkaXNwbGF5LCBUcnVlICk7CiAgICAgaWYgKE9wdGlvbnMuZGVza3RvcEdlb21ldHJ5KSBNQUlOX0NyZWF0ZURlc2t0b3AoICphcmdjLCBhcmd2ICk7CiAgICAgZWxzZSByb290V2luZG93ID0gRGVmYXVsdFJvb3RXaW5kb3coIGRpc3BsYXkgKTsKIApAQCAtNjA4LDcgKzYxMCw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgTWVzc2FnZUJlZXAzMiggVUlOVDMyIGkgKQogewotICAgIFhCZWxsKCBkaXNwbGF5LCAwICk7CisgICAgVFNYQmVsbCggZGlzcGxheSwgMCApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC02MTksNyArNjIxLDcgQEAKIEJPT0wzMiBXSU5BUEkgQmVlcCggRFdPUkQgZHdGcmVxLCBEV09SRCBkd0R1ciApCiB7CiAgICAgLyogZHdGcmVxIGFuZCBkd0R1ciBhcmUgaWdub3JlZCBieSBXaW45NSAqLwotICAgIFhCZWxsKGRpc3BsYXksIDApOworICAgIFRTWEJlbGwoZGlzcGxheSwgMCk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTY0Myw3ICs2NDUsNyBAQAogCiAJc3dpdGNoICh1QWN0aW9uKSB7CiAJY2FzZSBTUElfR0VUQkVFUDoKLQkJWEdldEtleWJvYXJkQ29udHJvbChkaXNwbGF5LCAma2V5Ym9hcmRfc3RhdGUpOworCQlUU1hHZXRLZXlib2FyZENvbnRyb2woZGlzcGxheSwgJmtleWJvYXJkX3N0YXRlKTsKIAkJaWYgKGtleWJvYXJkX3N0YXRlLmJlbGxfcGVyY2VudCA9PSAwKQogCQkJKihCT09MMzIgKikgbHB2UGFyYW0gPSBGQUxTRTsKIAkJZWxzZQpAQCAtNjkwLDcgKzY5Miw3IEBACiAKIAljYXNlIFNQSV9HRVRTQ1JFRU5TQVZFVElNRU9VVDoKIAkvKiBGSVhNRSBHZXRQcm9maWxlSW50KCAid2luZG93cyIsICJTY3JlZW5TYXZlVGltZW91dCIsIDMwMCApOyAqLwotCQlYR2V0U2NyZWVuU2F2ZXIoZGlzcGxheSwgJnRpbWVvdXQsICZ0ZW1wLCZ0ZW1wLCZ0ZW1wKTsKKwkJVFNYR2V0U2NyZWVuU2F2ZXIoZGlzcGxheSwgJnRpbWVvdXQsICZ0ZW1wLCZ0ZW1wLCZ0ZW1wKTsKIAkJKihJTlQzMiAqKSBscHZQYXJhbSA9IHRpbWVvdXQgKiAxMDAwOwogCQlicmVhazsKIApAQCAtNzc5LDcgKzc4MSw3IEBACiAJc3dpdGNoICh1QWN0aW9uKQogICAgICAgICB7CiAJCWNhc2UgU1BJX0dFVEJFRVA6Ci0JCQlYR2V0S2V5Ym9hcmRDb250cm9sKGRpc3BsYXksICZrZXlib2FyZF9zdGF0ZSk7CisJCQlUU1hHZXRLZXlib2FyZENvbnRyb2woZGlzcGxheSwgJmtleWJvYXJkX3N0YXRlKTsKIAkJCWlmIChrZXlib2FyZF9zdGF0ZS5iZWxsX3BlcmNlbnQgPT0gMCkKIAkJCQkqKEJPT0wxNiAqKSBscHZQYXJhbSA9IEZBTFNFOwogCQkJZWxzZQpAQCAtODMzLDcgKzgzNSw3IEBACiAKIAkJY2FzZSBTUElfR0VUU0NSRUVOU0FWRVRJTUVPVVQ6CiAJCQkvKiBGSVhNRSBHZXRQcm9maWxlSW50KCAid2luZG93cyIsICJTY3JlZW5TYXZlVGltZW91dCIsIDMwMCApOyAqLwotCQkJWEdldFNjcmVlblNhdmVyKGRpc3BsYXksICZ0aW1lb3V0LCAmdGVtcCwmdGVtcCwmdGVtcCk7CisJCQlUU1hHZXRTY3JlZW5TYXZlcihkaXNwbGF5LCAmdGltZW91dCwgJnRlbXAsJnRlbXAsJnRlbXApOwogCQkJKihJTlQxNiAqKSBscHZQYXJhbSA9IHRpbWVvdXQgKiAxMDAwOwogCQkJYnJlYWs7CiAKQEAgLTg1OCwxOSArODYwLDE5IEBACiAJCQkJa2V5Ym9hcmRfdmFsdWUuYmVsbF9wZXJjZW50ID0gLTE7CiAJCQllbHNlCiAJCQkJa2V5Ym9hcmRfdmFsdWUuYmVsbF9wZXJjZW50ID0gMDsJCQkKLSAgIAkJCVhDaGFuZ2VLZXlib2FyZENvbnRyb2woZGlzcGxheSwgS0JCZWxsUGVyY2VudCwgCisgICAJCQlUU1hDaGFuZ2VLZXlib2FyZENvbnRyb2woZGlzcGxheSwgS0JCZWxsUGVyY2VudCwgCiAgICAJCQkJCQkJJmtleWJvYXJkX3ZhbHVlKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU1BJX1NFVFNDUkVFTlNBVkVBQ1RJVkU6CiAJCQlpZiAodVBhcmFtID09IFRSVUUpCi0JCQkJWEFjdGl2YXRlU2NyZWVuU2F2ZXIoZGlzcGxheSk7CisJCQkJVFNYQWN0aXZhdGVTY3JlZW5TYXZlcihkaXNwbGF5KTsKIAkJCWVsc2UKLQkJCQlYUmVzZXRTY3JlZW5TYXZlcihkaXNwbGF5KTsKKwkJCQlUU1hSZXNldFNjcmVlblNhdmVyKGRpc3BsYXkpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTUElfU0VUU0NSRUVOU0FWRVRJTUVPVVQ6Ci0JCQlYU2V0U2NyZWVuU2F2ZXIoZGlzcGxheSwgdVBhcmFtLCA2MCwgRGVmYXVsdEJsYW5raW5nLCAKKwkJCVRTWFNldFNjcmVlblNhdmVyKGRpc3BsYXksIHVQYXJhbSwgNjAsIERlZmF1bHRCbGFua2luZywgCiAJCQkJCQkJRGVmYXVsdEV4cG9zdXJlcyk7CiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbWlzYy9uZXR3b3JrLmMgYi9taXNjL25ldHdvcmsuYwppbmRleCA1OGI4Y2JkLi42MDFjYTA3IDEwMDY0NAotLS0gYS9taXNjL25ldHdvcmsuYworKysgYi9taXNjL25ldHdvcmsuYwpAQCAtOCwzMiArOCw3IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKLQotI2RlZmluZSBXTl9TVUNDRVNTICAgICAgIAkJCTB4MDAwMAotI2RlZmluZSBXTl9OT1RfU1VQUE9SVEVEIAkJCTB4MDAwMQotI2RlZmluZSBXTl9ORVRfRVJST1IgICAgIAkJCTB4MDAwMgotI2RlZmluZSBXTl9NT1JFX0RBVEEgICAgIAkJCTB4MDAwMwotI2RlZmluZSBXTl9CQURfUE9JTlRFUiAgIAkJCTB4MDAwNAotI2RlZmluZSBXTl9CQURfVkFMVUUgICAgIAkJCTB4MDAwNQotI2RlZmluZSBXTl9CQURfUEFTU1dPUkQgIAkJCTB4MDAwNgotI2RlZmluZSBXTl9BQ0NFU1NfREVOSUVEIAkJCTB4MDAwNwotI2RlZmluZSBXTl9GVU5DVElPTl9CVVNZIAkJCTB4MDAwOAotI2RlZmluZSBXTl9XSU5ET1dTX0VSUk9SIAkJCTB4MDAwOQotI2RlZmluZSBXTl9CQURfVVNFUiAgICAgIAkJCTB4MDAwQQotI2RlZmluZSBXTl9PVVRfT0ZfTUVNT1JZIAkJCTB4MDAwQgotI2RlZmluZSBXTl9DQU5DRUwgICAgICAgIAkJCTB4MDAwQwotI2RlZmluZSBXTl9DT05USU5VRSAgICAgIAkJCTB4MDAwRAotI2RlZmluZSBXTl9OT1RfQ09OTkVDVEVEIAkJCTB4MDAzMAotI2RlZmluZSBXTl9PUEVOX0ZJTEVTICAgIAkJCTB4MDAzMQotI2RlZmluZSBXTl9CQURfTkVUTkFNRSAgIAkJCTB4MDAzMgotI2RlZmluZSBXTl9CQURfTE9DQUxOQU1FIAkJCTB4MDAzMwotI2RlZmluZSBXTl9BTFJFQURZX0NPTk5FQ1RFRAkJMHgwMDM0Ci0jZGVmaW5lIFdOX0RFVklDRV9FUlJPUiAgICAgCQkweDAwMzUKLSNkZWZpbmUgV05fQ09OTkVDVElPTl9DTE9TRUQJCTB4MDAzNgotI2RlZmluZSBXTl9OT19ORVRXT1JLCQkJCUVSUk9SX05PX05FVFdPUksKLQotCi10eXBlZGVmIExQVk9JRAlMUE5FVFJFU09VUkNFMTY7CisjaW5jbHVkZSAid25ldC5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICBXTmV0RXJyb3JUZXh0ICAgICAgIFtVU0VSLjQ5OV0KQEAgLTE5Miw3ICsxNjcsNzAgQEAKICAqLwogaW50IFdJTkFQSSBXTmV0R2V0Q2FwcyhXT1JEIGNhcGFiaWxpdHkpCiB7Ci0JcmV0dXJuIDA7CisJc3dpdGNoIChjYXBhYmlsaXR5KSB7CisJCWNhc2UgV05OQ19TUEVDX1ZFUlNJT046CisJCXsKKwkJCXJldHVybiAweDMwYTsgLyogV2ZXIDMuMTEgKGFuZCBhcHBhcmVudGx5IG90aGVyIDMuMXgpICovCisJCX0KKwkJY2FzZSBXTk5DX05FVF9UWVBFOgorCQkvKiBoaSBieXRlID0gbmV0d29yayB0eXBlLCBsbyBieXRlID0gbmV0d29yayB2ZW5kb3IgKE5ldHdhcmUgPSAweDAzKSBbMTUgdHlwZXNdICovCisJCXJldHVybiBXTk5DX05FVF9NdWx0aU5ldCB8IFdOTkNfU1VCTkVUX1dpbldvcmtncm91cHM7CisKKwkJY2FzZSBXTk5DX0RSSVZFUl9WRVJTSU9OOgorCQkvKiBkcml2ZXIgdmVyc2lvbiBvZiB2ZW5kb3IgKi8KKwkJcmV0dXJuIDB4MTAwOyAvKiBXZlcgMy4xMSAqLworCisJCWNhc2UgV05OQ19VU0VSOgorCQkvKiAxID0gV05ldEdldFVzZXIgaXMgc3VwcG9ydGVkICovCisJCXJldHVybiAxOworCisJCWNhc2UgV05OQ19DT05ORUNUSU9OOgorCQkvKiByZXR1cm5zIG1hc2sgb2YgdGhlIHN1cHBvcnRlZCBjb25uZWN0aW9uIGZ1bmN0aW9ucyAqLworCQlyZXR1cm4JV05OQ19DT05fQWRkQ29ubmVjdGlvbnxXTk5DX0NPTl9DYW5jZWxDb25uZWN0aW9uCisJCQl8V05OQ19DT05fR2V0Q29ubmVjdGlvbnMvKnxXTk5DX0NPTl9BdXRvQ29ubmVjdCovCisJCQl8V05OQ19DT05fQnJvd3NlRGlhbG9nfFdOTkNfQ09OX1Jlc3RvcmVDb25uZWN0aW9uOworCisJCWNhc2UgV05OQ19QUklOVElORzoKKwkJLyogcmV0dXJucyBtYXNrIG9mIHRoZSBzdXBwb3J0ZWQgcHJpbnRpbmcgZnVuY3Rpb25zICovCisJCXJldHVybglXTk5DX1BSVF9PcGVuSm9ifFdOTkNfUFJUX0Nsb3NlSm9ifFdOTkNfUFJUX0hvbGRKb2IKKwkJCXxXTk5DX1BSVF9SZWxlYXNlSm9ifFdOTkNfUFJUX0NhbmNlbEpvYgorCQkJfFdOTkNfUFJUX1NldEpvYkNvcGllc3xXTk5DX1BSVF9XYXRjaFF1ZXVlCisJCQl8V05OQ19QUlRfVW53YXRjaFF1ZXVlfFdOTkNfUFJUX0xvY2tRdWV1ZURhdGEKKwkJCXxXTk5DX1BSVF9VbmxvY2tRdWV1ZURhdGF8V05OQ19QUlRfQWJvcnRKb2IKKwkJCXxXTk5DX1BSVF9Xcml0ZUpvYjsKKworCQljYXNlIFdOTkNfRElBTE9HOgorCQkvKiByZXR1cm5zIG1hc2sgb2YgdGhlIHN1cHBvcnRlZCBkaWFsb2cgZnVuY3Rpb25zICovCisJCXJldHVybglXTk5DX0RMR19EZXZpY2VNb2RlfFdOTkNfRExHX0Jyb3dzZURpYWxvZworCQkJfFdOTkNfRExHX0Nvbm5lY3REaWFsb2d8V05OQ19ETEdfRGlzY29ubmVjdERpYWxvZworCQkJfFdOTkNfRExHX1ZpZXdRdWV1ZURpYWxvZ3xXTk5DX0RMR19Qcm9wZXJ0eURpYWxvZworCQkJfFdOTkNfRExHX0Nvbm5lY3Rpb25EaWFsb2cKKwkJCS8qfFdOTkNfRExHX1ByaW50ZXJDb25uZWN0RGlhbG9nCisJCQl8V05OQ19ETEdfU2hhcmVzRGlhbG9nfFdOTkNfRExHX1NoYXJlQXNEaWFsb2cqLzsKKworCQljYXNlIFdOTkNfQURNSU46CisJCS8qIHJldHVybnMgbWFzayBvZiB0aGUgc3VwcG9ydGVkIGFkbWluaXN0cmF0aW9uIGZ1bmN0aW9ucyAqLworCQkvKiBub3Qgc3VyZSBpZiBsb25nIGZpbGUgbmFtZXMgaXMgYSBnb29kIGlkZWEgKi8KKwkJcmV0dXJuCVdOTkNfQURNX0dldERpcmVjdG9yeVR5cGV8V05OQ19BRE1fRGlyZWN0b3J5Tm90aWZ5CisJCQl8V05OQ19BRE1fTG9uZ05hbWVzLyp8V05OQ19BRE1fU2V0RGVmYXVsdERyaXZlKi87CisKKwkJY2FzZSBXTk5DX0VSUk9SOgorCQkvKiByZXR1cm5zIG1hc2sgb2YgdGhlIHN1cHBvcnRlZCBlcnJvciBmdW5jdGlvbnMgKi8KKwkJcmV0dXJuCVdOTkNfRVJSX0dldEVycm9yfFdOTkNfRVJSX0dldEVycm9yVGV4dDsKKworCQljYXNlIFdOTkNfUFJJTlRNR1JFWFQ6CisJCS8qIHJldHVybnMgdGhlIFByaW50IE1hbmFnZXIgdmVyc2lvbiBpbiBtYWpvciBhbmQgbWlub3IgZm9ybWF0IGlmIFByaW50IE1hbmFnZXIgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgKi8KKwkJcmV0dXJuIDB4MzBlOyAvKiBwcmludG1hbiB2ZXJzaW9uIG9mIFdmVyAzLjExICovCisKKwkJY2FzZSAweGZmZmY6CisJCS8qIFdpbiAzLjExIHJldHVybnMgSE1PRFVMRSBvZiBuZXR3b3JrIGRyaXZlciBoZXJlCisJCUZJWE1FOiB3aGF0IHNob3VsZCB3ZSByZXR1cm4gPworCQlsb2dvbm9mZi5leGUgbmVlZHMgaXQsIG1zbWFpbCBjcmFzaGVzIHdpdGggd3JvbmcgdmFsdWUgKi8KKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWlzYy9yZWdpc3RyeS5jIGIvbWlzYy9yZWdpc3RyeS5jCmluZGV4IDlhYTA0Y2UuLjEzNDNmYjQgMTAwNjQ0Ci0tLSBhL21pc2MvcmVnaXN0cnkuYworKysgYi9taXNjL3JlZ2lzdHJ5LmMKQEAgLTkyNSw5ICs5MjUsOSBAQAogICogICAgICAweDIwIC4uLiBvZmZzZXRfb2ZfUkdEQl9wYXJ0OiBEaXNrIEtleSBFbnRyeSBzdHJ1Y3R1cmVzCiAgKgogICogICBEaXNrIEtleSBFbnRyeSBTdHJ1Y3R1cmU6Ci0gKgkwMDogRFdPUkQJLSB1bmtub3duCi0gKgkwNDogRFdPUkQJLSB1bmtub3duCi0gKgkwODogRFdPUkQJLSB1bmtub3duLCBidXQgdXN1YWxseSAweEZGRkZGRkZGIG9uIHdpbjk1IHN5c3RlbXMKKyAqCTAwOiBEV09SRAktIEZyZWUgZW50cnkgaW5kaWNhdG9yKD8pCisgKgkwNDogRFdPUkQJLSBIYXNoID0gc3VtIG9mIGJ5dGVzIG9mIGtleW5hbWUKKyAqCTA4OiBEV09SRAktIFJvb3Qga2V5IGluZGljYXRvcj8gdW5rbm93biwgYnV0IHVzdWFsbHkgMHhGRkZGRkZGRiBvbiB3aW45NSBzeXN0ZW1zCiAgKgkwQzogRFdPUkQJLSBkaXNrIGFkZHJlc3Mgb2YgUHJldmlvdXNMZXZlbCBLZXkuCiAgKgkxMDogRFdPUkQJLSBkaXNrIGFkZHJlc3Mgb2YgTmV4dCBTdWJsZXZlbCBLZXkuCiAgKgkxNDogRFdPUkQJLSBkaXNrIGFkZHJlc3Mgb2YgTmV4dCBLZXkgKG9uIHNhbWUgbGV2ZWwpLgpAQCAtOTM4LDE1ICs5MzgsMTUgQEAKICAqIG9mIHRoZSByZWZlcmVuY2VkIGtleS4gRG9uJ3QgYXNrIG1lIHdoeSwgb3IgZXZlbiBpZiBJIGdvdCB0aGlzIGNvcnJlY3QKICAqIGZyb20gc3RhcmluZyBhdCAxa2cgb2YgaGV4ZHVtcHMuIChES0VQKQogICoKLSAqIFRoZSBudW1iZXIgb2YgdGhlIGVudHJ5IGlzIHRoZSBsb3cgYnl0ZSBvZiB0aGUgTG93IFNpZ25pZmljYW50IFBhcnQgb3JlZAotICogd2l0aCAweDEwMCAqIChsb3cgYnl0ZSBvZiB0aGUgSGlnaCBTaWduaWZpY2FudCBwYXJ0KQotICogKEMgZXhwcmVzc2lvbiA6IG5yID0gKG5yTFMgJiAweEZGKSB8ICgobnJIUyAmMHhGRik8PDgpKQorICogVGhlIEhpZ2ggc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgc3RydWN0dXJlIHNlZW1zIHRvIGVxdWFsIHRoZSBudW1iZXIKKyAqIG9mIHRoZSBSR0RCIHNlY3Rpb24uIFRoZSBsb3cgc2lnbmlmaWNhbnQgcGFydCBpcyBhIHVuaXF1ZSBJRCB3aXRoaW4KKyAqIHRoYXQgUkdEQiBzZWN0aW9uCiAgKgogICogVGhlcmUgYXJlIHR3byBtaW5vciBjb3JyZWN0aW9ucyB0byB0aGUgcG9zaXRpb24gb2YgdGhhdCBzdHJ1Y3R1cmUuCiAgKiAxLiBJZiB0aGUgYWRkcmVzcyBpcyB4eHgwMTQgb3IgeHh4MDE4IGl0IHdpbGwgYmUgYWxpZ25lZCB0byB4eHgwMWMgQU5EIAogICogICAgdGhlIERLRSByZXJlYWQgZnJvbSB0aGVyZS4KICAqIDIuIElmIHRoZSBhZGRyZXNzIGlzIHh4eEZGeCBpdCB3aWxsIGJlIGFsaWduZWQgdG8gKHh4eCsxKTAwMC4KLSAqIChGSVhNRTogc2xpZ2h0bHkgYmV0dGVyIGV4cGxhbmF0aW9uIG5lZWRlZCBoZXJlKQorICogQ1BTIC0gSSBoYXZlIG5vdCBleHBlcmllbmNlZCB0aGUgYWJvdmUgcGhlbm9tZW5vbiBpbiBteSByZWdpc3RyeSBmaWxlcwogICoKICAqIFJHREJfc2VjdGlvbjoKICAqIAkwMDoJCSJSR0RCIgktIG1hZ2ljCkBAIC0xMDAzLDE0OSArMTAwMywzOCBAQAogCWNoYXIJCQkqbmFtZTsKIAlpbnQJCQlucm9mdmFsczsKIAlzdHJ1Y3QJX3c5NWtleXZhbHVlCSp2YWx1ZXM7Ci0JdW5zaWduZWQgbG9uZwkJZGtlYWRkcjsKLQl1bnNpZ25lZCBsb25nIAkJeDE7Ci0JdW5zaWduZWQgbG9uZyAJCXgyOwotCXVuc2lnbmVkIGxvbmcgCQl4MzsKLQl1bnNpZ25lZCBsb25nIAkJeHgxOwogCXN0cnVjdCBfdzk1a2V5CQkqcHJldmx2bDsKIAlzdHJ1Y3QgX3c5NWtleQkJKm5leHRzdWI7CiAJc3RydWN0IF93OTVrZXkJCSpuZXh0OwogfTsKIAotLyogZmFzdCBsb29rdXAgdGFibGUgZGtlYWRkci0+bnIgKi8KLXN0cnVjdCAJX3c5NW5yMmRhIHsKLQl1bnNpZ25lZCBsb25nCQlka2VhZGRyOwotCXVuc2lnbmVkIGxvbmcJCW5yOwotCXN0cnVjdCBfdzk1a2V5CQkqa2V5OworCitzdHJ1Y3QgX3c5NV9pbmZvIHsKKyAgY2hhciAqcmdrbmJ1ZmZlcjsKKyAgaW50ICByZ2tuc2l6ZTsKKyAgY2hhciAqcmdkYmJ1ZmZlcjsKKyAgaW50ICByZ2Ric2l6ZTsKKyAgaW50ICBkZXB0aDsKKyAgaW50ICBsYXN0bW9kaWZpZWQ7CiB9OwogCitMUFdTVFIgc3RyY3Z0QTJXKExQQ1NUUiBzcmMsIGludCBuY2hhcnMpCiAKLXN0YXRpYyB2b2lkCi1fdzk1X3dhbGtfdHJlZShMUEtFWVNUUlVDVCBscGtleSxzdHJ1Y3QgX3c5NWtleSAqa2V5KSB7Ci0JaW50CQlpOwotCUxQS0VZU1RSVUNUCWxweGtleTsKLQlMUFdTVFIJCW5hbWU7Cit7CisgICBMUFdTVFIgZGVzdCA9IHhtYWxsb2MgKDIgKiBuY2hhcnMgKyAyKTsKIAotCXdoaWxlIChrZXkpIHsKLQkJaWYgKGtleS0+bmFtZSA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwiX3c5NV93YWxrX3RyZWU6UGxlYXNlIHJlcG9ydDoga2V5IHdpdGggZGtlYWRkciAlbHggbm90IGxvYWRlZCwgc2tpcHBpbmcgaGllcmFyY2h5XG4iLAotCQkJCWtleS0+ZGtlYWRkcgotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQlscHhrZXk9X2ZpbmRfb3JfYWRkX2tleShscGtleSxzdHJkdXBBMlcoa2V5LT5uYW1lKSk7Ci0KLQkJaWYgKGtleS0+bnJvZnZhbHM8MCkgewotCQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwotCQkJZnByaW50ZihzdGRlcnIsImtleSAlcyBhbHJlYWR5IHByb2Nlc3NlZCFcbiIsa2V5LT5uYW1lKTsKLQkJCWtleSA9IGtleS0+bmV4dDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWZvciAoaT0wO2k8a2V5LT5ucm9mdmFscztpKyspIHsKLQkJCUxQQllURQlkYXRhOwotCQkJaW50CWxlbjsKLQotCQkJbmFtZSA9IHN0cmR1cEEyVyhrZXktPnZhbHVlc1tpXS5uYW1lKTsKLQkJCWlmICghKm5hbWUpIHsKLQkJCQlmcmVlKG5hbWUpOwotCQkJCW5hbWUgPSBOVUxMOwotCQkJfQotCQkJZnJlZShrZXktPnZhbHVlc1tpXS5uYW1lKTsKLQotCQkJbGVuCT0ga2V5LT52YWx1ZXNbaV0uZGF0YWxlbjsKLQkJCWRhdGEJPSBrZXktPnZhbHVlc1tpXS5kYXRhOwotCQkJaWYgKCgxPDxrZXktPnZhbHVlc1tpXS50eXBlKSAmIFVOSUNPTlZNQVNLKSB7Ci0JCQkJZGF0YSA9IChCWVRFKilzdHJkdXBBMlcoZGF0YSk7Ci0JCQkJbGVuICA9IGxzdHJsZW4zMlcoKExQV1NUUilkYXRhKSoyKzI7Ci0JCQkJZnJlZShrZXktPnZhbHVlc1tpXS5kYXRhKTsKLQkJCX0KLQkJCV9maW5kX29yX2FkZF92YWx1ZSgKLQkJCQlscHhrZXksCi0JCQkJbmFtZSwKLQkJCQlrZXktPnZhbHVlc1tpXS50eXBlLAotCQkJCWRhdGEsCi0JCQkJbGVuLAotCQkJCWtleS0+dmFsdWVzW2ldLmxhc3Rtb2RpZmllZAotCQkJKTsKLQkJfQotCQlpZiAoa2V5LT52YWx1ZXMpIHsKLQkJCWZyZWUoa2V5LT52YWx1ZXMpOwotCQkJa2V5LT52YWx1ZXMgPSBOVUxMOwotCQl9Ci0JCWtleS0+bnJvZnZhbHM9LWtleS0+bnJvZnZhbHMtMTsKLQkJX3c5NV93YWxrX3RyZWUobHB4a2V5LGtleS0+bmV4dHN1Yik7Ci0JCWtleT1rZXktPm5leHQ7Ci0JfQorICAgbHN0cmNweW5BdG9XKGRlc3Qsc3JjLCBuY2hhcnMpOworICAgZGVzdFtuY2hhcnNdID0gMDsKKyAgIHJldHVybiBkZXN0OwogfQogCi0vKiBzbWFsbCBoZWxwZXIgZnVuY3Rpb24gdG8gYWRqdXN0IGFkZHJlc3Mgb2Zmc2V0IChka2VhZGRycykgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1fdzk1X2Fkal9kYSh1bnNpZ25lZCBsb25nIGRrZWFkZHIpIHsKLQlpZiAoKGRrZWFkZHImMHhGRkYpPDB4MDE4KSB7Ci0JCWludAlkaWZmOworc3RhdGljIExQS0VZU1RSVUNUIF93OTVfcHJvY2Vzc0tleSAoIExQS0VZU1RSVUNUIGxwa2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5yTFMsIGludCBuck1TLCBzdHJ1Y3QgX3c5NV9pbmZvICppbmZvICkKIAotCQlkaWZmPTB4MUMtKGRrZWFkZHImMHhGRkYpOwotCQlyZXR1cm4gZGtlYWRkcitkaWZmOwotCX0KLQlpZiAoKChka2VhZGRyKzB4MUMpJjB4RkZGKTwweDFDKSB7Ci0JCS8qIHJlYWRqdXN0IHRvIDB4MDAwLAotCQkgKiBidXQgT05MWSBpZiB3ZSBhcmUgPjB4MTAwMCBhbHJlYWR5Ci0JCSAqLwotCQlpZiAoZGtlYWRkciAmIH4weEZGRikKLQkJCXJldHVybiBka2VhZGRyICYgfjB4RkZGOwotCX0KLQlyZXR1cm4gZGtlYWRkcjsKLX0KLQotc3RhdGljIGludAotX3c5NWRrZWNvbXAoc3RydWN0IF93OTVucjJkYSAqYSxzdHJ1Y3QgX3c5NW5yMmRhICpiKXtyZXR1cm4gYS0+ZGtlYWRkci1iLT5ka2VhZGRyO30KLQotc3RhdGljIHN0cnVjdCBfdzk1a2V5KgotX3c5NWRrZWxvb2t1cCh1bnNpZ25lZCBsb25nIGRrZWFkZHIsaW50IG4sc3RydWN0IF93OTVucjJkYSAqbnIyZGEsc3RydWN0IF93OTVrZXkgKmtleXMpIHsKLWludAlpOwotaW50IGxlZnQsIHJpZ2h0OwotCi0JaWYgKGRrZWFkZHIgPT0gMHhGRkZGRkZGRikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRrZWFkZHI8MHgyMCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGtlYWRkcj1fdzk1X2Fkal9kYShka2VhZGRyKzB4MWMpOwotCWxlZnQ9MDsKLQlyaWdodD1uLTE7Ci0Jd2hpbGUobGVmdDw9cmlnaHQpCi0JewotCQlpPShsZWZ0K3JpZ2h0KS8yOwotCi0JCWlmKG5yMmRhW2ldLmRrZWFkZHIgPT0gZGtlYWRkcikKLQkJCXJldHVybiBucjJkYVtpXS5rZXk7Ci0JCWVsc2UgaWYobnIyZGFbaV0uZGtlYWRkciA8IGRrZWFkZHIpCi0JCQlsZWZ0PWkrMTsKLQkJZWxzZQotCQkJcmlnaHQ9aS0xOwotCX0KLQkvKiAweDNDIGhhcHBlbnMgb2Z0ZW4sIGp1c3QgcmVwb3J0IHVudXN1YWwgdmFsdWVzICovCi0JaWYgKGRrZWFkZHIhPTB4M2MpCi0JCWRwcmludGZfcmVnKHN0ZGRlYiwic2VhcmNoIGhhc24ndCBmb3VuZCBka2VhZGRyICVseD9cbiIsZGtlYWRkcik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1fdzk1X2xvYWRyZWcoY2hhciogZm4sTFBLRVlTVFJVQ1QgbHBrZXkpIHsKLQkvKiBEaXNrIEtleSBFbnRyeSBzdHJ1Y3R1cmUgKFJHS04gcGFydCkgKi8KLQlzdHJ1Y3QJZGtlIHsKLQkJdW5zaWduZWQgbG9uZwkJeDE7Ci0JCXVuc2lnbmVkIGxvbmcJCXgyOwotCQl1bnNpZ25lZCBsb25nCQl4MzsvKnVzdWFsbHkgMHhGRkZGRkZGRiAqLwotCQl1bnNpZ25lZCBsb25nCQlwcmV2bHZsOwotCQl1bnNpZ25lZCBsb25nCQluZXh0c3ViOwotCQl1bnNpZ25lZCBsb25nCQluZXh0OwotCQl1bnNpZ25lZCBzaG9ydAkJbnJMUzsKLQkJdW5zaWduZWQgc2hvcnQJCW5yTVM7Ci0JfTsKLQkvKiBEaXNrIEtleSBIZWFkZXIgc3RydWN0dXJlIChSR0RCIHBhcnQpICovCi0Jc3RydWN0CWRraCB7Ci0JCXVuc2lnbmVkIGxvbmcJCW5leHRrZXlvZmY7IAoreworICAvKiBEaXNrIEtleSBIZWFkZXIgc3RydWN0dXJlIChSR0RCIHBhcnQpICovCisgIHN0cnVjdAlka2ggeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcJCW5leHRrZXlvZmY7IAogCQl1bnNpZ25lZCBzaG9ydAkJbnJMUzsKIAkJdW5zaWduZWQgc2hvcnQJCW5yTVM7CiAJCXVuc2lnbmVkIGxvbmcJCWJ5dGVzdXNlZDsKQEAgLTExNjMsMTUgKzEwNTIsMTQ1IEBACiAJCXVuc2lnbmVkIHNob3J0CQl2YWxkYXRhbGVuOwogCQkvKiB2YWxuYW1lLCB2YWxkYXRhICovCiAJfTsKLSAgICBzdHJ1Y3QgIF93OTVucjJkYSAgICpucjJkYTsKIAorCQorCXN0cnVjdAlka2ggZGtoOworCWludAlieXRlc3JlYWQgPSAwOworCWNoYXIgICAgKnJnZGJkYXRhID0gaW5mby0+cmdkYmJ1ZmZlcjsKKwlpbnQgICAgIG5ieXRlcyA9IGluZm8tPnJnZGJzaXplOworCWNoYXIgICAgKmN1cmRhdGEgPSByZ2RiZGF0YTsKKwljaGFyICAgICplbmQgPSByZ2RiZGF0YSArIG5ieXRlczsKKwlpbnQgICAgIG9mZl9uZXh0X3JnZGI7CisJY2hhciAgICAqbmV4dCA9IHJnZGJkYXRhOworCWludCAgICAgbnJnZGIsIGk7CisJTFBLRVlTVFJVQ1QJbHB4a2V5OworCQorCWRvIHsKKwkgIGN1cmRhdGEgPSBuZXh0OworCSAgaWYgKHN0cm5jbXAoY3VyZGF0YSwgIlJHREIiLCA0KSkgcmV0dXJuIChOVUxMKTsKKwkgICAgCisJICBtZW1jcHkoJm9mZl9uZXh0X3JnZGIsY3VyZGF0YSs0LDQpOworCSAgbmV4dCA9IGN1cmRhdGEgKyBvZmZfbmV4dF9yZ2RiOworCSAgbnJnZGIgPSAoaW50KSAqKChzaG9ydCAqKWN1cmRhdGEgKyA3KTsKKworCX0gd2hpbGUgKG5yZ2RiICE9IG5yTVMgJiYgKG5leHQgPCBlbmQpKTsKKworCS8qIGN1cmRhdGEgbm93IHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHJpZ2h0IFJHREIgc2VjdGlvbiAqLworCWN1cmRhdGEgKz0gMHgyMDsKKworI2RlZmluZSBYUkVBRCh3aGVyZXRvLGxlbikgXAorCWlmICgoY3VyZGF0YSArIGxlbikgPGVuZCkge1wKKwkJbWVtY3B5KHdoZXJldG8sY3VyZGF0YSxsZW4pO1wKKwkJY3VyZGF0YSs9bGVuO1wKKwkJYnl0ZXNyZWFkKz1sZW47XAorCX0KKworCWRvIHsKKwkgIFhSRUFEKCZka2gsIHNpemVvZiAoZGtoKSk7CisJICBpZiAoZGtoLm5yTFMgPT0gbnJMUykgYnJlYWs7CisKKwkgIGN1cmRhdGEgKz0gZGtoLm5leHRrZXlvZmYgLSBzaXplb2YoZGtoKTsKKwl9IHdoaWxlIChjdXJkYXRhIDwgbmV4dCk7CisKKwlpZiAoZGtoLm5yTFMgIT0gbnJMUykgcmV0dXJuIChOVUxMKTsKKworCWlmIChucmdkYiAhPSBka2gubnJNUykgeworCSAgcmV0dXJuIChOVUxMKTsKKwl9CisKKwlscHhrZXk9X2ZpbmRfb3JfYWRkX2tleShscGtleSxzdHJjdnRBMlcoY3VyZGF0YSwgZGtoLmtleW5hbWVsZW4pKTsKKwljdXJkYXRhICs9IGRraC5rZXluYW1lbGVuOworCisJZm9yIChpPTA7aTwgZGtoLnZhbHVlczsgaSsrKSB7CisJICBzdHJ1Y3QgZGt2IGRrdjsKKwkgIExQQllURSBkYXRhOworCSAgaW50IGxlbjsKKwkgIExQV1NUUiBuYW1lOworCisJICBYUkVBRCgmZGt2LHNpemVvZihka3YpKTsKKworCSAgbmFtZSA9IHN0cmN2dEEyVyhjdXJkYXRhLCBka3YudmFsbmFtZWxlbik7CisJICBjdXJkYXRhICs9IGRrdi52YWxuYW1lbGVuOworCisJICBpZiAoKDEgPDwgZGt2LnR5cGUpICYgVU5JQ09OVk1BU0spIHsKKwkgICAgZGF0YSA9IChMUEJZVEUpIHN0cmN2dEEyVyhjdXJkYXRhLCBka3YudmFsZGF0YWxlbik7CisJICAgIGxlbiA9IGRrdi52YWxkYXRhbGVuICsgMTsKKwkgIH0gZWxzZSB7CisJICAgIC8qIEkgZG9uJ3QgdGhpbmsgd2Ugd2FudCB0byBOVUxMIHRlcm1pbmF0ZSBhbGwgZGF0YSAqLworCSAgICBkYXRhID0geG1hbGxvYyhka3YudmFsZGF0YWxlbik7CisJICAgIG1lbWNweSAoZGF0YSwgY3VyZGF0YSwgZGt2LnZhbGRhdGFsZW4pOworCSAgICBsZW4gPSBka3YudmFsZGF0YWxlbjsKKwkgIH0KKworCSAgY3VyZGF0YSArPSBka3YudmFsZGF0YWxlbjsKKwkgIAorCSAgX2ZpbmRfb3JfYWRkX3ZhbHVlKAorCQkJICAgICBscHhrZXksCisJCQkgICAgIG5hbWUsCisJCQkgICAgIGRrdi50eXBlLAorCQkJICAgICBkYXRhLAorCQkJICAgICBsZW4sCisJCQkgICAgIGluZm8tPmxhc3Rtb2RpZmllZAorCQkJICAgICApOworCisJfQorCisJcmV0dXJuIChscHhrZXkpOworfQorCitzdGF0aWMgdm9pZAorX3c5NV93YWxrcmdrbihMUEtFWVNUUlVDVCBwcmV2a2V5LCBjaGFyICpvZmYsIHN0cnVjdCBfdzk1X2luZm8gKmluZm8pCisKK3sKKyAgLyogRGlzayBLZXkgRW50cnkgc3RydWN0dXJlIChSR0tOIHBhcnQpICovCisgIHN0cnVjdAlka2UgeworICAgIHVuc2lnbmVkIGxvbmcJCXgxOworICAgIHVuc2lnbmVkIGxvbmcJCXgyOworICAgIHVuc2lnbmVkIGxvbmcJCXgzOy8qdXN1YWxseSAweEZGRkZGRkZGICovCisgICAgdW5zaWduZWQgbG9uZwkJcHJldmx2bDsKKyAgICB1bnNpZ25lZCBsb25nCQluZXh0c3ViOworICAgIHVuc2lnbmVkIGxvbmcJCW5leHQ7CisgICAgdW5zaWduZWQgc2hvcnQJCW5yTFM7CisgICAgdW5zaWduZWQgc2hvcnQJCW5yTVM7CisgIH0gKmRrZSA9IChzdHJ1Y3QgZGtlICopb2ZmOworICBMUEtFWVNUUlVDVCAgbHB4a2V5OworCisgIGlmIChka2UgPT0gTlVMTCkgeworICAgIGRrZSA9IChzdHJ1Y3QgZGtlICopICgoY2hhciAqKWluZm8tPnJna25idWZmZXIpOworICB9CisKKyAgbHB4a2V5ID0gX3c5NV9wcm9jZXNzS2V5KHByZXZrZXksIGRrZS0+bnJMUywgZGtlLT5uck1TLCBpbmZvKTsKKyAgLyogWFhYIDwtLSBUaGlzIGlzIGEgaGFjayovCisgIGlmICghbHB4a2V5KSB7CisgICAgbHB4a2V5ID0gcHJldmtleTsKKyAgfQorCisgIGlmIChka2UtPm5leHRzdWIgIT0gLTEgJiYgCisgICAgICAoKGRrZS0+bmV4dHN1YiAtIDB4MjApIDwgaW5mby0+cmdrbnNpemUpIAorICAgICAgJiYgKGRrZS0+bmV4dHN1YiA+IDB4MjApKSB7CisgICAgCisgICAgX3c5NV93YWxrcmdrbihscHhrZXksIAorCQkgIGluZm8tPnJna25idWZmZXIgKyBka2UtPm5leHRzdWIgLSAweDIwLCAKKwkJICBpbmZvKTsKKyAgfQorICAKKyAgaWYgKGRrZS0+bmV4dCAhPSAtMSAmJiAKKyAgICAgICgoZGtlLT5uZXh0IC0gMHgyMCkgPCBpbmZvLT5yZ2tuc2l6ZSkgJiYgCisgICAgICAoZGtlLT5uZXh0ID4gMHgyMCkpIHsKKyAgICBfdzk1X3dhbGtyZ2tuKHByZXZrZXksICAKKwkJICBpbmZvLT5yZ2tuYnVmZmVyICsgZGtlLT5uZXh0IC0gMHgyMCwKKwkJICBpbmZvKTsKKyAgfQorCisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK193OTVfbG9hZHJlZyhjaGFyKiBmbixMUEtFWVNUUlVDVCBscGtleSkgewogCUhGSUxFMzIJCWhmZDsKLQlpbnQJCWxhc3Rtb2RpZmllZDsKIAljaGFyCQltYWdpY1s1XTsKLQl1bnNpZ25lZCBsb25nCW5yLHBvcyxpLGosd2hlcmUsdmVyc2lvbixyZ2Ric2VjdGlvbixlbmQsb2ZmX25leHRfcmdkYjsKLQlzdHJ1Y3QJX3c5NWtleQkqa2V5cywqa2V5OwotCWludAkJbnJvZmRrZXM7Ci0JdW5zaWduZWQgY2hhcgkqZGF0YSwqY3VyZGF0YSwqbmV4dHJnZGI7CisJdW5zaWduZWQgbG9uZwl3aGVyZSx2ZXJzaW9uLHJnZGJzZWN0aW9uLGVuZDsKKwlzdHJ1Y3QgICAgICAgICAgX3c5NV9pbmZvIGluZm87CiAJT0ZTVFJVQ1QJb2ZzOwogCUJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGhmZGluZm87CiAKQEAgLTEyMDUsMjMyICsxMjI0LDMxIEBACiAJd2hlcmUJPSAweDQwOwogCWVuZAk9IHJnZGJzZWN0aW9uOwogCi0JLyogSSByZW1vdmVkIHRoZSAnKzEwMCcgdGhhdCB3YXMgaGVyZS4gVGhlIGFkanVzdG1lbnRzIHRvIGRrZWFkZHIgICAqLwotCS8qIGltcGx5IGFsaWdubWVudHMgdG8gdGhlIGRhdGEgaW4gJ2RhdGEnIHdoaWNoIHdvdWxkIG1lYW4gaXQgaXMgICAgKi8KLQkvKiBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGRrZSBlbnRyaWVzIGl0IGhvbGRzIHRoZXJlZm9yZSBucm9mZGtlcyovCi0JLyogd291bGQgYmUgZXF1YWwgdG8gb3IgbGFyZ2VyIHRoYW4gaXQgbmVlZHMgdG8gYmUgd2l0aG91dCB0aGUgbmVlZCAqLwotCS8qIGZvciB0aGUgKzEwMCAtIGtjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlucm9mZGtlcyA9IChlbmQtd2hlcmUpL3NpemVvZihzdHJ1Y3QgZGtlKTsKLQotCWRhdGEgPSAoY2hhciopeG1hbGxvYyhlbmQtd2hlcmUpOwotCWlmICgoZW5kLXdoZXJlKSE9X2xyZWFkMzIoaGZkLGRhdGEsZW5kLXdoZXJlKSkKKwlpbmZvLnJna25zaXplID0gZW5kIC0gd2hlcmU7CisJaW5mby5yZ2tuYnVmZmVyID0gKGNoYXIqKXhtYWxsb2MoaW5mby5yZ2tuc2l6ZSk7CisJaWYgKGluZm8ucmdrbnNpemUgIT0gX2xyZWFkMzIoaGZkLGluZm8ucmdrbmJ1ZmZlcixpbmZvLnJna25zaXplKSkKIAkJcmV0dXJuOwotCWN1cmRhdGEgPSBkYXRhOwogCi0Ja2V5cyA9IChzdHJ1Y3QgX3c5NWtleSopeG1hbGxvYyhucm9mZGtlcyAqIHNpemVvZihzdHJ1Y3QgX3c5NWtleSkpOwotCW1lbXNldChrZXlzLCdcMCcsbnJvZmRrZXMqc2l6ZW9mKHN0cnVjdCBfdzk1a2V5KSk7Ci0gICAgbnIyZGE9IChzdHJ1Y3QgX3c5NW5yMmRhKil4bWFsbG9jKG5yb2Zka2VzICogc2l6ZW9mKHN0cnVjdCBfdzk1bnIyZGEpKTsKLSAgICBtZW1zZXQobnIyZGEsJ1wwJyxucm9mZGtlcypzaXplb2Yoc3RydWN0IF93OTVucjJkYSkpOwotCi0jaWYgREVCVUdfVzk1X0xPQURSRUcKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIm5yb2Zka2VzID0gJWRcbiIsIG5yb2Zka2VzKTsKLSNlbmRpZgotCWZvciAoaT0wO2k8bnJvZmRrZXM7aSsrKSB7Ci0JCXN0cnVjdAlka2UJZGtlOwotCQl1bnNpZ25lZCBsb25nIAlka2VhZGRyOwotCi0JCXBvcz1jdXJkYXRhLWRhdGErMHg0MDsKLQkJbWVtY3B5KCZka2UsY3VyZGF0YSxzaXplb2YoZGtlKSk7Ci0JCWN1cmRhdGErPXNpemVvZihka2UpOwotCQluciA9IGRrZS5uckxTICsgKGRrZS5uck1TPDw4KTsKLSNpZiBERUJVR19XOTVfTE9BRFJFRwotCQlkcHJpbnRmX3JlZyhzdGRkZWIsIiVsZDogbnIgPSAlbGQsIG5yTVM6bnJMUyA9ICUwNFg6JVhcbiIsCi0JCQkJCWksbnIsZGtlLm5yTVMsZGtlLm5yTFMpOwotI2VuZGlmCi0JCWRrZWFkZHI9cG9zLTQ7Ci0JCWlmICgoZGtlYWRkciYweEZGRik8MHgwMTgpIHsKLQkJCWludAlkaWZmOwotCi0JCQlkaWZmPTB4MUMtKGRrZWFkZHImMHhGRkYpOwotCQkJZGtlYWRkcis9ZGlmZjsKLQkJCWN1cmRhdGErPWRpZmYtc2l6ZW9mKGRrZSk7Ci0JCQltZW1jcHkoJmRrZSxjdXJkYXRhLHNpemVvZihka2UpKTsKLQkJCW5yID0gZGtlLm5yTFMgKyAoZGtlLm5yTVM8PDgpOwotI2lmIERFQlVHX1c5NV9MT0FEUkVHCi0JCQlkcHJpbnRmX3JlZyhzdGRkZWIsIj4gbnIgPSAlbHUsIG5yTVM6bnJMUyA9ICUwNFg6JVhcbiIsCi0JCQkJCQlucixka2UubnJNUyxka2UubnJMUyk7Ci0jZW5kaWYKLQkJCWN1cmRhdGErPXNpemVvZihka2UpOwotCQl9Ci0JCWlmICgoKGRrZWFkZHIrMHgxQykmMHhGRkYpPDB4MUMpIHsKLQkJCS8qIHJlYWRqdXN0IHRvIDB4MDAwLAotCQkJICogYnV0IE9OTFkgaWYgd2UgYXJlID4weDEwMDAgYWxyZWFkeQotCQkJICovCi0JCQlpZiAoZGtlYWRkciAmIH4weEZGRikKLQkJCQlka2VhZGRyICY9IH4weEZGRjsKLQkJfQotCQkvKiBGb3IgdGhlIHRpbWUgYmVpbmcgd2Ugd2lsbCBhc3N1bWUgdGhhdCBhbGwgdmFsdWVzIG9mICovCi0JCS8qIG5yIGFyZSB2YWxpZCB1bmxlc3MgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgdHJ1ZS4gKi8KLQkJLyogVGhpcyB2YWx1ZSBpcyBvYnRhaW5lZCB3aGVuIGRrZS5uckxTIGFuZCBka2UubnJNUyBhcmUqLwotCQkvKiBib3RoIEZGRkYgYXMgZGtlLm5yTVMgaXMgb25seSBzaGlmdGVkIGJ5IDggYmVmb3JlIHRoZSovCi0JCS8qIGFkZCBhbmQgbm90IDE2LiAta2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJaWYgKG5yPT0weDAxMDBGRUZGKQotCQkJY29udGludWU7Ci0JCWZvciAoaiA9IDA7IGogPCBpOyArK2opIHsKLQkJCWlmIChucjJkYVtqXS5uciA9PSBucikKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaiA8IGkpIHsKLQkJCWtleSA9IG5yMmRhW2pdLmtleTsKLQkJCWlmIChrZXkgJiYga2V5LT5ka2VhZGRyKSB7Ci0JCQkJaW50CXg7Ci0KLQkJCQlmb3IgKHg9c2l6ZW9mKGRrZSk7eC0tOykKLQkJCQkJaWYgKCgoY2hhciopJmRrZSlbeF0pCi0JCQkJCQlicmVhazsKLQkJCQlpZiAoeD09LTEpCi0JCQkJCWJyZWFrOwkvKiBmaW5pc2hlZCByZWFkaW5nIGlmIHdlIGdvdCBvbmx5IDAgKi8KLQkJCQlpZiAobnIpIHsKLQkJCQkJaWYgKChka2UubmV4dCE9KGxvbmcpa2V5LT5uZXh0KSB8fAotCQkJCQkJKGRrZS5uZXh0c3ViIT0obG9uZylrZXktPm5leHRzdWIpIHx8Ci0JCQkJCQkoZGtlLnByZXZsdmwhPShsb25nKWtleS0+cHJldmx2bCkgCi0JCQkJCSkKLQkJCQkJCWRwcmludGZfcmVnKHN0ZGRlYiwia2V5IGRvdWJsZWQ/IG5yPSVsdSxrZXktPmRrZWFkZHI9JWx4LGRrZWFkZHI9JWx4XG4iLG5yLGtleS0+ZGtlYWRkcixka2VhZGRyKTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLSNpZiBERUJVR19XOTVfTE9BRFJFRwotCQlkcHJpbnRmX3JlZyhzdGRkZWIsIi0gbnI9JWx1LGRrZWFkZHI9JWx4XG4iLG5yLGRrZWFkZHIpOwotI2VuZGlmCi0JCW5yMmRhW2ldLm5yID0gbnI7Ci0JCW5yMmRhW2ldLmRrZWFkZHIgPSBka2VhZGRyOwotCQlucjJkYVtpXS5rZXkgPSAma2V5c1tpXTsKLQotCQlrZXlzW2ldLmRrZWFkZHIgPSBka2VhZGRyOwotCQlrZXlzW2ldLngxID0gZGtlLngxOwotCQlrZXlzW2ldLngyID0gZGtlLngyOwotCQlrZXlzW2ldLngzID0gZGtlLngzOwotCQlrZXlzW2ldLnByZXZsdmw9IChzdHJ1Y3QgX3c5NWtleSopZGtlLnByZXZsdmw7Ci0JCWtleXNbaV0ubmV4dHN1Yj0gKHN0cnVjdCBfdzk1a2V5Kilka2UubmV4dHN1YjsKLQkJa2V5c1tpXS5uZXh0IAk9IChzdHJ1Y3QgX3c5NWtleSopZGtlLm5leHQ7Ci0JfQotCWZyZWUoZGF0YSk7Ci0KLQlucm9mZGtlcyA9IGk7CS8qIFRoaXMgaXMgdGhlIHJlYWwgbnVtYmVyIG9mIGRrZSBlbnRyaWVzICovCi0jaWYgREVCVUdfVzk1X0xPQURSRUcKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIm5yb2Zka2VzID0gJWRcbiIsIG5yb2Zka2VzKTsKLSNlbmRpZgotCi0JcXNvcnQobnIyZGEsbnJvZmRrZXMsc2l6ZW9mKG5yMmRhWzBdKSwKLSAgICAgICAgICAgICAgKGludCgqKShjb25zdCB2b2lkICosY29uc3Qgdm9pZCAqKSlfdzk1ZGtlY29tcCk7Ci0KLQkvKiBTVEVQIDI6IGtleWRhdGEgJiB2YWx1ZXMgKi8KIAlpZiAoIUdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhmZCwmaGZkaW5mbykpCiAJCXJldHVybjsKKwogCWVuZCA9IGhmZGluZm8ubkZpbGVTaXplTG93OwotCWxhc3Rtb2RpZmllZCA9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZSgmaGZkaW5mby5mdExhc3RXcml0ZVRpbWUsTlVMTCk7CisJaW5mby5sYXN0bW9kaWZpZWQgPSBET1NGU19GaWxlVGltZVRvVW5peFRpbWUoJmhmZGluZm8uZnRMYXN0V3JpdGVUaW1lLE5VTEwpOwogCiAJaWYgKC0xPT1fbGxzZWVrMzIoaGZkLHJnZGJzZWN0aW9uLFNFRUtfU0VUKSkKIAkJcmV0dXJuOwotCWRhdGEgPSAoY2hhciopeG1hbGxvYyhlbmQtcmdkYnNlY3Rpb24pOwotCWlmICgoZW5kLXJnZGJzZWN0aW9uKSE9X2xyZWFkMzIoaGZkLGRhdGEsZW5kLXJnZGJzZWN0aW9uKSkKKworCWluZm8ucmdkYmJ1ZmZlciA9IChjaGFyKil4bWFsbG9jKGVuZC1yZ2Ric2VjdGlvbik7CisJaW5mby5yZ2Ric2l6ZSA9IGVuZCAtIHJnZGJzZWN0aW9uOworCisJaWYgKGluZm8ucmdkYnNpemUgIT1fbHJlYWQzMihoZmQsaW5mby5yZ2RiYnVmZmVyLGluZm8ucmdkYnNpemUpKQogCQlyZXR1cm47CiAJX2xjbG9zZTMyKGhmZCk7Ci0JY3VyZGF0YSA9IGRhdGE7Ci0JbWVtY3B5KG1hZ2ljLGN1cmRhdGEsNCk7Ci0JbWVtY3B5KCZvZmZfbmV4dF9yZ2RiLGN1cmRhdGErNCw0KTsKLQluZXh0cmdkYiA9IGN1cmRhdGErb2ZmX25leHRfcmdkYjsKLQlpZiAoc3RyY21wKG1hZ2ljLCJSR0RCIikpIHsKLQkJZHByaW50Zl9yZWcoc3RkZGViLCJ0aGlyZCBJRkYgaGVhZGVyIG5vdCBSR0RCLCBidXQgJXNcbiIsbWFnaWMpOwotCQlyZXR1cm47Ci0JfQogCi0JY3VyZGF0YT1kYXRhKzB4MjA7Ci0Jd2hpbGUgKDEpIHsKLQkJc3RydWN0CWRraCBka2g7Ci0JCWludAkJYnl0ZXNyZWFkOwotCQlzdHJ1Y3QJX3c5NWtleQl4a2V5OwkvKiBVc2VkIGluc2lkZSBzZWNvbmQgbWFpbiBsb29wICovCisJX3c5NV93YWxrcmdrbihscGtleSwgTlVMTCwgJmluZm8pOwogCi0JCWJ5dGVzcmVhZCA9IDA7Ci0JCWlmIChjdXJkYXRhPj1uZXh0cmdkYikgewotCQkJY3VyZGF0YSA9IG5leHRyZ2RiOwotCQkJaWYgKCFzdHJuY21wKGN1cmRhdGEsIlJHREIiLDQpKSB7Ci0JCQkJbWVtY3B5KCZvZmZfbmV4dF9yZ2RiLGN1cmRhdGErNCw0KTsKLQkJCQluZXh0cmdkYiA9IGN1cmRhdGErb2ZmX25leHRfcmdkYjsKLQkJCQljdXJkYXRhKz0weDIwOwotCQkJfSBlbHNlIHsKLQkJCQlkcHJpbnRmX3JlZyhzdGRkZWIsImF0IGVuZCBvZiBSR0RCIHNlY3Rpb24sIGJ1dCBubyBuZXh0IGhlYWRlciAoJXggb2YgJWx4KS4gQnJlYWtpbmcuXG4iLGN1cmRhdGEtZGF0YSxlbmQtcmdkYnNlY3Rpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0jZGVmaW5lIFhSRUFEKHdoZXJldG8sbGVuKSBcCi0JaWYgKChjdXJkYXRhLWRhdGErbGVuKTxlbmQpIHtcCi0JCW1lbWNweSh3aGVyZXRvLGN1cmRhdGEsbGVuKTtcCi0JCWN1cmRhdGErPWxlbjtcCi0JCWJ5dGVzcmVhZCs9bGVuO1wKLQl9Ci0KLQkJWFJFQUQoJmRraCxzaXplb2YoZGtoKSk7Ci0JCW5yID0gZGtoLm5yTFMgKyAoZGtoLm5yTVM8PDgpOwotCQlpZiAoZGtoLm5yTFMgPT0gMHhGRkZGKSB7Ci0JCQkJLyogc2tpcCBvdmVyIGtleSB1c2luZyBuZXh0a2V5b2ZmICovCi0gCQkJCWN1cmRhdGErPWRraC5uZXh0a2V5b2ZmLXNpemVvZihzdHJ1Y3QgZGtoKTsKLQkJCQljb250aW51ZTsKLQkJfSAKLQkJZm9yIChpID0gMDsgaSA8IG5yb2Zka2VzOyArK2kpIHsKLQkJCWlmIChucjJkYVtpXS5uciA9PSBuciAmJiBucjJkYVtpXS5ka2VhZGRyKSB7Ci0JCQkJa2V5ID0gbnIyZGFbaV0ua2V5OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpID49IG5yb2Zka2VzKSB7Ci0JCQkvKiBNb3ZlIHRoZSBuZXh0IHN0YXRlbWVudCB0byBqdXN0IGJlZm9yZSB0aGUgcHJldmlvdXMgZm9yICovCi0JCQkvKiBsb29wIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gaXNzdWluZyBhIHdhcm5pbmcgLWtjICovCi0JCQlrZXkgPSAmeGtleTsKLQkJCW1lbXNldChrZXksJ1wwJyxzaXplb2YoeGtleSkpOwotCQkJZHByaW50Zl9yZWcoc3RkZGViLCJoYXZlbid0IGZvdW5kIG5yICVsdS5cbiIsbnIpOwotCQl9IGVsc2UgewotCQkJaWYgKCFrZXktPmRrZWFkZHIpCi0JCQkJZHByaW50Zl9yZWcoc3RkZGViLCJrZXkgd2l0aCBucj0lbHUgaGFzIG5vIGRrZWFkZHI/XG4iLG5yKTsKLQkJfQotCQlrZXktPm5yb2Z2YWxzCT0gZGtoLnZhbHVlczsKLQkJa2V5LT5uYW1lCT0gKGNoYXIqKXhtYWxsb2MoZGtoLmtleW5hbWVsZW4rMSk7Ci0JCWtleS0+eHgxCT0gZGtoLnh4MTsKLQkJWFJFQUQoa2V5LT5uYW1lLGRraC5rZXluYW1lbGVuKTsKLQkJa2V5LT5uYW1lW2RraC5rZXluYW1lbGVuXT0wOwotCQlpZiAoa2V5LT5ucm9mdmFscykgewotCQkJa2V5LT52YWx1ZXMgPSAoc3RydWN0IF93OTVrZXl2YWx1ZSopeG1hbGxvYygKLQkJCQlzaXplb2Yoc3RydWN0IF93OTVrZXl2YWx1ZSkqa2V5LT5ucm9mdmFscwotCQkJKTsKLQkJCWZvciAoaT0wO2k8a2V5LT5ucm9mdmFscztpKyspIHsKLQkJCQlzdHJ1Y3QJZGt2CWRrdjsKLQotCQkJCVhSRUFEKCZka3Ysc2l6ZW9mKGRrdikpOwotCQkJCWtleS0+dmFsdWVzW2ldLnR5cGUgPSBka3YudHlwZTsKLQkJCQlrZXktPnZhbHVlc1tpXS5uYW1lID0gKGNoYXIqKXhtYWxsb2MoCi0JCQkJCWRrdi52YWxuYW1lbGVuKzEKLQkJCQkpOwotCQkJCWtleS0+dmFsdWVzW2ldLmRhdGFsZW4gPSBka3YudmFsZGF0YWxlbjsKLQkJCQlrZXktPnZhbHVlc1tpXS5kYXRhID0gKHVuc2lnbmVkIGNoYXIqKXhtYWxsb2MoCi0JCQkJCWRrdi52YWxkYXRhbGVuKzEKLQkJCQkpOwotCQkJCWtleS0+dmFsdWVzW2ldLngxICAgPSBka3YueDE7Ci0JCQkJWFJFQUQoa2V5LT52YWx1ZXNbaV0ubmFtZSxka3YudmFsbmFtZWxlbik7Ci0JCQkJWFJFQUQoa2V5LT52YWx1ZXNbaV0uZGF0YSxka3YudmFsZGF0YWxlbik7Ci0JCQkJa2V5LT52YWx1ZXNbaV0uZGF0YVtka3YudmFsZGF0YWxlbl09MDsKLQkJCQlrZXktPnZhbHVlc1tpXS5uYW1lW2Rrdi52YWxuYW1lbGVuXT0wOwotCQkJCWtleS0+dmFsdWVzW2ldLmxhc3Rtb2RpZmllZD1sYXN0bW9kaWZpZWQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJ5dGVzcmVhZCAhPSBka2gubmV4dGtleW9mZikgewotCQkJaWYgKGRraC5ieXRlc3VzZWQgIT0gYnl0ZXNyZWFkKQotCQkJCWRwcmludGZfcmVnKHN0ZGRlYiwKLQkJCQkJInJlYWQgaGFzIGRpZmZlcmVuY2UgaW4gcmVhZCBieXRlcyAoJWQpIGFuZCBuZXh0b2Zmc2V0ICglbHUpIChieXRlc3VzZWQ9JWx1KVxuIixieXRlc3JlYWQsZGtoLm5leHRrZXlvZmYsCi0JCQkJCWRraC5ieXRlc3VzZWQKLQkJCQkpOwotCQkJY3VyZGF0YSArPSBka2gubmV4dGtleW9mZi1ieXRlc3JlYWQ7Ci0JCX0KLQkJa2V5LT5wcmV2bHZsCT0gX3c5NWRrZWxvb2t1cCgobG9uZylrZXktPnByZXZsdmwsbnJvZmRrZXMsbnIyZGEsa2V5cyk7Ci0JCWtleS0+bmV4dHN1Ygk9IF93OTVka2Vsb29rdXAoKGxvbmcpa2V5LT5uZXh0c3ViLG5yb2Zka2VzLG5yMmRhLGtleXMpOwotCQlrZXktPm5leHQJPSBfdzk1ZGtlbG9va3VwKChsb25nKWtleS0+bmV4dCxucm9mZGtlcyxucjJkYSxrZXlzKTsKLQkJaWYgKCFieXRlc3JlYWQpCi0JCQlicmVhazsKLQl9Ci0JZnJlZShkYXRhKTsKLQlfdzk1X3dhbGtfdHJlZShscGtleSxrZXlzKTsKLQlmcmVlKG5yMmRhKTsKLQlmcmVlKGtleXMpOworCWZyZWUgKGluZm8ucmdkYmJ1ZmZlcik7CisJZnJlZSAoaW5mby5yZ2tuYnVmZmVyKTsKIH0KIAogLyogV0lORE9XUyAzMSBSRUdJU1RSWSBMT0FERVIsIHN1cHBsaWVkIGJ5IFRvciBTavh3YWxsLCB0b3JAc24ubm8gKi8KZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCBkMGJkNmJhLi4wMmEyNGQyIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC04MDIsNyArODAyLDcgQEAKIAlyZXR1cm4gSU1BR0VfTlRfU0lHTkFUVVJFOwogICBpZiAoKihXT1JEKiltYWdpYyA9PSBJTUFHRV9PUzJfU0lHTkFUVVJFKSB7CiAgIAlJTUFHRV9PUzJfSEVBREVSCW5lX2hlYWRlcjsKLSAgCUxQQllURQkJCXBUeXBlSW5mbyA9IE5VTEw7CisgIAlMUEJZVEUJCQlwVHlwZUluZm8gPSAoTFBCWVRFKS0xOwogCiAgIAlpZiAoX2xyZWFkMzIoaEZpbGUsJm5lX2hlYWRlcixzaXplb2YobmVfaGVhZGVyKSkhPXNpemVvZihuZV9oZWFkZXIpKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21pc2MvdG9vbGhlbHAuYyBiL21pc2MvdG9vbGhlbHAuYwppbmRleCBhZmJkYzQ2Li41MTA3NGI5IDEwMDY0NAotLS0gYS9taXNjL3Rvb2xoZWxwLmMKKysrIGIvbWlzYy90b29saGVscC5jCkBAIC0yOCw2ICsyOCw4IEBACiAKIHN0YXRpYyBpbnQgbnJvZm5vdGlmeXMgPSAwOwogCitzdGF0aWMgRkFSUFJPQzE2IEhvb2tOb3RpZnkgPSBOVUxMOworCiBCT09MMTYgV0lOQVBJIE5vdGlmeVJlZ2lzdGVyKCBIVEFTSzE2IGh0YXNrLCBGQVJQUk9DMTYgbHBmbkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3RmxhZ3MgKQogewpAQCAtODUsMyArODcsMTYgQEAKIHsKICAgICByZXR1cm4gVFJVRTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVG9vbEhlbHBIb29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS0VSTkVMLjM0MSkKKyAqCXNlZSAiVW5kb2N1bWVudGVkIFdpbmRvd3MiCisgKi8KK0ZBUlBST0MxNiBXSU5BUEkgVG9vbEhlbHBIb29rKEZBUlBST0MxNiBscGZuTm90aWZ5SGFuZGxlcikKK3sKK0ZBUlBST0MxNiB0bXA7CisJdG1wID0gSG9va05vdGlmeTsKKwlIb29rTm90aWZ5ID0gbHBmbk5vdGlmeUhhbmRsZXI7CisJLyoganVzdCByZXR1cm4gcHJldmlvdXNseSBpbnN0YWxsZWQgbm90aWZpY2F0aW9uIGZ1bmN0aW9uICovCisJcmV0dXJuIHRtcDsKK30KZGlmZiAtLWdpdCBhL21pc2MvdHdlYWsuYyBiL21pc2MvdHdlYWsuYwppbmRleCAzZmEyNzgyLi41M2Q3ZjQyIDEwMDY0NAotLS0gYS9taXNjL3R3ZWFrLmMKKysrIGIvbWlzYy90d2Vhay5jCkBAIC0yNiw3ICsyNiw3IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSAidHNfeGxpYi5oIgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTI5NiwzMiArMjk2LDMyIEBACiAJLyogRHJhdyB0aGUgdG9wL2xlZnQgbGluZXMgZmlyc3QgKi8KIAlwcmV2cGVuID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBUV0VBS19QZW5FMDk1KTsKIAlEQ19TZXR1cEdDRm9yUGVuKGRjKTsKLQlYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAorCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKIAkJICByZWN0LT5yaWdodCAtIDEsIHJlY3QtPnRvcCk7Ci0JWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKKwlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCiAJCSAgcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gMSk7CiAKIAlTZWxlY3RPYmplY3QzMihoZGMsIFRXRUFLX1BlbkZGOTUpOwogCURDX1NldHVwR0NGb3JQZW4oZGMpOwotCVhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0ICsgMSwKKwlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0ICsgMSwKIAkJICByZWN0LT50b3AgKyAxLCByZWN0LT5yaWdodCAtIDIsIHJlY3QtPnRvcCArIDEpOwotCVhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0ICsgMSwKKwlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0ICsgMSwKIAkJICByZWN0LT50b3AgKyAxLCByZWN0LT5sZWZ0ICsgMSwgcmVjdC0+Ym90dG9tIC0gMik7CiAKIAogCS8qIE5vdyB0aGUgYm90dG9tL3JpZ2h0IGxpbmVzICovCiAJU2VsZWN0T2JqZWN0MzIoaGRjLCBUV0VBS19QZW4wMDk1KTsKIAlEQ19TZXR1cEdDRm9yUGVuKGRjKTsKLQlYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCwKKwlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0LAogCQkgIHJlY3QtPmJvdHRvbSAtIDEsIHJlY3QtPnJpZ2h0IC0gMSwgcmVjdC0+Ym90dG9tIC0gMSk7Ci0JWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPnJpZ2h0IC0gMSwKKwlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5yaWdodCAtIDEsCiAJCSAgcmVjdC0+dG9wLCByZWN0LT5yaWdodCAtIDEsIHJlY3QtPmJvdHRvbSAtIDEpOwogCiAJU2VsZWN0T2JqZWN0MzIoaGRjLCBUV0VBS19QZW44MDk1KTsKIAlEQ19TZXR1cEdDRm9yUGVuKGRjKTsKLQlYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCisJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCiAJCSAgcmVjdC0+Ym90dG9tIC0gMiwgcmVjdC0+cmlnaHQgLSAyLCByZWN0LT5ib3R0b20gLSAyKTsKLQlYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+cmlnaHQgLSAyLAorCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPnJpZ2h0IC0gMiwKIAkJICByZWN0LT50b3AgKyAxLCByZWN0LT5yaWdodCAtIDIsIHJlY3QtPmJvdHRvbSAtIDIpOwogCQogCVNlbGVjdE9iamVjdDMyKGhkYywgcHJldnBlbik7CkBAIC0zNjUsMzIgKzM2NSwzMiBAQAogCS8qIERyYXcgdGhlIHRvcC9sZWZ0IGxpbmVzIGZpcnN0ICovCiAJcHJldnBlbiA9IFNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuODA5NSk7CiAJRENfU2V0dXBHQ0ZvclBlbihkYyk7Ci0JWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKKwlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCiAJCSAgcmVjdC0+cmlnaHQgLSAxLCByZWN0LT50b3ApOwotCVhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCisJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAogCQkgIHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIDEpOwogCiAJU2VsZWN0T2JqZWN0MzIoaGRjLCBUV0VBS19QZW4wMDk1KTsKIAlEQ19TZXR1cEdDRm9yUGVuKGRjKTsKLQlYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCisJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCiAJCSAgcmVjdC0+dG9wICsgMSwgcmVjdC0+cmlnaHQgLSAyLCByZWN0LT50b3AgKyAxKTsKLQlYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCisJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCiAJCSAgcmVjdC0+dG9wICsgMSwgcmVjdC0+bGVmdCArIDEsIHJlY3QtPmJvdHRvbSAtIDIpOwogCiAKIAkvKiBOb3cgdGhlIGJvdHRvbS9yaWdodCBsaW5lcyAqLwogCVNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuRkY5NSk7CiAJRENfU2V0dXBHQ0ZvclBlbihkYyk7Ci0JWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQsCisJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCwKIAkJICByZWN0LT5ib3R0b20gLSAxLCByZWN0LT5yaWdodCAtIDEsIHJlY3QtPmJvdHRvbSAtIDEpOwotCVhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5yaWdodCAtIDEsCisJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+cmlnaHQgLSAxLAogCQkgIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQgLSAxLCByZWN0LT5ib3R0b20gLSAxKTsKIAogCVNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuRTA5NSk7CiAJRENfU2V0dXBHQ0ZvclBlbihkYyk7Ci0JWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQgKyAxLAorCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQgKyAxLAogCQkgIHJlY3QtPmJvdHRvbSAtIDIsIHJlY3QtPnJpZ2h0IC0gMiwgcmVjdC0+Ym90dG9tIC0gMik7Ci0JWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPnJpZ2h0IC0gMiwKKwlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5yaWdodCAtIDIsCiAJCSAgcmVjdC0+dG9wICsgMSwgcmVjdC0+cmlnaHQgLSAyLCByZWN0LT5ib3R0b20gLSAyKTsKIAkKIAlTZWxlY3RPYmplY3QzMihoZGMsIHByZXZwZW4pOwpAQCAtNDM2LDEzICs0MzYsMTMgQEAKIAkvKiBEcmF3IHRoZSB0b3AgbGluZSAqLwogCXByZXZwZW4gPSBTZWxlY3RPYmplY3QzMihoZGMsIFRXRUFLX1BlbjgwOTUpOwogCURDX1NldHVwR0NGb3JQZW4oZGMpOwotCVhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCB4YzEsIHljIC0gMSwgeGMyLAorCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHhjMSwgeWMgLSAxLCB4YzIsCiAJCSAgeWMgLSAxKTsKIAogCS8qIEFuZCB0aGUgYm90dG9tIGxpbmUgKi8KIAlTZWxlY3RPYmplY3QzMihoZGMsIFRXRUFLX1BlbkZGOTUpOwogCURDX1NldHVwR0NGb3JQZW4oZGMpOwotCVhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCB4YzEsIHljLCB4YzIsIHljKTsKKwlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCB4YzEsIHljLCB4YzIsIHljKTsKIAogCVNlbGVjdE9iamVjdDMyKGhkYywgcHJldnBlbik7CiAgICAgfQpAQCAtNDg0LDEzICs0ODQsMTMgQEAKIAkvKiBEcmF3IHRoZSB0b3AgbGluZSAqLwogCXByZXZwZW4gPSBTZWxlY3RPYmplY3QzMihoZGMsIFRXRUFLX1BlbjgwOTUpOwogCURDX1NldHVwR0NGb3JQZW4oZGMpOwotCVhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCB4YywgeWMxLCB4YywKKwlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCB4YywgeWMxLCB4YywKIAkJICB5YzIpOwogCiAJLyogQW5kIHRoZSBib3R0b20gbGluZSAqLwogCVNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuRkY5NSk7CiAJRENfU2V0dXBHQ0ZvclBlbihkYyk7Ci0JWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHhjICsgMSwgeWMxLCB4YyArIDEsCisJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgeGMgKyAxLCB5YzEsIHhjICsgMSwKIAkJICB5YzIpOwogCiAJU2VsZWN0T2JqZWN0MzIoaGRjLCBwcmV2cGVuKTsKZGlmZiAtLWdpdCBhL21pc2MvdmVyc2lvbi5jIGIvbWlzYy92ZXJzaW9uLmMKaW5kZXggZTYyNDM4ZS4uYzA3ZDAxMyAxMDA2NDQKLS0tIGEvbWlzYy92ZXJzaW9uLmMKKysrIGIvbWlzYy92ZXJzaW9uLmMKQEAgLTI2NCwzICsyNjQsMzUgQEAKICAgICAvKiBDb25zdGFudHM6IFdESV9PUFRJT05TIFdESV9GSUxURVIgV0RJX0FMTE9DQlJFQUsgKi8KICAgICByZXR1cm4gMDsKIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBEZWJ1Z0ZpbGxCdWZmZXIgICAgICAgICAgICAgICAgICAgIChLRVJORUwuMzI5KQorICoKKyAqIFRPRE86CisgKiBTaG91bGQgZmlsbCBscEJ1ZmZlciBvbmx5IGlmIERCT19CVUZGRVJGSUxMIGhhcyBiZWVuIHNldCBieSBTZXRXaW5EZWJ1Z0luZm8oKQorICovCit2b2lkIFdJTkFQSSBEZWJ1Z0ZpbGxCdWZmZXIoTFBTVFIgbHBCdWZmZXIsIFdPUkQgd0J5dGVzKQoreworCW1lbXNldChscEJ1ZmZlciwgREJHRklMTF9CVUZGRVIsIHdCeXRlcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERpYWdRdWVyeSAgICAgICAgICAgICAgICAgICAgICAgICAgKEtFUk5FTC4zMzkpCisgKgorICogcmV0dXJucyBUUlVFIGlmIFdpbiBjYWxsZWQgd2l0aCAiL2IiIChib290bG9nLnR4dCkKKyAqLworQk9PTDE2IFdJTkFQSSBEaWFnUXVlcnkoKQoreworCS8qIHBlcmhhcHMgaW1wbGVtZW50IGEgV2luZSAiL2IiIGNvbW1hbmQgbGluZSBmbGFnIHNvbWV0aW1lID8gKi8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERpYWdPdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgKEtFUk5FTC4zNDApCisgKgorICogd3JpdGVzIGEgZGVidWcgc3RyaW5nIGludG8gPHdpbmRpcj5cYm9vdGxvZy50eHQKKyAqLwordm9pZCBXSU5BUEkgRGlhZ091dHB1dCgpCit7Cit9CmRpZmYgLS1naXQgYS9taXNjL3czMnNjb21iLmMgYi9taXNjL3czMnNjb21iLmMKaW5kZXggOWQyYWM5ZS4uMzAwNWZhZSAxMDA2NDQKLS0tIGEvbWlzYy93MzJzY29tYi5jCisrKyBiL21pc2MvdzMyc2NvbWIuYwpAQCAtMTEsMTMgKzExLDI2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgIndpbmJhc2UuaCIKKyNpbmNsdWRlICJoZWFwLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldDE2RExMQWRkcmVzcyAgICAgICAoS0VSTkVMMzIpCiAgKgotICogcm91Z2ggZ3Vlc3N3b3JrLCBidXQgc2VlbXMgdG8gd29yaworICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGEgV2luMzJzIERMTCBpZiBpdCB3YW50cyB0byBjYWxsIGEgV2luMTYgZnVuY3Rpb24uCisgKiBBIDE2OjE2IHNlZ21lbnRlZCBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBpcyByZXR1cm5lZC4KKyAqIFdyaXR0ZW4gd2l0aG91dCBhbnkgZG9jdS4KICAqLwotRkFSUFJPQzE2IFdJTkFQSSBHZXQxNkRMTEFkZHJlc3MoSE1PRFVMRTE2IGhhbmRsZSwgTFBTVFIgbmFtZSkgewotICAgICAgICBpZiAoIWhhbmRsZSkgaGFuZGxlPUdldE1vZHVsZUhhbmRsZTE2KCJXSU4zMlMxNiIpOwotICAgICAgICByZXR1cm4gKEZBUlBST0MxNilXSU4zMl9HZXRQcm9jQWRkcmVzczE2KGhhbmRsZSwgbmFtZSk7CitGQVJQUk9DMTYgV0lOQVBJIEdldDE2RExMQWRkcmVzcyhITU9EVUxFMzIgaGFuZGxlLCBMUFNUUiBmdW5jX25hbWUpIHsKKyAgICAgICBpZiAoIChzdHJjYXNlY21wKGZ1bmNfbmFtZSwgIlN0YWNrTGluZWFyVG9TZWdtZW50ZWQiKSkKKyAgICAgICAgJiYgKHN0cmNhc2VjbXAoZnVuY19uYW1lLCAiQ29UaGtDb21tb24iKSkgKSB7CisgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdldDE2RExMQWRkcmVzcygpIGNhbGxlZCBmb3IgZnVuY3Rpb24gJXMoKS4gUGxlYXNlIHJlcG9ydCB0byBBbmRyZWFzIE1vaHIuXG4iLCBmdW5jX25hbWUpOworICAgICAgIH0KKyAgICAgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgICAgICAgIGhhbmRsZSA9IChITU9EVUxFMzIpTG9hZExpYnJhcnkxNigiV0lOMzJTMTYiKTsKKyAgICAgICAgICAgICAgIEZyZWVMaWJyYXJ5MTYoaGFuZGxlKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIFdJTjMyX0dldFByb2NBZGRyZXNzMTYoaGFuZGxlLGZ1bmNfbmFtZSk7CiB9CisKZGlmZiAtLWdpdCBhL21pc2Mvd2luMzJzMTYuYyBiL21pc2Mvd2luMzJzMTYuYwppbmRleCAzODJlMTQ2Li5lY2Y2MWIwIDEwMDY0NAotLS0gYS9taXNjL3dpbjMyczE2LmMKKysrIGIvbWlzYy93aW4zMnMxNi5jCkBAIC0xNCwzICsxNCwxNCBAQAogewogCWZwcmludGYoc3RkZXJyLCAiQm9vdFRhc2soKTogc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBXSU4zMlMuRVhFLlxuIik7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFN0YWNrTGluZWFyVG9TZWdtZW50ZWQgICAgICAgKFdJTjMyUzE2LjQzKQorICoKKyAqIFdyaXR0ZW4gd2l0aG91dCBhbnkgZG9jdS4KKyAqLworU0VHUFRSIFdJTkFQSSBTdGFja0xpbmVhclRvU2VnbWVudGVkKCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlN0YWNrTGluZWFyVG9TZWdtZW50ZWQoKSwgc3R1YiAhXG4iKTsKKwlyZXR1cm4gKFNFR1BUUilOVUxMOworfQpkaWZmIC0tZ2l0IGEvbWlzYy93aW5kZWJ1Zy5jIGIvbWlzYy93aW5kZWJ1Zy5jCmluZGV4IDMwZjRkMmMuLjVmNzMyOTkgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luZGVidWcuYworKysgYi9taXNjL3dpbmRlYnVnLmMKQEAgLTE0LDcgKzE0LDI4IEBACiAgKiAgICAgICAgICAgV2luTm90aWZ5ICAgICAgIChXSU5ERUJVRy4xKQogICogIHdyaXR0ZW4gd2l0aG91dCBfYW55XyBkb2N1CiAgKi8KLURXT1JEIFdpbk5vdGlmeSgpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIldpbk5vdGlmeSgpOiBzdHViICFcbiIpOwotCXJldHVybiBOVUxMOwordm9pZCBXaW5Ob3RpZnkoQ09OVEVYVCAqY29udGV4dCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIldpbk5vdGlmeShBWD0lMDR4KTogc3R1YiAhXG4iLCBBWF9yZWcoY29udGV4dCkpOworCXN3aXRjaCAoQVhfcmVnKGNvbnRleHQpKQorCXsKKwkJY2FzZSAweDAwMEQ6CisJCWNhc2UgMHgwMDBFOgkvKiBfX2FzbV9fKCJwdXNobCAkMHgwXG5cdCIpOyA/Pz8gKi8KKwkJCQlicmVhazsKKwkJY2FzZSAweDAwNjA6CS8qIGRvIG5vdGhpbmcgKi8KKwkJCQlicmVhazsKKwkJY2FzZSAweDAwNjM6CS8qIGRvIHNvbWV0aGluZyBjb21wbGljYXRlZCAqLworCQkJCWJyZWFrOworCQljYXNlIDB4MDA2NDoJLyogZG8gc29tZXRoaW5nIGNvbXBsaWNhdGVkICovCisJCQkJYnJlYWs7CisJCWNhc2UgMHgwMDY1OgkvKiBkbyBzb21ldGhpbmcgY29tcGxpY2F0ZWQgKi8KKwkJCQlicmVhazsKKwkJY2FzZSAweDAwNTA6CS8qIGRvIHNvbWV0aGluZyBjb21wbGljYXRlZCwgbm93IGp1c3QgcmV0dXJuIGVycm9yICovCisJCQkJU0VUX0NGTEFHKGNvbnRleHQpOworCQkJCWJyZWFrOworCQljYXNlIDB4MDA1MjoJLyogZG8gc29tZXRoaW5nIGNvbXBsaWNhdGVkICovCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJfQkKIH0KZGlmZiAtLWdpdCBhL21pc2Mvd2luc29jay5jIGIvbWlzYy93aW5zb2NrLmMKaW5kZXggODhjNzQwYy4uZmYzZGJhMyAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrLmMKKysrIGIvbWlzYy93aW5zb2NrLmMKQEAgLTQsNiArNCwxMCBAQAogICogCiAgKiAoQykgMTk5MywxOTk0LDE5OTYsMTk5NyBKb2huIEJyZXphaywgRXJpayBCb3MsIEFsZXggS29yb2JrYS4KICAqCisgKiBOT1RFOiBJZiB5b3UgbWFrZSBhbnkgY2hhbmdlcyB0byBmaXggYSBwYXJ0aWN1bGFyIGFwcCwgbWFrZSBzdXJlIAorICogdGhleSBkb24ndCBicmVhayBzb21ldGhpbmcgZWxzZSBsaWtlIE5ldHNjYXBlIG9yIHRlbG5ldCBhbmQgZnRwIAorICogY2xpZW50cyBhbmQgc2VydmVycyAod3d3LndpbnNpdGUuY29tIGdvdCBhIGxvdCBvZiB0aG9zZSkuCisgKgogICovCiAgCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTI2LDYgKzMwLDcgQEAKICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CkBAIC04Miw4ICs4Nyw4IEBACiAgICAgICAgICBTT19MSU5HRVIsIFNPX09PQklOTElORSwgU09fU05EQlVGLCBTT19SQ1ZCVUYsIFNPX0VSUk9SLCBTT19UWVBFLAogCSBTT19MSU5HRVIgfTsKIAotc3RhdGljIGludCBfY2hlY2tfd3MoTFBXU0lORk8gcHdzaSwgd3Nfc29ja2V0KiBwd3MpOwotc3RhdGljIGludCBfY2hlY2tfYnVmZmVyKExQV1NJTkZPIHB3c2ksIGludCBzaXplKTsKK3N0YXRpYyBpbnQgICBfY2hlY2tfd3MoTFBXU0lORk8gcHdzaSwgd3Nfc29ja2V0KiBwd3MpOworc3RhdGljIGNoYXIqIF9jaGVja19idWZmZXIoTFBXU0lORk8gcHdzaSwgaW50IHNpemUpOwogCiBleHRlcm4gdm9pZCBFVkVOVF9BZGRJTyggaW50IGZkLCB1bnNpZ25lZCBmbGFnICk7CiBleHRlcm4gdm9pZCBFVkVOVF9EZWxldGVJTyggaW50IGZkLCB1bnNpZ25lZCBmbGFnICk7CkBAIC0xNDcsNiArMTUyLDIzIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQgd3NpX3N0cnRvbG8oTFBXU0lORk8gcHdzaSwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogb3B0KQoreworICAgIC8qIFN0dWZmIGEgbG93ZXJjYXNlIGNvcHkgb2YgdGhlIHN0cmluZyBpbnRvIHRoZSBsb2NhbCBidWZmZXIgKi8KKworICAgIGludCBpID0gc3RybGVuKG5hbWUpICsgMjsKKyAgICBjaGFyKiBwID0gX2NoZWNrX2J1ZmZlcihwd3NpLCBpICsgKChvcHQpP3N0cmxlbihvcHQpOjApKTsKKworICAgIGlmKCBwICkKKyAgICB7CisJZG8gKnArKyA9IHRvbG93ZXIoKm5hbWUpOyB3aGlsZSgqbmFtZSsrKTsKKwlpID0gKHAgLSAoY2hhciopKHB3c2ktPmJ1ZmZlcikpOworCWlmKCBvcHQgKSBkbyAqcCsrID0gdG9sb3dlcigqb3B0KTsgd2hpbGUoKm9wdCsrKTsKKwlyZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBmZF9zZXQqIGZkX3NldF9pbXBvcnQoIGZkX3NldCogZmRzLCBMUFdTSU5GTyBwd3NpLCB2b2lkKiB3c2ZkcywgaW50KiBoaWdoZmQsIEJPT0wzMiBiMzIgKQogewogICAgIC8qIHRyYW5zbGF0ZSBXaW5zb2NrIGZkIHNldCBpbnRvIGxvY2FsIGZkIHNldCAqLwpAQCAtMTU5LDcgKzE4MSw4IEBACiAJaW50IGksIGNvdW50OwogCiAJRkRfWkVSTyhmZHMpOwotCWNvdW50ID0gKGIzMikgPyB3c2ZkczMyLT5mZF9jb3VudCA6IHdzZmRzMTYtPmZkX2NvdW50OworCWNvdW50ID0gYjMyID8gd3NmZHMzMi0+ZmRfY291bnQgOiB3c2ZkczE2LT5mZF9jb3VudDsKKwogCWZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKIAl7CiAJICAgICBwd3MgPSAoYjMyKSA/ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIod3NmZHMzMi0+ZmRfYXJyYXlbaV0pCkBAIC0xNzAsMTAgKzE5Myw2IEBACiAJCSAgICBGRF9TRVQocHdzLT5mZCwgZmRzKTsKIAkgICAgIH0KIAl9Ci0JaWYgKGIzMikKLQkgICAgIHdzZmRzMzItPmZkX2NvdW50ID0gMDsKLQllbHNlCi0JICAgICB3c2ZkczE2LT5mZF9jb3VudCA9IDA7CiAjdW5kZWYgd3NmZHMzMgogI3VuZGVmIHdzZmRzMTYKIAlyZXR1cm4gZmRzOwpAQCAtMjA4LDIwICsyMjcsMjIgQEAKIAl7CiAJICAgIHdzX3NvY2tldCAqcHdzID0gKGIzMikgPyAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHdzZmRzMzItPmZkX2FycmF5W2ldKQogCQkJCSAgIDogKHdzX3NvY2tldCopV1NfSEFORExFMlBUUih3c2ZkczE2LT5mZF9hcnJheVtpXSk7Ci0JICAgIGludCBmZCA9IHB3cy0+ZmQ7Ci0KLQkgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICYmIEZEX0lTU0VUKGZkLCBmZHMpICkKKwkgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKIAkgICAgewotCQlpZiAoIGV4Y2VwdGZkcyAmJiBzb2NrX2Vycm9yX3AoZmQpICkKKwkJaW50IGZkID0gcHdzLT5mZDsKKworCQlpZiggRkRfSVNTRVQoZmQsIGZkcykgKQogCQl7Ci0JCSAgICBGRF9TRVQoZmQsIGV4Y2VwdGZkcyk7Ci0JCSAgICBudW1fZXJyKys7CisJCSAgICBpZiAoIGV4Y2VwdGZkcyAmJiBzb2NrX2Vycm9yX3AoZmQpICkKKwkJICAgIHsKKwkJCUZEX1NFVChmZCwgZXhjZXB0ZmRzKTsKKwkJCW51bV9lcnIrKzsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYoIGIzMiApCisJCQkgICAgIHdzZmRzMzItPmZkX2FycmF5W2orK10gPSB3c2ZkczMyLT5mZF9hcnJheVtpXTsKKwkJCSBlbHNlCisJCQkgICAgIHdzZmRzMTYtPmZkX2FycmF5W2orK10gPSB3c2ZkczE2LT5mZF9hcnJheVtpXTsKIAkJfQotCQllbHNlCi0JCSAgICBpZiggYjMyICkKLQkJCXdzZmRzMzItPmZkX2FycmF5W2orK10gPSB3c2ZkczMyLT5mZF9hcnJheVtpXTsKLQkJICAgIGVsc2UKLQkJCXdzZmRzMTYtPmZkX2FycmF5W2orK10gPSB3c2ZkczE2LT5mZF9hcnJheVtpXTsKIAkgICAgfQogCX0KIApAQCAtMjc4LDcgKzI5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAjZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCiAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKLQkJCSAgIFdTX01BWF9TT0NLRVRTX1BFUl9USFJFQUQsCisJCQkgICBXU19NQVhfU09DS0VUU19QRVJfUFJPQ0VTUywKIAkJCSAgIFdTX01BWF9VRFBfREFUQUdSQU0sIChTRUdQVFIpTlVMTCB9OwogICAgIEhUQVNLMTYgICAgICAgICAgICAgdGlkID0gR2V0Q3VycmVudFRhc2soKTsKICAgICBMUFdTSU5GTyAgICAgICAgICAgIHB3c2k7CkBAIC0zMTQsMTIgKzMzNSwxMiBAQAogCXsKIAkgICAgaW50IGkgPSAwOwogCSAgICBwd3NpLT50aWQgPSB0aWQ7Ci0JICAgIGZvciggaSA9IDA7IGkgPCBXU19NQVhfU09DS0VUU19QRVJfVEhSRUFEOyBpKysgKQorCSAgICBmb3IoIGkgPSAwOyBpIDwgV1NfTUFYX1NPQ0tFVFNfUEVSX1BST0NFU1M7IGkrKyApCiAJICAgIHsKIAkJcHdzaS0+c29ja1tpXS5mZCA9IC0xOyAKIAkJcHdzaS0+c29ja1tpXS5mbGFncyA9IGkgKyAxOyAKIAkgICAgfQotCSAgICBwd3NpLT5zb2NrW1dTX01BWF9TT0NLRVRTX1BFUl9USFJFQUQgLSAxXS5mbGFncyA9IC0xOworCSAgICBwd3NpLT5zb2NrW1dTX01BWF9TT0NLRVRTX1BFUl9QUk9DRVNTIC0gMV0uZmxhZ3MgPSAtMTsKIAl9CiAJZWxzZSByZXR1cm4gV1NBU1lTTk9UUkVBRFk7CiAKQEAgLTQwMCw3ICs0MjEsNyBAQAogICoJICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCJcdGhhdmUgJWkgb3V0c3RhbmRpbmcgYXN5bmMgb3BzIVxuIiwgcHdzaS0+bnVtX2FzeW5jX3JxICk7CiAgKi8KIAotICAgIGZvcihpID0gMCwgaiA9IDAsIG4gPSAwOyBpIDwgV1NfTUFYX1NPQ0tFVFNfUEVSX1RIUkVBRDsgaSsrKQorICAgIGZvcihpID0gMCwgaiA9IDAsIG4gPSAwOyBpIDwgV1NfTUFYX1NPQ0tFVFNfUEVSX1BST0NFU1M7IGkrKykKIAlpZiggcHdzaS0+c29ja1tpXS5mZCAhPSAtMSApCiAJewogCSAgICBpZiggcHdzaS0+c29ja1tpXS5wc29wICkKQEAgLTQ4NSwxMyArNTA2LDEzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBfY2hlY2tfYnVmZmVyKExQV1NJTkZPIHB3c2ksIGludCBzaXplKQorY2hhciogX2NoZWNrX2J1ZmZlcihMUFdTSU5GTyBwd3NpLCBpbnQgc2l6ZSkKIHsKLSAgICBpZiggcHdzaS0+YnVmZmVyICYmIHB3c2ktPmJ1ZmxlbiA+PSBzaXplICkgcmV0dXJuIDE7CisgICAgaWYoIHB3c2ktPmJ1ZmZlciAmJiBwd3NpLT5idWZsZW4gPj0gc2l6ZSApIHJldHVybiBwd3NpLT5idWZmZXI7CiAgICAgZWxzZSBTRUdQVFJfRlJFRShwd3NpLT5idWZmZXIpOwogCiAgICAgcHdzaS0+YnVmZmVyID0gKGNoYXIqKVNFR1BUUl9BTExPQygocHdzaS0+YnVmbGVuID0gc2l6ZSkpOyAKLSAgICByZXR1cm4gKHB3c2ktPmJ1ZmZlciAhPSBOVUxMKTsKKyAgICByZXR1cm4gcHdzaS0+YnVmZmVyOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpL28gQVBJcyAqLwpAQCAtNTU4LDkgKzU3OSw5IEBACiAKICAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQklORCglMDh4KTogc29ja2V0ICUwNHgsIHB0ciAlOHgsIGxlbmd0aCAlZFxuIiwgCiAJCQkgICAodW5zaWduZWQpcHdzaSwgcywgKGludCkgbmFtZSwgbmFtZWxlbik7Ci0vKiAjaWYgREVCVUdfU09DS0FERFIgKi8KKyNpZiBERUJVR19TT0NLQUREUgogICAgIGR1bXBfc29ja2FkZHIobmFtZSk7Ci0vKiAjZW5kaWYgKi8KKyNlbmRpZgogCiAgICAgaWYgKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCiAgICAgICBpZiAoIG5hbWVsZW4gPj0gc2l6ZW9mKCpuYW1lKSApIApAQCAtOTM2LDcgKzk1Nyw3IEBACiAJCWlmKCAhKGZkX2ZsYWdzICYgT19OT05CTE9DSykgKSBwd3MtPmZsYWdzIHw9IFdTX0ZEX0FDQ0VQVDsKIAkgICAgfQogCSAgICBwd3MtPmZsYWdzIHw9IFdTX0ZEX0xJU1RFTklORzsKLQkgICAgcHdzLT5mbGFncyAmPSB+KFdTX0ZEX0lOQUNUSVZFIHwgV1NfRkRfQ09OTkVDVEVEKTsgLyoganVzdCBpbiBjYXNlICovCisJICAgIHB3cy0+ZmxhZ3MgJj0gfihXU19GRF9JTkFDVElWRSB8IFdTX0ZEX0NPTk5FQ1QgfCBXU19GRF9DT05ORUNURUQpOyAvKiBqdXN0IGluIGNhc2UgKi8KIAkgICAgcmV0dXJuIDA7CiAJfQogCXB3c2ktPmVyciA9IHdzYUVycm5vKCk7CkBAIC0xMDY1LDQyICsxMDg2LDQ0IEBACiAJcF93cml0ZSA9IGZkX3NldF9pbXBvcnQoJndyaXRlZmRzLCBwd3NpLCB3c193cml0ZWZkcywgJmhpZ2hmZCwgYjMyKTsKIAlwX2V4Y2VwdCA9IGZkX3NldF9pbXBvcnQoJmV4Y2VwdGZkcywgcHdzaSwgd3NfZXhjZXB0ZmRzLCAmaGlnaGZkLCBiMzIpOwogCi0JaWYoIChoaWdoZmQgPSBzZWxlY3QoaGlnaGZkICsgMSwgcF9yZWFkLCBwX3dyaXRlLCBwX2V4Y2VwdCwgdGltZW91dCkpID49IDAgKQorCWlmKCAoaGlnaGZkID0gc2VsZWN0KGhpZ2hmZCArIDEsIHBfcmVhZCwgcF93cml0ZSwgcF9leGNlcHQsIHRpbWVvdXQpKSA+IDAgKQogCXsKLQkgICAgaWYoIGhpZ2hmZCApCi0JICAgIHsKLQkJZmRfc2V0X2V4cG9ydChwd3NpLCAmcmVhZGZkcywgcF9leGNlcHQsIHdzX3JlYWRmZHMsIGIzMik7Ci0JCWZkX3NldF9leHBvcnQocHdzaSwgJndyaXRlZmRzLCBwX2V4Y2VwdCwgd3Nfd3JpdGVmZHMsIGIzMik7CisJICAgIGZkX3NldF9leHBvcnQocHdzaSwgJnJlYWRmZHMsIHBfZXhjZXB0LCB3c19yZWFkZmRzLCBiMzIpOworCSAgICBmZF9zZXRfZXhwb3J0KHB3c2ksICZ3cml0ZWZkcywgcF9leGNlcHQsIHdzX3dyaXRlZmRzLCBiMzIpOwogCi0JCWlmIChwX2V4Y2VwdCAmJiB3c19leGNlcHRmZHMpCi0JCXsKKwkgICAgaWYgKHBfZXhjZXB0ICYmIHdzX2V4Y2VwdGZkcykKKwkgICAgewogI2RlZmluZSB3c2ZkczE2ICgod3NfZmRfc2V0MTYqKXdzX2V4Y2VwdGZkcykKICNkZWZpbmUgd3NmZHMzMiAoKHdzX2ZkX3NldDMyKil3c19leGNlcHRmZHMpCi0JCSAgICBpbnQgaSwgaiwgY291bnQgPSAoYjMyKSA/IHdzZmRzMzItPmZkX2NvdW50IDogd3NmZHMxNi0+ZmRfY291bnQ7CisJCWludCBpLCBqLCBjb3VudCA9IChiMzIpID8gd3NmZHMzMi0+ZmRfY291bnQgOiB3c2ZkczE2LT5mZF9jb3VudDsKIAotCQkgICAgZm9yIChpID0gaiA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlmb3IgKGkgPSBqID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJICAgIHdzX3NvY2tldCAqcHdzID0gKGIzMikgPyAod3Nfc29ja2V0ICopV1NfSEFORExFMlBUUih3c2ZkczMyLT5mZF9hcnJheVtpXSkKKwkJCQkJICAgOiAod3Nfc29ja2V0ICopV1NfSEFORExFMlBUUih3c2ZkczE2LT5mZF9hcnJheVtpXSk7CisJCSAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgJiYgRkRfSVNTRVQocHdzLT5mZCwgJmV4Y2VwdGZkcykgKQogCQkgICAgewotCQkJd3Nfc29ja2V0ICpwd3MgPSAoYjMyKSA/ICh3c19zb2NrZXQgKilXU19IQU5ETEUyUFRSKHdzZmRzMzItPmZkX2FycmF5W2ldKQotCQkJCQkgICAgICAgOiAod3Nfc29ja2V0ICopV1NfSEFORExFMlBUUih3c2ZkczE2LT5mZF9hcnJheVtpXSk7Ci0JCQlpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgJiYgRkRfSVNTRVQocHdzLT5mZCwgJmV4Y2VwdGZkcykgKQotCQkJewotCQkJICAgIGlmKCBiMzIgKQorCQkJaWYoIGIzMiApCiAJCQkJd3NmZHMzMi0+ZmRfYXJyYXlbaisrXSA9IHdzZmRzMzItPmZkX2FycmF5W2ldOwotCQkJICAgIGVsc2UKKwkJCWVsc2UKIAkJCQl3c2ZkczE2LT5mZF9hcnJheVtqKytdID0gd3NmZHMxNi0+ZmRfYXJyYXlbaV07Ci0JCQl9CiAJCSAgICB9Ci0JCSAgICBpZiggYjMyICkKLQkJCXdzZmRzMzItPmZkX2NvdW50ID0gajsKLQkJICAgIGVsc2UKLQkJCXdzZmRzMTYtPmZkX2NvdW50ID0gajsKKwkJfQorCQlpZiggYjMyICkKKwkJICAgIHdzZmRzMzItPmZkX2NvdW50ID0gajsKKwkJZWxzZQorCQkgICAgd3NmZHMxNi0+ZmRfY291bnQgPSBqOwogI3VuZGVmIHdzZmRzMzIKICN1bmRlZiB3c2ZkczE2Ci0JCX0KIAkgICAgfQogCSAgICByZXR1cm4gaGlnaGZkOyAKIAl9Ci0gICAgICAgIHB3c2ktPmVyciA9IHdzYUVycm5vKCk7CisJaWYoIHdzX3JlYWRmZHMgKSAoKHdzX2ZkX3NldDMyKil3c19yZWFkZmRzKS0+ZmRfY291bnQgPSAwOworCWlmKCB3c193cml0ZWZkcyApICgod3NfZmRfc2V0MzIqKXdzX3dyaXRlZmRzKS0+ZmRfY291bnQgPSAwOworCWlmKCB3c19leGNlcHRmZHMgKSAoKHdzX2ZkX3NldDMyKil3c19leGNlcHRmZHMpLT5mZF9jb3VudCA9IDA7CisKKyAgICAgICAgaWYoIGhpZ2hmZCA9PSAwICkgcmV0dXJuIDA7CisJcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKICAgICB9IAogICAgIHJldHVybiBTT0NLRVRfRVJST1I7CiB9CkBAIC0xMjUzLDE1ICsxMjc2LDI0IEBACiAJCQlpZiggcHdzLT5mbGFncyAmIChXU19GRF9SRUFEIHwgV1NfRkRfQ0xPU0UpICkKIAkJCSAgICBFVkVOVF9EZWxldGVJTyggcHdzLT5mZCwgRVZFTlRfSU9fUkVBRCApOwogCQkJcHdzLT5mbGFncyAmPSB+KFdTX0ZEX1JFQUQgfCBXU19GRF9DTE9TRSk7CisjaWZkZWYgU0hVVF9SRAorCQkJaG93ID0gU0hVVF9SRDsKKyNlbmRpZgogCQkJYnJlYWs7CiAKIAkJY2FzZSAxOiAvKiBkcm9wIHNlbmRzICovCiAJCQlpZiggcHdzLT5mbGFncyAmIFdTX0ZEX1dSSVRFICkKIAkJCSAgICBFVkVOVF9EZWxldGVJTyggcHdzLT5mZCwgRVZFTlRfSU9fV1JJVEUgKTsKIAkJCXB3cy0+ZmxhZ3MgJj0gfldTX0ZEX1dSSVRFOworI2lmZGVmIFNIVVRfV1IKKwkJCWhvdyA9IFNIVVRfV1I7CisjZW5kaWYKIAkJCWJyZWFrOwogCiAJCWNhc2UgMjogLyogZHJvcCBhbGwgKi8KKyNpZmRlZiBTSFVUX1JEV1IKKwkJCWhvdyA9IFNIVVRfUkRXUjsKKyNlbmRpZgogCQlkZWZhdWx0OgogCQkJV1NBQXN5bmNTZWxlY3QzMiggcywgMCwgMCwgMCApOwogCQkJYnJlYWs7CkBAIC0xMzQyLDkgKzEzNzQsMTMgQEAKICAgICB7CiAgICAgICAgIHdzX3NvY2tldCogICAgICBwbmV3ID0gd3NpX2FsbG9jX3NvY2tldChwd3NpLCBzb2NrKTsKIAotCWRwcmludGZfd2luc29jayhzdGRkZWIsIlx0Y3JlYXRlZCAlMDR4IChoYW5kbGUgJWkpXG4iLCBzb2NrLCAoVUlOVDE2KVdTX1BUUjJIQU5ETEUocG5ldykpOworCWRwcmludGZfd2luc29jayhzdGRkZWIsIlx0Y3JlYXRlZCAlaSAoaGFuZGxlICUwNHgpXG4iLCBzb2NrLCAoVUlOVDE2KVdTX1BUUjJIQU5ETEUocG5ldykpOwogCi0gICAgICAgIGlmKCBwbmV3ICkgcmV0dXJuIChTT0NLRVQxNilXU19QVFIySEFORExFKHBuZXcpOworICAgICAgICBpZiggcG5ldyApIAorCXsKKwkgICAgcG5ldy0+ZmxhZ3MgfD0gV1NfRkRfSU5BQ1RJVkU7CisJICAgIHJldHVybiAoU09DS0VUMTYpV1NfUFRSMkhBTkRMRShwbmV3KTsKKwl9CiAJCiAgICAgICAgIGNsb3NlKHNvY2spOwogICAgICAgICBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOwpAQCAtMTM3NSw3ICsxNDExLDggQEAKICAqCiAgKiBJTVBPUlRBTlQ6IDE2LWJpdCBBUEkgc3RydWN0dXJlcyBoYXZlIFNFR1BUUiBwb2ludGVycyBpbnNpZGUgdGhlbS4KICAqIEFsc28sIHdlIGhhdmUgdG8gdXNlIHdzb2NrMzIgc3R1YnMgdG8gY29udmVydCBzdHJ1Y3R1cmVzIGFuZAotICogZXJyb3IgY29kZXMgZnJvbSBVbml4IHRvIFdTQSwgaGVuY2Ugbm8gZGlyZWN0IG1hcHBpbmcgaW4gaWYxNjMyL3dzb2NrMzIuc3BlYy4KKyAqIGVycm9yIGNvZGVzIGZyb20gVW5peCB0byBXU0EsIGhlbmNlIHRoZXJlIGlzIG5vIGRpcmVjdCBtYXBwaW5nIGluIAorICogdGhlIHJlbGF5MzIvd3NvY2szMi5zcGVjLgogICovCiAKIHN0YXRpYyBjaGFyKglOVUxMX1NUUklORyA9ICJOVUxMIjsKQEAgLTE1MzAsMTEgKzE1NjcsMTUgQEAKICAgICBpZiggcHdzaSApCiAgICAgewogCXN0cnVjdCBzZXJ2ZW50KiAgICAgc2VydjsKLQlpZiggKHNlcnYgPSBnZXRzZXJ2YnluYW1lKG5hbWUsIHByb3RvKSkgIT0gTlVMTCApCi0JICAgIGlmKCBXU19kdXBfc2UocHdzaSwgc2VydiwgZHVwX2ZsYWcpICkKLQkJcmV0dXJuIChzdHJ1Y3QgV0lOX3NlcnZlbnQqKShwd3NpLT5idWZmZXIpOwotCSAgICBlbHNlIHB3c2ktPmVyciA9IFdTQUVOT0JVRlM7Ci0JZWxzZSBwd3NpLT5lcnIgPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOworCWludCBpID0gd3NpX3N0cnRvbG8oIHB3c2ksIG5hbWUsIHByb3RvICk7CisKKwlpZiggaSApCisJICAgIGlmKCAoc2VydiA9IGdldHNlcnZieW5hbWUocHdzaS0+YnVmZmVyLCBwd3NpLT5idWZmZXIgKyBpKSkgIT0gTlVMTCApCisJCWlmKCBXU19kdXBfc2UocHdzaSwgc2VydiwgZHVwX2ZsYWcpICkKKwkJICAgIHJldHVybiAoc3RydWN0IFdJTl9zZXJ2ZW50KikocHdzaS0+YnVmZmVyKTsKKwkJZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOworCSAgICBlbHNlIHB3c2ktPmVyciA9IChoX2Vycm5vIDwgMCkgPyB3c2FFcnJubygpIDogd3NhSGVycm5vKCk7CisJZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOwogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTE1NjYsMTEgKzE2MDcsMTUgQEAKICAgICBpZiggcHdzaSApCiAgICAgewogCXN0cnVjdCBzZXJ2ZW50KiAgICAgc2VydjsKLQlpZiggKHNlcnYgPSBnZXRzZXJ2Ynlwb3J0KHBvcnQsIHByb3RvKSkgIT0gTlVMTCApCi0JICAgIGlmKCBXU19kdXBfc2UocHdzaSwgc2VydiwgZHVwX2ZsYWcpICkKLQkJcmV0dXJuIChzdHJ1Y3QgV0lOX3NlcnZlbnQqKShwd3NpLT5idWZmZXIpOwotCSAgICBlbHNlIHB3c2ktPmVyciA9IFdTQUVOT0JVRlM7Ci0JZWxzZSBwd3NpLT5lcnIgPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOworCWludCBpID0gd3NpX3N0cnRvbG8oIHB3c2ksIHByb3RvLCBOVUxMICk7CisKKwlpZiggaSApCisJICAgIGlmKCAoc2VydiA9IGdldHNlcnZieXBvcnQocG9ydCwgcHdzaS0+YnVmZmVyKSkgIT0gTlVMTCApCisJCWlmKCBXU19kdXBfc2UocHdzaSwgc2VydiwgZHVwX2ZsYWcpICkKKwkJICAgIHJldHVybiAoc3RydWN0IFdJTl9zZXJ2ZW50KikocHdzaS0+YnVmZmVyKTsKKwkJZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOworCSAgICBlbHNlIHB3c2ktPmVyciA9IChoX2Vycm5vIDwgMCkgPyB3c2FFcnJubygpIDogd3NhSGVycm5vKCk7CisJZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOwogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTE3ODEsOCArMTgyNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyApOwogCiAgIGlmKCBwd3NpICkKLSAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCAwLCBuYW1lLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19TRVJWQllOQU1FICk7CisgIHsKKyAgICAgIGludCBpID0gd3NpX3N0cnRvbG8oIHB3c2ksIG5hbWUsIHByb3RvICk7CisKKyAgICAgIGlmKCBpICkKKyAgICAgICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCAwLCBwd3NpLT5idWZmZXIsIDAsCisgICAgICAgICAgICAgICAgICAgIHB3c2ktPmJ1ZmZlciArIGksICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX1NFUlZCWU5BTUUgKTsKKyAgfQogICByZXR1cm4gMDsKIH0KIApAQCAtMTc5Nyw4ICsxODQ3LDEzIEBACiAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFNlcnZCeU5hbWUzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgbmFtZSAlcywgcHJvdG8gJXNcbiIsCiAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCAoSFdORDE2KWhXbmQsIHVNc2csIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CiAgIGlmKCBwd3NpICkKLSAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCAwLCBuYW1lLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19TRVJWQllOQU1FIHwgV1NNU0dfQVNZTkNfV0lOMzIpOworICB7CisgICAgICBpbnQgaSA9IHdzaV9zdHJ0b2xvKCBwd3NpLCBuYW1lLCBwcm90byApOworCisgICAgICBpZiggaSApCisgICAgICAgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgMCwgcHdzaS0+YnVmZmVyLCAwLAorICAgICAgICAgICAgICAgICBwd3NpLT5idWZmZXIgKyBpLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19TRVJWQllOQU1FIHwgV1NNU0dfQVNZTkNfV0lOMzIpOworICB9CiAgIHJldHVybiAwOwogfQogCkBAIC0xODE1LDggKzE4NzAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCBwb3J0LCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CiAKICAgaWYoIHB3c2kgKQotICAgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgcG9ydCwgcHJvdG8sIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19TRVJWQllQT1JUICk7CisgIHsKKyAgICAgIGludCBpID0gd3NpX3N0cnRvbG8oIHB3c2ksIHByb3RvLCBOVUxMICk7CisKKyAgICAgIGlmKCBpICkKKwkgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIHBvcnQsIHB3c2ktPmJ1ZmZlciwgMCwKKwkJTlVMTCwgKHZvaWQqKXNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfU0VSVkJZUE9SVCApOworICB9CiAgIHJldHVybiAwOwogfQogCkBAIC0xODMyLDggKzE4OTIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCAoSFdORDE2KWhXbmQsIHVNc2csIHBvcnQsIChwcm90byk/cHJvdG86TlVMTF9TVFJJTkcgKTsKIAogICBpZiggcHdzaSApCi0gICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCBwb3J0LCBwcm90bywgMCwKLSAgICAgICAgICAgICBOVUxMLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19TRVJWQllQT1JUIHwgV1NNU0dfQVNZTkNfV0lOMzIpOworICB7CisgICAgICBpbnQgaSA9IHdzaV9zdHJ0b2xvKCBwd3NpLCBwcm90bywgTlVMTCApOworCisgICAgICBpZiggaSApCisJICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCBwb3J0LCBwd3NpLT5idWZmZXIsIDAsCisJCSBOVUxMLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19TRVJWQllQT1JUIHwgV1NNU0dfQVNZTkNfV0lOMzIpOworICB9CiAgIHJldHVybiAwOwogfQogCkBAIC0xODc1LDEwICsxOTQwLDEyIEBACiAKIHN0YXRpYyB3c19zZWxlY3Rfb3AqIF9fd3Nfc2VsZWN0X2xpc3QgPSBOVUxMOwogCi1CT09MMzIgV0lOU09DS19IYW5kbGVJTyggaW50KiBtYXhfZmQsIGludCBudW1fcGVuZGluZywgZmRfc2V0IGlvX3NldFszXSApCitCT09MMzIgV0lOU09DS19IYW5kbGVJTyggaW50KiBtYXhfZmQsIGludCBudW1fcGVuZGluZywgCisJCQkgZmRfc2V0IHBlbmRpbmdfc2V0WzNdLCBmZF9zZXQgZXZlbnRfc2V0WzNdICkKIHsKICAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgZXZlbnQgZGlzcGF0Y2hlcgotICAgICAqIHdpdGggaW9fc2V0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBzZWxlY3QoKSAqLworICAgICAqIHdpdGggdGhlIHBlbmRpbmdfc2V0W10gY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHNlbGVjdCgpIGFuZAorICAgICAqIHRoZSBldmVudF9zZXRbXSBjb250YWluaW5nIGFsbCBmZCB0aGF0IGFyZSBiZWluZyB3YXRjaGVkICovCiAKICAgICB3c19zZWxlY3Rfb3AqCXBzb3AgPSBfX3dzX3NlbGVjdF9saXN0OwogICAgIEJPT0wzMgkJYlBvc3QgPSBGQUxTRTsKQEAgLTE4OTQsOSArMTk2MSw5IEBACiAJaW50CQlyLCB3LCBlOwogCiAJdyA9IDA7Ci0JaWYoIChyID0gRkRfSVNTRVQoIGZkLCAmaW9fc2V0W0VWRU5UX0lPX1JFQURdICkpIHx8Ci0JICAgICh3ID0gRkRfSVNTRVQoIGZkLCAmaW9fc2V0W0VWRU5UX0lPX1dSSVRFXSApKSB8fAotCSAgICAoZSA9IEZEX0lTU0VUKCBmZCwgJmlvX3NldFtFVkVOVF9JT19FWENFUFRdICkpICkKKwlpZiggKHIgPSBGRF9JU1NFVCggZmQsICZwZW5kaW5nX3NldFtFVkVOVF9JT19SRUFEXSApKSB8fAorCSAgICAodyA9IEZEX0lTU0VUKCBmZCwgJnBlbmRpbmdfc2V0W0VWRU5UX0lPX1dSSVRFXSApKSB8fAorCSAgICAoZSA9IEZEX0lTU0VUKCBmZCwgJnBlbmRpbmdfc2V0W0VWRU5UX0lPX0VYQ0VQVF0gKSkgKQogCXsKIAkgICAgLyogVGhpcyBjb2RlIHJlbW92ZXMgV1NfRkQgZmxhZ3Mgb24gb25lLXNob3QgZXZlbnRzIChXU19GRF9DTE9TRSwgCiAJICAgICAqIFdTX0ZEX0NPTk5FQ1QpLCBvdGhlcndpc2UgaXQgY2xlYXJzIGRlc2NyaXB0b3JzIGluIHRoZSBpb19zZXQuCkBAIC0xOTE4LDEwICsxOTg1LDEwIEBACiAJCS8qIFdTX0ZEX0FDQ0VQVCBpcyB2YWxpZCBvbmx5IGlmIHRoZSBzb2NrZXQgaXMgaW4gdGhlCiAJCSAqIGxpc3RlbmluZyBzdGF0ZSAqLwogCi0JCUZEX0NMUiggZmQsICZpb19zZXRbRVZFTlRfSU9fV1JJVEVdICk7CisJCUZEX0NMUiggZmQsICZldmVudF9zZXRbRVZFTlRfSU9fV1JJVEVdICk7CiAJCWlmKCByICkKIAkJewotCQkgICAgRkRfQ0xSKCBmZCwgJmlvX3NldFtFVkVOVF9JT19SRUFEXSApOyAvKiByZWVuYWJsZWQgYnkgdGhlIG5leHQgYWNjZXB0KCkgKi8KKwkJICAgIEZEX0NMUiggZmQsICZldmVudF9zZXRbRVZFTlRfSU9fUkVBRF0gKTsgLyogcmVlbmFibGVkIGJ5IHRoZSBuZXh0IGFjY2VwdCgpICovCiAJCSAgICBkd0V2ZW50ID0gV1NBTUFLRVNFTEVDVFJFUExZKCBXU19GRF9BQ0NFUFQsIDAgKTsKIAkJICAgIGJQb3N0ID0gVFJVRTsKIAkJfSAKQEAgLTE5MzEsMjIgKzE5OTgsMjcgQEAKIAkgICAgewogCQkvKiBjb25uZWN0aW5nIHNvY2tldCAqLwogCi0JCWlmKCB3IHx8ICh3ID0gRkRfSVNTRVQoIGZkLCAmaW9fc2V0W0VWRU5UX0lPX1dSSVRFXSApKSApCisJCWlmKCB3IHx8ICh3ID0gRkRfSVNTRVQoIGZkLCAmcGVuZGluZ19zZXRbRVZFTlRfSU9fV1JJVEVdICkpICkKIAkJewotCQkgICAgLyogcmVhZHkgdG8gd3JpdGUgbWVhbnMgdGhhdCBzb2NrZXQgaXMgY29ubmVjdGVkICovCisJCSAgICAvKiByZWFkeSB0byB3cml0ZSBtZWFucyB0aGF0IHNvY2tldCBpcyBjb25uZWN0ZWQgCisJCSAgICAgKgorCQkgICAgICogRklYTUU6IE5ldHNjYXBlIGNhbGxzIEFzeW5jU2VsZWN0KCBzLCAuLi4gV1NfRkRfQ09OTkVDVCAuLiApCisJCSAgICAgKiByaWdodCBhZnRlciBzID0gc29ja2V0KCkgYW5kIHNvbWVob3cgInMiIGJlY29tZXMgd3JpdGVhYmxlIAorCQkgICAgICogYmVmb3JlIGl0IGdvZXMgdGhyb3VnaCBjb25uZWN0KCkhPyE/CisJCSAgICAgKi8KIAogCQkgICAgcHNvcC0+cHdzLT5mbGFncyB8PSBXU19GRF9DT05ORUNURUQ7CiAJCSAgICBwc29wLT5wd3MtPmZsYWdzICY9IH4oV1NfRkRfQ09OTkVDVCB8IFdTX0ZEX0lOQUNUSVZFKTsKIAkJICAgIGR3RXZlbnQgPSBXU0FNQUtFU0VMRUNUUkVQTFkoIFdTX0ZEX0NPTk5FQ1QsIDAgKTsKIAogCQkgICAgaWYoIGZsYWdzICYgKFdTX0ZEX1JFQUQgfCBXU19GRF9DTE9TRSkpCi0JCQlGRF9TRVQoIGZkLCAmaW9fc2V0W0VWRU5UX0lPX1JFQURdICk7CisJCQlGRF9TRVQoIGZkLCAmZXZlbnRfc2V0W0VWRU5UX0lPX1JFQURdICk7CiAJCSAgICBlbHNlIAotCQkJRkRfQ0xSKCBmZCwgJmlvX3NldFtFVkVOVF9JT19SRUFEXSApOworCQkJRkRfQ0xSKCBmZCwgJmV2ZW50X3NldFtFVkVOVF9JT19SRUFEXSApOwogCQkgICAgaWYoIGZsYWdzICYgV1NfRkRfV1JJVEUgKSAKLQkJCUZEX1NFVCggZmQsICZpb19zZXRbRVZFTlRfSU9fV1JJVEVdICk7CisJCQlGRF9TRVQoIGZkLCAmZXZlbnRfc2V0W0VWRU5UX0lPX1dSSVRFXSApOwogCQkgICAgZWxzZSAKLQkJCUZEX0NMUiggZmQsICZpb19zZXRbRVZFTlRfSU9fV1JJVEVdICk7CisJCQlGRF9DTFIoIGZkLCAmZXZlbnRfc2V0W0VWRU5UX0lPX1dSSVRFXSApOwogCQkgICAgYlBvc3QgPSBUUlVFOwogCQl9CiAJCWVsc2UgaWYoIHIgKQpAQCAtMTk1OSwxNiArMjAzMSwxNCBAQAogCQkJYlBvc3QgPSBUUlVFOwogCQkgICAgfQogCQl9Ci0JCS8qIG90aGVyd2lzZSBiUG9zdCBzdGF5cyBGQUxTRSAqLworCQkvKiBvdGhlcndpc2UgYlBvc3Qgc3RheXMgRkFMU0UsIHNob3VsZCBwcm9iYWJseSBjbGVhciBldmVudF9zZXQgICovCiAJICAgIH0KIAkgICAgZWxzZSAKIAkgICAgewotCQkvKiBjb25uZWN0ZWQgc29ja2V0IC0tCi0JCSAqIHJlbW92ZWQgV1NfRkRfT09CIGNvZGUgZm9yIG5vdy4KLQkJICovCisJCS8qIGNvbm5lY3RlZCBzb2NrZXQsIG5vIFdTX0ZEX09PQiBjb2RlIGZvciBub3cuICovCiAKIAkJaWYoIGZsYWdzICYgV1NfRkRfV1JJVEUgJiYKLQkJICAgKHcgfHwgKHcgPSBGRF9JU1NFVCggZmQsICZpb19zZXRbRVZFTlRfSU9fV1JJVEVdICkpKSApCisJCSAgICh3IHx8ICh3ID0gRkRfSVNTRVQoIGZkLCAmcGVuZGluZ19zZXRbRVZFTlRfSU9fV1JJVEVdICkpKSApCiAJCXsKIAkJICAgIC8qIHRoaXMgd2lsbCBiZSByZWVuYWJsZWQgd2hlbiBzZW5kKCkgb3Igc2VuZHRvKCkgZmFpbCB3aXRoCiAJCSAgICAgKiBXU0FFV09VTERCTE9DSyAqLwpAQCAtMTk3OCw3ICsyMDQ4LDcgQEAKIAkJICAgIHsKIAkJCWRwcmludGZfd2luc29jayhzdGRkZWIsICJcdCAgICBod25kICUwNHggLSAlMDR4LCAlMDh4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc29wLT5oV25kLCBwc29wLT51TXNnLCAodW5zaWduZWQpTUFLRUxPTkcoV1NfRkRfV1JJVEUsIDApICk7Ci0JCQlGRF9DTFIoIGZkLCAmaW9fc2V0W0VWRU5UX0lPX1dSSVRFXSApOworCQkJRkRfQ0xSKCBmZCwgJmV2ZW50X3NldFtFVkVOVF9JT19XUklURV0gKTsKIAkJCW51bV9wb3N0ZWQrKzsKIAkJICAgIH0KIAkJfQpAQCAtMjAwMCw3ICsyMDcwLDcgQEAKIAkJICAgIHsKIAkJCS8qIGdvdCBwZW5kaW5nIGRhdGEsIHdpbGwgYmUgcmVlbmFibGVkIGJ5IHJlY3YoKSBvciByZWN2ZnJvbSgpICovCiAKLQkJCUZEX0NMUiggZmQsICZpb19zZXRbRVZFTlRfSU9fUkVBRF0gKTsKKwkJCUZEX0NMUiggZmQsICZldmVudF9zZXRbRVZFTlRfSU9fUkVBRF0gKTsKIAkJCWR3RXZlbnQgPSBXU0FNQUtFU0VMRUNUUkVQTFkoIFdTX0ZEX1JFQUQsIDAgKTsKIAkJICAgIH0KIAkJICAgIGVsc2UKQEAgLTIwMjgsOCArMjA5OCw4IEBACiAJCQkvKiB0aGlzIGlzIGl0LCB0aGlzIHNvY2tldCBpcyBjbG9zZWQgKi8KIAogCQkJcHNvcC0+cHdzLT5mbGFncyAmPSB+KFdTX0ZEX1JFQUQgfCBXU19GRF9DTE9TRSB8IFdTX0ZEX1dSSVRFKTsKLQkJCUZEX0NMUiggZmQsICZpb19zZXRbRVZFTlRfSU9fUkVBRF0gKTsKLQkJCUZEX0NMUiggZmQsICZpb19zZXRbRVZFTlRfSU9fV1JJVEVdICk7CisJCQlGRF9DTFIoIGZkLCAmZXZlbnRfc2V0W0VWRU5UX0lPX1JFQURdICk7CisJCQlGRF9DTFIoIGZkLCAmZXZlbnRfc2V0W0VWRU5UX0lPX1dSSVRFXSApOwogCiAJCQlpZiggKm1heF9mZCA9PSAoZmQgKyAxKSApICgqbWF4X2ZkKS0tOwogCQkgICAgfQpAQCAtMjEwNyw3ICsyMTc3LDcgQEAKIAkJcHNvcC0+dU1zZyA9IHVNc2c7CiAKIAkJcHdzLT5wc29wID0gcHNvcDsKLQkJcHdzLT5mbGFncyB8PSAoMHgwMDAwRkZGRiAmbEV2ZW50KTsKKwkJcHdzLT5mbGFncyB8PSAoMHgwMDAwRkZGRiAmIGxFdmVudCk7CiAJCWdldHNvY2tvcHQocHdzLT5mZCwgU09MX1NPQ0tFVCwgU09fVFlQRSwgJnNvY2tfdHlwZSwgJmJ5dGVzKTsKIAkJaWYoIHNvY2tfdHlwZSA9PSBTT0NLX1JBVyApIHB3cy0+ZmxhZ3MgfD0gV1NfRkRfUkFXOwogCkBAIC0yMTQzLDcgKzIyMTMsNyBAQAogewogICBpbnQgaSA9IHNldC0+ZmRfY291bnQ7CiAgIAotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiX19XU0FGRElzU2V0MTYoJWQsJThseClcbiIsIHMsKHVuc2lnbmVkIGxvbmcpc2V0KTsKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIl9fV1NBRkRJc1NldDE2KCVkLCU4bHgoJWkpKVxuIiwgcywodW5zaWduZWQgbG9uZylzZXQsIGkpOwogICAgIAogICB3aGlsZSAoaS0tKQogICAgICAgaWYgKHNldC0+ZmRfYXJyYXlbaV0gPT0gcykgcmV0dXJuIDE7CkBAIC0yMTU3LDcgKzIyMjcsNyBAQAogewogICBpbnQgaSA9IHNldC0+ZmRfY291bnQ7CiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIl9fV1NBRkRJc1NldDMyKCVkLCU4bHgpXG4iLCBzLCh1bnNpZ25lZCBsb25nKXNldCk7CisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJfX1dTQUZESXNTZXQzMiglZCwlOGx4KCVpKSlcbiIsIHMsKHVuc2lnbmVkIGxvbmcpc2V0LCBpKTsKIAogICB3aGlsZSAoaS0tKQogICAgICAgaWYgKHNldC0+ZmRfYXJyYXlbaV0gPT0gcykgcmV0dXJuIDE7CkBAIC0yMTcxLDcgKzIyNDEsNyBAQAogewogICAvKiBCeSBkZWZhdWx0IFdpblNvY2sgc2hvdWxkIHNldCBhbGwgaXRzIHNvY2tldHMgdG8gbm9uLWJsb2NraW5nIG1vZGUKICAgICogYW5kIHBvbGwgaW4gUGVla01lc3NhZ2UgbG9vcCB3aGVuIHByb2Nlc3NpbmcgImJsb2NraW5nIiBvbmVzLiBUaGlzIAotICAgKiBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byB0ZWxsIGlmIHByb2dyYW0gaXMgaW4gdGhpcyBsb29wLiBPdXIgCisgICAqIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIHRlbGwgaWYgdGhlIHByb2dyYW0gaXMgaW4gdGhpcyBsb29wLiBPdXIgCiAgICAqIGJsb2NraW5nIGNhbGxzIGFyZSB0cnVseSBibG9ja2luZyBzbyB3ZSBhbHdheXMgcmV0dXJuIEZBTFNFLgogICAgKgogICAgKiBOb3RlOiBJdCBpcyBhbGxvd2VkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRob3V0IHByaW9yIFdTQVN0YXJ0dXAoKS4KQEAgLTIzMzIsNyArMjQwMiw3IEBACiAgKgogICogVE9ETzogTWVyZ2UgV1NfZHVwXy4uKCkgc3R1ZmYgaW50byBvbmUgZnVuY3Rpb24gdGhhdAogICogd291bGQgb3BlcmF0ZSB3aXRoIGEgZ2VuZXJpYyBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbnRlcm5hbAotICogcG9pbnRlcnMgKHZpYSBzb21lIHNvcnQgb2YgYSB0ZW1wbGF0ZSkuCisgKiBwb2ludGVycyAodmlhIGEgdGVtcGxhdGUgb2Ygc29tZSBraW5kKS4KICAqLwogCiBzdGF0aWMgaW50IGxpc3Rfc2l6ZShjaGFyKiogbCwgaW50IGl0ZW1fc2l6ZSkKQEAgLTIzNzgsNyArMjQ0OCw3IEBACiAKIGludCBXU19kdXBfaGUoTFBXU0lORk8gcHdzaSwgc3RydWN0IGhvc3RlbnQqIHBfaGUsIGludCBmbGFnKQogewotICAgLyogRHVwbGljYXRlIGhvc3RlbnQgc3RydWN0dXJlIGFuZCBmbGF0dGVuIGRhdGEgKHdpdGggaXRzIHBvaW50ZXJzKQorICAgLyogQ29udmVydCBob3N0ZW50IHN0cnVjdHVyZSBpbnRvIHdzX2hvc3RlbnQgc28gdGhhdCB0aGUgZGF0YSBmaXRzIAogICAgICogaW50byBwd3NpLT5idWZmZXIuIEludGVybmFsIHBvaW50ZXJzIGNhbiBiZSBsaW5lYXIsIFNFR1BUUiwgb3IgCiAgICAgKiByZWxhdGl2ZSB0byBwd3NpLT5idWZmZXIgZGVwZW5kaW5nIG9uICJmbGFnIiB2YWx1ZS4gUmV0dXJucyBzaXplCiAgICAgKiBvZiB0aGUgZGF0YSBjb3BpZWQgKGFsc28gaW4gdGhlIHB3c2ktPmJ1ZmxlbikuCkBAIC0yNDc5LDcgKzI1NDksNyBAQAogICAgICBwID0gcHdzaS0+YnVmZmVyOwogICAgICBwX2Jhc2UgPSAoZmxhZyAmIFdTX0RVUF9PRkZTRVQpID8gTlVMTCAKIAkJCQkgICAgIDogKChmbGFnICYgV1NfRFVQX1NFR1BUUikgPyAoY2hhciopU0VHUFRSX0dFVChwKSA6IHApOwotICAgICBwICs9IChmbGFnICYgV1NfRFVQX05BVElWRSk/IHNpemVvZihzdHJ1Y3Qgc2VydmVudCkgOiBzaXplb2Yoc3RydWN0IHdzX3NlcnZlbnQpOworICAgICBwICs9IHNpemVvZihzdHJ1Y3Qgd3Nfc2VydmVudCk7CiAgICAgIHBfbmFtZSA9IHA7CiAgICAgIHN0cmNweShwLCBwX3NlLT5zX25hbWUpOyBwICs9IHN0cmxlbihwKSArIDE7CiAgICAgIHBfcHJvdG8gPSBwOwpkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrX2Rucy5jIGIvbWlzYy93aW5zb2NrX2Rucy5jCmluZGV4IDk0MjI0ZGUuLjQxNTBiOWMgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29ja19kbnMuYworKysgYi9taXNjL3dpbnNvY2tfZG5zLmMKQEAgLTMzNywyMCArMzM3LDIzIEBACiAKIAkgICAgV0lOU09DS19saW5rX2FzeW5jX29wKCBhc3luY19jdGwud3NfYW9wICk7CiAKKwkgICAgRVZFTlRfQWRkSU8oIGFzeW5jX2N0bC53c19hb3AtPmZkWzBdLCBFVkVOVF9JT19SRUFEICk7CisJICAgIHB3c2ktPm51bV9hc3luY19ycSsrOworCiAJICAgIGFzeW5jX2N0bC53c19hb3AtPnBpZCA9IGZvcmsoKTsKIAkgICAgaWYoIGFzeW5jX2N0bC53c19hb3AtPnBpZCApCiAJICAgIHsKKwkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIlx0YXN5bmNfb3AgPSAlMDR4IChjaGlsZCAlaSlcbiIsIAorCQkJCWhhbmRsZSwgYXN5bmNfY3RsLndzX2FvcC0+cGlkKTsKKwogCQljbG9zZShhc3luY19jdGwud3NfYW9wLT5mZFsxXSk7ICAvKiB3cml0ZSBlbmRwb2ludCAqLwotCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiXHRhc3luY19vcCA9ICUwNHggKGNoaWxkICVpKVxuIiwKLQkJCQkJaGFuZGxlLCBhc3luY19jdGwud3NfYW9wLT5waWQpOwogCQlpZiggYXN5bmNfY3RsLndzX2FvcC0+cGlkID4gMCApCi0JCXsKLQkJICAgIEVWRU5UX0FkZElPKCBhc3luY19jdGwud3NfYW9wLT5mZFswXSwgRVZFTlRfSU9fUkVBRCApOwotCQkgICAgcHdzaS0+bnVtX2FzeW5jX3JxKys7CiAJCSAgICByZXR1cm4gX193c19nZXRoYW5kbGUoYXN5bmNfY3RsLndzX2FvcCk7Ci0JCX0KIAogCQkvKiBmb3JrKCkgZmFpbGVkICovCisKKwkgICAgICAgIHB3c2ktPm51bV9hc3luY19ycS0tOworCQlFVkVOVF9EZWxldGVJTyggYXN5bmNfY3RsLndzX2FvcC0+ZmRbMF0sIEVWRU5UX0lPX1JFQUQgKTsKIAkJY2xvc2UoYXN5bmNfY3RsLndzX2FvcC0+ZmRbMF0pOwogCQlwd3NpLT5lcnIgPSBXU0FFV09VTERCTE9DSzsKIAkgICAgfQpAQCAtNTE4LDcgKzUyMSw3IEBACiAgKiBOT1RFOiBJdCBpcyBwb3NzaWJsZSB0byBleHBsb2l0IHRoZSBmYWN0IHRoYXQgZm9yaygpIGRvZXNuJ3QgCiAgKiBjaGFuZ2UgdGhlIGJ1ZmZlciBhZGRyZXNzIGJ5IHN0b3JpbmcgZml4ZWQgdXAgcG9pbnRlcnMgcmlnaHQgCiAgKiBpbiB0aGUgaGFuZGxlci4gSG93ZXZlciwgdGhpcyB3aWxsIGdldCBpbiB0aGUgd2F5IGlmIHdlIGV2ZXIgCi0gKiBnZXQgdG8gaW1wbGVtZW50aW5nIEROUyBoZWxwZXIgZGFlbW9uIGEtbGEgTmV0c2NhcGUuCisgKiBnZXQgYXJvdW5kIHRvIGltcGxlbWVudGluZyBETlMgaGVscGVyIGRhZW1vbiBhLWxhIE5ldHNjYXBlLgogICovCiAKIHZvaWQgZml4dXBfd3NoZShzdHJ1Y3Qgd3NfaG9zdGVudCogcF93c2hlLCB2b2lkKiBiYXNlKQpkaWZmIC0tZ2l0IGEvbXNkb3MvTWFrZWZpbGUuaW4gYi9tc2Rvcy9NYWtlZmlsZS5pbgppbmRleCAzOThmYjM0Li5hMzBiMjUxIDEwMDY0NAotLS0gYS9tc2Rvcy9NYWtlZmlsZS5pbgorKysgYi9tc2Rvcy9NYWtlZmlsZS5pbgpAQCAtMTQsNiArMTQsNyBAQAogCWludDEzLmMgXAogCWludDE1LmMgXAogCWludDFhLmMgXAorCWludDIwLmMgXAogCWludDIxLmMgXAogCWludDI1LmMgXAogCWludDI2LmMgXApkaWZmIC0tZ2l0IGEvbXNkb3MvZHBtaS5jIGIvbXNkb3MvZHBtaS5jCmluZGV4IDBhNWZlYjQuLjAzNTJkMDEgMTAwNjQ0Ci0tLSBhL21zZG9zL2RwbWkuYworKysgYi9tc2Rvcy9kcG1pLmMKQEAgLTQyNyw2ICs0MjcsMTUgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAorICAgIGNhc2UgMHgwMzA0OiAgLyogRnJlZSBSZWFsIE1vZGUgQ2FsbGJhY2sgQWRkcmVzcyAqLworCXsKKwkgICAgZnByaW50ZihzdGRuaW1wLAorCQkgICAgIkZyZWVSTUNCOiBjYWxsYmFjayBhZGRyZXNzOiAlMDR4OiUwNHhcbiIsCisJCSAgICBDWF9yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CisJICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKKwl9CisJYnJlYWs7CisKICAgICBjYXNlIDB4MDQwMDogIC8qIEdldCBEUE1JIHZlcnNpb24gKi8KICAgICAJewogCSAgICBTWVNURU1fSU5GTyBzaTsKZGlmZiAtLWdpdCBhL21zZG9zL2ludDEzLmMgYi9tc2Rvcy9pbnQxMy5jCmluZGV4IDFlODYyNTguLmI0NmI2YTIgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDEzLmMKKysrIGIvbXNkb3MvaW50MTMuYwpAQCAtNCwxMSArNCwxOSBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgbGludXgKKyNpbmNsdWRlIDxsaW51eC9mZC5oPgorI2VuZGlmCiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX0lOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCi0KKyNpbmNsdWRlICJkcml2ZS5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgIElOVF9JbnQxM0hhbmRsZXIKQEAgLTI3LDE0ICszNSw4NiBAQAogCWNhc2UgMHgwNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRk9STUFUIFRSQUNLICovCiAgICAgICAgIGNhc2UgMHgwNjogICAgICAgICAgICAgLyogRk9STUFUIFRSQUNLIEFORCBTRVQgQkFEIFNFQ1RPUiBGTEFHUyAqLwogICAgICAgICBjYXNlIDB4MDc6ICAgICAgICAgICAgIC8qIEZPUk1BVCBEUklWRSBTVEFSVElORyBBVCBHSVZFTiBUUkFDSyAgKi8KLSAgICAgICAvKiBkZXNwaXRlIG9mIHdoYXQgUmFsZiBCcm93biBzYXlzLCAweDA2IGFuZCAweDA3IHNlZW0gdG8gc2V0IENGTEFHLCB0b28gKGF0IGxlYXN0IG15IEJJT1MgZG9lcyB0aGF0KSAqLwotCQlBSF9yZWcoY29udGV4dCkgPSAweDBjOwotICAgICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKLQkJYnJlYWs7CisgICAgICAgICAgICAvKiBkZXNwaXRlIHdoYXQgUmFsZiBCcm93biBzYXlzLCAweDA2IGFuZCAweDA3IHNlZW0gdG8KKyAgICAgICAgICAgICAqIHNldCBDRkxBRywgdG9vIChhdCBsZWFzdCBteSBCSU9TIGRvZXMgdGhhdCkgKi8KKyAgICAgICAgICAgIEFIX3JlZyhjb250ZXh0KSA9IDB4MGM7CisgICAgICAgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKIAogCWNhc2UgMHgwODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHRVQgRFJJVkUgUEFSQU1FVEVSUyAgKi8KLQkJQUhfcmVnKGNvbnRleHQpID0gKERMX3JlZyhjb250ZXh0KSAmIDB4ODApID8gMHgwNyA6IDB4MDE7Ci0gICAgICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOworCQlpZiAoRExfcmVnKGNvbnRleHQpICYgMHg4MCkgeyAvKiBoYXJkIGRpc2sgPyAqLworCQkJQUhfcmVnKGNvbnRleHQpID0gMHgwNzsKKwkJCVNFVF9DRkxBRyhjb250ZXh0KTsKKwkJfQorCQllbHNlIHsgLyogZmxvcHB5IGRpc2sgKi8KKyNpZmRlZiBsaW51eAorCQkJdW5zaWduZWQgaW50IGksIG5yX29mX2RyaXZlcyA9IDA7CQkJCisJCQlCWVRFIGRyaXZlX25yID0gRExfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsb3BweV9mZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zIGZsb3BweV9wYXJtOworCisgICAgICAgICAgICAgICAgICAgICAgICBBSF9yZWcoY29udGV4dCkgPSAweDAwOyAvKiBzdWNjZXNzICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRE9TX0RSSVZFUzsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERSSVZFX0dldFR5cGUoaSkgPT0gVFlQRV9GTE9QUFkpIG5yX29mX2RyaXZlcysrOworICAgICAgICAgICAgICAgICAgICAgICAgRExfcmVnKGNvbnRleHQpID0gbnJfb2ZfZHJpdmVzOworCisJCQlpZiAoZHJpdmVfbnIgPiAxKSB7IC8qIGludmFsaWQgZHJpdmUgPyAqLworCQkJCUJYX3JlZyhjb250ZXh0KSA9IDA7CisJCQkJQ1hfcmVnKGNvbnRleHQpID0gMDsKKwkJCQlESF9yZWcoY29udGV4dCkgPSAwOworCQkJCWJyZWFrOworCQkJfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChmbG9wcHlfZmQgPSBEUklWRV9PcGVuRGV2aWNlKCBkcml2ZV9uciwgT19OT05CTE9DSykpID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIklOVCAweDEzIChHRVQgRFJJVkUgUEFSQU1FVEVSUyk6IGNhbid0IGRldGVybWluZSBmbG9wcHkgZ2VvbWV0cnkgIVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERIX3JlZyhjb250ZXh0KSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGwoZmxvcHB5X2ZkLCBGREdFVERSVlBSTSwgJmZsb3BweV9wYXJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGZsb3BweV9mZCk7CisKKwkJCUJMX3JlZyhjb250ZXh0KSA9IGZsb3BweV9wYXJtLmNtb3M7CisKKwkJCS8qIENIID0gbG93IGVpZ2h0IGJpdHMgb2YgbWF4IGN5bAorCQkJICAgQ0wgPSBtYXggc2VjIG5yIChiaXRzIDUtMCksCisJCQkgICBoaSB0d28gYml0cyBvZiBtYXggY3lsIChiaXRzIDctNikKKwkJCSAgIERIID0gbWF4IGhlYWQgbnIgKi8gCisJCQlESF9yZWcoY29udGV4dCkgPSAweDAxOworCQkJc3dpdGNoIChCTF9yZWcoY29udGV4dCkpCisJCQl7CisJCQkgICAgY2FzZSAwOiAvKiBubyBkcml2ZSAqLworCQkJCUNYX3JlZyhjb250ZXh0KSA9IDB4MDsKKwkJCQlEWF9yZWcoY29udGV4dCkgPSAweDA7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSAxOiAvKiAzNjAgSyAqLworCQkJCUNYX3JlZyhjb250ZXh0KSA9IDB4MjcwOTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDI6IC8qIDEuMiBNICovCisJCQkJQ1hfcmVnKGNvbnRleHQpID0gMHg0ZjBmOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgMzogLyogNzIwIEsgKi8KKwkJCQlDWF9yZWcoY29udGV4dCkgPSAweDRmMDk7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSA0OiAvKiAxLjQ0IE0gKi8KKwkJCQlDWF9yZWcoY29udGV4dCkgPSAweDRmMTI7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSA1OgorCQkJICAgIGNhc2UgNjogLyogMi44OCBNICovCisJCQkJQ1hfcmVnKGNvbnRleHQpID0gMHg0ZjI0OworCQkJCWJyZWFrOworCQkJfQorCQkJRVNfcmVnKGNvbnRleHQpID0gMHgwMDAwOyAvKiBGSVhNRTogZHJpdmUgcGFyYW1ldGVyIHRhYmxlICovCisJCQlESV9yZWcoY29udGV4dCkgPSAweDAwMDA7CisjZWxzZQorICAgICAgICAgICAgICAgIAlBSF9yZWcoY29udGV4dCkgPSAweDAxOworICAgICAgICAgICAgICAgIAlTRVRfQ0ZMQUcoY29udGV4dCk7CisgICAgICAgICAgICAgICAgCWJyZWFrOworI2VuZGlmCisJCX0KIAkJYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDA5OiAgICAgICAgIC8qIElOSVRJQUxJWkUgQ09OVFJPTExFUiBXSVRIIERSSVZFIFBBUkFNRVRFUlMgKi8KZGlmZiAtLWdpdCBhL21zZG9zL2ludDIwLmMgYi9tc2Rvcy9pbnQyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGE0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tc2Rvcy9pbnQyMC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBET1MgaW50ZXJydXB0IDIwaCBoYW5kbGVyIChURVJNSU5BVEUgUFJPR1JBTSkKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJtaXNjZW11LmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKy8qICNkZWZpbmUgREVCVUdfSU5UICovCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgSU5UX0ludDIwSGFuZGxlcgorICoKKyAqIEhhbmRsZXIgZm9yIGludCAyMGguCisgKi8KK3ZvaWQgV0lOQVBJIElOVF9JbnQyMEhhbmRsZXIoIENPTlRFWFQgKmNvbnRleHQgKQoreworICAgICAgICBUQVNLX0tpbGxDdXJyZW50VGFzayggMCApOworfQpkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MjEuYyBiL21zZG9zL2ludDIxLmMKaW5kZXggYWUwMzMwOC4uMGZhN2EyMSAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MjEuYworKysgYi9tc2Rvcy9pbnQyMS5jCkBAIC01OTUsNiArNTk1LDEwIEBACiAgICAgY2hhciAqbmFtZSA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkgKTsKICAgICBjaGFyICpwID0gbmFtZSArIHN0cmxlbihuYW1lKTsKIAorICAgIC8qIGRlc3BpdGUgd2hhdCBSYWxmIEJyb3duIHNheXMsIHNvbWUgcHJvZ3JhbXMgc2VlbSB0byBjYWxsIHdpdGhvdXQgCisgICAgICogZW5kaW5nIGJhY2tzbGFzaCAoRE9TIGFjY2VwdHMgdGhhdCwgc28gd2UgYWNjZXB0IGl0IHRvbykgKi8KKyAgICBpZiAoKHAgPT0gbmFtZSkgfHwgKHBbLTFdICE9ICdcXCcpKSAqcCsrID0gJ1xcJzsKKwogICAgIGZvciAoOzspCiAgICAgewogICAgICAgICBzcHJpbnRmKCBwLCAid2luZSUwNHguJTAzZCIsIChpbnQpZ2V0cGlkKCksIGNvdW50ZXIgKTsKQEAgLTEyNzEsNiArMTI3NSw3IEBACiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBFUl9Ob01vcmVGaWxlczsKICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgfQorICAgICAgICBlbHNlIEFYX3JlZyhjb250ZXh0KSA9IDA7ICAvKiBPSyAqLwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg1MTogLyogR0VUIFBTUCBBRERSRVNTICovCkBAIC0xNjEwLDMgKzE2MTUsOCBAQAogICAgICAgICAgICAgICAgICBFRkxfcmVnKGNvbnRleHQpKTsKIH0KIAorRkFSUFJPQzE2IFdJTkFQSSBHZXRTZXRLZXJuZWxET1NQcm9jKEZBUlBST0MxNiBEb3NQcm9jKQoreworCWZwcmludGYoc3RkZXJyLCAiR2V0U2V0S2VybmVsRE9TUHJvYyhEb3NQcm9jOiAlMDh4KTtcbiIsIChVSU5UMzIpRG9zUHJvYyk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyNS5jIGIvbXNkb3MvaW50MjUuYwppbmRleCA4ZTk5NjA5Li4yZmQ2ZDczIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyNS5jCisrKyBiL21zZG9zL2ludDI1LmMKQEAgLTUsNiArNSw4IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgIm1zZG9zLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgpAQCAtMjIsNiArMjQsNyBAQAogewogICAgIEJZVEUgKmRhdGFwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgQlhfcmVnKGNvbnRleHQpICk7CiAgICAgRFdPUkQgYmVnaW4sIGxlbmd0aDsKKyAgICBpbnQgZmQ7CiAKICAgICBpZiAoIURSSVZFX0lzVmFsaWQoQUxfcmVnKGNvbnRleHQpKSkKICAgICB7CkBAIC00NSwxMSArNDgsMTggQEAKICAgICAgICAgICAgICAgICAgImNvdW50ICVsZCwgYnVmZmVyICVkXG4iLAogICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCksIGJlZ2luLCBsZW5ndGgsIChpbnQpIGRhdGFwdHIpOwogCi0gICAgbWVtc2V0KGRhdGFwdHIsIDAsIGxlbmd0aCAqIDUxMik7Ci0KLSAgICBpZiAoYmVnaW4gPT0gMCAmJiBsZW5ndGggPiAxKSAqKGRhdGFwdHIgKyA1MTIpID0gMHhmODsKLQotICAgIGlmIChiZWdpbiA9PSAxKSAqZGF0YXB0ciA9IDB4Zjg7Ci0KKyAgICBpZiAoKGZkID0gRFJJVkVfT3BlbkRldmljZSggQUxfcmVnKGNvbnRleHQpLCBPX1JET05MWSApKSAhPSAtMSkKKyAgICB7CisgICAgICAgIGxzZWVrKCBmZCwgYmVnaW4gKiA1MTIsIFNFRUtfU0VUICk7CisgICAgICAgIC8qIEZJWE1FOiBjaGVjayBlcnJvcnMgKi8KKyAgICAgICAgcmVhZCggZmQsIGRhdGFwdHIsIGxlbmd0aCAqIDUxMiApOworICAgICAgICBjbG9zZSggZmQgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWVtc2V0KGRhdGFwdHIsIDAsIGxlbmd0aCAqIDUxMik7CisgICAgICAgIGlmIChiZWdpbiA9PSAwICYmIGxlbmd0aCA+IDEpICooZGF0YXB0ciArIDUxMikgPSAweGY4OworICAgICAgICBpZiAoYmVnaW4gPT0gMSkgKmRhdGFwdHIgPSAweGY4OworICAgIH0KICAgICBSRVNFVF9DRkxBRyhjb250ZXh0KTsKIH0KZGlmZiAtLWdpdCBhL21zZG9zL2ludDI2LmMgYi9tc2Rvcy9pbnQyNi5jCmluZGV4IDRhNThhNWMuLmMyNGYxYTkgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDI2LmMKKysrIGIvbXNkb3MvaW50MjYuYwpAQCAtNCw2ICs0LDggQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJtc2Rvcy5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKQEAgLTIxLDYgKzIzLDcgQEAKIHsKICAgICBCWVRFICpkYXRhcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSApOwogICAgIERXT1JEIGJlZ2luLCBsZW5ndGg7CisgICAgaW50IGZkOwogCiAgICAgaWYgKCFEUklWRV9Jc1ZhbGlkKEFMX3JlZyhjb250ZXh0KSkpCiAgICAgewpAQCAtNDUsNSArNDgsMTMgQEAKICAgICAgICAgICAgICAgICAgImNvdW50ICVsZCwgYnVmZmVyICVkXG4iLAogICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCksIGJlZ2luLCBsZW5ndGgsIChpbnQpIGRhdGFwdHIgKTsKIAorICAgIGlmICgoZmQgPSBEUklWRV9PcGVuRGV2aWNlKCBBTF9yZWcoY29udGV4dCksIE9fV1JPTkxZICkpICE9IC0xKQorICAgIHsKKyAgICAgICAgbHNlZWsoIGZkLCBiZWdpbiAqIDUxMiwgU0VFS19TRVQgKTsKKyAgICAgICAgLyogRklYTUU6IGNoZWNrIGVycm9ycyAqLworICAgICAgICB3cml0ZSggZmQsIGRhdGFwdHIsIGxlbmd0aCAqIDUxMiApOworICAgICAgICBjbG9zZSggZmQgKTsKKyAgICB9CisKICAgICBSRVNFVF9DRkxBRyhjb250ZXh0KTsKIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvZHNvdW5kLmMgYi9tdWx0aW1lZGlhL2Rzb3VuZC5jCmluZGV4IGZhZmE5NTkuLjExOGE5N2UgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvZHNvdW5kLmMKKysrIGIvbXVsdGltZWRpYS9kc291bmQuYwpAQCAtMTAsMTQgKzEwLDI5IEBACiAgKiBGSVhNRTogVGhpcyBmaWxlIGlzIGZ1bGwgb2YgcmFjZSBjb25kaXRpb25zIGFuZCB1bmxvY2tlZCB2YXJpYWJsZSBhY2Nlc3MKICAqIGZyb20gdHdvIHRocmVhZHMuIEJ1dCB3ZSB1c3VhbGx5IGRvbid0IG5lZWQgdG8gYm90aGVyLgogICoKKyAqIFRlc3RlZCB3aXRoIGEgU291bmRibGFzdGVyIGNsb25lIGFuZCBhIEdyYXZpcyBVbHRyYVNvdW5kIENsYXNzaWMuCisgKgorICogU3RhdHVzOgorICogLSBXaW5nIENvbW1hbmRlciA0L1c5NToKKyAqICAgVGhlIGludHJvbW92aWUgcGxheXMgd2l0aG91dCBwcm9ibGVtcy4gTmVhcmx5IGxpcHN5bmNocm9uLgorICogLSBEaXNjV29ybGQgMgorICogICBUaGUgc291bmQgd29ya3MsIGJ1dCBub3RpY2VhYmxlIGNodW5rcyBhcmUgbGVmdCBvdXQgKGZyb20gdGhlIHNvdW5kIGFuZAorICogICB0aGUgYW5pbWF0aW9uKS4gRG9uJ3Qga25vdyB3aHkgeWV0LgorICogLSBEaWFibG86CisgKiAgIFNvdW5kIHdvcmtzLCBidXQgc2xvd3MgZG93biB0aGUgbW92aWVwbGF5ZXIuCisgKiAtIFh2VDogCisgKiAgIERvZXNuJ3Qgc291bmQgeWV0LgorICogLSBNb25rZXkgSXNsYW5kIDM6CisgKiAgIFRoZSBiYWNrZ3JvdW5kIHNvdW5kIG9mIHRoZSBzdGFydHNjcmVlbiB3b3JrcyA7KQorICogLSBXaW5nQ29tbWFuZGVyIFByb3BoZWN5IERlbW86CisgKiAgIFNvdW5kIHdvcmtzIGZvciB0aGUgaW50cm9tb3ZpZS4KICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMjYsMTUgKzQxLDI2IEBACiAjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiAjaW5jbHVkZSAiZHNvdW5kLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaWZkZWYgSEFWRV9PU1MKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+Ci1zdGF0aWMgaW50IGF1ZGlvZmQgPSAwOworCitzdGF0aWMgaW50IGF1ZGlvZmQgPSAtMTsKK3N0YXRpYyBpbnQgY3VycmVudF9idWZmZXJlZF9mcmFncyA9IDQ7CiBzdGF0aWMgTFBESVJFQ1RTT1VORAlkc291bmQgPSBOVUxMOworCitzdGF0aWMgc2hvcnQgcGxheWJ1ZlsyMDQ4XTsKKwogI2VuZGlmCiAKIEhSRVNVTFQgV0lOQVBJIERpcmVjdFNvdW5kRW51bWVyYXRlMzJBKExQRFNFTlVNQ0FMTEJBQ0szMkEgZW51bWNiLExQVk9JRCBjb250ZXh0KSB7CisjaWZkZWYgSEFWRV9PU1MKKwllbnVtY2IoTlVMTCwiV0lORSBEaXJlY3RTb3VuZCB1c2luZyBPcGVuIFNvdW5kIFN5c3RlbSIsInNvdW5kIixjb250ZXh0KTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC02NCw3MiArOTAsMTAwIEBACiAJCQlmcHJpbnRmKHN0ZGVyciwiJXMgIixmbGFnc1tpXS5uYW1lKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlJRGlyZWN0U291bmROb3RpZnkKKyAqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZE5vdGlmeV9RdWVyeUludGVyZmFjZSgKKwlMUERJUkVDVFNPVU5ETk9USUZZIHRoaXMsUkVGSUlEIHJpaWQsTFBWT0lEICpwcG9iagorKSB7CisJY2hhciB4YnVmWzUwXTsKKworCVN0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4YnVmLHBwb2JqKTsKKwlyZXR1cm4gRV9GQUlMOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3RTb3VuZE5vdGlmeV9BZGRSZWYoTFBESVJFQ1RTT1VORE5PVElGWSB0aGlzKSB7CisJcmV0dXJuICsrKHRoaXMtPnJlZik7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdFNvdW5kTm90aWZ5X1JlbGVhc2UoTFBESVJFQ1RTT1VORE5PVElGWSB0aGlzKSB7CisJdGhpcy0+cmVmLS07CisJaWYgKCF0aGlzLT5yZWYpIHsKKwkJdGhpcy0+ZHNiLT5scHZ0YmwtPmZuUmVsZWFzZSh0aGlzLT5kc2IpOworCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGhpcy0+cmVmOworfQorCitzdGF0aWMgaW50IF9zb3J0X25vdGlmaWVzKGNvbnN0IHZvaWQgKmEsY29uc3Qgdm9pZCAqYikgeworCUxQRFNCUE9TSVRJT05OT1RJRlkJbmEgPSAoTFBEU0JQT1NJVElPTk5PVElGWSlhOworCUxQRFNCUE9TSVRJT05OT1RJRlkJbmIgPSAoTFBEU0JQT1NJVElPTk5PVElGWSliOworCisJcmV0dXJuIG5hLT5kd09mZnNldC1uYi0+ZHdPZmZzZXQ7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmROb3RpZnlfU2V0Tm90aWZpY2F0aW9uUG9zaXRpb25zKAorCUxQRElSRUNUU09VTkROT1RJRlkgdGhpcyxEV09SRCBob3dtdWNoLExQQ0RTQlBPU0lUSU9OTk9USUZZIG5vdGlmeQorKSB7CisJaW50CWk7CisKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kTm90aWZ5KCVwKS0+U2V0Tm90aWZpY2F0aW9uUG9zaXRpb25zKDB4JTA4bHgsJXApLHN0dWIhXG4iLHRoaXMsaG93bXVjaCxub3RpZnkpOworCWZvciAoaT0wO2k8aG93bXVjaDtpKyspCisJCWZwcmludGYoc3RkZXJyLCIJbm90aWZ5IGF0ICVsZCB0byAweCUwOGx4XG4iLG5vdGlmeVtpXS5kd09mZnNldCxub3RpZnlbaV0uaEV2ZW50Tm90aWZ5KTsKKwl0aGlzLT5kc2ItPm5vdGlmaWVzID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHRoaXMtPmRzYi0+bm90aWZpZXMsKHRoaXMtPmRzYi0+bnJvZm5vdGlmaWVzK2hvd211Y2gpKnNpemVvZihEU0JQT1NJVElPTk5PVElGWSkpOworCW1lbWNweSgJdGhpcy0+ZHNiLT5ub3RpZmllcyt0aGlzLT5kc2ItPm5yb2Zub3RpZmllcywKKwkJbm90aWZ5LAorCQlob3dtdWNoKnNpemVvZihEU0JQT1NJVElPTk5PVElGWSkKKwkpOworCXRoaXMtPmRzYi0+bnJvZm5vdGlmaWVzKz1ob3dtdWNoOworCXFzb3J0KHRoaXMtPmRzYi0+bm90aWZpZXMsdGhpcy0+ZHNiLT5ucm9mbm90aWZpZXMsc2l6ZW9mKERTQlBPU0lUSU9OTk9USUZZKSxfc29ydF9ub3RpZmllcyk7CisJZm9yIChpPTA7aTx0aGlzLT5kc2ItPm5yb2Zub3RpZmllcztpKyspCisJCWZwcmludGYoc3RkZXJyLCIJbm90aWZ5IGF0ICVsZCB0byAweCUwOGx4XG4iLHRoaXMtPmRzYi0+bm90aWZpZXNbaV0uZHdPZmZzZXQsdGhpcy0+ZHNiLT5ub3RpZmllc1tpXS5oRXZlbnROb3RpZnkpOworCXJldHVybiAwOworfQorCitJRGlyZWN0U291bmROb3RpZnlfVlRhYmxlIGRzbnZ0ID0geworCUlEaXJlY3RTb3VuZE5vdGlmeV9RdWVyeUludGVyZmFjZSwKKwlJRGlyZWN0U291bmROb3RpZnlfQWRkUmVmLAorCUlEaXJlY3RTb3VuZE5vdGlmeV9SZWxlYXNlLAorCUlEaXJlY3RTb3VuZE5vdGlmeV9TZXROb3RpZmljYXRpb25Qb3NpdGlvbnMsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUlEaXJlY3RTb3VuZEJ1ZmZlcgorICovCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1NldEZvcm1hdCgKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBXQVZFRk9STUFURVggd2ZleAogKSB7Ci0JaW50CXh4LGNoYW5uZWxzLHNwZWVkLGZvcm1hdCxuZm9ybWF0OwogCi0JZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlNldEZvcm1hdCglcCksc3R1YiFcbiIsdGhpcyx3ZmV4KTsKIAltZW1jcHkoJih0aGlzLT53ZngpLHdmZXgsc2l6ZW9mKHRoaXMtPndmeCkpOwotCWZwcmludGYoc3RkZXJyLCIJW2Zvcm1hdHRhZz0weCUwNHgsIix3ZmV4LT53Rm9ybWF0VGFnKTsKLQlmcHJpbnRmKHN0ZGVyciwiY2hhbnM9JWQsIix3ZmV4LT5uQ2hhbm5lbHMpOwotCWZwcmludGYoc3RkZXJyLCJzYW1wbGVyYXRlPSVsZCwiLHdmZXgtPm5TYW1wbGVzUGVyU2VjKTsKLQlmcHJpbnRmKHN0ZGVyciwiYnl0ZXNwZXJzZWM9JWxkLCIsd2ZleC0+bkF2Z0J5dGVzUGVyU2VjKTsKLQlmcHJpbnRmKHN0ZGVyciwiYmxvY2thbGlnbj0lZCwiLHdmZXgtPm5CbG9ja0FsaWduKTsKLQlmcHJpbnRmKHN0ZGVyciwiYml0c3BlcnNhbXA9JWQsIix3ZmV4LT53Qml0c1BlclNhbXBsZSk7Ci0JZnByaW50ZihzdGRlcnIsImNiU2l6ZT0lZF1cbiIsd2ZleC0+Y2JTaXplKTsKKwlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlNldEZvcm1hdCglcCksc3R1YiFcbiIsdGhpcyx3ZmV4KTsKKwlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIglbZm9ybWF0dGFnPTB4JTA0eCwiLHdmZXgtPndGb3JtYXRUYWcpOworCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiY2hhbnM9JWQsIix3ZmV4LT5uQ2hhbm5lbHMpOworCWRwcmludGZfZHNvdW5kKHN0ZGVyciwic2FtcGxlcmF0ZT0lbGQsIix3ZmV4LT5uU2FtcGxlc1BlclNlYyk7CisJZHByaW50Zl9kc291bmQoc3RkZXJyLCJieXRlc3BlcnNlYz0lbGQsIix3ZmV4LT5uQXZnQnl0ZXNQZXJTZWMpOworCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiYmxvY2thbGlnbj0lZCwiLHdmZXgtPm5CbG9ja0FsaWduKTsKKwlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsImJpdHNwZXJzYW1wPSVkLCIsd2ZleC0+d0JpdHNQZXJTYW1wbGUpOworCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiY2JTaXplPSVkXVxuIix3ZmV4LT5jYlNpemUpOwogCi0Jc3dpdGNoICh3ZmV4LT53Rm9ybWF0VGFnKSB7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsInVua25vd24gV0FWRV9GT1JNQVQgdGFnICVkXG4iLHdmZXgtPndGb3JtYXRUYWcpOwotCQlyZXR1cm4gRFNFUlJfQkFERk9STUFUOwotCWNhc2UgV0FWRV9GT1JNQVRfUENNOgotCQlmb3JtYXQgPSBBRk1UX1MxNl9MRTsKLQkJYnJlYWs7Ci0JfQotCWlmICgtMT09aW9jdGwoYXVkaW9mZCxTTkRDVExfRFNQX0dFVEZNVFMsJnh4KSkgewotCQlwZXJyb3IoImlvY3RsIFNORENUTF9EU1BfR0VURk1UUyIpOwotCQlyZXR1cm4gRFNFUlJfQkFERk9STUFUOwotCX0KLQlpZiAoKHh4JmZvcm1hdCkhPWZvcm1hdCkgey8qIGZvcm1hdCB1bnN1cHBvcnRlZCAqLwotCQlmcHJpbnRmKHN0ZGVyciwiU05EQ1RMX0RTUF9HRVRGTVRTOiBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7IAotCQlyZXR1cm4gRFNFUlJfQkFERk9STUFUOwotCX0KLQluZm9ybWF0ID0gZm9ybWF0OwotCWlmICgtMT09aW9jdGwoYXVkaW9mZCxTTkRDVExfRFNQX1NFVEZNVCwmbmZvcm1hdCkpIHsKLQkJcGVycm9yKCJpb2N0bCBTTkRDVExfRFNQX1NFVEZNVCIpOwotCQlyZXR1cm4gRFNFUlJfQkFERk9STUFUOwotCX0KLQlpZiAobmZvcm1hdCE9Zm9ybWF0KSB7LyogZGlkbid0IHdvcmsgKi8KLQkJZnByaW50ZihzdGRlcnIsIlNORENUTF9EU1BfR0VURk1UUzogZm9ybWF0IG5vdCBzZXRcbiIpOyAKLQkJcmV0dXJuIERTRVJSX0JBREZPUk1BVDsKLQl9Ci0KLQljaGFubmVscyA9IHdmZXgtPm5DaGFubmVscy0xOwotCWlmICgtMT09aW9jdGwoYXVkaW9mZCxTTkRDVExfRFNQX1NURVJFTywmY2hhbm5lbHMpKSB7Ci0JCXBlcnJvcigiaW9jdGwgU05EQ1RMX0RTUF9TVEVSRU8iKTsKLQkJcmV0dXJuIERTRVJSX0JBREZPUk1BVDsKLQl9Ci0Jc3BlZWQgPSB3ZmV4LT5uU2FtcGxlc1BlclNlYzsKLQlpZiAoLTE9PWlvY3RsKGF1ZGlvZmQsU05EQ1RMX0RTUF9TUEVFRCwmc3BlZWQpKSB7Ci0JCXBlcnJvcigiaW9jdGwgU05EQ1RMX0RTUF9TUEVFRCIpOwotCQlyZXR1cm4gRFNFUlJfQkFERk9STUFUOwotCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9TZXRWb2x1bWUoCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExPTkcgdm9sCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+U2V0Vm9sdW1lKCUwOGx4KSxzdHViIVxuIix0aGlzLHZvbCk7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlNldFZvbHVtZSglbGQpLHN0dWIhXG4iLHRoaXMsdm9sKTsKKwl0aGlzLT52b2x1bWUgPSB2b2w7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfR2V0Vm9sdW1lKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUExPTkcgdm9sCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+R2V0Vm9sdW1lKCVwKSxzdHViIVxuIix0aGlzLHZvbCk7Ci0JKnZvbCA9IDEwMDsKKwlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldFZvbHVtZSglcCksc3R1YiFcbiIsdGhpcyx2b2wpOworCSp2b2wgPSB0aGlzLT52b2x1bWU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MywxNyArMTk3LDE5IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1BsYXkoCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLERXT1JEIHJlc2VydmVkMSxEV09SRCByZXNlcnZlZDIsRFdPUkQgZmxhZ3MKICkgewotCi0JZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlBsYXkoJTA4bHgsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLAorCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+UGxheSglMDhseCwlMDhseCwlMDhseCksc3R1YiFcbiIsCiAJCXRoaXMscmVzZXJ2ZWQxLHJlc2VydmVkMixmbGFncwogCSk7CisJdGhpcy0+cGxheXBvcyA9IDA7CisJdGhpcy0+cGxheWZsYWdzID0gZmxhZ3M7CiAJdGhpcy0+cGxheWluZyA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfU3RvcChMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMpIHsKLQkvKmZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TdG9wKClcbiIsdGhpcyk7Ki8KKwlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlN0b3AoKVxuIix0aGlzKTsKIAl0aGlzLT5wbGF5aW5nID0gMDsKKwl0aGlzLT53cml0ZXBvcyA9IDA7IC8qIGhtbSAqLwogCXJldHVybiAwOwogfQogCkBAIC0xNjUsNyArMjIxLDYgQEAKIAogCWlmICgtLXRoaXMtPnJlZikKIAkJcmV0dXJuIHRoaXMtPnJlZjsKLQlmcHJpbnRmKHN0ZGVyciwiCS0+IElEaXJlY3RTb3VuZEJ1ZmZlciglcCkgZnJlZWQuXG4iLHRoaXMpOwogCWZvciAoaT0wO2k8dGhpcy0+ZHNvdW5kLT5ucm9mYnVmZmVycztpKyspCiAJCWlmICh0aGlzLT5kc291bmQtPmJ1ZmZlcnNbaV0gPT0gdGhpcykKIAkJCWJyZWFrOwpAQCAtMTg2LDI4ICsyNDEsMjggQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfR2V0Q3VycmVudFBvc2l0aW9uKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUERXT1JEIHBsYXlwb3MsTFBEV09SRCB3cml0ZXBvcwogKSB7Ci0vKglmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+R2V0Q3VycmVudFBvc2l0aW9uKCVwLCVwKSxzdHViIVxuIix0aGlzLHBsYXlwb3Msd3JpdGVwb3MpOyovCi0KKwlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldEN1cnJlbnRQb3NpdGlvbiglcCwlcCksc3R1YiFcbiIsdGhpcyxwbGF5cG9zLHdyaXRlcG9zKTsKIAlpZiAocGxheXBvcykgKnBsYXlwb3MgPSB0aGlzLT5wbGF5cG9zOwotCXRoaXMtPndyaXRlcG9zID0gKHRoaXMtPnBsYXlwb3MrNTEyKSAlIHRoaXMtPmJ1ZmxlbjsKLQlpZiAod3JpdGVwb3MpICp3cml0ZXBvcyA9IHRoaXMtPndyaXRlcG9zOyAvKiBobW0gKi8KKwlpZiAod3JpdGVwb3MpICp3cml0ZXBvcyA9IHRoaXMtPndyaXRlcG9zOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0dldFN0YXR1cygKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBEV09SRCBzdGF0dXMKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRTdGF0dXMoJXApLHN0dWIhXG4iLHRoaXMsc3RhdHVzKTsKKwlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldFN0YXR1cyglcClcbiIsdGhpcyxzdGF0dXMpOworCSpzdGF0dXMgPSAwOwogCWlmICh0aGlzLT5wbGF5aW5nKQotCQkqc3RhdHVzID0gRFNCU1RBVFVTX1BMQVlJTkc7Ci0JKnN0YXR1cyB8PSBEU0JTVEFUVVNfTE9PUElORzsgLyogRklYTUUgKi8KKwkJKnN0YXR1cyB8PSBEU0JTVEFUVVNfUExBWUlORzsKKwlpZiAodGhpcy0+cGxheWZsYWdzICYgRFNCUExBWV9MT09QSU5HKQorCQkqc3RhdHVzIHw9IERTQlNUQVRVU19MT09QSU5HOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0dldEZvcm1hdCgKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBXQVZFRk9STUFURVggbHB3ZixEV09SRCB3ZnNpemUsTFBEV09SRCB3ZndyaXR0ZW4KICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRGb3JtYXQoJXAsMHglMDhseCwlcCksc3R1YiFcbiIsdGhpcyxscHdmLHdmc2l6ZSx3ZndyaXR0ZW4pOworCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+R2V0Rm9ybWF0KCVwLCVsZCwlcClcbiIsdGhpcyxscHdmLHdmc2l6ZSx3ZndyaXR0ZW4pOwogCWlmICh3ZnNpemU+c2l6ZW9mKHRoaXMtPndmeCkpIHdmc2l6ZSA9IHNpemVvZih0aGlzLT53ZngpOwogCW1lbWNweShscHdmLCYodGhpcy0+d2Z4KSx3ZnNpemUpOwogCWlmICh3ZndyaXR0ZW4pICp3ZndyaXR0ZW4gPSB3ZnNpemU7CkBAIC0yMTgsOCArMjczLDcgQEAKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsRFdPUkQgd3JpdGVjdXJzb3IsRFdPUkQgd3JpdGVieXRlcyxMUFZPSUQgbHBscGF1ZGlvcHRyMSxMUERXT1JEIGF1ZGlvYnl0ZXMxLExQVk9JRCBscGxwYXVkaW9wdHIyLExQRFdPUkQgYXVkaW9ieXRlczIsRFdPUkQgZmxhZ3MKICkgewogCi0vKgotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5Mb2NrKCVsZCwlbGQsJXAsJXAsJXAsJXAsMHglMDhseCksc3R1YiFcbiIsCisJZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5Mb2NrKCVsZCwlbGQsJXAsJXAsJXAsJXAsMHglMDhseClcbiIsCiAJCXRoaXMsCiAJCXdyaXRlY3Vyc29yLAogCQl3cml0ZWJ5dGVzLApAQCAtMjI5LDE3ICsyODMsMTggQEAKIAkJYXVkaW9ieXRlczIsCiAJCWZsYWdzCiAJKTsKLSovCiAJaWYgKGZsYWdzICYgRFNCTE9DS19GUk9NV1JJVEVDVVJTT1IpCiAJCXdyaXRlY3Vyc29yID0gdGhpcy0+d3JpdGVwb3M7Ci0KLQlpZiAod3JpdGVjdXJzb3Ird3JpdGVieXRlcyA8IHRoaXMtPmJ1ZmxlbikgeworCWFzc2VydChhdWRpb2J5dGVzMSE9YXVkaW9ieXRlczIpOworCWFzc2VydChscGxwYXVkaW9wdHIxIT1scGxwYXVkaW9wdHIyKTsKKwlpZiAod3JpdGVjdXJzb3Ird3JpdGVieXRlcyA8PSB0aGlzLT5idWZsZW4pIHsKIAkJKihMUEJZVEUqKWxwbHBhdWRpb3B0cjEgPSB0aGlzLT5idWZmZXIrd3JpdGVjdXJzb3I7CiAJCSphdWRpb2J5dGVzMSA9IHdyaXRlYnl0ZXM7CiAJCWlmIChscGxwYXVkaW9wdHIyKQogCQkJKihMUEJZVEUqKWxwbHBhdWRpb3B0cjIgPSBOVUxMOwogCQlpZiAoYXVkaW9ieXRlczIpCiAJCQkqYXVkaW9ieXRlczIgPSAwOworCQlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIi0+JWxkLjBcbiIsd3JpdGVieXRlcyk7CiAJfSBlbHNlIHsKIAkJKihMUEJZVEUqKWxwbHBhdWRpb3B0cjEgPSB0aGlzLT5idWZmZXIrd3JpdGVjdXJzb3I7CiAJCSphdWRpb2J5dGVzMSA9IHRoaXMtPmJ1Zmxlbi13cml0ZWN1cnNvcjsKQEAgLTI0Nyw2ICszMDIsNyBAQAogCQkJKihMUEJZVEUqKWxwbHBhdWRpb3B0cjIgPSB0aGlzLT5idWZmZXI7CiAJCWlmIChhdWRpb2J5dGVzMikKIAkJCSphdWRpb2J5dGVzMiA9IHdyaXRlYnl0ZXMtKHRoaXMtPmJ1Zmxlbi13cml0ZWN1cnNvcik7CisJCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiLT4lbGQuJWxkXG4iLCphdWRpb2J5dGVzMSxhdWRpb2J5dGVzMj8qYXVkaW9ieXRlczI6MCk7CiAJfQogCXRoaXMtPndyaXRlcG9zPSh3cml0ZWN1cnNvcit3cml0ZWJ5dGVzKSV0aGlzLT5idWZsZW47CiAJcmV0dXJuIDA7CkBAIC0yNTUsNyArMzExLDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfU2V0Q3VycmVudFBvc2l0aW9uKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxEV09SRCBuZXdwb3MKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRDdXJyZW50UG9zaXRpb24oJWxkKVxuIix0aGlzLG5ld3Bvcyk7CisJZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRDdXJyZW50UG9zaXRpb24oJWxkKVxuIix0aGlzLG5ld3Bvcyk7CiAJdGhpcy0+cGxheXBvcyA9IG5ld3BvczsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2MywzMyArMzE5LDg5IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1NldFBhbigKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTE9ORyBuZXdwYW4KICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRQYW4oJWxkKSxzdHViIVxuIix0aGlzLG5ld3Bhbik7CisJZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRQYW4oJWxkKSxzdHViIVxuIix0aGlzLG5ld3Bhbik7CisJdGhpcy0+cGFuID0gbmV3cGFuOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0dldFBhbigKKwlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBMT05HIHBhbgorKSB7CisJZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRQYW4oJXApLHN0dWIhXG4iLHRoaXMscGFuKTsKKwkqcGFuID0gdGhpcy0+cGFuOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1VubG9jaygKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBWT0lEIHAxLERXT1JEIHgxLExQVk9JRCBwMixEV09SRCB4MgogKSB7Ci0Jc3RydWN0IGNvdW50X2luZm8JY2k7Ci0vKgotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5VbmxvY2soJXAsJWxkLCVwLCVsZCksc3R1YiFcbiIsdGhpcyxwMSx4MSxwMix4Mik7Ci0gKi8KLSAJZnByaW50ZihzdGRlcnIsInUlbGQuJWxkLCIseDEseDIpOworCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+VW5sb2NrKCVwLCVsZCwlcCwlbGQpXG4iLAorCQl0aGlzLHAxLHgxLHAyLHgyCisJKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRGcmVxdWVuY3koCisJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQRFdPUkQgZnJlcQorKSB7CisJZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRGcmVxdWVuY3koJXApXG4iLAorCQl0aGlzLGZyZXEKKwkpOworCSpmcmVxID0gdGhpcy0+d2Z4Lm5TYW1wbGVzUGVyU2VjOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0luaXRpYWxpemUoCisJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQRElSRUNUU09VTkQgZHNvdW5kLExQRFNCVUZGRVJERVNDIGRic2QKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5Jbml0aWFsaXplKCVwLCVwKSxzdHViIVxuIix0aGlzLGRzb3VuZCxkYnNkKTsKKwlyZXR1cm4gRFNFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0dldENhcHMoCisJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQRFNCQ0FQUyBjYXBzCispIHsKKwljYXBzLT5kd1NpemUgPSBzaXplb2YoKmNhcHMpOworCWNhcHMtPmR3RmxhZ3MgPSBEU0JDQVBTX1BSSU1BUllCVUZGRVJ8RFNCQ0FQU19TVEFUSUN8RFNCQ0FQU19DVFJMQUxMfERTQkNBUFNfTE9DU09GVFdBUkU7CisJY2Fwcy0+ZHdCdWZmZXJCeXRlcyA9IDA7CisJY2Fwcy0+ZHdVbmxvY2tUcmFuc2ZlclJhdGUgPSAwOworCWNhcHMtPmR3UGxheUNwdU92ZXJoZWFkID0gMDsKKwlyZXR1cm4gRFNfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfUXVlcnlJbnRlcmZhY2UoCisJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLFJFRklJRCByaWlkLExQVk9JRCAqcHBvYmoKKykgeworCWNoYXIJeGJ1Zls1MF07CisKKwlpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3RTb3VuZE5vdGlmeSxyaWlkLHNpemVvZigqcmlpZCkpKSB7CisJCUlEaXJlY3RTb3VuZE5vdGlmeQkqZHNuOworCisJCWRzbiA9IChMUERJUkVDVFNPVU5ETk9USUZZKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKCpkc24pKTsKKwkJZHNuLT5yZWYgPSAxOworCQlkc24tPmRzYiA9IHRoaXM7CisJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CisJCWRzbi0+bHB2dGJsID0gJmRzbnZ0OworCQkqcHBvYmogPSAoTFBWT0lEKWRzbjsKKwkJcmV0dXJuIDA7CisJfQorCVN0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4YnVmLHBwb2JqKTsKKwlyZXR1cm4gRV9GQUlMOworfQorCiBzdGF0aWMgc3RydWN0IHRhZ0xQRElSRUNUU09VTkRCVUZGRVJfVlRBQkxFIGRzYnZ0ID0gewotCSh2b2lkICopMSwKKwlJRGlyZWN0U291bmRCdWZmZXJfUXVlcnlJbnRlcmZhY2UsCiAJSURpcmVjdFNvdW5kQnVmZmVyX0FkZFJlZiwKIAlJRGlyZWN0U291bmRCdWZmZXJfUmVsZWFzZSwKLQkodm9pZCAqKTQsCisJSURpcmVjdFNvdW5kQnVmZmVyX0dldENhcHMsCiAJSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbiwKIAlJRGlyZWN0U291bmRCdWZmZXJfR2V0Rm9ybWF0LAogCUlEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRWb2x1bWUsCi0JKHZvaWQgKik4LAotICAgICAgICAodm9pZCAqKTksCisJSURpcmVjdFNvdW5kQnVmZmVyX0dldFBhbiwKKyAgICAgICAgSURpcmVjdFNvdW5kQnVmZmVyX0dldEZyZXF1ZW5jeSwKIAlJRGlyZWN0U291bmRCdWZmZXJfR2V0U3RhdHVzLAotCSh2b2lkICopMTEsCisJSURpcmVjdFNvdW5kQnVmZmVyX0luaXRpYWxpemUsCiAJSURpcmVjdFNvdW5kQnVmZmVyX0xvY2ssCiAJSURpcmVjdFNvdW5kQnVmZmVyX1BsYXksCiAJSURpcmVjdFNvdW5kQnVmZmVyX1NldEN1cnJlbnRQb3NpdGlvbiwKQEAgLTMwMSwxMiArNDEzLDE0IEBACiAJSURpcmVjdFNvdW5kQnVmZmVyX1VubG9jawogfTsKIAotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUlEaXJlY3RTb3VuZAorICovCiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRfU2V0Q29vcGVyYXRpdmVMZXZlbCgKIAlMUERJUkVDVFNPVU5EIHRoaXMsSFdORDMyIGh3bmQsRFdPUkQgbGV2ZWwKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCVsZCksc3R1YiFcbiIsCisJZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCVsZClcbiIsCiAJCXRoaXMsKERXT1JEKWh3bmQsbGV2ZWwKIAkpOwogCXJldHVybiAwOwpAQCAtMzE2LDEzICs0MzAsMTUgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRfQ3JlYXRlU291bmRCdWZmZXIoCiAJTFBESVJFQ1RTT1VORCB0aGlzLExQRFNCVUZGRVJERVNDIGRzYmQsTFBMUERJUkVDVFNPVU5EQlVGRkVSIHBwZHNiLExQVU5LTk9XTiBscHVuawogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZCglcCktPkNyZWF0ZVNvdW5kQnVmZmVyKCVwLCVwLCVwKSxzdHViIVxuIix0aGlzLGRzYmQscHBkc2IsbHB1bmspOwotCWZwcmludGYoc3RkZXJyLCJbc2l6ZT0lbGQsIixkc2JkLT5kd1NpemUpOwotCWZwcmludGYoc3RkZXJyLCJmbGFncyA9IDB4JTA4bHgsIixkc2JkLT5kd0ZsYWdzKTsKLQlfZHVtcF9EU0JDQVBTKGRzYmQtPmR3RmxhZ3MpOwotCWZwcmludGYoc3RkZXJyLCJidWZmZXJieXRlcyA9ICVsZCwiLGRzYmQtPmR3QnVmZmVyQnl0ZXMpOwotCWZwcmludGYoc3RkZXJyLCJscHdmeEZvcm1hdCA9ICVwXVxuIixkc2JkLT5scHdmeEZvcm1hdCk7Ci0JKnBwZHNiID0gKExQRElSRUNUU09VTkRCVUZGRVIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSURpcmVjdFNvdW5kQnVmZmVyKSk7CisJaWYgKGRlYnVnZ2luZ19kc291bmQpIHsKKwkJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZCglcCktPkNyZWF0ZVNvdW5kQnVmZmVyKCVwLCVwLCVwKSxzdHViIVxuIix0aGlzLGRzYmQscHBkc2IsbHB1bmspOworCQlmcHJpbnRmKHN0ZGVyciwiW3NpemU9JWxkLCIsZHNiZC0+ZHdTaXplKTsKKwkJZnByaW50ZihzdGRlcnIsImZsYWdzID0gMHglMDhseCwiLGRzYmQtPmR3RmxhZ3MpOworCQlfZHVtcF9EU0JDQVBTKGRzYmQtPmR3RmxhZ3MpOworCQlmcHJpbnRmKHN0ZGVyciwiYnVmZmVyYnl0ZXMgPSAlbGQsIixkc2JkLT5kd0J1ZmZlckJ5dGVzKTsKKwkJZnByaW50ZihzdGRlcnIsImxwd2Z4Rm9ybWF0ID0gJXBdXG4iLGRzYmQtPmxwd2Z4Rm9ybWF0KTsKKwl9CisJKnBwZHNiID0gKExQRElSRUNUU09VTkRCVUZGRVIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdFNvdW5kQnVmZmVyKSk7CiAJKCpwcGRzYiktPnJlZiA9MTsKIAkoKnBwZHNiKS0+YnVmZmVyID0gKExQQllURSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGRzYmQtPmR3QnVmZmVyQnl0ZXMpOwogCSgqcHBkc2IpLT5idWZsZW4gPSBkc2JkLT5kd0J1ZmZlckJ5dGVzOwpAQCAtMzMxLDYgKzQ0Nyw3IEBACiAJKCpwcGRzYiktPmxwdnRibCA9ICZkc2J2dDsKIAkoKnBwZHNiKS0+ZHNvdW5kID0gdGhpczsKIAkoKnBwZHNiKS0+cGxheWluZyA9IDA7CisJbWVtY3B5KCYoKCpwcGRzYiktPmRzYmQpLGRzYmQsc2l6ZW9mKCpkc2JkKSk7CiAKIAkvKiByZWdpc3RlciBidWZmZXIgKi8KIAl0aGlzLT5idWZmZXJzID0gKExQRElSRUNUU09VTkRCVUZGRVIqKUhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzLT5idWZmZXJzLHNpemVvZihMUERJUkVDVFNPVU5EQlVGRkVSKSoodGhpcy0+bnJvZmJ1ZmZlcnMrMSkpOwpAQCAtMzQ3LDkgKzQ2NCwxMCBAQAogKSB7CiAJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZCglcCktPkR1cGxpY2F0ZVNvdW5kQnVmZmVyKCVwLCVwKSxzdHViIVxuIix0aGlzLHBkc2IscHBkc2IpOwogCi0JKnBwZHNiID0gKExQRElSRUNUU09VTkRCVUZGRVIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSURpcmVjdFNvdW5kQnVmZmVyKSk7CisJKnBwZHNiID0gKExQRElSRUNUU09VTkRCVUZGRVIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdFNvdW5kQnVmZmVyKSk7CiAJKCpwcGRzYiktPnJlZiA9MTsKIAkoKnBwZHNiKS0+YnVmZmVyID0gKExQQllURSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHBkc2ItPmJ1Zmxlbik7CisJbWVtY3B5KCgqcHBkc2IpLT5idWZmZXIscGRzYi0+YnVmZmVyLHBkc2ItPmJ1Zmxlbik7CiAJKCpwcGRzYiktPmJ1ZmxlbiA9IHBkc2ItPmJ1ZmxlbjsKIAkoKnBwZHNiKS0+cGxheXBvcyA9IDA7CiAJKCpwcGRzYiktPndyaXRlcG9zID0gMDsKQEAgLTM2NSw5ICs0ODMsMTcgQEAKIH0KIAogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kX0dldENhcHMoTFBESVJFQ1RTT1VORCB0aGlzLExQRFNDQVBTIGRzY2FwcykgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5HZXRDYXBzKCVwKSxzdHViIVxuIix0aGlzLGRzY2Fwcyk7Ci0JZnByaW50ZihzdGRlcnIsIglmbGFncyA9IDB4JTA4bHhcbiIsZHNjYXBzLT5kd0ZsYWdzKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRfR2V0Q2FwcyhMUERJUkVDVFNPVU5EIHRoaXMsTFBEU0NBUFMgY2FwcykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5HZXRDYXBzKCVwKSxzdHViIVxuIix0aGlzLGNhcHMpOworCWZwcmludGYoc3RkZXJyLCIJZmxhZ3MgPSAweCUwOGx4XG4iLGNhcHMtPmR3RmxhZ3MpOworCisJY2Fwcy0+ZHdTaXplID0gc2l6ZW9mKCpjYXBzKTsKKwljYXBzLT5kd0ZsYWdzID0gRFNDQVBTX1BSSU1BUllTVEVSRU98RFNDQVBTX1BSSU1BUlkxNkJJVHxEU0NBUFNfRU1VTERSSVZFUnxEU0NBUFNfU0VDT05EQVJZU1RFUkVPfERTQ0FQU19TRUNPTkRBUlkxNkJJVDsKKwkvKiBGSVhNRTogcXVlcnkgT1NTICovCisJY2Fwcy0+ZHdNaW5TZWNvbmRhcnlTYW1wbGVSYXRlID0gMjIwNTA7CisJY2Fwcy0+ZHdNYXhTZWNvbmRhcnlTYW1wbGVSYXRlID0gNDgwMDA7CisJY2Fwcy0+ZHdQcmltYXJ5QnVmZmVycyA9IDE7CisJLyogRklYTUU6IHNldCB0aGUgcmVzdC4uLiBobW0gKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzc4LDE1ICs1MDQsMzIgQEAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdFNvdW5kX1JlbGVhc2UoTFBESVJFQ1RTT1VORCB0aGlzKSB7CiAJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CiAJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKLQkJZnByaW50ZihzdGRlcnIsIglJRElyZWN0U291bmQoJXApIGZyZWVkIVxuIix0aGlzKTsKIAkJZHNvdW5kID0gTlVMTDsKKwkJY2xvc2UoYXVkaW9mZCk7YXVkaW9mZCA9IC0xOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIHRoaXMtPnJlZjsKIH0KIAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZF9TZXRTcGVha2VyQ29uZmlnKAorCUxQRElSRUNUU09VTkQgdGhpcyxEV09SRCBjb25maWcKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5TZXRTcGVha2VyQ29uZmlnKDB4JTA4bHgpXG4iLHRoaXMsY29uZmlnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZF9RdWVyeUludGVyZmFjZSgKKwlMUERJUkVDVFNPVU5EIHRoaXMsUkVGSUlEIHJpaWQsTFBWT0lEICpwcG9iagorKSB7CisJY2hhciB4YnVmWzUwXTsKKworCVN0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4YnVmLHBwb2JqKTsKKwlyZXR1cm4gRV9GQUlMOworfQorCiBzdGF0aWMgc3RydWN0IHRhZ0xQRElSRUNUU09VTkRfVlRBQkxFIGRzdnQgPSB7Ci0JKHZvaWQgKikxLAorCUlEaXJlY3RTb3VuZF9RdWVyeUludGVyZmFjZSwKIAlJRGlyZWN0U291bmRfQWRkUmVmLAogCUlEaXJlY3RTb3VuZF9SZWxlYXNlLAogCUlEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlciwKQEAgLTM5NSw2OCArNTM4LDIyOCBAQAogCUlEaXJlY3RTb3VuZF9TZXRDb29wZXJhdGl2ZUxldmVsLAogCSh2b2lkICopOCwKICAgICAgICAgKHZvaWQgKik5LAotICAgICAgICAodm9pZCAqKTEwLAorICAgICAgICBJRGlyZWN0U291bmRfU2V0U3BlYWtlckNvbmZpZywKICAgICAgICAgKHZvaWQgKikxMQogfTsKIAotdm9pZAotRFNPVU5EX3RocmVhZCh2b2lkKSB7Ci0JaW50CXJlcyxpLGosY3VybGVmdCxwbGF5aW5nOwotCXNob3J0CWJ1Zls1MTJdOworc3RhdGljIGludAorRFNPVU5EX3NldGZvcm1hdChMUFdBVkVGT1JNQVRFWCB3ZmV4KSB7CisJaW50CXh4LGNoYW5uZWxzLHNwZWVkLGZvcm1hdCxuZm9ybWF0OwogCisJc3dpdGNoICh3ZmV4LT53Rm9ybWF0VGFnKSB7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsInVua25vd24gV0FWRV9GT1JNQVQgdGFnICVkXG4iLHdmZXgtPndGb3JtYXRUYWcpOworCQlyZXR1cm4gRFNFUlJfQkFERk9STUFUOworCWNhc2UgV0FWRV9GT1JNQVRfUENNOgorCQlmb3JtYXQgPSBBRk1UX1MxNl9MRTsKKwkJYnJlYWs7CisJfQorCWlmICgtMT09aW9jdGwoYXVkaW9mZCxTTkRDVExfRFNQX0dFVEZNVFMsJnh4KSkgeworCQlwZXJyb3IoImlvY3RsIFNORENUTF9EU1BfR0VURk1UUyIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICgoeHgmZm9ybWF0KSE9Zm9ybWF0KSB7LyogZm9ybWF0IHVuc3VwcG9ydGVkICovCisJCWZwcmludGYoc3RkZXJyLCJTTkRDVExfRFNQX0dFVEZNVFM6IGZvcm1hdCBub3Qgc3VwcG9ydGVkXG4iKTsgCisJCXJldHVybiAtMTsKKwl9CisJbmZvcm1hdCA9IGZvcm1hdDsKKwlpZiAoLTE9PWlvY3RsKGF1ZGlvZmQsU05EQ1RMX0RTUF9TRVRGTVQsJm5mb3JtYXQpKSB7CisJCXBlcnJvcigiaW9jdGwgU05EQ1RMX0RTUF9TRVRGTVQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobmZvcm1hdCE9Zm9ybWF0KSB7LyogZGlkbid0IHdvcmsgKi8KKwkJZnByaW50ZihzdGRlcnIsIlNORENUTF9EU1BfR0VURk1UUzogZm9ybWF0IG5vdCBzZXRcbiIpOyAKKwkJcmV0dXJuIC0xOworCX0KKworCWNoYW5uZWxzID0gd2ZleC0+bkNoYW5uZWxzLTE7CisJaWYgKC0xPT1pb2N0bChhdWRpb2ZkLFNORENUTF9EU1BfU1RFUkVPLCZjaGFubmVscykpIHsKKwkJcGVycm9yKCJpb2N0bCBTTkRDVExfRFNQX1NURVJFTyIpOworCQlyZXR1cm4gLTE7CisJfQorCXNwZWVkID0gd2ZleC0+blNhbXBsZXNQZXJTZWM7CisJaWYgKC0xPT1pb2N0bChhdWRpb2ZkLFNORENUTF9EU1BfU1BFRUQsJnNwZWVkKSkgeworCQlwZXJyb3IoImlvY3RsIFNORENUTF9EU1BfU1BFRUQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIExQRFNCUE9TSVRJT05OT1RJRlkKK0RTT1VORF9uZXh0ZXZlbnQoSURpcmVjdFNvdW5kQnVmZmVyICpkc2IpIHsKKwlpbnQJaTsKKworCWlmIChkc2ItPm5yb2Zub3RpZmllcykgeworCQlmb3IgKGk9MDtpPGRzYi0+bnJvZm5vdGlmaWVzO2krKykgeworCQkJaWYgKGRzYi0+cGxheXBvczxkc2ItPm5vdGlmaWVzW2ldLmR3T2Zmc2V0KQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpPT1kc2ItPm5yb2Zub3RpZmllcykKKwkJCWk9MDsKKwkJcmV0dXJuIGRzYi0+bm90aWZpZXMraTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfRVZFTlQJCQkJCQkJXAorCWlmIChuZXh0ZXZlbnQgJiYgKGRzYi0+cGxheXBvcyA9PSBuZXh0ZXZlbnQtPmR3T2Zmc2V0KSkgewlcCisJCVNldEV2ZW50KG5leHRldmVudC0+aEV2ZW50Tm90aWZ5KTsJCQlcCisJCWZwcmludGYoc3RkZXJyLCJzaWduYWxsZWQgZXZlbnQgJWRcbiIsbmV4dGV2ZW50LT5oRXZlbnROb3RpZnkpO1wKKwkJbmV4dGV2ZW50ID0gRFNPVU5EX25leHRldmVudChkc2IpOwkJCVwKKwl9CisJCQorCitzdGF0aWMgdm9pZCAKK0RTT1VORF9NaXhJbkJ1ZmZlcihJRGlyZWN0U291bmRCdWZmZXIgKmRzYikgeworCWludAlpLGosYnVmbGVuID0gZHNiLT5idWZsZW47CisJTFBEU0JQT1NJVElPTk5PVElGWQluZXh0ZXZlbnQ7CisKKwlpZiAoZHNiLT53ZngublNhbXBsZXNQZXJTZWMgIT0gZHNvdW5kLT53ZngublNhbXBsZXNQZXJTZWMpIHsKKwkJZnByaW50ZihzdGRlcnIsIm1peGluZyBpbiBidWZmZXIgb2YgZGlmZmVyZW50IGZyZXF1ZW5jeSwgYXJnaCFcbiIpOworCX0KKwluZXh0ZXZlbnQgPSBEU09VTkRfbmV4dGV2ZW50KGRzYik7CisKKwlpZiAoZHNiLT53Zngud0JpdHNQZXJTYW1wbGUgPT0gOCkgeworCQl1bnNpZ25lZCBjaGFyCSp4YnVmID0gKHVuc2lnbmVkIGNoYXIqKShkc2ItPmJ1ZmZlcik7CisJCWlmIChkc2ItPndmeC5uQ2hhbm5lbHMgPT0gMSkgeworCQkJZm9yIChqPTA7ajxzaXplb2YocGxheWJ1Zikvc2l6ZW9mKHBsYXlidWZbMF0pLzI7aisrKSB7CisJCQkJZHNiLT5wbGF5cG9zPShkc2ItPnBsYXlwb3MrMSklYnVmbGVuOworCQkJCWlmICghZHNiLT5wbGF5cG9zICYmICEoZHNiLT5wbGF5ZmxhZ3MmRFNCUExBWV9MT09QSU5HKSkgeworCQkJCQlkc2ItPnBsYXlpbmcgPSAwOworCQkJCQlkc2ItPnBsYXlwb3MgPSBidWZsZW47CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJLyogRklYTUU6IHBhbix2b2x1bWUgKi8KKwkJCQlwbGF5YnVmWyhqPDwxKSAgXSs9eGJ1Zltkc2ItPnBsYXlwb3NdPDw4OworCQkJCXBsYXlidWZbKGo8PDEpKzFdKz14YnVmW2RzYi0+cGxheXBvc108PDg7CisJCQkJQ0hFQ0tfRVZFTlQKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaj0wO2o8c2l6ZW9mKHBsYXlidWYpL3NpemVvZihwbGF5YnVmWzBdKTtqKyspIHsKKwkJCQlkc2ItPnBsYXlwb3M9KGRzYi0+cGxheXBvcysxKSVidWZsZW47CisJCQkJaWYgKCFkc2ItPnBsYXlwb3MgJiYgIShkc2ItPnBsYXlmbGFncyZEU0JQTEFZX0xPT1BJTkcpKSB7CisJCQkJCWRzYi0+cGxheWluZyA9IDA7CisJCQkJCWRzYi0+cGxheXBvcyA9IGJ1ZmxlbjsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQkvKiBGSVhNRTogcGFuLHZvbHVtZSAqLworCQkJCXBsYXlidWZbal0rPXhidWZbZHNiLT5wbGF5cG9zXTw8ODsKKwkJCQlDSEVDS19FVkVOVAorCQkJfQorCQl9CisJfSBlbHNlIHsgLyogMTYgKi8KKwkJc2hvcnQJKnhidWYgPSAoc2hvcnQqKShkc2ItPmJ1ZmZlcik7CisJCWlmIChkc2ItPndmeC5uQ2hhbm5lbHMgPT0gMSkgeworCQkJZm9yIChqPTA7ajxzaXplb2YocGxheWJ1Zikvc2l6ZW9mKHBsYXlidWZbMF0pLzI7aisrKSB7CisJCQkJZHNiLT5wbGF5cG9zPShkc2ItPnBsYXlwb3MrMiklYnVmbGVuOworCQkJCWlmICghZHNiLT5wbGF5cG9zICYmICEoZHNiLT5wbGF5ZmxhZ3MmRFNCUExBWV9MT09QSU5HKSkgeworCQkJCQlkc2ItPnBsYXlpbmcgPSAwOworCQkJCQlkc2ItPnBsYXlwb3MgPSBidWZsZW47CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJLyogRklYTUU6IHBhbix2b2x1bWUgKi8KKwkJCQlwbGF5YnVmWyhqPDwxKSAgXSs9eGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCQkJCXBsYXlidWZbKGo8PDEpKzFdKz14YnVmW2RzYi0+cGxheXBvcz4+MV07CisJCQkJQ0hFQ0tfRVZFTlQKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaj0wO2o8c2l6ZW9mKHBsYXlidWYpL3NpemVvZihwbGF5YnVmWzBdKTtqKyspIHsKKwkJCQlkc2ItPnBsYXlwb3M9KGRzYi0+cGxheXBvcysyKSVidWZsZW47CisJCQkJaWYgKCFkc2ItPnBsYXlwb3MgJiYgIShkc2ItPnBsYXlmbGFncyZEU0JQTEFZX0xPT1BJTkcpKSB7CisJCQkJCWRzYi0+cGxheWluZyA9IDA7CisJCQkJCWRzYi0+cGxheXBvcyA9IGJ1ZmxlbjsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQkvKiBGSVhNRTogcGFuLHZvbHVtZSAqLworCQkJCXBsYXlidWZbal0rPXhidWZbZHNiLT5wbGF5cG9zPj4xXTsKKwkJCQlDSEVDS19FVkVOVAorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgRFdPUkQKK0RTT1VORF90aHJlYWQoTFBWT0lEIGFyZykgeworCWludAlmcmFnc2RpZmYscmVzLGksY3VybGVmdCxwbGF5aW5nOworCXN0cnVjdCBhdWRpb19idWZfaW5mbwlhYmk7CisKKwlmcHJpbnRmKHN0ZGVyciwiZHNvdW5kIGlzIGF0IHBpZCAlZFxuIixnZXRwaWQoKSk7CisJaW9jdGwoYXVkaW9mZCxTTkRDVExfRFNQX0dFVE9TUEFDRSwmYWJpKTsKKwlmcmFnc2RpZmYgPSBhYmkuZnJhZ3N0b3RhbC1hYmkuZnJhZ21lbnRzOwogCXdoaWxlICgxKSB7CiAJCWlmICghZHNvdW5kKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwiRFNPVU5EIHRocmVhZCBraWxsZWRcbiIpOwotCQkJa2lsbChnZXRwaWQoKSxTSUdURVJNKTsKLQkJCXJldHVybjsKKwkJCWZwcmludGYoc3RkZXJyLCJEU09VTkQgdGhyZWFkIGdpdmluZyB1cC5cbiIpOworCQkJRXhpdFRocmVhZCgwKTsKIAkJfQorCQkvKiBSQUNFOiBkc291bmQgY291bGQgYmUgZGVsZXRlZCAqLwogCQlkc291bmQtPmxwdnRibC0+Zm5BZGRSZWYoZHNvdW5kKTsKLQkJbWVtc2V0KGJ1ZiwwLHNpemVvZihidWYpKTsKLQkJLyogRklYTUU6IGFzc3VtZXMgMTYgYml0IGFuZCBzYW1lIGZvcm1hdCBvbiBhbGwgYnVmZmVycwotCQkgKiB3aGljaCBtdXN0IG5vdCBiZSB0aGUgY2FzZQotCQkgKi8KKwkJaWYgKCFkc291bmQtPm5yb2ZidWZmZXJzKSB7CisJCQkvKiBubyBzb3VuZGJ1ZmZlciB5ZXQuLi4gd2FpdC4gKi8KKwkJCVNsZWVwKDEwMDApOworCQkJY29udGludWU7CisJCX0KKwkJbWVtc2V0KHBsYXlidWYsMCxzaXplb2YocGxheWJ1ZikpOworCQkvKiBlbXB0eSBpbiBtZW1vcnkgc291bmRidWZmZXJzICovCisJCXdoaWxlICgxKSB7CisJCQlpb2N0bChhdWRpb2ZkLFNORENUTF9EU1BfR0VUT1NQQUNFLCZhYmkpOworCQkJaWYgKGFiaS5mcmFnc3RvdGFsLWFiaS5mcmFnbWVudHM8PWZyYWdzZGlmZitjdXJyZW50X2J1ZmZlcmVkX2ZyYWdzKQorCQkJCWJyZWFrOworCQkJU2xlZXAoMSk7CisJCX0KIAkJcGxheWluZyA9IDA7CisJCWRzb3VuZC0+bHB2dGJsLT5mbkFkZFJlZihkc291bmQpOyAKIAkJZm9yIChpPWRzb3VuZC0+bnJvZmJ1ZmZlcnM7aS0tOykgeworCQkJSURpcmVjdFNvdW5kQnVmZmVyCSpkc2IgPSBkc291bmQtPmJ1ZmZlcnNbaV07CiAKLQkJCWRzb3VuZC0+YnVmZmVyc1tpXS0+bHB2dGJsLT5mbkFkZFJlZihkc291bmQtPmJ1ZmZlcnNbaV0pOwotCQkJaWYgKAlkc291bmQtPmJ1ZmZlcnNbaV0tPmJ1ZmxlbiAmJgotCQkJCWRzb3VuZC0+YnVmZmVyc1tpXS0+cGxheWluZwotCQkJKSB7Ci0JCQkJaW50CXBsYXlwb3MgPSBkc291bmQtPmJ1ZmZlcnNbaV0tPnBsYXlwb3Mvc2l6ZW9mKHNob3J0KTsKLQkJCQlpbnQJYnVmbGVuID0gZHNvdW5kLT5idWZmZXJzW2ldLT5idWZsZW4vc2l6ZW9mKHNob3J0KTsKLQkJCQlzaG9ydAkqeGJ1ZiA9IChzaG9ydCopKGRzb3VuZC0+YnVmZmVyc1tpXS0+YnVmZmVyKTsKLQotCQkJCXBsYXlpbmcrKzsKLQkJCQlkc291bmQtPmJ1ZmZlcnNbaV0tPnBsYXlwb3MgPSAoc2l6ZW9mKGJ1ZikrKHBsYXlwb3M8PDEpKSUoYnVmbGVuPDwxKTsKLQkJCQlmb3IgKGo9MDtqPHNpemVvZihidWYpL3NpemVvZihzaG9ydCk7aisrKQotCQkJCQlidWZbal0rPXhidWZbKGorcGxheXBvcyklYnVmbGVuXTsKKwkJCWRzYi0+bHB2dGJsLT5mbkFkZFJlZihkc2IpOworCQkJaWYgKGRzYi0+ZHNiZC5kd0ZsYWdzICYgRFNCQ0FQU19QUklNQVJZQlVGRkVSKSB7CisJCQkJaWYgKG1lbWNtcCgmZHNvdW5kLT53ZngsJihkc2ItPndmeCksc2l6ZW9mKGRzb3VuZC0+d2Z4KSkpIHsKKwkJCQkJRFNPVU5EX3NldGZvcm1hdCgmKGRzYi0+d2Z4KSk7CisJCQkJCW1lbWNweSgmZHNvdW5kLT53ZngsJihkc2ItPndmeCksc2l6ZW9mKGRzYi0+d2Z4KSk7CisJCQkJfQogCQkJfQotCQkJZHNvdW5kLT5idWZmZXJzW2ldLT5scHZ0YmwtPmZuUmVsZWFzZShkc291bmQtPmJ1ZmZlcnNbaV0pOworCQkJZHNiLT5scHZ0YmwtPmZuUmVsZWFzZShkc2IpOworCQl9CisJCWZvciAoaT1kc291bmQtPm5yb2ZidWZmZXJzO2ktLTspIHsKKwkJCUlEaXJlY3RTb3VuZEJ1ZmZlcgkqZHNiID0gZHNvdW5kLT5idWZmZXJzW2ldOworCisJCQlkc2ItPmxwdnRibC0+Zm5BZGRSZWYoZHNiKTsKKwkJCWlmIChkc2ItPmJ1ZmxlbiAmJiBkc2ItPnBsYXlpbmcpIHsKKwkJCQlwbGF5aW5nKys7CisJCQkJRFNPVU5EX01peEluQnVmZmVyKGRzYik7CisJCQl9CisJCQlkc2ItPmxwdnRibC0+Zm5SZWxlYXNlKGRzYik7CiAJCX0KIAkJZHNvdW5kLT5scHZ0YmwtPmZuUmVsZWFzZShkc291bmQpOworCiAJCS8qZnB1dGMoJzAnK3BsYXlpbmcsc3RkZXJyKTsqLwogCQljdXJsZWZ0ID0gMDsKLQkJd2hpbGUgKGN1cmxlZnQgPCBzaXplb2YoYnVmKSkgewotCQkJcmVzID0gd3JpdGUoYXVkaW9mZCwoTFBCWVRFKWJ1ZitjdXJsZWZ0LHNpemVvZihidWYpLWN1cmxlZnQpOworCQlpb2N0bChhdWRpb2ZkLFNORENUTF9EU1BfR0VUT1NQQUNFLCZhYmkpOworCQlpZiAoKGFiaS5mcmFnc3RvdGFsLWFiaS5mcmFnbWVudHMpPD0xK2ZyYWdzZGlmZikgeworCQkJY3VycmVudF9idWZmZXJlZF9mcmFncysrOworCQl9IGVsc2UgaWYgKChhYmkuZnJhZ3N0b3RhbC1hYmkuZnJhZ21lbnRzKT4yK2ZyYWdzZGlmZikgeworCQkJY3VycmVudF9idWZmZXJlZF9mcmFncy0tOworCQl9CisJCXdoaWxlIChjdXJsZWZ0IDwgc2l6ZW9mKHBsYXlidWYpKSB7CisJCQlyZXMgPSB3cml0ZShhdWRpb2ZkLChMUEJZVEUpcGxheWJ1ZitjdXJsZWZ0LHNpemVvZihwbGF5YnVmKS1jdXJsZWZ0KTsKIAkJCWlmIChyZXM9PS0xKSB7CiAJCQkJcGVycm9yKCJ3cml0ZSBhdWRpb2ZkIik7Ci0JCQkJZnByaW50ZihzdGRlcnIsImJ1ZiBpcyAlcCwgY3VybGVmdCBpcyAlZFxuIixidWYsY3VybGVmdCk7Ci0JCQkJa2lsbChnZXRwaWQoKSxTSUdURVJNKTsKKwkJCQlFeGl0VGhyZWFkKDApOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY3VybGVmdCs9cmVzOwogCQl9CiAJfQorCUV4aXRUaHJlYWQoMCk7CiB9CiAKICNlbmRpZiAvKiBIQVZFX09TUyAqLwogCiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RTb3VuZENyZWF0ZShMUEdVSUQgbHBHVUlELExQRElSRUNUU09VTkQgKnBwRFMsSVVua25vd24gKnBVbmtPdXRlciApIHsKKwlpZiAobHBHVUlEKQorCQlmcHJpbnRmKHN0ZGVyciwiRGlyZWN0U291bmRDcmVhdGUoJXAsJXAsJXApXG4iLGxwR1VJRCxwcERTLHBVbmtPdXRlcik7CiAjaWZkZWYgSEFWRV9PU1MKLQlpbnQJeHg7Ci0KLQlmcHJpbnRmKHN0ZGVyciwiRGlyZWN0U291bmRDcmVhdGUoJXAsJXAsJXApXG4iLGxwR1VJRCxwcERTLHBVbmtPdXRlcik7Ci0JaWYgKGF1ZGlvZmQpCisJaWYgKGF1ZGlvZmQ+PTApCiAJCXJldHVybiBEU0VSUl9BTExPQ0FURUQ7CiAJYXVkaW9mZCA9IG9wZW4oIi9kZXYvYXVkaW8iLE9fV1JPTkxZKTsKIAlpZiAoYXVkaW9mZD09LTEpIHsKQEAgLTQ2NCwzMyArNzY3LDM3IEBACiAJCWF1ZGlvZmQ9MDsKIAkJcmV0dXJuIERTRVJSX05PRFJJVkVSOwogCX0KLQkvKiBtYWtlIGl0IG5vbmJsb2NraW5nICovCi0JaWYgKC0xPT1pb2N0bChhdWRpb2ZkLFNORENUTF9EU1BfTk9OQkxPQ0ssTlVMTCkpIHsKLQkJcGVycm9yKCJpb2N0bCBTTkRDVExfRFNQX05PTkJMT0NLIik7Ci0JCWNsb3NlKGF1ZGlvZmQpOwotCQlhdWRpb2ZkPTA7Ci0JCXJldHVybiBEU0VSUl9OT0RSSVZFUjsKLQl9Ci0JaWYgKC0xPT1pb2N0bChhdWRpb2ZkLFNORENUTF9EU1BfR0VUQ0FQUywmeHgpKSB7Ci0JCXBlcnJvcigiaW9jdGwgU05EQ1RMX0RTUF9HRVRDQVBTIik7Ci0JCWNsb3NlKGF1ZGlvZmQpOwotCQlhdWRpb2ZkPTA7Ci0JCXJldHVybiBEU0VSUl9OT0RSSVZFUjsKLQl9Ci0JZnByaW50ZihzdGRlcnIsIlNORENUTF9EU1BfR0VUQ0FQUyByZXR1cm5lZCAleFxuIix4eCk7CisJLyoKKwl4eD0weDAwMDQwMDBjOworCWlmICgtMT09aW9jdGwoYXVkaW9mZCxTTkRDVExfRFNQX1NFVEZSQUdNRU5ULCZ4eCkpCisJCXBlcnJvcigiaW9jdGwgU0VURlJBR01FTlQiKTsKKwkqLworCiAJKnBwRFMgPSAoTFBESVJFQ1RTT1VORClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJRGlyZWN0U291bmQpKTsKIAkoKnBwRFMpLT5yZWYJCT0gMTsKIAkoKnBwRFMpLT5scHZ0YmwJCT0gJmRzdnQ7CiAJKCpwcERTKS0+YnVmZmVycwk9IE5VTEw7CiAJKCpwcERTKS0+bnJvZmJ1ZmZlcnMJPSAwOwogCisJKCpwcERTKS0+d2Z4LndGb3JtYXRUYWcJCT0gMTsKKwkoKnBwRFMpLT53ZngubkNoYW5uZWxzCQk9IDI7CisJKCpwcERTKS0+d2Z4Lm5TYW1wbGVzUGVyU2VjCT0gMjIwNTA7CisJKCpwcERTKS0+d2Z4Lm5BdmdCeXRlc1BlclNlYwk9IDQ0MTAwOworCSgqcHBEUyktPndmeC5uQmxvY2tBbGlnbgk9IDI7CisJKCpwcERTKS0+d2Z4LndCaXRzUGVyU2FtcGxlCT0gODsKKworCURTT1VORF9zZXRmb3JtYXQoJigoKnBwRFMpLT53ZngpKTsKKwogCWlmICghZHNvdW5kKSB7CisJCUhBTkRMRTMyCWhuZDsKKwkJRFdPUkQJCXhpZDsKKwogCQlkc291bmQgPSAoKnBwRFMpOwotLyoJCVRIUkVBRF9DcmVhdGVTeXNUaHJlYWQoMCxEU09VTkRfdGhyZWFkKTsgRklYTUUgKi8KKwkJaG5kID0gQ3JlYXRlVGhyZWFkKE5VTEwsTlVMTCxEU09VTkRfdGhyZWFkLDAsMCwmeGlkKTsKIAl9CiAJcmV0dXJuIDA7CiAjZWxzZQogCU1lc3NhZ2VCb3gzMkEoMCwiRGlyZWN0U291bmQgbmVlZHMgdGhlIE9wZW4gU291bmQgU3lzdGVtIERyaXZlciwgd2hpY2ggaGFzIG5vdCBiZWVuIGZvdW5kIGJ5IC4vY29uZmlndXJlLiIsIldJTkUgRGlyZWN0U291bmQiLE1CX09LfE1CX0lDT05TVE9QKTsKLQlyZXR1cm4gRFNFUlJfTk9EUklWRVI7IC8qIGNoZWNrICovCisJcmV0dXJuIERTRVJSX05PRFJJVkVSOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2pveXN0aWNrLmMgYi9tdWx0aW1lZGlhL2pveXN0aWNrLmMKaW5kZXggZTU5ZWY2NS4uYTE1ODBiMyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9qb3lzdGljay5jCisrKyBiL211bHRpbWVkaWEvam95c3RpY2suYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgInVzZXIuaCIKQEAgLTI3LDE0ICsyOCwxNiBAQAogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotc3RhdGljIGludCBjb3VudF91c2VbNF0gPSB7MCwgMCwgMCwgMH07CisjZGVmaW5lIE1BWEpPWURSSVZFUlMJNAorCitzdGF0aWMgaW50IGNvdW50X3VzZVtNQVhKT1lEUklWRVJTXSA9IHswLCAwLCAwLCAwfTsKIHN0YXRpYyBpbnQgZGV2X3N0YXQ7CiBzdGF0aWMgaW50IGpveV9ucl9vcGVuID0gMDsKIHN0YXRpYyBCT09MMTYgam95Q2FwdHVyZWQgPSBGQUxTRTsKLXN0YXRpYyBIV05EMTYgQ2FwdHVyZVduZFsyXSA9IHswLCAwfTsKLXN0YXRpYyBpbnQgam95X2RldlsyXSA9IHstMSwgLTF9Owotc3RhdGljIEpPWUlORk8xNiBqb3lDYXBEYXRhWzJdOwotc3RhdGljIHVuc2lnbmVkIGludCBqb3lfdGhyZXNob2xkWzJdID0gezAsIDB9Oworc3RhdGljIEhXTkQxNiBDYXB0dXJlV25kW01BWEpPWURSSVZFUlNdID0gezAsIDB9Oworc3RhdGljIGludCBqb3lfZGV2W01BWEpPWURSSVZFUlNdID0gey0xLCAtMSwtMSwtMX07CitzdGF0aWMgSk9ZSU5GTzE2IGpveUNhcERhdGFbTUFYSk9ZRFJJVkVSU107CitzdGF0aWMgdW5zaWduZWQgaW50IGpveV90aHJlc2hvbGRbTUFYSk9ZRFJJVkVSU10gPSB7MCwgMCwgMCwgMH07CiAKIHN0cnVjdCBqc19zdGF0dXMKIHsKQEAgLTQ5LDE1ICs1MiwxNiBAQAogICovCiBCT09MMTYgam95T3BlbkRyaXZlcihXT1JEIHdJRCkKIHsKLQljaGFyIGRldl9uYW1lW10gPSAiL2Rldi9qc3giOworCWNoYXIgZGV2X25hbWVbXSA9ICIvZGV2L2pzJWQiOworCWNoYXIJYnVmWzIwXTsKIAogCWlmIChqb3lfZGV2W3dJRF0gPj0gMCkgcmV0dXJuIFRSVUU7Ci0gICAgICAgIGRldl9uYW1lW3N0cmxlbihkZXZfbmFtZSktMV09KGNoYXIpIHdJRCsweDMwOwotICAgICAgICBpZiAoKGpveV9kZXZbd0lEXSA9IG9wZW4oZGV2X25hbWUsIE9fUkRPTkxZKSkgPj0gMCkgeworICAgICAgICBzcHJpbnRmKGJ1ZixkZXZfbmFtZSx3SUQpOworICAgICAgICBpZiAoKGpveV9kZXZbd0lEXSA9IG9wZW4oYnVmLCBPX1JET05MWSkpID49IDApIHsKIAkJam95X25yX29wZW4rKzsKIAkJcmV0dXJuIFRSVUU7Ci0JfQotCWVsc2UgcmV0dXJuIEZBTFNFOworCX0gZWxzZQorCQlyZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODEsMTggKzg1LDE4IEBACiAgICAgICAgIHN0cnVjdCBqc19zdGF0dXMganM7CiAKIAlpZiAoam95X25yX29wZW4pCi0JZm9yIChqb3k9MDsgam95IDwgNDsgam95KyspIAotCWlmIChqb3lfZGV2W2pveV0gPj0gMCkgewotCQlpZiAoY291bnRfdXNlW2pveV0gPiAyNTApIHsKLQkJCWpveUNsb3NlRHJpdmVyKGpveSk7Ci0JCQljb3VudF91c2Vbam95XSA9IDA7Ci0JCX0KLQkJY291bnRfdXNlW2pveV0rKzsKLQl9Ci0JZWxzZSByZXR1cm47CisJZm9yIChqb3k9MDsgam95IDwgTUFYSk9ZRFJJVkVSUzsgam95KyspIAorCQlpZiAoam95X2Rldltqb3ldID49IDApIHsKKwkJCWlmIChjb3VudF91c2Vbam95XSA+IDI1MCkgeworCQkJCWpveUNsb3NlRHJpdmVyKGpveSk7CisJCQkJY291bnRfdXNlW2pveV0gPSAwOworCQkJfQorCQkJY291bnRfdXNlW2pveV0rKzsKKwkJfSBlbHNlCisJCQlyZXR1cm47CiAgICAgICAgIGlmIChqb3lDYXB0dXJlZCA9PSBGQUxTRSkgcmV0dXJuOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAiSm95U2VuZE1lc3NhZ2VzKClcbiIpOwotICAgICAgICBmb3IgKGpveT0wOyBqb3kgPCA0OyBqb3krKykgeworICAgICAgICBmb3IgKGpveT0wOyBqb3kgPCBNQVhKT1lEUklWRVJTOyBqb3krKykgewogCQlpZiAoam95T3BlbkRyaXZlcihqb3kpID09IEZBTFNFKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICBkZXZfc3RhdCA9IHJlYWQoam95X2Rldltqb3ldLCAmanMsIHNpemVvZihqcykpOwogICAgICAgICAgICAgICAgIGlmIChkZXZfc3RhdCA9PSBzaXplb2YoanMpKSB7CkBAIC0xMzUsNyArMTM5LDcgQEAKICAgICBVSU5UMTYgam95X2NudCA9IDA7CiAKICAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIkpveUdldE51bURldnM6ICIpOwotICAgIGZvciAoam95PTA7IGpveTw0OyBqb3krKykKKyAgICBmb3IgKGpveT0wOyBqb3k8TUFYSk9ZRFJJVkVSUzsgam95KyspCiAJaWYgKGpveU9wZW5Ecml2ZXIoam95KSA9PSBUUlVFKSB7CQkKIAkJam95Q2xvc2VEcml2ZXIoam95KTsKIAkJam95X2NudCsrOwpAQCAtMzI1LDcgKzMyOSw3IEBACiBNTVJFU1VMVDE2IFdJTkFQSSBqb3lHZXRUaHJlc2hvbGQxNihVSU5UMTYgd0lELCBMUFVJTlQxNiBscFRocmVzaG9sZCkKIHsKICAgICBkcHJpbnRmX21tc3lzKHN0ZGVyciwgIkpveUdldFRocmVzaG9sZCglMDRYLCAlcCk7XG4iLCB3SUQsIGxwVGhyZXNob2xkKTsKLSAgICBpZiAod0lEID4gMykgcmV0dXJuIEpPWUVSUl9QQVJNUzsKKyAgICBpZiAod0lEID49IE1BWEpPWURSSVZFUlMpIHJldHVybiBKT1lFUlJfUEFSTVM7CiAgICAgKmxwVGhyZXNob2xkID0gam95X3RocmVzaG9sZFt3SURdOwogICAgIHJldHVybiBKT1lFUlJfTk9FUlJPUjsKIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwppbmRleCA0ZjFlNDdjLi4xZWUwMDIzIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMKKysrIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCkBAIC0xNTQ0LDEwICsxNTQ0LDIxIEBACiBEV09SRCBXSU5BUEkgbWNpU2VuZENvbW1hbmQzMkEoVUlOVDMyIHdEZXZJRCwgVUlOVDMyIHdNc2csIERXT1JEIGR3UGFyYW0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3UGFyYW0yKQogewotCWZwcmludGYoc3RkZXJyLCJtY2lTZW5kQ29tbWFuZDMyQSglMDh4LCUwOHgsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLAotCQl3RGV2SUQsd01zZyxkd1BhcmFtMSxkd1BhcmFtMgorICAgIGZwcmludGYoc3RkZXJyLCJtY2lTZW5kQ29tbWFuZDMyQSglMDh4LCVzLCUwOGx4LCUwOGx4KSxzdHViIVxuIiwKKwkgICAgd0RldklELF9tY2lDb21tYW5kVG9TdHJpbmcod01zZyksZHdQYXJhbTEsZHdQYXJhbTIKKyAgICApOworICAgIHN3aXRjaCAod01zZykgeworICAgIGNhc2UgTUNJX09QRU46IHsKKyAgICAJTFBNQ0lfT1BFTl9QQVJNUzMyQQlscG1vcCA9IChMUE1DSV9PUEVOX1BBUk1TMzJBKWR3UGFyYW0yOworICAgIAlmcHJpbnRmKHN0ZGVyciwiCU1DSV9PUEVOKCVzLCVzLCVzKVxuIiwKKwkJKGR3UGFyYW0xJk1DSV9PUEVOX1RZUEUpICAgP2xwbW9wLT5scHN0ckRldmljZVR5cGU6IjxudWxsPiIsCisJCShkd1BhcmFtMSZNQ0lfT1BFTl9FTEVNRU5UKT9scG1vcC0+bHBzdHJFbGVtZW50TmFtZToiPG51bGw+IiwKKwkJKGR3UGFyYW0xJk1DSV9PUEVOX0FMSUFTKSAgP2xwbW9wLT5scHN0ckFsaWFzOiI8bnVsbD4iCiAJKTsKLQlyZXR1cm4gMDsgLyogb2sgKi8KKwlicmVhazsKKyAgICB9CisgICAgfQorICAgIHJldHVybiAweDE7IC8qICFvayAqLwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWNpU2VuZENvbW1hbmQJCQlbTU1TWVNURU0uNzAxXQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS90aW1lLmMgYi9tdWx0aW1lZGlhL3RpbWUuYwppbmRleCA3YTRlYjZkLi41YTZkMjY3IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL3RpbWUuYworKysgYi9tdWx0aW1lZGlhL3RpbWUuYwpAQCAtMzQsNiArMzQsNyBAQAogICAgIFVJTlQzMgl3Q3VyVGltZTsKICAgICBVSU5UMzIJaXN3aW4zMjsKICAgICBzdHJ1Y3QgdGFnVElNRVJFTlRSWSAqTmV4dDsKKyAgICBEV09SRAl0cmlnZ2VydGltZTsKIH0gVElNRVJFTlRSWSwgKkxQVElNRVJFTlRSWTsKIAogc3RhdGljIExQVElNRVJFTlRSWSBscFRpbWVyTGlzdCA9IE5VTEw7CkBAIC00MiwxMSArNDMsNTMgQEAKICAqIEZJWE1FCiAgKiBpcyB0aGlzIHRoZSBtaW5pbXVtIHJlc29sdXRpb24gPyAKICAqLwotI2RlZmluZSBNTVNZU1RJTUVfTUlOSU5URVJWQUwgKDMzKQorLyojZGVmaW5lIE1NU1lTVElNRV9NSU5JTlRFUlZBTCAoMzMpKi8KKyNkZWZpbmUgTU1TWVNUSU1FX01JTklOVEVSVkFMICgzMSkKICNkZWZpbmUgTU1TWVNUSU1FX01BWElOVEVSVkFMICg2NTUzNSkKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBjaGVja19NTXRpbWVycworICovCitzdGF0aWMgVk9JRCBjaGVja19NTXRpbWVycygpCit7CisgICAgTFBUSU1FUkVOVFJZIGxwVGltZXIgPSBscFRpbWVyTGlzdDsKKyAgICBEV09SRAljdXJ0aWNrID0gR2V0VGlja0NvdW50KCk7CisKKyAgICB3aGlsZSAobHBUaW1lciAhPSBOVUxMKSB7CisgICAgCWlmIChscFRpbWVyLT50cmlnZ2VydGltZSA8PSBjdXJ0aWNrKSB7CisJICAgIGxwVGltZXItPndDdXJUaW1lID0gbHBUaW1lci0+d0RlbGF5OworCisJICAgIGlmIChscFRpbWVyLT5scEZ1bmMgIT0gKEZBUlBST0MxNikgTlVMTCkgeworCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBiZWZvcmUgQ2FsbEJhY2sxNiAhXG4iKTsKKwkJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gbHBGdW5jPSVwIHdUaW1lcklEPSUwNFggZHdVc2VyPSUwOGxYICFcbiIsCisJCQlscFRpbWVyLT5scEZ1bmMsIGxwVGltZXItPndUaW1lcklELCBscFRpbWVyLT5kd1VzZXIpOworCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBoSW5zdGFuY2U9JTA0WCAhXG4iLCBscFRpbWVyLT5oSW5zdGFuY2UpOworCisKKy8qICAgICAgICAtIFRpbWVQcm9jIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGhlcmUgaXMgc29tZXRoaW5nIHN0cmFuZ2UsIHVuZGVyIFdpbmRvd3MgMy4xeCBpdCBpcyBjYWxsZWQgCisgKiAgICAgICAgICBkdXJpbmcgaW50ZXJydXB0IHRpbWUsICBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgdmVyeSBsaW1pdGVkIG51bWJlciBvZiBBUEkgY2FsbHMgKGxpa2UKKyAqCSAgICBQb3N0TWVzc2FnZSksIGFuZCBtdXN0IHJlc2lkZSBpbiBETEwgKHRoZXJlZm9yZSB1c2VzIHN0YWNrIG9mIGFjdGl2ZSBhcHBsaWNhdGlvbikuIFNvIEkgCisgKiAgICAgICAgICBndWVzcyBjdXJyZW50IGltcGxlbWVudGF0aW9uIHZpYSBTZXRUaW1lciBoYXMgdG8gYmUgaW1wcm92ZWQgdXBvbi4JCQorICovCisgCQlpZiAobHBUaW1lci0+aXN3aW4zMikKKwkJCWxwVGltZXItPmxwRnVuYyhscFRpbWVyLT53VGltZXJJRCwwLGxwVGltZXItPmR3VXNlciwwLDApOworCQllbHNlCisJCQlDYWxsYmFja3MtPkNhbGxUaW1lRnVuY1Byb2MobHBUaW1lci0+bHBGdW5jLAorCQkJCQkJICAgIGxwVGltZXItPndUaW1lcklELDAsCisJCQkJCQkgICAgbHBUaW1lci0+ZHdVc2VyLDAsMAorCQkJKTsKKworCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBhZnRlciBDYWxsQmFjazE2ICFcbiIpOworCSAgICB9CisJICAgIGlmIChscFRpbWVyLT53RmxhZ3MgJiBUSU1FX09ORVNIT1QpCisJCXRpbWVLaWxsRXZlbnQzMihscFRpbWVyLT53VGltZXJJRCk7CisJfQorCWxwVGltZXIgPSBscFRpbWVyLT5OZXh0OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVElNRV9NTVN5c1RpbWVDYWxsYmFjawogICovCiBzdGF0aWMgVk9JRCBUSU1FX01NU3lzVGltZUNhbGxiYWNrKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywKQEAgLTE3MCw2ICsyMTMsNyBAQAogICAgIGxwVGltZXJMaXN0ID0gbHBOZXdUaW1lcjsKICAgICBscE5ld1RpbWVyLT53VGltZXJJRCA9IHdOZXdJRCArIDE7CiAgICAgbHBOZXdUaW1lci0+d0N1clRpbWUgPSB3RGVsYXk7CisgICAgbHBOZXdUaW1lci0+dHJpZ2dlcnRpbWUgPSB3RGVsYXkrR2V0VGlja0NvdW50KCk7CiAgICAgbHBOZXdUaW1lci0+d0RlbGF5ID0gd0RlbGF5OwogICAgIGxwTmV3VGltZXItPndSZXNvbCA9IHdSZXNvbDsKICAgICBscE5ld1RpbWVyLT5scEZ1bmMgPSAoRkFSUFJPQzE2KSBscEZ1bmM7CkBAIC0yMTAsNiArMjU0LDcgQEAKICAgICBscE5ld1RpbWVyLT53VGltZXJJRCA9IHdOZXdJRCArIDE7CiAgICAgbHBOZXdUaW1lci0+d0N1clRpbWUgPSB3RGVsYXk7CiAgICAgbHBOZXdUaW1lci0+d0RlbGF5ID0gd0RlbGF5OworICAgIGxwTmV3VGltZXItPnRyaWdnZXJ0aW1lID0gd0RlbGF5K0dldFRpY2tDb3VudCgpOwogICAgIGxwTmV3VGltZXItPndSZXNvbCA9IHdSZXNvbDsKICAgICBscE5ld1RpbWVyLT5scEZ1bmMgPSAoRkFSUFJPQzE2KSBscEZ1bmM7CiAgICAgbHBOZXdUaW1lci0+aXN3aW4zMiA9IDA7CkBAIC0zMzQsNyArMzc5LDExIEBACiAJU3RhcnRNTVRpbWUoKTsKICAgICBuZXd0aWNrID0gR2V0VGlja0NvdW50KCk7CiAgICAgbW1TeXNUaW1lTVMudS5tcys9bmV3dGljay1sYXN0dGljazsgLyogRklYTUU6IGZha2VkIHRpbWVyICovCisgICAgaWYgKG5ld3RpY2shPWxhc3R0aWNrKQorICAgIAljaGVja19NTXRpbWVycygpOwogICAgIGxhc3R0aWNrID0gbmV3dGljazsKICAgICBkcHJpbnRmX21tdGltZShzdGRkZWIsICJ0aW1lR2V0VGltZSgpIC8vIFRpbWUgPSAlbGRcbiIsbW1TeXNUaW1lTVMudS5tcyk7CisKKwogICAgIHJldHVybiBtbVN5c1RpbWVNUy51Lm1zOwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9iaXRtYXAuYyBiL29iamVjdHMvYml0bWFwLmMKaW5kZXggMzI5MGFlNy4uZmM1OTI1MCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9iaXRtYXAuYworKysgYi9vYmplY3RzL2JpdG1hcC5jCkBAIC03LDggKzcsOCBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNpbmNsdWRlICJ0c194bGliLmgiCisjaW5jbHVkZSAidHNfeHV0aWwuaCIKICNpbmNsdWRlICJnZGkuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgImRjLmgiCkBAIC00Miw3ICs0Miw3IEBACiAKIHN0YXRpYyBpbnQgWFB1dEltYWdlX3dyYXBwZXIoIGNvbnN0IHN0cnVjdCBYUHV0SW1hZ2VfZGVzY3IgKmRlc2NyICkKIHsKLSAgICByZXR1cm4gWFB1dEltYWdlKCBkaXNwbGF5LCBkZXNjci0+Ym1wLT5waXhtYXAsIEJJVE1BUF9HQyhkZXNjci0+Ym1wKSwKKyAgICByZXR1cm4gVFNYUHV0SW1hZ2UoIGRpc3BsYXksIGRlc2NyLT5ibXAtPnBpeG1hcCwgQklUTUFQX0dDKGRlc2NyLT5ibXApLAogICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5pbWFnZSwgMCwgMCwgMCwgMCwgZGVzY3ItPndpZHRoLCBkZXNjci0+aGVpZ2h0ICk7CiB9CiAKQEAgLTE2OCw3ICsxNjgsNyBAQAogICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtQml0cyA9IE5VTEw7CiAKICAgICAgIC8qIENyZWF0ZSB0aGUgcGl4bWFwICovCi0gICAgYm1wT2JqUHRyLT5waXhtYXAgPSBYQ3JlYXRlUGl4bWFwKGRpc3BsYXksIHJvb3RXaW5kb3csIHdpZHRoLCBoZWlnaHQsIGJwcCk7CisgICAgYm1wT2JqUHRyLT5waXhtYXAgPSBUU1hDcmVhdGVQaXhtYXAoZGlzcGxheSwgcm9vdFdpbmRvdywgd2lkdGgsIGhlaWdodCwgYnBwKTsKICAgICBpZiAoIWJtcE9ialB0ci0+cGl4bWFwKQogICAgIHsKIAlHRElfSEVBUF9GUkVFKCBoYml0bWFwICk7CkBAIC0yMzUsNyArMjM1LDcgQEAKICAqLwogWEltYWdlICpCSVRNQVBfR2V0WEltYWdlKCBjb25zdCBCSVRNQVBPQkogKmJtcCApCiB7Ci0gICAgcmV0dXJuIFhHZXRJbWFnZSggZGlzcGxheSwgYm1wLT5waXhtYXAsIDAsIDAsIGJtcC0+Yml0bWFwLmJtV2lkdGgsCisgICAgcmV0dXJuIFRTWEdldEltYWdlKCBkaXNwbGF5LCBibXAtPnBpeG1hcCwgMCwgMCwgYm1wLT5iaXRtYXAuYm1XaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICBibXAtPmJpdG1hcC5ibUhlaWdodCwgQWxsUGxhbmVzLCBaUGl4bWFwICk7CiB9CiAKQEAgLTMwNCw3ICszMDQsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICgodyU4KSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAqdGJ1ZiA9IDA7Ci0gICAgICAgICAgICAgICAgKnRidWYgfD0gWEdldFBpeGVsKGltYWdlLHcsaCk8PCg3LSh3JjcpKTsKKyAgICAgICAgICAgICAgICAqdGJ1ZiB8PSBUU1hHZXRQaXhlbChpbWFnZSx3LGgpPDwoNy0odyY3KSk7CiAgICAgICAgICAgICAgICAgaWYgKCh3JjcpID09IDcpICsrdGJ1ZjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRidWYgKz0gcGFkOwpAQCAtMzE1LDggKzMxNSw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAodz0wO3c8Ym1wLT5iaXRtYXAuYm1XaWR0aDt3KyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCEodyAmIDEpKSAqdGJ1ZiA9IFhHZXRQaXhlbCggaW1hZ2UsIHcsIGgpIDw8IDQ7Ci0JICAgIAllbHNlICp0YnVmKysgfD0gWEdldFBpeGVsKCBpbWFnZSwgdywgaCkgJiAweDBmOworICAgICAgICAgICAgICAgIGlmICghKHcgJiAxKSkgKnRidWYgPSBUU1hHZXRQaXhlbCggaW1hZ2UsIHcsIGgpIDw8IDQ7CisJICAgIAllbHNlICp0YnVmKysgfD0gVFNYR2V0UGl4ZWwoIGltYWdlLCB3LCBoKSAmIDB4MGY7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0YnVmICs9IHBhZDsKICAgICAgICAgfQpAQCAtMzI1LDcgKzMyNSw3IEBACiAgICAgICAgIGZvciAoaD0wO2g8aGVpZ2h0O2grKykKICAgICAgICAgewogICAgICAgICAgICAgZm9yICh3PTA7dzxibXAtPmJpdG1hcC5ibVdpZHRoO3crKykKLSAgICAgICAgICAgICAgICAqdGJ1ZisrID0gWEdldFBpeGVsKGltYWdlLHcsaCk7CisgICAgICAgICAgICAgICAgKnRidWYrKyA9IFRTWEdldFBpeGVsKGltYWdlLHcsaCk7CiAgICAgICAgICAgICB0YnVmICs9IHBhZDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTMzNSw3ICszMzUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKHc9MDt3PGJtcC0+Yml0bWFwLmJtV2lkdGg7dysrKQogICAgICAgICAgICAgewotCSAgICAJbG9uZyBwaXhlbCA9IFhHZXRQaXhlbChpbWFnZSx3LGgpOworCSAgICAJbG9uZyBwaXhlbCA9IFRTWEdldFBpeGVsKGltYWdlLHcsaCk7CiAKIAkJKnRidWYrKyA9IHBpeGVsICYgMHhmZjsKIAkJKnRidWYrKyA9IChwaXhlbD4+OCkgJiAweGZmOwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAodz0wO3c8Ym1wLT5iaXRtYXAuYm1XaWR0aDt3KyspCiAgICAgICAgICAgICB7Ci0JICAgIAlsb25nIHBpeGVsID0gWEdldFBpeGVsKGltYWdlLHcsaCk7CisJICAgIAlsb25nIHBpeGVsID0gVFNYR2V0UGl4ZWwoaW1hZ2UsdyxoKTsKIAogCQkqdGJ1ZisrID0gcGl4ZWwgJiAweGZmOwogCQkqdGJ1ZisrID0gKHBpeGVsPj4gOCkgJiAweGZmOwpAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgICAgICAgICB0YnVmICs9IHBhZDsKIAl9CiAgICAgfQotICAgIFhEZXN0cm95SW1hZ2UoIGltYWdlICk7CisgICAgVFNYRGVzdHJveUltYWdlKCBpbWFnZSApOwogICAgIEdESV9IRUFQX1VOTE9DSyggaGJpdG1hcCApOwogICAgIHJldHVybiBoZWlnaHQgKiBibXAtPmJpdG1hcC5ibVdpZHRoQnl0ZXM7CiB9CkBAIC00MTEsNyArNDExLDcgQEAKIAogICAgIHdpZHRoYnl0ZXMJPSBESUJfR2V0WEltYWdlV2lkdGhCeXRlcyhibXAtPmJpdG1hcC5ibVdpZHRoLGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsKTsKICAgICB0bXBidWZmZXIJPSAoTFBCWVRFKXhtYWxsb2Mod2lkdGhieXRlcypoZWlnaHQpOwotICAgIGltYWdlID0gWENyZWF0ZUltYWdlKCBkaXNwbGF5LCBEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oc2NyZWVuKSwKKyAgICBpbWFnZSA9IFRTWENyZWF0ZUltYWdlKCBkaXNwbGF5LCBEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oc2NyZWVuKSwKIAkJICBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCwgWlBpeG1hcCwgMCwgdG1wYnVmZmVyLAogCQkgIGJtcC0+Yml0bWFwLmJtV2lkdGgsaGVpZ2h0LDMyLHdpZHRoYnl0ZXMKICAgICApOwpAQCAtNDI1LDcgKzQyNSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAodz0wO3c8Ym1wLT5iaXRtYXAuYm1XaWR0aDt3KyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFB1dFBpeGVsKGltYWdlLHcsaCwoc2J1ZlswXT4+KDctKHcmNykpKSAmIDEpOworICAgICAgICAgICAgICAgIFRTWFB1dFBpeGVsKGltYWdlLHcsaCwoc2J1ZlswXT4+KDctKHcmNykpKSAmIDEpOwogICAgICAgICAgICAgICAgIGlmICgodyY3KSA9PSA3KQogICAgICAgICAgICAgICAgICAgICBzYnVmKys7CiAgICAgICAgICAgICB9CkBAIC00MzcsOCArNDM3LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgZm9yICh3PTA7dzxibXAtPmJpdG1hcC5ibVdpZHRoO3crKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoISh3ICYgMSkpIFhQdXRQaXhlbCggaW1hZ2UsIHcsIGgsICpzYnVmID4+IDQgKTsKLSAgICAgICAgICAgICAgICBlbHNlIFhQdXRQaXhlbCggaW1hZ2UsIHcsIGgsICpzYnVmKysgJiAweGYgKTsKKyAgICAgICAgICAgICAgICBpZiAoISh3ICYgMSkpIFRTWFB1dFBpeGVsKCBpbWFnZSwgdywgaCwgKnNidWYgPj4gNCApOworICAgICAgICAgICAgICAgIGVsc2UgVFNYUHV0UGl4ZWwoIGltYWdlLCB3LCBoLCAqc2J1ZisrICYgMHhmICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzYnVmICs9IHBhZDsKICAgICAgICAgfQpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAgICAgICAgIGZvciAoaD0wO2g8aGVpZ2h0O2grKykKICAgICAgICAgewogICAgICAgICAgICAgZm9yICh3PTA7dzxibXAtPmJpdG1hcC5ibVdpZHRoO3crKykKLSAgICAgICAgICAgICAgICBYUHV0UGl4ZWwoaW1hZ2UsdyxoLCpzYnVmKyspOworICAgICAgICAgICAgICAgIFRTWFB1dFBpeGVsKGltYWdlLHcsaCwqc2J1ZisrKTsKICAgICAgICAgICAgIHNidWYgKz0gcGFkOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAodz0wO3c8Ym1wLT5iaXRtYXAuYm1XaWR0aDt3KyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFB1dFBpeGVsKGltYWdlLHcsaCxzYnVmWzFdKjI1NitzYnVmWzBdKTsKKyAgICAgICAgICAgICAgICBUU1hQdXRQaXhlbChpbWFnZSx3LGgsc2J1ZlsxXSoyNTYrc2J1ZlswXSk7CiAgICAgICAgICAgICAgICAgc2J1Zis9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAodz0wO3c8Ym1wLT5iaXRtYXAuYm1XaWR0aDt3KyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFB1dFBpeGVsKGltYWdlLHcsaCwoc2J1ZlsyXTw8MTYpKyhzYnVmWzFdPDw4KStzYnVmWzBdKTsKKyAgICAgICAgICAgICAgICBUU1hQdXRQaXhlbChpbWFnZSx3LGgsKHNidWZbMl08PDE2KSsoc2J1ZlsxXTw8OCkrc2J1ZlswXSk7CiAgICAgICAgICAgICAgICAgc2J1ZiArPSAzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2J1ZiArPSBwYWQ7CkBAIC00ODEsNyArNDgxLDcgQEAKICAgICBkZXNjci5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgQ0FMTF9MQVJHRV9TVEFDSyggWFB1dEltYWdlX3dyYXBwZXIsICZkZXNjciApOwogCi0gICAgWERlc3Ryb3lJbWFnZSggaW1hZ2UgKTsgLyogZnJlZXMgdG1wYnVmZmVyIHRvbyAqLworICAgIFRTWERlc3Ryb3lJbWFnZSggaW1hZ2UgKTsgLyogZnJlZXMgdG1wYnVmZmVyIHRvbyAqLwogICAgIEdESV9IRUFQX1VOTE9DSyggaGJpdG1hcCApOwogICAgIHJldHVybiBoZWlnaHQgKiBibXAtPmJpdG1hcC5ibVdpZHRoQnl0ZXM7CiB9CkBAIC01MTAsNyArNTEwLDcgQEAKIAkKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgTG9hZEltYWdlQSAgICAoVVNFUjMyLjM2NCkKKyAqCSAgICBMb2FkSW1hZ2UzMkEgICAgKFVTRVIzMi4zNjQpCiAgKiBGSVhNRTogaW1wbGVtZW50YXRpb24gc3RpbGwgbGFja3MgbmVhcmx5IGFsbCBmZWF0dXJlcywgc2VlIExSXyoKICAqIGRlZmluZXMgaW4gd2luZG93cy5oCiAgKi8KQEAgLTY5OSwxMCArNjk5LDEwIEBACiB7CiAjaWZkZWYgUFJFTElNSU5BUllfV0lORzE2X1NVUFBPUlQKICAgICBpZiggYm1wLT5iaXRtYXAuYm1CaXRzICkKLSAJWFNobURldGFjaCggZGlzcGxheSwgKFhTaG1TZWdtZW50SW5mbyopYm1wLT5iaXRtYXAuYm1CaXRzICk7CisgCVRTWFNobURldGFjaCggZGlzcGxheSwgKFhTaG1TZWdtZW50SW5mbyopYm1wLT5iaXRtYXAuYm1CaXRzICk7CiAjZW5kaWYKIAotICAgIFhGcmVlUGl4bWFwKCBkaXNwbGF5LCBibXAtPnBpeG1hcCApOworICAgIFRTWEZyZWVQaXhtYXAoIGRpc3BsYXksIGJtcC0+cGl4bWFwICk7CiAjaWZkZWYgUFJFTElNSU5BUllfV0lORzE2X1NVUFBPUlQKICAgICBpZiggYm1wLT5iaXRtYXAuYm1CaXRzICkKICAgICB7CmRpZmYgLS1naXQgYS9vYmplY3RzL2JydXNoLmMgYi9vYmplY3RzL2JydXNoLmMKaW5kZXggMTg0ZWVlYS4uODhhMjMyYiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9icnVzaC5jCisrKyBiL29iamVjdHMvYnJ1c2guYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICBHRElfSEVBUF9VTkxPQ0soIGhiaXRtYXAgKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBYQ29weUFyZWEoIGRpc3BsYXksIGJtcC0+cGl4bWFwLCBuZXdibXAtPnBpeG1hcCwgQklUTUFQX0dDKGJtcCksCisgICAgVFNYQ29weUFyZWEoIGRpc3BsYXksIGJtcC0+cGl4bWFwLCBuZXdibXAtPnBpeG1hcCwgQklUTUFQX0dDKGJtcCksCiAJICAgICAgIDAsIDAsIGJtcC0+Yml0bWFwLmJtV2lkdGgsIGJtcC0+Yml0bWFwLmJtSGVpZ2h0LCAwLCAwICk7CiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoYml0bWFwICk7CiAgICAgR0RJX0hFQVBfVU5MT0NLKCBsb2dicnVzaC5sYkhhdGNoICk7CmRpZmYgLS1naXQgYS9vYmplY3RzL2NvbG9yLmMgYi9vYmplY3RzL2NvbG9yLmMKaW5kZXggYjA3Yjc5MC4uNTQ3NmE3NSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jb2xvci5jCisrKyBiL29iamVjdHMvY29sb3IuYwpAQCAtNiw3ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlICJ0c194bGliLmgiCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC0yMzcsNyArMjM3LDcgQEAKIAkJCSAgICBDT0xPUl9zeXNQYWxbaWR4XS5wZUdyZWVuIDw8IDgsCiAJCQkgICAgQ09MT1Jfc3lzUGFsW2lkeF0ucGVHcmVlbiA8PCA4LAogCQkJICAgIChEb1JlZCB8IERvR3JlZW4gfCBEb0JsdWUpIH07Ci0JICAgWFN0b3JlQ29sb3IoZGlzcGxheSwgY1NwYWNlLmNvbG9yTWFwLCAmY29sb3IpOworCSAgIFRTWFN0b3JlQ29sb3IoZGlzcGxheSwgY1NwYWNlLmNvbG9yTWFwLCAmY29sb3IpOwogCSB9CiAKIAkgaWR4ID0gQ09MT1JfZnJlZUxpc3RbaWR4XTsKQEAgLTI1OCwxMSArMjU4LDExIEBACiAJewogCSAgeGMucGl4ZWwgPSBpOwogCi0JICBYUXVlcnlDb2xvcihkaXNwbGF5LCBjU3BhY2UuY29sb3JNYXAsICZ4Yyk7CisJICBUU1hRdWVyeUNvbG9yKGRpc3BsYXksIGNTcGFjZS5jb2xvck1hcCwgJnhjKTsKIAkgIHIgPSB4Yy5yZWQ+Pjg7IGcgPSB4Yy5ncmVlbj4+ODsgYiA9IHhjLmJsdWU+Pjg7CiAKIAkgIGlmKCB4Yy5waXhlbCA8IDI1NiAmJiBDT0xPUl9DaGVja1N5c0NvbG9yKFJHQihyLCBnLCBiKSkgJiYKLQkgICAgICBYQWxsb2NDb2xvcihkaXNwbGF5LCBjU3BhY2UuY29sb3JNYXAsICZ4YykgKQorCSAgICAgIFRTWEFsbG9jQ29sb3IoZGlzcGxheSwgY1NwYWNlLmNvbG9yTWFwLCAmeGMpICkKIAkgIHsKIAkgICAgIENPTE9SX1BpeGVsVG9QYWxldHRlW3hjLnBpeGVsXSA9IGlkeDsKIAkgICAgIENPTE9SX1BhbGV0dGVUb1BpeGVsW2lkeF0gPSB4Yy5waXhlbDsKQEAgLTMxMyw3ICszMTMsNyBAQAogCiAgICAgICAgY29sb3IuZmxhZ3MgPSBEb1JlZCB8IERvR3JlZW4gfCBEb0JsdWU7CiAgICAgICAgY29sb3IucGl4ZWwgPSBpOwotICAgICAgIFhTdG9yZUNvbG9yKGRpc3BsYXksIGNzLT5jb2xvck1hcCwgJmNvbG9yKTsKKyAgICAgICBUU1hTdG9yZUNvbG9yKGRpc3BsYXksIGNzLT5jb2xvck1hcCwgJmNvbG9yKTsKIAogICAgICAgIC8qIFNldCBFR0EgbWFwcGluZyBpZiBjb2xvciBpcyBmcm9tIHRoZSBmaXJzdCBvciBsYXN0IGVpZ2h0ICovCiAKQEAgLTM1OSw3ICszNTksNyBAQAogICAgICAgICBjb2xvci5ibHVlICA9IF9fc3lzUGFsVGVtcGxhdGVbaV0ucGVCbHVlICogNjU1MzUgLyAyNTU7CiAgICAgICAgIGNvbG9yLmZsYWdzID0gRG9SZWQgfCBEb0dyZWVuIHwgRG9CbHVlOwogCi0gICAgICAgIGlmICghWEFsbG9jQ29sb3IoIGRpc3BsYXksIGNTcGFjZS5jb2xvck1hcCwgJmNvbG9yICkpCisgICAgICAgIGlmICghVFNYQWxsb2NDb2xvciggZGlzcGxheSwgY1NwYWNlLmNvbG9yTWFwLCAmY29sb3IgKSkKICAgICAgICAgeyAKIAkgICAgIFhDb2xvcgliZXN0LCBjOwogCSAgICAgCkBAIC0zODgsNyArMzg4LDcgQEAKIAkgICAgIGJlc3QucGl4ZWwgPSBiZXN0LnJlZCA9IGJlc3QuZ3JlZW4gPSBiZXN0LmJsdWUgPSAwOwogCSAgICAgZm9yKCBjLnBpeGVsID0gMCwgZGlmZiA9IDB4N2ZmZmZmZmY7IGMucGl4ZWwgPCBtYXg7IGMucGl4ZWwgKz0gc3RlcCApCiAJICAgICB7Ci0JCVhRdWVyeUNvbG9yKGRpc3BsYXksIGNTcGFjZS5jb2xvck1hcCwgJmMpOworCQlUU1hRdWVyeUNvbG9yKGRpc3BsYXksIGNTcGFjZS5jb2xvck1hcCwgJmMpOwogCQlyID0gKGMucmVkIC0gY29sb3IucmVkKT4+ODsgCiAJCWcgPSAoYy5ncmVlbiAtIGNvbG9yLmdyZWVuKT4+ODsgCiAJCWIgPSAoYy5ibHVlIC0gY29sb3IuYmx1ZSk+Pjg7CkBAIC0zOTYsNyArMzk2LDcgQEAKIAkJaWYoIHIgPCBkaWZmICkgeyBiZXN0ID0gYzsgZGlmZiA9IHI7IH0KIAkgICAgIH0KIAotCSAgICAgaWYoIFhBbGxvY0NvbG9yKGRpc3BsYXksIGNTcGFjZS5jb2xvck1hcCwgJmJlc3QpICkKKwkgICAgIGlmKCBUU1hBbGxvY0NvbG9yKGRpc3BsYXksIGNTcGFjZS5jb2xvck1hcCwgJmJlc3QpICkKIAkJIGNvbG9yLnBpeGVsID0gYmVzdC5waXhlbDsKIAkgICAgIGVsc2UgY29sb3IucGl4ZWwgPSAoaSA8IE5CX1JFU0VSVkVEX0NPTE9SUy8yKT8gYnAgOiB3cDsKICAgICAgICAgfQpAQCAtNDI0LDcgKzQyNCw3IEBACiAKIAkvKiBjb21tZW50IHRoaXMgb3V0IGlmIHlvdSB3YW50IHRvIGRlYnVnIHBhbGV0dGUgaW5pdCAqLwogCi0JWEdyYWJTZXJ2ZXIoZGlzcGxheSk7CisJVFNYR3JhYlNlcnZlcihkaXNwbGF5KTsKIAogCS8qIGxldCdzIGJlY29tZSB0aGUgZmlyc3QgY2xpZW50IHRoYXQgYWN0dWFsbHkgZm9sbG93cyAKIAkgKiBYIGd1aWRlbGluZXMgYW5kIGRvZXMgYmluYXJ5IHNlYXJjaC4uLgpAQCAtNDM1LDEyICs0MzUsMTIgQEAKICAgICAgICAgICB7CiAgICAgICAgICAgICAgY192YWwgPSAoY19tYXggKyBjX21pbikvMiArIChjX21heCArIGNfbWluKSUyOwogCi0gICAgICAgICAgICAgaWYoICFYQWxsb2NDb2xvckNlbGxzKGRpc3BsYXksIGNzLT5jb2xvck1hcCwgRmFsc2UsCisgICAgICAgICAgICAgaWYoICFUU1hBbGxvY0NvbG9yQ2VsbHMoZGlzcGxheSwgY3MtPmNvbG9yTWFwLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfbWFza3MsIDAsIHBpeER5bk1hcHBpbmcsIGNfdmFsKSApCiAgICAgICAgICAgICAgICAgIGNfbWF4ID0gY192YWwgLSAxOwogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgWEZyZWVDb2xvcnMoZGlzcGxheSwgY3MtPmNvbG9yTWFwLCBwaXhEeW5NYXBwaW5nLCBjX3ZhbCwgMCk7CisgICAgICAgICAgICAgICAgIFRTWEZyZWVDb2xvcnMoZGlzcGxheSwgY3MtPmNvbG9yTWFwLCBwaXhEeW5NYXBwaW5nLCBjX3ZhbCwgMCk7CiAgICAgICAgICAgICAgICAgIGNfbWluID0gY192YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpAQCAtNDUxLDcgKzQ1MSw3IEBACiAJY19taW4gPSAoY19taW4vMikgKyAoY19taW4vMik7CQkvKiBuZWVkIGV2ZW4gc2V0IGZvciBzcGxpdCBwYWxldHRlICovCiAKIAlpZiggY19taW4gPiAwICkKLQkgIGlmKCAhWEFsbG9jQ29sb3JDZWxscyhkaXNwbGF5LCBjcy0+Y29sb3JNYXAsIEZhbHNlLAorCSAgaWYoICFUU1hBbGxvY0NvbG9yQ2VsbHMoZGlzcGxheSwgY3MtPmNvbG9yTWFwLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfbWFza3MsIDAsIHBpeER5bk1hcHBpbmcsIGNfbWluKSApCiAJICAgIHsKIAkgICAgICBmcHJpbnRmKHN0ZGVyciwiSW5leHBsaWNhYmxlIGZhaWx1cmUgZHVyaW5nIGNvbG9yY2VsbCBhbGxvY2F0aW9uLlxuIik7CkBAIC00NjAsNyArNDYwLDcgQEAKIAogICAgICAgICBjcy0+c2l6ZSA9IGNfbWluICsgTkJfUkVTRVJWRURfQ09MT1JTOwogCi0JWFVuZ3JhYlNlcnZlcihkaXNwbGF5KTsKKwlUU1hVbmdyYWJTZXJ2ZXIoZGlzcGxheSk7CiAKIAlkcHJpbnRmX3BhbGV0dGUoc3RkZGViLCJhZGp1c3RlZCBzaXplICVpIGNvbG9yY2VsbHNcbiIsIGNzLT5zaXplKTsKICAgICAgfQpAQCAtNTk1LDcgKzU5NSw3IEBACiAJewogCSAgICBYU2V0V2luZG93QXR0cmlidXRlcyB3aW5fYXR0cjsKIAotCSAgICBjU3BhY2UuY29sb3JNYXAgPSBYQ3JlYXRlQ29sb3JtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCisJICAgIGNTcGFjZS5jb2xvck1hcCA9IFRTWENyZWF0ZUNvbG9ybWFwKCBkaXNwbGF5LCByb290V2luZG93LAogCQkJCQkJIHZpc3VhbCwgQWxsb2NBbGwgKTsKIAkgICAgaWYgKGNTcGFjZS5jb2xvck1hcCkKIAkgICAgewpAQCAtNjA4LDcgKzYwOCw3IEBACiAJICAgICAgICBpZiggcm9vdFdpbmRvdyAhPSBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSApCiAJICAgICAgICB7CiAJCSAgICB3aW5fYXR0ci5jb2xvcm1hcCA9IGNTcGFjZS5jb2xvck1hcDsKLQkJICAgIFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKCBkaXNwbGF5LCByb290V2luZG93LAorCQkgICAgVFNYQ2hhbmdlV2luZG93QXR0cmlidXRlcyggZGlzcGxheSwgcm9vdFdpbmRvdywKIAkJCQkJIENXQ29sb3JtYXAsICZ3aW5fYXR0ciApOwogCQl9CiAJCWJyZWFrOwpAQCAtNjMwLDE3ICs2MzAsMTcgQEAKIAkvKiBGSVhNRTogaGFjayB0byBkZXRlY3QgWEZyZWUzMiBYRl9WR0ExNiAuLi4gV2UganVzdCBoYXZlCiAJICogZGVwdGhzIDEgYW5kIDQKIAkgKi8KLQlkZXB0aHM9WExpc3REZXB0aHMoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLCZucm9mZGVwdGhzKTsKKwlkZXB0aHM9VFNYTGlzdERlcHRocyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksJm5yb2ZkZXB0aHMpOwogCWlmICgobnJvZmRlcHRocz09MikgJiYgKChkZXB0aHNbMF09PTQpIHx8IGRlcHRoc1sxXT09NCkpIHsKIAkgICAgY1NwYWNlLm1vbm9QbGFuZSA9IDE7CiAJICAgIGZvciggd2hpdGUgPSBjU3BhY2Uuc2l6ZSAtIDE7ICEod2hpdGUgJiAxKTsgd2hpdGUgPj49IDEgKQogCSAgICAgICAgY1NwYWNlLm1vbm9QbGFuZSsrOwogICAgIAkgICAgY1NwYWNlLmZsYWdzID0gKHdoaXRlICYgbWFzaykgPyBDT0xPUl9XSElURVNFVCA6IDA7CiAJICAgIGNTcGFjZS5jb2xvck1hcCA9IERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuKCBzY3JlZW4gKTsKLQkgICAgWEZyZWUoZGVwdGhzKTsKKwkgICAgVFNYRnJlZShkZXB0aHMpOwogCSAgICBicmVhazsKIAl9Ci0JWEZyZWUoZGVwdGhzKTsKKwlUU1hGcmVlKGRlcHRocyk7CiAgICAgICAgIGNTcGFjZS5jb2xvck1hcCA9IERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuKCBzY3JlZW4gKTsKICAgICAgICAgY1NwYWNlLmZsYWdzIHw9IENPTE9SX0ZJWEVEOwogICAgICAgICBDT0xPUl9Db21wdXRlc2hpZnRzKHZpc3VhbC0+cmVkX21hc2ssICZDT0xPUl9SZWRzaGlmdCwgJkNPTE9SX1JlZG1heCk7CkBAIC02NzgsNyArNjc4LDcgQEAKIHZvaWQgQ09MT1JfQ2xlYW51cCh2b2lkKQogewogICBpZiggQ09MT1JfZ2FwRmlsbGVkICkKLSAgICAgIFhGcmVlQ29sb3JzKGRpc3BsYXksIGNTcGFjZS5jb2xvck1hcCwgCisgICAgICBUU1hGcmVlQ29sb3JzKGRpc3BsYXksIGNTcGFjZS5jb2xvck1hcCwgCiAJCSAgKHVuc2lnbmVkIGxvbmcqKShDT0xPUl9QYWxldHRlVG9QaXhlbCArIENPTE9SX2dhcFN0YXJ0KSwgCiAJCSAgQ09MT1JfZ2FwRmlsbGVkLCAwKTsKIH0KQEAgLTg0Miw3ICs4NDIsNyBAQAogCQkgICAoKENPTE9SX1BpeGVsVG9QYWxldHRlKT9DT0xPUl9QaXhlbFRvUGFsZXR0ZVtwaXhlbF06cGl4ZWwpKSApICYgMHgwMGZmZmZmZjsKIAogICAgIGNvbG9yLnBpeGVsID0gcGl4ZWw7Ci0gICAgWFF1ZXJ5Q29sb3IoZGlzcGxheSwgY1NwYWNlLmNvbG9yTWFwLCAmY29sb3IpOworICAgIFRTWFF1ZXJ5Q29sb3IoZGlzcGxheSwgY1NwYWNlLmNvbG9yTWFwLCAmY29sb3IpOwogICAgIHJldHVybiBSR0IoY29sb3IucmVkID4+IDgsIGNvbG9yLmdyZWVuID4+IDgsIGNvbG9yLmJsdWUgPj4gOCk7CiB9CiAKQEAgLTEwNDgsNyArMTA0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbG9yLmdyZWVuID0gcGFsUHRyLT5sb2dwYWxldHRlLnBhbFBhbEVudHJ5W3VTdGFydF0ucGVHcmVlbiA8PCA4OwogICAgICAgICAgICAgICAgICAgICBjb2xvci5ibHVlID0gcGFsUHRyLT5sb2dwYWxldHRlLnBhbFBhbEVudHJ5W3VTdGFydF0ucGVCbHVlIDw8IDg7CiAgICAgICAgICAgICAgICAgICAgIGNvbG9yLmZsYWdzID0gRG9SZWQgfCBEb0dyZWVuIHwgRG9CbHVlOwotICAgICAgICAgICAgICAgICAgICBYU3RvcmVDb2xvcihkaXNwbGF5LCBjU3BhY2UuY29sb3JNYXAsICZjb2xvcik7CisgICAgICAgICAgICAgICAgICAgIFRTWFN0b3JlQ29sb3IoZGlzcGxheSwgY1NwYWNlLmNvbG9yTWFwLCAmY29sb3IpOwogCiAgICAgICAgICAgICAgICAgICAgIENPTE9SX3N5c1BhbFtpbmRleF0gPSBwYWxQdHItPmxvZ3BhbGV0dGUucGFsUGFsRW50cnlbdVN0YXJ0XTsKICAgICAgICAgICAgICAgICAgICAgQ09MT1Jfc3lzUGFsW2luZGV4XS5wZUZsYWdzID0gZmxhZzsKZGlmZiAtLWdpdCBhL29iamVjdHMvY3Vyc29yaWNvbi5jIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKaW5kZXggYTdlNzdjNC4uZTJhMTgzYSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jdXJzb3JpY29uLmMKKysrIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKQEAgLTk4MSwxMiArOTgxLDEyIEBACiAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRhdGFbXSA9IHsgMCB9OwogCiAgICAgICAgIGJnLnJlZCA9IGJnLmdyZWVuID0gYmcuYmx1ZSA9IDB4MDAwMDsKLSAgICAgICAgcGl4bWFwQml0cyA9IFhDcmVhdGVCaXRtYXBGcm9tRGF0YSggZGlzcGxheSwgcm9vdFdpbmRvdywgZGF0YSwgMSwgMSApOworICAgICAgICBwaXhtYXBCaXRzID0gVFNYQ3JlYXRlQml0bWFwRnJvbURhdGEoIGRpc3BsYXksIHJvb3RXaW5kb3csIGRhdGEsIDEsIDEgKTsKICAgICAgICAgaWYgKHBpeG1hcEJpdHMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGN1cnNvciA9IFhDcmVhdGVQaXhtYXBDdXJzb3IoIGRpc3BsYXksIHBpeG1hcEJpdHMsIHBpeG1hcEJpdHMsCisgICAgICAgICAgICBjdXJzb3IgPSBUU1hDcmVhdGVQaXhtYXBDdXJzb3IoIGRpc3BsYXksIHBpeG1hcEJpdHMsIHBpeG1hcEJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmcsICZiZywgMCwgMCApOwotICAgICAgICAgICAgWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcEJpdHMgKTsKKyAgICAgICAgICAgIFRTWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcEJpdHMgKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlICAvKiBDcmVhdGUgdGhlIFggY3Vyc29yIGZyb20gdGhlIGJpdHMgKi8KQEAgLTEwMDgsMzAgKzEwMDgsMjkgQEAKIAkgKgkgYXMgdGhlIFdpbmRvd3MgY3Vyc29yIGRhdGEpLiBQZXJoYXBzIHVzZSBhIG1vcmUgZ2VuZXJpYwogCSAqCSBhbGdvcml0aG0gaGVyZS4KIAkgKi8KLSAgICAgICAgcGl4bWFwQWxsID0gWENyZWF0ZVBpeG1hcCggZGlzcGxheSwgcm9vdFdpbmRvdywKKyAgICAgICAgcGl4bWFwQWxsID0gVFNYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0ICogMiwgMSApOwotICAgICAgICBpbWFnZSA9IFhDcmVhdGVJbWFnZSggZGlzcGxheSwgRGVmYXVsdFZpc3VhbE9mU2NyZWVuKHNjcmVlbiksCisgICAgICAgIGltYWdlID0gVFNYQ3JlYXRlSW1hZ2UoIGRpc3BsYXksIERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgWlBpeG1hcCwgMCwgKGNoYXIgKikocHRyICsgMSksIHB0ci0+bldpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5uSGVpZ2h0ICogMiwgMTYsIHB0ci0+bldpZHRoQnl0ZXMpOwogICAgICAgICBpZiAoaW1hZ2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGV4dGVybiB2b2lkIF9YSW5pdEltYWdlRnVuY1B0cnMoIFhJbWFnZSogKTsKICAgICAgICAgICAgIGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3Q7CiAgICAgICAgICAgICBpbWFnZS0+Yml0bWFwX2JpdF9vcmRlciA9IE1TQkZpcnN0OwogICAgICAgICAgICAgaW1hZ2UtPmJpdG1hcF91bml0ID0gMTY7Ci0gICAgICAgICAgICBfWEluaXRJbWFnZUZ1bmNQdHJzKGltYWdlKTsKKyAgICAgICAgICAgIFRTX1hJbml0SW1hZ2VGdW5jUHRycyhpbWFnZSk7CiAgICAgICAgICAgICBpZiAocGl4bWFwQWxsKQotICAgICAgICAgICAgICAgIFhQdXRJbWFnZSggZGlzcGxheSwgcGl4bWFwQWxsLCBCSVRNQVBfbW9ub0dDLCBpbWFnZSwKKyAgICAgICAgICAgICAgICBUU1hQdXRJbWFnZSggZGlzcGxheSwgcGl4bWFwQWxsLCBCSVRNQVBfbW9ub0dDLCBpbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQgKiAyICk7CiAgICAgICAgICAgICBpbWFnZS0+ZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICBYRGVzdHJveUltYWdlKCBpbWFnZSApOworICAgICAgICAgICAgVFNYRGVzdHJveUltYWdlKCBpbWFnZSApOwogICAgICAgICB9CiAKICAgICAgICAgLyogTm93IGNyZWF0ZSB0aGUgMiBwaXhtYXBzIGZvciBiaXRzIGFuZCBtYXNrICovCiAKLSAgICAgICAgcGl4bWFwQml0cyA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCisgICAgICAgIHBpeG1hcEJpdHMgPSBUU1hDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCAxICk7Ci0gICAgICAgIHBpeG1hcE1hc2sgPSBYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAorICAgICAgICBwaXhtYXBNYXNrID0gVFNYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgMSApOwogCiAgICAgICAgIC8qIE1ha2Ugc3VyZSBldmVyeXRoaW5nIHdlbnQgT0sgc28gZmFyICovCkBAIC0xMDYwLDM5ICsxMDU5LDM5IEBACiAgICAgICAgICAgICAgKiBJIGRvbid0IGtub3cgaWYgaXQncyBjb3JyZWN0IHBlciB0aGUgWCBzcGVjLCBidXQgbWF5YmUKICAgICAgICAgICAgICAqIHdlIG91Z2h0IHRvIHRha2UgYWR2YW50YWdlIG9mIGl0LiAgLS0gQUoKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWENvcHlBcmVhKCBkaXNwbGF5LCBwaXhtYXBBbGwsIHBpeG1hcEJpdHMsIEJJVE1BUF9tb25vR0MsCisgICAgICAgICAgICBUU1hDb3B5QXJlYSggZGlzcGxheSwgcGl4bWFwQWxsLCBwaXhtYXBCaXRzLCBCSVRNQVBfbW9ub0dDLAogICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCAwLCAwICk7Ci0gICAgICAgICAgICBYQ29weUFyZWEoIGRpc3BsYXksIHBpeG1hcEFsbCwgcGl4bWFwTWFzaywgQklUTUFQX21vbm9HQywKKyAgICAgICAgICAgIFRTWENvcHlBcmVhKCBkaXNwbGF5LCBwaXhtYXBBbGwsIHBpeG1hcE1hc2ssIEJJVE1BUF9tb25vR0MsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQsIDAsIDAgKTsKLSAgICAgICAgICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgQklUTUFQX21vbm9HQywgR1hhbmRSZXZlcnNlICk7Ci0gICAgICAgICAgICBYQ29weUFyZWEoIGRpc3BsYXksIHBpeG1hcEFsbCwgcGl4bWFwQml0cywgQklUTUFQX21vbm9HQywKKyAgICAgICAgICAgIFRTWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBCSVRNQVBfbW9ub0dDLCBHWGFuZFJldmVyc2UgKTsKKyAgICAgICAgICAgIFRTWENvcHlBcmVhKCBkaXNwbGF5LCBwaXhtYXBBbGwsIHBpeG1hcEJpdHMsIEJJVE1BUF9tb25vR0MsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsIHB0ci0+bkhlaWdodCwgcHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgMCwgMCApOwotICAgICAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBCSVRNQVBfbW9ub0dDLCBHWG9yUmV2ZXJzZSApOwotICAgICAgICAgICAgWENvcHlBcmVhKCBkaXNwbGF5LCBwaXhtYXBBbGwsIHBpeG1hcE1hc2ssIEJJVE1BUF9tb25vR0MsCisgICAgICAgICAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgQklUTUFQX21vbm9HQywgR1hvclJldmVyc2UgKTsKKyAgICAgICAgICAgIFRTWENvcHlBcmVhKCBkaXNwbGF5LCBwaXhtYXBBbGwsIHBpeG1hcE1hc2ssIEJJVE1BUF9tb25vR0MsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsIHB0ci0+bkhlaWdodCwgcHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgMCwgMCApOwotICAgICAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBCSVRNQVBfbW9ub0dDLCBHWGNvcHkgKTsKKyAgICAgICAgICAgIFRTWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBCSVRNQVBfbW9ub0dDLCBHWGNvcHkgKTsKICAgICAgICAgICAgIGZnLnJlZCA9IGZnLmdyZWVuID0gZmcuYmx1ZSA9IDB4ZmZmZjsKICAgICAgICAgICAgIGJnLnJlZCA9IGJnLmdyZWVuID0gYmcuYmx1ZSA9IDB4MDAwMDsKLSAgICAgICAgICAgIGN1cnNvciA9IFhDcmVhdGVQaXhtYXBDdXJzb3IoIGRpc3BsYXksIHBpeG1hcEJpdHMsIHBpeG1hcE1hc2ssCisgICAgICAgICAgICBjdXJzb3IgPSBUU1hDcmVhdGVQaXhtYXBDdXJzb3IoIGRpc3BsYXksIHBpeG1hcEJpdHMsIHBpeG1hcE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZywgJmJnLCBwdHItPnB0SG90U3BvdC54LCBwdHItPnB0SG90U3BvdC55ICk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBOb3cgZnJlZSBldmVyeXRoaW5nICovCiAKLSAgICAgICAgaWYgKHBpeG1hcEFsbCkgWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcEFsbCApOwotICAgICAgICBpZiAocGl4bWFwQml0cykgWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcEJpdHMgKTsKLSAgICAgICAgaWYgKHBpeG1hcE1hc2spIFhGcmVlUGl4bWFwKCBkaXNwbGF5LCBwaXhtYXBNYXNrICk7CisgICAgICAgIGlmIChwaXhtYXBBbGwpIFRTWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcEFsbCApOworICAgICAgICBpZiAocGl4bWFwQml0cykgVFNYRnJlZVBpeG1hcCggZGlzcGxheSwgcGl4bWFwQml0cyApOworICAgICAgICBpZiAocGl4bWFwTWFzaykgVFNYRnJlZVBpeG1hcCggZGlzcGxheSwgcGl4bWFwTWFzayApOwogICAgICAgICBHbG9iYWxVbmxvY2sxNiggaEN1cnNvciApOwogICAgIH0KIAogICAgIGlmIChjdXJzb3IgPT0gTm9uZSkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDVVJTT1JJQ09OX1hDdXJzb3IgIT0gTm9uZSkgWEZyZWVDdXJzb3IoIGRpc3BsYXksIENVUlNPUklDT05fWEN1cnNvciApOworICAgIGlmIChDVVJTT1JJQ09OX1hDdXJzb3IgIT0gTm9uZSkgVFNYRnJlZUN1cnNvciggZGlzcGxheSwgQ1VSU09SSUNPTl9YQ3Vyc29yICk7CiAgICAgQ1VSU09SSUNPTl9YQ3Vyc29yID0gY3Vyc29yOwogCiAgICAgaWYgKHJvb3RXaW5kb3cgIT0gRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSkpCiAgICAgewogICAgICAgICAvKiBTZXQgdGhlIGN1cnNvciBvbiB0aGUgZGVza3RvcCB3aW5kb3cgKi8KLSAgICAgICAgWERlZmluZUN1cnNvciggZGlzcGxheSwgcm9vdFdpbmRvdywgY3Vyc29yICk7CisgICAgICAgIFRTWERlZmluZUN1cnNvciggZGlzcGxheSwgcm9vdFdpbmRvdywgY3Vyc29yICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0xMTAxLDcgKzExMDAsNyBAQAogICAgICAgICB3aGlsZShod25kKQogICAgICAgICB7CiAgICAgICAgICAgICBXaW5kb3cgd2luID0gV0lOX0dldFhXaW5kb3coIGh3bmQgKTsKLSAgICAgICAgICAgIGlmICh3aW4pIFhEZWZpbmVDdXJzb3IoIGRpc3BsYXksIHdpbiwgY3Vyc29yICk7CisgICAgICAgICAgICBpZiAod2luKSBUU1hEZWZpbmVDdXJzb3IoIGRpc3BsYXksIHdpbiwgY3Vyc29yICk7CiAgICAgICAgICAgICBod25kID0gR2V0V2luZG93MzIoIGh3bmQsIEdXX0hXTkRORVhUICk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTUxLDcgKzExNTAsNyBAQAogQk9PTDMyIFdJTkFQSSBTZXRDdXJzb3JQb3MzMiggSU5UMzIgeCwgSU5UMzIgeSApCiB7CiAgICAgZHByaW50Zl9jdXJzb3IoIHN0ZGRlYiwgIlNldEN1cnNvclBvczogeD0lZCB5PSVkXG4iLCB4LCB5ICk7Ci0gICAgWFdhcnBQb2ludGVyKCBkaXNwbGF5LCByb290V2luZG93LCByb290V2luZG93LCAwLCAwLCAwLCAwLCB4LCB5ICk7CisgICAgVFNYV2FycFBvaW50ZXIoIGRpc3BsYXksIHJvb3RXaW5kb3csIHJvb3RXaW5kb3csIDAsIDAsIDAsIDAsIHgsIHkgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTIzNyw3ICsxMjM2LDcgQEAKICAgICB1bnNpZ25lZCBpbnQgbW91c2VidXQ7CiAKICAgICBpZiAoIXB0KSByZXR1cm47Ci0gICAgaWYgKCFYUXVlcnlQb2ludGVyKCBkaXNwbGF5LCByb290V2luZG93LCAmcm9vdCwgJmNoaWxkLAorICAgIGlmICghVFNYUXVlcnlQb2ludGVyKCBkaXNwbGF5LCByb290V2luZG93LCAmcm9vdCwgJmNoaWxkLAogCQkgICAgICAgICZyb290WCwgJnJvb3RZLCAmY2hpbGRYLCAmY2hpbGRZLCAmbW91c2VidXQgKSkKIAlwdC0+eCA9IHB0LT55ID0gMDsKICAgICBlbHNlCmRpZmYgLS1naXQgYS9vYmplY3RzL2RjLmMgYi9vYmplY3RzL2RjLmMKaW5kZXggN2ZmNjE2ZC4uYjIwNDFlZiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kYy5jCisrKyBiL29iamVjdHMvZGMuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImNvbG9yLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJmb250LmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJ4MTFmb250LmgiCiAKIGV4dGVybiB2b2lkIENMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKCBEQyAqIGRjICk7ICAgICAvKiBvYmplY3RzL2NsaXBwaW5nLmMgKi8KQEAgLTEzNiw2ICsxMzcsMTQgQEAKICAgICB3aW5fZGNfaW5mby0+RENPcmdZICAgICAgICAgID0gMDsKICAgICB3aW5fZGNfaW5mby0+Q3Vyc1Bvc1ggICAgICAgID0gMDsKICAgICB3aW5fZGNfaW5mby0+Q3Vyc1Bvc1kgICAgICAgID0gMDsKKyAgICB3aW5fZGNfaW5mby0+QXJjRGlyZWN0aW9uICAgID0gQURfQ09VTlRFUkNMT0NLV0lTRTsKKyAgICB3aW5fZGNfaW5mby0+VXNlV29ybGRYZm9ybSAgID0gRkFMU0U7CisgICAgd2luX2RjX2luZm8tPldvcmxkWGZvcm0uZU0xMSA9IDEuMGY7CisgICAgd2luX2RjX2luZm8tPldvcmxkWGZvcm0uZU0xMiA9IDAuMGY7CisgICAgd2luX2RjX2luZm8tPldvcmxkWGZvcm0uZU0yMSA9IDAuMGY7CisgICAgd2luX2RjX2luZm8tPldvcmxkWGZvcm0uZU0yMiA9IDEuMGY7CisgICAgd2luX2RjX2luZm8tPldvcmxkWGZvcm0uZUR4ICA9IDAuMGY7CisgICAgd2luX2RjX2luZm8tPldvcmxkWGZvcm0uZUR5ICA9IDAuMGY7CiAKICAgICBQQVRIX0luaXRHZGlQYXRoKCZ3aW5fZGNfaW5mby0+cGF0aCk7CiB9CkBAIC0yNjcsMTUgKzI3NiwxNSBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZWdpc3RlciBpbnQgeCwgeTsKICAgICAgICAgICAgIFhJbWFnZSAqaW1hZ2U7Ci0gICAgICAgICAgICBwaXhtYXAgPSBYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LCA4LCA4LCBzY3JlZW5EZXB0aCApOwotICAgICAgICAgICAgaW1hZ2UgPSBYR2V0SW1hZ2UoIGRpc3BsYXksIGRjLT51LnguYnJ1c2gucGl4bWFwLCAwLCAwLCA4LCA4LAorICAgICAgICAgICAgcGl4bWFwID0gVFNYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LCA4LCA4LCBzY3JlZW5EZXB0aCApOworICAgICAgICAgICAgaW1hZ2UgPSBUU1hHZXRJbWFnZSggZGlzcGxheSwgZGMtPnUueC5icnVzaC5waXhtYXAsIDAsIDAsIDgsIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsUGxhbmVzLCBaUGl4bWFwICk7CiAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQogICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCi0gICAgICAgICAgICAgICAgICAgIFhQdXRQaXhlbCggaW1hZ2UsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfUGl4ZWxUb1BhbGV0dGVbWEdldFBpeGVsKCBpbWFnZSwgeCwgeSldICk7Ci0gICAgICAgICAgICBYUHV0SW1hZ2UoIGRpc3BsYXksIHBpeG1hcCwgZ2MsIGltYWdlLCAwLCAwLCAwLCAwLCA4LCA4ICk7Ci0gICAgICAgICAgICBYRGVzdHJveUltYWdlKCBpbWFnZSApOworICAgICAgICAgICAgICAgICAgICBUU1hQdXRQaXhlbCggaW1hZ2UsIHgsIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfUGl4ZWxUb1BhbGV0dGVbVFNYR2V0UGl4ZWwoIGltYWdlLCB4LCB5KV0gKTsKKyAgICAgICAgICAgIFRTWFB1dEltYWdlKCBkaXNwbGF5LCBwaXhtYXAsIGdjLCBpbWFnZSwgMCwgMCwgMCwgMCwgOCwgOCApOworICAgICAgICAgICAgVFNYRGVzdHJveUltYWdlKCBpbWFnZSApOwogICAgICAgICAgICAgdmFsLnRpbGUgPSBwaXhtYXA7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB2YWwudGlsZSA9IGRjLT51LnguYnJ1c2gucGl4bWFwOwpAQCAtMjg5LDExICsyOTgsMTEgQEAKICAgICB2YWwudHNfeF9vcmlnaW4gPSBkYy0+dy5EQ09yZ1ggKyBkYy0+dy5icnVzaE9yZ1g7CiAgICAgdmFsLnRzX3lfb3JpZ2luID0gZGMtPncuRENPcmdZICsgZGMtPncuYnJ1c2hPcmdZOwogICAgIHZhbC5maWxsX3J1bGUgPSAoZGMtPncucG9seUZpbGxNb2RlPT1XSU5ESU5HKSA/IFdpbmRpbmdSdWxlIDogRXZlbk9kZFJ1bGU7Ci0gICAgWENoYW5nZUdDKCBkaXNwbGF5LCBnYywgCisgICAgVFNYQ2hhbmdlR0MoIGRpc3BsYXksIGdjLCAKIAkgICAgICAgR0NGdW5jdGlvbiB8IEdDRm9yZWdyb3VuZCB8IEdDQmFja2dyb3VuZCB8IEdDRmlsbFN0eWxlIHwKIAkgICAgICAgR0NGaWxsUnVsZSB8IEdDVGlsZVN0aXBYT3JpZ2luIHwgR0NUaWxlU3RpcFlPcmlnaW4gfCBtYXNrLAogCSAgICAgICAmdmFsICk7Ci0gICAgaWYgKHBpeG1hcCkgWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcCApOworICAgIGlmIChwaXhtYXApIFRTWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcCApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0zNTEsNyArMzYwLDcgQEAKICAgICB2YWwuZmlsbF9zdHlsZSA9IEZpbGxTb2xpZDsKICAgICBpZiAoKGRjLT51LngucGVuLnN0eWxlIT1QU19TT0xJRCkgJiYgKGRjLT51LngucGVuLnN0eWxlIT1QU19JTlNJREVGUkFNRSkpCiAgICAgewotCVhTZXREYXNoZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIDAsCisJVFNYU2V0RGFzaGVzKCBkaXNwbGF5LCBkYy0+dS54LmdjLCAwLAogCQkgICAgZGMtPnUueC5wZW4uZGFzaGVzLCBkYy0+dS54LnBlbi5kYXNoX2xlbiApOwogCXZhbC5saW5lX3N0eWxlID0gKGRjLT53LmJhY2tncm91bmRNb2RlID09IE9QQVFVRSkgPwogCSAgICAgICAgICAgICAgICAgICAgICBMaW5lRG91YmxlRGFzaCA6IExpbmVPbk9mZkRhc2g7CkBAIC0zODQsNyArMzkzLDcgQEAKICAgICBkZWZhdWx0OgogCXZhbC5qb2luX3N0eWxlID0gSm9pblJvdW5kOwogICAgIH0KLSAgICBYQ2hhbmdlR0MoIGRpc3BsYXksIGRjLT51LnguZ2MsIAorICAgIFRTWENoYW5nZUdDKCBkaXNwbGF5LCBkYy0+dS54LmdjLCAKIAkgICAgICAgR0NGdW5jdGlvbiB8IEdDRm9yZWdyb3VuZCB8IEdDQmFja2dyb3VuZCB8IEdDTGluZVdpZHRoIHwKIAkgICAgICAgR0NMaW5lU3R5bGUgfCBHQ0NhcFN0eWxlIHwgR0NKb2luU3R5bGUgfCBHQ0ZpbGxTdHlsZSwgJnZhbCApOwogICAgIHJldHVybiBUUlVFOwpAQCAtNDEzLDcgKzQyMiw3IEBACiAJdmFsLmZpbGxfc3R5bGUgPSBGaWxsU29saWQ7CiAJdmFsLmZvbnQgICAgICAgPSB4ZnMtPmZpZDsKIAotCVhDaGFuZ2VHQyggZGlzcGxheSwgZGMtPnUueC5nYywKKwlUU1hDaGFuZ2VHQyggZGlzcGxheSwgZGMtPnUueC5nYywKIAkJICAgR0NGdW5jdGlvbiB8IEdDRm9yZWdyb3VuZCB8IEdDQmFja2dyb3VuZCB8IEdDRmlsbFN0eWxlIHwKIAkJICAgR0NGb250LCAmdmFsICk7CiAJcmV0dXJuIFRSVUU7CkBAIC00NzAsMTAgKzQ3OSwxNCBAQAogICAgIG5ld2RjLT53LmJyZWFrRXh0cmEgICAgICA9IGRjLT53LmJyZWFrRXh0cmE7CiAgICAgbmV3ZGMtPncuYnJlYWtSZW0gICAgICAgID0gZGMtPncuYnJlYWtSZW07CiAgICAgbmV3ZGMtPncuTWFwTW9kZSAgICAgICAgID0gZGMtPncuTWFwTW9kZTsKKyAgICBuZXdkYy0+dy5HcmFwaGljc01vZGUgICAgPSBkYy0+dy5HcmFwaGljc01vZGU7CiAgICAgbmV3ZGMtPncuRENPcmdYICAgICAgICAgID0gZGMtPncuRENPcmdYOwogICAgIG5ld2RjLT53LkRDT3JnWSAgICAgICAgICA9IGRjLT53LkRDT3JnWTsKICAgICBuZXdkYy0+dy5DdXJzUG9zWCAgICAgICAgPSBkYy0+dy5DdXJzUG9zWDsKICAgICBuZXdkYy0+dy5DdXJzUG9zWSAgICAgICAgPSBkYy0+dy5DdXJzUG9zWTsKKyAgICBuZXdkYy0+dy5BcmNEaXJlY3Rpb24gICAgPSBkYy0+dy5BcmNEaXJlY3Rpb247CisgICAgbmV3ZGMtPncuVXNlV29ybGRYZm9ybSAgID0gZGMtPncuVXNlV29ybGRYZm9ybTsKKyAgICBuZXdkYy0+dy5Xb3JsZFhmb3JtICAgICAgPSBkYy0+dy5Xb3JsZFhmb3JtOwogICAgIG5ld2RjLT53bmRPcmdYICAgICAgICAgICA9IGRjLT53bmRPcmdYOwogICAgIG5ld2RjLT53bmRPcmdZICAgICAgICAgICA9IGRjLT53bmRPcmdZOwogICAgIG5ld2RjLT53bmRFeHRYICAgICAgICAgICA9IGRjLT53bmRFeHRYOwpAQCAtNTQ3LDEwICs1NjAsMTQgQEAKICAgICBkYy0+dy5icmVha0V4dHJhICAgICAgPSBkY3MtPncuYnJlYWtFeHRyYTsKICAgICBkYy0+dy5icmVha1JlbSAgICAgICAgPSBkY3MtPncuYnJlYWtSZW07CiAgICAgZGMtPncuTWFwTW9kZSAgICAgICAgID0gZGNzLT53Lk1hcE1vZGU7CisgICAgZGMtPncuR3JhcGhpY3NNb2RlICAgID0gZGNzLT53LkdyYXBoaWNzTW9kZTsKICAgICBkYy0+dy5EQ09yZ1ggICAgICAgICAgPSBkY3MtPncuRENPcmdYOwogICAgIGRjLT53LkRDT3JnWSAgICAgICAgICA9IGRjcy0+dy5EQ09yZ1k7CiAgICAgZGMtPncuQ3Vyc1Bvc1ggICAgICAgID0gZGNzLT53LkN1cnNQb3NYOwogICAgIGRjLT53LkN1cnNQb3NZICAgICAgICA9IGRjcy0+dy5DdXJzUG9zWTsKKyAgICBkYy0+dy5BcmNEaXJlY3Rpb24gICAgPSBkY3MtPncuQXJjRGlyZWN0aW9uOworICAgIGRjLT53LlVzZVdvcmxkWGZvcm0gICA9IGRjcy0+dy5Vc2VXb3JsZFhmb3JtOworICAgIGRjLT53LldvcmxkWGZvcm0gICAgICA9IGRjcy0+dy5Xb3JsZFhmb3JtOwogCiAgICAgZGMtPnduZE9yZ1ggICAgICAgICAgID0gZGNzLT53bmRPcmdYOwogICAgIGRjLT53bmRPcmdZICAgICAgICAgICA9IGRjcy0+d25kT3JnWTsKQEAgLTEwNjEsNyArMTA3OCw3IEBACiAgICAgICAgV2luZG93IHJvb3Q7CiAgICAgICAgaW50IHcsIGgsIGJvcmRlciwgZGVwdGg7CiAgICAgICAgLyogRklYTUU6IHRoaXMgaXMgbm90IGNvcnJlY3QgZm9yIG1hbmFnZWQgd2luZG93cyAqLwotICAgICAgIFhHZXRHZW9tZXRyeSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgJnJvb3QsCisgICAgICAgVFNYR2V0R2VvbWV0cnkoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsICZyb290LAogICAgICAgICAgICAgICAgICAgICAmbHBwLT54LCAmbHBwLT55LCAmdywgJmgsICZib3JkZXIsICZkZXB0aCApOwogICAgIH0KICAgICBlbHNlIGxwcC0+eCA9IGxwcC0+eSA9IDA7CkBAIC0xMTE3LDYgKzExMzQsMTMgQEAKIHsKICAgICBJTlQzMiByZXQ7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CisKKyAgICAvKiBPbmUgd291bGQgdGhpbmsgdGhhdCBzZXR0aW5nIHRoZSBncmFwaGljcyBtb2RlIHRvIEdNX0NPTVBBVElCTEUKKyAgICAgKiB3b3VsZCBhbHNvIHJlc2V0IHRoZSB3b3JsZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gdGhlIHVuaXR5CisgICAgICogbWF0cml4LiBIb3dldmVyLCBpbiBXaW5kb3dzLCB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gVGhpcyBkb2Vzbid0CisgICAgICogbWFrZSBhIGxvdCBvZiBzZW5zZSB0byBtZSwgYnV0IHRoYXQncyB0aGUgd2F5IGl0IGlzLgorICAgICAqLworICAgIAogICAgIGlmICghZGMpIHJldHVybiAwOwogICAgIGlmICgobW9kZSA8PSAwKSB8fCAobW9kZSA+IEdNX0xBU1QpKSByZXR1cm4gMDsKICAgICByZXQgPSBkYy0+dy5HcmFwaGljc01vZGU7CkBAIC0xMTI2LDEyICsxMTUwLDExMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEFyY0RpcmVjdGlvbjE2ICAgIChHREkuNTI0KQorICovCitJTlQxNiBXSU5BUEkgR2V0QXJjRGlyZWN0aW9uMTYoIEhEQzE2IGhkYyApCit7CisgICAgcmV0dXJuIEdldEFyY0RpcmVjdGlvbjMyKCAoSERDMzIpaGRjICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0QXJjRGlyZWN0aW9uMzIgICAgKEdESTMyLjE0MSkKKyAqLworSU5UMzIgV0lOQVBJIEdldEFyY0RpcmVjdGlvbjMyKCBIREMzMiBoZGMgKQoreworICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOworICAgIAorICAgIGlmICghZGMpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGRjLT53LkFyY0RpcmVjdGlvbjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRBcmNEaXJlY3Rpb24xNiAgICAoR0RJLjUyNSkKKyAqLworSU5UMTYgV0lOQVBJIFNldEFyY0RpcmVjdGlvbjE2KCBIREMxNiBoZGMsIElOVDE2IG5EaXJlY3Rpb24gKQoreworICAgIHJldHVybiBTZXRBcmNEaXJlY3Rpb24zMiggKEhEQzMyKWhkYywgKElOVDMyKW5EaXJlY3Rpb24gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRBcmNEaXJlY3Rpb24zMiAgICAoR0RJMzIuMzAyKQorICovCitJTlQzMiBXSU5BUEkgU2V0QXJjRGlyZWN0aW9uMzIoIEhEQzMyIGhkYywgSU5UMzIgbkRpcmVjdGlvbiApCit7CisgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CisgICAgSU5UMzIgbk9sZERpcmVjdGlvbjsKKyAgICAKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChuRGlyZWN0aW9uIT1BRF9DT1VOVEVSQ0xPQ0tXSVNFICYmIG5EaXJlY3Rpb24hPUFEX0NMT0NLV0lTRSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgbk9sZERpcmVjdGlvbiA9IGRjLT53LkFyY0RpcmVjdGlvbjsKKyAgICBkYy0+dy5BcmNEaXJlY3Rpb24gPSBuRGlyZWN0aW9uOworCisgICAgcmV0dXJuIG5PbGREaXJlY3Rpb247Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0V29ybGRUcmFuc2Zvcm0gICAgKEdESTMyLjI0NCkKICAqLwogQk9PTDMyIFdJTkFQSSBHZXRXb3JsZFRyYW5zZm9ybSggSERDMzIgaGRjLCBMUFhGT1JNIHhmb3JtICkKKy8qIEZJWE1FOiBDaGVjayB0aGF0IFNldExhc3RFcnJvciBpcyBiZWluZyBjYWxsZWQgY29ycmVjdGx5ICovCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIkdldFdvcmxkVHJhbnNmb3JtOiBlbXB0eSBzdHViXG4iICk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOworICAgIAorICAgIGlmICghZGMpCisgICAgICAgIC8qIEZJWE1FOiBDYWxsIFNldExhc3RFcnJvcj8gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICgheGZvcm0pCisgICAgICAgIC8qIEZJWE1FOiBDYWxsIFNldExhc3RFcnJvcj8gKi8KKwlyZXR1cm4gRkFMU0U7CisKKyAgICAqeGZvcm0gPSBkYy0+dy5Xb3JsZFhmb3JtOworICAgIAorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldFdvcmxkVHJhbnNmb3JtICAgIChHREkzMi4zNDYpCisgKi8KK0JPT0wzMiBXSU5BUEkgU2V0V29ybGRUcmFuc2Zvcm0oIEhEQzMyIGhkYywgY29uc3QgWEZPUk0gKnhmb3JtICkKK3sKKyAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKKyAgICAKKyAgICBpZiAoIWRjKQorICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX0hBTkRMRSApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKCF4Zm9ybSkKKwlyZXR1cm4gRkFMU0U7CisgICAgCisgICAgLyogQ2hlY2sgdGhhdCBncmFwaGljcyBtb2RlIGlzIEdNX0FEVkFOQ0VEICovCisgICAgaWYgKGRjLT53LkdyYXBoaWNzTW9kZSE9R01fQURWQU5DRUQpCisgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgZGMtPncuV29ybGRYZm9ybSA9ICp4Zm9ybTsKKworICAgIC8qIFdlIG9ubHkgaGF2ZSB0byB1c2UgdGhlIG5ldyB3b3JsZCB0cmFuc2Zvcm0gaWYgaXQncyBub3QgdGhlCisgICAgICogaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24KKyAgICAgKi8KKyAgICBkYy0+dy5Vc2VXb3JsZFhmb3JtPQorICAgICAgICh4Zm9ybS0+ZU0xMSE9MS4wZiB8fCB4Zm9ybS0+ZU0xMiE9MC4wZiB8fAorICAgICAgICB4Zm9ybS0+ZU0yMSE9MC4wZiB8fCB4Zm9ybS0+ZU0yMiE9MS4wZiB8fAorICAgICAgICB4Zm9ybS0+ZUR4IT0wLjBmICB8fCB4Zm9ybS0+ZUR5IT0wLjBmKTsKKyAgICAKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogCmRpZmYgLS1naXQgYS9vYmplY3RzL2RpYi5jIGIvb2JqZWN0cy9kaWIuYwppbmRleCA4OTU1NjI0Li5mODAyZjE0IDEwMDY0NAotLS0gYS9vYmplY3RzL2RpYi5jCisrKyBiL29iamVjdHMvZGliLmMKQEAgLTYsOCArNiw4IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSA8WDExL1h1dGlsLmg+CisjaW5jbHVkZSAidHNfeGxpYi5oIgorI2luY2x1ZGUgInRzX3h1dGlsLmgiCiAjaW5jbHVkZSAiZGMuaCIKICNpbmNsdWRlICJiaXRtYXAuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgpAQCAtNTQsMTEgKzU0LDExIEBACiAKICAgICBmb3IoIGkgPSAwOyBiaXRtYXBEZXB0aFRhYmxlW2ldOyBpKysgKQogICAgIHsKLQkgdGVzdGltYWdlID0gWENyZWF0ZUltYWdlKGRpc3BsYXksIERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLAorCSB0ZXN0aW1hZ2UgPSBUU1hDcmVhdGVJbWFnZShkaXNwbGF5LCBEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oc2NyZWVuKSwKIAkJCSBiaXRtYXBEZXB0aFRhYmxlW2ldLCBaUGl4bWFwLCAwLCBOVUxMLCAxLCAxLCAzMiwgMjAgKTsKIAkgaWYoIHRlc3RpbWFnZSApIHhpbWFnZURlcHRoVGFibGVbaV0gPSB0ZXN0aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOwogCSBlbHNlIHJldHVybiBGQUxTRTsKLQkgWERlc3Ryb3lJbWFnZSh0ZXN0aW1hZ2UpOworCSBUU1hEZXN0cm95SW1hZ2UodGVzdGltYWdlKTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0yNTIsMjUgKzI1MiwyNSBAQAogICAgIGZvciAoaSA9IGRzdHdpZHRoLzgsIHggPSBsZWZ0Jn43OyAoaSA+IDApOyBpLS0pCiAgICAgewogCXBpeCA9ICpiaXRzKys7Ci0JWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7Ci0JWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbKHBpeCA+PiA2KSAmIDFdICk7Ci0JWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbKHBpeCA+PiA1KSAmIDFdICk7Ci0JWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbKHBpeCA+PiA0KSAmIDFdICk7Ci0JWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbKHBpeCA+PiAzKSAmIDFdICk7Ci0JWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbKHBpeCA+PiAyKSAmIDFdICk7Ci0JWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbKHBpeCA+PiAxKSAmIDFdICk7Ci0JWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ICYgMV0gKTsKKwlUU1hQdXRQaXhlbCggYm1wSW1hZ2UsIHgrKywgaCwgY29sb3JzW3BpeCA+PiA3XSApOworCVRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbKHBpeCA+PiA2KSAmIDFdICk7CisJVFNYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1socGl4ID4+IDUpICYgMV0gKTsKKwlUU1hQdXRQaXhlbCggYm1wSW1hZ2UsIHgrKywgaCwgY29sb3JzWyhwaXggPj4gNCkgJiAxXSApOworCVRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbKHBpeCA+PiAzKSAmIDFdICk7CisJVFNYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1socGl4ID4+IDIpICYgMV0gKTsKKwlUU1hQdXRQaXhlbCggYm1wSW1hZ2UsIHgrKywgaCwgY29sb3JzWyhwaXggPj4gMSkgJiAxXSApOworCVRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ICYgMV0gKTsKICAgICB9CiAgICAgcGl4ID0gKmJpdHM7CiAgICAgc3dpdGNoKGRzdHdpZHRoICYgNykKICAgICB7Ci0gICAgY2FzZSA3OiBYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1twaXggPj4gN10gKTsgcGl4IDw8PSAxOwotICAgIGNhc2UgNjogWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7IHBpeCA8PD0gMTsKLSAgICBjYXNlIDU6IFhQdXRQaXhlbCggYm1wSW1hZ2UsIHgrKywgaCwgY29sb3JzW3BpeCA+PiA3XSApOyBwaXggPDw9IDE7Ci0gICAgY2FzZSA0OiBYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1twaXggPj4gN10gKTsgcGl4IDw8PSAxOwotICAgIGNhc2UgMzogWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7IHBpeCA8PD0gMTsKLSAgICBjYXNlIDI6IFhQdXRQaXhlbCggYm1wSW1hZ2UsIHgrKywgaCwgY29sb3JzW3BpeCA+PiA3XSApOyBwaXggPDw9IDE7Ci0gICAgY2FzZSAxOiBYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1twaXggPj4gN10gKTsKKyAgICBjYXNlIDc6IFRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7IHBpeCA8PD0gMTsKKyAgICBjYXNlIDY6IFRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7IHBpeCA8PD0gMTsKKyAgICBjYXNlIDU6IFRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7IHBpeCA8PD0gMTsKKyAgICBjYXNlIDQ6IFRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7IHBpeCA8PD0gMTsKKyAgICBjYXNlIDM6IFRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7IHBpeCA8PD0gMTsKKyAgICBjYXNlIDI6IFRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7IHBpeCA8PD0gMTsKKyAgICBjYXNlIDE6IFRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDddICk7CiAgICAgfQogfQogCkBAIC0zMjYsMTAgKzMyNiwxMCBAQAogCWZvciAoaCA9IGxpbmVzLTE7IGggPj0gMDsgaC0tKSB7CiAJICAgIGZvciAoaSA9IGRzdHdpZHRoLzIsIHggPSBsZWZ0Jn4xOyBpID4gMDsgaS0tKSB7CiAJCUJZVEUgcGl4ID0gKmJpdHMrKzsKLQkJWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDRdICk7Ci0JCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgrKywgaCwgY29sb3JzW3BpeCAmIDB4MGZdICk7CisJCVRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ID4+IDRdICk7CisJCVRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ICYgMHgwZl0gKTsKIAkgICAgfQotCSAgICBpZiAoZHN0d2lkdGggJiAxKSBYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLCBjb2xvcnNbKmJpdHMgPj4gNF0gKTsKKwkgICAgaWYgKGRzdHdpZHRoICYgMSkgVFNYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLCBjb2xvcnNbKmJpdHMgPj4gNF0gKTsKIAkgICAgc3JjYml0cyArPSBsaW5lYnl0ZXM7CiAJICAgIGJpdHMJID0gc3JjYml0cyArIChsZWZ0ID4+IDEpOwogCX0KQEAgLTMzOCwxMCArMzM4LDEwIEBACiAJZm9yIChoID0gMDsgaCA8IGxpbmVzOyBoKyspIHsKIAkgICAgZm9yIChpID0gZHN0d2lkdGgvMiwgeCA9IGxlZnQmfjE7IGkgPiAwOyBpLS0pIHsKIAkJQllURSBwaXggPSAqYml0cysrOwotCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1twaXggPj4gNF0gKTsKLQkJWFB1dFBpeGVsKCBibXBJbWFnZSwgeCsrLCBoLCBjb2xvcnNbcGl4ICYgMHgwZl0gKTsKKwkJVFNYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1twaXggPj4gNF0gKTsKKwkJVFNYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1twaXggJiAweDBmXSApOwogCSAgICB9Ci0JICAgIGlmIChkc3R3aWR0aCAmIDEpIFhQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsIGNvbG9yc1sqYml0cyA+PiA0XSApOworCSAgICBpZiAoZHN0d2lkdGggJiAxKSBUU1hQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsIGNvbG9yc1sqYml0cyA+PiA0XSApOwogCSAgICBzcmNiaXRzICs9IGxpbmVieXRlczsKIAkgICAgYml0cwkgPSBzcmNiaXRzICsgKGxlZnQgPj4gMSk7CiAJfQpAQCAtMzc1LDExICszNzUsMTEgQEAKIAkJaWYgKGxlbmd0aCkgewkvKiBlbmNvZGVkICovCiAJCQljID0gKmJpdHMrKzsKIAkJCXdoaWxlIChsZW5ndGgtLSkgewotCQkJCVhQdXRQaXhlbChibXBJbWFnZSwgeCsrLCBsaW5lcywgY29sb3JzW2MgPj4gNF0pOworCQkJCVRTWFB1dFBpeGVsKGJtcEltYWdlLCB4KyssIGxpbmVzLCBjb2xvcnNbYyA+PiA0XSk7CiAJCQkJY2hlY2tfeHkoeCwgeSk7CiAJCQkJaWYgKGxlbmd0aCkgewogCQkJCQlsZW5ndGgtLTsKLQkJCQkJWFB1dFBpeGVsKGJtcEltYWdlLCB4KyssIGxpbmVzLCBjb2xvcnNbYyAmIDB4Zl0pOworCQkJCQlUU1hQdXRQaXhlbChibXBJbWFnZSwgeCsrLCBsaW5lcywgY29sb3JzW2MgJiAweGZdKTsKIAkJCQkJY2hlY2tfeHkoeCwgeSk7CiAJCQkJfQogCQkJfQpAQCAtNDAyLDExICs0MDIsMTEgQEAKIAkJCQlkZWZhdWx0OiAvKiBhYnNvbHV0ZSAqLwogCQkJCQl3aGlsZSAobGVuZ3RoLS0pIHsKIAkJCQkJCWMgPSAqYml0cysrOwotCQkJCQkJWFB1dFBpeGVsKGJtcEltYWdlLCB4KyssIGxpbmVzLCBjb2xvcnNbYyA+PiA0XSk7CisJCQkJCQlUU1hQdXRQaXhlbChibXBJbWFnZSwgeCsrLCBsaW5lcywgY29sb3JzW2MgPj4gNF0pOwogCQkJCQkJY2hlY2tfeHkoeCwgeSk7CiAJCQkJCQlpZiAobGVuZ3RoKSB7CiAJCQkJCQkJbGVuZ3RoLS07Ci0JCQkJCQkJWFB1dFBpeGVsKGJtcEltYWdlLCB4KyssIGxpbmVzLCBjb2xvcnNbYyAmIDB4Zl0pOworCQkJCQkJCVRTWFB1dFBpeGVsKGJtcEltYWdlLCB4KyssIGxpbmVzLCBjb2xvcnNbYyAmIDB4Zl0pOwogCQkJCQkJCWNoZWNrX3h5KHgsIHkpOwogCQkJCQkJfQogCQkJCQl9CkBAIC00MzgsNyArNDM4LDcgQEAKICAgICBpZiAobGluZXMgPiAwKSB7CiAJZm9yIChoID0gbGluZXMgLSAxOyBoID49IDA7IGgtLSkgewogCSAgICBmb3IgKHggPSBsZWZ0OyB4IDwgZHN0d2lkdGg7IHgrKywgYml0cysrKSB7Ci0JCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsIGNvbG9yc1sqYml0c10gKTsKKwkJVFNYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLCBjb2xvcnNbKmJpdHNdICk7CiAJICAgIH0KIAkgICAgYml0cyA9IChzcmNiaXRzICs9IGxpbmVieXRlcykgKyBsZWZ0OwogCX0KQEAgLTQ0Niw3ICs0NDYsNyBAQAogCWxpbmVzID0gLWxpbmVzOwogCWZvciAoaCA9IDA7IGggPCBsaW5lczsgaCsrKSB7CiAJICAgIGZvciAoeCA9IGxlZnQ7IHggPCBkc3R3aWR0aDsgeCsrLCBiaXRzKyspIHsKLQkJWFB1dFBpeGVsKCBibXBJbWFnZSwgeCwgaCwgY29sb3JzWypiaXRzXSApOworCQlUU1hQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsIGNvbG9yc1sqYml0c10gKTsKIAkgICAgfQogCSAgICBiaXRzID0gKHNyY2JpdHMgKz0gbGluZWJ5dGVzKSArIGxlZnQ7CiAJfQpAQCAtNTMwLDcgKzUzMCw3IEBACiAJCWNvbG9yID0gY29sb3JzW2NvbG9yX2luZGV4XTsKIAogCQl3aGlsZShsZW5ndGgtLSkKLQkJICBYUHV0UGl4ZWwoYm1wSW1hZ2UsIHgrKywgbGluZSwgY29sb3IpOworCQkgIFRTWFB1dFBpeGVsKGJtcEltYWdlLCB4KyssIGxpbmUsIGNvbG9yKTsKIAkgICAgfQogCSAgZWxzZSAKIAkgICAgeyAgICAKQEAgLTU5NSw3ICs1OTUsNyBAQAogCQkJICB3aGlsZShsZW5ndGgtLSkKIAkJCSAgICB7CiAJCQkJY29sb3JfaW5kZXggPSAoKnBJbisrKTsKLQkJCQlYUHV0UGl4ZWwoYm1wSW1hZ2UsIHgrKywgbGluZSwgCisJCQkJVFNYUHV0UGl4ZWwoYm1wSW1hZ2UsIHgrKywgbGluZSwgCiAJCQkJCSAgY29sb3JzW2NvbG9yX2luZGV4XSk7CiAJCQkgICAgfQogCQkJICAKQEAgLTY2Miw3ICs2NjIsNyBAQAogCQlyID0gKEJZVEUpICgodmFsICYgMHg3YzAwKSA+PiA3KTsKIAkJZyA9IChCWVRFKSAoKHZhbCAmIDB4MDNlMCkgPj4gMik7CiAJCWIgPSAoQllURSkgKCh2YWwgJiAweDAwMWYpIDw8IDMpOwotCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLAorCQlUU1hQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsCiAJCQkgICBDT0xPUl9Ub1BoeXNpY2FsKGRjLCBSR0IocixnLGIpKSApOwogCSAgICB9CiAJICAgIHB0ciA9IChMUFdPUkQpIChzcmNiaXRzICs9IGxpbmVieXRlcykgKyBsZWZ0OwpAQCAtNjc1LDcgKzY3NSw3IEBACiAJCXIgPSAoQllURSkgKCh2YWwgJiAweDdjMDApID4+IDcpOwogCQlnID0gKEJZVEUpICgodmFsICYgMHgwM2UwKSA+PiAyKTsKIAkJYiA9IChCWVRFKSAoKHZhbCAmIDB4MDAxZikgPDwgMyk7Ci0JCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsCisJCVRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCwgaCwKIAkJCSAgIENPTE9SX1RvUGh5c2ljYWwoZGMsIFJHQihyLGcsYikpICk7CiAJICAgIH0KIAkgICAgcHRyID0gKExQV09SRCkgKHNyY2JpdHMgKz0gbGluZWJ5dGVzKSArIGxlZnQ7CkBAIC03MDcsNyArNzA3LDcgQEAKICAgICBpZiAobGluZXMgPiAwKSB7CiAJZm9yIChoID0gbGluZXMgLSAxOyBoID49IDA7IGgtLSkgewogCSAgICBmb3IgKHggPSBsZWZ0OyB4IDwgZHN0d2lkdGg7IHgrKywgYml0cyArPSAzKSB7Ci0JCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsIAorCQlUU1hQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsIAogCQkJICAgQ09MT1JfVG9QaHlzaWNhbChkYywgUkdCKGJpdHNbMl0sYml0c1sxXSxiaXRzWzBdKSkpOwogCSAgICB9CiAJICAgIGJpdHMgPSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpICsgbGVmdCAqIDM7CkBAIC03MTYsNyArNzE2LDcgQEAKIAlsaW5lcyA9IC1saW5lczsKIAlmb3IgKGggPSAwOyBoIDwgbGluZXM7IGgrKykgewogCSAgICBmb3IgKHggPSBsZWZ0OyB4IDwgZHN0d2lkdGg7IHgrKywgYml0cyArPSAzKSB7Ci0JCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsCisJCVRTWFB1dFBpeGVsKCBibXBJbWFnZSwgeCwgaCwKIAkJCSAgIENPTE9SX1RvUGh5c2ljYWwoZGMsIFJHQihiaXRzWzJdLGJpdHNbMV0sYml0c1swXSkpKTsKIAkgICAgfQogCSAgICBiaXRzID0gKHNyY2JpdHMgKz0gbGluZWJ5dGVzKSArIGxlZnQgKiAzOwpAQCAtNzQ1LDcgKzc0NSw3IEBACiAgICAgaWYgKGxpbmVzID4gMCkgewogCWZvciAoaCA9IGxpbmVzIC0gMTsgaCA+PSAwOyBoLS0pIHsKIAkgICAgZm9yICh4ID0gbGVmdDsgeCA8IGRzdHdpZHRoOyB4KyssIGJpdHMgKz0gNCkgewotCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLCAKKwkJVFNYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLCAKIAkJCSAgIENPTE9SX1RvUGh5c2ljYWwoZGMsIFJHQihiaXRzWzJdLGJpdHNbMV0sYml0c1swXSkpKTsKIAkgICAgfQogCSAgICBiaXRzID0gKHNyY2JpdHMgKz0gbGluZWJ5dGVzKSArIGxlZnQgKiA0OwpAQCAtNzU0LDcgKzc1NCw3IEBACiAJbGluZXMgPSAtbGluZXM7CiAJZm9yIChoID0gMDsgaCA8IGxpbmVzOyBoKyspIHsKIAkgICAgZm9yICh4ID0gbGVmdDsgeCA8IGRzdHdpZHRoOyB4KyssIGJpdHMgKz0gNCkgewotCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLAorCQlUU1hQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsCiAJCQkgICBDT0xPUl9Ub1BoeXNpY2FsKGRjLCBSR0IoYml0c1syXSxiaXRzWzFdLGJpdHNbMF0pKSk7CiAJICAgIH0KIAkgICAgYml0cyA9IChzcmNiaXRzICs9IGxpbmVieXRlcykgKyBsZWZ0ICogNDsKQEAgLTgzMSwxMCArODMxLDEwIEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoY29sb3JNYXBwaW5nKSBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY29sb3JNYXBwaW5nICk7Ci0gICAgWFB1dEltYWdlKCBkaXNwbGF5LCBkZXNjci0+ZHJhd2FibGUsIGRlc2NyLT5nYywgYm1wSW1hZ2UsCisgICAgVFNYUHV0SW1hZ2UoIGRpc3BsYXksIGRlc2NyLT5kcmF3YWJsZSwgZGVzY3ItPmdjLCBibXBJbWFnZSwKICAgICAgICAgICAgICAgIGRlc2NyLT54U3JjLCBkZXNjci0+eVNyYywgZGVzY3ItPnhEZXN0LCBkZXNjci0+eURlc3QsCiAgICAgICAgICAgICAgICBkZXNjci0+d2lkdGgsIGRlc2NyLT5oZWlnaHQgKTsKLSAgICBYRGVzdHJveUltYWdlKCBibXBJbWFnZSApOworICAgIFRTWERlc3Ryb3lJbWFnZSggYm1wSW1hZ2UgKTsKICAgICByZXR1cm4gbGluZXM7CiB9CiAKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAgICAgaWYgKCFjeCB8fCAhY3kpIHJldHVybiAwOwogCiAgICAgRENfU2V0dXBHQ0ZvclRleHQoIGRjICk7ICAvKiBUbyBoYXZlIHRoZSBjb3JyZWN0IGNvbG9ycyAqLwotICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgZGMtPnUueC5nYywgRENfWFJPUGZ1bmN0aW9uW2RjLT53LlJPUG1vZGUtMV0gKTsKKyAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgZGMtPnUueC5nYywgRENfWFJPUGZ1bmN0aW9uW2RjLT53LlJPUG1vZGUtMV0gKTsKIAogICAgIGRlc2NyLmRjICAgICAgICA9IGRjOwogICAgIGRlc2NyLmJpdHMgICAgICA9IGJpdHM7CkBAIC0xMjA5LDcgKzEyMDksNyBAQAogCQlmb3IoIHkgPSB5ZW5kIC0gMTsgKGludCl5ID49IChpbnQpc3RhcnRzY2FuOyB5LS0gKQogCQl7CiAJCSAgIGZvciggeCA9IDA7IHggPCB4ZW5kOyB4KysgKQotCQkJKmJiaXRzKysgPSBYR2V0UGl4ZWwoIGJtcEltYWdlLCB4LCB5ICk7CisJCQkqYmJpdHMrKyA9IFRTWEdldFBpeGVsKCBibXBJbWFnZSwgeCwgeSApOwogCQkgICBiYml0cyArPSBwYWQ7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMjIwLDcgKzEyMjAsNyBAQAogCQkgICAqYmJpdHMgPSAwOwogCQkgICBmb3IoIHggPSAwOyB4IDwgeGVuZDsgeCsrICkgewogCQkgICAJCi0JCQkqYmJpdHMgfD0gWEdldFBpeGVsKCBibXBJbWFnZSwgeCwgeSk8PCg3LSh4JjcpKTsKKwkJCSpiYml0cyB8PSBUU1hHZXRQaXhlbCggYm1wSW1hZ2UsIHgsIHkpPDwoNy0oeCY3KSk7CiAJCQlpZiAoKHgmNyk9PTcpIHsKIAkJCSAgICBiYml0cysrOwogCQkJICAgICpiYml0cz0wOwpAQCAtMTIzNiw3ICsxMjM2LDcgQEAKIAkJICAgKmJiaXRzID0gMDsKIAkJICAgZm9yKCB4ID0gMDsgeCA8IHhlbmQ7IHgrKyApIHsKIAkJICAgCQotCQkJKmJiaXRzIHw9IFhHZXRQaXhlbCggYm1wSW1hZ2UsIHgsIHkpPDwoNCooMS0oeCYxKSkpOworCQkJKmJiaXRzIHw9IFRTWEdldFBpeGVsKCBibXBJbWFnZSwgeCwgeSk8PCg0KigxLSh4JjEpKSk7CiAJCQlpZiAoKHgmMSk9PTEpIHsKIAkJCSAgICBiYml0cysrOwogCQkJICAgICpiYml0cz0wOwpAQCAtMTI1Miw3ICsxMjUyLDcgQEAKIAkJewogCQkgICAqYmJpdHMgPSAwOwogCQkgICBmb3IoIHggPSAwOyB4IDwgeGVuZDsgeCsrICkgewotCQkgICAJdW5zaWduZWQgbG9uZyBwaXhlbD1YR2V0UGl4ZWwoIGJtcEltYWdlLCB4LCB5KTsKKwkJICAgCXVuc2lnbmVkIGxvbmcgcGl4ZWw9VFNYR2V0UGl4ZWwoIGJtcEltYWdlLCB4LCB5KTsKIAkJCSpiYml0cysrID0gcGl4ZWwgJiAweGZmOwogCQkJKmJiaXRzKysgPSAocGl4ZWwgPj4gOCkgJiAweGZmOwogCQkgICB9CkBAIC0xMjY1LDcgKzEyNjUsNyBAQAogCQl7CiAJCSAgICpiYml0cyA9IDA7CiAJCSAgIGZvciggeCA9IDA7IHggPCB4ZW5kOyB4KysgKSB7Ci0JCSAgIAl1bnNpZ25lZCBsb25nIHBpeGVsPVhHZXRQaXhlbCggYm1wSW1hZ2UsIHgsIHkpOworCQkgICAJdW5zaWduZWQgbG9uZyBwaXhlbD1UU1hHZXRQaXhlbCggYm1wSW1hZ2UsIHgsIHkpOwogCQkJKmJiaXRzKysgPSAocGl4ZWwgPj4xNikgJiAweGZmOwogCQkJKmJiaXRzKysgPSAocGl4ZWwgPj4gOCkgJiAweGZmOwogCQkJKmJiaXRzKysgPSAgcGl4ZWwgICAgICAgJiAweGZmOwpAQCAtMTI3OCw3ICsxMjc4LDcgQEAKIAkJewogCQkgICAqYmJpdHMgPSAwOwogCQkgICBmb3IoIHggPSAwOyB4IDwgeGVuZDsgeCsrICkgewotCQkgICAJdW5zaWduZWQgbG9uZyBwaXhlbD1YR2V0UGl4ZWwoIGJtcEltYWdlLCB4LCB5KTsKKwkJICAgCXVuc2lnbmVkIGxvbmcgcGl4ZWw9VFNYR2V0UGl4ZWwoIGJtcEltYWdlLCB4LCB5KTsKIAkJCSpiYml0cysrID0gKHBpeGVsID4+MTYpICYgMHhmZjsKIAkJCSpiYml0cysrID0gKHBpeGVsID4+IDgpICYgMHhmZjsKIAkJCSpiYml0cysrID0gIHBpeGVsICAgICAgICYgMHhmZjsKQEAgLTEyOTIsNyArMTI5Miw3IEBACiAJICAgCWJyZWFrOwogCX0KIAotCVhEZXN0cm95SW1hZ2UoIGJtcEltYWdlICk7CisJVFNYRGVzdHJveUltYWdlKCBibXBJbWFnZSApOwogCiAJaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSAwOwogICAgIH0KQEAgLTE0MzIsOCArMTQzMiw4IEBACiAgICAgICAgICAgICAvKiBGSVhNRTogdGhpcyBpcyB3cm9uZyEgKGJtQml0cyBpcyBhbHdheXMgTlVMTCkgKi8KICAgICAgICAgICAgIGlmIChiaXRzKSAqYml0cyA9IGJtcC5ibUJpdHM7CiAJICAgIC8qIGhtcGYgKi8KLQkgICAgZnByaW50ZihzdGRlcnIsImFsbG9jYXRpbmcgJWQgYnl0ZXMgb2YgbWVtb3J5XG4iLGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGgqYm1pLT5ibWlIZWFkZXIuYmlIZWlnaHQqNCk7Ci0JICAgIGlmIChiaXRzKSAqYml0cyA9IChMUEJZVEUpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxibWktPmJtaUhlYWRlci5iaVdpZHRoKmJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0KjQpOworCSAgICBmcHJpbnRmKHN0ZGVyciwiYWxsb2NhdGluZyAlbGQgYnl0ZXMgb2YgbWVtb3J5XG4iLGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGgqYm1pLT5ibWlIZWFkZXIuYmlIZWlnaHQqNCk7CisJICAgIGlmIChiaXRzKSAqYml0cyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksYm1pLT5ibWlIZWFkZXIuYmlXaWR0aCpibWktPmJtaUhlYWRlci5iaUhlaWdodCo0KTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAJfQogICAgIH0KZGlmZiAtLWdpdCBhL29iamVjdHMvbWV0YWZpbGUuYyBiL29iamVjdHMvbWV0YWZpbGUuYwppbmRleCA5ZmFiYzdjLi5iMzkwYjA0IDEwMDY0NAotLS0gYS9vYmplY3RzL21ldGFmaWxlLmMKKysrIGIvb2JqZWN0cy9tZXRhZmlsZS5jCkBAIC01Niw3ICs1Niw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRNZXRhZmlsZTE2ICAgKEdESS4xMjQpCisgKiAgICAgICAgIEdldE1ldGFGaWxlMTYgICAoR0RJLjEyNCkKICAqLwogSE1FVEFGSUxFMTYgV0lOQVBJIEdldE1ldGFGaWxlMTYoIExQQ1NUUiBscEZpbGVuYW1lICkKIHsKQEAgLTY1LDkgKzY1LDE0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRNZXRhZmlsZTMyQSAgIChHREkzMi4xOTcpCisgKiAgICAgICAgIEdldE1ldGFGaWxlMzJBICAgKEdESTMyLjE5NykKKyAqCisgKiAgUmVhZCBhIG1ldGFmaWxlIGZyb20gYSBmaWxlLiBSZXR1cm5zIGhhbmRsZSB0byBhIGRpc2stYmFzZWQgbWV0YWZpbGUuCiAgKi8KLUhNRVRBRklMRTMyIFdJTkFQSSBHZXRNZXRhRmlsZTMyQSggTFBDU1RSIGxwRmlsZW5hbWUgKQorSE1FVEFGSUxFMzIgV0lOQVBJIEdldE1ldGFGaWxlMzJBKCAKKwkJCQkgIExQQ1NUUiBscEZpbGVuYW1lIAorCQkgICAgICAvKiBwb2ludGVyIHRvIHN0cmluZyBjb250YWluaW5nIGZpbGVuYW1lIHRvIHJlYWQgKi8KKykKIHsKICAgSE1FVEFGSUxFMTYgaG1mOwogICBNRVRBSEVBREVSICptaDsKQEAgLTEzNiw3ICsxNDEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgR2V0TWV0YWZpbGUzMlcgICAoR0RJMzIuMTk5KQorICogICAgICAgICBHZXRNZXRhRmlsZTMyVyAgIChHREkzMi4xOTkpCiAgKi8KIEhNRVRBRklMRTMyIFdJTkFQSSBHZXRNZXRhRmlsZTMyVyggTFBDV1NUUiBscEZpbGVuYW1lICkKIHsKQEAgLTE1OSw4ICsxNjQsMjUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBDb3B5TWV0YUZpbGUzMkEgICAoR0RJMzIuMjMpCisgKgorICogIENvcGllcyB0aGUgbWV0YWZpbGUgY29ycmVzcG9uZGluZyB0byBoU3JjTWV0YUZpbGUgdG8gZWl0aGVyCisgKiAgYSBkaXNrIGZpbGUsIGlmIGEgZmlsZW5hbWUgaXMgZ2l2ZW4sIG9yIHRvIGEgbmV3IG1lbW9yeSBiYXNlZAorICogIG1ldGFmaWxlLCBpZiBscEZpbGVOYW1lIGlzIE5VTEwuCisgKgorICogUkVUVVJOUworICoKKyAqICBIYW5kbGUgdG8gbWV0YWZpbGUgY29weSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisgKgorICogQlVHUworICoKKyAqICBDb3B5aW5nIHRvIGRpc2sgcmV0dXJucyBOVUxMIGV2ZW4gaWYgc3VjY2Vzc2Z1bC4KICAqLwotSE1FVEFGSUxFMzIgV0lOQVBJIENvcHlNZXRhRmlsZTMyQShITUVUQUZJTEUzMiBoU3JjTWV0YUZpbGUsIExQQ1NUUiBscEZpbGVuYW1lKQorSE1FVEFGSUxFMzIgV0lOQVBJIENvcHlNZXRhRmlsZTMyQSgKKwkJCQkgICBITUVUQUZJTEUzMiBoU3JjTWV0YUZpbGUsIAorCQkJCSAgIC8qIGhhbmRsZSBvZiBtZXRhZmlsZSB0byBjb3B5ICovCisJCQkJICAgTFBDU1RSIGxwRmlsZW5hbWUKKwkJCQkgICAvKiBmaWxlbmFtZSBpZiBjb3B5aW5nIHRvIGEgZmlsZSAqLworKQogewogICAgIEhNRVRBRklMRTE2IGhhbmRsZSA9IDA7CiAgICAgTUVUQUhFQURFUiAqbWg7CkBAIC0yMTQsNyArMjM2LDE3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgSXNWYWxpZE1ldGFGaWxlICAgKEdESS40MTApCi0gKiAgICAgICAgIChUaGlzIGlzIG5vdCBleGFjdGx5IHdoYXQgd2luZG93cyBkb2VzLCBzZWUgIlVuZG9jIFdpbiIpCisgKgorICogIEF0dGVtcHRzIHRvIGNoZWNrIGlmIGEgZ2l2ZW4gbWV0YWZpbGUgaXMgY29ycmVjdGx5IGZvcm1hdHRlZC4KKyAqICBDdXJyZW50bHksIHRoZSBvbmx5IHRoaW5ncyB2ZXJpZmllZCBhcmUgc2V2ZXJhbCBwcm9wZXJ0aWVzIG9mIHRoZQorICogIGhlYWRlci4KKyAqCisgKiBSRVRVUk5TCisgKiAgVFJVRSBpZiBobWYgcGFzc2VzIHNvbWUgdGVzdHMgZm9yIGJlaW5nIGEgdmFsaWQgbWV0YWZpbGUsIEZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBCVUdTCisgKiAgVGhpcyBpcyBub3QgZXhhY3RseSB3aGF0IHdpbmRvd3MgZG9lcywgc2VlIF9VbmRvY3VtZW50ZWRfV2luZG93c18KKyAqICBmb3IgZGV0YWlscy4KICAqLwogCiBCT09MMTYgV0lOQVBJIElzVmFsaWRNZXRhRmlsZShITUVUQUZJTEUxNiBobWYpCkBAIC0yMzUsNiArMjY3LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBQbGF5TWV0YUZpbGUxNiAgIChHREkuMTIzKQorICoKICAqLwogQk9PTDE2IFdJTkFQSSBQbGF5TWV0YUZpbGUxNiggSERDMTYgaGRjLCBITUVUQUZJTEUxNiBobWYgKQogewpAQCAtMjQzLDggKzI3NiwxNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIFBsYXlNZXRhRmlsZTMyICAgKEdESTMyLjI2NSkKKyAqCisgKiAgUmVuZGVycyB0aGUgbWV0YWZpbGUgc3BlY2lmaWVkIGJ5IGhtZiBpbiB0aGUgREMgc3BlY2lmaWVkIGJ5CisgKiAgaGRjLiBSZXR1cm5zIEZBTFNFIG9uIGZhaWx1cmUsIFRSVUUgb24gc3VjY2Vzcy4KICAqLwotQk9PTDMyIFdJTkFQSSBQbGF5TWV0YUZpbGUzMiggSERDMzIgaGRjLCBITUVUQUZJTEUzMiBobWYgKQorQk9PTDMyIFdJTkFQSSBQbGF5TWV0YUZpbGUzMiggCisJCQkgICAgIEhEQzMyIGhkYywgLyogaGFuZGxlIG9mIERDIHRvIHJlbmRlciBpbiAqLworCQkJICAgICBITUVUQUZJTEUzMiBobWYgLyogaGFuZGxlIG9mIG1ldGFmaWxlIHRvIHJlbmRlciAqLworKQogewogICAgIE1FVEFIRUFERVIgKm1oID0gKE1FVEFIRUFERVIgKilHbG9iYWxMb2NrMTYoaG1mKTsKICAgICBNRVRBUkVDT1JEICptcjsKQEAgLTMwMywxMCArMzQyLDI0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgRW51bU1ldGFGaWxlMTYgICAoR0RJLjE3NSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmllbHMgZGUgY2FycGVudGllciwgYXByaWwgMTk5NgorICoKKyAqICBMb29wIHRocm91Z2ggdGhlIG1ldGFmaWxlIHJlY29yZHMgaW4gaG1mLCBjYWxsaW5nIHRoZSB1c2VyLXNwZWNpZmllZAorICogIGZ1bmN0aW9uIGZvciBlYWNoIG9uZSwgc3RvcHBpbmcgd2hlbiB0aGUgdXNlcidzIGZ1bmN0aW9uIHJldHVybnMgRkFMU0UKKyAqICAod2hpY2ggaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsdXJlKQorICogIG9yIHdoZW4gbm8gcmVjb3JkcyBhcmUgbGVmdCAod2hpY2ggaXMgY29uc2lkZXJlZCB0byBiZSBzdWNjZXNzKS4gCisgKgorICogUkVUVVJOUworICogIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZS4KKyAqIAorICogSElTVE9SWQorICogICBOaWVscyBkZSBjYXJwZW50aWVyLCBhcHJpbCAxOTk2CiAgKi8KLUJPT0wxNiBXSU5BUEkgRW51bU1ldGFGaWxlMTYoIEhEQzE2IGhkYywgSE1FVEFGSUxFMTYgaG1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZFTlVNUFJPQzE2IGxwRW51bUZ1bmMsIExQQVJBTSBscERhdGEgKQorQk9PTDE2IFdJTkFQSSBFbnVtTWV0YUZpbGUxNiggCisJCQkgICAgIEhEQzE2IGhkYywgCisJCQkgICAgIEhNRVRBRklMRTE2IGhtZiwKKwkJCSAgICAgTUZFTlVNUFJPQzE2IGxwRW51bUZ1bmMsIAorCQkJICAgICBMUEFSQU0gbHBEYXRhIAorKQogewogICAgIE1FVEFIRUFERVIgKm1oID0gKE1FVEFIRUFERVIgKilHbG9iYWxMb2NrMTYoaG1mKTsKICAgICBNRVRBUkVDT1JEICptcjsKQEAgLTMxOSw2ICszNzIsNyBAQAogICAgIEhCUlVTSDMyIGhCcnVzaDsKICAgICBIRk9OVDMyIGhGb250OwogICAgIERDICpkYzsKKyAgICBCT09MMTYgcmVzdWx0ID0gVFJVRTsKICAgICAKICAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiRW51bU1ldGFGaWxlKCUwNHgsICUwNHgsICUwOGx4LCAlMDhseClcbiIsCiAJCSAgICAgaGRjLCBobWYsIChEV09SRClscEVudW1GdW5jLCBscERhdGEpOwpAQCAtMzQ1LDggKzM5OSwxMSBAQAogCW1yID0gKE1FVEFSRUNPUkQgKikoKGNoYXIgKiltaCArIG9mZnNldCk7CiAgICAgICAgIGlmICghbHBFbnVtRnVuYyggaGRjLCAoSEFORExFVEFCTEUxNiAqKXNwaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKE1FVEFSRUNPUkQgKikoKFVJTlQzMilzcFJlY29yZCArIG9mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWgtPm10Tm9PYmplY3RzLCAoTE9ORylscERhdGEpKQotCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaC0+bXROb09iamVjdHMsIChMT05HKWxwRGF0YSkpIHsKKwkgIHJlc3VsdCA9IEZBTFNFOworCSAgYnJlYWs7CisJfQorCQogCiAJb2Zmc2V0ICs9IChtci0+cmRTaXplICogMik7CiAgICAgfQpAQCAtMzY1LDE2ICs0MjIsMzcgQEAKICAgICAvKiBmcmVlIGhhbmRsZSB0YWJsZSAqLwogICAgIEdsb2JhbEZyZWUxNihoSFQpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIEJPT0wzMiBNRl9NZXRhX0NyZWF0ZVJlZ2lvbiggTUVUQVJFQ09SRCAqbXIsIEhSR04zMiBocmduICk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIFBsYXlNZXRhRmlsZVJlY29yZDE2ICAgKEdESS4xNzYpCisgKgorICogICBSZW5kZXIgYSBzaW5nbGUgbWV0YWZpbGUgcmVjb3JkIHNwZWNpZmllZCBieSAqbXIgaW4gdGhlIERDIGhkYywgd2hpbGUKKyAqICAgdXNpbmcgdGhlIGhhbmRsZSB0YWJsZSAqaHQsIG9mIGxlbmd0aCBuSGFuZGxlcywgCisgKiAgIHRvIHN0b3JlIG1ldGFmaWxlIG9iamVjdHMuCisgKgorICogQlVHUworICogIFRoZSBmb2xsb3dpbmcgbWV0YWZpbGUgcmVjb3JkcyBhcmUgdW5pbXBsZW1lbnRlZDoKKyAqCisgKiAgRlJBTUVSRUdJT04sIERSQVdURVhULCBTRVRESUJUT0RFViwgQU5JTUFURVBBTEVUVEUsIFNFVFBBTEVOVFJJRVMsCisgKiAgUkVTSVpFUEFMRVRURSwgRVhURkxPT0RGSUxMLCBSRVNFVERDLCBTVEFSVERPQywgU1RBUlRQQUdFLCBFTkRQQUdFLAorICogIEFCT1JURE9DLCBFTkRET0MsIENSRUFURUJSVVNILCBDUkVBVEVCSVRNQVBJTkRJUkVDVCwgYW5kIENSRUFURUJJVE1BUC4KKyAqCiAgKi8KLXZvaWQgV0lOQVBJIFBsYXlNZXRhRmlsZVJlY29yZDE2KCBIREMxNiBoZGMsIEhBTkRMRVRBQkxFMTYgKmh0LCBNRVRBUkVDT1JEICptciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgbkhhbmRsZXMgKQorCit2b2lkIFdJTkFQSSBQbGF5TWV0YUZpbGVSZWNvcmQxNiggCisJCQkJIEhEQzE2IGhkYywgCisJCQkJIC8qIERDIHRvIHJlbmRlciBtZXRhZmlsZSBpbnRvICovCisJCQkJIEhBTkRMRVRBQkxFMTYgKmh0LCAKKwkJCQkgLyogcG9pbnRlciB0byBoYW5kbGUgdGFibGUgZm9yIG1ldGFmaWxlIG9iamVjdHMgKi8KKwkJCQkgTUVUQVJFQ09SRCAqbXIsIAorCQkJCSAvKiBwb2ludGVyIHRvIG1ldGFmaWxlIHJlY29yZCB0byByZW5kZXIgKi8KKwkJCQkgVUlOVDE2IG5IYW5kbGVzIAorCQkJCSAvKiBzaXplIG9mIGhhbmRsZSB0YWJsZSAqLworKQogewogICAgIHNob3J0IHMxOwogICAgIEhBTkRMRTE2IGhuZGw7CkBAIC04MjAsMjIgKzg5OCwzMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBHZXRNZXRhRmlsZUJpdHMgICAoR0RJLjE1OSkKICAqCi0gKiBUcmFkZSBpbiBhIG1ldGEgZmlsZSBvYmplY3QgaGFuZGxlIGZvciBhIGhhbmRsZSB0byB0aGUgbWV0YSBmaWxlIG1lbW9yeQorICogVHJhZGUgaW4gYSBtZXRhZmlsZSBvYmplY3QgaGFuZGxlIGZvciBhIGhhbmRsZSB0byB0aGUgbWV0YWZpbGUgbWVtb3J5LgorICoKICAqLwogCi1IR0xPQkFMMTYgV0lOQVBJIEdldE1ldGFGaWxlQml0cyhITUVUQUZJTEUxNiBobWYpCitIR0xPQkFMMTYgV0lOQVBJIEdldE1ldGFGaWxlQml0cygKKwkJCQkgSE1FVEFGSUxFMTYgaG1mIC8qIG1ldGFmaWxlIGhhbmRsZSAqLworCQkJCSApCiB7CiAgICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIkdldE1ldGFGaWxlQml0czogaE1lbSBvdXQ6ICUwNHhcbiIsIGhtZik7Ci0KICAgICByZXR1cm4gaG1mOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIFNldE1ldGFGaWxlQml0cyAgIChHREkuMTYwKQogICoKLSAqIFRyYWRlIGluIGEgbWV0YSBmaWxlIG1lbW9yeSBoYW5kbGUgZm9yIGEgaGFuZGxlIHRvIGEgbWV0YSBmaWxlIG9iamVjdAorICogVHJhZGUgaW4gYSBtZXRhZmlsZSBtZW1vcnkgaGFuZGxlIGZvciBhIGhhbmRsZSB0byBhIG1ldGFmaWxlIG9iamVjdC4KKyAqIFRoZSBtZW1vcnkgcmVnaW9uIHNob3VsZCBob2xkIGEgcHJvcGVyIG1ldGFmaWxlLCBvdGhlcndpc2UKKyAqIHByb2JsZW1zIHdpbGwgb2NjdXIgd2hlbiBpdCBpcyB1c2VkLiBWYWxpZGl0eSBvZiB0aGUgbWVtb3J5IGlzIG5vdAorICogY2hlY2tlZC4gVGhlIGZ1bmN0aW9uIGlzIGVzc2VudGlhbGx5IGp1c3QgdGhlIGlkZW50aXR5IGZ1bmN0aW9uLgogICovCi1ITUVUQUZJTEUxNiBXSU5BUEkgU2V0TWV0YUZpbGVCaXRzKCBIR0xPQkFMMTYgaE1lbSApCitITUVUQUZJTEUxNiBXSU5BUEkgU2V0TWV0YUZpbGVCaXRzKCAKKwkJCQkgICBIR0xPQkFMMTYgaE1lbSAKKwkJCS8qIGhhbmRsZSB0byBhIG1lbW9yeSByZWdpb24gaG9sZGluZyBhIG1ldGFmaWxlICovCispCiB7CiAgICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIlNldE1ldGFGaWxlQml0czogaG1mIG91dDogJTA0eFxuIiwgaE1lbSk7CiAKQEAgLTg0NCw2ICs5MzAsMTMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBTZXRNZXRhRmlsZUJpdHNCZXR0ZXIgICAoR0RJLjE5NikKKyAqCisgKiBUcmFkZSBpbiBhIG1ldGFmaWxlIG1lbW9yeSBoYW5kbGUgZm9yIGEgaGFuZGxlIHRvIGEgbWV0YWZpbGUgb2JqZWN0LAorICogbWFraW5nIGEgY3Vyc29yeSBjaGVjayAodXNpbmcgSXNWYWxpZE1ldGFGaWxlKCkpIHRoYXQgdGhlIG1lbW9yeQorICogaGFuZGxlIHBvaW50cyB0byBhIHZhbGlkIG1ldGFmaWxlLgorICoKKyAqIFJFVFVSTlMKKyAqICBIYW5kbGUgdG8gYSBtZXRhZmlsZSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuLgogICovCiBITUVUQUZJTEUxNiBXSU5BUEkgU2V0TWV0YUZpbGVCaXRzQmV0dGVyKCBITUVUQUZJTEUxNiBoTWV0YSApCiB7CmRpZmYgLS1naXQgYS9vYmplY3RzL29lbWJpdG1hcC5jIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwppbmRleCAzYTdiY2FhLi45ZmI1ODgxIDEwMDY0NAotLS0gYS9vYmplY3RzL29lbWJpdG1hcC5jCisrKyBiL29iamVjdHMvb2VtYml0bWFwLmMKQEAgLTcsOSArNyw5IEBACiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotI2luY2x1ZGUgPFgxMS94cG0uaD4KKyNpbmNsdWRlICJ0c194bGliLmgiCisjaW5jbHVkZSAidHNfeHV0aWwuaCIKKyNpbmNsdWRlICJ0c194cG0uaCIKICNpbmNsdWRlICJnZGkuaCIKICNpbmNsdWRlICJiaXRtYXAuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgpAQCAtMzMwLDE0ICszMzAsMTQgQEAKICAgICBpbnQgZXJyOwogCiAgICAgYXR0cnMgPSAoWHBtQXR0cmlidXRlcyAqKUhFQVBfeGFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHBtQXR0cmlidXRlc1NpemUoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNYcG1BdHRyaWJ1dGVzU2l6ZSgpICk7CiAgICAgYXR0cnMtPnZhbHVlbWFzayAgICA9IFhwbUNvbG9ybWFwIHwgWHBtRGVwdGggfCBYcG1Db2xvclN5bWJvbHMgfFhwbUhvdHNwb3Q7CiAgICAgYXR0cnMtPmNvbG9ybWFwICAgICA9IENPTE9SX0dldENvbG9ybWFwKCk7CiAgICAgYXR0cnMtPmRlcHRoICAgICAgICA9IGRlc2NyLT5jb2xvciA/IHNjcmVlbkRlcHRoIDogMTsKICAgICBhdHRycy0+Y29sb3JzeW1ib2xzID0gKGF0dHJzLT5kZXB0aCA+IDEpID8gT0JNX0NvbG9ycyA6IE9CTV9CbGFja0FuZFdoaXRlOwogICAgIGF0dHJzLT5udW1zeW1ib2xzICAgPSAoYXR0cnMtPmRlcHRoID4gMSkgPyBOQl9DT0xPUl9TWU1CT0xTIDogMjsKICAgICAgICAgCi0gICAgZXJyID0gWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEoIGRpc3BsYXksIHJvb3RXaW5kb3csIGRlc2NyLT5kYXRhLAorICAgIGVyciA9IFRTWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEoIGRpc3BsYXksIHJvb3RXaW5kb3csIGRlc2NyLT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl4bWFwLCAmcGl4bWFzaywgYXR0cnMgKTsKIAogICAgIGlmIChlcnIgIT0gWHBtU3VjY2VzcykKQEAgLTM1NSw4ICszNTUsOCBAQAogICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBhdHRycyApOwogICAgIGlmICghZGVzY3ItPmJpdG1hcCkKICAgICB7Ci0gICAgICAgIGlmIChwaXhtYXApIFhGcmVlUGl4bWFwKCBkaXNwbGF5LCBwaXhtYXAgKTsKLSAgICAgICAgaWYgKHBpeG1hc2spIFhGcmVlUGl4bWFwKCBkaXNwbGF5LCBwaXhtYXNrICk7CisgICAgICAgIGlmIChwaXhtYXApIFRTWEZyZWVQaXhtYXAoIGRpc3BsYXksIHBpeG1hcCApOworICAgICAgICBpZiAocGl4bWFzaykgVFNYRnJlZVBpeG1hcCggZGlzcGxheSwgcGl4bWFzayApOwogICAgICAgICBpZiAoZGVzY3ItPmJpdG1hcCkgR0RJX0ZyZWVPYmplY3QoIGRlc2NyLT5iaXRtYXAgKTsKICAgICAgICAgaWYgKGRlc2NyLT5uZWVkX21hc2sgJiYgZGVzY3ItPm1hc2spIEdESV9GcmVlT2JqZWN0KCBkZXNjci0+bWFzayApOwogICAgICAgICByZXR1cm4gRkFMU0U7CkBAIC00NTYsMjMgKzQ1NiwyMyBAQAogICAgIHsKICAgICAgICAgICAvKiBJbnZlcnQgdGhlIG1hc2sgKi8KIAotICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIEJJVE1BUF9tb25vR0MsIEdYaW52ZXJ0ICk7Ci0gICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBibXBBbmQtPnBpeG1hcCwgQklUTUFQX21vbm9HQywgMCwgMCwKKyAgICAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIEJJVE1BUF9tb25vR0MsIEdYaW52ZXJ0ICk7CisgICAgICAgIFRTWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGJtcEFuZC0+cGl4bWFwLCBCSVRNQVBfbW9ub0dDLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgYm1wQW5kLT5iaXRtYXAuYm1XaWR0aCwgYm1wQW5kLT5iaXRtYXAuYm1IZWlnaHQgKTsKLSAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBCSVRNQVBfbW9ub0dDLCBHWGNvcHkgKTsKKyAgICAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIEJJVE1BUF9tb25vR0MsIEdYY29weSApOwogCiAgICAgICAgICAgLyogU2V0IHRoZSBtYXNrZWQgcGl4ZWxzIHRvIGJsYWNrICovCiAKICAgICAgICAgaWYgKGJtcFhvci0+Yml0bWFwLmJtQml0c1BpeGVsICE9IDEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFhTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBCSVRNQVBfY29sb3JHQywKKyAgICAgICAgICAgIFRTWFNldEZvcmVncm91bmQoIGRpc3BsYXksIEJJVE1BUF9jb2xvckdDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1RvUGh5c2ljYWwoIE5VTEwsIFJHQigwLDAsMCkgKSk7Ci0gICAgICAgICAgICBYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgQklUTUFQX2NvbG9yR0MsIDAgKTsKLSAgICAgICAgICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgQklUTUFQX2NvbG9yR0MsIEdYb3IgKTsKLSAgICAgICAgICAgIFhDb3B5UGxhbmUoZGlzcGxheSwgYm1wQW5kLT5waXhtYXAsIGJtcFhvci0+cGl4bWFwLCBCSVRNQVBfY29sb3JHQywKKyAgICAgICAgICAgIFRTWFNldEJhY2tncm91bmQoIGRpc3BsYXksIEJJVE1BUF9jb2xvckdDLCAwICk7CisgICAgICAgICAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgQklUTUFQX2NvbG9yR0MsIEdYb3IgKTsKKyAgICAgICAgICAgIFRTWENvcHlQbGFuZShkaXNwbGF5LCBibXBBbmQtPnBpeG1hcCwgYm1wWG9yLT5waXhtYXAsIEJJVE1BUF9jb2xvckdDLAogICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBibXBYb3ItPmJpdG1hcC5ibVdpZHRoLCBibXBYb3ItPmJpdG1hcC5ibUhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSApOwotICAgICAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBCSVRNQVBfY29sb3JHQywgR1hjb3B5ICk7CisgICAgICAgICAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgQklUTUFQX2NvbG9yR0MsIEdYY29weSApOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL3BhbGV0dGUuYyBiL29iamVjdHMvcGFsZXR0ZS5jCmluZGV4IGExZjYxNTMuLjY3ZjQ0MTEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGFsZXR0ZS5jCisrKyBiL29iamVjdHMvcGFsZXR0ZS5jCkBAIC0xMCw3ICsxMCw3IEBACiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKIAogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgImNvbG9yLmgiCmRpZmYgLS1naXQgYS9vYmplY3RzL3JlZ2lvbi5jIGIvb2JqZWN0cy9yZWdpb24uYwppbmRleCBhMjZjYjk2Li5mM2FkZWU0IDEwMDY0NAotLS0gYS9vYmplY3RzL3JlZ2lvbi5jCisrKyBiL29iamVjdHMvcmVnaW9uLmMKQEAgLTUwNSw3ICs1MDUsNyBAQAogICAgIGlmKGNvdW50IDwgKHNpemUgKyBzaXplb2YoUkdOREFUQUhFQURFUikpIHx8IHJnbmRhdGEgPT0gTlVMTCkKICAgICB7CiAgICAgICAgIEdESV9IRUFQX1VOTE9DSyggaHJnbiApOwotICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgcmV0dXJuIHNpemUgKyBzaXplb2YoUkdOREFUQUhFQURFUik7CiAgICAgfQogCiAgICAgcmduZGF0YS0+cmRoLmR3U2l6ZSA9IHNpemVvZihSR05EQVRBSEVBREVSKTsKZGlmZiAtLWdpdCBhL29sZS9jb21wb2JqLmMgYi9vbGUvY29tcG9iai5jCmluZGV4IDk2YTMwMGUuLmVmNDc2YTkgMTAwNjQ0Ci0tLSBhL29sZS9jb21wb2JqLmMKKysrIGIvb2xlL2NvbXBvYmouYwpAQCAtNCwyMiArNCwyNCBAQAogICoJQ29weXJpZ2h0IDE5OTUJTWFydGluIHZvbiBMb2V3aXMKICAqLwogCi0vKglBdCB0aGUgbW9tZW50LCB0aGVzZSBhcmUgb25seSBlbXB0eSBzdHVicy4KLSAqLwogI2RlZmluZSBJTklUR1VJRAogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSAib2xlLmgiCiAjaW5jbHVkZSAib2xlMi5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiY29tcG9iai5oIgogI2luY2x1ZGUgImludGVyZmFjZXMuaCIKICNpbmNsdWRlICJzaGxvYmouaCIKICNpbmNsdWRlICJkZHJhdy5oIgogI2luY2x1ZGUgImRzb3VuZC5oIgorI2luY2x1ZGUgImRpbnB1dC5oIgorI2luY2x1ZGUgImQzZC5oIgogCiBEV09SRCBjdXJyZW50TWFsbG9jPTA7CiAKQEAgLTE1NSw5ICsxNTcsOCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDTFNJREZyb21TdHJpbmcgW0NPTVBPQkouMTldCisgKiAgICAgICAgICAgU3RyaW5nRnJvbUNMU0lEIFtDT01QT0JKLjE5XQogICovCi0KIE9MRVNUQVRVUyBXSU5BUEkgU3RyaW5nRnJvbUNMU0lEKGNvbnN0IENMU0lEICppZCwgTFBTVFIgaWRzdHIpCiB7CiAgIHN0YXRpYyBjb25zdCBjaGFyICpoZXggPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CkBAIC0xODcsMyArMTg4LDk4IEBACiAgIHJldHVybiBPTEVfT0s7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENMU0lERnJvbVByb2dJRCBbQ09NUE9CSi42MV0KKyAqLworCitPTEVTVEFUVVMgV0lOQVBJIENMU0lERnJvbVByb2dJRChMUENTVFIgcHJvZ2lkLExQQ0xTSUQgcmlpZCkKK3sKKwljaGFyCSpidWYsYnVmMls4MF07CisJRFdPUkQJYnVmMmxlbjsKKwlIUkVTVUxUCWVycjsKKwlIS0VZCXhoa2V5OworCisJYnVmID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzdHJsZW4ocHJvZ2lkKSs4KTsKKwlzcHJpbnRmKGJ1ZiwiJXNcXENMU0lEIixwcm9naWQpOworCWlmICgoZXJyPVJlZ09wZW5LZXkzMkEoSEtFWV9DTEFTU0VTX1JPT1QsYnVmLCZ4aGtleSkpKSB7CisJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxidWYpOworCQlyZXR1cm4gT0xFX0VSUk9SX0dFTkVSSUM7CisJfQorCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxidWYpOworCWJ1ZjJsZW4gPSBzaXplb2YoYnVmMik7CisJaWYgKChlcnI9UmVnUXVlcnlWYWx1ZTMyQSh4aGtleSxOVUxMLGJ1ZjIsJmJ1ZjJsZW4pKSkgeworCQlSZWdDbG9zZUtleSh4aGtleSk7CisJCXJldHVybiBPTEVfRVJST1JfR0VORVJJQzsKKwl9CisJUmVnQ2xvc2VLZXkoeGhrZXkpOworCXJldHVybiBDTFNJREZyb21TdHJpbmcoYnVmMixyaWlkKTsKK30KKworT0xFU1RBVFVTIFdJTkFQSSBMb29rdXBFVGFzayhMUFZPSUQgcDEsTFBWT0lEIHAyKSB7CisJZnByaW50ZihzdGRlcnIsIkxvb2t1cEVUYXNrKCVwLCVwKSxzdHViIVxuIixwMSxwMik7CisJcmV0dXJuIDA7Cit9CisKK09MRVNUQVRVUyBXSU5BUEkgQ2FsbE9iamVjdEluV09XKExQVk9JRCBwMSxMUFZPSUQgcDIpIHsKKwlmcHJpbnRmKHN0ZGVyciwiQ2FsbE9iamVjdEluV09XKCVwLCVwKSxzdHViIVxuIixwMSxwMik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUNvUmVnaXN0ZXJDbGFzc09iamVjdCBbQ09NUE9CSi41XQorICovCitPTEVTVEFUVVMgV0lOQVBJIENvUmVnaXN0ZXJDbGFzc09iamVjdCgKKwlSRUZDTFNJRCByY2xzaWQsIExQVU5LTk9XTiBwVW5rLERXT1JEIGR3Q2xzQ29udGV4dCxEV09SRCBmbGFncywKKwlMUERXT1JEIGxwZHdSZWdpc3RlcgorKSB7CisJY2hhcglidWZbODBdOworCisJU3RyaW5nRnJvbUNMU0lEKHJjbHNpZCxidWYpOworCisJZnByaW50ZihzdGRlcnIsIkNvUmVnaXN0ZXJDbGFzc09iamVjdCglcywlcCwweCUwOGx4LDB4JTA4bHgsJXApLHN0dWJcbiIsCisJCWJ1ZixwVW5rLGR3Q2xzQ29udGV4dCxmbGFncyxscGR3UmVnaXN0ZXIKKwkpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlDb1JlZ2lzdGVyQ2xhc3NPYmplY3QgW0NPTVBPQkouMjddCisgKi8KK09MRVNUQVRVUyBXSU5BUEkgQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIxNigKKwlMUE1FU1NBR0VGSUxURVIgbHBNZXNzYWdlRmlsdGVyLExQTUVTU0FHRUZJTFRFUiAqbHBscE1lc3NhZ2VGaWx0ZXIKKykgeworCWZwcmludGYoc3RkZXJyLCJDb1JlZ2lzdGVyTWVzc2FnZUZpbHRlciglcCwlcCksc3R1YiFcbiIsCisJCWxwTWVzc2FnZUZpbHRlcixscGxwTWVzc2FnZUZpbHRlcgorCSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvQ3JlYXRlSW5zdGFuY2UgW0NPTVBPQkouMTMsIE9MRTMyLjddCisgKi8KK0hSRVNVTFQgV0lOQVBJIENvQ3JlYXRlSW5zdGFuY2UoUkVGQ0xTSUQgcmNsc2lkLCBMUFVOS05PV04gcFVua091dGVyLAorCQkJCURXT1JEIGR3Q2xzQ29udGV4dCwgUkVGSUlEIHJpaWQsIExQVk9JRCAqcHB2KQoreworCWZwcmludGYoc3RkZXJyLCAiQ29DcmVhdGVJbnN0YW5jZSgpOiBzdHViICFcbiIpOworCSpwcHYgPSBOVUxMOworCXJldHVybiBTX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDb0ZyZWVVbnVzZWRMaWJyYXJpZXMgW0NPTVBPQkouMTddCisgKi8KK3ZvaWQgV0lOQVBJIENvRnJlZVVudXNlZExpYnJhcmllcygpCit7CisJZnByaW50ZihzdGRlcnIsICJDb0ZyZWVVbnVzZWRMaWJyYXJpZXMoKTogc3R1YiAhXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ29GaWxlVGltZU5vdyBbQ09NUE9CSi44MiwgT0xFMzIuMTBdCisgKgorICoJc3RvcmVzIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGluIGxwRmlsZVRpbWUKKyAqLworSFJFU1VMVCBXSU5BUEkgQ29GaWxlVGltZU5vdyhGSUxFVElNRSAqbHBGaWxlVGltZSkKK3sKKwlET1NGU19Vbml4VGltZVRvRmlsZVRpbWUodGltZShOVUxMKSwgbHBGaWxlVGltZSwgMCk7CisJcmV0dXJuIFNfT0s7Cit9CmRpZmYgLS1naXQgYS9vbGUvb2xlMi5jIGIvb2xlL29sZTIuYwppbmRleCBmY2UwMWFkLi41NjViMGE2IDEwMDY0NAotLS0gYS9vbGUvb2xlMi5jCisrKyBiL29sZS9vbGUyLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvUmVnaXN0ZXJNZXNzYWdlRmlsdGVyICAgW09MRTMyLjM4XQogICovCi1IUkVTVUxUIENvUmVnaXN0ZXJNZXNzYWdlRmlsdGVyKAorSFJFU1VMVCBXSU5BUEkgQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIzMigKICAgICBMUE1FU1NBR0VGSUxURVIgbHBNZXNzYWdlRmlsdGVyLAkvKiBQb2ludGVyIHRvIGludGVyZmFjZSAqLwogICAgIExQTUVTU0FHRUZJTFRFUiAqbHBscE1lc3NhZ2VGaWx0ZXIJLyogSW5kaXJlY3QgcG9pbnRlciB0byBwcmlvciBpbnN0YW5jZSBpZiBub24tTlVMTCAqLwogKSB7CmRpZmYgLS1naXQgYS9vbGUvb2xlMmRpc3AuYyBiL29sZS9vbGUyZGlzcC5jCmluZGV4IDc2ZjYxODEuLjQwNWNlNjYgMTAwNjQ0Ci0tLSBhL29sZS9vbGUyZGlzcC5jCisrKyBiL29sZS9vbGUyZGlzcC5jCkBAIC01LDcgKzUsOSBAQAogICovCiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAib2xlLmgiCiAjaW5jbHVkZSAib2xlMi5oIgorI2luY2x1ZGUgImludGVyZmFjZXMuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTkyLDMgKzk0LDE3IEBACiB7CiAJcmV0dXJuIHN0cmxlbihCU1RSX0dldEFkZHIoc3RyKSk7CiB9CisKK09MRVNUQVRVUyBXSU5BUEkgQ3JlYXRlRGlzcFR5cGVJbmZvKElOVEVSRkFDRURBVEEgKiBwaWRhdGEsTENJRCBsY2lkLExQVk9JRC8qSVR5cGVJbmZvKi8gKiAqIHBwdGluZm8pIHsKKwlmcHJpbnRmKHN0ZGVyciwiQ3JlYXRlRGlzcFR5cGVJbmZvKCVwLCVsZCwlcCksc3R1YlxuIixwaWRhdGEsbGNpZCxwcHRpbmZvKTsKKwlyZXR1cm4gMDsKK30KKworT0xFU1RBVFVTIFdJTkFQSSBSZWdpc3RlckFjdGl2ZU9iamVjdCgKKwlJVW5rbm93biAqIHB1bmssUkVGQ0xTSUQgcmNsc2lkLERXT1JEIGR3RmxhZ3MsIERXT1JEICogcGR3UmVnaXN0ZXIKKykgeworCWNoYXIJYnVmWzgwXTsKKwlTdHJpbmdGcm9tQ0xTSUQocmNsc2lkLGJ1Zik7CisJZnByaW50ZihzdGRlcnIsIlJlZ2lzdGVyQWN0aXZlT2JqZWN0KCVwLCVzLDB4JTA4bHgsJXApLHN0dWJcbiIscHVuayxidWYsZHdGbGFncyxwZHdSZWdpc3Rlcik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vbGUvb2xlMm5scy5jIGIvb2xlL29sZTJubHMuYwppbmRleCA2ZjE4MTAwLi41MDBhM2ZlIDEwMDY0NAotLS0gYS9vbGUvb2xlMm5scy5jCisrKyBiL29sZS9vbGUybmxzLmMKQEAgLTIxMiwxMCArMjEyLDExIEBACiAgLyogY2FzZSBMQU5HX1J1OiByZXR1cm4gMHgxOTsgKi8gICAgICAvKiBSdXNzaWFuICovCiAgLyogY2FzZSBMQU5HX0NyOiByZXR1cm4gMHgxYTsgKi8gICAgICAvKiBDcm9hdGlhbiAqLwogIC8qIGNhc2UgTEFOR19TbDogcmV0dXJuIDB4MWI7ICovICAgICAgLyogU2xvdmFrICovCi0gLyogY2FzZSBMQU5HX1N3OiByZXR1cm4gMHgxZDsgKi8gICAgICAvKiBTd2VkaXNoICovCisgICAgY2FzZSBMQU5HX1N3OiByZXR1cm4gMHgxZDsgICAgICAgICAvKiBTd2VkaXNoICovCiAgLyogY2FzZSBMQU5HX1R1OiByZXR1cm4gMHgxZjsgKi8gICAgICAvKiBUdXJraXNoICovCiAgLyogY2FzZSBMQU5HX1N2OiByZXR1cm4gMHgyNDsgKi8gICAgICAvKiBTbG92ZW5pYW4gKi8KICAgICBjYXNlIExBTkdfRW86IHJldHVybiAweDI1OyAgICAgICAgIC8qIEVzcGVyYW50byAobm90IG9mZmljaWFsKSAqLworICAgIGNhc2UgTEFOR19DYTogcmV0dXJuIDB4MjY7ICAgICAgICAgLyogQ2F0YWxhbiAqLwogCiAgICAgZGVmYXVsdDoKIAlyZXR1cm4gMHgwMDsgICAgICAgICAgICAgICAgICAgLyogTmV1dHJhbCBsYW5ndWFnZSAqLwpAQCAtMTY3Niw2ICsxNjc3LDExMCBAQAogCX0KICAgICBicmVhazsgLyogTEFORyhQbykgKi8KIAorY2FzZSBMQU5HX1N3OgorICAgIAlzd2l0Y2ggKExDVHlwZSkgeworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjFkIikKK0xPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJTdmVuc2thIikKK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTd2VkaXNoIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJTViIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiU3ZlbnNrYSIpCitMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCI0NSIpCitMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJTV0UiKQorTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiU3dlZGVuIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJTVkUiKQorTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIlN2ZXJpZ2UiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIxZCIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDUiKQorLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLworLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KK0xPQ1ZBTChMT0NBTEVfU0xJU1QsIjsiKQorTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCitMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCIsIikKK0xPQ1ZBTChMT0NBTEVfU1RIT1VTQU5ELCIuIikKKy8qIExPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKSAqLworTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKK0xPQ1ZBTChMT0NBTEVfSUxaRVJPLCIxIikKKy8qIExPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikgKi8KKy8qIExPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUykgKi8KK0xPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCJrciIpCisvKiBMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKSAqLworTE9DVkFMKExPQ0FMRV9TTU9OREVDSU1BTFNFUCwiLCIpCitMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCwiLiIpCisvKiBMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykgKi8KK0xPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQorLyogTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpICovCitMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCitMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKK0xPQ1ZBTChMT0NBTEVfU0RBVEUsIi4iKQorTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCitMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsImRkL01NLXl5eXkiKQorTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsImRkZCwgZC4gTU1NTSB5eXl5IikKKy8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCitMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKKy8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLworTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCisvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCisvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLworTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKKy8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLworLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCitMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikKK0xPQ1ZBTChMT0NBTEVfUzIzNTksICIiKQorLyogTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKSAqLworLyogTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUikgKi8KKy8qIExPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLKSAqLworLyogTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKSAqLworTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsIk3lbmRhZyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwiVGlzZGFnIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJPbnNkYWciKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIlRvcnNkYWciKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsIkZyZWRhZyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiTPZyZGFnIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJT9m5kYWciKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIk3lIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJUaSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiT24iKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIlRvIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJGciIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiTPYiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIlP2IikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIkphbnVhcmkiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMiwiRmVicnVhcmkiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywiTWFycyIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJBcHJpbCIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWoiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwiSnVuaSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJKdWxpIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIkF1Z3VzdGkiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwiU2VwdGVtYmVyIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJPa3RvYmVyIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCJOb3ZlbWJlciIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwiRGVjZW1iZXIiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsIiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCJKYW4iKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiRmViIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsIk1hciIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCJBcHIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwiTWFqIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsIkp1biIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCJKdWwiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiQXVnIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksIlNlcCIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwiT2t0IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJOb3YiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIkRlYyIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKK0xPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTiwgIiIpCitMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICItIikKK0xPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOLCAiMyIpCitMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwgIjMiKQorTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMsICIxIikKK0xPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UsICIwIikKK0xPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiMSIpCitMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCAiMCIpCisJZGVmYXVsdDogZm91bmQ9MDticmVhazsKKwl9CisgICAgYnJlYWs7IC8qIExBTkcoU3cpICovCiAKIC8qSW5zZXJ0IG90aGVyIGxhbmd1YWdlcyBoZXJlKi8KIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cgYi9wcm9ncmFtcy9ub3RlcGFkL0NoYW5nZUxvZwppbmRleCAwYTEzYWY5Li4xNjYyMDk0IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL0NoYW5nZUxvZworKysgYi9wcm9ncmFtcy9ub3RlcGFkL0NoYW5nZUxvZwpAQCAtMSwzICsxLDcgQEAKK1N1biBKYW4gMTggMjM6MDU6MDQgMTk5OCAgS2FybCBCYWNrc3Ry9m0gPGthcmxfYkBnZW9jaXRpZXMuY29tPgorCSogW1N3LnJjXQorCUFkZGVkL3VwZGF0ZWQgU3dlZGlzaCBsYW5ndWFnZSBzdXBwb3J0LgorCiBUdWUgRGVjIDIzIDIzOjM1OjA0IDE5OTcgIE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KICAgICAgICAqIEZpeGVkIGxvdHMgb2YgYnVncyB3LyByZXNvdXJjZXMgaW4gKi5yYwogICAgICAgICogbW92ZWQgW25vdGVwYWQuY10gaW50byBbbWFpbi5jXQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4KaW5kZXggZWQ1ZmZlMS4uNmIyNTRmNyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlLmluCkBAIC04LDcgKzgsNyBAQAogQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKIFJDRkxBR1MgICA9IC13MzIgLWgKIAotTEFOR1VBR0VTICAgPSBFbiBEZQorTEFOR1VBR0VTICAgPSBFbiBEZSBTdwogTElDRU5TRUxBTkcgPSBFbgogCiBNT1NUU1JDUyA9IFwKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvU3cucmMgYi9wcm9ncmFtcy9ub3RlcGFkL1N3LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNmQ0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9ub3RlcGFkL1N3LnJjCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBOb3RlcGFkIChTd2VkaXNoIHJlc291cmNlcykKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CisgKiBTd2VkaXNoIGxhbmd1YWdlIGJ5IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KKyAqLworCisjZGVmaW5lIExBTkdVQUdFX0lEICAgICAgICAgICAgICAgICAgU3cKKyNkZWZpbmUgTEFOR1VBR0VfTlVNQkVSICAgICAgICAgICAgICAxZAorI2RlZmluZSBMQU5HVUFHRV9NRU5VX0lURU0gICAgICAgICAgICImU3ZlbnNrYSIKKworLyogTWVudSAqLworCisjZGVmaW5lIE1FTlVfRklMRSAgICAgICAgICAgICAgICAgICAgIiZBcmtpdiIKKyNkZWZpbmUgTUVOVV9GSUxFX05FVyAgICAgICAgICAgICAgICAiJk55Li4uIgorI2RlZmluZSBNRU5VX0ZJTEVfT1BFTiAgICAgICAgICAgICAgICLWJnBwbmEiCisjZGVmaW5lIE1FTlVfRklMRV9TQVZFICAgICAgICAgICAgICAgIiZTcGFyYSIKKyNkZWZpbmUgTUVOVV9GSUxFX1NBVkVBUyAgICAgICAgICAgICAiU3BhcmEgJnNvbS4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX1BSSU5UICAgICAgICAgICAgICAiJlNrcml2IHV0IgorI2RlZmluZSBNRU5VX0ZJTEVfUEFHRVNFVFVQICAgICAgICAgICJTaWQgTGEmeW91dC4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX1BSSU5UU0VUVVAgICAgICAgICAiU2tyaXZhciAmaW5zdORsbG5pbmdhci4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX0VYSVQgICAgICAgICAgICAgICAiJkF2c2x1dGEiCisKKyNkZWZpbmUgTUVOVV9FRElUICAgICAgICAgICAgICAgICAgICAiJlJlZGlnZXJhIgorI2RlZmluZSBNRU5VX0VESVRfVU5ETyAgICAgICAgICAgICAgICImVW5kb1x0Q3RybCtaIgorI2RlZmluZSBNRU5VX0VESVRfQ1VUICAgICAgICAgICAgICAgICJLbGlwcGFcdEN0cmwrWCIKKyNkZWZpbmUgTUVOVV9FRElUX0NPUFkgICAgICAgICAgICAgICAiJktvcGllcmFcdEN0cmwrQyIKKyNkZWZpbmUgTUVOVV9FRElUX1BBU1RFICAgICAgICAgICAgICAiJktsaXN0cmEgaW5cdEN0cmwrViIKKyNkZWZpbmUgTUVOVV9FRElUX0RFTEVURSAgICAgICAgICAgICAiJlRhIGJvcnRcdERlbCIKKyNkZWZpbmUgTUVOVV9FRElUX1NFTEVDVEFMTCAgICAgICAgICAiTWFya2VyYSAmYWxsdCIKKyNkZWZpbmUgTUVOVV9FRElUX1RJTUVEQVRFICAgICAgICAgICAiJlRpZC9EYXR1bVx0RjUiCisjZGVmaW5lIE1FTlVfRURJVF9XUkFQICAgICAgICAgICAgICAgIiZEZWxhIGzlbmdhIG1lbmluZ2FyIgorCisjZGVmaW5lIE1FTlVfU0VBUkNIICAgICAgICAgICAgICAgICAgIiZT9msiCisjZGVmaW5lIE1FTlVfU0VBUkNIX1NFQVJDSCAgICAgICAgICAgIlP2ay4uLiIKKyNkZWZpbmUgTUVOVV9TRUFSQ0hfTkVYVCAgICAgICAgICAgICAiJlP2ayBu5HN0YVx0RjMiCisKKyNkZWZpbmUgTUVOVV9MQU5HVUFHRSAgICAgICAgICAgICAgICAiJlNwcuVrIgorCisjZGVmaW5lIE1FTlVfSEVMUCAgICAgICAgICAgICAgICAgICAgIiZIauRscCIKKyNkZWZpbmUgTUVOVV9IRUxQX0NPTlRFTlRTICAgICAgICAgICAiJklubmVo5WxsIgorI2RlZmluZSBNRU5VX0hFTFBfU0VBUkNIICAgICAgICAgICAgICImU/ZrLi4uIgorI2RlZmluZSBNRU5VX0hFTFBfSEVMUF9PTl9IRUxQICAgICAgICJBbnbkbmRuaW5nZW4gJmF2IGhq5GxwIgorCisjZGVmaW5lIE1FTlVfSU5GTyAgICAgICAgICAgICAgICAgICAgIkluZiZvcm1hdGlvbi4uLiIKKyNkZWZpbmUgTUVOVV9JTkZPX0xJQ0VOU0UgICAgICAgICAgICAiJkxpY2VucyIKKyNkZWZpbmUgTUVOVV9JTkZPX05PX1dBUlJBTlRZICAgICAgICAiJklOR0VOIEdBUkFOVEkiCisjZGVmaW5lIE1FTlVfSU5GT19BQk9VVF9XSU5FICAgICAgICAgIiZPbSBXaW5lIgorCisvKiBEaWFsb2dzICovCisKKyNkZWZpbmUgRElBTE9HX09LICAgICAgICAgICAgICAgICAgICAiT0siCisjZGVmaW5lIERJQUxPR19DQU5DRUwgICAgICAgICAgICAgICAgIkF2YnJ5dCIKKyNkZWZpbmUgRElBTE9HX0JST1dTRSAgICAgICAgICAgICAgICAiJkJs5GRkcmEuLi4iCisjZGVmaW5lIERJQUxPR19IRUxQICAgICAgICAgICAgICAgICAgIiZIauRscCIKKworI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0NBUFRJT04gICAgICJTaWQgTGF5b3V0IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0hFQUQgICAgICAgICImSHV2dWRub3Q6IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1RBSUwgICAgICAgICImRm90bm90OiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9CT1JERVIgICAgICAiS2FudGVyOiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9MRUZUICAgICAgICAiJlbkbnN0ZXI6IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1JJR0hUICAgICAgICImSPZnZXI6IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1RPUCAgICAgICAgICIm1nZlcjoiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfQk9UVE9NICAgICAgIiZVbmRlcjoiCisKKworLyogU3RyaW5ncyAqLworI2RlZmluZSBTVFJJTkdfTk9URVBBRCAgICAgICAgICAgICAgICJBbnRlY2tuaW5nYXIiCisjZGVmaW5lIFNUUklOR19FUlJPUiAgICAgICAgICAgICAgICAgIkZFTCIKKyNkZWZpbmUgU1RSSU5HX1dBUk5JTkcgICAgICAgICAgICAgICAiVkFSTklORyIKKyNkZWZpbmUgU1RSSU5HX0lORk8gICAgICAgICAgICAgICAgICAiSW5mb3JtYXRpb24iCisKKyNkZWZpbmUgU1RSSU5HX1VOVElUTEVEICAgICAgICAgICAgICAiKHVudGl0bGVkKSIKKworI2RlZmluZSBTVFJJTkdfQUxMRklMRVMgICAgICAgICAgICAgICJBbGxhIGZpbGVyICgqLiopIgorI2RlZmluZSBTVFJJTkdfVEVYVEZJTEVTICAgICAgICAgICAgICJUZXh0IGZpbGVyICgqLnR4dCkiCisKKyNkZWZpbmUgU1RSSU5HX1RPT0xBUkdFICAgICAgICAgIkZpbGVuICclcycg5HIgZvZyIHN0b3IgZvZyIG5vdGVwYWQuXG4gXAorQW525G5kIGVuIGFubmFuIGVkaXRvci4iCisKKyNkZWZpbmUgU1RSSU5HX05PVEVYVCAgICAgICAgICAgIkR1IHNrcmV2IGludGUgaW4gbuVnb24gdGV4dC4gXAorXG5Ta3JpdiBu5WdvdCBvY2ggZvZyc/ZrIHNlZGFuIGlnZW4iCisKKyNkZWZpbmUgU1RSSU5HX05PVEZPVU5EICAgICAgICAgIiclcycgaGl0dGFkZXMgaW50ZS4iCisKKyNkZWZpbmUgU1RSSU5HX09VVF9PRl9NRU1PUlkgICAgIkludGUgdGlsbHLka2xpZ3QgbWVkIG1pbm5lIGb2ciBhdHQgc2x1dGb2cmEgXAorZGVuIGjkciB1cHBnaWZ0ZW4uIFxuQXZzbHV0YSBldHQgZWxsZXIgZmxlcmEgcHJvZ3JhbSBm9nIgYXR0IPZrYSBt5G5nZGVuIFxuZnJpdHQgXAorbWlubmUuIgorCisjaW5jbHVkZSAibm90ZXBhZC5yYyIKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvVE9ETyBiL3Byb2dyYW1zL25vdGVwYWQvVE9ETwppbmRleCBkMmQyOGI0Li5hMTRhMmI0IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL1RPRE8KKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9UT0RPCkBAIC0xLDggKzEsMiBAQAogCi0gLSBFbi5yYyBpcyB0cmFuc2xhdGVkIGZyb20gZ2VybWFuIHZlcnNpb24gb2YgTm90ZXBhZC4gCi0gICBJIGRvbid0IGtub3cgd2hhdCB0aGUgcmVhbCBzdHJpbmdzIGFyZSwgYXMgSSBkbyBub3QgaGF2ZSBhbiBlbmdsaXNoCi0gICBjb3B5IG9mIE5vdGVwYWQuIFBsZWFzZSBjaGVjayBzdHJpbmdzIGluIEVuLnJjIGFuZCBzdWJtaXQgY29ycmVjdGlvbnMuCi0KICAtIGNyZWF0ZSBuZXcgKi5yYyBmaWxlcyBmb3IgYWxsIGxhbmd1YWdlcyB5b3Uga25vdy4KLQotCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL21haW4uYyBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jCmluZGV4IGIyMzZjMDkuLmNkYzJiNjQgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jCkBAIC04NSw3ICs4NSwxMSBAQAogICAgICBjYXNlIE5QX0VESVRfUEFTVEU6ICAgICAgICBicmVhazsKICAgICAgY2FzZSBOUF9FRElUX0RFTEVURTogICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTlBfRURJVF9USU1FREFURTogICAgIGJyZWFrOwotICAgICBjYXNlIE5QX0VESVRfV1JBUDogICAgICAgICBicmVhazsKKyAgICAgY2FzZSBOUF9FRElUX1dSQVA6ICAgICAgICAgCisgICAgICAgIEdsb2JhbHMuYldyYXBMb25nTGluZXMgPSAhR2xvYmFscy5iV3JhcExvbmdMaW5lczsKKwlDaGVja01lbnVJdGVtKEdsb2JhbHMuaEVkaXRNZW51LCBOUF9FRElUX1dSQVAsIE1GX0JZQ09NTUFORCB8IAorICAgICAgICAgICAgICAgIChHbG9iYWxzLmJXcmFwTG9uZ0xpbmVzID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRCkpOworICAgICAgICBicmVhazsKIAogICAgICBjYXNlIE5QX1NFQVJDSF9TRUFSQ0g6ICAgICBicmVhazsKICAgICAgY2FzZSBOUF9TRUFSQ0hfTkVYVDogICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL21haW4uaCBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5oCmluZGV4IDNjNzAxYjUuLmJiMmZkMmYgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5oCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5oCkBAIC0zMCw2ICszMCw3IEBACiAgIExQQ1NUUiAgbHBzekljb0ZpbGU7CiAgIExQQ1NUUiAgbHBzekxhbmd1YWdlOwogICBVSU5UICAgIHdTdHJpbmdUYWJsZU9mZnNldDsKKyAgQk9PTCAgICBiV3JhcExvbmdMaW5lczsKIH0gTk9URVBBRF9HTE9CQUxTOwogCiBleHRlcm4gTk9URVBBRF9HTE9CQUxTIEdsb2JhbHM7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgppbmRleCAyMjJmOTZjLi5mMzg3ZWRiIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KQEAgLTgsNyArOCw3IEBACiBBTExfTElCUyAgPSAkKFdJTkVMSUIpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMSUJTKQogUkNGTEFHUyAgID0gLXczMiAtaAogCi1MQU5HVUFHRVMgICA9IEVuIERhIERlIEZyIEZpIEtvIEh1IEl0IFZhCitMQU5HVUFHRVMgICA9IEVuIERhIERlIEZyIEZpIEtvIEh1IEl0IFZhIFN3CiBMSUNFTlNFTEFORyA9IEVuCiAKIE1PU1RTUkNTID0gXApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9Tdy5yYyBiL3Byb2dyYW1zL3Byb2dtYW4vU3cucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwZTMyYQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vU3cucmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBQcm9ncmFtIE1hbmFnZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBLYXJsIEJhY2tzdHL2bQorICovCisKKyNkZWZpbmUgTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgICBTdworI2RlZmluZSBMQU5HVUFHRV9OVU1CRVIgICAgICAgICAgICAgIDFkCisjZGVmaW5lIExBTkdVQUdFX01FTlVfSVRFTSAgICAgICAgICAgIiZTdmVuc2thIgorCisvKiBNZW51ICovCisKKyNkZWZpbmUgTUVOVV9GSUxFICAgICAgICAgICAgICAgICAgICAiJkFya2l2IgorI2RlZmluZSBNRU5VX0ZJTEVfTkVXICAgICAgICAgICAgICAgICImTnkuLi4iCisjZGVmaW5lIE1FTlVfRklMRV9PUEVOICAgICAgICAgICAgICAgItYmcHBuYVx0RW50ZXIiCisjZGVmaW5lIE1FTlVfRklMRV9NT1ZFICAgICAgICAgICAgICAgIiZGbHl0dGEuLi5cdEY3IgorI2RlZmluZSBNRU5VX0ZJTEVfQ09QWSAgICAgICAgICAgICAgICImS29waWVyYS4uLlx0RjgiCisjZGVmaW5lIE1FTlVfRklMRV9ERUxFVEUgICAgICAgICAgICAgIiZUYSBib3J0XHRFbnRmIgorI2RlZmluZSBNRU5VX0ZJTEVfQVRUUklCVVRFUyAgICAgICAgICImRWdlbnNrYXBlci4uLlx0QWx0K0VudGVyIgorI2RlZmluZSBNRU5VX0ZJTEVfRVhFQ1VURSAgICAgICAgICAgICImS/ZyLi4uIgorI2RlZmluZSBNRU5VX0ZJTEVfRVhJVCAgICAgICAgICAgICAgICJBJnZzbHV0YSBXaW5kb3dzLi4uIgorCisjZGVmaW5lIE1FTlVfT1BUSU9OUyAgICAgICAgICAgICAgICAgIiZJbnN05GxsbmluZ2FyIgorI2RlZmluZSBNRU5VX09QVElPTlNfQVVUT19BUlJBTkdFICAgICImQXJyYW5nZXJhIGF1dG9tYXRpc2t0IgorI2RlZmluZSBNRU5VX09QVElPTlNfTUlOX09OX1JVTiAgICAgICImTWluaW1lcmEgdmlkIGv2cm5pbmciCisjZGVmaW5lIE1FTlVfT1BUSU9OU19TQVZFX1NFVFRJTkdTICAgIiZTcGFyYSBpbnN05GxsbmluZ2FybmEgdmlkIGF2c2x1dCIKKworI2RlZmluZSBNRU5VX1dJTkRPV1MgICAgICAgICAgICAgICAgICImRvZuc3RlciIKKyNkZWZpbmUgTUVOVV9XSU5ET1dTX09WRVJMQVAgICAgICAgICAiJtZ2ZXJsYXBwYW5kZVx0U2hpZnQrRjUiCisjZGVmaW5lIE1FTlVfV0lORE9XU19TSURFX0JZX1NJREUgICAgIiZTaWRhIHZpZCBzaWRhXHRTaGlmdCtGNCIKKyNkZWZpbmUgTUVOVV9XSU5ET1dTX0FSUkFOR0UgICAgICAgICAiJkFycmFuZ3JhIElrb25lciIKKworI2RlZmluZSBNRU5VX0xBTkdVQUdFICAgICAgICAgICAgICAgICImU3By5WsiCisKKyNkZWZpbmUgTUVOVV9IRUxQICAgICAgICAgICAgICAgICAgICAiJkhq5GxwIgorI2RlZmluZSBNRU5VX0hFTFBfQ09OVEVOVFMgICAgICAgICAgICImSW5uZWjlbGwiCisjZGVmaW5lIE1FTlVfSEVMUF9TRUFSQ0ggICAgICAgICAgICAgIiZT9msuLi4iCisjZGVmaW5lIE1FTlVfSEVMUF9IRUxQX09OX0hFTFAgICAgICAgIiZBbnbkbmRuaW5nZW4gYXYgSGrkbHAiCisjZGVmaW5lIE1FTlVfSEVMUF9UVVRPUklBTCAgICAgICAgICAgIiZXaW5kb3dzIFNq5Gx2c3R1ZGllciIKKworI2RlZmluZSBNRU5VX0lORk8gICAgICAgICAgICAgICAgICAgICImSW5mb3JtYXRpb24uLi4iCisjZGVmaW5lIE1FTlVfSU5GT19MSUNFTlNFICAgICAgICAgICAgIiZMaWNlbnMiCisjZGVmaW5lIE1FTlVfSU5GT19OT19XQVJSQU5UWSAgICAgICAgIiZJTkdFTiBHQVJBTlRJIgorI2RlZmluZSBNRU5VX0lORk9fQUJPVVRfV0lORSAgICAgICAgICImT20gV0lORSIKKworLyogRGlhbG9ncyAqLworCisjZGVmaW5lIERJQUxPR19PSyAgICAgICAgICAgICAgICAgICAgIk9LIgorI2RlZmluZSBESUFMT0dfQ0FOQ0VMICAgICAgICAgICAgICAgICJBdmJyeXQiCisjZGVmaW5lIERJQUxPR19CUk9XU0UgICAgICAgICAgICAgICAgIiZCbORkZHJhIgorI2RlZmluZSBESUFMT0dfSEVMUCAgICAgICAgICAgICAgICAgICImSGrkbHAiCisKKyNkZWZpbmUgRElBTE9HX05FV19DQVBUSU9OICAgICAgICAgICAiTnl0dCBQcm9ncmFtIE9iamVrdCIKKyNkZWZpbmUgRElBTE9HX05FV19ORVcgICAgICAgICAgICAgICAiTnl0dCIKKyNkZWZpbmUgRElBTE9HX05FV19HUk9VUCAgICAgICAgICAgICAiUHJvZ3JhbSAmZ3J1cHAiCisjZGVmaW5lIERJQUxPR19ORVdfUFJPR1JBTSAgICAgICAgICAgIiZQcm9ncmFtIgorCisjZGVmaW5lIERJQUxPR19NT1ZFX0NBUFRJT04gICAgICAgICAgIkZseXR0YSBQcm9ncmFtIgorI2RlZmluZSBESUFMT0dfTU9WRV9QUk9HUkFNICAgICAgICAgICJGbHl0dGEgcHJvZ3JhbToiCisjZGVmaW5lIERJQUxPR19NT1ZFX0ZST01fR1JPVVAgICAgICAgIkZy5W4gZ3J1cHA6IgorI2RlZmluZSBESUFMT0dfTU9WRV9UT19HUk9VUCAgICAgICAgICImVGlsbCBncnVwcDoiCisKKyNkZWZpbmUgRElBTE9HX0NPUFlfQ0FQVElPTiAgICAgICAgICAiS29waWVyYSBQcm9ncmFtIgorI2RlZmluZSBESUFMT0dfQ09QWV9QUk9HUkFNICAgICAgICAgICJLb3BpZXJhIHByb2dyYW06IgorI2RlZmluZSBESUFMT0dfQ09QWV9GUk9NX0dST1VQICAgICAgIERJQUxPR19NT1ZFX0ZST01fR1JPVVAKKyNkZWZpbmUgRElBTE9HX0NPUFlfVE9fR1JPVVAgICAgICAgICBESUFMT0dfTU9WRV9UT19HUk9VUAorCisjZGVmaW5lIERJQUxPR19HUk9VUF9DQVBUSU9OICAgICAgICAgIlByb2dyYW1ncnVwcHMgZWdlbnNrYXBlciIKKyNkZWZpbmUgRElBTE9HX0dST1VQX0RFU0NSSVBUSU9OICAgICAiJkJlc2tyaXZuaW5nOiIKKyNkZWZpbmUgRElBTE9HX0dST1VQX0ZJTEUgICAgICAgICAgICAiJkdydXBwZmlsOiIKKworI2RlZmluZSBESUFMT0dfUFJPR1JBTV9DQVBUSU9OICAgICAgICJQcm9ncmFtIGVnZW5za2FwZXIiCisjZGVmaW5lIERJQUxPR19QUk9HUkFNX0RFU0NSSVBUSU9OICAgRElBTE9HX0dST1VQX0RFU0NSSVBUSU9OCisjZGVmaW5lIERJQUxPR19QUk9HUkFNX0NPTU1BTkRfTElORSAgIiZLb21tYW5kbyByYWQ6IgorI2RlZmluZSBESUFMT0dfUFJPR1JBTV9ESVJFQ1RPUlkgICAgICImQXJiZXRzIGthdGFsb2c6IgorI2RlZmluZSBESUFMT0dfUFJPR1JBTV9IT1RfS0VZICAgICAgICImVGFuZ2VudGJvcmRzIGtvbWJpbmF0aW9uOiIKKyNkZWZpbmUgRElBTE9HX1BST0dSQU1fU1lNQk9MICAgICAgICAiS/ZyICZtaW5pbWVyYXQiCisjZGVmaW5lIERJQUxPR19QUk9HUkFNX09USEVSX1NZTUJPTCAgIiZCeXQgSWtvbi4uLiIKKworI2RlZmluZSBESUFMT0dfU1lNQk9MX0NBUFRJT04gICAgICAgICJCeXQgSWtvbiIKKyNkZWZpbmUgRElBTE9HX1NZTUJPTF9GSUxFICAgICAgICAgICAiJkZpbG5hbW46IgorI2RlZmluZSBESUFMT0dfU1lNQk9MX0NVUlJFTlQgICAgICAgICImTnV2YXJhbmRlIGlrb246IgorCisjZGVmaW5lIERJQUxPR19FWEVDVVRFX0NBUFRJT04gICAgICAgIkv2ciIKKyNkZWZpbmUgRElBTE9HX0VYRUNVVEVfQ09NTUFORF9MSU5FICBESUFMT0dfUFJPR1JBTV9DT01NQU5EX0xJTkUKKyNkZWZpbmUgRElBTE9HX0VYRUNVVEVfU1lNQk9MICAgICAgICBESUFMT0dfUFJPR1JBTV9TWU1CT0wKKworLyogU3RyaW5ncyAqLworCisjZGVmaW5lIFNUUklOR19QUk9HUkFNX01BTkFHRVIgICAgICAgICAgICAiUHJvZ3JhbWhhbnRlcmFyZW4iCisjZGVmaW5lIFNUUklOR19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAiRkVMIgorI2RlZmluZSBTVFJJTkdfV0FSTklORyAgICAgICAgICAgICAgICAgICAgIlZBUk5JTkciCisjZGVmaW5lIFNUUklOR19JTkZPICAgICAgICAgICAgICAgICAgICAgICAiSW5mb3JtYXRpb24iCisjZGVmaW5lIFNUUklOR19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAiVGEgYm9ydCIKKyNkZWZpbmUgU1RSSU5HX0RFTEVURV9HUk9VUF9zICAgICAgICAgICAgICJUYSBib3J0IGdydXBwIGAlcycgPyIKKyNkZWZpbmUgU1RSSU5HX0RFTEVURV9QUk9HUkFNX3MgICAgICAgICAgICJUYSBib3J0IHByb2dyYW0gYCVzJyA/IgorI2RlZmluZSBTVFJJTkdfTk9UX0lNUExFTUVOVEVEICAgICAgICAgICAgIkVqIGltcGxlbWVudGVyYXQiCisjZGVmaW5lIFNUUklOR19GSUxFX1JFQURfRVJST1JfcyAgICAgICAgICAiS2FuIGVqIGzkc2EgZmlsZW4gYCVzJyIKKyNkZWZpbmUgU1RSSU5HX0ZJTEVfV1JJVEVfRVJST1JfcyAgICAgICAgICJLYW4gZWogc2tyaXZhIHRpbGwgZmlsZW4gYCVzJyIKKworI2RlZmluZSBTVFJJTkdfR1JQRklMRV9SRUFEX0VSUk9SX3MgICAgICAgIlwKK0thbiBpbnRlIPZwcG5hIGdydXBwZmlsZW4gYCVzJy5cblwKK9Zuc2thciBkdSBhdHQgUHJvZ3JhbWhhbnRlcmFyZW4gaSBmcmFtdGlkZW4gc2thIGb2cnP2a2Eg9nBwbmEgZGVuPyIKKworI2RlZmluZSBTVFJJTkdfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgIlNsdXQgcOUgbWlubmUiCisjZGVmaW5lIFNUUklOR19XSU5IRUxQX0VSUk9SICAgICAgICAgICAgICAiSGrkbHAgZWogdGlsbGfkbmdsaWciCisjZGVmaW5lIFNUUklOR19VTktOT1dOX0ZFQVRVUkVfcyAgICAgICAgICAiT2vkbnQgaW5uZWjlbGwgaSAlcyIKKyNkZWZpbmUgU1RSSU5HX0ZJTEVfTk9UX09WRVJXUklUVEVOX3MgICAgICJGaWxlbiBgJXMnIGV4aXN0ZXJhci4gRGVuIGhhciBlaiBza3Jpdml0cyD2dmVyLiIKKyNkZWZpbmUgU1RSSU5HX1NBVkVfR1JPVVBfQVNfcyAgICAgICAgICAgICJTcGFyYSBmaWxlbiBzb20gYCVzJyBm9nIgYXR0IGb2cmhpbmRyYSBhdHQgb3JnaW5hbGZpbGVuIHNrcml2cyD2dmVyIgorCisjZGVmaW5lIFNUUklOR19OT19IT1RfS0VZICAgICAgICAgICAgICAgICAiSW5nZW4iCisKKyNkZWZpbmUgU1RSSU5HX0FMTF9GSUxFUyAgICAgICAgICAgICAgICAgICJBbGxhIGZpbGVyICgqLiopIgorI2RlZmluZSBTVFJJTkdfUFJPR1JBTVMgICAgICAgICAgICAgICAgICAgIlByb2dyYW0iCisjZGVmaW5lIFNUUklOR19MSUJSQVJJRVNfRExMICAgICAgICAgICAgICAiQmlibGlvdGVrc2ZpbGVyICgqLmRsbCkiCisjZGVmaW5lIFNUUklOR19TWU1CT0xfRklMRVMgICAgICAgICAgICAgICAiSWtvbmZpbGVyIgorI2RlZmluZSBTVFJJTkdfU1lNQk9MU19JQ08gICAgICAgICAgICAgICAgIklrb25lciAoKi5pY28pIgorCisjaW5jbHVkZSAiWHgucmMiCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbgppbmRleCBkYmUwZGFmLi5mYTkwNjI4IDEwMDY0NAotLS0gYS9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KQEAgLTgsNyArOCw3IEBACiBBTExfTElCUyAgPSAkKFdJTkVMSUIpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMSUJTKQogUkNGTEFHUyAgID0gLXczMiAtaAogCi1MQU5HVUFHRVMgICA9IEVuIERhIERlIEZyIEZpIEtvIEh1IEl0IFZhCitMQU5HVUFHRVMgICA9IEVuIERhIERlIEZyIEZpIEtvIEh1IEl0IFZhIFN3CiAKIE1PU1RTUkNTID0gXAogCXdpbmhlbHAuYyBcCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5oZWxwL1N3LnJjIGIvcHJvZ3JhbXMvd2luaGVscC9Tdy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODdjN2EyCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvd2luaGVscC9Tdy5yYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogSGVscCBWaWV3ZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5NiBVbHJpY2ggU2NobWlkCisgKiBTd2VkaXNoIGxhbmd1YWdlIGJ5IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KKyAqLworCisvKiBUaGlzIGZpbGUgaXMgbm90IHlldCBjb21wbGV0ZSAhISAqLworCisjZGVmaW5lIExBTkdVQUdFX0lEICAgICAgICAgICAgICAgICAgU3cKKyNkZWZpbmUgTEFOR1VBR0VfTlVNQkVSICAgICAgICAgICAgICAxZAorCisvKiBNZW51ICovCisKKyNkZWZpbmUgTUVOVV9GSUxFICAgICAgICAgICAgICAgICAgICAiJkFya2l2IgorI2RlZmluZSBNRU5VX0ZJTEVfT1BFTiAgICAgICAgICAgICAgICIm1nBwbmEuLi4iCisjZGVmaW5lIE1FTlVfRklMRV9QUklOVCAgICAgICAgICAgICAgIiZTa3JpdiB1dCIKKyNkZWZpbmUgTUVOVV9GSUxFX1BSSU5URVJfU0VUVVAgICAgICAiU2tyaXZhciAmaW5zdORsbG5pbmdhci4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX0VYSVQgICAgICAgICAgICAgICAiJkF2c2x1dGEiCisKKyNkZWZpbmUgTUVOVV9FRElUICAgICAgICAgICAgICAgICAgICAiJlJlZGlnZXJhIgorI2RlZmluZSBNRU5VX0VESVRfQ09QWV9ESUFMT0cgICAgICAgICImS29waWVyYS4uLiIKKyNkZWZpbmUgTUVOVV9FRElUX0FOTk9UQVRFICAgICAgICAgICAiJkFubm3kcmsuLi4iCisKKyNkZWZpbmUgTUVOVV9CT09LTUFSSyAgICAgICAgICAgICAgICAiJkJva23kcmtlIgorI2RlZmluZSBNRU5VX0JPT0tNQVJLX0RFRklORSAgICAgICAgICImRGVmaW5nZXJhLi4uIgorCisjZGVmaW5lIE1FTlVfSEVMUCAgICAgICAgICAgICAgICAgICAgIiZIauRscCIKKyNkZWZpbmUgTUVOVV9IRUxQX09OX0hFTFAgICAgICAgICAgICAiQW525G5kbmluZ2VuICZhdiBoauRscCIKKyNkZWZpbmUgTUVOVV9IRUxQX09OX1RPUCAgICAgICAgICAgICAiQWxsdGlkICb2dmVyc3QiCisjZGVmaW5lIE1FTlVfSEVMUF9JTkZPICAgICAgICAgICAgICAgIiZJbmZvcm1hdGlvbi4uLiIKKyNkZWZpbmUgTUVOVV9IRUxQX0FCT1VUX1dJTkUgICAgICAgICAiJk9tIFdJTkUiCisKKy8qIFN0cmluZ3MgKi8KKworI2RlZmluZSBTVFJJTkdfV0lORV9IRUxQICAgICAgICAgICAgICJXSU5FIEhq5GxwIgorI2RlZmluZSBTVFJJTkdfRVJST1IgICAgICAgICAgICAgICAgICJGRUwiCisjZGVmaW5lIFNUUklOR19XQVJOSU5HICAgICAgICAgICAgICAgIlZBUk5JTkciCisjZGVmaW5lIFNUUklOR19JTkZPICAgICAgICAgICAgICAgICAgIkluZm9ybWF0aW9uIgorI2RlZmluZSBTVFJJTkdfTk9UX0lNUExFTUVOVEVEICAgICAgICJFaiBpbXBsZW1lbnRlcmVyYXQiCisjZGVmaW5lIFNUUklOR19ITFBGSUxFX0VSUk9SX3MgICAgICAgIkZFTCB2aWQgbORzbmluZyBhdiBoauRscCBmaWxlbiBgJXMnIgorI2RlZmluZSBTVFJJTkdfQ09OVEVOVFMgICAgICAgICAgICAgICImSW5uZWjlbGwiCisjZGVmaW5lIFNUUklOR19TRUFSQ0ggICAgICAgICAgICAgICAgIiZT9msiCisjZGVmaW5lIFNUUklOR19CQUNLICAgICAgICAgICAgICAgICAgIiZUaWxsYmFrYSIKKyNkZWZpbmUgU1RSSU5HX0hJU1RPUlkgICAgICAgICAgICAgICAiJtZ2ZXJzaWt0IgorI2RlZmluZSBTVFJJTkdfQUxMX0ZJTEVTICAgICAgICAgICAgICJBbGxhIGZpbGVyICgqLiopIgorI2RlZmluZSBTVFJJTkdfSEVMUF9GSUxFU19ITFAgICAgICAgICJIauRscCBmaWxlciAoKi5obHApIgorCisjaW5jbHVkZSAiWHgucmMiCmRpZmYgLS1naXQgYS9yZWxheTMyL01ha2VmaWxlLmluIGIvcmVsYXkzMi9NYWtlZmlsZS5pbgppbmRleCAzOTg4MGNlLi41MmUxZTZhIDEwMDY0NAotLS0gYS9yZWxheTMyL01ha2VmaWxlLmluCisrKyBiL3JlbGF5MzIvTWFrZWZpbGUuaW4KQEAgLTEyLDYgKzEyLDggQEAKIAljcnRkbGwuc3BlYyBcCiAJZGNpbWFuMzIuc3BlYyBcCiAJZGRyYXcuc3BlYyBcCisJZGlucHV0LnNwZWMgXAorCWRwbGF5LnNwZWMgXAogCWRzb3VuZC5zcGVjIFwKIAlnZGkzMi5zcGVjIFwKIAlrZXJuZWwzMi5zcGVjIFwKZGlmZiAtLWdpdCBhL3JlbGF5MzIvYnVpbHRpbjMyLmMgYi9yZWxheTMyL2J1aWx0aW4zMi5jCmluZGV4IDAxZjlhN2QuLmI5ZjQ4ZDkgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvYnVpbHRpbjMyLmMKKysrIGIvcmVsYXkzMi9idWlsdGluMzIuYwpAQCAtNDUsNiArNDUsOCBAQAogZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIENSVERMTF9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIERDSU1BTjMyX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgRERSQVdfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBESU5QVVRfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBEUExBWV9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIERTT1VORF9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIEdESTMyX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgS0VSTkVMMzJfRGVzY3JpcHRvcjsKQEAgLTczLDYgKzc1LDggQEAKICAgICB7ICZDUlRETExfRGVzY3JpcHRvciwgICBOVUxMLCBUUlVFICB9LAogICAgIHsgJkRDSU1BTjMyX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCiAgICAgeyAmRERSQVdfRGVzY3JpcHRvciwgICAgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZESU5QVVRfRGVzY3JpcHRvciwgICBOVUxMLCBUUlVFICB9LAorICAgIHsgJkRQTEFZX0Rlc2NyaXB0b3IsICAgIE5VTEwsIFRSVUUgIH0sCiAgICAgeyAmRFNPVU5EX0Rlc2NyaXB0b3IsICAgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZHREkzMl9EZXNjcmlwdG9yLCAgICBOVUxMLCBUUlVFICB9LAogICAgIHsgJktFUk5FTDMyX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCmRpZmYgLS1naXQgYS9yZWxheTMyL2NvbWRsZzMyLnNwZWMgYi9yZWxheTMyL2NvbWRsZzMyLnNwZWMKaW5kZXggYmNiMGE5MS4uYzVhZWI0NiAxMDA2NDQKLS0tIGEvcmVsYXkzMi9jb21kbGczMi5zcGVjCisrKyBiL3JlbGF5MzIvY29tZGxnMzIuc3BlYwpAQCAtNCw3ICs0LDcgQEAKICAwIHN0dWIgQXJyb3dCdG5XbmRQcm9jCiAgMSBzdHViIENob29zZUNvbG9yQQogIDIgc3R1YiBDaG9vc2VDb2xvclcKLSAzIHN0dWIgQ2hvb3NlRm9udEEKKyAzIHN0ZGNhbGwgQ2hvb3NlRm9udEEocHRyKSBDaG9vc2VGb250MzJBCiAgNCBzdHViIENob29zZUZvbnRXCiAgNSBzdGRjYWxsIENvbW1EbGdFeHRlbmRlZEVycm9yKCkgQ29tbURsZ0V4dGVuZGVkRXJyb3IKICA2IHN0dWIgRmluZFRleHRBCmRpZmYgLS1naXQgYS9yZWxheTMyL2RpbnB1dC5zcGVjIGIvcmVsYXkzMi9kaW5wdXQuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2JhNmU5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsYXkzMi9kaW5wdXQuc3BlYwpAQCAtMCwwICsxLDEwIEBACituYW1lIGRpbnB1dAordHlwZSB3aW4zMgorCiswIHN0ZGNhbGwgRGlyZWN0SW5wdXRDcmVhdGVBKGxvbmcgbG9uZyBwdHIgcHRyKSBEaXJlY3RJbnB1dENyZWF0ZTMyQQorMSBzdHViIERpcmVjdElucHV0Q3JlYXRlVworMiBzdHViIERsbENhblVubG9hZE5vdworMyBzdHViIERsbEdldENsYXNzT2JqZWN0Cis0IHN0dWIgRGxsUmVnaXN0ZXJTZXJ2ZXIKKzUgc3R1YiBEbGxVbnJlZ2lzdGVyU2VydmVyCisKZGlmZiAtLWdpdCBhL3JlbGF5MzIvZHBsYXkuc3BlYyBiL3JlbGF5MzIvZHBsYXkuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRiZTJjCi0tLSAvZGV2L251bGwKKysrIGIvcmVsYXkzMi9kcGxheS5zcGVjCkBAIC0wLDAgKzEsNSBAQAorbmFtZSBkcGxheQordHlwZSB3aW4zMgorCisgIDEgc3R1YiBEaXJlY3RQbGF5Q3JlYXRlCisgIDIgc3R1YiBEaXJlY3RQbGF5RW51bWVyYXRlCmRpZmYgLS1naXQgYS9yZWxheTMyL2dkaTMyLnNwZWMgYi9yZWxheTMyL2dkaTMyLnNwZWMKaW5kZXggYjZjNWJlYS4uOGU4MjQxMyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9nZGkzMi5zcGVjCisrKyBiL3JlbGF5MzIvZ2RpMzIuc3BlYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAxMzggc3R1YiBHZGlTZXRBdHRycwogMTM5IHN0ZGNhbGwgR2RpU2V0QmF0Y2hMaW1pdChsb25nKSBHZGlTZXRCYXRjaExpbWl0CiAxNDAgc3R1YiBHZGlTZXRTZXJ2ZXJBdHRyCi0xNDEgc3R1YiBHZXRBcmNEaXJlY3Rpb24KKzE0MSBzdGRjYWxsIEdldEFyY0RpcmVjdGlvbihsb25nKSBHZXRBcmNEaXJlY3Rpb24zMgogMTQyIHN0dWIgR2V0QXNwZWN0UmF0aW9GaWx0ZXJFeAogMTQzIHN0ZGNhbGwgR2V0Qml0bWFwQml0cyhsb25nIGxvbmcgcHRyKSBHZXRCaXRtYXBCaXRzMzIKIDE0NCBzdGRjYWxsIEdldEJpdG1hcERpbWVuc2lvbkV4KGxvbmcgcHRyKSBHZXRCaXRtYXBEaW1lbnNpb25FeDMyCkBAIC0zMDYsNyArMzA2LDcgQEAKIDI5OSBzdGRjYWxsIFNlbGVjdE9iamVjdChsb25nIGxvbmcpIFNlbGVjdE9iamVjdDMyCiAzMDAgc3RkY2FsbCBTZWxlY3RQYWxldHRlKGxvbmcgbG9uZyBsb25nKSBTZWxlY3RQYWxldHRlMzIKIDMwMSBzdHViIFNldEFib3J0UHJvYwotMzAyIHN0dWIgU2V0QXJjRGlyZWN0aW9uCiszMDIgc3RkY2FsbCBTZXRBcmNEaXJlY3Rpb24obG9uZyBsb25nKSBTZXRBcmNEaXJlY3Rpb24zMgogMzAzIHN0ZGNhbGwgU2V0Qml0bWFwQml0cyhsb25nIGxvbmcgcHRyKSBTZXRCaXRtYXBCaXRzMzIKIDMwNCBzdGRjYWxsIFNldEJpdG1hcERpbWVuc2lvbkV4KGxvbmcgbG9uZyBsb25nIHB0cikgU2V0Qml0bWFwRGltZW5zaW9uRXgzMgogMzA1IHN0ZGNhbGwgU2V0QmtDb2xvcihsb25nIGxvbmcpIFNldEJrQ29sb3IzMgpAQCAtMzUxLDcgKzM1MSw3IEBACiAzNDMgc3R1YiBTZXRXaW5NZXRhRmlsZUJpdHMKIDM0NCBzdGRjYWxsIFNldFdpbmRvd0V4dEV4KGxvbmcgbG9uZyBsb25nIHB0cikgU2V0V2luZG93RXh0RXgzMgogMzQ1IHN0ZGNhbGwgU2V0V2luZG93T3JnRXgobG9uZyBsb25nIGxvbmcgcHRyKSBTZXRXaW5kb3dPcmdFeDMyCi0zNDYgc3R1YiBTZXRXb3JsZFRyYW5zZm9ybQorMzQ2IHN0ZGNhbGwgU2V0V29ybGRUcmFuc2Zvcm0obG9uZyBwdHIpIFNldFdvcmxkVHJhbnNmb3JtCiAzNDcgc3R1YiBTdGFydERvY0EKIDM0OCBzdHViIFN0YXJ0RG9jVwogMzQ5IHN0dWIgU3RhcnRQYWdlCmRpZmYgLS1naXQgYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMgYi9yZWxheTMyL2tlcm5lbDMyLnNwZWMKaW5kZXggMWQyOWNmMi4uNjQ0OTc4YSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCisrKyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwpAQCAtNDQsOSArNDQsOSBAQAogCiAjIFdPVyBjYWxscwogIDU0IHN0ZGNhbGwgV09XQ2FsbGJhY2sxNihsb25nIGxvbmcpIFdPV0NhbGxiYWNrMTYKLSA1NSBzdHViIFdPV0NhbGxiYWNrMTZFeAorIDU1IHN0ZGNhbGwgV09XQ2FsbGJhY2sxNkV4KHB0ciBsb25nIGxvbmcgcHRyIHB0cikgV09XQ2FsbGJhY2sxNkV4CiAgNTYgc3RkY2FsbCBXT1dHZXRWRE1Qb2ludGVyKGxvbmcgbG9uZyBsb25nKSBXT1dHZXRWRE1Qb2ludGVyCi0gNTcgc3R1YiBXT1dIYW5kbGUzMgorIDU3IHN0ZGNhbGwgV09XSGFuZGxlMzIobG9uZyBsb25nKSBXT1dIYW5kbGUzMgogIDU4IHN0dWIgV09XSGFuZGxlMTYKICA1OSBzdGRjYWxsIFdPV0dsb2JhbEFsbG9jMTYobG9uZyBsb25nKSBHbG9iYWxBbGxvYzE2CiAgNjAgc3RkY2FsbCBXT1dHbG9iYWxMb2NrMTYobG9uZykgV0lOMTZfR2xvYmFsTG9jazE2CkBAIC0xMzksNyArMTM5LDcgQEAKIDE0OCBzdGRjYWxsIENvbnZlcnRUb0dsb2JhbEhhbmRsZShsb25nKSBDb252ZXJ0VG9HbG9iYWxIYW5kbGUKIDE0OSBzdGRjYWxsIENvcHlGaWxlQShzdHIgc3RyIGxvbmcpIENvcHlGaWxlMzJBCiAxNTAgc3RkY2FsbCBDb3B5RmlsZVcod3N0ciB3c3RyIGxvbmcpIENvcHlGaWxlMzJXCi0xNTEgc3R1YiBDcmVhdGVDb25zb2xlU2NyZWVuQnVmZmVyCisxNTEgc3RkY2FsbCBDcmVhdGVDb25zb2xlU2NyZWVuQnVmZmVyKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIpIENyZWF0ZUNvbnNvbGVTY3JlZW5CdWZmZXIKIDE1MiBzdGRjYWxsIENyZWF0ZURpcmVjdG9yeUEoc3RyIHB0cikgQ3JlYXRlRGlyZWN0b3J5MzJBCiAxNTMgc3RkY2FsbCBDcmVhdGVEaXJlY3RvcnlFeEEoc3RyIHN0ciBwdHIpIENyZWF0ZURpcmVjdG9yeUV4MzJBCiAxNTQgc3RkY2FsbCBDcmVhdGVEaXJlY3RvcnlFeFcod3N0ciB3c3RyIHB0cikgQ3JlYXRlRGlyZWN0b3J5RXgzMlcKQEAgLTYxMSw3ICs2MTEsNyBAQAogNjIwIHN0ZGNhbGwgU2V0Q29tbVRpbWVvdXRzKGxvbmcgcHRyKSBTZXRDb21tVGltZW91dHMKIDYyMSBzdHViIFNldENvbXB1dGVyTmFtZUEKIDYyMiBzdHViIFNldENvbXB1dGVyTmFtZVcKLTYyMyBzdHViIFNldENvbnNvbGVBY3RpdmVTY3JlZW5CdWZmZXIKKzYyMyBzdGRjYWxsIFNldENvbnNvbGVBY3RpdmVTY3JlZW5CdWZmZXIobG9uZykgU2V0Q29uc29sZUFjdGl2ZVNjcmVlbkJ1ZmZlcgogNjI0IHN0dWIgU2V0Q29uc29sZUNQCiA2MjUgc3RkY2FsbCBTZXRDb25zb2xlQ3RybEhhbmRsZXIocHRyIGxvbmcpIFNldENvbnNvbGVDdHJsSGFuZGxlcgogNjI2IHN0ZGNhbGwgU2V0Q29uc29sZUN1cnNvckluZm8obG9uZyBwdHIpIFNldENvbnNvbGVDdXJzb3JJbmZvMzIKQEAgLTcyMCw3ICs3MjAsNyBAQAogNzI5IHN0ZGNhbGwgV3JpdGVDb25zb2xlQShsb25nIHB0ciBsb25nIHB0ciBwdHIpIFdyaXRlQ29uc29sZTMyQQogNzMwIHN0dWIgV3JpdGVDb25zb2xlSW5wdXRBCiA3MzEgc3R1YiBXcml0ZUNvbnNvbGVJbnB1dFcKLTczMiBzdHViIFdyaXRlQ29uc29sZU91dHB1dEEKKzczMiBzdGRjYWxsIFdyaXRlQ29uc29sZU91dHB1dEEobG9uZyBwdHIgbG9uZyBsb25nIHB0cikgV3JpdGVDb25zb2xlT3V0cHV0MzJBCiA3MzMgc3R1YiBXcml0ZUNvbnNvbGVPdXRwdXRBdHRyaWJ1dGUKIDczNCBzdHViIFdyaXRlQ29uc29sZU91dHB1dENoYXJhY3RlckEKIDczNSBzdHViIFdyaXRlQ29uc29sZU91dHB1dENoYXJhY3RlclcKZGlmZiAtLWdpdCBhL3JlbGF5MzIvb2xlMzIuc3BlYyBiL3JlbGF5MzIvb2xlMzIuc3BlYwppbmRleCAzZmFhOWU1Li4xNTQ3ZjRjIDEwMDY0NAotLS0gYS9yZWxheTMyL29sZTMyLnNwZWMKKysrIGIvcmVsYXkzMi9vbGUzMi5zcGVjCkBAIC03LDE0ICs3LDE0IEBACiAgIDQgc3RkY2FsbCBDb0J1aWxkVmVyc2lvbigpIENvQnVpbGRWZXJzaW9uCiAgIDUgc3R1YiBDb0NyZWF0ZUZyZWVUaHJlYWRlZE1hcnNoYWxlcgogICA2IHN0dWIgQ29DcmVhdGVHdWlkCi0gIDcgc3R1YiBDb0NyZWF0ZUluc3RhbmNlCisgIDcgc3RkY2FsbCBDb0NyZWF0ZUluc3RhbmNlKHB0ciBwdHIgbG9uZyBwdHIgcHRyKSBDb0NyZWF0ZUluc3RhbmNlCiAgIDggc3RkY2FsbCBDb0Rpc2Nvbm5lY3RPYmplY3QocHRyIGxvbmcpIENvRGlzY29ubmVjdE9iamVjdAotICA5IHN0dWIgQ29Eb3NEYXRlVGltZVRvRmlsZVRpbWUKLSAxMCBzdHViIENvRmlsZVRpbWVOb3cKLSAxMSBzdHViIENvRmlsZVRpbWVUb0Rvc0RhdGVUaW1lCisgIDkgc3RkY2FsbCBDb0Rvc0RhdGVUaW1lVG9GaWxlVGltZShsb25nIGxvbmcgcHRyKSBEb3NEYXRlVGltZVRvRmlsZVRpbWUKKyAxMCBzdGRjYWxsIENvRmlsZVRpbWVOb3cocHRyKSBDb0ZpbGVUaW1lTm93CisgMTEgc3RkY2FsbCBDb0ZpbGVUaW1lVG9Eb3NEYXRlVGltZShwdHIgcHRyIHB0cikgRmlsZVRpbWVUb0Rvc0RhdGVUaW1lCiAgMTIgc3R1YiBDb0ZyZWVBbGxMaWJyYXJpZXMKICAxMyBzdHViIENvRnJlZUxpYnJhcnkKLSAxNCBzdHViIENvRnJlZVVudXNlZExpYnJhcmllcworIDE0IHN0ZGNhbGwgQ29GcmVlVW51c2VkTGlicmFyaWVzKCkgQ29GcmVlVW51c2VkTGlicmFyaWVzCiAgMTUgc3R1YiBDb0dldENhbGxlclRJRAogIDE2IHN0dWIgQ29HZXRDbGFzc09iamVjdAogIDE3IHN0dWIgQ29HZXRDdXJyZW50TG9naWNhbFRocmVhZElkCkBAIC0zOCw3ICszOCw3IEBACiAgMzUgc3R1YiBDb1F1ZXJ5UmVsZWFzZU9iamVjdAogIDM2IHN0dWIgQ29SZWdpc3RlckNsYXNzT2JqZWN0CiAgMzcgc3R1YiBDb1JlZ2lzdGVyTWFsbG9jU3B5Ci0gMzggc3RkY2FsbCBDb1JlZ2lzdGVyTWVzc2FnZUZpbHRlcihwdHIgcHRyKSBDb1JlZ2lzdGVyTWVzc2FnZUZpbHRlcgorIDM4IHN0ZGNhbGwgQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIocHRyIHB0cikgQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIzMgogIDM5IHN0dWIgQ29SZWxlYXNlTWFyc2hhbERhdGEKICA0MCBzdHViIENvUmV2b2tlQ2xhc3NPYmplY3QKICA0MSBzdHViIENvUmV2b2tlTWFsbG9jU3B5CmRpZmYgLS1naXQgYS9yZWxheTMyL3dpbm1tLnNwZWMgYi9yZWxheTMyL3dpbm1tLnNwZWMKaW5kZXggYTQyMTA4OC4uZjNiNDk0ZCAxMDA2NDQKLS0tIGEvcmVsYXkzMi93aW5tbS5zcGVjCisrKyBiL3JlbGF5MzIvd2lubW0uc3BlYwpAQCAtMzUsNyArMzUsNyBAQAogIDMyIHN0ZGNhbGwgam95R2V0VGhyZXNob2xkKGxvbmcgcHRyKSBqb3lHZXRUaHJlc2hvbGQzMgogIDMzIHN0dWIgam95UmVsZWFzZUNhcHR1cmUKICAzNCBzdHViIGpveVNldENhcHR1cmUKLSAzNSBzdHViIGpveVNldFRocmVzaG9sZAorIDM1IHN0ZGNhbGwgam95U2V0VGhyZXNob2xkKGxvbmcgbG9uZykgam95U2V0VGhyZXNob2xkMzIKICAzNiBzdHViIG1jaURyaXZlck5vdGlmeQogIDM3IHN0dWIgbWNpRHJpdmVyWWllbGQKICAzOCBzdHViIG1jaUV4ZWN1dGUKZGlmZiAtLWdpdCBhL3JlbGF5MzIvd293MzIuc3BlYyBiL3JlbGF5MzIvd293MzIuc3BlYwppbmRleCBjNjBlNThkLi41ZmY0NjkyIDEwMDY0NAotLS0gYS9yZWxheTMyL3dvdzMyLnNwZWMKKysrIGIvcmVsYXkzMi93b3czMi5zcGVjCkBAIC0zLDE4ICszLDE4IEBACiAKICAgMSBzdGRjYWxsIFdPV18xKGxvbmcgbG9uZykgV09XMzJfMQogICAyIHN0ZGNhbGwgV09XQ2FsbGJhY2sxNihsb25nIGxvbmcpIFdPV0NhbGxiYWNrMTYKLSAgMyBzdHViICAgIFdPV0NhbGxiYWNrMTZFeAorICAzIHN0ZGNhbGwgV09XQ2FsbGJhY2sxNkV4KHB0ciBsb25nIGxvbmcgcHRyIHB0cikgV09XQ2FsbGJhY2sxNkV4CiAgIDQgc3R1YiAgICBXT1dEaXJlY3RlZFlpZWxkMTYKICAgNSBzdGRjYWxsIFdPV0dldFZETVBvaW50ZXIobG9uZyBsb25nIGxvbmcpIFdPV0dldFZETVBvaW50ZXIKICAgNiBzdGRjYWxsIFdPV0dldFZETVBvaW50ZXJGaXgobG9uZyBsb25nIGxvbmcpIFdPV0dldFZETVBvaW50ZXJGaXgKICAgNyBzdGRjYWxsIFdPV0dldFZETVBvaW50ZXJVbmZpeChsb25nKSBXT1dHZXRWRE1Qb2ludGVyVW5maXgKICAgOCBzdHViICAgIFdPV0dsb2JhbEFsbG9jMTYKLSAgOSBzdHViICAgIFdPV0dsb2JhbEFsbG9jTG9jazE2CisgIDkgc3RkY2FsbCBXT1dHbG9iYWxBbGxvY0xvY2sxNihsb25nIGxvbmcgcHRyKSBXT1dHbG9iYWxBbGxvY0xvY2sxNgogIDEwIHN0dWIgICAgV09XR2xvYmFsRnJlZTE2CiAgMTEgc3R1YiAgICBXT1dHbG9iYWxMb2NrMTYKICAxMiBzdHViICAgIFdPV0dsb2JhbExvY2tTaXplMTYKICAxMyBzdHViICAgIFdPV0dsb2JhbFVubG9jazE2CiAgMTQgc3R1YiAgICBXT1dHbG9iYWxVbmxvY2tGcmVlMTYKICAxNSBzdHViICAgIFdPV0hhbmRsZTE2Ci0gMTYgc3R1YiAgICBXT1dIYW5kbGUzMgorIDE2IHN0ZGNhbGwgV09XSGFuZGxlMzIobG9uZyBsb25nKSBXT1dIYW5kbGUzMgogIDE3IHN0dWIgICAgV09XWWllbGQxNgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL01ha2VmaWxlLmluIGIvcmVzb3VyY2VzL01ha2VmaWxlLmluCmluZGV4IGE5OWI2MDUuLmRlYWYyNTYgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9NYWtlZmlsZS5pbgorKysgYi9yZXNvdXJjZXMvTWFrZWZpbGUuaW4KQEAgLTcsNiArNyw3IEBACiBSQ0ZMQUdTICAgPSAtdzMyCiAKIFJDX1NSQ1MgPSBcCisJc3lzcmVzX0NhLnJjIFwKIAlzeXNyZXNfQ3oucmMgXAogCXN5c3Jlc19EYS5yYyBcCiAJc3lzcmVzX0RlLnJjIFwKQEAgLTIwLDcgKzIxLDggQEAKIAlzeXNyZXNfS28ucmMgXAogCXN5c3Jlc19Oby5yYyBcCiAJc3lzcmVzX1BsLnJjIFwKLQlzeXNyZXNfUG8ucmMKKwlzeXNyZXNfUG8ucmMgXAorCXN5c3Jlc19Tdy5yYwogCiBDX1NSQ1MgPSBzeXNyZXMuYwogCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzLmMgYi9yZXNvdXJjZXMvc3lzcmVzLmMKaW5kZXggOTNlMTA1Ny4uMjVjNmQ5ZiAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlcy5jCisrKyBiL3Jlc291cmNlcy9zeXNyZXMuYwpAQCAtMjMsNiArMjMsOCBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqIGNvbnN0IHN5c3Jlc19IdV9UYWJsZVtdOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqIGNvbnN0IHN5c3Jlc19QbF9UYWJsZVtdOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqIGNvbnN0IHN5c3Jlc19Qb19UYWJsZVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqIGNvbnN0IHN5c3Jlc19Td19UYWJsZVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqIGNvbnN0IHN5c3Jlc19DYV9UYWJsZVtdOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3QgKiBTWVNSRVNfUmVzb3VyY2VzW10gPQogewpAQCAtMzksNyArNDEsOSBAQAogICAgIHN5c3Jlc19Lb19UYWJsZSwgIC8qIExBTkdfS28gKi8KICAgICBzeXNyZXNfSHVfVGFibGUsICAvKiBMQU5HX0h1ICovCiAgICAgc3lzcmVzX1BsX1RhYmxlLCAgLyogTEFOR19QbCAqLwotICAgIHN5c3Jlc19Qb19UYWJsZSAgIC8qIExBTkdfUG8gKi8KKyAgICBzeXNyZXNfUG9fVGFibGUsICAvKiBMQU5HX1BvICovCisgICAgc3lzcmVzX1N3X1RhYmxlLCAgLyogTEFOR19TdyAqLworICAgIHN5c3Jlc19DYV9UYWJsZSAgIC8qIExBTkdfQ2EgKi8KIH07CiAKIApkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19DYS5yYyBiL3Jlc291cmNlcy9zeXNyZXNfQ2EucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjZGFhZgotLS0gL2Rldi9udWxsCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfQ2EucmMKQEAgLTAsMCArMSwyNDggQEAKKworU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKK3sKKyBNRU5VSVRFTSAiJlJlc3RhdXJhY2nzIiwgNjE3MjgKKyBNRU5VSVRFTSAiJkRlc3BsYedhbWVudCIsIDYxNDU2CisgTUVOVUlURU0gIiZHcmFuZOByaWEiLCA2MTQ0MAorIE1FTlVJVEVNICJN7SZuaW1hIiwgNjE0NzIKKyBNRU5VSVRFTSAiTeAmeGltYSIsIDYxNDg4CisgTUVOVUlURU0gU0VQQVJBVE9SCisgTUVOVUlURU0gIiZUYW5jYXJcdEFsdC1GNCIsIDYxNTM2CisgTUVOVUlURU0gU0VQQVJBVE9SCisgTUVOVUlURU0gIkMmYW52aSBkZSB0YXNjYS4uLlx0Q3RybC1Fc2MiLCA2MTc0NAorIE1FTlVJVEVNIFNFUEFSQVRPUgorIE1FTlVJVEVNICImUXVhbnQgYSBXSU5FLi4uIiwgNjE3NjEKK30KKworRURJVE1FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisJUE9QVVAgIiIKKwlCRUdJTgorCQlNRU5VSVRFTSAiJkRlc2ZlciIsIEVNX1VORE8zMgorCQlNRU5VSVRFTSBTRVBBUkFUT1IKKwkJTUVOVUlURU0gIiZSZXRhbGxhciIsIFdNX0NVVAorCQlNRU5VSVRFTSAiJkNvcGlhciIsIFdNX0NPUFkKKwkJTUVOVUlURU0gIiZFbmdhbnhhciIsIFdNX1BBU1RFCisJCU1FTlVJVEVNICImU3VwcmltaXIiLCBXTV9DTEVBUgorCQlNRU5VSVRFTSBTRVBBUkFUT1IKKwkJTUVOVUlURU0gIlNlbGVjY2lvbmFyICZ0b3QgZWwgdGV4dCIsIEVNX1NFVFNFTDMyCisJRU5ECit9CisKK01TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKK1NUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitCRUdJTgorICAgICAgICBJQ09OICIiLCAxMDg4LCA4LCAyMCwgMTYsIDE2LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKKyAgICAgICAgTFRFWFQgIiIsIDEwMCwgMzIsIDQsIDE3NiwgNDgsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisgICAgICAgIFBVU0hCVVRUT04gIkQnQWNvcmQiLCAxLCAxNiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImQW51bLdsYWNp8yIsIDIsIDY0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZBYm9ydGFyIiwgMywgMTEyLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZSZWludGVudGFyIiwgNCwgMTYwLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZJZ25vcmFyIiwgNSwgMjA4LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZTaSIsIDYsIDI1NiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImTm8iLCA3LCAzMDQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKK0VORAorCitTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAyMTAsIDE1MgorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJRdWFudCBhICVzIgorRk9OVCAxMCwgIlN5c3RlbSIKK3sKKyBERUZQVVNIQlVUVE9OICJEJ0Fjb3JkIiwgMSwgMTUzLCAxMzAsIDUwLCAxMgorIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgorIElDT04gIiIsIDEwODgsIDE4OSwgMTAsIDE0LCAxNgorIExURVhUICIiLCAxMDAsIDgsIDEwLCAxMzcsIDMzCisgTFRFWFQgIldpbmUgaGEgZXN0YXQgY29uc3RydWl0IHBlcjoiLCA5OCwgOCwgNTUsIDEzNywgMTAKK30KKworT1BFTl9GSUxFIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjc1LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJPYnJpciIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZOb206IiwgMTA5MCwgNiwgNiwgNzYsIDkKKyBFRElUVEVYVCAxMTUyLCA2LCAxNiwgOTAsIDEyLCBFU19BVVRPSFNDUk9MTCB8IEVTX09FTUNPTlZFUlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCisgTElTVEJPWCAxMTIwLCA2LCAzMiwgOTAsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZEaXJlY3RvcmlzOiIsIC0xLCAxMTAsIDYsIDkyLCA5CisgTFRFWFQgIiIsIDEwODgsIDExMCwgMTgsIDkyLCA5LCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJlRpcHVzIGRlIGZpdHhlcnM6IiwgMTA4OSwgNiwgMTA0LCA5MCwgOQorIENPTUJPQk9YIDExMzYsIDYsIDExNCwgOTAsIDM2LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJlVuaXRhdHM6IiwgMTA5MSwgMTEwLCAxMDQsIDkyLCA5CisgQ09NQk9CT1ggMTEzNywgMTEwLCAxMTQsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIkQnYWNvcmQiLCAxLCAyMDgsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFudWy3bGFjafMiLCAyLCAyMDgsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkEmanVkYSIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIk5vbelzICZsZWN0dXJhIiwgMTA0MCwgMjA4LCA2OCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitTQVZFX0ZJTEUgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNzUsIDEzNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkFub21lbmFyIGkgZGVzYXIuLi4iCitGT05UIDgsICJIZWx2IgoreworIExURVhUICImTm9tOiIsIDEwOTAsIDYsIDYsIDc2LCA5CisgRURJVFRFWFQgMTE1MiwgNiwgMTYsIDkwLCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBFU19PRU1DT05WRVJUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAorIExJU1RCT1ggMTEyMCwgNiwgMzIsIDkwLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImRGlyZWN0b3JpczoiLCAtMSwgMTEwLCA2LCA5MiwgOQorIExURVhUICIiLCAxMDg4LCAxMTAsIDE4LCA5MiwgOSwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAorIExJU1RCT1ggMTEyMSwgMTEwLCAzMiwgOTIsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIkRlc2FyIGZpdHhlciBlbiBmJm9ybWF0OiIsIDEwODksIDYsIDEwNCwgOTAsIDkKKyBDT01CT0JPWCAxMTM2LCA2LCAxMTQsIDkwLCAzNiwgQ0JTX0RST1BET1dOTElTVCB8IENCU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZVbml0YXRzOiIsIDEwOTEsIDExMCwgMTA0LCA5MiwgOQorIENPTUJPQk9YIDExMzcsIDExMCwgMTE0LCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBERUZQVVNIQlVUVE9OICJEJ2Fjb3JkIiwgMSwgMjA4LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbnVst2xhY2nzIiwgMiwgMjA4LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBJmp1ZGEiLCAxMDM4LCAyMDgsIDQ2LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICImRmVyLW5lIGPycGlhIiwgMTA0MCwgMjA4LCA2OCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitQUklOVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiSW1wcmVzc2nzIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiSW1wcmVzc29yYToiLCAxMDg4LCA2LCA2LCA0MCwgOQorIExURVhUICJJbXByZXNzafMgZGVsIGRvY3VtZW50IiwgMTA4OSwgNjAsIDYsIDE1MCwgOQorIEdST1VQQk9YICIiLCAxMDcyLCA2LCAzMCwgMTYwLCA2NSwgQlNfR1JPVVBCT1gKKyBSQURJT0JVVFRPTiAiJlNlbmNlciIsIDEwNTYsIDE2LCA0NSwgNjAsIDEyCisgUkFESU9CVVRUT04gIiZQYXJ0IHNlbGVjY2lvbmFkYSIsIDEwNTcsIDE2LCA2MCwgNjAsIDEyCisgUkFESU9CVVRUT04gIlDgJmdpbmVzIiwgMTA1OCwgMTYsIDc1LCA2MCwgMTIKKyBERUZQVVNIQlVUVE9OICJEJ2Fjb3JkIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbnVst2xhY2nzIiwgMiwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImQ29uZmlndXJhY2nzIiwgMTAyNCwgMjA2LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiUCZyaW1lcmE6IiwgMTA5MCwgNjAsIDgwLCAzMCwgOQorIExURVhUICLaJmx0aW1hOiIsIDEwOTEsIDEyMCwgODAsIDMwLCA5CisgTFRFWFQgIiZRdWFsaXRhdDoiLCAxMDkyLCA2LCAxMDAsIDc2LCA5CisgQ09NQk9CT1ggMTEzNiwgODAsIDEwMCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIkltcHJpbWlyIGVuIHVuICZmaXR4ZXIiLCAxMDQwLCAyMCwgMTAwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICJTJmVwYXJhciBsZXMgY/JwaWVzIiwgMTA0MSwgMTYwLCAxMDAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworUFJJTlRfU0VUVVAgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNjQsIDEzNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkNvbmZpZ3VyYWNp8yBkZSBsYSBpbXByZXNzafMiCitGT05UIDgsICJIZWx2IgoreworIEdST1VQQk9YICJJbXByZXNzb3JhOiIsIDEwNzIsIDYsIDEwLCAxODAsIDY1LCBCU19HUk9VUEJPWAorIFJBRElPQlVUVE9OICJJbXByZXNzb3JhIHBlciAmZGVmZWN0ZSIsIDEwNTYsIDE2LCAyMCwgODAsIDEyCisgTFRFWFQgIltub25lXSIsIDEwODgsIDM1LCAzNSwgMTIwLCA5CisgUkFESU9CVVRUT04gIkltcHJlc3NvcmEgJmVzcGVjaWZpY2FkYToiLCAxMDU3LCAxNiwgNTAsIDgwLCAxMgorIENPTUJPQk9YIDExMzYsIDM1LCA2NSwgMTQ5LCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIkQnYWNvcmQiLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFudWy3bGFjafMiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZPcGNpb25zIiwgMTAyNCwgMjA2LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBHUk9VUEJPWCAiT3JpZW50YWNp8yIsIDEwNzMsIDYsIDg1LCAxMDAsIDUwLCBCU19HUk9VUEJPWAorIFJBRElPQlVUVE9OICImVmVydGljYWwiLCAxMDU4LCA1MCwgMTAwLCA0MCwgMTIKKyBSQURJT0JVVFRPTiAiJkhvcml0em9udGFsIiwgMTA1OSwgNTAsIDExNSwgNDAsIDEyCisgSUNPTiAiTEFORFNDQVAiLCAxMDk3LCAxMCwgOTUsIDMyLCAzMgorIElDT04gIlBPUlRSQUlUIiwgMTA5OCwgMTAsIDk1LCAzMiwgMzIKKyBHUk9VUEJPWCAiUGFwZXIiLCAxMDc0LCAxMjAsIDg1LCAxODAsIDUwLCBCU19HUk9VUEJPWAorIExURVhUICImTWlkYSIsIDEwODksIDEzMCwgOTUsIDMwLCA5CisgTFRFWFQgIkEmbGltZW50YWNp8zoiLCAxMDkwLCAxMzAsIDExMCwgMzAsIDkKKyBDT01CT0JPWCAxMTM3LCAxNTUsIDk1LCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBDT01CT0JPWCAxMTM4LCAxNTUsIDExMCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCit9CisKKworQ0hPT1NFX0ZPTlQgRElBTE9HIERJU0NBUkRBQkxFICAxMywgNTQsIDI2NCwgMTQ3CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiVGlwdXMgZGUgbGxldHJhIgorRk9OVCA4LCAiSGVsdiIKK3sKKyAgICBMVEVYVCAgICAgICAgICAgIiZUaXB1cyBkZSBsbGV0cmE6IiwxMDg4ICw2LDMsNDAsOQorICAgIENPTUJPQk9YICAgICAgICAxMTM2ICw2LDEzLDk0LDU0LCAgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwKKyAgICAgICAgICAgICAgICAgICAgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUCB8IENCU19TSU1QTEUKKyAgICBMVEVYVCAgICAgICAgICAgIiZFc3RpbCBkZWwgdGlwdXMgZGUgbGxldHJhOiIsMTA4OSAsMTA4LDMsNDQsOQorICAgIENPTUJPQk9YICAgICAgICAxMTM3LDEwOCwxMyw2NCw1NCwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwKKyAgICAgICAgICAgICAgICAgICAgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AgfCBDQlNfU0lNUExFCisgICAgTFRFWFQgICAgICAgICAgICImR3JhbmTgcmlhOiIsMTA5MCwxNzksMywzMCw5CisgICAgQ09NQk9CT1ggICAgICAgIDExMzgsMTc5LDEzLDMyLDU0LCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfSEFTU1RSSU5HUyB8IENCU19ESVNBQkxFTk9TQ1JPTEwgfAorICAgICAgICAgICAgICAgICAgICBXU19WU0NST0xMIHwgV1NfVEFCU1RPUCB8IENCU19TSU1QTEUgfCBDQlNfU09SVAorICAgIERFRlBVU0hCVVRUT04gICAiRCdhY29yZCIsSURPSywyMTgsNiw0MCwxNCxXU19HUk9VUAorICAgIFBVU0hCVVRUT04gICAgICAiQW51bLdsYWNp8yIsSURDQU5DRUwsMjE4LDIzLDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICJBJnBsaWNhciIsIDEwMjYsMjE4LDQwLDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICJBJmp1ZGEiICwgMTAzOCwyMTgsNTcsNDAsMTQsV1NfR1JPVVAKKyAgICBHUk9VUEJPWCAgICAgICAgIkVmZWN0ZXMiLDEwNzIsNiw3Miw4NCwzNCxXU19HUk9VUAorICAgIENIRUNLQk9YICAgICAgICAiJkJhcnJhci1sbyIsIDEwNDAsIDEwLDgyLDUwLDEwLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QCisgICAgQ0hFQ0tCT1ggICAgICAgICImU3VicmF0bGxhci1sbyIsIDEwNDEsIDEwLDk0LDUwLDEwLCBCU19BVVRPQ0hFQ0tCT1gKKyAgICBMVEVYVCAgICAgICAgICAgIiZDb2xvcjoiLCAxMDkxICw2LDExMCwzMCw5CisgICAgQ09NQk9CT1ggICAgICAgIDExMzksNiwxMjAsODQsMTAwLENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfSEFTU1RSSU5HUyB8CisgICAgICAgICAgICAgICAgICAgIENCU19BVVRPSFNDUk9MTCB8ICBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorICAgIEdST1VQQk9YICAgICAgICAiRXhlbXBsZSIsMTA3Myw5OCw3MiwxNjAsNDksV1NfR1JPVVAKKyAgICBDVEVYVCAgICAgICAgICAgIkFhQmJZeVp6IiwxMDkzLDEwNCw4MSwxNDksMzcsU1NfTk9QUkVGSVggfCBXU19WSVNJQkxFCit9CisKKworQ0hPT1NFX0NPTE9SIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMzAwLCAyMDAKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJDb2xvciIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIkNvbG9ycyAmYuFzaWNzOiIsIDEwODgsIDQsIDQsIDE0MCwgMTAKKyBMVEVYVCAiQ29sb3JzIHBlcnNvbiZhbGl0emF0czoiLCAxMDg5LCA0LCAxMDYsIDE0MCwgMTAKKyBMVEVYVCAiQ29sb3IgU/JsJmlkIiwgMTA5MCwgMTUwLCAxNTEsIDQ4LCAxMAorIExURVhUICAgIiZSb2lnOiIsIDcyNiAvKjEwOTQqLywyNDksMTI2LDI0LDEwCisgRURJVFRFWFQgNzA2LCAyNzUsMTI0LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgICImVmVyZDoiLDcyNy8qMTA5NSovLDI0OSwxNDAsMjQsMTAKKyBFRElUVEVYVCA3MDcsIDI3NSwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAgIkJsYSZ1OiIsNzI4IC8qMTA5NiovLDI0OSwxNTQsMjQsMTAKKyBFRElUVEVYVCA3MDgsIDI3NSwxNTIsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAiJlRpbnQ6IiAsNzIzIC8qMTA5MSovLDIwMiwxMjYsMjIsMTAKKyBFRElUVEVYVCA3MDMsIDIyNiwxMjQsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAiJlNhdC46IiAsNzI0IC8qMTA5MiovLDIwMiwxNDAsMjIsMTAKKyBFRElUVEVYVCA3MDQsIDIyNiwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAiJkxsdW0uOiIgLDcyNSAvKjEwOTMqLywyMDIsMTU0LDIyLDEwCisgRURJVFRFWFQgNzA1LCAyMjYsMTUyLDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDT05UUk9MICIiICw3MjAsIlNUQVRJQyIsU1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsNCwxNCwxNDAsODYKKyBDT05UUk9MICIiICw3MjEsIlNUQVRJQyIsU1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsNCwxMTYsMTQwLDI4CisgQ09OVFJPTCAiIiAsNzEwLCJTVEFUSUMiLFdTX0JPUkRFUnxTU19TSU1QTEV8V1NfVEFCU1RPUHxXU19HUk9VUCwgMTUyLDQsMTE4LDExNiBDT05UUk9MICIiICw3MDIsIlNUQVRJQyIsU1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDI3OCw0LDgsMTE2CisgQ09OVFJPTCAiIiAsNzAyLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAyNzgsNCw4LDExNgorIENPTlRST0wgIiIgLDcwOSwiU1RBVElDIixTU19TSU1QTEV8V1NfVEFCU1RPUHxXU19HUk9VUCwgMTUyLDEyNCw0MCwyNgorIERFRlBVU0hCVVRUT04gIkQnYWNvcmQiLCAgMSwgIDQsIDE2NiwgNDQsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQW51bLdsYWNp8yIsIDIsIDUyLCAxNjYsIDQ0LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQSZqdWRhIiwgMTAzOCwxMDAsMTY2LCA0NCwgMTQKKyBQVVNIQlVUVE9OICJBZmVnaXIgYWxzICZjb2xvcnMgcGVyc29uYWxpdHphdHMiLCA3MTIvKjEwMjQqLywgMTUyLCAxNjYsIDE0MiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZEZWZpbmlyIGNvbG9ycyBwZXJzb25hbGl0emF0cyA+PiIsIDcxOS8qMTAyNSovLCAgIDQsIDE1MCwgMTQyLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAgIiZpIiw3MTMsMzAwLDIwMCw0LDE0ICAgLyoganVzdCBhIGR1bW15OiAgJ2knIGlzICBsaWtlICAmaSBpbiAic29sJmlkIiAqLworfQorCisKK0ZJTkRfVEVYVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDIzNiwgNjIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJDZXJjYSIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZDZXJjYXI6IiwgIC0xLCA0LCA4LCA0MiwgOAorIEVESVRURVhUIDExNTIsIDQ3LCA3LCAxMjgsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICJDJmVyY2FyIG1vdHMgc2VuY2VycyIsIDEwNDAsIDQsIDI2LCAxMDAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiJkRpc3RpbmdpciBtYWr6c2N1bGVzIGRlIG1pbvpzY3VsZXMiLCAxMDQxLCA0LCA0MiwgNjQsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QCisgR1JPVVBCT1ggIkRpcmVjY2nzIiwgMTA3MiwgMTA3LCAyNiwgNjgsIDI4CisgQ09OVFJPTCAiJkFtdW50IiwgMTA1NiwgIkJVVFRPTiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMTExLCAzOCwgMjAsIDEyCisgQ09OVFJPTCAiQSZ2YWxsIiwgMTA1NywgIkJVVFRPTiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AsIDEzOCwgMzgsIDMwLCAxMgorIERFRlBVU0hCVVRUT04gIiZDb250aW51YWNp8yIsIDEsIDE4MiwgNSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbnVst2xhY2nzIiwgMiwgMTgyLCAyMywgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBJmp1ZGEiLCAxMDM4LCAxODIsIDQ1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1JFUExBQ0VfVEVYVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDIzMCwgOTQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJTdWJzdGl0dWNp8yIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZDZXJjYXI6IiwgLTEsIDQsIDksIDQ4LCA4CisgRURJVFRFWFQgMTE1MiwgNTQsIDcsIDExNCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZTdWJzdGl0dWlyIHBlcjoiLCAxMDkwLCAtMSwgNCwgMjYsIDQ4LCA4CisgRURJVFRFWFQgMTE1MywgNTQsIDI0LCAxMTQsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICJDZXJjYXIgJm1vdHMgc2VuY2VycyIsIDEwNDAsIDUsIDQ2LCAxMDQsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiJkRpc3RpbmdpciBtYWr6c2N1bGVzIGRlIG1pbvpzY3VsZXMiLCAxMDQxLCA1LCA2MiwgNTksIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiQyZvbnRpbnVjYWNp8yIsIDEsIDE3NCwgNCwgNTAsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiUyZ1YnN0aXR1Y2nzIiwgMTAyNCwgMTc0LCAyMSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJTdWJzdGl0dWNp8yAmYXV0b23gdGljYSIsIDEwMjUsIDE3NCwgMzgsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiVGFuY2FyIiwgMiwgMTc0LCA1NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBJmp1ZGEiLCAxMDM4LCAxNzQsIDc1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Tdy5yYyBiL3Jlc291cmNlcy9zeXNyZXNfU3cucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwZDdjZgotLS0gL2Rldi9udWxsCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfU3cucmMKQEAgLTAsMCArMSwyNjIgQEAKK1NZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisgTUVOVUlURU0gIiZSZXN0b3JlIiwgNjE3MjgKKyBNRU5VSVRFTSAiJkZseXR0YSIsIDYxNDU2CisgTUVOVUlURU0gIiZTdG9ybGVrIiwgNjE0NDAKKyBNRU5VSVRFTSAiTWkmbmltZXJhIiwgNjE0NzIKKyBNRU5VSVRFTSAiTWEmeGltZXJhIiwgNjE0ODgKKyBNRU5VSVRFTSBTRVBBUkFUT1IKKyBNRU5VSVRFTSAiJkF2c2x1dGFcdEFsdC1GNCIsIDYxNTM2CisgTUVOVUlURU0gU0VQQVJBVE9SCisgTUVOVUlURU0gIiZCeXQgdGlsbCAuLi5cdEN0cmwtRXNjIiwgNjE3NDQKKyBNRU5VSVRFTSBTRVBBUkFUT1IKKyBNRU5VSVRFTSAiJk9tIFdJTkUgLi4uIiwgNjE3NjEKK30KKworRURJVE1FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisJUE9QVVAgIiIKKwlCRUdJTgorCQlNRU5VSVRFTSAiJlVuZG8iLCBFTV9VTkRPMzIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJLJmxpcHAiLCBXTV9DVVQKKwkJTUVOVUlURU0gIiZLb3BpZXJhIiwgV01fQ09QWQorCQlNRU5VSVRFTSAiS2xpc3RyYSAmaW4iLCBXTV9QQVNURQorCQlNRU5VSVRFTSAiJlRhIGJvcnQiLCBXTV9DTEVBUgorCQlNRU5VSVRFTSBTRVBBUkFUT1IKKwkJTUVOVUlURU0gIk1hcmtlcmEgJmFsbGEiLCBFTV9TRVRTRUwzMgorCUVORAorfQorCitNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CitTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQkVHSU4KKyAgICAgICAgSUNPTiAiIiwgMTA4OCwgOCwgMjAsIDE2LCAxNiwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFCisgICAgICAgIExURVhUICIiLCAxMDAsIDMyLCA0LCAxNzYsIDQ4LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorICAgICAgICBQVVNIQlVUVE9OICImT2siLCAxLCAxNiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImQ2FuY2VsIiwgMiwgNjQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJkFib3J0IiwgMywgMTEyLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZSZXRyeSIsIDQsIDE2MCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImSWdub3JlIiwgNSwgMjA4LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZZZXMiLCA2LCAyNTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJk5vIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCitFTkQKKworU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiT20gJXMiCitGT05UIDEwLCAiU3lzdGVtIgoreworIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgMTUzLCAxMzAsIDUwLCAxMgorIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgorIElDT04gIiIsIDEwODgsIDE4OSwgMTAsIDE0LCAxNgorIExURVhUICIiLCAxMDAsIDgsIDEwLCAxMzcsIDMzCisgTFRFWFQgIldpbmUgd2FzIGJyb3VnaHQgdG8geW91IGJ5OiIsIDk4LCA4LCA1NSwgMTM3LCAxMAorfQorCitPUEVOX0ZJTEUgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNzUsIDEzNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gItZwcG5hIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiRmlsJm5hbW46IiwgMTA5MCwgNiwgNiwgNzYsIDkKKyBFRElUVEVYVCAxMTUyLCA2LCAxNiwgOTAsIDEyLCBFU19BVVRPSFNDUk9MTCB8IEVTX09FTUNPTlZFUlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCisgTElTVEJPWCAxMTIwLCA2LCAzMiwgOTAsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZLYXRhbG9nZXI6IiwgLTEsIDExMCwgNiwgOTIsIDkKKyBMVEVYVCAiIiwgMTA4OCwgMTEwLCAxOCwgOTIsIDksIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKKyBMSVNUQk9YIDExMjEsIDExMCwgMzIsIDkyLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICJMaXN0YSD2dmVyIGZpbGVyIGF2ICZ0eXBlOiIsIDEwODksIDYsIDEwNCwgOTAsIDkKKyBDT01CT0JPWCAxMTM2LCA2LCAxMTQsIDkwLCAzNiwgQ0JTX0RST1BET1dOTElTVCB8IENCU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZLYXRhbG9nZXI6IiwgMTA5MSwgMTEwLCAxMDQsIDkyLCA5CisgQ09NQk9CT1ggMTEzNywgMTEwLCAxMTQsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gItZwcG5hIiwgMSwgMjA4LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBdmJyeXQiLCAyLCAyMDgsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZIauRscCIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIiZTa3JpdnNreWRkYXQiLCAxMDQwLCAyMDgsIDY4LCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1NBVkVfRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiU3BhcmEgc29tIC4uLiIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZGaWxuYW1uOiIsIDEwOTAsIDYsIDYsIDc2LCA5CisgRURJVFRFWFQgMTE1MiwgNiwgMTYsIDkwLCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBFU19PRU1DT05WRVJUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAorIExJU1RCT1ggMTEyMCwgNiwgMzIsIDkwLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImS2F0YWxvZ2VyOiIsIC0xLCAxMTAsIDYsIDkyLCA5CisgTFRFWFQgIiIsIDEwODgsIDExMCwgMTgsIDkyLCA5LCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiTGlzdGEg9nZlciBmaWxlciBhdiAmdHlwZW46IiwgMTA4OSwgNiwgMTA0LCA5MCwgOQorIENPTUJPQk9YIDExMzYsIDYsIDExNCwgOTAsIDM2LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJkthdGFsb2dlcjoiLCAxMDkxLCAxMTAsIDEwNCwgOTIsIDkKKyBDT01CT0JPWCAxMTM3LCAxMTAsIDExNCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiU3BhcmEgc29tIiwgMSwgMjA4LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBdmJyeXQiLCAyLCAyMDgsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZIauRscCIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIiZTa3JpdnNreWRkYWQiLCAxMDQwLCAyMDgsIDY4LCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1BSSU5UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJTa3JpdiB1dCIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIlNrcml2YXJlOiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIiIsIDEwODksIDYwLCA2LCAxNTAsIDkKKyBHUk9VUEJPWCAiU2tyaXYgdXQgZGVsIiwgMTA3MiwgNiwgMzAsIDE2MCwgNjUsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIiZBbGx0IiwgMTA1NiwgMTYsIDQ1LCA2MCwgMTIKKyBSQURJT0JVVFRPTiAiJk1hcmtlcmF0IiwgMTA1NywgMTYsIDYwLCA2MCwgMTIKKyBSQURJT0JVVFRPTiAiJlNpZG9yIiwgMTA1OCwgMTYsIDc1LCA2MCwgMTIKKyBERUZQVVNIQlVUVE9OICJTa3JpdiB1dCIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQXZicnl0IiwgMiwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImSW5zdORsbG5pbmdhciIsIDEwMjQsIDIwNiwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZGcuVtOiIsIDEwOTAsIDYwLCA4MCwgMzAsIDkKKyBMVEVYVCAiJlRpbGw6IiwgMTA5MSwgMTIwLCA4MCwgMzAsIDkKKyBMVEVYVCAiVXRza3JpZnRza3ZhbGl0ZXQ6IiwgMTA5MiwgNiwgMTAwLCA3NiwgOQorIENPTUJPQk9YIDExMzYsIDgwLCAxMDAsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICImU2tyaXYgdGlsbCBmaWwiLCAxMDQwLCAyMCwgMTAwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICJTYW1tYW50cnlja3QiLCAxMDQxLCAxNjAsIDEwMCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitQUklOVF9TRVRVUCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiU2tyaXZhciBpbnN05GxsbmluZ2FyIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBHUk9VUEJPWCAiU2tyaXZhcmUiLCAxMDcyLCA2LCAxMCwgMTgwLCA2NSwgQlNfR1JPVVBCT1gKKyBSQURJT0JVVFRPTiAiJlN0YW5kYXJkc2tyaXZhcmUiLCAxMDU2LCAxNiwgMjAsIDgwLCAxMgorIExURVhUICJbbm9uZV0iLCAxMDg4LCAzNSwgMzUsIDEyMCwgOQorIFJBRElPQlVUVE9OICJTcGVjaWZpZXJhZCAmc2tyaXZhcmUiLCAxMDU3LCAxNiwgNTAsIDgwLCAxMgorIENPTUJPQk9YIDExMzYsIDM1LCA2NSwgMTQ5LCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIk9rIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBdmJyeXQiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZJbnN05GxsbmluZ2FyIiwgMTAyNCwgMjA2LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBHUk9VUEJPWCAiT3JpZW50ZXJpbmciLCAxMDczLCA2LCA4NSwgMTAwLCA1MCwgQlNfR1JPVVBCT1gKKyBSQURJT0JVVFRPTiAiJlBvcnRy5HR0IiwgMTA1OCwgNTAsIDEwMCwgNDAsIDEyCisgUkFESU9CVVRUT04gIiZMYW5kc2thcCIsIDEwNTksIDUwLCAxMTUsIDQwLCAxMgorIElDT04gIkxBTkRTQ0FQIiwgMTA5NywgMTAsIDk1LCAzMiwgMzIKKyBJQ09OICJQT1JUUkFJVCIsIDEwOTgsIDEwLCA5NSwgMzIsIDMyCisgR1JPVVBCT1ggIlBhcGVyIiwgMTA3NCwgMTIwLCA4NSwgMTgwLCA1MCwgQlNfR1JPVVBCT1gKKyBMVEVYVCAiJlN0b3JsZWsiLCAxMDg5LCAxMzAsIDk1LCAzMCwgOQorIExURVhUICImS+RsbGEiLCAxMDkwLCAxMzAsIDExMCwgMzAsIDkKKyBDT01CT0JPWCAxMTM3LCAxNTUsIDk1LCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBDT01CT0JPWCAxMTM4LCAxNTUsIDExMCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCit9CisKKworQ0hPT1NFX0ZPTlQgRElBTE9HIERJU0NBUkRBQkxFICAxMywgNTQsIDI2NCwgMTQ3CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiRm9udCIKK0ZPTlQgOCwgIkhlbHYiCit7CisgICAgTFRFWFQgICAgICAgICAgICImRm9udDoiLDEwODggLDYsMyw0MCw5CisgICAgQ09NQk9CT1ggICAgICAgIDExMzYgLDYsMTMsOTQsNTQsICBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfSEFTU1RSSU5HUyB8IENCU19ESVNBQkxFTk9TQ1JPTEwgfAorICAgICAgICAgICAgICAgICAgICBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QIHwgQ0JTX1NJTVBMRQorICAgIExURVhUICAgICAgICAgICAiRm9udCBTJnRpbDoiLDEwODkgLDEwOCwzLDQ0LDkKKyAgICBDT01CT0JPWCAgICAgICAgMTEzNywxMDgsMTMsNjQsNTQsIENCU19PV05FUkRSQVdGSVhFRCB8IENCU19IQVNTVFJJTkdTIHwgQ0JTX0RJU0FCTEVOT1NDUk9MTCB8CisgICAgICAgICAgICAgICAgICAgIFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QIHwgQ0JTX1NJTVBMRQorICAgIExURVhUICAgICAgICAgICAiJlN0b3JsZWs6IiwxMDkwLDE3OSwzLDMwLDkKKyAgICBDT01CT0JPWCAgICAgICAgMTEzOCwxNzksMTMsMzIsNTQsIENCU19PV05FUkRSQVdGSVhFRCB8IENCU19IQVNTVFJJTkdTIHwgQ0JTX0RJU0FCTEVOT1NDUk9MTCB8CisgICAgICAgICAgICAgICAgICAgIFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QIHwgQ0JTX1NJTVBMRSB8IENCU19TT1JUCisgICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywyMTgsNiw0MCwxNCxXU19HUk9VUAorICAgIFBVU0hCVVRUT04gICAgICAiQXZicnl0IixJRENBTkNFTCwyMTgsMjMsNDAsMTQsV1NfR1JPVVAKKyAgICBQVVNIQlVUVE9OICAgICAgIiZBbnbkbmQiLCAxMDI2LDIxOCw0MCw0MCwxNCxXU19HUk9VUAorICAgIFBVU0hCVVRUT04gICAgICAiJkhq5GxwIiAsIDEwMzgsMjE4LDU3LDQwLDE0LFdTX0dST1VQCisgICAgR1JPVVBCT1ggICAgICAgICJFZmZla3RlciIsMTA3Miw2LDcyLDg0LDM0LFdTX0dST1VQCisgICAgQ0hFQ0tCT1gJICAgICJTdHJpJmtlb3V0IiwgMTA0MCwgMTAsODIsNTAsMTAsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AKKyAgICBDSEVDS0JPWCAJICAgICImVW5kZXJzdHJ5a2VuIiwgMTA0MSwgMTAsOTQsNTAsMTAsIEJTX0FVVE9DSEVDS0JPWCAKKyAgICBMVEVYVCAgICAgICAgICAgIiZG5HJnOiIsIDEwOTEgLDYsMTEwLDMwLDkKKyAgICBDT01CT0JPWCAgICAgICAgMTEzOSw2LDEyMCw4NCwxMDAsQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19IQVNTVFJJTkdTIHwKKwkJICAgIENCU19BVVRPSFNDUk9MTCB8ICBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorICAgIEdST1VQQk9YICAgICAgICAiVGVzdCIsMTA3Myw5OCw3MiwxNjAsNDksV1NfR1JPVVAKKyAgICBDVEVYVCAgICAgICAgICAgIkFhQmJZeVp6IiwxMDkzLDEwNCw4MSwxNDksMzcsU1NfTk9QUkVGSVggfCBXU19WSVNJQkxFCit9CisKKworQ0hPT1NFX0NPTE9SIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMzAwLCAyMDAKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJG5HJnIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiJkdydW5kbORnZ2FuZGUgZuRyZ2VyOiIsICAgMTA4OCwgNCwgICAgNCwgIDE0MCwgMTAKKyBMVEVYVCAiJkVnZW5kZWZpbmVyYWRlIGbkcmdlcjoiLCAgMTA4OSwgNCwgICAxMDYsIDE0MCwgMTAKKyBMVEVYVCAiRW5m5HJnYXQiLCAgMTA5MCwgMTUwLCAxNTEsICA0OCwgMTAKKyBMVEVYVCAgICImUvZkOiIsIDcyNiAvKjEwOTQqLywyNDksMTI2LDI0LDEwCisgRURJVFRFWFQgNzA2LCAyNzUsMTI0LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgICImR3L2bjoiLDcyNy8qMTA5NSovLDI0OSwxNDAsMjQsMTAKKyBFRElUVEVYVCA3MDcsIDI3NSwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAgIiZCbOU6Iiw3MjggLyoxMDk2Ki8sMjQ5LDE1NCwyNCwxMAorIEVESVRURVhUIDcwOCwgMjc1LDE1MiwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgICImSW50OiIgLDcyMyAvKjEwOTEqLywyMDIsMTI2LDIyLDEwCisgRURJVFRFWFQgNzAzLCAyMjYsMTI0LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgIiZNZXQ6IiAsNzI0IC8qMTA5MiovLDIwMiwxNDAsMjIsMTAKKyBFRElUVEVYVCA3MDQsIDIyNiwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAiJkx1bToiICw3MjUgLyoxMDkzKi8sMjAyLDE1NCwyMiwxMAorIEVESVRURVhUIDcwNSwgMjI2LDE1MiwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ09OVFJPTCAiIiAsNzIwLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTQsMTQwLDg2CisgQ09OVFJPTCAiIiAsNzIxLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTE2LDE0MCwyOAorIENPTlRST0wgIiIgLDcxMCwiU1RBVElDIixXU19CT1JERVJ8U1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDE1Miw0LDExOCwxMTYKKyBDT05UUk9MICIiICw3MDIsIlNUQVRJQyIsU1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDI3OCw0LDgsMTE2CisgQ09OVFJPTCAiIiAsNzA5LCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAxNTIsMTI0LDQwLDI2CisgREVGUFVTSEJVVFRPTiAiT2siLCAgMSwgIDQsIDE2NiwgNDQsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQXZicnl0IiwgMiwgNTIsIDE2NiwgNDQsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJIauRscCIsIDEwMzgsMTAwLDE2NiwgNDQsIDE0CisgUFVTSEJVVFRPTiAiJkzkZ2cgdGlsbCBlZ2VuZGVmaW5lcmFkIGbkcmciLCAgICA3MTIvKjEwMjQqLywgMTUyLCAxNjYsIDE0MiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZEZWZpbmduZXJhIGVnZW4gZuRyZyA+PiIsIDcxOS8qMTAyNSovLCAgIDQsIDE1MCwgMTQyLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAgIiZpIiw3MTMsMzAwLDIwMCw0LDE0ICAgLyoganVzdCBhIGR1bW15OiAgJ2knIGlzICBsaWtlICAmaSAgaW4gInNvbCZpZCIgICovCit9CisKKworRklORF9URVhUIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjM2LCA2MgorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIlP2ayIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZT9msgZWZ0ZXIgdmFkOiIsIC0xLCA0LCA4LCA0MiwgOAorIEVESVRURVhUIDExNTIsIDQ3LCA3LCAxMjgsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICImQmFyYSBoZWxhIG9yZCIsIDEwNDAsIDQsIDI2LCAxMDAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiJlNraWxsbmFkIHDlIHN0b3JhL3Nt5SBib2tzdOR2ZXIiLCAxMDQxLCA0LCA0MiwgNjQsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QCisgR1JPVVBCT1ggIlJpa3RuaW5nIiwgMTA3MiwgMTA3LCAyNiwgNjgsIDI4CisgQ09OVFJPTCAiJlVwcCIsIDEwNTYsICJCVVRUT04iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDExMSwgMzgsIDIwLCAxMgorIENPTlRST0wgIiZOZXIiLCAxMDU3LCAiQlVUVE9OIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUCwgMTM4LCAzOCwgMzAsIDEyCisgREVGUFVTSEJVVFRPTiAiJlP2ayBlZnRlciBu5HN0YSIsIDEsIDE4MiwgNSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBdmJyeXQiLCAyLCAxODIsIDIzLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZIauRscCIsIDEwMzgsIDE4MiwgNDUsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworUkVQTEFDRV9URVhUIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjMwLCA5NAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIlP2ay9lcnPkdHQiCitGT05UIDgsICJIZWx2IgoreworIExURVhUICImU/ZrYSBlZnRlcjoiLCAtMSwgNCwgOSwgNDgsIDgKKyBFRElUVEVYVCAxMTUyLCA1NCwgNywgMTE0LCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJkVyc+R0dGEgbWVkOiIsIC0xLCA0LCAyNiwgNDgsIDgKKyBFRElUVEVYVCAxMTUzLCA1NCwgMjQsIDExNCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIiZCYXJhIGhlbGEgb3JkIiwgMTA0MCwgNSwgNDYsIDEwNCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICImU2tpbGxuYWQgcOUgc3RvcmEvc23lIGJva3N05HZlciIsIDEwNDEsIDUsIDYyLCA1OSwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AKKyBERUZQVVNIQlVUVE9OICImU/ZrIGVmdGVyIG7kc3RhIiwgMSwgMTc0LCA0LCA1MCwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImRXJz5HR0IiwgMTAyNCwgMTc0LCAyMSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJFcnPkdHQgJmFsbGEiLCAxMDI1LCAxNzQsIDM4LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkF2YnJ5dCIsIDIsIDE3NCwgNTUsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkhq5GxwIiwgMTAzOCwgMTc0LCA3NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9jcml0c2VjdGlvbi5jIGIvc2NoZWR1bGVyL2NyaXRzZWN0aW9uLmMKaW5kZXggZGM5MTY1MS4uYzk3YzI5NSAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL2NyaXRzZWN0aW9uLmMKKysrIGIvc2NoZWR1bGVyL2NyaXRzZWN0aW9uLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NlbS5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgpAQCAtMjMwLDYgKzIzMSwxNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlaW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiAgIChLRVJORUwzMi41ODEpCisgKi8KK3ZvaWQgV0lOQVBJIFJlaW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggQ1JJVElDQUxfU0VDVElPTiAqY3JpdCApCit7CisgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCBjcml0ICk7CisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggY3JpdCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENSSVRfU0VDVElPTl9TaWduYWxlZAogICovCiBzdGF0aWMgQk9PTDMyIENSSVRfU0VDVElPTl9TaWduYWxlZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvcHJvY2Vzcy5jIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwppbmRleCBkNDJmM2YzLi5hYTQ0MDkzIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvcHJvY2Vzcy5jCisrKyBiL3NjaGVkdWxlci9wcm9jZXNzLmMKQEAgLTIxLDExICsyMSw2IEBACiAjZGVmaW5lIEhUQUJMRV9TSVpFICAweDMwICAvKiBIYW5kbGUgdGFibGUgaW5pdGlhbCBzaXplICovCiAjZGVmaW5lIEhUQUJMRV9JTkMgICAweDEwICAvKiBIYW5kbGUgdGFibGUgaW5jcmVtZW50ICovCiAKLS8qIFBEQiA8LT4gUHJvY2VzcyBpZCBjb252ZXJzaW9uIG1hY3JvcyAqLwotI2RlZmluZSBQUk9DRVNTX09CRlVTQ0FUT1IgICAgICgoRFdPUkQpMHhkZWFkYmVlZikKLSNkZWZpbmUgUFJPQ0VTU19JRF9UT19QREIoaWQpICAoKFBEQjMyICopKChpZCkgXiBQUk9DRVNTX09CRlVTQ0FUT1IpKQotI2RlZmluZSBQREJfVE9fUFJPQ0VTU19JRChwZGIpICgoRFdPUkQpKHBkYikgXiBQUk9DRVNTX09CRlVTQ0FUT1IpCi0KIHN0YXRpYyBCT09MMzIgUFJPQ0VTU19TaWduYWxlZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOwogc3RhdGljIEJPT0wzMiBQUk9DRVNTX1NhdGlzZmllZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOwogc3RhdGljIHZvaWQgUFJPQ0VTU19BZGRXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvc3lzZGVwcy5jIGIvc2NoZWR1bGVyL3N5c2RlcHMuYwppbmRleCAwOGM0ZGMzLi45MmNmODExIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvc3lzZGVwcy5jCisrKyBiL3NjaGVkdWxlci9zeXNkZXBzLmMKQEAgLTQsMTAgKzQsMjQgQEAKICAqIENvcHlyaWdodCAxOTk4IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKKyNkZWZpbmUgTk9fUkVFTlRSQU5UX1gxMQorCisjaWZkZWYgTk9fUkVFTlRSQU5UX1gxMQorLyogR2V0IHBvaW50ZXJzIHRvIHRoZSBzdGF0aWMgZXJybm8gYW5kIGhfZXJybm8gdmFyaWFibGVzIHVzZWQgYnkgWGxpYi4gVGhpcworICAgbXVzdCBiZSBkb25lIGJlZm9yZSBpbmNsdWRpbmcgPGVycm5vLmg+IG1ha2VzIHRoZSB2YXJpYWJsZXMgaW52aXNpYmxlLiAgKi8KK2V4dGVybiBpbnQgZXJybm87CitzdGF0aWMgaW50ICpwZXJybm8gPSAmZXJybm87CitleHRlcm4gaW50IGhfZXJybm87CitzdGF0aWMgaW50ICpwaF9lcnJubyA9ICZoX2Vycm5vOworI2VuZGlmCisKICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgInRocmVhZC5oIgorI2lmZGVmIE5PX1JFRU5UUkFOVF9YMTEKKyNpbmNsdWRlICJ0c3gxMWRlZnMuaCIKKyNlbmRpZgogCiAjaWZkZWYgX19saW51eF9fCiAjIGlmZGVmIEhBVkVfU0NIRURfSApAQCAtMzUsNiArNDksMTIgQEAKIHsKICAgICBzdGF0aWMgaW50IHN0YXRpY19lcnJubzsKICAgICBUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKKyNpZmRlZiBOT19SRUVOVFJBTlRfWDExCisgICAgLyogVXNlIHN0YXRpYyBsaWJjIGVycm5vIHdoaWxlIHJ1bm5pbmcgaW4gWGxpYi4gKi8KKyAgICBpZiAoVFNYMTFfU2VjdGlvblB0ciAmJgorICAgICAgICAoVFNYMTFfU2VjdGlvblB0ci0+T3duaW5nVGhyZWFkID09IFRIREJfVE9fVEhSRUFEX0lEKHRoZGIpKSkKKyAgICAgICAgcmV0dXJuIHBlcnJubzsKKyNlbmRpZgogICAgIGlmICghdGhkYikgcmV0dXJuICZzdGF0aWNfZXJybm87CiAgICAgcmV0dXJuICZ0aGRiLT50aHJlYWRfZXJybm87CiB9CkBAIC00OCw2ICs2OCwxMiBAQAogewogICAgIHN0YXRpYyBpbnQgc3RhdGljX2hfZXJybm87CiAgICAgVEhEQiAqdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CisjaWZkZWYgTk9fUkVFTlRSQU5UX1gxMQorICAgIC8qIFVzZSBzdGF0aWMgbGliYyBoX2Vycm5vIHdoaWxlIHJ1bm5pbmcgaW4gWGxpYi4gKi8KKyAgICBpZiAoVFNYMTFfU2VjdGlvblB0ciAmJgorICAgICAgICAoVFNYMTFfU2VjdGlvblB0ci0+T3duaW5nVGhyZWFkID09IFRIREJfVE9fVEhSRUFEX0lEKHRoZGIpKSkKKyAgICAgICAgcmV0dXJuIHBoX2Vycm5vOworI2VuZGlmCiAgICAgaWYgKCF0aGRiKSByZXR1cm4gJnN0YXRpY19oX2Vycm5vOwogICAgIHJldHVybiAmdGhkYi0+dGhyZWFkX2hfZXJybm87CiB9CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvdGhyZWFkLmMgYi9zY2hlZHVsZXIvdGhyZWFkLmMKaW5kZXggOTg0Yjg5Yy4uMjYyOTQxOSAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3RocmVhZC5jCisrKyBiL3NjaGVkdWxlci90aHJlYWQuYwpAQCAtMTg0LDYgKzE4NCw3IEBACiAgICAgdGhkYi0+Y29udGV4dC5TZWdGcyAgID0gdGhkYi0+dGViX3NlbDsKICAgICB0aGRiLT5jb250ZXh0LkVpcCAgICAgPSAoRFdPUkQpc3RhcnRfYWRkcjsKICAgICB0aGRiLT5jb250ZXh0LkVzcCAgICAgPSAoRFdPUkQpdGhkYi0+dGViLnN0YWNrX3RvcDsKKyAgICBQRV9Jbml0VGxzKCB0aGRiICk7CiAgICAgcmV0dXJuIHRoZGI7CiAKIGVycm9yOgpAQCAtMzE0LDcgKzMxNSwxMSBAQAogICAgIHdoaWxlICh0aGRiLT5tdXRleF9saXN0KSBNVVRFWF9BYmFuZG9uKCB0aGRiLT5tdXRleF9saXN0ICk7CiAKICAgICAvKiBGSVhNRTogc2hvdWxkIGZyZWUgdGhlIHN0YWNrIHNvbWVob3cgKi8KKyNpZiAwCisgICAgLyogRklYTUU6IFdlIGNhbm5vdCBkbyB0aGlzOyBvbmNlIHRoZSBjdXJyZW50IHRocmVhZCBpcyBkZXN0cm95ZWQsCisgICAgICAgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgZG8gbm90IHdvcmsgcHJvcGVybHkuICovCiAgICAgSzMyT0JKX0RlY0NvdW50KCAmdGhkYi0+aGVhZGVyICk7CisjZW5kaWYKICAgICAvKiBDb21wbGV0ZWx5IHVubG9jayB0aGUgc3lzdGVtIGxvY2sganVzdCBpbiBjYXNlICovCiAgICAgY291bnQgPSBTWVNURU1fTE9DS19DT1VOVCgpOwogICAgIHdoaWxlIChjb3VudC0tKSBTWVNURU1fVU5MT0NLKCk7CmRpZmYgLS1naXQgYS90b29scy9idWlsZC5jIGIvdG9vbHMvYnVpbGQuYwppbmRleCAxY2MwN2U3Li45M2E5N2Q3IDEwMDY0NAotLS0gYS90b29scy9idWlsZC5jCisrKyBiL3Rvb2xzL2J1aWxkLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKIAogI2lmZGVmIE5FRURfVU5ERVJTQ09SRV9QUkVGSVgKICMgZGVmaW5lIFBSRUZJWCAiXyIKQEAgLTE2Myw2ICsxNjQsMTAgQEAKICAgLyogT2Zmc2V0IG9mIHJlZ2lzdGVyIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgQ09OVEVYVCBzdHJ1Y3QgKi8KICNkZWZpbmUgQ09OVEVYVE9GRlNFVChyZWcpICBTVFJVQ1RPRkZTRVQoQ09OVEVYVCxyZWcpCiAKKyAgLyogT2Zmc2V0IG9mIHRoZSBzdGFjayBwb2ludGVyIHJlbGF0aXZlIHRvICVmczooMCkgKi8KKyNkZWZpbmUgU1RBQ0tPRkZTRVQgKFNUUlVDVE9GRlNFVChUSERCLGN1cl9zdGFjaykgLSBTVFJVQ1RPRkZTRVQoVEhEQix0ZWIpKQorCisKIHN0YXRpYyB2b2lkICp4bWFsbG9jIChzaXplX3Qgc2l6ZSkKIHsKICAgICB2b2lkICpyZXM7CkBAIC0xNTM1LDcgKzE1NDAsNyBAQAogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYnhcbiIgKTsKIAotICAgIC8qIFJlc3RvcmUgMzItYml0IGRzIGFuZCBlcyAqLworICAgIC8qIFJlc3RvcmUgMzItYml0IHNlZ21lbnQgcmVnaXN0ZXJzICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICQweCUwNHgsJSVieFxuIiwgRGF0YV9TZWxlY3RvciApOwogI2lmZGVmIF9fc3ZyNF9fCkBAIC0xNTQ2LDE4ICsxNTUxLDE5IEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0ZGF0YTE2XG4iKTsKICNlbmRpZgogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVieCwlJWVzXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAiIFBSRUZJWCAiQ0FMTFRPMTZfQ3VycmVudF9mcywlJWZzXG4iICk7CiAKLSAgICAvKiBHZXQgdGhlIDMyLWJpdCBzdGFjayBwb2ludGVyICovCisgICAgLyogR2V0IHRoZSAzMi1iaXQgc3RhY2sgcG9pbnRlciBmcm9tIHRoZSBURUIgKi8KIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgIiBQUkVGSVggIkNBTExUTzE2X1NhdmVkMzJfZXNwLCUlZWJ4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRtb3ZsICglZCksJSVlYnhcbiIsIFNUQUNLT0ZGU0VUICk7CiAKICAgICAvKiBTYXZlIHRoZSAxNi1iaXQgc3RhY2sgKi8KIAogI2lmZGVmIF9fc3ZyNF9fCiAgICAgZnByaW50Ziggb3V0ZmlsZSwiXHRkYXRhMTZcbiIpOwogI2VuZGlmCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJXNzLCIgUFJFRklYICJJRjE2MzJfU2F2ZWQxNl9zc19zcCsyXG4iICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJXNwLCIgUFJFRklYICJJRjE2MzJfU2F2ZWQxNl9zc19zcFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0bW92dyAlJXNzLCglZClcbiIsIFNUQUNLT0ZGU0VUICsgMiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0bW92dyAlJXNwLCglZClcbiIsIFNUQUNLT0ZGU0VUICk7CiAKICAgICAvKiBUcmFuc2ZlciB0aGUgYXJndW1lbnRzICovCiAKQEAgLTE2MzMsOSArMTYzOSwxMCBAQAogI2lmZGVmIF9fc3ZyNF9fCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0ZGF0YTE2XG4iKTsKICNlbmRpZgotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgIiBQUkVGSVggIklGMTYzMl9TYXZlZDE2X3NzX3NwKzIsJSVzc1xuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgIiBQUkVGSVggIklGMTYzMl9TYXZlZDE2X3NzX3NwLCUlc3BcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICIgUFJFRklYICJDQUxMVE8xNl9TYXZlZDMyX2VzcFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0bW92dyAoJWQpLCUlc3NcbiIsIFNUQUNLT0ZGU0VUICsgMiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0bW92dyAoJWQpLCUlc3BcbiIsIFNUQUNLT0ZGU0VUICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRwb3BsICglZClcbiIsIFNUQUNLT0ZGU0VUICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWZzLCIgUFJFRklYICJDQUxMVE8xNl9DdXJyZW50X2ZzXG4iICk7CiAKICAgICBpZiAocmVnX2Z1bmMpCiAgICAgewpAQCAtMTY3Myw3ICsxNjgwLDcgQEAKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0aW5jbCAlJWVzcFxuIiApOwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWR4XG4iICk7ICAgICAgLyogUmVtb3ZlIGNzIGFuZCBkcyAqLwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlZHgsJSVkc1xuIiApOyAgLyogYW5kIHJlc3RvcmUgZHMgKi8KLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NlxuXHRwb3BsICUlZXNcbiIgKTsgICAgICAgLyogUmVzdG9yZSBlcyAqLworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYnl0ZSAweDY2XG5cdHBvcGwgJSVlc1xuIiApOyAgICAvKiBSZXN0b3JlIGVzICovCiAKICAgICAgICAgaWYgKHNob3J0X3JldCkgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVkeFxuIiApOyAgLyogUmVzdG9yZSBlZHggKi8KICAgICAgICAgZWxzZQpAQCAtMTc5MywyMyArMTgwMCwyNSBAQAogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWF4XG4iICk7CiAgICAgfQogCi0gICAgLyogU2F2ZSB0aGUgMzItYml0IHN0YWNrICovCisgICAgLyogU2F2ZSB0aGUgMzItYml0IHN0YWNrIGFuZCAlZnMgKi8KIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICIgUFJFRklYICJJRjE2MzJfU2F2ZWQxNl9zc19zcFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlc3AsIiBQUkVGSVggIkNBTExUTzE2X1NhdmVkMzJfZXNwXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRwdXNobCAoJWQpXG4iLCBTVEFDS09GRlNFVCApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYnAsJSVlYnhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZXNwLCUlZWR4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWZzLCIgUFJFRklYICJDQUxMVE8xNl9DdXJyZW50X2ZzXG4iICk7CiAKICAgICBpZiAocmVnX2Z1bmMpCiAgICAgewogICAgICAgICAvKiBTd2l0Y2ggdG8gdGhlIDE2LWJpdCBzdGFjaywgc2F2aW5nIHRoZSBjdXJyZW50ICUlZXNwLCAqLwogICAgICAgICAvKiBhbmQgYWRkaW5nIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IHRvIHRoZSBuZXcgc3AgKi8KLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92endsICIgUFJFRklYICJJRjE2MzJfU2F2ZWQxNl9zc19zcCwlJWVheFxuIiApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYnl0ZSAweDY0XG5cdG1vdnp3bCAoJWQpLCUlZWF4XG4iLCBTVEFDS09GRlNFVCApOwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRzdWJsIDEyKCUlZWJ4KSwlJWVheFxuIiApOyAvKiBHZXQgdGhlIG9mZnNldCAqLwogI2lmZGVmIF9fc3ZyNF9fCiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsIlx0ZGF0YTE2XG4iKTsKICNlbmRpZgotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICIgUFJFRklYICJJRjE2MzJfU2F2ZWQxNl9zc19zcCsyLCUlc3NcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRtb3Z3ICglZCksJSVzc1xuIiwgU1RBQ0tPRkZTRVQgKyAyKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlJWVzcFxuIiApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYnl0ZSAweDY0XG5cdG1vdmwgJSVlZHgsKCVkKVxuIiwgU1RBQ0tPRkZTRVQgKTsKIAogICAgICAgICAvKiBHZXQgdGhlIHJlZ2lzdGVycy4gZWJ4IGlzIGhhbmRsZWQgbGF0ZXIgb24uICovCiAKQEAgLTE4MjgsMTMgKzE4MzcsMTMgQEAKIAkgKiBXaXRoIGxyZWcgc3VmZml4LCB3ZSBwdXNoIDE2OjMyIGFkZHJlc3MgKDB4NjYgbHJldCwgZm9yIEtFUk5FTDMyXzQ1KQogCSAqLwogCWlmIChyZWdfZnVuYyA9PSAxKQotCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl9yZWdzXG4iICk7CisJICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICIgUFJFRklYICJDQUxMVE8xNl9SZXRBZGRyX2xvbmdcbiIgKTsKIAllbHNlIAogCXsKIAkgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJDBcbiIgKTsKLQkgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgIiBQUkVGSVggIkNBTExUTzE2X1JldEFkZHJfcmVncysyXG4iICk7CisJICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICIgUFJFRklYICJDQUxMVE8xNl9SZXRBZGRyX2xvbmcrMlxuIiApOwogCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAkMFxuIiApOwotCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl9yZWdzXG4iICk7CisJICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICIgUFJFRklYICJDQUxMVE8xNl9SZXRBZGRyX2xvbmdcbiIgKTsKIAl9CiAKICAgICAgICAgLyogUHVzaCB0aGUgY2FsbGVkIHJvdXRpbmUgYWRkcmVzcyAqLwpAQCAtMTg1Nyw4ICsxODY2LDkgQEAKICNpZmRlZiBfX3N2cjRfXwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCJcdGRhdGExNlxuIik7CiAjZW5kaWYKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAiIFBSRUZJWCAiSUYxNjMyX1NhdmVkMTZfc3Nfc3ArMiwlJXNzXG4iICk7Ci0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgIiBQUkVGSVggIklGMTYzMl9TYXZlZDE2X3NzX3NwLCUlc3BcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRtb3Z3ICglZCksJSVzc1xuIiwgU1RBQ0tPRkZTRVQgKyAyKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRtb3Z3ICglZCksJSVzcFxuIiwgU1RBQ0tPRkZTRVQgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRtb3ZsICUlZWR4LCglZClcbiIsIFNUQUNLT0ZGU0VUICk7CiAKICAgICAgICAgLyogTWFrZSAlYnAgcG9pbnQgdG8gdGhlIHByZXZpb3VzIHN0YWNrZnJhbWUgKGJ1aWx0IGJ5IENhbGxGcm9tMTYpICovCiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdnp3bCAlJXNwLCUlZWJwXG4iICk7CkBAIC0xOTE2LDE4ICsxOTI2LDEzIEBACiB7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDQUxMVE8xNl9SZXRfd29yZFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0X2xvbmdcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNBTExUTzE2X1JldF9yZWdzXG4iICk7CiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzE2X1JldF93b3JkOlxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHhvcmwgJSVlZHgsJSVlZHhcbiIgKTsKIAotICAgIC8qIFJlbW92ZSB0aGUgYXJndW1lbnRzIGp1c3QgaW4gY2FzZSAqLwotCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMVE8xNl9SZXRfbG9uZzpcbiIgKTsKLQogICAgIC8qIFB1dCByZXR1cm4gdmFsdWUgaW50byAlZWF4ICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzE2X1JldF9yZWdzOlxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ0FMTFRPMTZfUmV0X2xvbmc6XG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0c2hsbCAkMTYsJSVlZHhcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlYXgsJSVkeFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlZHgsJSVlYXhcbiIgKTsKQEAgLTE5NDMsNiArMTk0OCw3IEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0ZGF0YTE2XG4iKTsKICNlbmRpZgogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVieCwlJWVzXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAiIFBSRUZJWCAiQ0FMTFRPMTZfQ3VycmVudF9mcywlJWZzXG4iICk7CiAKICAgICAvKiBSZXN0b3JlIHRoZSAzMi1iaXQgc3RhY2sgKi8KIApAQCAtMTk1MCw4ICsxOTU2LDggQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRkYXRhMTZcbiIpOwogI2VuZGlmCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWJ4LCUlc3NcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICIgUFJFRklYICJDQUxMVE8xNl9TYXZlZDMyX2VzcCwlJWVzcFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgIiBQUkVGSVggIklGMTYzMl9TYXZlZDE2X3NzX3NwXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRtb3ZsICglZCksJSVlc3BcbiIsIFNUQUNLT0ZGU0VUICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRwb3BsICglZClcbiIsIFNUQUNLT0ZGU0VUICk7CiAKICAgICAvKiBSZXN0b3JlIHRoZSAzMi1iaXQgcmVnaXN0ZXJzICovCiAKQEAgLTE5NzAsMTIgKzE5NzYsMTAgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZGF0YVxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl93b3JkXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDQUxMVE8xNl9SZXRBZGRyX2xvbmdcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNBTExUTzE2X1JldEFkZHJfcmVnc1xuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfU2F2ZWQzMl9lc3BcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNBTExUTzE2X0N1cnJlbnRfZnNcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzE2X1JldEFkZHJfd29yZDpcdC5sb25nIDBcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzE2X1JldEFkZHJfbG9uZzpcdC5sb25nIDBcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzE2X1JldEFkZHJfcmVnczpcdC5sb25nIDBcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzE2X1NhdmVkMzJfZXNwOlx0LmxvbmcgMFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ0FMTFRPMTZfQ3VycmVudF9mczpcdC5sb25nIDBcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIiApOwogfQogCmRpZmYgLS1naXQgYS90b29scy9tYWtlX1gxMXdyYXBwZXJzIGIvdG9vbHMvbWFrZV9YMTF3cmFwcGVycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZGZmYmIzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFrZV9YMTF3cmFwcGVycwpAQCAtMCwwICsxLDIyNyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgQ3JlYXRlIHRocmVhZHMgc2FmZSB3cmFwcGVycyBhcm91bmQgWDExIGNhbGxzLgorIworIyBDb3B5cmlnaHQgMTk5OCBLcmlzdGlhbiBOaWVsc2VuLgorIworCisjIEZJWE1FOiBUaGlzIGRvZXMgbm90IGRvIGZ1bGwgQyBwcm90b3R5cGUgcGFyc2luZywgYnV0IHJlbGllcyBvbgorIyBrbm93bGVkZ2Ugb24gaG93IHRoZSBYMTEgaW5jbHVkZSBmaWxlcyBhcmUgZm9ybWF0dGVkLiBJdCB3aWxsCisjIHByb2JhYmx5IG5lZWQgdG8gYmUgbW9kaWZpZWQgZm9yIG5ldyBpbmNsdWRlIGZpbGVzLiBJdCBhbHNvIGZhaWxzCisjIGZvciBjZXJ0YWluIHByb3RvdHlwZXMgKG5vdGFibHkgdGhvc2Ugd2l0aCBmdW5jdGlvbiBwb2ludGVyCisjIGFyZ3VtZW50cyBvciByZXN1bHRzKSwgc28gdGhlc2UgbXVzdCBiZSBhZGRlZCBtYW51YWxseS4gQW5kIGl0CisjIHJlbGllcyBvbiBhIGZpeGVkIGxvY2F0aW9uIG9mIFgxMSBpbmNsdWRlcyAoL3Vzci9YMTFSNi9pbmNsdWRlLykuCisjCisjIFRoaXMgcHJvZ3JhbSBleHBlY3RzIHRvIGJlIHJ1biBmcm9tIFdpbmUncyBtYWluIGRpcmVjdG9yeS4KKworJFgxMV9pbmNsdWRlX2RpciA9ICIvdXNyL1gxMVI2L2luY2x1ZGUiOworJG91dGRpciA9ICJ0c3gxMSI7Ciskd2FudGZpbGUgPSAiJG91dGRpci9YMTFfY2FsbHMiOworQGRvbGlzdCA9ICgiWGxpYiIsICJYcmVzb3VyY2UiLCAiWHV0aWwiLCAieHBtIiwgIlhTaG0iKTsKKworIyBGaXJzdCByZWFkIGxpc3Qgb2Ygd2FudGVkIGZ1bmN0aW9uIG5hbWVzLgorCitvcGVuKFdBTlQsICR3YW50ZmlsZSkgfHwgZGllICJvcGVuIjsKK3doaWxlKDxXQU5UPikgeworICAgIG5leHQgaWYgL15ccypcIy87CQkjIFNraXAgY29tbWVudCBsaW5lcy4KKyAgICBuZXh0IGlmIC9eXHMqJC87CQkjIFNraXAgZW1wdHkgbGluZXMuCisgICAgaWYoL15ccyooW2EtekEtWjAtOV9dKylccyokLykgeworCSR3YW50eyQxfSA9IDE7CisgICAgfSBlbHNlIHsKKwlkaWUgInN5bnRheCBlcnJvciBpbiBmaWxlICckd2FudGZpbGUnLCBpbiBsaW5lICckXyciOworICAgIH0KK30KK2Nsb3NlKFdBTlQpOworCitmb3JlYWNoICRuYW1lIChAZG9saXN0KSB7CisKKyAgICAkdWNuYW1lID0gdWMgJG5hbWU7CisgICAgJGxjbmFtZSA9IGxjICRuYW1lOworCisgICAgJG91dGZpbGUgPSAiL3RzXyRsY25hbWUiOworICAgIG9wZW4oT1VUQywgIj4kb3V0ZGlyLyRvdXRmaWxlLmMiKSB8fCBkaWUgIm9wZW4iOworICAgIG9wZW4oT1VUSCwgIj5pbmNsdWRlLyRvdXRmaWxlLmgiKSB8fCBkaWUgIm9wZW4iOworCisgICAgJHgxMV9pbmNsID0gIiI7CisgICAgJGV4dGVuc2lvbnNfZGlyID0gIiI7CisgICAgaWYoJG5hbWUgZXEgIlh1dGlsIiB8fCAkbmFtZSBlcSAiWHJlc291cmNlIiB8fCAkbmFtZSBlcSAiWFNobSIpIHsKKwkkeDExX2luY2wgPSAiI2luY2x1ZGUgPFgxMS9YbGliLmg+XG4iOworCSMgRm9yIFh1dGlsLCB3ZSBuZWVkIFgxMS9YcmVzb3VyY2UuaCBmb3IgWFVuaXF1ZUNvbnRleHQoKS4KKwkkeDExX2luY2wgLj0gIiNpbmNsdWRlIDxYMTEvWHJlc291cmNlLmg+XG4iIGlmICRuYW1lIGVxICJYdXRpbCI7CisgICAgfQorICAgIGlmKCRuYW1lIGVxICJYU2htIikgeworCSRleHRlbnNpb25zX2RpciA9ICJleHRlbnNpb25zLyI7CisgICAgfQorCisgICAgcHJpbnQgT1VUSCA8PEVORDsKKy8qCisgKiBUaHJlYWQgc2FmZSB3cmFwcGVycyBhcm91bmQgJG5hbWUgY2FsbHMuCisgKiBBbHdheXMgaW5jbHVkZSB0aGlzIGZpbGUgaW5zdGVhZCBvZiA8WDExLyRuYW1lLmg+LgorICogVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0b29scy9tYWtlX1gxMXdyYXBwZXJzCisgKgorICogQ29weXJpZ2h0IDE5OTggS3Jpc3RpYW4gTmllbHNlbgorICovCisKKyNpZm5kZWYgX19XSU5FX1RTJHVjbmFtZVxfSAorI2RlZmluZSBfX1dJTkVfVFMkdWNuYW1lXF9ICisKKyR4MTFfaW5jbCNpbmNsdWRlIDxYMTEvJGV4dGVuc2lvbnNfZGlyJG5hbWUuaD4KKworRU5ECisKKyAgICBwcmludCBPVVRDIDw8RU5EOworLyoKKyAqIFRocmVhZCBzYWZlIHdyYXBwZXJzIGFyb3VuZCAkbmFtZSBjYWxscy4KKyAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdG9vbHMvbWFrZV9YMTF3cmFwcGVycworICoKKyAqIENvcHlyaWdodCAxOTk4IEtyaXN0aWFuIE5pZWxzZW4KKyAqLworCiskeDExX2luY2wjaW5jbHVkZSA8WDExLyRleHRlbnNpb25zX2RpciRuYW1lLmg+CisjaW5jbHVkZSAidHN4MTFkZWZzLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorRU5ECisKKyAgICBpZigkbmFtZSBlcSAieHBtIikgewkjIEhhbmRsZSBhcyBzcGVjaWFsIGNhc2UuCisJb3V0cHV0X2ZuKCJYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YSIsICJpbnQiLAorCQkgICJEaXNwbGF5ICosIERyYXdhYmxlLCBjaGFyICoqLCBQaXhtYXAgKiwgUGl4bWFwICosIFhwbUF0dHJpYnV0ZXMgKiIsCisJCSAgIkRpc3BsYXkgKmEwLCBEcmF3YWJsZSBhMSwgY2hhciAqKmEyLCBQaXhtYXAgKmEzLCBQaXhtYXAgKmE0LCBYcG1BdHRyaWJ1dGVzICphNSIsCisJCSAgImEwLCBhMSwgYTIsIGEzLCBhNCwgYTUiKTsKKwlvdXRwdXRfZm4oIlhwbUF0dHJpYnV0ZXNTaXplIiwgImludCIsICJ2b2lkIiwgInZvaWQiLCAiIik7CisgICAgfSBlbHNpZigkbmFtZSBlcSAiWFNobSIpIHsKKwlvdXRwdXRfZm4oIlhTaG1RdWVyeUV4dGVuc2lvbiIsICJCb29sIiwKKwkJICAiRGlzcGxheSAqIiwgIkRpc3BsYXkgKmEwIiwgImEwIik7CisJb3V0cHV0X2ZuKCJYU2htUGl4bWFwRm9ybWF0IiwgImludCIsCisJCSAgIkRpc3BsYXkgKiIsICJEaXNwbGF5ICphMCIsICJhMCIpOworCW91dHB1dF9mbigiWFNobURldGFjaCIsIFN0YXR1cywKKwkJICAiRGlzcGxheSAqLCBYU2htU2VnbWVudEluZm8gKiIsCisJCSAgIkRpc3BsYXkgKmEwLCBYU2htU2VnbWVudEluZm8gKmExIiwgImEwLCBhMSIpOworCW91dHB1dF9mbigiWFNobUF0dGFjaCIsIFN0YXR1cywKKwkJICAiRGlzcGxheSAqLCBYU2htU2VnbWVudEluZm8gKiIsCisJCSAgIkRpc3BsYXkgKmEwLCBYU2htU2VnbWVudEluZm8gKmExIiwgImEwLCBhMSIpOworICAgIH0gZWxzZSB7CisJb3BlbihJTiwgImVjaG8gXCIkeDExX2luY2wjaW5jbHVkZSA8WDExLyRleHRlbnNpb25zX2RpciRuYW1lLmg+XCIgfCBnY2MgLUwkWDExX2luY2x1ZGVfZGlyIC1FIC0gfCBncmVwIC12ICdeWyBcdF0qXCQnfCIpIHx8IGRpZSAib3BlbiI7CisKKyAgICAgIFBST1RPOiB3aGlsZSg8SU4+KSB7CisJICBpZihtJ2V4dGVyblxzKyhbXigpXSopXGIoW2EtekEtWjAtOV9dKylccypcKCcpIHsKKwkgICAgICAkcmVzdWx0X3R5cGUgPSAkMTsKKwkgICAgICAkZm5fbmFtZSA9ICQyOworCSAgICAgICRyZXN1bHRfdHlwZSA9ICJpbnQiIGlmICRyZXN1bHRfdHlwZSA9fiAvXlxzKiQvOworCSAgICAgIEBhcmdzID0gKCk7CisJICAgICAgd2hpbGUoPElOPikgeworCQkgIGxhc3QgaWYgbSdcKVxzKjsnOworCQkgICMgR2l2ZSB1cCBvbiB2YXJhcmcgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiBwb2ludGVyIGFyZ3MuCisJCSAgaWYobSdcLlwuXC58XChcKlwpJykgeworCQkgICAgICB1bmRlZiAkZm5fbmFtZTsKKwkJICAgICAgbGFzdDsKKwkJICB9CisJCSAgaWYobSdccyooW14sXSpbXiwgXHRdKVxzKigsP1xuKScpIHsKKwkJICAgICAgJGFyZ3NbJCNhcmdzKzFdID0gJDE7CisJCSAgfQorCSAgICAgIH0KKwkgICAgICAjIFNraXAgaWYgdmFyYXJnLCBmdW5jdGlvbiBwb2ludGVyIGFyZywgb3Igbm90IG5lZWRlZC4KKwkgICAgICBuZXh0IHVubGVzcyAkZm5fbmFtZTsKKwkgICAgICBuZXh0IHVubGVzcyAkd2FudHskZm5fbmFtZX0gJiYgJHdhbnR7JGZuX25hbWV9ID09IDE7CisKKwkgICAgICAjIFNwZWNpYWwgY2FzZSBmb3Igbm8gYXJndW1lbnRzICh3aGljaCBpcyBzcGVjaWZpZWQgYXMgInZvaWQiKS4KKwkgICAgICBpZigkI2FyZ3MgPT0gMCAmJiAkYXJnc1swXSBlcSAidm9pZCIpIHsKKwkJICBAYXJncyA9ICgpOworCSAgICAgIH0KKwkgICAgICAkcHJvdG8gPSAiIjsKKwkgICAgICAkZm9ybWFscyA9ICIiOworCSAgICAgICRhY3R1YWxzID0gIiI7CisJICAgICAgZm9yKCRpID0gMDsgJGkgPD0gJCNhcmdzOyAkaSsrKSB7CisJCSAgJGNvbW1hID0gJGkgPCAkI2FyZ3MgPyAiLCAiIDogIiI7CisJCSAgJHByb3RvIC49ICIkYXJnc1skaV0kY29tbWEiOworCQkgICRmb3JtYWxzIC49ICIkYXJnc1skaV0gYSRpJGNvbW1hIjsKKwkJICAkYWN0dWFscyAuPSAiYSRpJGNvbW1hIjsKKwkgICAgICB9CisJICAgICAgJHByb3RvID0gJGZvcm1hbHMgPSAidm9pZCIgaWYgJCNhcmdzID09IC0xOworCSAgICAgIG91dHB1dF9mbigkZm5fbmFtZSwgJHJlc3VsdF90eXBlLCAkcHJvdG8sICRmb3JtYWxzLCAkYWN0dWFscyk7CisJICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYoJG5hbWUgZXEgIlhsaWIiKSB7CisJcmF3X291dHB1dF9mbigiWFN5bmNocm9uaXplIiwgImludCAoKnIpKERpc3BsYXkgKikiLAorCQkgICJpbnQgKCpUU1hTeW5jaHJvbml6ZShEaXNwbGF5ICosIEJvb2wpKShEaXNwbGF5ICopIiwKKwkJICAiaW50ICgqVFNYU3luY2hyb25pemUoRGlzcGxheSAqYTAsIEJvb2wgYTEpKShEaXNwbGF5ICopIiwKKwkJICAiYTAsIGExIik7CisJcHJpbnQgT1VUQyAiXG5leHRlcm4gdm9pZCBfWEluaXRJbWFnZUZ1bmNQdHJzKFhJbWFnZSAqKTtcbiI7CisJb3V0cHV0X2ZuKCJfWEluaXRJbWFnZUZ1bmNQdHJzIiwgInZvaWQiLCAiWEltYWdlICoiLCAiWEltYWdlICphMCIsICJhMCIpOworICAgIH0gZWxzaWYoJG5hbWUgZXEgIlh1dGlsIikgeworCW91dHB1dF9mbigiWERlc3Ryb3lJbWFnZSIsICJpbnQiLAorCQkgICJzdHJ1Y3QgX1hJbWFnZSAqIiwgInN0cnVjdCBfWEltYWdlICphMCIsICJhMCIpOworCW91dHB1dF9mbigiWEdldFBpeGVsIiwgInVuc2lnbmVkIGxvbmciLAorCQkgICJzdHJ1Y3QgX1hJbWFnZSAqLCBpbnQsIGludCIsCisJCSAgInN0cnVjdCBfWEltYWdlICphMCwgaW50IGExLCBpbnQgYTIiLAorCQkgICJhMCwgYTEsIGEyIik7CisJb3V0cHV0X2ZuKCJYUHV0UGl4ZWwiLCAiaW50IiwKKwkJICAic3RydWN0IF9YSW1hZ2UgKiwgaW50LCBpbnQsIHVuc2lnbmVkIGxvbmciLAorCQkgICJzdHJ1Y3QgX1hJbWFnZSAqYTAsIGludCBhMSwgaW50IGEyLCB1bnNpZ25lZCBsb25nIGEzIiwKKwkJICAiYTAsIGExLCBhMiwgYTMiKTsKKwlvdXRwdXRfZm4oIlhTdWJJbWFnZSIsICJzdHJ1Y3QgX1hJbWFnZSAqIiwKKwkJICAic3RydWN0IF9YSW1hZ2UgKiwgaW50LCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50IiwKKwkJICAic3RydWN0IF9YSW1hZ2UgKmEwLCBpbnQgYTEsIGludCBhMiwgdW5zaWduZWQgaW50IGEzLCB1bnNpZ25lZCBpbnQgYTQiLAorCQkgICJhMCwgYTEsIGEyLCBhMywgYTQiKTsKKwlvdXRwdXRfZm4oIlhBZGRQaXhlbCIsICJpbnQiLAorCQkgICJzdHJ1Y3QgX1hJbWFnZSAqLCBsb25nIiwKKwkJICAic3RydWN0IF9YSW1hZ2UgKmEwLCBsb25nIGExIiwgImEwLCBhMSIpOworCW91dHB1dF9mbigiWFVuaXF1ZUNvbnRleHQiLCAiWENvbnRleHQiLCAidm9pZCIsICJ2b2lkIiwgIiIpOworICAgIH0KKworICAgIHByaW50IE9VVEggPDxFTkQ7CisKKyNlbmRpZiAvKiBfX1dJTkVfVFMkdWNuYW1lXF9IICovCitFTkQKKworfQorCitmb3JlYWNoICRpIChrZXlzICV3YW50KSB7CisgICAgaWYoJHdhbnR7JGl9ID09IDEpIHsKKwlwcmludCAiVW5yZXNvbHZlZDogJGlcbiI7CisgICAgfQorfQorCisKK3N1YiBvdXRwdXRfZm4geworICAgICMgRXhhbXBsZSBjYWxsOgorICAgICMgb3V0cHV0X2ZuKCJtYWluIiwgImludCIsICJpbnQsIGNoYXIgKioiLCAiaW50IGEwLCBjaGFyICoqYTEiLCAiYTAsIGExIikKKyAgICAjCisKKyAgICBteSAoJGZuX25hbWUsICRyZXN1bHRfdHlwZSwgJHByb3RvcywgJGZvcm1hbHMsICRhY3R1YWxzKSA9IEBfOworCisgICAgcmV0dXJuIHJhd19vdXRwdXRfZm4oJGZuX25hbWUsCisJCQkgJHJlc3VsdF90eXBlID1+IC9eXHMqdm9pZFxzKiQvID8gIiIgOiAiJHJlc3VsdF90eXBlIHIiLAorCQkJICIkcmVzdWx0X3R5cGUgVFMkZm5fbmFtZSgkcHJvdG9zKSIsCisJCQkgIiRyZXN1bHRfdHlwZSBUUyRmbl9uYW1lKCRmb3JtYWxzKSIsCisJCQkgJGFjdHVhbHMpOworfQorCitzdWIgcmF3X291dHB1dF9mbiB7CisgICAgIyBFeGFtcGxlIGNhbGw6CisgICAgIyBvdXRwdXRfZm4oIm1haW4iLCAiaW50IHIiLCAiaW50IG1haW4oaW50LCBjaGFyICoqKSIsICJpbnQgbWFpbihpbnQgYTAsIGNoYXIgKiphMSkiLCAiYTAsIGExIikKKyAgICAjCisKKyAgICBteSAoJGZuX25hbWUsICRyZXN1bHRkZWNsLCAkcHJvdG9kZWNsLCAkZGVmZGVjbCwgJGFjdHVhbHMpID0gQF87CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICR3YW50eyRmbl9uYW1lfSAmJiAkd2FudHskZm5fbmFtZX0gPT0gMTsKKworICAgIHByaW50IE9VVEMgIlxuJGRlZmRlY2xcbiI7CisgICAgcHJpbnQgT1VUSCAiZXh0ZXJuICRwcm90b2RlY2w7XG4iOworIyAgICBwcmludCBPVVRIICIjZGVmaW5lICRmbl9uYW1lIFRTJGZuX25hbWVcbiI7CisgICAgcHJpbnQgT1VUQyAie1xuIjsKKyAgICBwcmludCBPVVRDICIgICRyZXN1bHRkZWNsO1xuIiBpZiAkcmVzdWx0ZGVjbDsKKyAgICBwcmludCBPVVRDICIgIGRwcmludGZfeDExKHN0ZGRlYiwgXCJDYWxsICRmbl9uYW1lXFxuXCIpO1xuIjsKKyAgICBwcmludCBPVVRDICIgIFgxMV9MT0NLKCk7XG4iOworICAgIHByaW50IE9VVEMgIiAgIjsKKyAgICBwcmludCBPVVRDICJyID0gIiBpZiAkcmVzdWx0ZGVjbDsKKyAgICBwcmludCBPVVRDICIkZm5fbmFtZSgkYWN0dWFscyk7XG4iOworICAgIHByaW50IE9VVEMgIiAgWDExX1VOTE9DSygpO1xuIjsKKyAgICBwcmludCBPVVRDICIgIGRwcmludGZfeDExKHN0ZGRlYiwgXCJSZXQgJGZuX25hbWVcXG5cIik7XG4iOworICAgIHByaW50IE9VVEMgIiAgcmV0dXJuIHI7XG4iIGlmICRyZXN1bHRkZWNsOworICAgIHByaW50IE9VVEMgIn1cbiI7CisgICAgJHdhbnR7JGZuX25hbWV9ID0gMjsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3RzeDExL01ha2VmaWxlLmluIGIvdHN4MTEvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5MzVhMQotLS0gL2Rldi9udWxsCisrKyBiL3RzeDExL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjAgQEAKK0RFRlMgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXworVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACitUT1BPQkpESVIgPSAuLgorU1JDRElSICAgID0gQHNyY2RpckAKK1ZQQVRIICAgICA9IEBzcmNkaXJACitNT0RVTEUgICAgPSB0c3gxMQorCitDX1NSQ1MgPSBcCisJdHNfeHNobS5jIFwKKwl0c194bGliLmMgXAorCXRzX3hyZXNvdXJjZS5jIFwKKwl0c194dXRpbC5jIFwKKwl0c194cG0uYyBcCisJdHN4MTFkZWZzLmMKKworYWxsOiAkKE1PRFVMRSkubworCitATUFLRV9SVUxFU0AKKworIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL3RzeDExL1gxMV9jYWxscyBiL3RzeDExL1gxMV9jYWxscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ0MmRmCi0tLSAvZGV2L251bGwKKysrIGIvdHN4MTEvWDExX2NhbGxzCkBAIC0wLDAgKzEsMTY1IEBACisjIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbGlzdCBvZiBYMTEgY2FsbHMgdGhhdCBXaW5lIHVzZXMgYW5kIHdoaWNoIG11c3QgYmUKKyMgcHJvdGVjdGVkIGJ5IGEgY3JpdGljYWwgc2VjdGlvbiBmb3IgbXVsdGktdGhyZWFkZWQgdXNlLgorIworIyBUbyBhZGQgYSBuZXcgY2FsbCwgcHV0IGl0IG9uIHRoaXMgbGlzdCBhbmQgcnVuIHRvb2xzL21ha2VfWDExd3JhcHBlcnMuCisjIEFsc28gcmVhZCB0aGUgY29tbWVudHMgYXQgdGhlIHRvcCBvZiB0b29sc19tYWtlX1gxMXdyYXBwZXJzLgorIworWEFjdGl2YXRlU2NyZWVuU2F2ZXIKK1hBZGRQaXhlbAorWEFsbG9jQ2xhc3NIaW50CitYQWxsb2NDb2xvcgorWEFsbG9jQ29sb3JDZWxscworWEFsbG9jU2l6ZUhpbnRzCitYQWxsb2NXTUhpbnRzCitYQmVsbAorWENoYW5nZUdDCitYQ2hhbmdlS2V5Ym9hcmRDb250cm9sCitYQ2hhbmdlUHJvcGVydHkKK1hDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzCitYQ2hlY2tUeXBlZFdpbmRvd0V2ZW50CitYQ2hlY2tXaW5kb3dFdmVudAorWENsaXBCb3gKK1hDb252ZXJ0U2VsZWN0aW9uCitYQ29weUFyZWEKK1hDb3B5UGxhbmUKK1hDcmVhdGVCaXRtYXBGcm9tRGF0YQorWENyZWF0ZUNvbG9ybWFwCitYQ3JlYXRlRm9udEN1cnNvcgorWENyZWF0ZUdDCitYQ3JlYXRlSW1hZ2UKK1hDcmVhdGVQaXhtYXAKK1hDcmVhdGVQaXhtYXBDdXJzb3IKK1hDcmVhdGVSZWdpb24KK1hDcmVhdGVXaW5kb3cKK1hEZWZpbmVDdXJzb3IKK1hEZWxldGVDb250ZXh0CitYRGVzdHJveUltYWdlCitYRGVzdHJveVJlZ2lvbgorWERlc3Ryb3lXaW5kb3cKK1hEaXNwbGF5S2V5Y29kZXMKK1hEcmF3QXJjCitYRHJhd0xpbmUKK1hEcmF3TGluZXMKK1hEcmF3UG9pbnQKK1hEcmF3UmVjdGFuZ2xlCitYRHJhd1NlZ21lbnRzCitYRHJhd1N0cmluZworWERyYXdUZXh0CitYRW1wdHlSZWdpb24KK1hFcXVhbFJlZ2lvbgorWEZpbGxBcmMKK1hGaWxsUG9seWdvbgorWEZpbGxSZWN0YW5nbGUKK1hGaW5kQ29udGV4dAorWEZsdXNoCitYRnJlZQorWEZyZWVDb2xvcnMKK1hGcmVlQ3Vyc29yCitYRnJlZUZvbnQKK1hGcmVlRm9udE5hbWVzCitYRnJlZUdDCitYRnJlZU1vZGlmaWVybWFwCitYRnJlZVBpeG1hcAorWEdldEF0b21OYW1lCitYR2V0Rm9udFByb3BlcnR5CitYR2V0R2VvbWV0cnkKK1hHZXRJbWFnZQorWEdldElucHV0Rm9jdXMKK1hHZXRLZXlib2FyZENvbnRyb2wKK1hHZXRLZXlib2FyZE1hcHBpbmcKK1hHZXRNb2RpZmllck1hcHBpbmcKK1hHZXRQaXhlbAorWEdldFNjcmVlblNhdmVyCitYR2V0U2VsZWN0aW9uT3duZXIKK1hHZXRXTVNpemVIaW50cworWEdldFdpbmRvd0F0dHJpYnV0ZXMKK1hHZXRXaW5kb3dQcm9wZXJ0eQorWEdyYWJQb2ludGVyCitYR3JhYlNlcnZlcgorWEluaXRUaHJlYWRzCitYSW5zdGFsbENvbG9ybWFwCitYSW50ZXJuQXRvbQorWEludGVyc2VjdFJlZ2lvbgorWEtleWNvZGVUb0tleXN5bQorWEtleXN5bVRvS2V5Y29kZQorWEtleXN5bVRvU3RyaW5nCitYTGlzdERlcHRocworWExpc3RGb250cworWExvYWRRdWVyeUZvbnQKK1hMb29rdXBLZXlzeW0KK1hMb29rdXBTdHJpbmcKK1hNYXBXaW5kb3cKK1hOZXh0RXZlbnQKK1hPZmZzZXRSZWdpb24KK1hPcGVuRGlzcGxheQorWFBhcnNlR2VvbWV0cnkKK1hQZW5kaW5nCitYUG9pbnRJblJlZ2lvbgorWFBvbHlnb25SZWdpb24KK1hQdXRCYWNrRXZlbnQKK1hQdXRJbWFnZQorWFB1dFBpeGVsCitYUXVlcnlDb2xvcgorWFF1ZXJ5UG9pbnRlcgorWFF1ZXJ5VHJlZQorWFJlY29uZmlndXJlV01XaW5kb3cKK1hSZWN0SW5SZWdpb24KK1hSZXNldFNjcmVlblNhdmVyCitYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nCitYUmVzdGFja1dpbmRvd3MKK1hTYXZlQ29udGV4dAorWFNlbmRFdmVudAorWFNldEFyY01vZGUKK1hTZXRCYWNrZ3JvdW5kCitYU2V0Q2xpcE1hc2sKK1hTZXRDbGlwT3JpZ2luCitYU2V0Q2xpcFJlY3RhbmdsZXMKK1hTZXREYXNoZXMKK1hTZXRGaWxsU3R5bGUKK1hTZXRGb3JlZ3JvdW5kCitYU2V0RnVuY3Rpb24KK1hTZXRHcmFwaGljc0V4cG9zdXJlcworWFNldEljb25OYW1lCitYU2V0SW5wdXRGb2N1cworWFNldExpbmVBdHRyaWJ1dGVzCitYU2V0UmVnaW9uCitYU2V0U2NyZWVuU2F2ZXIKK1hTZXRTZWxlY3Rpb25Pd25lcgorWFNldFN1YndpbmRvd01vZGUKK1hTZXRUcmFuc2llbnRGb3JIaW50CitYU2V0V01Qcm9wZXJ0aWVzCitYU2V0V01Qcm90b2NvbHMKK1hTZXRXTVNpemVIaW50cworWFNobUF0dGFjaAorWFNobURldGFjaAorWFNobVBpeG1hcEZvcm1hdAorWFNobVF1ZXJ5RXh0ZW5zaW9uCitYU2hyaW5rUmVnaW9uCitYU3RvcmVDb2xvcgorWFN0b3JlTmFtZQorWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eQorWFN1YkltYWdlCitYU3VidHJhY3RSZWdpb24KK1hTeW5jCitYU3luY2hyb25pemUKK1hUZXh0RXh0ZW50cworWFRleHRXaWR0aAorWFVuZ3JhYlBvaW50ZXIKK1hVbmdyYWJTZXJ2ZXIKK1hVbmluc3RhbGxDb2xvcm1hcAorWFVuaW9uUmVjdFdpdGhSZWdpb24KK1hVbmlvblJlZ2lvbgorWFVuaXF1ZUNvbnRleHQKK1hVbm1hcFdpbmRvdworWFdhcnBQb2ludGVyCitYWG9yUmVnaW9uCitYcG1BdHRyaWJ1dGVzU2l6ZQorWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEKK1hybUdldEZpbGVEYXRhYmFzZQorWHJtR2V0UmVzb3VyY2UKK1hybUdldFN0cmluZ0RhdGFiYXNlCitYcm1Jbml0aWFsaXplCitYcm1NZXJnZURhdGFiYXNlcworWHJtUGFyc2VDb21tYW5kCitYcm1VbmlxdWVRdWFyaworX1hJbml0SW1hZ2VGdW5jUHRycwpkaWZmIC0tZ2l0IGEvdHN4MTEvdHNfeGxpYi5jIGIvdHN4MTEvdHNfeGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTdmNGYKLS0tIC9kZXYvbnVsbAorKysgYi90c3gxMS90c194bGliLmMKQEAgLTAsMCArMSwxMjYzIEBACisvKgorICogVGhyZWFkIHNhZmUgd3JhcHBlcnMgYXJvdW5kIFhsaWIgY2FsbHMuCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRvb2xzL21ha2VfWDExd3JhcHBlcnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBLcmlzdGlhbiBOaWVsc2VuCisgKi8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSAidHN4MTFkZWZzLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCitYRm9udFN0cnVjdCAqIFRTWExvYWRRdWVyeUZvbnQoRGlzcGxheSogYTAsIGNvbnN0ICBjaGFyKiBhMSkKK3sKKyAgWEZvbnRTdHJ1Y3QgKiByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhMb2FkUXVlcnlGb250XG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhMb2FkUXVlcnlGb250KGEwLCBhMSk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhMb2FkUXVlcnlGb250XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK1hNb2RpZmllcktleW1hcAkqIFRTWEdldE1vZGlmaWVyTWFwcGluZyhEaXNwbGF5KiBhMCkKK3sKKyAgWE1vZGlmaWVyS2V5bWFwCSogcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYR2V0TW9kaWZpZXJNYXBwaW5nXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhHZXRNb2RpZmllck1hcHBpbmcoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR2V0TW9kaWZpZXJNYXBwaW5nXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK1hJbWFnZSAqIFRTWENyZWF0ZUltYWdlKERpc3BsYXkqIGEwLCBWaXN1YWwqIGExLCB1bnNpZ25lZCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBjaGFyKiBhNSwgdW5zaWduZWQgaW50IGE2LCB1bnNpZ25lZCBpbnQgYTcsIGludCBhOCwgaW50IGE5KQoreworICBYSW1hZ2UgKiByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDcmVhdGVJbWFnZVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQ3JlYXRlSW1hZ2UoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ3JlYXRlSW1hZ2VcbiIpOworICByZXR1cm4gcjsKK30KKworWEltYWdlICogVFNYR2V0SW1hZ2UoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBpbnQgYTIsIGludCBhMywgdW5zaWduZWQgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGxvbmcgYTYsIGludCBhNykKK3sKKyAgWEltYWdlICogcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYR2V0SW1hZ2VcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEdldEltYWdlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhHZXRJbWFnZVxuIik7CisgIHJldHVybiByOworfQorCitEaXNwbGF5ICogVFNYT3BlbkRpc3BsYXkoY29uc3QgIGNoYXIqIGEwKQoreworICBEaXNwbGF5ICogcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYT3BlbkRpc3BsYXlcbiIpOworICBYMTFfTE9DSygpOworICByID0gWE9wZW5EaXNwbGF5KGEwKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWE9wZW5EaXNwbGF5XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK3ZvaWQgIFRTWHJtSW5pdGlhbGl6ZSh2b2lkKQoreworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhybUluaXRpYWxpemVcbiIpOworICBYMTFfTE9DSygpOworICBYcm1Jbml0aWFsaXplKCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhybUluaXRpYWxpemVcbiIpOworfQorCitjaGFyICogVFNYR2V0QXRvbU5hbWUoRGlzcGxheSogYTAsIEF0b20gYTEpCit7CisgIGNoYXIgKiByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRBdG9tTmFtZVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYR2V0QXRvbU5hbWUoYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldEF0b21OYW1lXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2NoYXIgKiBUU1hLZXlzeW1Ub1N0cmluZyhLZXlTeW0gYTApCit7CisgIGNoYXIgKiByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhLZXlzeW1Ub1N0cmluZ1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYS2V5c3ltVG9TdHJpbmcoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYS2V5c3ltVG9TdHJpbmdcbiIpOworICByZXR1cm4gcjsKK30KKworQXRvbSAgVFNYSW50ZXJuQXRvbShEaXNwbGF5KiBhMCwgY29uc3QgIGNoYXIqIGExLCBpbnQgYTIpCit7CisgIEF0b20gIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEludGVybkF0b21cbiIpOworICBYMTFfTE9DSygpOworICByID0gWEludGVybkF0b20oYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhJbnRlcm5BdG9tXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK0NvbG9ybWFwICBUU1hDcmVhdGVDb2xvcm1hcChEaXNwbGF5KiBhMCwgV2luZG93IGExLCBWaXN1YWwqIGEyLCBpbnQgYTMpCit7CisgIENvbG9ybWFwICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDcmVhdGVDb2xvcm1hcFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQ3JlYXRlQ29sb3JtYXAoYTAsIGExLCBhMiwgYTMpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ3JlYXRlQ29sb3JtYXBcbiIpOworICByZXR1cm4gcjsKK30KKworQ3Vyc29yICBUU1hDcmVhdGVQaXhtYXBDdXJzb3IoRGlzcGxheSogYTAsIFBpeG1hcCBhMSwgUGl4bWFwIGEyLCBYQ29sb3IqIGEzLCBYQ29sb3IqIGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNikKK3sKKyAgQ3Vyc29yICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDcmVhdGVQaXhtYXBDdXJzb3JcbiIpOworICBYMTFfTE9DSygpOworICByID0gWENyZWF0ZVBpeG1hcEN1cnNvcihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDcmVhdGVQaXhtYXBDdXJzb3JcbiIpOworICByZXR1cm4gcjsKK30KKworQ3Vyc29yICBUU1hDcmVhdGVGb250Q3Vyc29yKERpc3BsYXkqIGEwLCB1bnNpZ25lZCBpbnQgYTEpCit7CisgIEN1cnNvciAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQ3JlYXRlRm9udEN1cnNvclxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQ3JlYXRlRm9udEN1cnNvcihhMCwgYTEpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ3JlYXRlRm9udEN1cnNvclxuIik7CisgIHJldHVybiByOworfQorCitHQyAgVFNYQ3JlYXRlR0MoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCB1bnNpZ25lZCBsb25nIGEyLCBYR0NWYWx1ZXMqIGEzKQoreworICBHQyAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQ3JlYXRlR0NcbiIpOworICBYMTFfTE9DSygpOworICByID0gWENyZWF0ZUdDKGEwLCBhMSwgYTIsIGEzKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENyZWF0ZUdDXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK1BpeG1hcCAgVFNYQ3JlYXRlUGl4bWFwKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgdW5zaWduZWQgaW50IGEyLCB1bnNpZ25lZCBpbnQgYTMsIHVuc2lnbmVkIGludCBhNCkKK3sKKyAgUGl4bWFwICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDcmVhdGVQaXhtYXBcbiIpOworICBYMTFfTE9DSygpOworICByID0gWENyZWF0ZVBpeG1hcChhMCwgYTEsIGEyLCBhMywgYTQpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ3JlYXRlUGl4bWFwXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK1BpeG1hcCAgVFNYQ3JlYXRlQml0bWFwRnJvbURhdGEoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBjb25zdCAgY2hhciogYTIsIHVuc2lnbmVkIGludCBhMywgdW5zaWduZWQgaW50IGE0KQoreworICBQaXhtYXAgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENyZWF0ZUJpdG1hcEZyb21EYXRhXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhDcmVhdGVCaXRtYXBGcm9tRGF0YShhMCwgYTEsIGEyLCBhMywgYTQpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ3JlYXRlQml0bWFwRnJvbURhdGFcbiIpOworICByZXR1cm4gcjsKK30KKworV2luZG93ICBUU1hHZXRTZWxlY3Rpb25Pd25lcihEaXNwbGF5KiBhMCwgQXRvbSBhMSkKK3sKKyAgV2luZG93ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRTZWxlY3Rpb25Pd25lclxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYR2V0U2VsZWN0aW9uT3duZXIoYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldFNlbGVjdGlvbk93bmVyXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK1dpbmRvdyAgVFNYQ3JlYXRlV2luZG93KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGludCBhMiwgaW50IGEzLCB1bnNpZ25lZCBpbnQgYTQsIHVuc2lnbmVkIGludCBhNSwgdW5zaWduZWQgaW50IGE2LCBpbnQgYTcsIHVuc2lnbmVkIGludCBhOCwgVmlzdWFsKiBhOSwgdW5zaWduZWQgbG9uZyBhMTAsIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKiBhMTEpCit7CisgIFdpbmRvdyAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQ3JlYXRlV2luZG93XG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhDcmVhdGVXaW5kb3coYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENyZWF0ZVdpbmRvd1xuIik7CisgIHJldHVybiByOworfQorCitjaGFyICoqIFRTWExpc3RGb250cyhEaXNwbGF5KiBhMCwgY29uc3QgIGNoYXIqIGExLCBpbnQgYTIsIGludCogYTMpCit7CisgIGNoYXIgKiogcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYTGlzdEZvbnRzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhMaXN0Rm9udHMoYTAsIGExLCBhMiwgYTMpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYTGlzdEZvbnRzXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK0tleVN5bSAgVFNYS2V5Y29kZVRvS2V5c3ltKERpc3BsYXkqIGEwLCB1bnNpZ25lZCBpbnQgYTEsIGludCBhMikKK3sKKyAgS2V5U3ltICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhLZXljb2RlVG9LZXlzeW1cbiIpOworICBYMTFfTE9DSygpOworICByID0gWEtleWNvZGVUb0tleXN5bShhMCwgYTEsIGEyKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEtleWNvZGVUb0tleXN5bVxuIik7CisgIHJldHVybiByOworfQorCitLZXlTeW0gIFRTWExvb2t1cEtleXN5bShYS2V5RXZlbnQqIGEwLCBpbnQgYTEpCit7CisgIEtleVN5bSAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYTG9va3VwS2V5c3ltXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhMb29rdXBLZXlzeW0oYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWExvb2t1cEtleXN5bVxuIik7CisgIHJldHVybiByOworfQorCitLZXlTeW0gKiBUU1hHZXRLZXlib2FyZE1hcHBpbmcoRGlzcGxheSogYTAsIHVuc2lnbmVkIGludCBhMSwgaW50IGEyLCBpbnQqIGEzKQoreworICBLZXlTeW0gKiByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRLZXlib2FyZE1hcHBpbmdcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEdldEtleWJvYXJkTWFwcGluZyhhMCwgYTEsIGEyLCBhMyk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhHZXRLZXlib2FyZE1hcHBpbmdcbiIpOworICByZXR1cm4gcjsKK30KKworY2hhciAqIFRTWFJlc291cmNlTWFuYWdlclN0cmluZyhEaXNwbGF5KiBhMCkKK3sKKyAgY2hhciAqIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFJlc291cmNlTWFuYWdlclN0cmluZ1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nKGEwKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFJlc291cmNlTWFuYWdlclN0cmluZ1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgICBUU1hJbml0VGhyZWFkcyh2b2lkKQoreworICBpbnQgICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhJbml0VGhyZWFkc1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYSW5pdFRocmVhZHMoKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEluaXRUaHJlYWRzXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAqIFRTWExpc3REZXB0aHMoRGlzcGxheSogYTAsIGludCBhMSwgaW50KiBhMikKK3sKKyAgaW50ICogcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYTGlzdERlcHRoc1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYTGlzdERlcHRocyhhMCwgYTEsIGEyKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWExpc3REZXB0aHNcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICAgVFNYUmVjb25maWd1cmVXTVdpbmRvdyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBpbnQgYTIsIHVuc2lnbmVkIGludCBhMywgWFdpbmRvd0NoYW5nZXMqIGE0KQoreworICBpbnQgICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhSZWNvbmZpZ3VyZVdNV2luZG93XG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhSZWNvbmZpZ3VyZVdNV2luZG93KGEwLCBhMSwgYTIsIGEzLCBhNCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhSZWNvbmZpZ3VyZVdNV2luZG93XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgIFRTWFNldFdNUHJvdG9jb2xzKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIEF0b20qIGEyLCBpbnQgYTMpCit7CisgIGludCAgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldFdNUHJvdG9jb2xzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTZXRXTVByb3RvY29scyhhMCwgYTEsIGEyLCBhMyk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRXTVByb3RvY29sc1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFNldFRyYW5zaWVudEZvckhpbnQoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgV2luZG93IGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldFRyYW5zaWVudEZvckhpbnRcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNldFRyYW5zaWVudEZvckhpbnQoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRUcmFuc2llbnRGb3JIaW50XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYQWN0aXZhdGVTY3JlZW5TYXZlcihEaXNwbGF5KiBhMCkKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhBY3RpdmF0ZVNjcmVlblNhdmVyXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhBY3RpdmF0ZVNjcmVlblNhdmVyKGEwKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEFjdGl2YXRlU2NyZWVuU2F2ZXJcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICAgVFNYQWxsb2NDb2xvcihEaXNwbGF5KiBhMCwgQ29sb3JtYXAgYTEsIFhDb2xvciogYTIpCit7CisgIGludCAgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEFsbG9jQ29sb3JcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEFsbG9jQ29sb3IoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhBbGxvY0NvbG9yXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgIFRTWEFsbG9jQ29sb3JDZWxscyhEaXNwbGF5KiBhMCwgQ29sb3JtYXAgYTEsIGludCBhMiwgdW5zaWduZWQgbG9uZyogYTMsIHVuc2lnbmVkIGludCBhNCwgdW5zaWduZWQgbG9uZyogYTUsIHVuc2lnbmVkIGludCBhNikKK3sKKyAgaW50ICAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQWxsb2NDb2xvckNlbGxzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhBbGxvY0NvbG9yQ2VsbHMoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQWxsb2NDb2xvckNlbGxzXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYQmVsbChEaXNwbGF5KiBhMCwgaW50IGExKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEJlbGxcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEJlbGwoYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEJlbGxcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hDaGFuZ2VHQyhEaXNwbGF5KiBhMCwgR0MgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIFhHQ1ZhbHVlcyogYTMpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQ2hhbmdlR0NcbiIpOworICBYMTFfTE9DSygpOworICByID0gWENoYW5nZUdDKGEwLCBhMSwgYTIsIGEzKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENoYW5nZUdDXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYQ2hhbmdlS2V5Ym9hcmRDb250cm9sKERpc3BsYXkqIGEwLCB1bnNpZ25lZCBsb25nIGExLCBYS2V5Ym9hcmRDb250cm9sKiBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDaGFuZ2VLZXlib2FyZENvbnRyb2xcbiIpOworICBYMTFfTE9DSygpOworICByID0gWENoYW5nZUtleWJvYXJkQ29udHJvbChhMCwgYTEsIGEyKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENoYW5nZUtleWJvYXJkQ29udHJvbFxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWENoYW5nZVByb3BlcnR5KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIEF0b20gYTIsIEF0b20gYTMsIGludCBhNCwgaW50IGE1LCBjb25zdCAgdW5zaWduZWQgY2hhciogYTYsIGludCBhNykKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDaGFuZ2VQcm9wZXJ0eVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQ2hhbmdlUHJvcGVydHkoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENoYW5nZVByb3BlcnR5XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYQ2hhbmdlV2luZG93QXR0cmlidXRlcyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCB1bnNpZ25lZCBsb25nIGEyLCBYU2V0V2luZG93QXR0cmlidXRlcyogYTMpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQ2hhbmdlV2luZG93QXR0cmlidXRlc1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQ2hhbmdlV2luZG93QXR0cmlidXRlcyhhMCwgYTEsIGEyLCBhMyk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgIFRTWENoZWNrVHlwZWRXaW5kb3dFdmVudChEaXNwbGF5KiBhMCwgV2luZG93IGExLCBpbnQgYTIsIFhFdmVudCogYTMpCit7CisgIGludCAgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENoZWNrVHlwZWRXaW5kb3dFdmVudFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQ2hlY2tUeXBlZFdpbmRvd0V2ZW50KGEwLCBhMSwgYTIsIGEzKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENoZWNrVHlwZWRXaW5kb3dFdmVudFxuIik7CisgIHJldHVybiByOworfQorCitpbnQgICBUU1hDaGVja1dpbmRvd0V2ZW50KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGxvbmcgYTIsIFhFdmVudCogYTMpCit7CisgIGludCAgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENoZWNrV2luZG93RXZlbnRcbiIpOworICBYMTFfTE9DSygpOworICByID0gWENoZWNrV2luZG93RXZlbnQoYTAsIGExLCBhMiwgYTMpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ2hlY2tXaW5kb3dFdmVudFxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWENvbnZlcnRTZWxlY3Rpb24oRGlzcGxheSogYTAsIEF0b20gYTEsIEF0b20gYTIsIEF0b20gYTMsIFdpbmRvdyBhNCwgVGltZSBhNSkKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDb252ZXJ0U2VsZWN0aW9uXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhDb252ZXJ0U2VsZWN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ29udmVydFNlbGVjdGlvblxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWENvcHlBcmVhKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgRHJhd2FibGUgYTIsIEdDIGEzLCBpbnQgYTQsIGludCBhNSwgdW5zaWduZWQgaW50IGE2LCB1bnNpZ25lZCBpbnQgYTcsIGludCBhOCwgaW50IGE5KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENvcHlBcmVhXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhDb3B5QXJlYShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDb3B5QXJlYVxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWENvcHlQbGFuZShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIERyYXdhYmxlIGEyLCBHQyBhMywgaW50IGE0LCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNiwgdW5zaWduZWQgaW50IGE3LCBpbnQgYTgsIGludCBhOSwgdW5zaWduZWQgbG9uZyBhMTApCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQ29weVBsYW5lXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhDb3B5UGxhbmUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDb3B5UGxhbmVcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hEZWZpbmVDdXJzb3IoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgQ3Vyc29yIGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWERlZmluZUN1cnNvclxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYRGVmaW5lQ3Vyc29yKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRGVmaW5lQ3Vyc29yXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYRGVzdHJveVdpbmRvdyhEaXNwbGF5KiBhMCwgV2luZG93IGExKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWERlc3Ryb3lXaW5kb3dcbiIpOworICBYMTFfTE9DSygpOworICByID0gWERlc3Ryb3lXaW5kb3coYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERlc3Ryb3lXaW5kb3dcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hEaXNwbGF5S2V5Y29kZXMoRGlzcGxheSogYTAsIGludCogYTEsIGludCogYTIpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRGlzcGxheUtleWNvZGVzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhEaXNwbGF5S2V5Y29kZXMoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEaXNwbGF5S2V5Y29kZXNcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hEcmF3QXJjKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNiwgaW50IGE3LCBpbnQgYTgpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRHJhd0FyY1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYRHJhd0FyYyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERyYXdBcmNcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hEcmF3TGluZShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIEdDIGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRHJhd0xpbmVcbiIpOworICBYMTFfTE9DSygpOworICByID0gWERyYXdMaW5lKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERyYXdMaW5lXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYRHJhd0xpbmVzKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIFhQb2ludCogYTMsIGludCBhNCwgaW50IGE1KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWERyYXdMaW5lc1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYRHJhd0xpbmVzKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRHJhd0xpbmVzXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYRHJhd1BvaW50KERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWERyYXdQb2ludFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYRHJhd1BvaW50KGEwLCBhMSwgYTIsIGEzLCBhNCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEcmF3UG9pbnRcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hEcmF3UmVjdGFuZ2xlKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhEcmF3UmVjdGFuZ2xlXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhEcmF3UmVjdGFuZ2xlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERyYXdSZWN0YW5nbGVcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hEcmF3U2VnbWVudHMoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgWFNlZ21lbnQqIGEzLCBpbnQgYTQpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRHJhd1NlZ21lbnRzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhEcmF3U2VnbWVudHMoYTAsIGExLCBhMiwgYTMsIGE0KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERyYXdTZWdtZW50c1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWERyYXdTdHJpbmcoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgaW50IGEzLCBpbnQgYTQsIGNvbnN0ICBjaGFyKiBhNSwgaW50IGE2KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWERyYXdTdHJpbmdcbiIpOworICBYMTFfTE9DSygpOworICByID0gWERyYXdTdHJpbmcoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRHJhd1N0cmluZ1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWERyYXdUZXh0KERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCBYVGV4dEl0ZW0qIGE1LCBpbnQgYTYpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRHJhd1RleHRcbiIpOworICBYMTFfTE9DSygpOworICByID0gWERyYXdUZXh0KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERyYXdUZXh0XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYRmlsbEFyYyhEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIEdDIGEyLCBpbnQgYTMsIGludCBhNCwgdW5zaWduZWQgaW50IGE1LCB1bnNpZ25lZCBpbnQgYTYsIGludCBhNywgaW50IGE4KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZpbGxBcmNcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEZpbGxBcmMoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhGaWxsQXJjXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYRmlsbFBvbHlnb24oRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgWFBvaW50KiBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGaWxsUG9seWdvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYRmlsbFBvbHlnb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRmlsbFBvbHlnb25cbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hGaWxsUmVjdGFuZ2xlKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGaWxsUmVjdGFuZ2xlXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhGaWxsUmVjdGFuZ2xlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZpbGxSZWN0YW5nbGVcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hGbHVzaChEaXNwbGF5KiBhMCkKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGbHVzaFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYRmx1c2goYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRmx1c2hcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hGcmVlKHZvaWQqIGEwKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZyZWVcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEZyZWUoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRnJlZVxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEZyZWVDb2xvcnMoRGlzcGxheSogYTAsIENvbG9ybWFwIGExLCB1bnNpZ25lZCBsb25nKiBhMiwgaW50IGEzLCB1bnNpZ25lZCBsb25nIGE0KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZyZWVDb2xvcnNcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEZyZWVDb2xvcnMoYTAsIGExLCBhMiwgYTMsIGE0KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZyZWVDb2xvcnNcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hGcmVlQ3Vyc29yKERpc3BsYXkqIGEwLCBDdXJzb3IgYTEpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRnJlZUN1cnNvclxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYRnJlZUN1cnNvcihhMCwgYTEpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRnJlZUN1cnNvclxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEZyZWVGb250KERpc3BsYXkqIGEwLCBYRm9udFN0cnVjdCogYTEpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRnJlZUZvbnRcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEZyZWVGb250KGEwLCBhMSk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhGcmVlRm9udFxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEZyZWVGb250TmFtZXMoY2hhcioqIGEwKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZyZWVGb250TmFtZXNcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEZyZWVGb250TmFtZXMoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRnJlZUZvbnROYW1lc1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEZyZWVHQyhEaXNwbGF5KiBhMCwgR0MgYTEpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRnJlZUdDXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhGcmVlR0MoYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZyZWVHQ1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEZyZWVNb2RpZmllcm1hcChYTW9kaWZpZXJLZXltYXAqIGEwKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZyZWVNb2RpZmllcm1hcFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYRnJlZU1vZGlmaWVybWFwKGEwKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZyZWVNb2RpZmllcm1hcFxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEZyZWVQaXhtYXAoRGlzcGxheSogYTAsIFBpeG1hcCBhMSkKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGcmVlUGl4bWFwXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhGcmVlUGl4bWFwKGEwLCBhMSk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhGcmVlUGl4bWFwXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgIFRTWEdldEZvbnRQcm9wZXJ0eShYRm9udFN0cnVjdCogYTAsIEF0b20gYTEsIHVuc2lnbmVkIGxvbmcqIGEyKQoreworICBpbnQgICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRGb250UHJvcGVydHlcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEdldEZvbnRQcm9wZXJ0eShhMCwgYTEsIGEyKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldEZvbnRQcm9wZXJ0eVxuIik7CisgIHJldHVybiByOworfQorCitpbnQgICBUU1hHZXRHZW9tZXRyeShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIFdpbmRvdyogYTIsIGludCogYTMsIGludCogYTQsIHVuc2lnbmVkIGludCogYTUsIHVuc2lnbmVkIGludCogYTYsIHVuc2lnbmVkIGludCogYTcsIHVuc2lnbmVkIGludCogYTgpCit7CisgIGludCAgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdldEdlb21ldHJ5XG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhHZXRHZW9tZXRyeShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldEdlb21ldHJ5XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYR2V0SW5wdXRGb2N1cyhEaXNwbGF5KiBhMCwgV2luZG93KiBhMSwgaW50KiBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRJbnB1dEZvY3VzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhHZXRJbnB1dEZvY3VzKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR2V0SW5wdXRGb2N1c1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEdldEtleWJvYXJkQ29udHJvbChEaXNwbGF5KiBhMCwgWEtleWJvYXJkU3RhdGUqIGExKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdldEtleWJvYXJkQ29udHJvbFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYR2V0S2V5Ym9hcmRDb250cm9sKGEwLCBhMSk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhHZXRLZXlib2FyZENvbnRyb2xcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hHZXRTY3JlZW5TYXZlcihEaXNwbGF5KiBhMCwgaW50KiBhMSwgaW50KiBhMiwgaW50KiBhMywgaW50KiBhNCkKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRTY3JlZW5TYXZlclxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYR2V0U2NyZWVuU2F2ZXIoYTAsIGExLCBhMiwgYTMsIGE0KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldFNjcmVlblNhdmVyXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYR2V0V2luZG93UHJvcGVydHkoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgQXRvbSBhMiwgbG9uZyBhMywgbG9uZyBhNCwgaW50IGE1LCBBdG9tIGE2LCBBdG9tKiBhNywgaW50KiBhOCwgdW5zaWduZWQgbG9uZyogYTksIHVuc2lnbmVkIGxvbmcqIGExMCwgdW5zaWduZWQgY2hhcioqIGExMSkKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRXaW5kb3dQcm9wZXJ0eVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYR2V0V2luZG93UHJvcGVydHkoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldFdpbmRvd1Byb3BlcnR5XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgIFRTWEdldFdpbmRvd0F0dHJpYnV0ZXMoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgWFdpbmRvd0F0dHJpYnV0ZXMqIGEyKQoreworICBpbnQgICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRXaW5kb3dBdHRyaWJ1dGVzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhHZXRXaW5kb3dBdHRyaWJ1dGVzKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR2V0V2luZG93QXR0cmlidXRlc1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEdyYWJQb2ludGVyKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGludCBhMiwgdW5zaWduZWQgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgV2luZG93IGE2LCBDdXJzb3IgYTcsIFRpbWUgYTgpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYR3JhYlBvaW50ZXJcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEdyYWJQb2ludGVyKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR3JhYlBvaW50ZXJcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hHcmFiU2VydmVyKERpc3BsYXkqIGEwKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdyYWJTZXJ2ZXJcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEdyYWJTZXJ2ZXIoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR3JhYlNlcnZlclxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEluc3RhbGxDb2xvcm1hcChEaXNwbGF5KiBhMCwgQ29sb3JtYXAgYTEpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYSW5zdGFsbENvbG9ybWFwXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhJbnN0YWxsQ29sb3JtYXAoYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEluc3RhbGxDb2xvcm1hcFxuIik7CisgIHJldHVybiByOworfQorCitLZXlDb2RlICBUU1hLZXlzeW1Ub0tleWNvZGUoRGlzcGxheSogYTAsIEtleVN5bSBhMSkKK3sKKyAgS2V5Q29kZSAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYS2V5c3ltVG9LZXljb2RlXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhLZXlzeW1Ub0tleWNvZGUoYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEtleXN5bVRvS2V5Y29kZVxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWE1hcFdpbmRvdyhEaXNwbGF5KiBhMCwgV2luZG93IGExKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWE1hcFdpbmRvd1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYTWFwV2luZG93KGEwLCBhMSk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhNYXBXaW5kb3dcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hOZXh0RXZlbnQoRGlzcGxheSogYTAsIFhFdmVudCogYTEpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYTmV4dEV2ZW50XG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhOZXh0RXZlbnQoYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWE5leHRFdmVudFxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFBhcnNlR2VvbWV0cnkoY29uc3QgIGNoYXIqIGEwLCBpbnQqIGExLCBpbnQqIGEyLCB1bnNpZ25lZCBpbnQqIGEzLCB1bnNpZ25lZCBpbnQqIGE0KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFBhcnNlR2VvbWV0cnlcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFBhcnNlR2VvbWV0cnkoYTAsIGExLCBhMiwgYTMsIGE0KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFBhcnNlR2VvbWV0cnlcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hQZW5kaW5nKERpc3BsYXkqIGEwKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFBlbmRpbmdcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFBlbmRpbmcoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYUGVuZGluZ1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFB1dEJhY2tFdmVudChEaXNwbGF5KiBhMCwgWEV2ZW50KiBhMSkKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhQdXRCYWNrRXZlbnRcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFB1dEJhY2tFdmVudChhMCwgYTEpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYUHV0QmFja0V2ZW50XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYUHV0SW1hZ2UoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgWEltYWdlKiBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LCB1bnNpZ25lZCBpbnQgYTgsIHVuc2lnbmVkIGludCBhOSkKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhQdXRJbWFnZVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYUHV0SW1hZ2UoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYUHV0SW1hZ2VcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hRdWVyeUNvbG9yKERpc3BsYXkqIGEwLCBDb2xvcm1hcCBhMSwgWENvbG9yKiBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhRdWVyeUNvbG9yXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhRdWVyeUNvbG9yKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYUXVlcnlDb2xvclxuIik7CisgIHJldHVybiByOworfQorCitpbnQgICBUU1hRdWVyeVBvaW50ZXIoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgV2luZG93KiBhMiwgV2luZG93KiBhMywgaW50KiBhNCwgaW50KiBhNSwgaW50KiBhNiwgaW50KiBhNywgdW5zaWduZWQgaW50KiBhOCkKK3sKKyAgaW50ICAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUXVlcnlQb2ludGVyXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhRdWVyeVBvaW50ZXIoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhRdWVyeVBvaW50ZXJcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICAgVFNYUXVlcnlUcmVlKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIFdpbmRvdyogYTIsIFdpbmRvdyogYTMsIFdpbmRvdyoqIGE0LCB1bnNpZ25lZCBpbnQqIGE1KQoreworICBpbnQgICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhRdWVyeVRyZWVcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFF1ZXJ5VHJlZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFF1ZXJ5VHJlZVxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFJlc2V0U2NyZWVuU2F2ZXIoRGlzcGxheSogYTApCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUmVzZXRTY3JlZW5TYXZlclxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYUmVzZXRTY3JlZW5TYXZlcihhMCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhSZXNldFNjcmVlblNhdmVyXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYUmVzdGFja1dpbmRvd3MoRGlzcGxheSogYTAsIFdpbmRvdyogYTEsIGludCBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhSZXN0YWNrV2luZG93c1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYUmVzdGFja1dpbmRvd3MoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhSZXN0YWNrV2luZG93c1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgICBUU1hTZW5kRXZlbnQoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgaW50IGEyLCBsb25nIGEzLCBYRXZlbnQqIGE0KQoreworICBpbnQgICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZW5kRXZlbnRcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNlbmRFdmVudChhMCwgYTEsIGEyLCBhMywgYTQpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2VuZEV2ZW50XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYU2V0QXJjTW9kZShEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRBcmNNb2RlXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTZXRBcmNNb2RlKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0QXJjTW9kZVxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFNldEJhY2tncm91bmQoRGlzcGxheSogYTAsIEdDIGExLCB1bnNpZ25lZCBsb25nIGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldEJhY2tncm91bmRcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNldEJhY2tncm91bmQoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRCYWNrZ3JvdW5kXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYU2V0Q2xpcE1hc2soRGlzcGxheSogYTAsIEdDIGExLCBQaXhtYXAgYTIpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2V0Q2xpcE1hc2tcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNldENsaXBNYXNrKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0Q2xpcE1hc2tcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hTZXRDbGlwT3JpZ2luKERpc3BsYXkqIGEwLCBHQyBhMSwgaW50IGEyLCBpbnQgYTMpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2V0Q2xpcE9yaWdpblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU2V0Q2xpcE9yaWdpbihhMCwgYTEsIGEyLCBhMyk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRDbGlwT3JpZ2luXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYU2V0Q2xpcFJlY3RhbmdsZXMoRGlzcGxheSogYTAsIEdDIGExLCBpbnQgYTIsIGludCBhMywgWFJlY3RhbmdsZSogYTQsIGludCBhNSwgaW50IGE2KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldENsaXBSZWN0YW5nbGVzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTZXRDbGlwUmVjdGFuZ2xlcyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRDbGlwUmVjdGFuZ2xlc1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFNldERhc2hlcyhEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMiwgY29uc3QgIGNoYXIqIGEzLCBpbnQgYTQpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2V0RGFzaGVzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTZXREYXNoZXMoYTAsIGExLCBhMiwgYTMsIGE0KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNldERhc2hlc1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFNldEZpbGxTdHlsZShEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRGaWxsU3R5bGVcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNldEZpbGxTdHlsZShhMCwgYTEsIGEyKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNldEZpbGxTdHlsZVxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFNldEZvcmVncm91bmQoRGlzcGxheSogYTAsIEdDIGExLCB1bnNpZ25lZCBsb25nIGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldEZvcmVncm91bmRcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNldEZvcmVncm91bmQoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRGb3JlZ3JvdW5kXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYU2V0RnVuY3Rpb24oRGlzcGxheSogYTAsIEdDIGExLCBpbnQgYTIpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2V0RnVuY3Rpb25cbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNldEZ1bmN0aW9uKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0RnVuY3Rpb25cbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hTZXRHcmFwaGljc0V4cG9zdXJlcyhEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRHcmFwaGljc0V4cG9zdXJlc1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU2V0R3JhcGhpY3NFeHBvc3VyZXMoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRHcmFwaGljc0V4cG9zdXJlc1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFNldEljb25OYW1lKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGNvbnN0ICBjaGFyKiBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRJY29uTmFtZVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU2V0SWNvbk5hbWUoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRJY29uTmFtZVxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFNldElucHV0Rm9jdXMoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgaW50IGEyLCBUaW1lIGEzKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldElucHV0Rm9jdXNcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNldElucHV0Rm9jdXMoYTAsIGExLCBhMiwgYTMpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0SW5wdXRGb2N1c1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFNldExpbmVBdHRyaWJ1dGVzKERpc3BsYXkqIGEwLCBHQyBhMSwgdW5zaWduZWQgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldExpbmVBdHRyaWJ1dGVzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTZXRMaW5lQXR0cmlidXRlcyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNldExpbmVBdHRyaWJ1dGVzXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYU2V0U2NyZWVuU2F2ZXIoRGlzcGxheSogYTAsIGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCkKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRTY3JlZW5TYXZlclxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU2V0U2NyZWVuU2F2ZXIoYTAsIGExLCBhMiwgYTMsIGE0KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNldFNjcmVlblNhdmVyXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYU2V0U2VsZWN0aW9uT3duZXIoRGlzcGxheSogYTAsIEF0b20gYTEsIFdpbmRvdyBhMiwgVGltZSBhMykKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRTZWxlY3Rpb25Pd25lclxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU2V0U2VsZWN0aW9uT3duZXIoYTAsIGExLCBhMiwgYTMpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0U2VsZWN0aW9uT3duZXJcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hTZXRTdWJ3aW5kb3dNb2RlKERpc3BsYXkqIGEwLCBHQyBhMSwgaW50IGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldFN1YndpbmRvd01vZGVcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNldFN1YndpbmRvd01vZGUoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRTdWJ3aW5kb3dNb2RlXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYU3RvcmVDb2xvcihEaXNwbGF5KiBhMCwgQ29sb3JtYXAgYTEsIFhDb2xvciogYTIpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU3RvcmVDb2xvclxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU3RvcmVDb2xvcihhMCwgYTEsIGEyKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFN0b3JlQ29sb3JcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hTdG9yZU5hbWUoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgY29uc3QgIGNoYXIqIGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFN0b3JlTmFtZVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU3RvcmVOYW1lKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU3RvcmVOYW1lXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYU3luYyhEaXNwbGF5KiBhMCwgaW50IGExKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFN5bmNcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFN5bmMoYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFN5bmNcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hUZXh0RXh0ZW50cyhYRm9udFN0cnVjdCogYTAsIGNvbnN0ICBjaGFyKiBhMSwgaW50IGEyLCBpbnQqIGEzLCBpbnQqIGE0LCBpbnQqIGE1LCBYQ2hhclN0cnVjdCogYTYpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYVGV4dEV4dGVudHNcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFRleHRFeHRlbnRzKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFRleHRFeHRlbnRzXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYVGV4dFdpZHRoKFhGb250U3RydWN0KiBhMCwgY29uc3QgIGNoYXIqIGExLCBpbnQgYTIpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYVGV4dFdpZHRoXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhUZXh0V2lkdGgoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhUZXh0V2lkdGhcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hVbmdyYWJQb2ludGVyKERpc3BsYXkqIGEwLCBUaW1lIGExKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFVuZ3JhYlBvaW50ZXJcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFVuZ3JhYlBvaW50ZXIoYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFVuZ3JhYlBvaW50ZXJcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hVbmdyYWJTZXJ2ZXIoRGlzcGxheSogYTApCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYVW5ncmFiU2VydmVyXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhVbmdyYWJTZXJ2ZXIoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYVW5ncmFiU2VydmVyXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYVW5pbnN0YWxsQ29sb3JtYXAoRGlzcGxheSogYTAsIENvbG9ybWFwIGExKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFVuaW5zdGFsbENvbG9ybWFwXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhVbmluc3RhbGxDb2xvcm1hcChhMCwgYTEpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYVW5pbnN0YWxsQ29sb3JtYXBcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hVbm1hcFdpbmRvdyhEaXNwbGF5KiBhMCwgV2luZG93IGExKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFVubWFwV2luZG93XG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhVbm1hcFdpbmRvdyhhMCwgYTEpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYVW5tYXBXaW5kb3dcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hXYXJwUG9pbnRlcihEaXNwbGF5KiBhMCwgV2luZG93IGExLCBXaW5kb3cgYTIsIGludCBhMywgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNiwgaW50IGE3LCBpbnQgYTgpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYV2FycFBvaW50ZXJcbiIpOworICBYMTFfTE9DSygpOworICByID0gWFdhcnBQb2ludGVyKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYV2FycFBvaW50ZXJcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICgqVFNYU3luY2hyb25pemUoRGlzcGxheSAqYTAsIEJvb2wgYTEpKShEaXNwbGF5ICopCit7CisgIGludCAoKnIpKERpc3BsYXkgKik7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFN5bmNocm9uaXplXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTeW5jaHJvbml6ZShhMCwgYTEpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU3luY2hyb25pemVcbiIpOworICByZXR1cm4gcjsKK30KKworZXh0ZXJuIHZvaWQgX1hJbml0SW1hZ2VGdW5jUHRycyhYSW1hZ2UgKik7CisKK3ZvaWQgVFNfWEluaXRJbWFnZUZ1bmNQdHJzKFhJbWFnZSAqYTApCit7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgX1hJbml0SW1hZ2VGdW5jUHRyc1xuIik7CisgIFgxMV9MT0NLKCk7CisgIF9YSW5pdEltYWdlRnVuY1B0cnMoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBfWEluaXRJbWFnZUZ1bmNQdHJzXG4iKTsKK30KZGlmZiAtLWdpdCBhL3RzeDExL3RzX3hwbS5jIGIvdHN4MTEvdHNfeHBtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjYjEyZgotLS0gL2Rldi9udWxsCisrKyBiL3RzeDExL3RzX3hwbS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBUaHJlYWQgc2FmZSB3cmFwcGVycyBhcm91bmQgeHBtIGNhbGxzLgorICogVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0b29scy9tYWtlX1gxMXdyYXBwZXJzCisgKgorICogQ29weXJpZ2h0IDE5OTggS3Jpc3RpYW4gTmllbHNlbgorICovCisKKyNpbmNsdWRlIDxYMTEveHBtLmg+CisjaW5jbHVkZSAidHN4MTFkZWZzLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCitpbnQgVFNYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YShEaXNwbGF5ICphMCwgRHJhd2FibGUgYTEsIGNoYXIgKiphMiwgUGl4bWFwICphMywgUGl4bWFwICphNCwgWHBtQXR0cmlidXRlcyAqYTUpCit7CisgIGludCByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhwbUNyZWF0ZVBpeG1hcEZyb21EYXRhXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhwbUNyZWF0ZVBpeG1hcEZyb21EYXRhKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YVxuIik7CisgIHJldHVybiByOworfQorCitpbnQgVFNYcG1BdHRyaWJ1dGVzU2l6ZSh2b2lkKQoreworICBpbnQgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYcG1BdHRyaWJ1dGVzU2l6ZVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYcG1BdHRyaWJ1dGVzU2l6ZSgpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYcG1BdHRyaWJ1dGVzU2l6ZVxuIik7CisgIHJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvdHN4MTEvdHNfeHJlc291cmNlLmMgYi90c3gxMS90c194cmVzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE3M2QwCi0tLSAvZGV2L251bGwKKysrIGIvdHN4MTEvdHNfeHJlc291cmNlLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIFRocmVhZCBzYWZlIHdyYXBwZXJzIGFyb3VuZCBYcmVzb3VyY2UgY2FsbHMuCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRvb2xzL21ha2VfWDExd3JhcHBlcnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBLcmlzdGlhbiBOaWVsc2VuCisgKi8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgorI2luY2x1ZGUgInRzeDExZGVmcy5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworWHJtUXVhcmsgIFRTWHJtVW5pcXVlUXVhcmsodm9pZCkKK3sKKyAgWHJtUXVhcmsgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWHJtVW5pcXVlUXVhcmtcbiIpOworICBYMTFfTE9DSygpOworICByID0gWHJtVW5pcXVlUXVhcmsoKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWHJtVW5pcXVlUXVhcmtcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICAgVFNYcm1HZXRSZXNvdXJjZShYcm1EYXRhYmFzZSBhMCwgY29uc3QgIGNoYXIqIGExLCBjb25zdCAgY2hhciogYTIsIGNoYXIqKiBhMywgWHJtVmFsdWUqIGE0KQoreworICBpbnQgICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhybUdldFJlc291cmNlXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhybUdldFJlc291cmNlKGEwLCBhMSwgYTIsIGEzLCBhNCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhybUdldFJlc291cmNlXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK1hybURhdGFiYXNlICBUU1hybUdldEZpbGVEYXRhYmFzZShjb25zdCAgY2hhciogYTApCit7CisgIFhybURhdGFiYXNlICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhybUdldEZpbGVEYXRhYmFzZVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYcm1HZXRGaWxlRGF0YWJhc2UoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYcm1HZXRGaWxlRGF0YWJhc2VcbiIpOworICByZXR1cm4gcjsKK30KKworWHJtRGF0YWJhc2UgIFRTWHJtR2V0U3RyaW5nRGF0YWJhc2UoY29uc3QgIGNoYXIqIGEwKQoreworICBYcm1EYXRhYmFzZSAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYcm1HZXRTdHJpbmdEYXRhYmFzZVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYcm1HZXRTdHJpbmdEYXRhYmFzZShhMCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhybUdldFN0cmluZ0RhdGFiYXNlXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK3ZvaWQgIFRTWHJtTWVyZ2VEYXRhYmFzZXMoWHJtRGF0YWJhc2UgYTAsIFhybURhdGFiYXNlKiBhMSkKK3sKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYcm1NZXJnZURhdGFiYXNlc1xuIik7CisgIFgxMV9MT0NLKCk7CisgIFhybU1lcmdlRGF0YWJhc2VzKGEwLCBhMSk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhybU1lcmdlRGF0YWJhc2VzXG4iKTsKK30KKwordm9pZCAgVFNYcm1QYXJzZUNvbW1hbmQoWHJtRGF0YWJhc2UqIGEwLCBYcm1PcHRpb25EZXNjTGlzdCBhMSwgaW50IGEyLCBjb25zdCAgY2hhciogYTMsIGludCogYTQsIGNoYXIqKiBhNSkKK3sKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYcm1QYXJzZUNvbW1hbmRcbiIpOworICBYMTFfTE9DSygpOworICBYcm1QYXJzZUNvbW1hbmQoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhybVBhcnNlQ29tbWFuZFxuIik7Cit9CmRpZmYgLS1naXQgYS90c3gxMS90c194c2htLmMgYi90c3gxMS90c194c2htLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3MWNiNQotLS0gL2Rldi9udWxsCisrKyBiL3RzeDExL3RzX3hzaG0uYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogVGhyZWFkIHNhZmUgd3JhcHBlcnMgYXJvdW5kIFhTaG0gY2FsbHMuCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRvb2xzL21ha2VfWDExd3JhcHBlcnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBLcmlzdGlhbiBOaWVsc2VuCisgKi8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWFNobS5oPgorI2luY2x1ZGUgInRzeDExZGVmcy5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworQm9vbCBUU1hTaG1RdWVyeUV4dGVuc2lvbihEaXNwbGF5ICphMCkKK3sKKyAgQm9vbCByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTaG1RdWVyeUV4dGVuc2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU2htUXVlcnlFeHRlbnNpb24oYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2htUXVlcnlFeHRlbnNpb25cbiIpOworICByZXR1cm4gcjsKK30KKworaW50IFRTWFNobVBpeG1hcEZvcm1hdChEaXNwbGF5ICphMCkKK3sKKyAgaW50IHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNobVBpeG1hcEZvcm1hdFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU2htUGl4bWFwRm9ybWF0KGEwKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNobVBpeG1hcEZvcm1hdFxuIik7CisgIHJldHVybiByOworfQorCitTdGF0dXMgVFNYU2htRGV0YWNoKERpc3BsYXkgKmEwLCBYU2htU2VnbWVudEluZm8gKmExKQoreworICBTdGF0dXMgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2htRGV0YWNoXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTaG1EZXRhY2goYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNobURldGFjaFxuIik7CisgIHJldHVybiByOworfQorCitTdGF0dXMgVFNYU2htQXR0YWNoKERpc3BsYXkgKmEwLCBYU2htU2VnbWVudEluZm8gKmExKQoreworICBTdGF0dXMgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2htQXR0YWNoXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTaG1BdHRhY2goYTAsIGExKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNobUF0dGFjaFxuIik7CisgIHJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvdHN4MTEvdHNfeHV0aWwuYyBiL3RzeDExL3RzX3h1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlYTBkMwotLS0gL2Rldi9udWxsCisrKyBiL3RzeDExL3RzX3h1dGlsLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBUaHJlYWQgc2FmZSB3cmFwcGVycyBhcm91bmQgWHV0aWwgY2FsbHMuCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRvb2xzL21ha2VfWDExd3JhcHBlcnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBLcmlzdGlhbiBOaWVsc2VuCisgKi8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgInRzeDExZGVmcy5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworWENsYXNzSGludCAqIFRTWEFsbG9jQ2xhc3NIaW50KHZvaWQpCit7CisgIFhDbGFzc0hpbnQgKiByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhBbGxvY0NsYXNzSGludFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQWxsb2NDbGFzc0hpbnQoKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEFsbG9jQ2xhc3NIaW50XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK1hTaXplSGludHMgKiBUU1hBbGxvY1NpemVIaW50cyh2b2lkKQoreworICBYU2l6ZUhpbnRzICogcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQWxsb2NTaXplSGludHNcbiIpOworICBYMTFfTE9DSygpOworICByID0gWEFsbG9jU2l6ZUhpbnRzKCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhBbGxvY1NpemVIaW50c1xuIik7CisgIHJldHVybiByOworfQorCitYV01IaW50cyAqIFRTWEFsbG9jV01IaW50cyh2b2lkKQoreworICBYV01IaW50cyAqIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEFsbG9jV01IaW50c1xuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQWxsb2NXTUhpbnRzKCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhBbGxvY1dNSGludHNcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hDbGlwQm94KFJlZ2lvbiBhMCwgWFJlY3RhbmdsZSogYTEpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQ2xpcEJveFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQ2xpcEJveChhMCwgYTEpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ2xpcEJveFxuIik7CisgIHJldHVybiByOworfQorCitSZWdpb24gIFRTWENyZWF0ZVJlZ2lvbih2b2lkKQoreworICBSZWdpb24gIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENyZWF0ZVJlZ2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYQ3JlYXRlUmVnaW9uKCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDcmVhdGVSZWdpb25cbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hEZWxldGVDb250ZXh0KERpc3BsYXkqIGEwLCBYSUQgYTEsIFhDb250ZXh0IGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWERlbGV0ZUNvbnRleHRcbiIpOworICBYMTFfTE9DSygpOworICByID0gWERlbGV0ZUNvbnRleHQoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEZWxldGVDb250ZXh0XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYRGVzdHJveVJlZ2lvbihSZWdpb24gYTApCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRGVzdHJveVJlZ2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYRGVzdHJveVJlZ2lvbihhMCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEZXN0cm95UmVnaW9uXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYRW1wdHlSZWdpb24oUmVnaW9uIGEwKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEVtcHR5UmVnaW9uXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhFbXB0eVJlZ2lvbihhMCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhFbXB0eVJlZ2lvblxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWEVxdWFsUmVnaW9uKFJlZ2lvbiBhMCwgUmVnaW9uIGExKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEVxdWFsUmVnaW9uXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhFcXVhbFJlZ2lvbihhMCwgYTEpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRXF1YWxSZWdpb25cbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hGaW5kQ29udGV4dChEaXNwbGF5KiBhMCwgWElEIGExLCBYQ29udGV4dCBhMiwgWFBvaW50ZXIqIGEzKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZpbmRDb250ZXh0XG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhGaW5kQ29udGV4dChhMCwgYTEsIGEyLCBhMyk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhGaW5kQ29udGV4dFxuIik7CisgIHJldHVybiByOworfQorCitpbnQgICBUU1hHZXRXTVNpemVIaW50cyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBYU2l6ZUhpbnRzKiBhMiwgbG9uZyogYTMsIEF0b20gYTQpCit7CisgIGludCAgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdldFdNU2l6ZUhpbnRzXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhHZXRXTVNpemVIaW50cyhhMCwgYTEsIGEyLCBhMywgYTQpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR2V0V01TaXplSGludHNcbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hJbnRlcnNlY3RSZWdpb24oUmVnaW9uIGEwLCBSZWdpb24gYTEsIFJlZ2lvbiBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhJbnRlcnNlY3RSZWdpb25cbiIpOworICBYMTFfTE9DSygpOworICByID0gWEludGVyc2VjdFJlZ2lvbihhMCwgYTEsIGEyKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEludGVyc2VjdFJlZ2lvblxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWExvb2t1cFN0cmluZyhYS2V5RXZlbnQqIGEwLCBjaGFyKiBhMSwgaW50IGEyLCBLZXlTeW0qIGEzLCBYQ29tcG9zZVN0YXR1cyogYTQpCit7CisgIGludCAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYTG9va3VwU3RyaW5nXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhMb29rdXBTdHJpbmcoYTAsIGExLCBhMiwgYTMsIGE0KTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWExvb2t1cFN0cmluZ1xuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWE9mZnNldFJlZ2lvbihSZWdpb24gYTAsIGludCBhMSwgaW50IGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWE9mZnNldFJlZ2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYT2Zmc2V0UmVnaW9uKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYT2Zmc2V0UmVnaW9uXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgIFRTWFBvaW50SW5SZWdpb24oUmVnaW9uIGEwLCBpbnQgYTEsIGludCBhMikKK3sKKyAgaW50ICAgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUG9pbnRJblJlZ2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYUG9pbnRJblJlZ2lvbihhMCwgYTEsIGEyKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFBvaW50SW5SZWdpb25cbiIpOworICByZXR1cm4gcjsKK30KKworUmVnaW9uICBUU1hQb2x5Z29uUmVnaW9uKFhQb2ludCogYTAsIGludCBhMSwgaW50IGEyKQoreworICBSZWdpb24gIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFBvbHlnb25SZWdpb25cbiIpOworICBYMTFfTE9DSygpOworICByID0gWFBvbHlnb25SZWdpb24oYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhQb2x5Z29uUmVnaW9uXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYUmVjdEluUmVnaW9uKFJlZ2lvbiBhMCwgaW50IGExLCBpbnQgYTIsIHVuc2lnbmVkIGludCBhMywgdW5zaWduZWQgaW50IGE0KQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFJlY3RJblJlZ2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYUmVjdEluUmVnaW9uKGEwLCBhMSwgYTIsIGEzLCBhNCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhSZWN0SW5SZWdpb25cbiIpOworICByZXR1cm4gcjsKK30KKworaW50ICBUU1hTYXZlQ29udGV4dChEaXNwbGF5KiBhMCwgWElEIGExLCBYQ29udGV4dCBhMiwgY29uc3QgIGNoYXIqIGEzKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNhdmVDb250ZXh0XG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTYXZlQ29udGV4dChhMCwgYTEsIGEyLCBhMyk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTYXZlQ29udGV4dFxuIik7CisgIHJldHVybiByOworfQorCit2b2lkICBUU1hTZXRXTVByb3BlcnRpZXMoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgWFRleHRQcm9wZXJ0eSogYTIsIFhUZXh0UHJvcGVydHkqIGEzLCBjaGFyKiogYTQsIGludCBhNSwgWFNpemVIaW50cyogYTYsIFhXTUhpbnRzKiBhNywgWENsYXNzSGludCogYTgpCit7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldFdNUHJvcGVydGllc1xuIik7CisgIFgxMV9MT0NLKCk7CisgIFhTZXRXTVByb3BlcnRpZXMoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRXTVByb3BlcnRpZXNcbiIpOworfQorCit2b2lkICBUU1hTZXRXTVNpemVIaW50cyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBYU2l6ZUhpbnRzKiBhMiwgQXRvbSBhMykKK3sKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2V0V01TaXplSGludHNcbiIpOworICBYMTFfTE9DSygpOworICBYU2V0V01TaXplSGludHMoYTAsIGExLCBhMiwgYTMpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0V01TaXplSGludHNcbiIpOworfQorCitpbnQgIFRTWFNldFJlZ2lvbihEaXNwbGF5KiBhMCwgR0MgYTEsIFJlZ2lvbiBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRSZWdpb25cbiIpOworICBYMTFfTE9DSygpOworICByID0gWFNldFJlZ2lvbihhMCwgYTEsIGEyKTsKKyAgWDExX1VOTE9DSygpOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNldFJlZ2lvblxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFNocmlua1JlZ2lvbihSZWdpb24gYTAsIGludCBhMSwgaW50IGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNocmlua1JlZ2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU2hyaW5rUmVnaW9uKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2hyaW5rUmVnaW9uXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgIFRTWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eShjaGFyKiogYTAsIGludCBhMSwgWFRleHRQcm9wZXJ0eSogYTIpCit7CisgIGludCAgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eVxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5XG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYU3VidHJhY3RSZWdpb24oUmVnaW9uIGEwLCBSZWdpb24gYTEsIFJlZ2lvbiBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTdWJ0cmFjdFJlZ2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYU3VidHJhY3RSZWdpb24oYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTdWJ0cmFjdFJlZ2lvblxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFVuaW9uUmVjdFdpdGhSZWdpb24oWFJlY3RhbmdsZSogYTAsIFJlZ2lvbiBhMSwgUmVnaW9uIGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFVuaW9uUmVjdFdpdGhSZWdpb25cbiIpOworICBYMTFfTE9DSygpOworICByID0gWFVuaW9uUmVjdFdpdGhSZWdpb24oYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhVbmlvblJlY3RXaXRoUmVnaW9uXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCAgVFNYVW5pb25SZWdpb24oUmVnaW9uIGEwLCBSZWdpb24gYTEsIFJlZ2lvbiBhMikKK3sKKyAgaW50ICByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhVbmlvblJlZ2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYVW5pb25SZWdpb24oYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhVbmlvblJlZ2lvblxuIik7CisgIHJldHVybiByOworfQorCitpbnQgIFRTWFhvclJlZ2lvbihSZWdpb24gYTAsIFJlZ2lvbiBhMSwgUmVnaW9uIGEyKQoreworICBpbnQgIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFhvclJlZ2lvblxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYWG9yUmVnaW9uKGEwLCBhMSwgYTIpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYWG9yUmVnaW9uXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK2ludCBUU1hEZXN0cm95SW1hZ2Uoc3RydWN0IF9YSW1hZ2UgKmEwKQoreworICBpbnQgcjsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRGVzdHJveUltYWdlXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhEZXN0cm95SW1hZ2UoYTApOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRGVzdHJveUltYWdlXG4iKTsKKyAgcmV0dXJuIHI7Cit9CisKK3Vuc2lnbmVkIGxvbmcgVFNYR2V0UGl4ZWwoc3RydWN0IF9YSW1hZ2UgKmEwLCBpbnQgYTEsIGludCBhMikKK3sKKyAgdW5zaWduZWQgbG9uZyByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRQaXhlbFxuIik7CisgIFgxMV9MT0NLKCk7CisgIHIgPSBYR2V0UGl4ZWwoYTAsIGExLCBhMik7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhHZXRQaXhlbFxuIik7CisgIHJldHVybiByOworfQorCitpbnQgVFNYUHV0UGl4ZWwoc3RydWN0IF9YSW1hZ2UgKmEwLCBpbnQgYTEsIGludCBhMiwgdW5zaWduZWQgbG9uZyBhMykKK3sKKyAgaW50IHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFB1dFBpeGVsXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhQdXRQaXhlbChhMCwgYTEsIGEyLCBhMyk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhQdXRQaXhlbFxuIik7CisgIHJldHVybiByOworfQorCitzdHJ1Y3QgX1hJbWFnZSAqIFRTWFN1YkltYWdlKHN0cnVjdCBfWEltYWdlICphMCwgaW50IGExLCBpbnQgYTIsIHVuc2lnbmVkIGludCBhMywgdW5zaWduZWQgaW50IGE0KQoreworICBzdHJ1Y3QgX1hJbWFnZSAqIHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFN1YkltYWdlXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhTdWJJbWFnZShhMCwgYTEsIGEyLCBhMywgYTQpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU3ViSW1hZ2VcbiIpOworICByZXR1cm4gcjsKK30KKworaW50IFRTWEFkZFBpeGVsKHN0cnVjdCBfWEltYWdlICphMCwgbG9uZyBhMSkKK3sKKyAgaW50IHI7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEFkZFBpeGVsXG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhBZGRQaXhlbChhMCwgYTEpOworICBYMTFfVU5MT0NLKCk7CisgIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQWRkUGl4ZWxcbiIpOworICByZXR1cm4gcjsKK30KKworWENvbnRleHQgVFNYVW5pcXVlQ29udGV4dCh2b2lkKQoreworICBYQ29udGV4dCByOworICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhVbmlxdWVDb250ZXh0XG4iKTsKKyAgWDExX0xPQ0soKTsKKyAgciA9IFhVbmlxdWVDb250ZXh0KCk7CisgIFgxMV9VTkxPQ0soKTsKKyAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhVbmlxdWVDb250ZXh0XG4iKTsKKyAgcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS90c3gxMS90c3gxMWRlZnMuYyBiL3RzeDExL3RzeDExZGVmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTM4NTIKLS0tIC9kZXYvbnVsbAorKysgYi90c3gxMS90c3gxMWRlZnMuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogVGhyZWFkIHNhZmUgd3JhcHBlcnMgYXJvdW5kIFhTaG0gY2FsbHMuCisgKgorICogQ29weXJpZ2h0IDE5OTggS3Jpc3RpYW4gTmllbHNlbgorICovCisKKyNpbmNsdWRlICJ0c3gxMWRlZnMuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK0NSSVRJQ0FMX1NFQ1RJT04gKlRTWDExX1NlY3Rpb25QdHIgPSBOVUxMOworc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gVFNYMTFfU2VjdGlvbjsKKworaW50IFRTWDExX0luaXQodm9pZCkKK3sKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmVFNYMTFfU2VjdGlvbiApOworICAgIGRwcmludGZfeDExKHN0ZGRlYiwgIlRTWDExX0luaXQ6IFgxMSBjcml0aWNhbCBzZWN0aW9uIGlzICVwXG4iLAorICAgICAgICAgICAgICAgICZUU1gxMV9TZWN0aW9uKTsKKyAgICBUU1gxMV9TZWN0aW9uUHRyID0gJlRTWDExX1NlY3Rpb247CisgICAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9jb25zb2xlLmMgYi93aW4zMi9jb25zb2xlLmMKaW5kZXggZmE4MTY2Zi4uOGIyN2QzYyAxMDA2NDQKLS0tIGEvd2luMzIvY29uc29sZS5jCisrKyBiL3dpbjMyL2NvbnNvbGUuYwpAQCAtMzIsNiArMzIsMTkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlQ29uc29sZVNjcmVlbkJ1ZmZlciAgIChLRVJORUwzMi4xNTEpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBDcmVhdGVDb25zb2xlU2NyZWVuQnVmZmVyKCBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTaGFyZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjdXJpdHlBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwU2NyZWVuQnVmZmVyRGF0YSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIkNyZWF0ZUNvbnNvbGVTY3JlZW5CdWZmZXIoKTogc3R1YiAhXG4iKTsKKwlyZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8gICAoS0VSTkVMMzIuMTkwKQogICovCiBCT09MMzIgV0lOQVBJIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKCBIQU5ETEUzMiBoQ29uc29sZU91dHB1dCwKQEAgLTUyLDYgKzY1LDE1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldENvbnNvbGVBY3RpdmVTY3JlZW5CdWZmZXIgICAoS0VSTkVMMzIuNjIzKQorICovCitCT09MMzIgV0lOQVBJIFNldENvbnNvbGVBY3RpdmVTY3JlZW5CdWZmZXIoSEFORExFMzIgaENvbnNvbGVPdXRwdXQpCit7CisJZnByaW50ZihzdGRlcnIsICJTZXRDb25zb2xlQWN0aXZlU2NyZWVuQnVmZmVyKCk6IHN0dWIgIVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICBHZXRMYXJnZXN0Q29uc29sZVdpbmRvd1NpemUgICAoS0VSTkVMMzIuMjI2KQogICovCiBEV09SRCBXSU5BUEkgR2V0TGFyZ2VzdENvbnNvbGVXaW5kb3dTaXplKCBIQU5ETEUzMiBoQ29uc29sZU91dHB1dCApCkBAIC0xMTQsNyArMTM2LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgIFdyaXRlQ29uc29sZUEgICAoS0VSTkVMMzIuNTY3KQorICogICAgICAgICAgICBXcml0ZUNvbnNvbGVBICAgKEtFUk5FTDMyLjcyOSkKICAqLwogQk9PTDMyIFdJTkFQSSBXcml0ZUNvbnNvbGUzMkEoIEhBTkRMRTMyIGhDb25zb2xlT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1ZPSUQgbHBCdWZmZXIsCkBAIC0xMjksNiArMTUxLDE4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBXcml0ZUNvbnNvbGVPdXRwdXRBICAgKEtFUk5FTDMyLjczMikKKyAqLworQk9PTDMyIFdJTkFQSSBXcml0ZUNvbnNvbGVPdXRwdXQzMkEoIEhBTkRMRTMyIGhDb25zb2xlT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ0hBUl9JTkZPIGxwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPT1JEIGR3QnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT09SRCBkd0J1ZmZlckNvb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU01BTExfUkVDVCBscFdyaXRlUmVnaW9uKQoreworCXJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgIFdyaXRlQ29uc29sZVcgICAoS0VSTkVMMzIuNTc3KQogICovCiBCT09MMzIgV0lOQVBJIFdyaXRlQ29uc29sZTMyVyggSEFORExFMzIgaENvbnNvbGVPdXRwdXQsCkBAIC0yNDAsMTYgKzI3NCwxNCBAQAogICogICAgICAgICAgICBQZWVrQ29uc29sZUlucHV0QSAgIChLRVJORUwzMi41NTApCiAgKi8KIEJPT0wzMiBXSU5BUEkgUGVla0NvbnNvbGVJbnB1dDMyQShIQU5ETEUzMiBoQ29uc29sZUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgcGlyQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQSU5QVVRfUkVDT1JEIHBpckJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBjSW5SZWNvcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBjUmVhZCkKLS8qIEZJWE1FOiBwaXJCdWZmZXIgc2hvdWxkIGJlIGEgcG9pbnRlciB0byBhbiBJTlBVVF9SRUNPUkQgc3RydWN0dXJlCi0gICAtS2FybCBHYXJyaXNvbiAoMTIvMDEvOTcpICovCiB7CiAgICAgcGlyQnVmZmVyID0gTlVMTDsKICAgICBjSW5SZWNvcmRzID0gMDsKICAgICAqbHBjUmVhZCA9IDA7Ci0gICAgZnByaW50ZihzdGRlcnIsIkdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9uczogU1RVQiByZXR1cm5pbmcgTlVMTFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIlBlZWtDb25zb2xlSW5wdXQzMkE6IFNUVUIgcmV0dXJuaW5nIFRSVUVcbiIpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC0yNTcsMTYgKzI4OSwxNCBAQAogICogICAgICAgICAgICBQZWVrQ29uc29sZUlucHV0VyAgIChLRVJORUwzMi41NTEpCiAgKi8KIEJPT0wzMiBXSU5BUEkgUGVla0NvbnNvbGVJbnB1dDMyVyhIQU5ETEUzMiBoQ29uc29sZUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgcGlyQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQSU5QVVRfUkVDT1JEIHBpckJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBjSW5SZWNvcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBjUmVhZCkKLS8qIEZJWE1FOiBwaXJCdWZmZXIgc2hvdWxkIGJlIGEgcG9pbnRlciB0byBhbiBJTlBVVF9SRUNPUkQgc3RydWN0dXJlCi0gICAtS2FybCBHYXJyaXNvbiAoMTIvMDEvOTcpICovCiB7CiAgICAgcGlyQnVmZmVyID0gTlVMTDsKICAgICBjSW5SZWNvcmRzID0gMDsKICAgICAqbHBjUmVhZCA9IDA7Ci0gICAgZnByaW50ZihzdGRlcnIsIkdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9uczogU1RVQiByZXR1cm5pbmcgTlVMTFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIlBlZWtDb25zb2xlSW5wdXQzMlc6IFNUVUIgcmV0dXJuaW5nIFRSVUVcbiIpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0yNzYsNyArMzA2LDcgQEAKIEJPT0wzMiBXSU5BUEkgR2V0Q29uc29sZUN1cnNvckluZm8zMihIQU5ETEUzMiBoY29uLCBMUERXT1JEIGNpbmZvKQogewogICBjaW5mb1swXSA9IDEwOyAvKiAxMCUgb2YgY2hhcmFjdGVyIGJveCBpcyBjdXJzb3IuICAqLwotICBjaW5mb1sxXSA9IFRSVUU7ICAvKiBDdXJzdXIgaXMgdmlzaWJsZS4gICovCisgIGNpbmZvWzFdID0gVFJVRTsgIC8qIEN1cnNvciBpcyB2aXNpYmxlLiAgKi8KICAgZnByaW50ZiAoc3RkbmltcCwgIkdldENvbnNvbGVDdXJzb3JJbmZvMzIgLS0gU1RVQiFcbiIpOwogICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL3dpbjMyL2tlcm5lbDMyLmMgYi93aW4zMi9rZXJuZWwzMi5jCmluZGV4IGVhNzhjODIuLmEyMmM3NzUgMTAwNjQ0Ci0tLSBhL3dpbjMyL2tlcm5lbDMyLmMKKysrIGIvd2luMzIva2VybmVsMzIuYwpAQCAtMTYzLDE3ICsxNjMsMTggQEAKIHsKICAgICBDT05URVhUIGNvbnRleHQxNjsKICAgICBEV09SRCBhcmdzaXplOworICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOwogCiAgICAgbWVtY3B5KCZjb250ZXh0MTYsY29udGV4dCxzaXplb2YoY29udGV4dDE2KSk7CiAKICAgICBDU19yZWcoJmNvbnRleHQxNikgID0gSElXT1JEKEVEWF9yZWcoY29udGV4dCkpOwogICAgIElQX3JlZygmY29udGV4dDE2KSAgPSBMT1dPUkQoRURYX3JlZyhjb250ZXh0KSk7Ci0gICAgRUJQX3JlZygmY29udGV4dDE2KSA9IE9GRlNFVE9GKElGMTYzMl9TYXZlZDE2X3NzX3NwKQorICAgIEVCUF9yZWcoJmNvbnRleHQxNikgPSBPRkZTRVRPRiggdGhkYi0+Y3VyX3N0YWNrICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFdPUkQpJigoU1RBQ0sxNkZSQU1FKikwKS0+YnA7CiAKICAgICBhcmdzaXplID0gRUJQX3JlZyhjb250ZXh0KS1FU1BfcmVnKGNvbnRleHQpLTB4NDQ7CiAKLSAgICBtZW1jcHkoICgoTFBCWVRFKUNVUlJFTlRfU1RBQ0sxNiktYXJnc2l6ZSwKKyAgICBtZW1jcHkoICgoTFBCWVRFKVRIUkVBRF9TVEFDSzE2KHRoZGIpKS1hcmdzaXplLAogICAgICAgICAgICAgKExQQllURSlFU1BfcmVnKGNvbnRleHQpKzQsIGFyZ3NpemUgKTsKIAogICAgIEVBWF9yZWcoY29udGV4dCkgPSBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYyggJmNvbnRleHQxNiwgYXJnc2l6ZSApOwpAQCAtMTgxLDcgKzE4Miw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXT1dDYWxsYmFjazE2IChLRVJORUwzMi42MikKKyAqICAgICAgICAgICBXT1dDYWxsYmFjazE2IChLRVJORUwzMi42MikoV09XMzIuMikKICAqLwogRFdPUkQgV0lOQVBJIFdPV0NhbGxiYWNrMTYoRkFSUFJPQzE2IGZwcm9jLERXT1JEIGFyZykKIHsKQEAgLTE5Miw2ICsxOTMsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdPV0NhbGxiYWNrMTZFeCAoS0VSTkVMMzIuNTUpKFdPVzMyLjMpCisgKi8KK0JPT0wzMiBXSU5BUEkgV09XQ2FsbGJhY2sxNkV4KAorCUZBUlBST0MxNiB2cGZuMTYsRFdPUkQgZHdGbGFncyxEV09SRCBjYkFyZ3MsTFBWT0lEIHBBcmdzLAorCUxQRFdPUkQgcGR3UmV0Q29kZQorKSB7CisJcmV0dXJuIENhbGxiYWNrcy0+Q2FsbFdPV0NhbGxiYWNrMTZFeCh2cGZuMTYsZHdGbGFncyxjYkFyZ3MscEFyZ3MscGR3UmV0Q29kZSk7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIF9LRVJORUwzMl81MiAgICAoS0VSTkVMMzIuNTIpCiAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBUaGtCdWYgaW4gdGhlIDE2Yml0IGxpYnJhcnkgU1lTVEhVTksuRExMLgpAQCAtMjYzLDcgKzI3NCw4IEBACiB7CiAJQ09OVEVYVAljb250ZXh0MTY7CiAJTFBCWVRFCWN1cnN0YWNrOwotCURXT1JECXJldCxzdGFja3NpemU7CisgICAgICAgIERXT1JEIHJldCxzdGFja3NpemU7CisJVEhEQiAqdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CiAKIAlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiS0VSTkVMMzJfNDUoJSVlYXg9MHglMDhseCglJWN4PTB4JTA0bHgsJSVlZHg9MHglMDhseCkpXG4iLAogCQkoRFdPUkQpRUFYX3JlZyhjb250ZXh0KSwoRFdPUkQpQ1hfcmVnKGNvbnRleHQpLChEV09SRClFRFhfcmVnKGNvbnRleHQpCkBAIC0yNzcsMTAgKzI4OSwxMCBAQAogCUNTX3JlZygmY29udGV4dDE2KQkgPSBISVdPUkQoRUFYX3JlZyhjb250ZXh0KSk7CiAJSVBfcmVnKCZjb250ZXh0MTYpCSA9IExPV09SRChFQVhfcmVnKGNvbnRleHQpKTsKIAotCWN1cnN0YWNrID0gUFRSX1NFR19UT19MSU4oU1RBQ0sxNl9QVVNIKHN0YWNrc2l6ZSkpOwotCW1lbWNweShjdXJzdGFjay1zdGFja3NpemUsKExQQllURSlFU1BfcmVnKGNvbnRleHQpLHN0YWNrc2l6ZSk7CisJY3Vyc3RhY2sgPSBQVFJfU0VHX1RPX0xJTihTVEFDSzE2X1BVU0goIHRoZGIsIHN0YWNrc2l6ZSApKTsKKwltZW1jcHkoY3Vyc3RhY2sgLSBzdGFja3NpemUsKExQQllURSlFU1BfcmVnKGNvbnRleHQpLHN0YWNrc2l6ZSk7CiAJcmV0ID0gQ2FsbGJhY2tzLT5DYWxsUmVnaXN0ZXJMb25nUHJvYygmY29udGV4dDE2LDApOwotCVNUQUNLMTZfUE9QKHN0YWNrc2l6ZSk7CisJU1RBQ0sxNl9QT1AoIHRoZGIsIHN0YWNrc2l6ZSApOwogCiAJZHByaW50Zl90aHVuayhzdGRkZWIsIi4gcmV0dXJuZWQgJTA4bHhcbiIscmV0KTsKIAlFQVhfcmVnKGNvbnRleHQpIAkgPSByZXQ7CkBAIC0yOTgsNiArMzEwLDcgQEAKIAlDT05URVhUCWNvbnRleHQxNjsKIAlMUEJZVEUJY3Vyc3RhY2s7CiAJRFdPUkQJcmV0LHN0YWNrc2l6ZTsKKwlUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKIAogCWRwcmludGZfdGh1bmsoc3RkZGViLCJfS0VSTkVMMzJfNDAoRURYPTB4JTA4bHgpXG4iLAogCQlFRFhfcmVnKGNvbnRleHQpCkBAIC0zMTEsMTAgKzMyNCwxMCBAQAogCUNTX3JlZygmY29udGV4dDE2KQkgPSBISVdPUkQoRURYX3JlZyhjb250ZXh0KSk7CiAJSVBfcmVnKCZjb250ZXh0MTYpCSA9IExPV09SRChFRFhfcmVnKGNvbnRleHQpKTsKIAotCWN1cnN0YWNrID0gUFRSX1NFR19UT19MSU4oU1RBQ0sxNl9QVVNIKHN0YWNrc2l6ZSkpOworCWN1cnN0YWNrID0gUFRSX1NFR19UT19MSU4oU1RBQ0sxNl9QVVNIKCB0aGRiLCBzdGFja3NpemUgKSk7CiAJbWVtY3B5KGN1cnN0YWNrLXN0YWNrc2l6ZSwoTFBCWVRFKUVTUF9yZWcoY29udGV4dCksc3RhY2tzaXplKTsKIAlyZXQgPSBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYygmY29udGV4dDE2LDApOwotCVNUQUNLMTZfUE9QKHN0YWNrc2l6ZSk7CisJU1RBQ0sxNl9QT1AoIHRoZGIsIHN0YWNrc2l6ZSApOwogCiAJZHByaW50Zl90aHVuayhzdGRkZWIsIi4gcmV0dXJuZWQgJTA4bHhcbiIscmV0KTsKIAlFQVhfcmVnKGNvbnRleHQpIAkgPSByZXQ7CkBAIC01OTMsNyArNjA2LDcgQEAKIAkJcmV0dXJuIHg7CiAKIAlzZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBQVFJfU0VHX1RPX0xJTih4KSAsIDB4ZmZmZiwgU0VHTUVOVF9DT0RFLCBGQUxTRSwgRkFMU0UgKTsKLQlyZXR1cm4gKHNlbDw8MTYpfCgweDAwMDApOworCXJldHVybiBQVFJfU0VHX09GRl9UT19TRUdQVFIoIHNlbCwgMCApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjAzLDE0ICs2MTYsMTAgQEAKICAqLwogVk9JRCBXSU5BUEkKIF9LRVJORUxfMzU5KERXT1JEIHgpIHsKLQlEV09SRAlzYXZlZHNzc3A7Ci0KIAlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FTF8zNTkoMHglMDhseCksc3R1YlxuIix4KTsKIAlpZiAoKEhJV09SRCh4KSAmIDcpIT03KQogCQlyZXR1cm47Ci0Jc2F2ZWRzc3NwID0gSUYxNjMyX1NhdmVkMTZfc3Nfc3A7SUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSAwOwogCVNFTEVDVE9SX0ZyZWVCbG9jayh4Pj4xNiwxKTsKLQlJRjE2MzJfU2F2ZWQxNl9zc19zcCA9IHNhdmVkc3NzcDsKIAlyZXR1cm47CiB9CiAKQEAgLTY2MSwzICs2NzAsOCBAQAogCV9sY2xvc2UzMihoZik7CiAJcmV0dXJuICh4bWFnaWMgPT0gSU1BR0VfTlRfU0lHTkFUVVJFKTsKIH0KKworSEFORExFMzIgV0lOQVBJIFdPV0hhbmRsZTMyKFdPUkQgaGFuZGxlLFdPV19IQU5ETEVfVFlQRSB0eXBlKSB7CisJZnByaW50ZihzdGRlcnIsIldPV0hhbmRsZTMyKDB4JTA0eCwlZClcbiIsaGFuZGxlLHR5cGUpOworCXJldHVybiAoSEFORExFMzIpaGFuZGxlOworfQpkaWZmIC0tZ2l0IGEvd2luMzIvdGhyZWFkLmMgYi93aW4zMi90aHJlYWQuYwppbmRleCBiY2Q0ZDRhLi43YWQ2NTg1IDEwMDY0NAotLS0gYS93aW4zMi90aHJlYWQuYworKysgYi93aW4zMi90aHJlYWQuYwpAQCAtOCw4ICs4LDYgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9pcGMuaD4KLSNpbmNsdWRlIDxzeXMvc2VtLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgpAQCAtMTI5LDEyICsxMjcsMyBAQAogCXJldHVybiByZXQ7CiAjZW5kaWYJCiB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgIFJlaW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbgkJCVtLRVJORUwzMl0JKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFdJTkFQSSBSZWluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oQ1JJVElDQUxfU0VDVElPTiAqbHBDcml0KQotewotICAgLyogaG1tID8/Pz8/PyAqLwkKLX0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvTWFrZWZpbGUuaW4gYi93aW5kb3dzL01ha2VmaWxlLmluCmluZGV4IGMxOGE0NzAuLjZmZWI3YTMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvTWFrZWZpbGUuaW4KKysrIGIvd2luZG93cy9NYWtlZmlsZS5pbgpAQCAtMTMsNiArMTMsNyBAQAogCWRlZmRsZy5jIFwKIAlkZWZ3bmQuYyBcCiAJZGlhbG9nLmMgXAorCWRpbnB1dC5jIFwKIAlkcml2ZXIuYyBcCiAJZXZlbnQuYyBcCiAJZm9jdXMuYyBcCmRpZmYgLS1naXQgYS93aW5kb3dzL2NsaXBib2FyZC5jIGIvd2luZG93cy9jbGlwYm9hcmQuYwppbmRleCBhNmEwNzJlLi5jZTk5MjA0IDEwMDY0NAotLS0gYS93aW5kb3dzL2NsaXBib2FyZC5jCisrKyBiL3dpbmRvd3MvY2xpcGJvYXJkLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSAidHNfeGxpYi5oIgogI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW4uaCIKQEAgLTExMiw4ICsxMTIsOCBAQAogCiAJaWYoIHNlbGVjdGlvbldpbmRvdyAhPSBOb25lICkKIAl7Ci0JICAgIFhTZXRTZWxlY3Rpb25Pd25lcihkaXNwbGF5LCBYQV9QUklNQVJZLCBzZWxlY3Rpb25XaW5kb3csIEN1cnJlbnRUaW1lKTsKLQkgICAgaWYoIFhHZXRTZWxlY3Rpb25Pd25lcihkaXNwbGF5LCBYQV9QUklNQVJZKSAhPSBzZWxlY3Rpb25XaW5kb3cgKQorCSAgICBUU1hTZXRTZWxlY3Rpb25Pd25lcihkaXNwbGF5LCBYQV9QUklNQVJZLCBzZWxlY3Rpb25XaW5kb3csIEN1cnJlbnRUaW1lKTsKKwkgICAgaWYoIFRTWEdldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksIFhBX1BSSU1BUlkpICE9IHNlbGVjdGlvbldpbmRvdyApCiAJCXNlbGVjdGlvbldpbmRvdyA9IE5vbmU7CiAJfQogICAgIH0KQEAgLTIwNiwxMyArMjA2LDEzIEBACiAgICAqIENMSVBCT0FSRF9SZWFkU2VsZWN0aW9uKCkgd2lsbCBiZSBpbnZva2VkIAogICAgKiBmcm9tIHRoZSBTZWxlY3Rpb25Ob3RpZnkgZXZlbnQgaGFuZGxlciAqLwogCi0gICAgWENvbnZlcnRTZWxlY3Rpb24oZGlzcGxheSxYQV9QUklNQVJZLFhBX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICBYSW50ZXJuQXRvbShkaXNwbGF5LCJQUklNQVJZX1RFWFQiLEZhbHNlKSwKKyAgICBUU1hDb252ZXJ0U2VsZWN0aW9uKGRpc3BsYXksWEFfUFJJTUFSWSxYQV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgVFNYSW50ZXJuQXRvbShkaXNwbGF5LCJQUklNQVJZX1RFWFQiLEZhbHNlKSwKICAgICAgICAgICAgICAgICAgICAgICBXSU5fR2V0WFdpbmRvdyhoV25kKSxDdXJyZW50VGltZSk7CiAKICAgLyogd2FpdCB1bnRpbCBTZWxlY3Rpb25Ob3RpZnkgaXMgcHJvY2Vzc2VkIAogICAgKgotICAgKiBGSVhNRTogVXNlIFhDaGVja1R5cGVkV2luZG93RXZlbnQoKSBpbnN0ZWFkICggc2FtZSBpbiB0aGUgCisgICAqIEZJWE1FOiBVc2UgVFNYQ2hlY2tUeXBlZFdpbmRvd0V2ZW50KCkgaW5zdGVhZCAoIHNhbWUgaW4gdGhlIAogICAgKgkgICAgQ0xJUEJPQVJEX0NoZWNrU2VsZWN0aW9uKCkgKS4gCiAgICAqLwogCkBAIC0zNTAsNyArMzUwLDcgQEAKIAlkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsICJcdGdpdmluZyB1cCBzZWxlY3Rpb24gKHNwdyA9ICUwOHgpXG4iLCAKIAkJCQkgCSh1bnNpZ25lZClzZWxlY3Rpb25QcmV2V2luZG93KTsKIAotCVhTZXRTZWxlY3Rpb25Pd25lcihkaXNwbGF5LCBYQV9QUklNQVJZLCBOb25lLCBDdXJyZW50VGltZSk7CisJVFNYU2V0U2VsZWN0aW9uT3duZXIoZGlzcGxheSwgWEFfUFJJTUFSWSwgTm9uZSwgQ3VycmVudFRpbWUpOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTQwMSw4ICs0MDEsOCBAQAogCSh3Rm9ybWF0ID09IENGX1RFWFQgfHwgd0Zvcm1hdCA9PSBDRl9PRU1URVhUKSApCiAgICAgewogCW93bmVyID0gV0lOX0dldFhXaW5kb3coIGhXbmRDbGlwV2luZG93ID8gaFduZENsaXBXaW5kb3cgOiBBbnlQb3B1cDMyKCkgKTsKLQlYU2V0U2VsZWN0aW9uT3duZXIoZGlzcGxheSxYQV9QUklNQVJZLG93bmVyLEN1cnJlbnRUaW1lKTsKLQlpZiggWEdldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksWEFfUFJJTUFSWSkgPT0gb3duZXIgKQorCVRTWFNldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksWEFfUFJJTUFSWSxvd25lcixDdXJyZW50VGltZSk7CisJaWYoIFRTWEdldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksWEFfUFJJTUFSWSkgPT0gb3duZXIgKQogCXsKIAkgICAgc2VsZWN0aW9uQWNxdWlyZWQgPSBUcnVlOwogCSAgICBzZWxlY3Rpb25XaW5kb3cgPSBvd25lcjsKQEAgLTkxMSwxNyArOTExLDE3IEBACiAJdW5zaWduZWQgbG9uZyAJbml0ZW1zLHJlbWFpbjsKIAl1bnNpZ25lZCBjaGFyKgl2YWw9TlVMTDsKIAotICAgICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0Z290IHByb3BlcnR5ICVzXG4iLFhHZXRBdG9tTmFtZShkaXNwbGF5LHByb3ApKTsKKyAgICAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGdvdCBwcm9wZXJ0eSAlc1xuIixUU1hHZXRBdG9tTmFtZShkaXNwbGF5LHByb3ApKTsKIAogICAgICAgICAvKiBUT0RPOiBQcm9wZXJ0aWVzIGxvbmdlciB0aGFuIDY0SyAqLwogCi0JaWYoWEdldFdpbmRvd1Byb3BlcnR5KGRpc3BsYXksdyxwcm9wLDAsMHgzRkZGLFRydWUsWEFfU1RSSU5HLAorCWlmKFRTWEdldFdpbmRvd1Byb3BlcnR5KGRpc3BsYXksdyxwcm9wLDAsMHgzRkZGLFRydWUsWEFfU1RSSU5HLAogCSAgICAmYXR5cGUsICZhZm9ybWF0LCAmbml0ZW1zLCAmcmVtYWluLCAmdmFsKSAhPSBTdWNjZXNzKQogCSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0Y291bGRuJ3QgcmVhZCBwcm9wZXJ0eVxuIik7CiAJZWxzZQogCXsKICAgICAgICAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdFR5cGUgJXMsRm9ybWF0ICVkLG5pdGVtcyAlbGQsdmFsdWUgJXNcbiIsCi0JCSAgICAgICAgICAgICBYR2V0QXRvbU5hbWUoZGlzcGxheSxhdHlwZSksYWZvcm1hdCxuaXRlbXMsdmFsKTsKKwkJICAgICAgICAgICAgIFRTWEdldEF0b21OYW1lKGRpc3BsYXksYXR5cGUpLGFmb3JtYXQsbml0ZW1zLHZhbCk7CiAKIAkgICBpZihhdHlwZSA9PSBYQV9TVFJJTkcgJiYgYWZvcm1hdCA9PSA4KQogCSAgIHsKQEAgLTk0NSw3ICs5NDUsNyBAQAogCSAgICAgICAgZWxzZSBoVGV4dCA9IDA7CiAJICAgICAgfQogCSAgIH0KLQkgICBYRnJlZSh2YWwpOworCSAgIFRTWEZyZWUodmFsKTsKIAl9CiAgICB9CiAKQEAgLTk5NSw5ICs5OTUsOSBAQAogCX0KIAllbHNlIGlmKCB3ID09IHNlbGVjdGlvblByZXZXaW5kb3cgKQogCXsKLQkgICAgdyA9IFhHZXRTZWxlY3Rpb25Pd25lcihkaXNwbGF5LCBYQV9QUklNQVJZKTsKKwkgICAgdyA9IFRTWEdldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksIFhBX1BSSU1BUlkpOwogCSAgICBpZiggdyA9PSBOb25lICkKLQkJWFNldFNlbGVjdGlvbk93bmVyKGRpc3BsYXksIFhBX1BSSU1BUlksIHNlbGVjdGlvbldpbmRvdywgQ3VycmVudFRpbWUpOworCQlUU1hTZXRTZWxlY3Rpb25Pd25lcihkaXNwbGF5LCBYQV9QUklNQVJZLCBzZWxlY3Rpb25XaW5kb3csIEN1cnJlbnRUaW1lKTsKIAl9CiAKICAgICBzZWxlY3Rpb25QcmV2V2luZG93ID0gTm9uZTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGNlLmMgYi93aW5kb3dzL2RjZS5jCmluZGV4IGI4MmJjOTUuLjlmZjYwYzUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGNlLmMKKysrIGIvd2luZG93cy9kY2UuYwpAQCAtMTczLDYgKzE3Myw5IEBACiAJICAgIERlbGV0ZU9iamVjdDMyKCBkY2UtPmhDbGlwUmduICk7CiAKICAgICBkY2UtPmhDbGlwUmduID0gMDsKKworICAgIGRwcmludGZfZGMoc3RkZGViLCJcdHJlc3RvcmluZyBWaXNSZ25cbiIpOworCiAgICAgUmVzdG9yZVZpc1JnbihkY2UtPmhEQyk7CiB9CiAKQEAgLTIxMywxMiArMjE2LDEyIEBACiAgKiAgIERDRV9JbnZhbGlkYXRlRENFCiAgKgogICogSXQgaXMgY2FsbGVkIGZyb20gU2V0V2luZG93UG9zKCkgLSB3ZSBoYXZlIHRvIG1hcmsgYXMgZGlydHkgYWxsIGJ1c3kKLSAqIERDRSdzIGZvciB3aW5kb3dzIHdob3NlIGNsaWVudCByZWN0IGludGVyc2VjdHMgd2l0aCBzcGVjaWZpZWQgdXBkYXRlIAotICogcmVjdGFuZ2xlLiB3bmRTY29wZSBpcyB0aGUgaW1tZWRpYXRlIHBhcmVudCBvZiB0aGUgd2luZG93KHMpIHRoYXQgCi0gKiB3YXMod2VyZSkgbW92ZWQgYW5kKG9yKSByZXNpemVkLgorICogRENFJ3MgZm9yIHdpbmRvd3MgdGhhdCBoYXZlIHBXbmQtPnBhcmVudCBhcyBhbiBhbnNlY3RvciBhbmQgd2hvc2UgY2xpZW50IAorICogcmVjdCBpbnRlcnNlY3RzIHdpdGggc3BlY2lmaWVkIHVwZGF0ZSByZWN0YW5nbGUuIAogICovCi1CT09MMzIgRENFX0ludmFsaWRhdGVEQ0UoV05EKiB3bmRTY29wZSwgY29uc3QgUkVDVDMyKiBwUmVjdFVwZGF0ZSkKK0JPT0wzMiBEQ0VfSW52YWxpZGF0ZURDRShXTkQqIHBXbmQsIGNvbnN0IFJFQ1QzMiogcFJlY3RVcGRhdGUpCiB7CisgICAgV05EKiB3bmRTY29wZSA9IHBXbmQtPnBhcmVudDsKICAgICBCT09MMzIgYlJldCA9IEZBTFNFOwogCiAgICAgaWYoIHduZFNjb3BlICkKQEAgLTI1Nyw3ICsyNjAsOSBAQAogCiAJCQkgICAgT2Zmc2V0UmVjdDMyKCAmd25kUmVjdCwgeG9mZnNldCAtIHduZEN1cnJlbnQtPnJlY3RDbGllbnQubGVmdCwgCiAJCQkJCQkgICAgeW9mZnNldCAtIHduZEN1cnJlbnQtPnJlY3RDbGllbnQudG9wKTsKLQkJCSAgICBpZiAoSW50ZXJzZWN0UmVjdDMyKCAmd25kUmVjdCwgJnduZFJlY3QsIHBSZWN0VXBkYXRlICkpCisKKwkJCSAgICBpZiAocFduZCA9PSB3bmRDdXJyZW50IHx8CisJCQkJSW50ZXJzZWN0UmVjdDMyKCAmd25kUmVjdCwgJnduZFJlY3QsIHBSZWN0VXBkYXRlICkpCiAJCQkgICAgeyAKIAkJCQlpZiggIShkY2UtPkRDWGZsYWdzICYgRENYX0RDRUJVU1kpICkKIAkJCQl7CkBAIC01MDUsNyArNTEwLDcgQEAKICAgICAgICAgZGMtPncuRENPcmdYID0gMDsKICAgICAgICAgZGMtPncuRENPcmdZID0gMDsKICAgICAgICAgZGMtPnUueC5kcmF3YWJsZSA9IHJvb3RXaW5kb3c7Ci0gICAgICAgIFhTZXRTdWJ3aW5kb3dNb2RlKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBJbmNsdWRlSW5mZXJpb3JzICk7CisgICAgICAgIFRTWFNldFN1YndpbmRvd01vZGUoIGRpc3BsYXksIGRjLT51LnguZ2MsIEluY2x1ZGVJbmZlcmlvcnMgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTUzNSw3ICs1NDAsNyBAQAogCSAqLwogCiAJaWYoIGJTZXRDbGlwT3JpZ2luICkKLQkgICAgWFNldENsaXBPcmlnaW4oIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LkRDT3JnWCwgZGMtPncuRENPcmdZICk7CisJICAgIFRTWFNldENsaXBPcmlnaW4oIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LkRDT3JnWCwgZGMtPncuRENPcmdZICk7CiAgICAgfQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NjAsMjcgKzc2NSw2IEBACiAJCQkJCQkgICAgICBTWVNNRVRSSUNTX0NZU0NSRUVOICk7CiAJICAgIGVsc2UgaHJnblZpc2libGUgPSBEQ0VfR2V0VmlzUmduKCBod25kLCBmbGFncyApOwogCi0KLQlpZiggd25kUHRyLT5wYXJlbnQgJiYgd25kUHRyLT53aW5kb3cgKQotCXsKLQkgICAgLyogUHJvYmxlbSAtIFggZG9lc24ndCBkaXNjYXJkIHNhdmUgdW5kZXIgYnVmZmVycyB3aGVuCi0JICAgICAqIHRoZSBvbGQgZGF0YSBpcyBpbnZhbGlkYXRlZCBieSB0aGUgbmV3IGdyYXBoaWNzIG91dHB1dC4KLQkgICAgICoKLQkgICAgICogRklYTUU6IEluc3RlYWQgb2Ygb3ZlcnJpZGluZyB3ZSBzaG91bGQgdHJ5IHRvIGRpc2NhcmQKLQkgICAgICogICAgICAgIHNhdmVfdW5kZXJzIGJ5IGNhbGxpbmcgWFNldFdpbmRvd0F0dHJpYnV0ZXMoKS4KLQkgICAgICogICAgICAgIEFuZCB3ZSBzaG91bGQgZG8gaXQgZm9yIHRoZSBjaGlsZCB3aW5kb3cgR2V0RENFeCgpIAotCSAgICAgKgkgICAgICBjYWxscyBhcyB3ZWxsLiAqLwotCi0gICAgICAgICAgICBXTkQqICAgIHduZCA9IHduZFB0ci0+cGFyZW50LT5jaGlsZDsKLQkgICAgUkVDVDMyICByZWN0OwotCQotCSAgICBmb3IoIDsgd25kICYmICh3bmQgIT0gd25kUHRyKTsgd25kID0gd25kLT5uZXh0ICkgewotCQlpZiggd25kLT5jbGFzcy0+c3R5bGUgJiBDU19TQVZFQklUUyAmJiAKLQkJICAgIHduZC0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUgJiYKLQkJICAgIEludGVyc2VjdFJlY3QzMigmcmVjdCwgJnduZFB0ci0+cmVjdENsaWVudCwgJnduZC0+cmVjdENsaWVudCkgKQotICAgICAgICAgICAgICAgICAgICB3bmQtPmZsYWdzIHw9IFdJTl9TQVZFVU5ERVJfT1ZFUlJJREU7Ci0JICAgIH0KLQl9CiAJZGMtPncuZmxhZ3MgJj0gfkRDX0RJUlRZOwogCWRjZS0+RENYZmxhZ3MgJj0gfkRDWF9EQ0VESVJUWTsKIAlTZWxlY3RWaXNSZ24oIGhkYywgaHJnblZpc2libGUgKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IDY0NGY2MzQuLjNjYjU3YjggMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtNjQsOCArNjQsOCBAQAogICAgIHduZFB0ci0+dGV4dCA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgdGV4dCApOwogICAgIGlmICh3bmRQdHItPndpbmRvdykKICAgICB7Ci0JWFN0b3JlTmFtZSggZGlzcGxheSwgd25kUHRyLT53aW5kb3csIHduZFB0ci0+dGV4dCApOwotCVhTZXRJY29uTmFtZSggZGlzcGxheSwgd25kUHRyLT53aW5kb3csIHduZFB0ci0+dGV4dCApOworCVRTWFN0b3JlTmFtZSggZGlzcGxheSwgd25kUHRyLT53aW5kb3csIHduZFB0ci0+dGV4dCApOworCVRTWFNldEljb25OYW1lKCBkaXNwbGF5LCB3bmRQdHItPndpbmRvdywgd25kUHRyLT50ZXh0ICk7CiAgICAgfQogfQogCkBAIC03OCw3ICs3OCw3IEBACiB7CiAgICAgaWYoIGN0bFR5cGUgPT0gQ1RMQ09MT1JfU0NST0xMQkFSKQogICAgIHsKLSAgICAgICAgSEJSVVNIMzIgaGIgPSBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfU0NST0xMQkFSKTsKKwlIQlJVU0gzMiBoYiA9IEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9TQ1JPTExCQVIpOwogCVNldEJrQ29sb3IzMiggaERDLCBSR0IoMjU1LCAyNTUsIDI1NSkgKTsKIAlTZXRUZXh0Q29sb3IzMiggaERDLCBSR0IoMCwgMCwgMCkgKTsKIAlVbnJlYWxpemVPYmplY3QzMiggaGIgKTsKQEAgLTk4LDEyICs5OCwxNCBAQAogewogICAgIEJPT0wzMiBiVmlzaWJsZSA9IHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEU7CiAKK2RwcmludGZfd2luKHN0ZGRlYiwiU2V0UmVkcmF3OiAlMDR4ICVpXG4iLCB3bmRQdHItPmh3bmRTZWxmLCAod1BhcmFtIT0wKSApOworCiAgICAgaWYoIHdQYXJhbSApCiAgICAgewogCWlmKCAhYlZpc2libGUgKQogCXsKIAkgICAgd25kUHRyLT5kd1N0eWxlIHw9IFdTX1ZJU0lCTEU7Ci0JICAgIERDRV9JbnZhbGlkYXRlRENFKCB3bmRQdHItPnBhcmVudCwgJnduZFB0ci0+cmVjdFdpbmRvdyApOworCSAgICBEQ0VfSW52YWxpZGF0ZURDRSggd25kUHRyLCAmd25kUHRyLT5yZWN0V2luZG93ICk7CiAJfQogICAgIH0KICAgICBlbHNlIGlmKCBiVmlzaWJsZSApCkBAIC0xMTIsNyArMTE0LDcgQEAKIAllbHNlIHdQYXJhbSA9IFJEV19BTExDSElMRFJFTiB8IFJEV19WQUxJREFURTsKIAogCVBBSU5UX1JlZHJhd1dpbmRvdyggd25kUHRyLT5od25kU2VsZiwgTlVMTCwgMCwgd1BhcmFtLCAwICk7Ci0JRENFX0ludmFsaWRhdGVEQ0UoIHduZFB0ci0+cGFyZW50LCAmd25kUHRyLT5yZWN0V2luZG93ICk7CisJRENFX0ludmFsaWRhdGVEQ0UoIHduZFB0ciwgJnduZFB0ci0+cmVjdFdpbmRvdyApOwogCXduZFB0ci0+ZHdTdHlsZSAmPSB+V1NfVklTSUJMRTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL2RpbnB1dC5jIGIvd2luZG93cy9kaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjUxMGNkCi0tLSAvZGV2L251bGwKKysrIGIvd2luZG93cy9kaW5wdXQuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoJCURpcmVjdElucHV0CisgKgorICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCisgKi8KKy8qIFN0YXR1czoKKyAqCisgKiAtIFRvbWIgUmFpZGVyIDIgRGVtbzoKKyAqICAgRG9lc24ndCBhY2NlcHQgaW5wdXQgeWV0LiBBbHRob3VnaCBJIGFtIHN1cmUgSSd2ZSBkb25lIGV2ZXJ5dGhpbmcgcmlnaHQuLi4KKyAqIC0gV2luZ0NvbW1hbmRlciBQcm9waGVjeSBEZW1vOgorICogICBkaXRvLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJvbGUuaCIKKyNpbmNsdWRlICJjb21wb2JqLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJkaW5wdXQuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3N0YXRpYyBJRGlyZWN0SW5wdXRBX1ZUYWJsZSBkZGlhdnQ7CitzdGF0aWMgSURpcmVjdElucHV0RGV2aWNlQV9WVGFibGUgU3lzS2V5Ym9hcmRBdnQ7CitzdGF0aWMgSURpcmVjdElucHV0RGV2aWNlQV9WVGFibGUgU3lzTW91c2VBdnQ7CisKK0hSRVNVTFQgV0lOQVBJIERpcmVjdElucHV0Q3JlYXRlMzJBKEhJTlNUQU5DRTMyIGhpbnN0LCBEV09SRCBkd1ZlcnNpb24sIExQRElSRUNUSU5QVVQzMkEgKnBwREksIExQVU5LTk9XTiBwdW5rT3V0ZXIpIHsKKwlmcHJpbnRmKHN0ZGVyciwiRGlyZWN0SW5wdXRDcmVhdGUzMkEoMHglMDhseCwlMDRseCwlcCwlcClcbiIsCisJCShEV09SRCloaW5zdCxkd1ZlcnNpb24scHBESSxwdW5rT3V0ZXIKKwkpOworCSgqcHBESSkgPSAoTFBESVJFQ1RJTlBVVDMyQSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJRGlyZWN0SW5wdXQzMkEpKTsKKwkoKnBwREkpLT5yZWYgPSAxOworCSgqcHBESSktPmxwdnRibCA9ICZkZGlhdnQ7CisJcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJSURpcmVjdElucHV0QQorICovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdElucHV0QV9FbnVtRGV2aWNlcygKKwlMUERJUkVDVElOUFVUMzJBIHRoaXMsRFdPUkQgZHdGbGFncyxMUERJRU5VTURFVklDRVNDQUxMQkFDSzMyQSBjYiwKKwlMUFZPSUQgY29udGV4dCxEV09SRCB4CispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0QSglcCktPkVudW1EZXZpY2VzKDB4JTA4bHgsJXAsJXAsMHglMDhseCksc3R1YiFcbiIsdGhpcyxkd0ZsYWdzLGNiLGNvbnRleHQseCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdElucHV0QV9BZGRSZWYoTFBESVJFQ1RJTlBVVDMyQSB0aGlzKSB7CisJcmV0dXJuICsrKHRoaXMtPnJlZik7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdElucHV0QV9SZWxlYXNlKExQRElSRUNUSU5QVVQzMkEgdGhpcykgeworCWlmICghKC0tdGhpcy0+cmVmKSkgeworCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGhpcy0+cmVmOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdElucHV0QV9DcmVhdGVEZXZpY2UoCisJTFBESVJFQ1RJTlBVVDMyQSB0aGlzLFJFRkdVSUQgcmd1aWQsTFBESVJFQ1RJTlBVVERFVklDRTMyQSogcGRldiwKKwlMUFVOS05PV04gcHVuaworKSB7CisJY2hhcgl4YnVmWzUwXTsKKwkKKwlTdHJpbmdGcm9tQ0xTSUQocmd1aWQseGJ1Zik7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dEEoJXApLT5DcmVhdGVEZXZpY2UoJXMsJXAsJXApLHN0dWIhXG4iLHRoaXMseGJ1ZixwZGV2LHB1bmspOworCWlmICghbWVtY21wKCZHVUlEX1N5c0tleWJvYXJkLHJndWlkLHNpemVvZihHVUlEX1N5c0tleWJvYXJkKSkpIHsKKwkJKnBkZXYgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0SW5wdXREZXZpY2UzMkEpKTsKKwkJKCpwZGV2KS0+cmVmID0gMTsKKwkJKCpwZGV2KS0+bHB2dGJsID0gJlN5c0tleWJvYXJkQXZ0OworCQltZW1jcHkoJigoKnBkZXYpLT5ndWlkKSxyZ3VpZCxzaXplb2YoKnJndWlkKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW1lbWNtcCgmR1VJRF9TeXNNb3VzZSxyZ3VpZCxzaXplb2YoR1VJRF9TeXNNb3VzZSkpKSB7CisJCSpwZGV2ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdElucHV0RGV2aWNlMzJBKSk7CisJCSgqcGRldiktPnJlZiA9IDE7CisJCSgqcGRldiktPmxwdnRibCA9ICZTeXNNb3VzZUF2dDsKKwkJbWVtY3B5KCYoKCpwZGV2KS0+Z3VpZCkscmd1aWQsc2l6ZW9mKCpyZ3VpZCkpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIEVfRkFJTDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RJbnB1dEFfUXVlcnlJbnRlcmZhY2UoCisJTFBESVJFQ1RJTlBVVDMyQSB0aGlzLFJFRklJRCByaWlkLExQVk9JRCAqcHBvYmoKKykgeworCWNoYXIJeGJ1Zls1MF07CisKKwlTdHJpbmdGcm9tQ0xTSUQocmlpZCx4YnVmKTsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0QSglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhidWYscHBvYmopOworCWlmICghbWVtY21wKCZJSURfSVVua25vd24scmlpZCxzaXplb2YoKnJpaWQpKSkgeworCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOworCQkqcHBvYmogPSB0aGlzOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFtZW1jbXAoJklJRF9JRGlyZWN0SW5wdXRBLHJpaWQsc2l6ZW9mKCpyaWlkKSkpIHsKKwkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKKwkJKnBwb2JqID0gdGhpczsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBFX0ZBSUw7Cit9CisKK3N0YXRpYyBJRGlyZWN0SW5wdXRBX1ZUYWJsZSBkZGlhdnQ9IHsKKwlJRGlyZWN0SW5wdXRBX1F1ZXJ5SW50ZXJmYWNlLAorCUlEaXJlY3RJbnB1dEFfQWRkUmVmLAorCUlEaXJlY3RJbnB1dEFfUmVsZWFzZSwKKwlJRGlyZWN0SW5wdXRBX0NyZWF0ZURldmljZSwKKwlJRGlyZWN0SW5wdXRBX0VudW1EZXZpY2VzLAorCSh2b2lkKik2LAorCSh2b2lkKik3LAorCSh2b2lkKik4Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglJRGlyZWN0SW5wdXREZXZpY2VBCisgKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0SW5wdXREZXZpY2VBX1NldERhdGFGb3JtYXQoCisJTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLExQQ0RJREFUQUZPUk1BVCBkZgorKSB7CisJLyoKKwlpbnQgaTsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0RGV2aWNlQSglcCktPlNldERhdGFGb3JtYXQoJXApXG4iLHRoaXMsZGYpOworCisJZnByaW50ZihzdGRlcnIsImRmLmR3U2l6ZSAlbGRcbiIsZGYtPmR3U2l6ZSk7CisJZnByaW50ZihzdGRlcnIsImRmLmR3T2Jqc2l6ZSAlbGRcbiIsZGYtPmR3T2JqU2l6ZSk7CisJZnByaW50ZihzdGRlcnIsImRmLmR3RmxhZ3MgMHglMDhseFxuIixkZi0+ZHdGbGFncyk7CisJZnByaW50ZihzdGRlcnIsImRmLmR3RGF0YVNpemUgJWxkXG4iLGRmLT5kd0RhdGFTaXplKTsKKwlmcHJpbnRmKHN0ZGVyciwiZGYuZHdOdW1PYmpzICVsZFxuIixkZi0+ZHdOdW1PYmpzKTsKKworCWZvciAoaT0wO2k8ZGYtPmR3TnVtT2JqcztpKyspIHsKKwkJY2hhcgl4YnVmWzUwXTsKKworCQlpZiAoZGYtPnJnb2RmW2ldLnBndWlkKQorCQkJU3RyaW5nRnJvbUNMU0lEKGRmLT5yZ29kZltpXS5wZ3VpZCx4YnVmKTsKKwkJZWxzZQorCQkJc3RyY3B5KHhidWYsIjxubyBndWlkPiIpOworCQlmcHJpbnRmKHN0ZGVyciwiZGYucmdvZGZbJWRdLmd1aWQgJXNcbiIsaSx4YnVmKTsKKwkJZnByaW50ZihzdGRlcnIsImRmLnJnb2RmWyVkXS5kd09mcyAlbGRcbiIsaSxkZi0+cmdvZGZbaV0uZHdPZnMpOworCQlmcHJpbnRmKHN0ZGVyciwiCWR3VHlwZSAweCUwMmx4LGR3SW5zdGFuY2UgJWxkXG4iLERJREZUX0dFVFRZUEUoZGYtPnJnb2RmW2ldLmR3VHlwZSksRElERlRfR0VUSU5TVEFOQ0UoZGYtPnJnb2RmW2ldLmR3VHlwZSkpOworCQlmcHJpbnRmKHN0ZGVyciwiZGYucmdvZGZbJWRdLmR3RmxhZ3MgMHglMDhseFxuIixpLGRmLT5yZ29kZltpXS5kd0ZsYWdzKTsKKwl9CisJKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RJbnB1dERldmljZUFfU2V0Q29vcGVyYXRpdmVMZXZlbCgKKwlMUERJUkVDVElOUFVUREVWSUNFMzJBIHRoaXMsSFdORDMyIGh3bmQsRFdPUkQgZHdmbGFncworKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dERldmljZUEoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKDB4JTA4bHgsMHglMDhseClcbiIsdGhpcywoRFdPUkQpaHduZCxkd2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RJbnB1dERldmljZUFfU2V0UHJvcGVydHkoCisJTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLFJFRkdVSUQgcmd1aWQsTFBDRElQUk9QSEVBREVSIHBoCispIHsKKwljaGFyCXhidWZbNTBdOworCisJaWYgKEhJV09SRChyZ3VpZCkpCisJCVN0cmluZ0Zyb21DTFNJRChyZ3VpZCx4YnVmKTsKKwllbHNlCisJCXN0cmNweSh4YnVmLCI8bm8gZ3VpZD4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0RGV2aWNlQSglcCktPlNldFByb3BlcnR5KCVzLCVwKVxuIix0aGlzLHhidWYscGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdElucHV0RGV2aWNlQV9TZXRFdmVudE5vdGlmaWNhdGlvbigKKwlMUERJUkVDVElOUFVUREVWSUNFMzJBIHRoaXMsSEFORExFMzIgaG5kCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0RGV2aWNlQSglcCktPlNldEV2ZW50Tm90aWZpY2F0aW9uKDB4JTA4bHgpXG4iLHRoaXMsKERXT1JEKWhuZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0SW5wdXREZXZpY2VBX0dldERldmljZURhdGEoCisJTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLERXT1JEIHgsTFBESURFVklDRU9CSkVDVERBVEEgZG9kLAorCUxQRFdPUkQgeSxEV09SRCB6CispIHsKKy8qCisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dERldmljZUEoJXApLT5HZXREZXZpY2VEYXRhKDB4JTA4bHgsJXAsJXAsMHglMDhseClcbiIsdGhpcyx4LGRvZCx5LHopOworICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0SW5wdXREZXZpY2VBX0FjcXVpcmUoTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dERldmljZUEoJXApLT5BcXVpcmUoKVxuIix0aGlzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RJbnB1dERldmljZUFfVW5hY3F1aXJlKExQRElSRUNUSU5QVVRERVZJQ0UzMkEgdGhpcykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0SW5wdXREZXZpY2VBKCVwKS0+VW5hcXVpcmUoKVxuIix0aGlzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0SW5wdXREZXZpY2VBX1JlbGVhc2UoTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzKSB7CisJdGhpcy0+cmVmLS07CisJaWYgKHRoaXMtPnJlZikKKwkJcmV0dXJuIHRoaXMtPnJlZjsKKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJcmV0dXJuIDA7Cit9CisKKworZXh0ZXJuIEJZVEUgSW5wdXRLZXlTdGF0ZVRhYmxlWzI1Nl07CitleHRlcm4gQllURSB2a2V5MnNjb2RlWzUxMl07CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0SW5wdXREZXZpY2VBX0dldERldmljZVN0YXRlKAorCUxQRElSRUNUSU5QVVRERVZJQ0UzMkEgdGhpcyxEV09SRCBsZW4sTFBWT0lEIHB0cgorKSB7CisvKgorCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0SW5wdXREZXZpY2VBKCVwKS0+R2V0RGV2aWNlU3RhdGUoMHglMDhseCwlcClcbiIsCisJCXRoaXMsbGVuLHB0cgorCSk7CisgKi8KKwlpZiAobGVuPT0yNTYpIHsvKiAmJiB0aGlzX2lzX2Ffa2V5Ym9hcmQgKi8KKwkJaW50CWk7CisKKwkJbWVtc2V0KHB0ciwwLDI1Nik7CisJCWZvciAoaT0wO2k8MjU2O2krKykgeworCQkJaWYgKElucHV0S2V5U3RhdGVUYWJsZVtpXSYweDgwKQorCQkJCWZwcmludGYoc3RkZXJyLCJWS0VZICVkIHByZXNzZWQgKERJSyAweCUwMnhcbiIsaSx2a2V5MnNjb2RlW2ldKTsKKwkJCSgoTFBCWVRFKXB0cilbaV09dmtleTJzY29kZVtJbnB1dEtleVN0YXRlVGFibGVbaV1dJjB4ODA7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdElucHV0RGV2aWNlQV9RdWVyeUludGVyZmFjZSgKKwlMUERJUkVDVElOUFVUREVWSUNFMzJBIHRoaXMsUkVGSUlEIHJpaWQsTFBWT0lEICpwcG9iagorKSB7CisJY2hhcgl4YnVmWzUwXTsKKworCVN0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0SW5wdXRBKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseGJ1ZixwcG9iaik7CisJaWYgKCFtZW1jbXAoJklJRF9JVW5rbm93bixyaWlkLHNpemVvZigqcmlpZCkpKSB7CisJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CisJCSpwcG9iaiA9IHRoaXM7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3RJbnB1dERldmljZUEscmlpZCxzaXplb2YoKnJpaWQpKSkgeworCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOworCQkqcHBvYmogPSB0aGlzOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIEVfRkFJTDsKK30KKworc3RhdGljIElEaXJlY3RJbnB1dERldmljZUFfVlRhYmxlIFN5c0tleWJvYXJkQXZ0PXsKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1F1ZXJ5SW50ZXJmYWNlLAorCSh2b2lkKikyLAorCUlEaXJlY3RJbnB1dERldmljZUFfUmVsZWFzZSwKKwkodm9pZCopNCwKKwkodm9pZCopNSwKKwkodm9pZCopNiwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1NldFByb3BlcnR5LAorCUlEaXJlY3RJbnB1dERldmljZUFfQWNxdWlyZSwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1VuYWNxdWlyZSwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX0dldERldmljZVN0YXRlLAorCUlEaXJlY3RJbnB1dERldmljZUFfR2V0RGV2aWNlRGF0YSwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1NldERhdGFGb3JtYXQsCisJSURpcmVjdElucHV0RGV2aWNlQV9TZXRFdmVudE5vdGlmaWNhdGlvbiwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1NldENvb3BlcmF0aXZlTGV2ZWwsCisJKHZvaWQqKTE1LAorCSh2b2lkKikxNiwKKwkodm9pZCopMTcsCisJKHZvaWQqKTE4LAorfTsKKworc3RhdGljIElEaXJlY3RJbnB1dERldmljZUFfVlRhYmxlIFN5c01vdXNlQXZ0PXsKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1F1ZXJ5SW50ZXJmYWNlLAorCSh2b2lkKikyLAorCUlEaXJlY3RJbnB1dERldmljZUFfUmVsZWFzZSwKKwkodm9pZCopNCwKKwkodm9pZCopNSwKKwkodm9pZCopNiwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1NldFByb3BlcnR5LAorCUlEaXJlY3RJbnB1dERldmljZUFfQWNxdWlyZSwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1VuYWNxdWlyZSwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX0dldERldmljZVN0YXRlLAorCUlEaXJlY3RJbnB1dERldmljZUFfR2V0RGV2aWNlRGF0YSwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1NldERhdGFGb3JtYXQsCisJSURpcmVjdElucHV0RGV2aWNlQV9TZXRFdmVudE5vdGlmaWNhdGlvbiwKKwlJRGlyZWN0SW5wdXREZXZpY2VBX1NldENvb3BlcmF0aXZlTGV2ZWwsCisJKHZvaWQqKTE1LAorCSh2b2lkKikxNiwKKwkodm9pZCopMTcsCisJKHZvaWQqKTE4LAorfTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZXZlbnQuYyBiL3dpbmRvd3MvZXZlbnQuYwppbmRleCBhNjg4OGFjLi44NGJjMjcxIDEwMDY0NAotLS0gYS93aW5kb3dzL2V2ZW50LmMKKysrIGIvd2luZG93cy9ldmVudC5jCkBAIC0xNSw5ICsxNSw5IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxYMTEva2V5c3ltLmg+Ci0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWHJlc291cmNlLmg+Ci0jaW5jbHVkZSA8WDExL1h1dGlsLmg+CisjaW5jbHVkZSAidHNfeGxpYi5oIgorI2luY2x1ZGUgInRzX3hyZXNvdXJjZS5oIgorI2luY2x1ZGUgInRzX3h1dGlsLmgiCiAjaW5jbHVkZSA8WDExL1hhdG9tLmg+CiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC0xMDksNyArMTA5LDcgQEAKIAogZXh0ZXJuIHZvaWQgRk9DVVNfU2V0WEZvY3VzKCBIV05EMzIgKTsKIGV4dGVybiBCT09MMTYgRFJBR19RdWVyeVVwZGF0ZSggSFdORDE2LCBTRUdQVFIsIEJPT0wzMiApOwotZXh0ZXJuIEJPT0wzMiBXSU5TT0NLX0hhbmRsZUlPKCBpbnQqIG1heF9mZCwgaW50IG51bV9wZW5kaW5nLCBmZF9zZXQgaW9fc2V0WzNdICk7CitleHRlcm4gQk9PTDMyIFdJTlNPQ0tfSGFuZGxlSU8oIGludCogbWF4X2ZkLCBpbnQgbnVtX3BlbmRpbmcsIGZkX3NldCBwWzNdLCBmZF9zZXQgZVszXSApOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBFVkVOVF9Jbml0CkBAIC0xNTEsNyArMTUxLDcgQEAKIHsKICAgICBXTkQgKnBXbmQ7CiAgICAgCi0gICAgaWYgKFhGaW5kQ29udGV4dCggZGlzcGxheSwgZXZlbnQtPnhhbnkud2luZG93LCB3aW5Db250ZXh0LAorICAgIGlmIChUU1hGaW5kQ29udGV4dCggZGlzcGxheSwgZXZlbnQtPnhhbnkud2luZG93LCB3aW5Db250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwV25kICkgIT0gMCkKICAgICAgICAgcmV0dXJuOyAgLyogTm90IGZvciBhIHJlZ2lzdGVyZWQgd2luZG93ICovCiAKQEAgLTE4Niw3ICsxODYsNyBAQAogCSAqLwogICAgICAgICBpZiAoSW5wdXRFbmFibGVkKQogCXsKLSAgICAgICAgICAgIHdoaWxlIChYQ2hlY2tUeXBlZFdpbmRvd0V2ZW50KGRpc3BsYXksKChYQW55RXZlbnQgKilldmVudCktPndpbmRvdywKKyAgICAgICAgICAgIHdoaWxlIChUU1hDaGVja1R5cGVkV2luZG93RXZlbnQoZGlzcGxheSwoKFhBbnlFdmVudCAqKWV2ZW50KS0+d2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uTm90aWZ5LCBldmVudCkpOyAgICAKICAgICAgICAgICAgIEVWRU5UX01vdGlvbk5vdGlmeSggcFduZCwgKFhNb3Rpb25FdmVudCopZXZlbnQgKTsKIAl9CkBAIC0yNjQsMTggKzI2NCwxOCBAQAogdm9pZCBFVkVOVF9SZWdpc3RlcldpbmRvdyggV05EICpwV25kICkKIHsKICAgICBpZiAod21Qcm90b2NvbHMgPT0gTm9uZSkKLSAgICAgICAgd21Qcm90b2NvbHMgPSBYSW50ZXJuQXRvbSggZGlzcGxheSwgIldNX1BST1RPQ09MUyIsIFRydWUgKTsKKyAgICAgICAgd21Qcm90b2NvbHMgPSBUU1hJbnRlcm5BdG9tKCBkaXNwbGF5LCAiV01fUFJPVE9DT0xTIiwgVHJ1ZSApOwogICAgIGlmICh3bURlbGV0ZVdpbmRvdyA9PSBOb25lKQotICAgICAgICB3bURlbGV0ZVdpbmRvdyA9IFhJbnRlcm5BdG9tKCBkaXNwbGF5LCAiV01fREVMRVRFX1dJTkRPVyIsIFRydWUgKTsKKyAgICAgICAgd21EZWxldGVXaW5kb3cgPSBUU1hJbnRlcm5BdG9tKCBkaXNwbGF5LCAiV01fREVMRVRFX1dJTkRPVyIsIFRydWUgKTsKICAgICBpZiggZG5kUHJvdG9jb2wgPT0gTm9uZSApCi0JZG5kUHJvdG9jb2wgPSBYSW50ZXJuQXRvbSggZGlzcGxheSwgIkRuZFByb3RvY29sIiAsIEZhbHNlICk7CisJZG5kUHJvdG9jb2wgPSBUU1hJbnRlcm5BdG9tKCBkaXNwbGF5LCAiRG5kUHJvdG9jb2wiICwgRmFsc2UgKTsKICAgICBpZiggZG5kU2VsZWN0aW9uID09IE5vbmUgKQotCWRuZFNlbGVjdGlvbiA9IFhJbnRlcm5BdG9tKCBkaXNwbGF5LCAiRG5kU2VsZWN0aW9uIiAsIEZhbHNlICk7CisJZG5kU2VsZWN0aW9uID0gVFNYSW50ZXJuQXRvbSggZGlzcGxheSwgIkRuZFNlbGVjdGlvbiIgLCBGYWxzZSApOwogCi0gICAgWFNldFdNUHJvdG9jb2xzKCBkaXNwbGF5LCBwV25kLT53aW5kb3csICZ3bURlbGV0ZVdpbmRvdywgMSApOworICAgIFRTWFNldFdNUHJvdG9jb2xzKCBkaXNwbGF5LCBwV25kLT53aW5kb3csICZ3bURlbGV0ZVdpbmRvdywgMSApOwogCi0gICAgaWYgKCF3aW5Db250ZXh0KSB3aW5Db250ZXh0ID0gWFVuaXF1ZUNvbnRleHQoKTsKLSAgICBYU2F2ZUNvbnRleHQoIGRpc3BsYXksIHBXbmQtPndpbmRvdywgd2luQ29udGV4dCwgKGNoYXIgKilwV25kICk7CisgICAgaWYgKCF3aW5Db250ZXh0KSB3aW5Db250ZXh0ID0gVFNYVW5pcXVlQ29udGV4dCgpOworICAgIFRTWFNhdmVDb250ZXh0KCBkaXNwbGF5LCBwV25kLT53aW5kb3csIHdpbkNvbnRleHQsIChjaGFyICopcFduZCApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4NSw5ICsyODUsOSBAQAogewogICAgWEV2ZW50IHhlOwogCi0gICBYRGVsZXRlQ29udGV4dCggZGlzcGxheSwgcFduZC0+d2luZG93LCB3aW5Db250ZXh0ICk7Ci0gICBYRGVzdHJveVdpbmRvdyggZGlzcGxheSwgcFduZC0+d2luZG93ICk7Ci0gICB3aGlsZSggWENoZWNrV2luZG93RXZlbnQoZGlzcGxheSwgcFduZC0+d2luZG93LCBOb0V2ZW50TWFzaywgJnhlKSApOworICAgVFNYRGVsZXRlQ29udGV4dCggZGlzcGxheSwgcFduZC0+d2luZG93LCB3aW5Db250ZXh0ICk7CisgICBUU1hEZXN0cm95V2luZG93KCBkaXNwbGF5LCBwV25kLT53aW5kb3cgKTsKKyAgIHdoaWxlKCBUU1hDaGVja1dpbmRvd0V2ZW50KGRpc3BsYXksIHBXbmQtPndpbmRvdywgTm9FdmVudE1hc2ssICZ4ZSkgKTsKIH0KIAogCkBAIC0zMjAsMTggKzMyMCwxOSBAQAogewogICAgIFhFdmVudCBldmVudDsKICAgICBMT05HIG1heFdhaXQgPSBzbGVlcCA/IFRJTUVSX0dldE5leHRFeHBpcmF0aW9uKCkgOiAwOworICAgIGludCBwZW5kaW5nID0gVFNYUGVuZGluZyhkaXNwbGF5KTsKIAogICAgIC8qIFdhaXQgZm9yIGFuIGV2ZW50IG9yIGEgdGltZW91dC4gSWYgbWF4V2FpdCBpcyAtMSwgd2UgaGF2ZSBubyB0aW1lb3V0OwogICAgICAqIGluIHRoaXMgY2FzZSwgd2UgZmFsbCB0aHJvdWdoIGRpcmVjdGx5IHRvIHRoZSBYTmV4dEV2ZW50IGxvb3AuCiAgICAgICovCiAKLSAgICBpZiAoKG1heFdhaXQgIT0gLTEpICYmICFYUGVuZGluZyhkaXNwbGF5KSkKKyAgICBpZiAoKG1heFdhaXQgIT0gLTEpICYmICFwZW5kaW5nKQogICAgIHsKIAlpbnQgbnVtX3BlbmRpbmc7CiAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7Ci0JZmRfc2V0IHJlYWRfc2V0ID0gX19ldmVudF9pb19zZXRbRVZFTlRfSU9fUkVBRF07Ci0JZmRfc2V0IHdyaXRlX3NldCA9IF9fZXZlbnRfaW9fc2V0W0VWRU5UX0lPX1dSSVRFXTsKLQlmZF9zZXQgZXhjZXB0X3NldCA9IF9fZXZlbnRfaW9fc2V0W0VWRU5UX0lPX0VYQ0VQVF07CisJZmRfc2V0IGlvX3NldFszXTsKKworCW1lbWNweSggaW9fc2V0LCBfX2V2ZW50X2lvX3NldCwgc2l6ZW9mKGlvX3NldCkgKTsKIAogCXRpbWVvdXQudHZfdXNlYyA9IChtYXhXYWl0ICUgMTAwMCkgKiAxMDAwOwogCXRpbWVvdXQudHZfc2VjID0gbWF4V2FpdCAvIDEwMDA7CkBAIC0zNDcsNyArMzQ4LDkgQEAKIAl9CiAJc3RvcF93YWl0X29wID0gU1RPUF9XQUlUX1g7CiAJLyogVGhlIGNvZGUgdXAgdG8gdGhlIG5leHQgInN0b3Bfd2FpdF9vcCA9IENPTlQiIG11c3QgYmUgcmVlbnRyYW50ICovCi0JbnVtX3BlbmRpbmcgPSBzZWxlY3QoIF9fZXZlbnRfbWF4X2ZkLCAmcmVhZF9zZXQsIE5VTEwsIE5VTEwsICZ0aW1lb3V0ICk7CisJbnVtX3BlbmRpbmcgPSBzZWxlY3QoIF9fZXZlbnRfbWF4X2ZkLCAmaW9fc2V0W0VWRU5UX0lPX1JFQURdLCAKKwkJCQkJICAgICAgJmlvX3NldFtFVkVOVF9JT19XUklURV0sIAorCQkJCQkgICAgICAmaW9fc2V0W0VWRU5UX0lPX0VYQ0VQVF0sICZ0aW1lb3V0ICk7CiAJaWYgKCBudW1fcGVuZGluZyA9PSAwICkKICAgICAgICAgewogCSAgICBzdG9wX3dhaXRfb3AgPSBDT05UOwpAQCAtMzU2LDggKzM1OSw5IEBACiAJfQogICAgICAgICBlbHNlIHN0b3Bfd2FpdF9vcCA9IENPTlQ7CiAjZWxzZSAgLyogQ09ORklHX0lQQyAqLwotCW51bV9wZW5kaW5nID0gc2VsZWN0KCBfX2V2ZW50X21heF9mZCwgCi0JCQkmcmVhZF9zZXQsICZ3cml0ZV9zZXQsICZleGNlcHRfc2V0LCAmdGltZW91dCApOworCW51bV9wZW5kaW5nID0gc2VsZWN0KCBfX2V2ZW50X21heF9mZCwgJmlvX3NldFtFVkVOVF9JT19SRUFEXSwKKwkJCQkJICAgICAgJmlvX3NldFtFVkVOVF9JT19XUklURV0sCisJCQkJCSAgICAgICZpb19zZXRbRVZFTlRfSU9fRVhDRVBUXSwgJnRpbWVvdXQgKTsKIAlpZiAoIG51bV9wZW5kaW5nID09IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIFRpbWVvdXQgb3IgZXJyb3IgKi8KQEAgLTM2OCwxNCArMzcyLDIyIEBACiAKIAkvKiAgV2luc29jayBhc3luY2hyb25vdXMgc2VydmljZXMgKi8KIAotCWlmKCBGRF9JU1NFVCggX19ldmVudF94X2Nvbm5lY3Rpb24sICZyZWFkX3NldCkgKSAKKwlpZiggRkRfSVNTRVQoIF9fZXZlbnRfeF9jb25uZWN0aW9uLCAmaW9fc2V0W0VWRU5UX0lPX1JFQURdKSApIAogCXsKIAkgICAgbnVtX3BlbmRpbmctLTsKIAkgICAgaWYoIG51bV9wZW5kaW5nICkKLQkJV0lOU09DS19IYW5kbGVJTyggJl9fZXZlbnRfbWF4X2ZkLCBudW1fcGVuZGluZywgX19ldmVudF9pb19zZXQgKTsKKwkJV0lOU09DS19IYW5kbGVJTyggJl9fZXZlbnRfbWF4X2ZkLCBudW1fcGVuZGluZywgaW9fc2V0LCBfX2V2ZW50X2lvX3NldCApOwogCX0KIAllbHNlIC8qIG5vIFggZXZlbnRzICovCi0JICAgIHJldHVybiBXSU5TT0NLX0hhbmRsZUlPKCAmX19ldmVudF9tYXhfZmQsIG51bV9wZW5kaW5nLCBfX2V2ZW50X2lvX3NldCApOworCSAgICByZXR1cm4gV0lOU09DS19IYW5kbGVJTyggJl9fZXZlbnRfbWF4X2ZkLCBudW1fcGVuZGluZywgaW9fc2V0LCBfX2V2ZW50X2lvX3NldCApOworICAgIH0KKyAgICBlbHNlIGlmKCFwZW5kaW5nKQorICAgIHsJCQkJLyogV2FpdCBmb3IgWDExIGlucHV0LiAqLworCWZkX3NldCBzZXQ7CisKKwlGRF9aRVJPKCZzZXQpOworCUZEX1NFVChfX2V2ZW50X3hfY29ubmVjdGlvbiwgJnNldCk7CisJc2VsZWN0KF9fZXZlbnRfeF9jb25uZWN0aW9uICsgMSwgJnNldCwgMCwgMCwgMCApOwogICAgIH0KIAogICAgIC8qIFByb2Nlc3MgY3VycmVudCBYIGV2ZW50IChhbmQgcG9zc2libHkgb3RoZXJzIHRoYXQgb2NjdXJyZWQgaW4gdGhlIG1lYW50aW1lKSAqLwpAQCAtMzkxLDE0ICs0MDMsMTQgQEAKICAgICAgICAgfQogI2VuZGlmICAvKiBDT05GSUdfSVBDICovCiAKLQlYTmV4dEV2ZW50KCBkaXNwbGF5LCAmZXZlbnQgKTsKKwlUU1hOZXh0RXZlbnQoIGRpc3BsYXksICZldmVudCApOwogCiAgICAgICAgIGlmKCBwZWVrICkKICAgICAgICAgewogCSAgV05EKgkJcFduZDsKIAkgIE1FU1NBR0VRVUVVRSogcFE7CiAKLSAgICAgICAgICBpZiAoWEZpbmRDb250ZXh0KCBkaXNwbGF5LCAoKFhBbnlFdmVudCAqKSZldmVudCktPndpbmRvdywgd2luQ29udGV4dCwKKyAgICAgICAgICBpZiAoVFNYRmluZENvbnRleHQoIGRpc3BsYXksICgoWEFueUV2ZW50ICopJmV2ZW50KS0+d2luZG93LCB3aW5Db250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwV25kICkgfHwgKGV2ZW50LnR5cGUgPT0gTm9FeHBvc2UpKQogICAgICAgICAgICAgICBjb250aW51ZTsKIApAQCAtNDIwLDE0ICs0MzIsMTQgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgcFEtPmZsYWdzIHw9IFFVRVVFX0ZMQUdfWEVWRU5UOwogICAgICAgICAgICAgICBQb3N0RXZlbnQocFEtPmhUYXNrKTsKLQkgICAgICBYUHV0QmFja0V2ZW50KGRpc3BsYXksICZldmVudCk7CisJICAgICAgVFNYUHV0QmFja0V2ZW50KGRpc3BsYXksICZldmVudCk7CiAgICAgICAgICAgICAgIGJyZWFrOwogCSAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgRVZFTlRfUHJvY2Vzc0V2ZW50KCAmZXZlbnQgKTsKICAgICB9Ci0gICAgd2hpbGUgKFhQZW5kaW5nKCBkaXNwbGF5ICkpOworICAgIHdoaWxlIChUU1hQZW5kaW5nKCBkaXNwbGF5ICkpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC00NDEsMTAgKzQ1MywxMCBAQAogewogICAgIFhFdmVudCBldmVudDsKIAotICAgIFhTeW5jKCBkaXNwbGF5LCBGYWxzZSApOwotICAgIHdoaWxlIChYUGVuZGluZyggZGlzcGxheSApKQorICAgIFRTWFN5bmMoIGRpc3BsYXksIEZhbHNlICk7CisgICAgd2hpbGUgKFRTWFBlbmRpbmcoIGRpc3BsYXkgKSkKICAgICB7Ci0JWE5leHRFdmVudCggZGlzcGxheSwgJmV2ZW50ICk7CisJVFNYTmV4dEV2ZW50KCBkaXNwbGF5LCAmZXZlbnQgKTsKIAlFVkVOVF9Qcm9jZXNzRXZlbnQoICZldmVudCApOwogICAgIH0gICAgCiB9CkBAIC00NTMsNiArNDY1LDcgQEAKICAqICAgICAgICAgICBFVkVOVF9RdWVyeVpPcmRlcgogICoKICAqIFRyeSB0byBzeW5jaHJvbml6ZSBpbnRlcm5hbCB6LW9yZGVyIHdpdGggdGhlIHdpbmRvdyBtYW5hZ2VyJ3MuCisgKiBQcm9iYWJseSBhIGZ1dGlsZSBlbmRlYXZvci4KICAqLwogc3RhdGljIEJPT0wzMiBfX2NoZWNrX3F1ZXJ5X2NvbmRpdGlvbiggV05EKiogcFduZEEsIFdORCoqIHBXbmRCICkKIHsKQEAgLTQ3OCwxMCArNDkxLDEwIEBACiAKICAgICBkbwogICAgIHsKLSAgICAgICAgaWYoICpjaGlsZHJlbiApIFhGcmVlKCAqY2hpbGRyZW4gKTsKLSAgICAgICAgWFF1ZXJ5VHJlZSggZGlzcGxheSwgQSwgJnJvb3QsICZBLCBjaGlsZHJlbiwgdG90YWwgKTsKLSAgICAgICAgWFF1ZXJ5VHJlZSggZGlzcGxheSwgQiwgJnJvb3QsICZCLCAmY2hpbGRyZW5CLCAmdG90YWxCICk7Ci0gICAgICAgIGlmKCBjaGlsZHJlbkIgKSBYRnJlZSggY2hpbGRyZW5CICk7CisgICAgICAgIGlmKCAqY2hpbGRyZW4gKSBUU1hGcmVlKCAqY2hpbGRyZW4gKTsKKyAgICAgICAgVFNYUXVlcnlUcmVlKCBkaXNwbGF5LCBBLCAmcm9vdCwgJkEsIGNoaWxkcmVuLCB0b3RhbCApOworICAgICAgICBUU1hRdWVyeVRyZWUoIGRpc3BsYXksIEIsICZyb290LCAmQiwgJmNoaWxkcmVuQiwgJnRvdGFsQiApOworICAgICAgICBpZiggY2hpbGRyZW5CICkgVFNYRnJlZSggY2hpbGRyZW5CICk7CiAgICAgfSB3aGlsZSggQSAhPSBCICYmIEEgJiYgQiApOwogICAgIHJldHVybiAoIEEgJiYgQiApID8gQSA6IDAgOwogfQpAQCAtNDk0LDggKzUwNyw4IEBACiAgICAgZG8KICAgICB7CiAgICAgICAgIHcgPSBwYXJlbnQ7Ci0gICAgICAgIFhRdWVyeVRyZWUoIGRpc3BsYXksIHcsICZyb290LCAmcGFyZW50LCAmY2hpbGRyZW4sICZ0b3RhbCApOwotICAgICAgICBpZiggY2hpbGRyZW4gKSBYRnJlZSggY2hpbGRyZW4gKTsKKyAgICAgICAgVFNYUXVlcnlUcmVlKCBkaXNwbGF5LCB3LCAmcm9vdCwgJnBhcmVudCwgJmNoaWxkcmVuLCAmdG90YWwgKTsKKyAgICAgICAgaWYoIGNoaWxkcmVuICkgVFNYRnJlZSggY2hpbGRyZW4gKTsKICAgICB9IHdoaWxlKCBwYXJlbnQgJiYgcGFyZW50ICE9IGFuY2VzdG9yICk7CiAgICAgZHByaW50Zl9ldmVudCggc3RkZGViLCAiXHQlMDh4IC0+ICUwOHhcbiIsICh1bnNpZ25lZClwcmV2LCAodW5zaWduZWQpdyApOwogICAgIHJldHVybiAoIHBhcmVudCApID8gdyA6IDAgOwpAQCAtNTQ3LDcgKzU2MCw3IEBACiAgICAgICAgICAgICBXSU5fTGlua1dpbmRvdyggcFduZENoZWNrLT5od25kU2VsZiwgaHduZEluc2VydEFmdGVyKTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiggY2hpbGRyZW4gKSBYRnJlZSggY2hpbGRyZW4gKTsKKyAgICBpZiggY2hpbGRyZW4gKSBUU1hGcmVlKCBjaGlsZHJlbiApOwogICAgIHJldHVybiBiUmV0OwogfQogCkBAIC02NDYsNyArNjU5LDcgQEAKICAgICBpbnQgcm9vdFgsIHJvb3RZLCB3aW5YLCB3aW5ZOwogICAgIHVuc2lnbmVkIGludCBzdGF0ZTsKIAotICAgIGlmIChYUXVlcnlQb2ludGVyKCBkaXNwbGF5LCByb290V2luZG93LCAmcm9vdCwgJmNoaWxkLAorICAgIGlmIChUU1hRdWVyeVBvaW50ZXIoIGRpc3BsYXksIHJvb3RXaW5kb3csICZyb290LCAmY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICZyb290WCwgJnJvb3RZLCAmd2luWCwgJndpblksICZzdGF0ZSApKQogICAgIHsKICAgICAgICAgaGFyZHdhcmVfZXZlbnQoIFdNX01PVVNFTU9WRSwgRVZFTlRfWFN0YXRlVG9LZXlTdGF0ZSggc3RhdGUgKSwgMEwsCkBAIC03NDIsOSArNzU1LDkgQEAKICAgICBXaW5kb3cgeFc7CiAgICAgaW50CSAgIHN0YXRlOwogCi0gICAgWEdldElucHV0Rm9jdXMoZGlzcGxheSwgJnhXLCAmc3RhdGUpOworICAgIFRTWEdldElucHV0Rm9jdXMoZGlzcGxheSwgJnhXLCAmc3RhdGUpOwogICAgIGlmKCB4VyA9PSBOb25lIHx8Ci0gICAgICAgIFhGaW5kQ29udGV4dChkaXNwbGF5LCB4Vywgd2luQ29udGV4dCwgKGNoYXIgKiopJnBXbmQpICkgCisgICAgICAgIFRTWEZpbmRDb250ZXh0KGRpc3BsYXksIHhXLCB3aW5Db250ZXh0LCAoY2hhciAqKikmcFduZCkgKSAKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtNzYzLDcgKzc3Niw3IEBACiAgICAgaW50IHhwb3MsIHlwb3M7CiAgICAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZGVwdGgsIG5iX2NoaWxkcmVuOwogCi0gICAgaWYgKCFYR2V0R2VvbWV0cnkoIGRpc3BsYXksIHdpbiwgJnJvb3QsIHB4LCBweSwgcHdpZHRoLCBwaGVpZ2h0LAorICAgIGlmICghVFNYR2V0R2VvbWV0cnkoIGRpc3BsYXksIHdpbiwgJnJvb3QsIHB4LCBweSwgcHdpZHRoLCBwaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAmYm9yZGVyLCAmZGVwdGggKSkgcmV0dXJuOwogICAgIGlmICh3aW4gPT0gcm9vdFdpbmRvdykKICAgICB7CkBAIC03NzMsMTIgKzc4NiwxMiBAQAogCiAgICAgZm9yICg7OykKICAgICB7Ci0gICAgICAgIGlmICghWFF1ZXJ5VHJlZShkaXNwbGF5LCB3aW4sICZyb290LCAmcGFyZW50LCAmY2hpbGRyZW4sICZuYl9jaGlsZHJlbikpCisgICAgICAgIGlmICghVFNYUXVlcnlUcmVlKGRpc3BsYXksIHdpbiwgJnJvb3QsICZwYXJlbnQsICZjaGlsZHJlbiwgJm5iX2NoaWxkcmVuKSkKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgWEZyZWUoIGNoaWxkcmVuICk7CisgICAgICAgIFRTWEZyZWUoIGNoaWxkcmVuICk7CiAgICAgICAgIGlmIChwYXJlbnQgPT0gcm9vdFdpbmRvdykgYnJlYWs7CiAgICAgICAgIHdpbiA9IHBhcmVudDsKLSAgICAgICAgaWYgKCFYR2V0R2VvbWV0cnkoIGRpc3BsYXksIHdpbiwgJnJvb3QsICZ4cG9zLCAmeXBvcywKKyAgICAgICAgaWYgKCFUU1hHZXRHZW9tZXRyeSggZGlzcGxheSwgd2luLCAmcm9vdCwgJnhwb3MsICZ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLCAmaGVpZ2h0LCAmYm9yZGVyLCAmZGVwdGggKSkgcmV0dXJuOwogICAgICAgICAqcHggKz0geHBvczsKICAgICAgICAgKnB5ICs9IHlwb3M7CkBAIC05MDcsNyArOTIwLDcgQEAKIAkgICAgfQogCSAgICBscHN0cltqXT0nXDAnOwogCi0JICAgIFhDaGFuZ2VQcm9wZXJ0eShkaXNwbGF5LCByZXF1ZXN0LCBycHJvcCwgCisJICAgIFRTWENoYW5nZVByb3BlcnR5KGRpc3BsYXksIHJlcXVlc3QsIHJwcm9wLCAKIAkJCSAgICBYQV9TVFJJTkcsIDgsIFByb3BNb2RlUmVwbGFjZSwgCiAJCQkgICAgbHBzdHIsIGopOwogCSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBzdHIgKTsKQEAgLTkxOSw3ICs5MzIsNyBAQAogICAgIH0KIAogICAgIGlmKHJwcm9wID09IE5vbmUpIAotICAgICAgIGRwcmludGZfZXZlbnQoc3RkZGViLCJSZXF1ZXN0IGZvciAlcyBpZ25vcmVkXG4iLCBYR2V0QXRvbU5hbWUoZGlzcGxheSxldmVudC0+dGFyZ2V0KSk7CisgICAgICAgZHByaW50Zl9ldmVudChzdGRkZWIsIlJlcXVlc3QgZm9yICVzIGlnbm9yZWRcbiIsIFRTWEdldEF0b21OYW1lKGRpc3BsYXksZXZlbnQtPnRhcmdldCkpOwogCiAgICAgcmVzdWx0LnR5cGUgPSBTZWxlY3Rpb25Ob3RpZnk7CiAgICAgcmVzdWx0LmRpc3BsYXkgPSBkaXNwbGF5OwpAQCAtOTI4LDcgKzk0MSw3IEBACiAgICAgcmVzdWx0LnByb3BlcnR5ID0gcnByb3A7CiAgICAgcmVzdWx0LnRhcmdldCA9IGV2ZW50LT50YXJnZXQ7CiAgICAgcmVzdWx0LnRpbWUgPSBldmVudC0+dGltZTsKLSAgICBYU2VuZEV2ZW50KGRpc3BsYXksZXZlbnQtPnJlcXVlc3RvcixGYWxzZSxOb0V2ZW50TWFzaywoWEV2ZW50KikmcmVzdWx0KTsKKyAgICBUU1hTZW5kRXZlbnQoZGlzcGxheSxldmVudC0+cmVxdWVzdG9yLEZhbHNlLE5vRXZlbnRNYXNrLChYRXZlbnQqKSZyZXN1bHQpOwogfQogCiAKQEAgLTk4Nyw3ICsxMDAwLDcgQEAKIAkgIAogICAgICAgICAgIGlmKCAhbHBEcmFnSW5mbyB8fCAhc3BEcmFnSW5mbyApIHJldHVybjsKIAotCSAgWFF1ZXJ5UG9pbnRlciggZGlzcGxheSwgcFduZC0+d2luZG93LCAmd19hdXhfcm9vdCwgJndfYXV4X2NoaWxkLCAKKwkgIFRTWFF1ZXJ5UG9pbnRlciggZGlzcGxheSwgcFduZC0+d2luZG93LCAmd19hdXhfcm9vdCwgJndfYXV4X2NoaWxkLCAKIAkJICZ4LCAmeSwgJnUucHRfYXV4LngsICZ1LnB0X2F1eC55LCAodW5zaWduZWQgaW50KikmYXV4X2xvbmcpOwogCiAgICAgICAgICAgbHBEcmFnSW5mby0+aFNjb3BlID0gcFduZC0+aHduZFNlbGY7CkBAIC0xMDA4LDcgKzEwMjEsNyBAQAogCiAJICBpZiggYkFjY2VwdCApCiAJICB7Ci0JICAgICAgWEdldFdpbmRvd1Byb3BlcnR5KCBkaXNwbGF5LCBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSwKKwkgICAgICBUU1hHZXRXaW5kb3dQcm9wZXJ0eSggZGlzcGxheSwgRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSksCiAJCQkgICAgICBkbmRTZWxlY3Rpb24sIDAsIDY1NTM1LCBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFueVByb3BlcnR5VHlwZSwgJnUuYXRvbV9hdXgsICZ1LnB0X2F1eC55LAogCQkgICAgICAgICAgICAgJmRhdGFfbGVuZ3RoLCAmYXV4X2xvbmcsICZwX2RhdGEpOwpAQCAtMTA2OSw3ICsxMDgyLDcgQEAKIAkJICB9CiAJICAgICAgICB9CiAJICAgICAgfQotCSAgICAgIGlmKCBwX2RhdGEgKSBYRnJlZShwX2RhdGEpOyAgCisJICAgICAgaWYoIHBfZGF0YSApIFRTWEZyZWUocF9kYXRhKTsgIAogCiAJICB9IC8qIFdTX0VYX0FDQ0VQVEZJTEVTICovCiAgICAgICAgfSAvKiBkbmRQcm90b2NvbCAqLwpAQCAtMTA4OSw3ICsxMTAyLDcgQEAKICAgewogICAgaWYoICFPcHRpb25zLm1hbmFnZWQgJiYgcm9vdFdpbmRvdyA9PSBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSAmJgogICAgICAoQ09MT1JfR2V0U3lzdGVtUGFsZXR0ZUZsYWdzKCkgJiBDT0xPUl9QUklWQVRFKSAmJiBHZXRGb2N1czMyKCkgKQotICAgICAgWEluc3RhbGxDb2xvcm1hcCggZGlzcGxheSwgQ09MT1JfR2V0Q29sb3JtYXAoKSApOworICAgICAgVFNYSW5zdGFsbENvbG9ybWFwKCBkaXNwbGF5LCBDT0xPUl9HZXRDb2xvcm1hcCgpICk7CiAgIH0KICAqLyAKIApAQCAtMTExOSw3ICsxMTMyLDcgQEAKIAogICAgIGlmICghaHduZCkKICAgICB7Ci0gICAgICAgIFhVbmdyYWJQb2ludGVyKGRpc3BsYXksIEN1cnJlbnRUaW1lICk7CisgICAgICAgIFRTWFVuZ3JhYlBvaW50ZXIoZGlzcGxheSwgQ3VycmVudFRpbWUgKTsKICAgICAgICAgY2FwdHVyZVduZCA9IE5VTEw7IGNhcHR1cmVIVCA9IDA7IAogICAgIH0KICAgICBlbHNlIGlmICgod2luID0gV0lOX0dldFhXaW5kb3coIGh3bmQgKSkpCkBAIC0xMTI3LDcgKzExNDAsNyBAQAogCVdORCogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIAogICAgICAgICBpZiAoIHduZFB0ciAmJiAKLQkgICAgIChYR3JhYlBvaW50ZXIoZGlzcGxheSwgd2luLCBGYWxzZSwgCisJICAgICAoVFNYR3JhYlBvaW50ZXIoZGlzcGxheSwgd2luLCBGYWxzZSwgCiAJCQkgICBCdXR0b25QcmVzc01hc2sgfCBCdXR0b25SZWxlYXNlTWFzayB8IFBvaW50ZXJNb3Rpb25NYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhYk1vZGVBc3luYywgR3JhYk1vZGVBc3luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsIEN1cnJlbnRUaW1lICkgPT0gR3JhYlN1Y2Nlc3MpICkKQEAgLTEyMzEsMTEgKzEyNDQsMTEgQEAKICAgICBpZiAoQVhfcmVnKGNvbnRleHQpICYgTUVfTU9WRSkKICAgICB7CiAgICAgICAgIC8qIFdlIGhhdmUgdG8gYWN0dWFsbHkgbW92ZSB0aGUgY3Vyc29yICovCi0gICAgICAgIFhXYXJwUG9pbnRlciggZGlzcGxheSwgcm9vdFdpbmRvdywgTm9uZSwgMCwgMCwgMCwgMCwKKyAgICAgICAgVFNYV2FycFBvaW50ZXIoIGRpc3BsYXksIHJvb3RXaW5kb3csIE5vbmUsIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KUJYX3JlZyhjb250ZXh0KSwgKHNob3J0KUNYX3JlZyhjb250ZXh0KSApOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmICghWFF1ZXJ5UG9pbnRlciggZGlzcGxheSwgcm9vdFdpbmRvdywgJnJvb3QsICZjaGlsZCwKKyAgICBpZiAoIVRTWFF1ZXJ5UG9pbnRlciggZGlzcGxheSwgcm9vdFdpbmRvdywgJnJvb3QsICZjaGlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICZyb290WCwgJnJvb3RZLCAmd2luWCwgJndpblksICZzdGF0ZSApKSByZXR1cm47CiAgICAgaWYgKEFYX3JlZyhjb250ZXh0KSAmIE1FX0xET1dOKQogICAgICAgICBoYXJkd2FyZV9ldmVudCggV01fTEJVVFRPTkRPV04sIEVWRU5UX1hTdGF0ZVRvS2V5U3RhdGUoIHN0YXRlICksCmRpZmYgLS1naXQgYS93aW5kb3dzL2ZvY3VzLmMgYi93aW5kb3dzL2ZvY3VzLmMKaW5kZXggOWY3YmI5Yi4uMzhlZjVjNSAxMDA2NDQKLS0tIGEvd2luZG93cy9mb2N1cy5jCisrKyBiL3dpbmRvd3MvZm9jdXMuYwpAQCAtMzQsMjAgKzM0LDIwIEBACiAgICAgaWYgKCFod25kKQkvKiBJZiBzZXR0aW5nIHRoZSBmb2N1cyB0byAwLCB1bmluc3RhbGwgdGhlIGNvbG9ybWFwICovCiAgICAgewogCWlmIChDT0xPUl9HZXRTeXN0ZW1QYWxldHRlRmxhZ3MoKSAmIENPTE9SX1BSSVZBVEUpCi0JICAgIFhVbmluc3RhbGxDb2xvcm1hcCggZGlzcGxheSwgQ09MT1JfR2V0Q29sb3JtYXAoKSApOworCSAgICBUU1hVbmluc3RhbGxDb2xvcm1hcCggZGlzcGxheSwgQ09MT1JfR2V0Q29sb3JtYXAoKSApOwogCXJldHVybjsKICAgICB9CiAKICAgICAgIC8qIFNldCBYIGZvY3VzIGFuZCBpbnN0YWxsIGNvbG9ybWFwICovCiAKICAgICBpZiAoISh3aW4gPSBXSU5fR2V0WFdpbmRvdyggaHduZCApKSkgcmV0dXJuOwotICAgIGlmICghWEdldFdpbmRvd0F0dHJpYnV0ZXMoIGRpc3BsYXksIHdpbiwgJndpbl9hdHRyICkgfHwKKyAgICBpZiAoIVRTWEdldFdpbmRvd0F0dHJpYnV0ZXMoIGRpc3BsYXksIHdpbiwgJndpbl9hdHRyICkgfHwKICAgICAgICAgKHdpbl9hdHRyLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSkKICAgICAgICAgcmV0dXJuOyAgLyogSWYgd2luZG93IGlzIG5vdCB2aWV3YWJsZSwgZG9uJ3QgY2hhbmdlIGFueXRoaW5nICovCiAKLSAgICBYU2V0SW5wdXRGb2N1cyggZGlzcGxheSwgd2luLCBSZXZlcnRUb1BhcmVudCwgQ3VycmVudFRpbWUgKTsKKyAgICBUU1hTZXRJbnB1dEZvY3VzKCBkaXNwbGF5LCB3aW4sIFJldmVydFRvUGFyZW50LCBDdXJyZW50VGltZSApOwogICAgIGlmIChDT0xPUl9HZXRTeXN0ZW1QYWxldHRlRmxhZ3MoKSAmIENPTE9SX1BSSVZBVEUpCi0gICAgICAgIFhJbnN0YWxsQ29sb3JtYXAoIGRpc3BsYXksIENPTE9SX0dldENvbG9ybWFwKCkgKTsKKyAgICAgICAgVFNYSW5zdGFsbENvbG9ybWFwKCBkaXNwbGF5LCBDT0xPUl9HZXRDb2xvcm1hcCgpICk7CiAKICAgICBFVkVOVF9TeW5jaHJvbml6ZSgpOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ncmFwaGljcy5jIGIvd2luZG93cy9ncmFwaGljcy5jCmluZGV4IGE0OTUzYzYuLmUzZTFkMjUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZ3JhcGhpY3MuYworKysgYi93aW5kb3dzL2dyYXBoaWNzLmMKQEAgLTcsOCArNyw4IEBACiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKKyNpbmNsdWRlICJ0c194dXRpbC5oIgogI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KICNpbmNsdWRlICJncmFwaGljcy5oIgogI2luY2x1ZGUgImNvbG9yLmgiCkBAIC00OCw3ICs0OCw3IEBACiAJCSBsW2ldLnkxID0gcFhZW2pdLnkgKyBkYy0+dy5EQ09yZ1k7CiAJCSBsW2ldLnkyID0gcFhZW2ogKyAxXS55ICsgZGMtPncuRENPcmdZOwogCSAgICB9Ci0JICAgIFhEcmF3U2VnbWVudHMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIGwsIE4gKTsKKwkgICAgVFNYRHJhd1NlZ21lbnRzKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCBsLCBOICk7CiAJICAgIGJSZXQgPSBUUlVFOwogCX0KIAlpZiggaFByZXZQZW4gKSBTZWxlY3RPYmplY3QzMiggaGRjLCBoUHJldlBlbiApOwpAQCAtNzYsMTIgKzc2LDEyIEBACiAKICAgICB4ZGVzdCArPSBkYy0+dy5EQ09yZ1g7IHlkZXN0ICs9IGRjLT53LkRDT3JnWTsKIAotICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgZGMtPnUueC5nYywgR1hjb3B5ICk7CisgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOwogICAgIGlmIChibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCA9PSAxKQogICAgIHsKLSAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LmJhY2tncm91bmRQaXhlbCApOwotICAgICAgICBYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncudGV4dFBpeGVsICk7Ci0gICAgICAgIFhDb3B5UGxhbmUoIGRpc3BsYXksIGJtcC0+cGl4bWFwLCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICBUU1hTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKKyAgICAgICAgVFNYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncudGV4dFBpeGVsICk7CisgICAgICAgIFRTWENvcHlQbGFuZSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgIHhzcmMsIHlzcmMsIHdpZHRoLCBoZWlnaHQsIHhkZXN0LCB5ZGVzdCwgMSApOwogICAgIH0KICAgICBlbHNlIGlmIChibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCA9PSBkYy0+dy5iaXRzUGVyUGl4ZWwpCkBAIC05MiwxOSArOTIsMTkgQEAKIAogCSAgICBpZiggQ09MT1JfR2V0TW9ub1BsYW5lKCZwbGFuZSkgKQogCSAgICB7Ci0JCVhTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKLQkJWFNldEJhY2tncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LnRleHRQaXhlbCApOworCQlUU1hTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKKwkJVFNYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncudGV4dFBpeGVsICk7CiAJICAgIH0KIAkgICAgZWxzZQogCSAgICB7Ci0JCVhTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy50ZXh0UGl4ZWwgKTsKLQkJWFNldEJhY2tncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LmJhY2tncm91bmRQaXhlbCApOworCQlUU1hTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy50ZXh0UGl4ZWwgKTsKKwkJVFNYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncuYmFja2dyb3VuZFBpeGVsICk7CiAJICAgIH0KLQkgICAgWENvcHlQbGFuZSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJICAgIFRTWENvcHlQbGFuZSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAJCQl4c3JjLCB5c3JjLCB3aWR0aCwgaGVpZ2h0LCB4ZGVzdCwgeWRlc3QsIHBsYW5lICk7CiAJfQogCWVsc2UgCi0JICAgIFhDb3B5QXJlYSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIAorCSAgICBUU1hDb3B5QXJlYSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIAogCQkgICAgICAgZGMtPnUueC5nYywgeHNyYywgeXNyYywgd2lkdGgsIGhlaWdodCwgeGRlc3QsIHlkZXN0ICk7CiAgICAgfQogICAgIGVsc2UgCkBAIC0xNjksMTIgKzE2OSwxMiBAQAogICAgIHsKICAgICAgICAgIElOVDMyCWk7CiAKLQkgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBHWGNvcHkgKTsKKwkgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhpZ2hsaWdodF9zaXplOyBpKyspCiAgICAgICAgICB7Ci0JICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJICAgICAgVFNYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKIAkJCQkJci5sZWZ0ICsgaSwgci50b3AsIDEsIGggLSBpICk7Ci0JICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJICAgICAgVFNYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKIAkJCQkJci5sZWZ0LCByLnRvcCArIGksIHcgLSBpLCAxICk7CiAgICAgICAgICB9CiAgICAgfQpAQCAtMTg0LDEyICsxODQsMTIgQEAKICAgICB7CiAJIElOVDMyCWk7CiAKLQkgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBHWGNvcHkgKTsKKwkgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNoYWRvd19zaXplOyBpKyspCiAgICAgICAgICB7Ci0JICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJICAgICAgVFNYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKIAkJCSAgICAgIHIucmlnaHQgLSBpIC0gMSwgci50b3AgKyBpLCAxLCBoIC0gaSApOwotCSAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCSAgICAgIFRTWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAJCQkgICAgICByLmxlZnQgKyBpLCByLmJvdHRvbSAtIGkgLSAxLCB3IC0gaSwgMSApOwogICAgICAgICAgfQogICAgIH0KQEAgLTIxMyw3ICsyMTMsNyBAQAogCiAJaWYoIGhQZW4gKSBoUHJldlBlbiA9IFNlbGVjdE9iamVjdDMyKCBoZGMsIGhQZW4gKTsKIAlpZiggRENfU2V0dXBHQ0ZvclBlbiggZGMgKSApCi0JICAgIFhEcmF3UmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKKwkgICAgVFNYRHJhd1JlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCiAJCQkgICAgeCArIGRjLT53LkRDT3JnWCwgeSArIGRjLT53LkRDT3JnWSwgdyAtIDEsIGggLSAxKTsKIAlpZiggaFByZXZQZW4gKSBTZWxlY3RPYmplY3QzMiggaGRjLCBoUHJldlBlbiApOwogICAgIH0KQEAgLTIzMywxMCArMjMzLDEwIEBACiAgICAgICAgaWYgKCAhKGJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaE1vbm9CaXRtYXAsIEJJVE1BUF9NQUdJQykpIAogCSAgIHx8IGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsICE9IDEgKSByZXR1cm4gRkFMU0U7CiAJICAKLSAgICAgICBYU2V0Q2xpcE9yaWdpbiggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncuRENPcmdYICsgeCwgZGMtPncuRENPcmdZICsgeSk7CisgICAgICAgVFNYU2V0Q2xpcE9yaWdpbiggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncuRENPcmdYICsgeCwgZGMtPncuRENPcmdZICsgeSk7CiAgICAgfQogCi0gICAgWFNldENsaXBNYXNrKCBkaXNwbGF5LCBkYy0+dS54LmdjLCAoYm1wKSA/IGJtcC0+cGl4bWFwIDogTm9uZSApOworICAgIFRTWFNldENsaXBNYXNrKCBkaXNwbGF5LCBkYy0+dS54LmdjLCAoYm1wKSA/IGJtcC0+cGl4bWFwIDogTm9uZSApOwogCiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoTW9ub0JpdG1hcCApOwogICAgIHJldHVybiBUUlVFOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9ob29rLmMgYi93aW5kb3dzL2hvb2suYwppbmRleCAwZmE4NTRkLi5lYmYyMGM2IDEwMDY0NAotLS0gYS93aW5kb3dzL2hvb2suYworKysgYi93aW5kb3dzL2hvb2suYwpAQCAtOTksNiArOTksNyBAQAogICAgICAgICAgICAgZWxzZSBXSU5QUk9DX01hcE1zZzE2VG8zMlcoIGxwY3dwMTYtPm1lc3NhZ2UsIGxwY3dwMTYtPndQYXJhbSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwY3dwMzItPm1lc3NhZ2UsICZscGN3cDMyLT53UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwY3dwMzItPmxQYXJhbSApOworCSAgICAqcGxQYXJhbSA9IChMUEFSQU0pbHBjd3AzMjsKIAkgICAgYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL2tleWJvYXJkLmMgYi93aW5kb3dzL2tleWJvYXJkLmMKaW5kZXggMmYyZjU5NC4uZmFhZGM3ZCAxMDA2NDQKLS0tIGEvd2luZG93cy9rZXlib2FyZC5jCisrKyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwpAQCAtMTIsOSArMTIsOSBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8WDExL2tleXN5bS5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKKyNpbmNsdWRlICJ0c194cmVzb3VyY2UuaCIKKyNpbmNsdWRlICJ0c194dXRpbC5oIgogI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgpAQCAtMTA3LDcgKzEwNyw3IEBACiAvKgogICogVGFibGUgZm9yIHZrZXkgdG8gc2NhbmNvZGUgdHJhbnNsYXRpb24gLSA1LzI5Lzk3IGNocmlzZkBhbWVyaWNhLmNvbSAKICAqLwotc3RhdGljIGNvbnN0IEJZVEUgdmtleTJzY29kZVs1MTJdID0geworY29uc3QgQllURSB2a2V5MnNjb2RlWzUxMl0gPSB7CiAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgMHgwZSwweDBmLDB4MDAsMHgwMCwweDAwLDB4MWMsMHgwMCwweDAwLAogICAweDJhLDB4MWQsMHgzOCwweDAwLDB4M2EsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwKICAgMHgzOSwweDQ5LDB4NTEsMHg0ZiwweDQ3LDB4NGIsMHg0OCwweDRkLCAweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MiwweDUzLDB4MDAsCkBAIC0xNDcsNyArMTQ3LDcgQEAKIHsKICAgICBLZXlTeW0ga2V5c3ltOwogCi0gICAgWExvb2t1cFN0cmluZyhlLCBOVUxMLCAwLCAma2V5c3ltLCBOVUxMKTsKKyAgICBUU1hMb29rdXBTdHJpbmcoZSwgTlVMTCwgMCwgJmtleXN5bSwgTlVMTCk7CiAKICAgICBpZiAoKGtleXN5bSA+PSAweEZGQUUpICYmIChrZXlzeW0gPD0gMHhGRkI5KSAmJiAoZS0+c3RhdGUgJiBOdW1Mb2NrTWFzaykpIAogICAgICAgICAvKiBPbmx5IHRoZSBLZXlwYWQga2V5cyAwLTkgYW5kIC4gc2VuZCBkaWZmZXJlbnQga2V5c3ltcwpAQCAtMTcwLDEzICsxNzAsMTMgQEAKICAgICBYS2V5RXZlbnQgZTI7CiAgICAgV09SRCB2a2V5LCBPRU12a2V5OwogCi0gICAgWERpc3BsYXlLZXljb2RlcyhkaXNwbGF5LCAmbWluX2tleWNvZGUsICZtYXhfa2V5Y29kZSk7Ci0gICAga3NwID0gWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKKyAgICBUU1hEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOworICAgIGtzcCA9IFRTWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9rZXljb2RlICsgMSAtIG1pbl9rZXljb2RlLCAma2V5c3ltc19wZXJfa2V5Y29kZSk7CiAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBrZXlzeW1zX3Blcl9rZXljb2RlLgogICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIGxvY2FsIGNvcHkgb2YgdGhlIGtleXN5bXMgdGFibGUgKi8KLSAgICBYRnJlZShrc3ApOwotICAgIG1tcCA9IFhHZXRNb2RpZmllck1hcHBpbmcoZGlzcGxheSk7CisgICAgVFNYRnJlZShrc3ApOworICAgIG1tcCA9IFRTWEdldE1vZGlmaWVyTWFwcGluZyhkaXNwbGF5KTsKICAgICBrY3AgPSBtbXAtPm1vZGlmaWVybWFwOwogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDEpIC8qIFRoZXJlIGFyZSA4IG1vZGlmaWVyIGtleXMgKi8KICAgICB7CkBAIC0xODgsMTkgKzE4OCwxOSBAQAogCQlpbnQgazsKICAgICAgICAgICAgICAgICAKIAkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTW9kZV9zd2l0Y2gpCisgICAgICAgICAgICAgICAgICAgIGlmIChUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTW9kZV9zd2l0Y2gpCiAJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBbHRHck1hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2tleShzdGRkZWIsICJBbHRHck1hc2sgaXMgJXhcbiIsIEFsdEdyTWFzayk7CiAJCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTnVtX0xvY2spCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19OdW1fTG9jaykKIAkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIE51bUxvY2tNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiTnVtTG9ja01hc2sgaXMgJXhcbiIsIE51bUxvY2tNYXNrKTsKIAkJICAgIH0KICAgICAgICAgICAgIH0KICAgICB9Ci0gICAgWEZyZWVNb2RpZmllcm1hcChtbXApOworICAgIFRTWEZyZWVNb2RpZmllcm1hcChtbXApOwogCiAgICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgICoga2V5Y29kZSAtPiB2a2V5ICsgZXh0ZW5kZWQKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgIE9FTXZrZXkgPSAweGI5OyAvKiBmaXJzdCBPRU0gdmlydHVhbCBrZXkgYXZhaWxhYmxlIGlzIGJhICovCiAgICAgZm9yIChlMi5rZXljb2RlPW1pbl9rZXljb2RlOyBlMi5rZXljb2RlPD1tYXhfa2V5Y29kZTsgZTIua2V5Y29kZSsrKQogICAgIHsKLSAgICAgICAgWExvb2t1cFN0cmluZygmZTIsIE5VTEwsIDAsICZrZXlzeW0sIE5VTEwpOworICAgICAgICBUU1hMb29rdXBTdHJpbmcoJmUyLCBOVUxMLCAwLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICAgdmtleSA9IDA7CiAgICAgICAgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KICAgICAgICAgewpAQCAtMjYzLDcgKzI2Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CisgICAgICAgICAgICAgICAga2V5c3ltID0gVFNYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICAgaWYgKChrZXlzeW0gPj0gVktfMCAmJiBrZXlzeW0gPD0gVktfOSkKICAgICAgICAgICAgICAgICAgICAgfHwgKGtleXN5bSA+PSBWS19BICYmIGtleXN5bSA8PSBWS19aKQogICAgICAgICAgICAgICAgICAgICB8fCBrZXlzeW0gPT0gVktfU1BBQ0UpCkBAIC0yOTEsOCArMjkxLDggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgY2hhcgkqa3NuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXN5bSA9IFRTWExvb2t1cEtleXN5bSgmZTIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gVFNYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha3NuYW1lKQogCQkJICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGRlYiwgIiVsWCAoJXMpICIsIGtleXN5bSwga3NuYW1lKTsKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgIEtFWUxQIGtleWxwOwogICAgIHN0YXRpYyBCT09MMzIgZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsgLyogaGFjayBmb3IgQWx0R3IgdHJhbnNsYXRpb24gKi8KIAotICAgIGludCBhc2NpaV9jaGFycyA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgMSwgJmtleXN5bSwgJmNzKTsKKyAgICBpbnQgYXNjaWlfY2hhcnMgPSBUU1hMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgMSwgJmtleXN5bSwgJmNzKTsKIAogICAgIElOVDMyIGV2ZW50X3ggPSBwV25kLT5yZWN0V2luZG93LmxlZnQgKyBldmVudC0+eDsKICAgICBJTlQzMiBldmVudF95ID0gcFduZC0+cmVjdFdpbmRvdy50b3AgKyBldmVudC0+eTsKQEAgLTM3NiwxMCArMzc2LDEwIEBACiAgICAgaWYgKGtleXN5bSA9PSBYS19Nb2RlX3N3aXRjaCkKIAl7CiAJZHByaW50Zl9rZXkoc3RkZGViLCAiQWx0IEdyIGtleSBldmVudCByZWNlaXZlZFxuIik7Ci0JZXZlbnQtPmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGV2ZW50LT5kaXNwbGF5LCBYS19Db250cm9sX0wpOworCWV2ZW50LT5rZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGV2ZW50LT5kaXNwbGF5LCBYS19Db250cm9sX0wpOwogCWRwcmludGZfa2V5KHN0ZGRlYiwgIkNvbnRyb2xfTCBpcyBrZXljb2RlIDB4JXhcbiIsIGV2ZW50LT5rZXljb2RlKTsKIAlLRVlCT0FSRF9IYW5kbGVFdmVudCggcFduZCwgZXZlbnQgKTsKLQlldmVudC0+a2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZXZlbnQtPmRpc3BsYXksIFhLX0FsdF9MKTsKKwlldmVudC0+a2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShldmVudC0+ZGlzcGxheSwgWEtfQWx0X0wpOwogCWRwcmludGZfa2V5KHN0ZGRlYiwgIkFsdF9MIGlzIGtleWNvZGUgMHgleFxuIiwgZXZlbnQtPmtleWNvZGUpOwogCWZvcmNlX2V4dGVuZGVkID0gVFJVRTsKIAlLRVlCT0FSRF9IYW5kbGVFdmVudCggcFduZCwgZXZlbnQgKTsKQEAgLTM5Miw3ICszOTIsNyBAQAogCXsKIAljaGFyCSprc25hbWU7CiAKLQlrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKKwlrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogCWlmICgha3NuYW1lKQogCSAgICBrc25hbWUgPSAiTm8gTmFtZSI7CiAJZnByaW50ZihzdGRkZWIsICIlcyA6IGtleXN5bT0lbFggKCVzKSwgYXNjaWkgY2hhcnM9JXUgLyAlWCAvICclcydcbiIsIApAQCAtODE3LDEwICs4MTcsMTAgQEAKIAlrZXlzeW09KHVuc2lnbmVkIGNoYXIpIGNDaGFyOy8qICghKSBjQ2hhciBpcyBzaWduZWQgKi8KIAlpZiAoa2V5c3ltPD0yNykga2V5c3ltKz0weEZGMDA7LypzcGVjaWFsIGNoYXJzIDogcmV0dXJuLCBiYWNrc3BhY2UuLi4qLwogCQotCWtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSk7ICAvKiBrZXlzeW0gLT4ga2V5Y29kZSAqLworCWtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltKTsgIC8qIGtleXN5bSAtPiBrZXljb2RlICovCiAJaWYgKCFrZXljb2RlKQogCXsgLyogSXQgZGlkbid0IHdvcmsgLi4uIGxldCdzIHRyeSB3aXRoIGRlYWRjaGFyIGNvZGUuICovCi0JICBrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOworCSAga2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOwogCX0KIAogCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJWa0tleVNjYW4gJyVjJyglI2x4LCAlbHUpIDogZ290IGtleWNvZGUgJSMuMnggIiwKQEAgLTgyOSw3ICs4MjksNyBAQAogCWlmIChrZXljb2RlKQogCSAgewogCSAgICBmb3IgKGluZGV4PS0xLCBpPTA7IChpPDgpICYmIChpbmRleDwwKTsgaSsrKSAvKiBmaW5kIHNoaWZ0IHN0YXRlICovCi0JICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSxrZXljb2RlLGkpPT1rZXlzeW0pIGluZGV4PWk7CisJICAgICAgaWYgKFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LGtleWNvZGUsaSk9PWtleXN5bSkgaW5kZXg9aTsKIAkgICAgc3dpdGNoIChpbmRleCkgewogCSAgICBjYXNlIC0xIDoKIAkgICAgICBmcHJpbnRmKHN0ZGVyciwiS2V5c3ltICVseCBub3QgZm91bmQgd2hpbGUgcGFyc2luZyB0aGUga2V5Y29kZSB0YWJsZVxuIixrZXlzeW0pOyBicmVhazsKQEAgLTk0Nyw3ICs5NDcsNyBAQAogCQkJZS5kaXNwbGF5ID0gZGlzcGxheTsKIAkJCWUuc3RhdGUgPSAwOyAvKiB1bnNoaWZ0ZWQgKi8KIAkJCWUua2V5Y29kZSA9IE1hcFZpcnR1YWxLZXkxNiggd0NvZGUsIDApOwotCQkJaWYgKCFYTG9va3VwU3RyaW5nKCZlLCBzICwgMiAsICZrZXlzeW0sIE5VTEwpKQorCQkJaWYgKCFUU1hMb29rdXBTdHJpbmcoJmUsIHMgLCAyICwgJmtleXN5bSwgTlVMTCkpCiAJCQkgIHJldHVybk1WSyAoKnMpOwogCQkJCiAJCQlyZXR1cm4gMDsKQEAgLTEwNjUsOSArMTA2NSw5IEBACiAgICAgaWYgKCghZS5rZXljb2RlKSAmJiAobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpKSAKICAgICAgIHsKIAlpZiAoKHZpcnRLZXk+PVZLX05VTVBBRDApICYmICh2aXJ0S2V5PD1WS19OVU1QQUQ5KSkKLQkgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CisJICBlLmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CiAJaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCi0JICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CisJICBlLmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKICAgICAgIH0KICAgICBpZiAoIWUua2V5Y29kZSkKICAgICAgIHsKQEAgLTEwODksNyArMTA4OSw3IEBACiAJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgICBkcHJpbnRmX2tleShzdGRkZWIsICJUb0FzY2lpKCUwNFgsICUwNFgpIDogZmFrZWQgc3RhdGUgPSAlWFxuIiwKIAkJdmlydEtleSwgc2NhbkNvZGUsIGUuc3RhdGUpOwotICAgIHJldCA9IFhMb29rdXBTdHJpbmcoJmUsIChMUFZPSUQpbHBDaGFyLCAyLCAma2V5c3ltLCAmY3MpOworICAgIHJldCA9IFRTWExvb2t1cFN0cmluZygmZSwgKExQVk9JRClscENoYXIsIDIsICZrZXlzeW0sICZjcyk7CiAgICAgaWYgKHJldCA9PSAwKQogCXsKIAlCWVRFIGRlYWRfY2hhciA9IDA7CkBAIC0xMTg5LDcgKzExODksNyBAQAogCSAgICB7CiAJICAgIGNoYXIJKmtzbmFtZTsKIAotCSAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKKwkgICAga3NuYW1lID0gVFNYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKIAkgICAgaWYgKCFrc25hbWUpCiAJCWtzbmFtZSA9ICJObyBOYW1lIjsKIAkgICAgaWYgKChrZXlzeW0gPj4gOCkgIT0gMHhmZikKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWRpLmMgYi93aW5kb3dzL21kaS5jCmluZGV4IGU5ZTE5ODAuLmUyMDQ5ZmQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWRpLmMKKysrIGIvd2luZG93cy9tZGkuYwpAQCAtMTYwMywyNiArMTYwMywyNiBAQAogICAgIElOVDMyIG5ld1BvcyA9IC0xOwogICAgIElOVDMyIGN1clBvcywgbGVuZ3RoLCBtaW5Qb3MsIG1heFBvcywgc2hpZnQ7CiAKLSBpZiggIXduZFB0ciApIHJldHVybjsKKyAgICBpZiggIXduZFB0ciApIHJldHVybjsKIAotIGlmKCB1TXNnID09IFdNX0hTQ1JPTEwgKQotICAgewotICAgICBHZXRTY3JvbGxSYW5nZTMyKGhXbmQsU0JfSE9SWiwmbWluUG9zLCZtYXhQb3MpOwotICAgICBjdXJQb3MgPSBHZXRTY3JvbGxQb3MzMihoV25kLFNCX0hPUlopOwotICAgICBsZW5ndGggPSAod25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQpLzI7Ci0gICAgIHNoaWZ0ID0gU1lTTUVUUklDU19DWUhTQ1JPTEw7Ci0gICB9Ci0gZWxzZSBpZiggdU1zZyA9PSBXTV9WU0NST0xMICkKLQl7Ci0JICBHZXRTY3JvbGxSYW5nZTMyKGhXbmQsU0JfVkVSVCwmbWluUG9zLCZtYXhQb3MpOwotCSAgY3VyUG9zID0gR2V0U2Nyb2xsUG9zMzIoaFduZCxTQl9WRVJUKTsKLQkgIGxlbmd0aCA9ICh3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcCkvMjsKLQkgIHNoaWZ0ID0gU1lTTUVUUklDU19DWFZTQ1JPTEw7Ci0JfQotICAgICAgZWxzZSByZXR1cm47CisgICAgaWYoIHVNc2cgPT0gV01fSFNDUk9MTCApCisgICAgeworCUdldFNjcm9sbFJhbmdlMzIoaFduZCxTQl9IT1JaLCZtaW5Qb3MsJm1heFBvcyk7CisJY3VyUG9zID0gR2V0U2Nyb2xsUG9zMzIoaFduZCxTQl9IT1JaKTsKKwlsZW5ndGggPSAod25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQpLzI7CisJc2hpZnQgPSBTWVNNRVRSSUNTX0NZSFNDUk9MTDsKKyAgICB9CisgICAgZWxzZSBpZiggdU1zZyA9PSBXTV9WU0NST0xMICkKKyAgICB7CisJR2V0U2Nyb2xsUmFuZ2UzMihoV25kLFNCX1ZFUlQsJm1pblBvcywmbWF4UG9zKTsKKwljdXJQb3MgPSBHZXRTY3JvbGxQb3MzMihoV25kLFNCX1ZFUlQpOworCWxlbmd0aCA9ICh3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcCkvMjsKKwlzaGlmdCA9IFNZU01FVFJJQ1NfQ1hWU0NST0xMOworICAgIH0KKyAgICBlbHNlIHJldHVybjsKIAotIHN3aXRjaCggd1BhcmFtICkKLSAgIHsKKyAgICBzd2l0Y2goIHdQYXJhbSApCisgICAgewogCWNhc2UgU0JfTElORVVQOgkKIAkJICAgICAgICBuZXdQb3MgPSBjdXJQb3MgLSBzaGlmdDsKIAkJCWJyZWFrOwpAQCAtMTY1MiwyMCArMTY1MiwyMSBAQAogCWNhc2UgU0JfRU5EU0NST0xMOgogCQkJQ2FsY0NoaWxkU2Nyb2xsKGhXbmQsKHVNc2cgPT0gV01fVlNDUk9MTCk/U0JfVkVSVDpTQl9IT1JaKTsKIAkJCXJldHVybjsKLSAgIH0KKyAgICB9CiAKLSBpZiggbmV3UG9zID4gbWF4UG9zICkKLSAgICAgbmV3UG9zID0gbWF4UG9zOwotIGVsc2UgaWYoIG5ld1BvcyA8IG1pblBvcyApCi0JICBuZXdQb3MgPSBtaW5Qb3M7CisgICAgaWYoIG5ld1BvcyA+IG1heFBvcyApCisJbmV3UG9zID0gbWF4UG9zOworICAgIGVsc2UgCisJaWYoIG5ld1BvcyA8IG1pblBvcyApCisJICAgIG5ld1BvcyA9IG1pblBvczsKIAotIFNldFNjcm9sbFBvczMyKGhXbmQsICh1TXNnID09IFdNX1ZTQ1JPTEwpP1NCX1ZFUlQ6U0JfSE9SWiAsIG5ld1BvcywgVFJVRSk7CisgICAgU2V0U2Nyb2xsUG9zMzIoaFduZCwgKHVNc2cgPT0gV01fVlNDUk9MTCk/U0JfVkVSVDpTQl9IT1JaICwgbmV3UG9zLCBUUlVFKTsKIAotIGlmKCB1TXNnID09IFdNX1ZTQ1JPTEwgKQotICAgICBTY3JvbGxXaW5kb3dFeDMyKGhXbmQgLDAgLGN1clBvcyAtIG5ld1BvcywgTlVMTCwgTlVMTCwgMCwgTlVMTCwgCisgICAgaWYoIHVNc2cgPT0gV01fVlNDUk9MTCApCisJU2Nyb2xsV2luZG93RXgzMihoV25kICwwICxjdXJQb3MgLSBuZXdQb3MsIE5VTEwsIE5VTEwsIDAsIE5VTEwsIAogCQkJU1dfSU5WQUxJREFURSB8IFNXX0VSQVNFIHwgU1dfU0NST0xMQ0hJTERSRU4gKTsKLSBlbHNlCi0gICAgIFNjcm9sbFdpbmRvd0V4MzIoaFduZCAsY3VyUG9zIC0gbmV3UG9zLCAwLCBOVUxMLCBOVUxMLCAwLCBOVUxMLAorICAgIGVsc2UKKwlTY3JvbGxXaW5kb3dFeDMyKGhXbmQgLGN1clBvcyAtIG5ld1BvcywgMCwgTlVMTCwgTlVMTCwgMCwgTlVMTCwKIAkJCVNXX0lOVkFMSURBVEUgfCBTV19FUkFTRSB8IFNXX1NDUk9MTENISUxEUkVOICk7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggMDhhNGQ3ZC4uMTY2ODcyMiAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTQ0OSw3ICs0NDksNyBAQAogICAgIGpveVNlbmRNZXNzYWdlcygpOwogCiAgICAgLyogSWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCBhdHRlbXB0IHRvIGZpbGwgaXQgKi8KLSAgICBpZiAoIXN5c01zZ1F1ZXVlLT5tc2dDb3VudCAmJiBYUGVuZGluZyhkaXNwbGF5KSkKKyAgICBpZiAoIXN5c01zZ1F1ZXVlLT5tc2dDb3VudCAmJiBUU1hQZW5kaW5nKGRpc3BsYXkpKQogICAgICAgICBFVkVOVF9XYWl0TmV0RXZlbnQoIEZBTFNFLCBGQUxTRSApOwogCiAgICAgZm9yIChpID0ga2JkX21zZyA9IDA7IGkgPCBzeXNNc2dRdWV1ZS0+bXNnQ291bnQ7IGkrKywgcG9zKyspCmRpZmYgLS1naXQgYS93aW5kb3dzL25vbmNsaWVudC5jIGIvd2luZG93cy9ub25jbGllbnQuYwppbmRleCA3MjBjMmFiLi4xNDVkZWQwIDEwMDY0NAotLS0gYS93aW5kb3dzL25vbmNsaWVudC5jCisrKyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKQEAgLTE1MTEsNyArMTUxMSw3IEBACiAgICAgZWxzZQogICAgIHsgIC8qIEdyYWIgdGhlIHNlcnZlciBvbmx5IHdoZW4gbW92aW5nIHRvcC1sZXZlbCB3aW5kb3dzIHdpdGhvdXQgZGVza3RvcCAqLwogCWhkYyA9IEdldERDMzIoIDAgKTsKLQlpZiAocm9vdFdpbmRvdyA9PSBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSkgWEdyYWJTZXJ2ZXIoIGRpc3BsYXkgKTsKKwlpZiAocm9vdFdpbmRvdyA9PSBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSkgVFNYR3JhYlNlcnZlciggZGlzcGxheSApOwogICAgIH0KIAogICAgIGlmKCBpY29uaWMgKSAvKiBjcmVhdGUgYSBjdXJzb3IgZm9yIGRyYWdnaW5nICovCkBAIC0xNjEwLDcgKzE2MTAsNyBAQAogICAgIGVsc2UKICAgICB7CiAJUmVsZWFzZURDMzIoIDAsIGhkYyApOwotCWlmIChyb290V2luZG93ID09IERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpKSBYVW5ncmFiU2VydmVyKCBkaXNwbGF5ICk7CisJaWYgKHJvb3RXaW5kb3cgPT0gRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSkpIFRTWFVuZ3JhYlNlcnZlciggZGlzcGxheSApOwogICAgIH0KIAogICAgIGlmIChIT09LX0lzSG9va2VkKCBXSF9DQlQgKSkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcGFpbnRpbmcuYyBiL3dpbmRvd3MvcGFpbnRpbmcuYwppbmRleCBmYmE3OTBiLi45YmFiYTU4IDEwMDY0NAotLS0gYS93aW5kb3dzL3BhaW50aW5nLmMKKysrIGIvd2luZG93cy9wYWludGluZy5jCkBAIC05LDggKzksNiBAQAogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0KICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJxdWV1ZS5oIgogI2luY2x1ZGUgImdkaS5oIgpkaWZmIC0tZ2l0IGEvd2luZG93cy9xdWV1ZS5jIGIvd2luZG93cy9xdWV1ZS5jCmluZGV4IDZjNmNmMzAuLmYyMzU0MmYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcXVldWUuYworKysgYi93aW5kb3dzL3F1ZXVlLmMKQEAgLTcxMiwxNCArNzEyLDkgQEAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIDA7CiAgICAgaHRhc2s9UVVFVUVfR2V0UXVldWVUYXNrKCB3bmRQdHItPmhtZW1UYXNrUSApOwogICAgIHRkYiA9IChUREIqKUdsb2JhbExvY2sxNihodGFzayk7Ci0gICAgaWYgKCF0ZGIpIHJldHVybiAwOwotICAgIGlmICh0ZGItPnRoZGIpIHsKLSAgICAJaWYgKHByb2Nlc3MpCi0JCSpwcm9jZXNzID0gKERXT1JEKXRkYi0+dGhkYi0+cHJvY2VzczsKLQlyZXR1cm4gKERXT1JEKXRkYi0+dGhkYjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0KKyAgICBpZiAoIXRkYiB8fCAhdGRiLT50aGRiKSByZXR1cm4gMDsKKyAgICBpZiAocHJvY2VzcykgKnByb2Nlc3MgPSBQREJfVE9fUFJPQ0VTU19JRCggdGRiLT50aGRiLT5wcm9jZXNzICk7CisgICAgcmV0dXJuIFRIREJfVE9fVEhSRUFEX0lEKCB0ZGItPnRoZGIgKTsKIH0KIAogCmRpZmYgLS1naXQgYS93aW5kb3dzL3Njcm9sbC5jIGIvd2luZG93cy9zY3JvbGwuYwppbmRleCBiNGRhYWU2Li5lZmUxY2MzIDEwMDY0NAotLS0gYS93aW5kb3dzL3Njcm9sbC5jCisrKyBiL3dpbmRvd3Mvc2Nyb2xsLmMKQEAgLTM5OSwxNSArMzk5LDE1IEBACiAJICAgIGVsc2Ugc3JjLnkgPSAoZHN0LnkgPSBkYy0+dy5EQ09yZ1kgKyBjbGlwcmMudG9wKSAtIGR5OwogCiAJICAgIGlmKCBiVXBkYXRlICkgLyogaGFuZGxlcyBub24tV2luZSB3aW5kb3dzIGhhbmdpbmcgb3ZlciB0aGUgc2Nyb2xsZWQgYXJlYSAqLwotCQlYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIFRydWUgKTsKKwkJVFNYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIFRydWUgKTsKIAotCSAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOwotCSAgICBYQ29weUFyZWEoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAorCSAgICBUU1hTZXRGdW5jdGlvbiggZGlzcGxheSwgZGMtPnUueC5nYywgR1hjb3B5ICk7CisJICAgIFRTWENvcHlBcmVhKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKIAkJICAgICAgIHNyYy54LCBzcmMueSwgY2xpcHJjLnJpZ2h0IC0gY2xpcHJjLmxlZnQgLSBhYnMoZHgpLAogCQkgICAgICAgY2xpcHJjLmJvdHRvbSAtIGNsaXByYy50b3AgLSBhYnMoZHkpLCBkc3QueCwgZHN0LnkgKTsKIAogCSAgICBpZiggYlVwZGF0ZSApCi0JCVhTZXRHcmFwaGljc0V4cG9zdXJlcyggZGlzcGxheSwgZGMtPnUueC5nYywgRmFsc2UgKTsKKwkJVFNYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIEZhbHNlICk7CiAKIAkgICAgaWYoIGRjLT53LmhWaXNSZ24gJiYgYlVwZGF0ZSApCiAJICAgIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvdXNlci5jIGIvd2luZG93cy91c2VyLmMKaW5kZXggZjc5MWIwMC4uOGZhZjkxYiAxMDA2NDQKLS0tIGEvd2luZG93cy91c2VyLmMKKysrIGIvd2luZG93cy91c2VyLmMKQEAgLTI5OSwzICsyOTksMTUgQEAKICAgICBpZiAocmVzdWx0KSBVU0VSX0V4aXRXaW5kb3dzKCk7CiAgICAgcmV0dXJuIEZBTFNFOwogfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldEV2ZW50SG9vayAgIChVU0VSLjMyMSkKKyAqCisgKglVc2VkIGJ5IFR1cmJvIERlYnVnZ2VyIGZvciBXaW5kb3dzCisgKi8KK0ZBUlBST0MxNiBTZXRFdmVudEhvb2soRkFSUFJPQzE2IGxwZm5FdmVudEhvb2spCit7CisJZnByaW50ZihzdGRlcnIsICJTZXRFdmVudEhvb2sobHBmbkV2ZW50SG9vayA9ICUwOHgpOiBzdHViICFcbiIsIChVSU5UMzIpbHBmbkV2ZW50SG9vayk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCA2OWY4OGI0Li43NGI1NWVhIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTY2Niw3ICs2NjYsNyBAQAogICAgICAgICB3aW5fYXR0ci5iYWNraW5nX3N0b3JlID0gT3B0aW9ucy5iYWNraW5nc3RvcmUgPyBXaGVuTWFwcGVkIDogTm90VXNlZnVsOwogICAgICAgICB3aW5fYXR0ci5zYXZlX3VuZGVyICAgID0gKChjbGFzc1B0ci0+c3R5bGUgJiBDU19TQVZFQklUUykgIT0gMCk7CiAgICAgICAgIHdpbl9hdHRyLmN1cnNvciAgICAgICAgPSBDVVJTT1JJQ09OX1hDdXJzb3I7Ci0gICAgICAgIHduZFB0ci0+d2luZG93ID0gWENyZWF0ZVdpbmRvdyggZGlzcGxheSwgcm9vdFdpbmRvdywgY3MtPngsIGNzLT55LAorICAgICAgICB3bmRQdHItPndpbmRvdyA9IFRTWENyZWF0ZVdpbmRvdyggZGlzcGxheSwgcm9vdFdpbmRvdywgY3MtPngsIGNzLT55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzLT5jeCwgY3MtPmN5LCAwLCBDb3B5RnJvbVBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dE91dHB1dCwgQ29weUZyb21QYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dFdmVudE1hc2sgfCBDV092ZXJyaWRlUmVkaXJlY3QgfApAQCAtNjc2LDIzICs2NzYsMjMgQEAKICAgICAgICAgaWYgKCh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpICYmCiAgICAgICAgICAgICAoY3MtPmR3RXhTdHlsZSAmIFdTX0VYX0RMR01PREFMRlJBTUUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBYU2l6ZUhpbnRzKiBzaXplX2hpbnRzID0gWEFsbG9jU2l6ZUhpbnRzKCk7CisgICAgICAgICAgICBYU2l6ZUhpbnRzKiBzaXplX2hpbnRzID0gVFNYQWxsb2NTaXplSGludHMoKTsKIAogICAgICAgICAgICAgaWYgKHNpemVfaGludHMpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc2l6ZV9oaW50cy0+bWluX3dpZHRoID0gc2l6ZV9oaW50cy0+bWF4X3dpZHRoID0gY3MtPmN4OwogICAgICAgICAgICAgICAgIHNpemVfaGludHMtPm1pbl9oZWlnaHQgPSBzaXplX2hpbnRzLT5tYXhfaGVpZ2h0ID0gY3MtPmN5OwogICAgICAgICAgICAgICAgIHNpemVfaGludHMtPmZsYWdzID0gKFBTaXplIHwgUE1pblNpemUgfCBQTWF4U2l6ZSk7Ci0gICAgICAgICAgICAgICAgWFNldFdNU2l6ZUhpbnRzKCBkaXNwbGF5LCB3bmRQdHItPndpbmRvdywgc2l6ZV9oaW50cywKKyAgICAgICAgICAgICAgICBUU1hTZXRXTVNpemVIaW50cyggZGlzcGxheSwgd25kUHRyLT53aW5kb3csIHNpemVfaGludHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQV9XTV9OT1JNQUxfSElOVFMgKTsKLSAgICAgICAgICAgICAgICBYRnJlZShzaXplX2hpbnRzKTsKKyAgICAgICAgICAgICAgICBUU1hGcmVlKHNpemVfaGludHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKIAlpZiAoY3MtPmh3bmRQYXJlbnQpICAvKiBHZXQgd2luZG93IG93bmVyICovCiAJewogICAgICAgICAgICAgV2luZG93IHdpbiA9IFdJTl9HZXRYV2luZG93KCBjcy0+aHduZFBhcmVudCApOwotICAgICAgICAgICAgaWYgKHdpbikgWFNldFRyYW5zaWVudEZvckhpbnQoIGRpc3BsYXksIHduZFB0ci0+d2luZG93LCB3aW4gKTsKKyAgICAgICAgICAgIGlmICh3aW4pIFRTWFNldFRyYW5zaWVudEZvckhpbnQoIGRpc3BsYXksIHduZFB0ci0+d2luZG93LCB3aW4gKTsKIAl9CiAgICAgICAgIEVWRU5UX1JlZ2lzdGVyV2luZG93KCB3bmRQdHIgKTsKICAgICB9CkBAIC0xNzg2LDMwICsxNzg2LDQ4IEBACiAgKi8KIEhXTkQzMiBXSU5BUEkgU2V0UGFyZW50MzIoIEhXTkQzMiBod25kQ2hpbGQsIEhXTkQzMiBod25kTmV3UGFyZW50ICkKIHsKLSAgICBIV05EMzIgb2xkUGFyZW50OwotCiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZENoaWxkICk7Ci0gICAgV05EICpwV25kUGFyZW50ID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmROZXdQYXJlbnQgKTsKKyAgICBXTkQgKnBXbmRQYXJlbnQgPSAoaHduZE5ld1BhcmVudCkgPyBXSU5fRmluZFduZFB0ciggaHduZE5ld1BhcmVudCApCisJCQkJICAgICAgOiBwV25kRGVza3RvcDsKIAotICAgIGlmICghd25kUHRyIHx8ICFwV25kUGFyZW50KSByZXR1cm4gMDsKLSAgICBvbGRQYXJlbnQgPSB3bmRQdHItPnBhcmVudC0+aHduZFNlbGY7CisgICAgaWYoIHduZFB0ciAmJiBwV25kUGFyZW50ICYmICh3bmRQdHIgIT0gcFduZERlc2t0b3ApICkKKyAgICB7CisJV05EKiBwV25kUHJldiA9IHduZFB0ci0+cGFyZW50OwogCi0gICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpKSB7Ci0JaWYgKHduZFB0ci0+d2luZG93KSB7Ci0JICAgIC8qIFRvcGxldmVsIHdpbmRvdyBuZWVkcyB0byBiZSByZXBhcmVudGVkLiAgVXNlZCBieSBUayA4LjAgKi8KLQkgICAgWERlc3Ryb3lXaW5kb3coIGRpc3BsYXksIHduZFB0ci0+d2luZG93ICk7Ci0JICAgIHduZFB0ci0+d2luZG93ID0gTm9uZTsKKwlpZiggcFduZFBhcmVudCAhPSBwV25kUHJldiApCisJeworCSAgICBCT09MMzIgYkZpeHVwRENFID0gSXNXaW5kb3dWaXNpYmxlMzIoaHduZENoaWxkKTsKKworCSAgICBpZiAoIHduZFB0ci0+d2luZG93ICkKKwkgICAgeworCQkvKiBUb3BsZXZlbCB3aW5kb3cgbmVlZHMgdG8gYmUgcmVwYXJlbnRlZC4gIFVzZWQgYnkgVGsgOC4wICovCisKKwkJVFNYRGVzdHJveVdpbmRvdyggZGlzcGxheSwgd25kUHRyLT53aW5kb3cgKTsKKwkJd25kUHRyLT53aW5kb3cgPSBOb25lOworCSAgICB9CisJICAgIGVsc2UgaWYoIGJGaXh1cERDRSApCisJCURDRV9JbnZhbGlkYXRlRENFKCB3bmRQdHIsICZ3bmRQdHItPnJlY3RXaW5kb3cgKTsKKworCSAgICBXSU5fVW5saW5rV2luZG93KGh3bmRDaGlsZCk7CisJICAgIHduZFB0ci0+cGFyZW50ID0gcFduZFBhcmVudDsKKworCSAgICAvKiBGSVhNRTogQ3JlYXRlIGFuIFggY291bnRlcnBhcnQgZm9yIHJlcGFyZW50ZWQgdG9wLWxldmVsIHdpbmRvd3MKKwkgICAgICogd2hlbiBub3QgaW4gdGhlIGRlc2t0b3AgbW9kZS4gKi8KKyAgICAgCisJICAgIGlmICggcFduZFBhcmVudCA9PSBwV25kRGVza3RvcCApIAorCQkgd25kUHRyLT5kd1N0eWxlICY9IH5XU19DSElMRDsKKwkgICAgZWxzZSB3bmRQdHItPmR3U3R5bGUgfD0gV1NfQ0hJTEQ7CisJICAgIFdJTl9MaW5rV2luZG93KGh3bmRDaGlsZCwgSFdORF9CT1RUT00pOworCisJICAgIGlmKCBiRml4dXBEQ0UgKQorCSAgICB7CisJICAgICAgICBEQ0VfSW52YWxpZGF0ZURDRSggd25kUHRyLCAmd25kUHRyLT5yZWN0V2luZG93ICk7CisJCVVwZGF0ZVdpbmRvdzMyKGh3bmRDaGlsZCk7CisJICAgIH0KIAl9Ci0Jd25kUHRyLT5kd1N0eWxlIHw9IFdTX0NISUxEOwotICAgIH0KLQotICAgIFdJTl9VbmxpbmtXaW5kb3coaHduZENoaWxkKTsKLSAgICBpZiAoaHduZE5ld1BhcmVudCkgd25kUHRyLT5wYXJlbnQgPSBwV25kUGFyZW50OwotICAgIFdJTl9MaW5rV2luZG93KGh3bmRDaGlsZCwgSFdORF9CT1RUT00pOwotCi0gICAgaWYgKElzV2luZG93VmlzaWJsZTMyKGh3bmRDaGlsZCkpIFVwZGF0ZVdpbmRvdzMyKGh3bmRDaGlsZCk7Ci0gICAgCi0gICAgcmV0dXJuIG9sZFBhcmVudDsKKwlyZXR1cm4gcFduZFByZXYtPmh3bmRTZWxmOworICAgIH0gLyogZmFpbHVyZSAqLworICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucG9zLmMgYi93aW5kb3dzL3dpbnBvcy5jCmluZGV4IDhiNTEwNjYuLjFjMWJkZDQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucG9zLmMKKysrIGIvd2luZG93cy93aW5wb3MuYwpAQCAtNSw4ICs1LDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAxOTk1LCAxOTk2IEFsZXggS29yb2JrYQogICovCiAKLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgInRzX3hsaWIuaCIKKyNpbmNsdWRlICJ0c194dXRpbC5oIgogI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCkBAIC05NTYsNiArOTU2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5QT1NfR2V0TWluTWF4SW5mbyggd25kUHRyLCAmc2l6ZSwgJnB0LCBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1BPSU5UMzJUTzE2KCAmcHQsICZscFBvcy0+cHRNYXhQb3MgKTsKIAkJCSB3bmRQdHItPmR3U3R5bGUgfD0gV1NfTUFYSU1JWkU7CisJCQkgU2V0UmVjdDE2KCBscFJlY3QsIGxwUG9zLT5wdE1heFBvcy54LCBscFBvcy0+cHRNYXhQb3MueSwgc2l6ZS54LCBzaXplLnkgKTsKKwkJCSBicmVhazsKIAkJICAgICB9CiAJCSB9IAogCQkgZWxzZSAKQEAgLTEzMzcsNyArMTMzOSw3IEBACiAgICAgd2luQ2hhbmdlcy5zdGFja19tb2RlID0gQWJvdmU7CiAgICAgd2hpbGUgKHBXbmQpCiAgICAgewotICAgICAgICBpZiAocFduZC0+d2luZG93KSBYUmVjb25maWd1cmVXTVdpbmRvdyggZGlzcGxheSwgcFduZC0+d2luZG93LCAwLAorICAgICAgICBpZiAocFduZC0+d2luZG93KSBUU1hSZWNvbmZpZ3VyZVdNV2luZG93KCBkaXNwbGF5LCBwV25kLT53aW5kb3csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDV1N0YWNrTW9kZSwgJndpbkNoYW5nZXMgKTsKICAgICAgICAgd25kUHJldiA9IFdJTl9HZXREZXNrdG9wKCktPmNoaWxkOwogICAgICAgICBpZiAod25kUHJldiA9PSBwV25kKSBicmVhazsKQEAgLTE5NTIsOSArMTk1NCw5IEBACiAgICAgICAgIHdpbmRvdyA9IHduZFB0ci0+d2luZG93OwogICAgICAgICBmb3IgKDs7KQogICAgICAgICB7Ci0gICAgICAgICAgICBYUXVlcnlUcmVlKCBkaXNwbGF5LCB3aW5kb3csICZyb290LCAmcGFyZW50LAorICAgICAgICAgICAgVFNYUXVlcnlUcmVlKCBkaXNwbGF5LCB3aW5kb3csICZyb290LCAmcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgJmNoaWxkcmVuLCAmbmNoaWxkcmVuICk7Ci0gICAgICAgICAgICBYRnJlZSggY2hpbGRyZW4gKTsKKyAgICAgICAgICAgIFRTWEZyZWUoIGNoaWxkcmVuICk7CiAgICAgICAgICAgICBpZiAocGFyZW50ID09IHJvb3QpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdzsKICAgICAgICAgICAgIHdpbmRvdyA9IHBhcmVudDsKQEAgLTE5ODQsMTkgKzE5ODYsMTkgQEAKICAgICAgICAgaWYgKCh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpICYmCiAgICAgICAgICAgICAod25kUHRyLT5kd0V4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSkKICAgICAgICAgewotICAgICAgICAgICAgWFNpemVIaW50cyAqc2l6ZV9oaW50cyA9IFhBbGxvY1NpemVIaW50cygpOworICAgICAgICAgICAgWFNpemVIaW50cyAqc2l6ZV9oaW50cyA9IFRTWEFsbG9jU2l6ZUhpbnRzKCk7CiAKICAgICAgICAgICAgIGlmIChzaXplX2hpbnRzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvbmcgc3VwcGxpZWRfcmV0dXJuOwogCi0gICAgICAgICAgICAgICAgWEdldFdNU2l6ZUhpbnRzKCBkaXNwbGF5LCB3bmRQdHItPndpbmRvdywgc2l6ZV9oaW50cywKKyAgICAgICAgICAgICAgICBUU1hHZXRXTVNpemVIaW50cyggZGlzcGxheSwgd25kUHRyLT53aW5kb3csIHNpemVfaGludHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VwcGxpZWRfcmV0dXJuLCBYQV9XTV9OT1JNQUxfSElOVFMpOwogICAgICAgICAgICAgICAgIHNpemVfaGludHMtPm1pbl93aWR0aCA9IHNpemVfaGludHMtPm1heF93aWR0aCA9IHdpbnBvcy0+Y3g7CiAgICAgICAgICAgICAgICAgc2l6ZV9oaW50cy0+bWluX2hlaWdodCA9IHNpemVfaGludHMtPm1heF9oZWlnaHQgPSB3aW5wb3MtPmN5OwotICAgICAgICAgICAgICAgIFhTZXRXTVNpemVIaW50cyggZGlzcGxheSwgd25kUHRyLT53aW5kb3csIHNpemVfaGludHMsCisgICAgICAgICAgICAgICAgVFNYU2V0V01TaXplSGludHMoIGRpc3BsYXksIHduZFB0ci0+d2luZG93LCBzaXplX2hpbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEFfV01fTk9STUFMX0hJTlRTICk7Ci0gICAgICAgICAgICAgICAgWEZyZWUoc2l6ZV9oaW50cyk7CisgICAgICAgICAgICAgICAgVFNYRnJlZShzaXplX2hpbnRzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTIwMjIsMTMgKzIwMjQsMTMgQEAKIAogCSAgICAvKiBmb3Igc3R1cGlkIHdpbmRvdyBtYW5hZ2VycyAoaS5lLiBhbGwgb2YgdGhlbSkgKi8KIAotCSAgICBYUmVzdGFja1dpbmRvd3MoZGlzcGxheSwgc3RhY2ssIDIpOyAKKwkgICAgVFNYUmVzdGFja1dpbmRvd3MoZGlzcGxheSwgc3RhY2ssIDIpOyAKIAkgICAgY2hhbmdlTWFzayAmPSB+Q1dTdGFja01vZGU7CiAJfQogICAgIH0KICAgICBpZiAoIWNoYW5nZU1hc2spIHJldHVybjsKIAotICAgIFhSZWNvbmZpZ3VyZVdNV2luZG93KCBkaXNwbGF5LCB3bmRQdHItPndpbmRvdywgMCwgY2hhbmdlTWFzaywgJndpbkNoYW5nZXMgKTsKKyAgICBUU1hSZWNvbmZpZ3VyZVdNV2luZG93KCBkaXNwbGF5LCB3bmRQdHItPndpbmRvdywgMCwgY2hhbmdlTWFzaywgJndpbkNoYW5nZXMgKTsKIH0KIAogCkBAIC0yMjE2LDcgKzIyMTgsNyBAQAogICAgICAgICBSRUNUMzIgcmVjdDsKIAogICAgICAgICBVbmlvblJlY3QzMigmcmVjdCwgJm5ld1dpbmRvd1JlY3QsICZ3bmRQdHItPnJlY3RXaW5kb3cpOwotCURDRV9JbnZhbGlkYXRlRENFKHduZFB0ci0+cGFyZW50LCAmcmVjdCk7CisJRENFX0ludmFsaWRhdGVEQ0Uod25kUHRyLCAmcmVjdCk7CiAgICAgfQogCiAgICAgLyogY2hhbmdlIGdlb21ldHJ5ICovCkBAIC0yMjM0LDEwICsyMjM2LDEwIEBACiAJLyogcG9zdHBvbmUgZ2VvbWV0cnkgY2hhbmdlICovCiAKIAlpZiggIShmbGFncyAmIChTV1BfU0hPV1dJTkRPVyB8IFNXUF9ISURFV0lORE9XKSkgKQotCSAgeworCXsKICAgICAgICAgICAgICAgV0lOUE9TX1NldFhXaW5kb3dQb3MoICZ3aW5wb3MgKTsKIAkgICAgICB3aW5wb3MuaHduZEluc2VydEFmdGVyID0gdGVtcEluc2VydEFmdGVyOwotCSAgfQorCX0KIAllbHNlICB1RmxhZ3MgfD0gU01DX1NFVFhQT1M7CiAKICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93ID0gbmV3V2luZG93UmVjdDsKQEAgLTIzMjMsMTMgKzIzMjUsMTMgQEAKICAgICAgICAgICAgICAgV0lOUE9TX1NldFhXaW5kb3dQb3MoICZ3aW5wb3MgKTsKICAgICAgICAgICAgICAgd2lucG9zLmh3bmRJbnNlcnRBZnRlciA9IHRlbXBJbnNlcnRBZnRlcjsKIAkgICAgfQotICAgICAgICAgICAgWE1hcFdpbmRvdyggZGlzcGxheSwgd25kUHRyLT53aW5kb3cgKTsKKyAgICAgICAgICAgIFRTWE1hcFdpbmRvdyggZGlzcGxheSwgd25kUHRyLT53aW5kb3cgKTsKIAogCSAgICAvKiBJZiBmb2N1cyB3YXMgc2V0IHRvIGFuIHVubWFwcGVkIHdpbmRvdywgcmVzZXQgWCBmb2N1cyBub3cgKi8KIAkgICAgZm9jdXMgPSBjdXJyID0gR2V0Rm9jdXMzMigpOwotCSAgICB3aGlsZSAoY3VyciAhPSBOVUxMKSB7CisJICAgIHdoaWxlIChjdXJyKSB7CiAJCWlmIChjdXJyID09IGh3bmQpIHsKLQkJICAgIFNldEZvY3VzMzIoIE5VTEwgKTsKKwkJICAgIFNldEZvY3VzMzIoIDAgKTsKIAkJICAgIFNldEZvY3VzMzIoIGZvY3VzICk7CiAJCSAgICBicmVhazsKIAkJfQpAQCAtMjM0OSw3ICsyMzUxLDcgQEAKIAl3bmRQdHItPmR3U3R5bGUgJj0gfldTX1ZJU0lCTEU7CiAgICAgICAgIGlmICh3bmRQdHItPndpbmRvdykKICAgICAgICAgewotICAgICAgICAgICAgWFVubWFwV2luZG93KCBkaXNwbGF5LCB3bmRQdHItPndpbmRvdyApOworICAgICAgICAgICAgVFNYVW5tYXBXaW5kb3coIGRpc3BsYXksIHduZFB0ci0+d2luZG93ICk7CiAJICAgIGlmKCB1RmxhZ3MgJiBTTUNfU0VUWFBPUyApCiAJICAgIHsKICAgICAgICAgICAgICAgV0lOUE9TX1NldFhXaW5kb3dQb3MoICZ3aW5wb3MgKTsKQEAgLTIzOTAsMTMgKzIzOTIsNyBAQAogICAgICAgICBFVkVOVF9EdW1teU1vdGlvbk5vdGlmeSgpOyAvKiBTaW11bGF0ZSBhIG1vdXNlIGV2ZW50IHRvIHNldCB0aGUgY3Vyc29yICovCiAKICAgICBpZiAoIShmbGFncyAmIFNXUF9ERUZFUkVSQVNFKSAmJiAhKHVGbGFncyAmIFNNQ19OT1BBUkVOVEVSQVNFKSApCi0gICAgewotICAgICAgICBQQUlOVF9SZWRyYXdXaW5kb3coIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwKLSAgICAgICAgICAgICAgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fU0FWRVVOREVSX09WRVJSSURFKSA/ICZvbGRXaW5kb3dSZWN0IDogTlVMTCwKLSAgICAgICAgICAgICAgMCwgUkRXX0FMTENISUxEUkVOIHwgUkRXX0VSQVNFTk9XIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHduZFB0ci0+ZmxhZ3MgJiBXSU5fU0FWRVVOREVSX09WRVJSSURFKSA/IFJEV19JTlZBTElEQVRFIDogMCksIDAgKTsKLSAgICAgICAgd25kUHRyLT5mbGFncyAmPSB+V0lOX1NBVkVVTkRFUl9PVkVSUklERTsKLSAgICB9CisgICAgICAgIFBBSU5UX1JlZHJhd1dpbmRvdyggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCBOVUxMLCAwLCBSRFdfQUxMQ0hJTERSRU4gfCBSRFdfRVJBU0VOT1csIDAgKTsKICAgICBlbHNlIGlmKCB3bmRQdHItPnBhcmVudCA9PSBXSU5fR2V0RGVza3RvcCgpICYmIHduZFB0ci0+cGFyZW50LT5mbGFncyAmIFdJTl9ORUVEU19FUkFTRUJLR05EICkKIAlQQUlOVF9SZWRyYXdXaW5kb3coIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgTlVMTCwgMCwgUkRXX05PQ0hJTERSRU4gfCBSRFdfRVJBU0VOT1csIDAgKTsKIApAQCAtMjQwNSw5ICsyNDAxLDggQEAKICAgICBkcHJpbnRmX3dpbihzdGRkZWIsIlx0c3RhdHVzIGZsYWdzID0gJTA0eFxuIiwgd2lucG9zLmZsYWdzICYgU1dQX0FHR19TVEFUVVNGTEFHUyk7CiAKICAgICBpZiAoICgod2lucG9zLmZsYWdzICYgU1dQX0FHR19TVEFUVVNGTEFHUykgIT0gU1dQX0FHR19OT1BPU0NIQU5HRSkgJiYgCi0JISh3aW5wb3MuZmxhZ3MgJiBTV1BfTk9TRU5EQ0hBTkdJTkcpKQotICAgICAgICBTZW5kTWVzc2FnZTMyQSggd2lucG9zLmh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAoTFBBUkFNKSZ3aW5wb3MgKTsKKwkgISh3aW5wb3MuZmxhZ3MgJiBTV1BfTk9TRU5EQ0hBTkdJTkcpKQorICAgICAgICBTZW5kTWVzc2FnZTMyQSggd2lucG9zLmh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HRUQsIDAsIChMUEFSQU0pJndpbnBvcyApOwogCiAgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS93aW5lLmluaSBiL3dpbmUuaW5pCmluZGV4IDhkYThiNTYuLjdjZGU4OGIgMTAwNjQ0Ci0tLSBhL3dpbmUuaW5pCisrKyBiL3dpbmUuaW5pCkBAIC04LDEyICs4LDE0IEBACiA7OyBMYWJlbD14eHggICAgICAoZHJpdmUgbGFiZWwsIGF0IG1vc3QgMTEgY2hhcmFjdGVycykKIDs7IFNlcmlhbD14eHggICAgIChzZXJpYWwgbnVtYmVyLCA4IGNoYXJhY3RlcnMgaGV4YWRlY2ltYWwgbnVtYmVyKQogOzsgRmlsZXN5c3RlbT14eHggKHN1cHBvcnRlZCB0eXBlcyBhcmUgJ21zZG9zJywnd2luOTUnLCd1bml4JykKKzs7IERldmljZT0vZGV2L3h4IChvbmx5IGlmIHlvdSB3YW50IHRvIGFsbG93IHJhdyBkZXZpY2UgYWNjZXNzKQogOzsKIFtEcml2ZSBBXQogUGF0aD0vbW50L2ZkMAogVHlwZT1mbG9wcHkKIExhYmVsPUZsb3BweQogU2VyaWFsPTg3NjU0MzIxCitEZXZpY2U9L2Rldi9mZDAKIAogW0RyaXZlIENdCiBQYXRoPS9jCg==