ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBiZjJlM2Y5Li42MTkzZTAwIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNTcgQEAKIAogCQlDaGFuZ2VMb2cgZmlsZSBmb3IgemxpYgorQ2hhbmdlcyBpbiAxLjIuMCAoOSBNYXJjaCAyMDAzKQorLSBOZXcgYW5kIGltcHJvdmVkIGluZmxhdGUgY29kZQorICAgIC0gQWJvdXQgMjAlIGZhc3RlcgorICAgIC0gRG9lcyBub3QgYWxsb2NhdGUgMzJLIHdpbmRvdyB1bmxlc3MgYW5kIHVudGlsIG5lZWRlZAorICAgIC0gQXV0b21hdGljYWxseSBkZXRlY3RzIGFuZCBkZWNvbXByZXNzZXMgZ3ppcCBzdHJlYW1zCisgICAgLSBSYXcgaW5mbGF0ZSBubyBsb25nZXIgbmVlZHMgYW4gZXh0cmEgZHVtbXkgYnl0ZSBhdCBlbmQKKyAgICAtIEFkZGVkIGluZmxhdGVCYWNrIGZ1bmN0aW9ucyB1c2luZyBhIGNhbGxiYWNrIGludGVyZmFjZS0tZXZlbiBmYXN0ZXIKKyAgICAgIHRoYW4gaW5mbGF0ZSwgdXNlZnVsIGZvciBmaWxlIHV0aWxpdGllcyAoZ3ppcCwgemlwKQorICAgIC0gQWRkZWQgaW5mbGF0ZUNvcHkoKSBmdW5jdGlvbiB0byByZWNvcmQgc3RhdGUgZm9yIHJhbmRvbSBhY2Nlc3Mgb24KKyAgICAgIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGRlZmxhdGUgc3RyZWFtcyAoZS5nLiBpbiBnemlwIGZpbGVzKQorICAgIC0gTW9yZSByZWFkYWJsZSBjb2RlIChJIGhvcGUpCistIE5ldyBhbmQgaW1wcm92ZWQgY3JjMzIoKQorICAgIC0gQWJvdXQgNTAlIGZhc3RlciwgdGhhbmtzIHRvIHN1Z2dlc3Rpb25zIGZyb20gUm9kbmV5IEJyb3duCistIEFkZCBkZWZsYXRlQm91bmQoKSBhbmQgY29tcHJlc3NCb3VuZCgpIGZ1bmN0aW9ucworLSBGaXggbWVtb3J5IGxlYWsgaW4gZGVmbGF0ZUluaXQyKCkKKy0gUGVybWl0IHNldHRpbmcgZGljdGlvbmFyeSBmb3IgcmF3IGRlZmxhdGUgKGZvciBwYXJhbGxlbCBkZWZsYXRlKQorLSBGaXggY29uc3QgZGVjbGFyYXRpb24gZm9yIGd6d3JpdGUoKQorLSBDaGVjayBmb3Igc29tZSBtYWxsb2MoKSBmYWlsdXJlcyBpbiBnemlvLmMKKy0gRml4IGJ1ZyBpbiBnem9wZW4oKSBvbiBzaW5nbGUtYnl0ZSBmaWxlIDB4MWYKKy0gRml4IGJ1ZyBpbiBnenJlYWQoKSBvbiBjb25jYXRlbmF0ZWQgZmlsZSB3aXRoIDB4MWYgYXQgZW5kIG9mIGJ1ZmZlcgorICBhbmQgbmV4dCBidWZmZXIgZG9lc24ndCBzdGFydCB3aXRoIDB4OGIKKy0gRml4IHVuY29tcHJlc3MoKSB0byByZXR1cm4gWl9EQVRBX0VSUk9SIG9uIHRydW5jYXRlZCBpbnB1dAorLSBGcmVlIG1lbW9yeSBhdCBlbmQgb2YgZXhhbXBsZS5jCistIFJlbW92ZSBNQVggI2RlZmluZSBpbiB0cmVlcy5jIChjb25mbGljdGVkIHdpdGggc29tZSBsaWJyYXJpZXMpCistIEZpeCBzdGF0aWMgY29uc3QncyBpbiBkZWZsYXRlLmMsIGd6aW8uYywgYW5kIHp1dGlsLltjaF0KKy0gRGVjbGFyZSBtYWxsb2MoKSBhbmQgZnJlZSgpIGluIGd6aW8uYyBpZiBTVERDIG5vdCBkZWZpbmVkCistIFVzZSBtYWxsb2MoKSBpbnN0ZWFkIG9mIGNhbGxvYygpIGluIHp1dGlsLmMgaWYgaW50IGJpZyBlbm91Z2gKKy0gRGVmaW5lIFNUREMgZm9yIEFJWAorLSBBZGQgYWl4LyB3aXRoIGFwcHJvYWNoIGZvciBjb21waWxpbmcgc2hhcmVkIGxpYnJhcnkgb24gQUlYCistIEFkZCBIUC1VWCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIGluIGNvbmZpZ3VyZQorLSBBZGQgT3BlblVOSVggc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBpbiBjb25maWd1cmUKKy0gVXNlICRjYyBpbnN0ZWFkIG9mIGdjYyB0byBidWlsZCBzaGFyZWQgbGlicmFyeQorLSBNYWtlIHByZWZpeCBkaXJlY3RvcnkgaWYgbmVlZGVkIHdoZW4gaW5zdGFsbGluZworLSBDb3JyZWN0IE1hY2ludG9zaCBhdm9pZGFuY2Ugb2YgdHlwZWRlZiBCeXRlIGluIHpjb25mLmgKKy0gQ29ycmVjdCBUdXJibyBDIG1lbW9yeSBhbGxvY2F0aW9uIHdoZW4gdW5kZXIgTGludXgKKy0gVXNlIGxpYnouYSBpbnN0ZWFkIG9mIC1seiBpbiBNYWtlZmlsZSAoYXNzdXJlIHVzZSBvZiBjb21waWxlZCBsaWJyYXJ5KQorLSBVcGRhdGUgY29uZmlndXJlIHRvIGNoZWNrIGZvciBzbnByaW50ZiBvciB2c25wcmludGYgZnVuY3Rpb25zIGFuZCB0aGVpcgorICByZXR1cm4gdmFsdWUsIHdhcm4gZHVyaW5nIG1ha2UgaWYgdXNpbmcgYW4gaW5zZWN1cmUgZnVuY3Rpb24KKy0gRml4IGNvbmZpZ3VyZSBwcm9ibGVtIHdpdGggY29tcGlsZS10aW1lIGtub3dsZWRnZSBvZiBIQVZFX1VOSVNURF9IIHRoYXQKKyAgaXMgbG9zdCB3aGVuIGxpYnJhcnkgaXMgdXNlZC0tcmVzb2x1dGlvbiBpcyB0byBidWlsZCBuZXcgemNvbmYuaAorLSBEb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cyAoaW4gemxpYi5oKToKKyAgICAtIERvY3VtZW50IHJhdyBkZWZsYXRlIGFuZCBpbmZsYXRlCisgICAgLSBVcGRhdGUgUkZDcyBVUkwKKyAgICAtIFBvaW50IG91dCB0aGF0IHpsaWIgYW5kIGd6aXAgZm9ybWF0cyBhcmUgZGlmZmVyZW50CisgICAgLSBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90IGZhdGFsCisgICAgLSBEb2N1bWVudCBzdHJpbmcgbGltaXQgZm9yIGd6cHJpbnRmKCkgYW5kIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdworICAgIC0gTm90ZSByZXF1aXJlbWVudCBvbiBhdmFpbF9vdXQgd2hlbiBmbHVzaGluZworICAgIC0gTm90ZSBwZXJtaXR0ZWQgdmFsdWVzIG9mIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkKKy0gQWRkIHNvbWUgRkFRcyAoYW5kIGV2ZW4gYW5zd2VycykgdG8gdGhlIEZBUQorLSBBZGQgY29udHJpYi9pbmZsYXRlODYvIGZvciB4ODYgZmFzdGVyIGluZmxhdGUKKy0gQWRkIGNvbnRyaWIvYmxhc3QvIGZvciBQS1dhcmUgRGF0YSBDb21wcmVzc2lvbiBMaWJyYXJ5IGRlY29tcHJlc3Npb24KKy0gQWRkIGNvbnRyaWIvcHVmZi8gc2ltcGxlIGluZmxhdGUgZm9yIGRlZmxhdGUgZm9ybWF0IGRlc2NyaXB0aW9uCiAKIENoYW5nZXMgaW4gMS4xLjQgKDExIE1hcmNoIDIwMDIpCiAtIFpGUkVFIHdhcyByZXBlYXRlZCBvbiBzYW1lIGFsbG9jYXRpb24gb24gc29tZSBlcnJvciBjb25kaXRpb25zLgpAQCAtMTAsNyArNjIsNyBAQAogICBsZXNzIHRoYW4gMzJLLgogLSBmb3JjZSB3aW5kb3dCaXRzID4gOCB0byBhdm9pZCBhIGJ1ZyBpbiB0aGUgZW5jb2RlciBmb3IgYSB3aW5kb3cgc2l6ZQogICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuCi0JCisKIENoYW5nZXMgaW4gMS4xLjMgKDkgSnVseSAxOTk4KQogLSBmaXggImFuIGluZmxhdGUgaW5wdXQgYnVmZmVyIGJ1ZyB0aGF0IHNob3dzIHVwIG9uIHJhcmUgYnV0IHBlcnNpc3RlbnQKICAgb2NjYXNpb25zIiAoTWFyaykKZGlmZiAtLWdpdCBhL0ZBUSBiL0ZBUQppbmRleCA0N2E3ZDYwLi5hYmY2ODBjIDEwMDY0NAotLS0gYS9GQVEKKysrIGIvRkFRCkBAIC0zNiw2ICszNiwxMSBAQAogICAgIEJlZm9yZSBtYWtpbmcgdGhlIGNhbGwsIG1ha2Ugc3VyZSB0aGF0IGF2YWlsX2luIGFuZCBhdmFpbF9vdXQgYXJlIG5vdAogICAgIHplcm8uIFdoZW4gc2V0dGluZyB0aGUgcGFyYW1ldGVyIGZsdXNoIGVxdWFsIHRvIFpfRklOSVNILCBhbHNvIG1ha2Ugc3VyZQogICAgIHRoYXQgYXZhaWxfb3V0IGlzIGJpZyBlbm91Z2ggdG8gYWxsb3cgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBpbnB1dC4KKyAgICBOb3RlIHRoYXQgYSBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwtLWFub3RoZXIgY2FsbCB0byBkZWZsYXRlKCkgb3IKKyAgICBpbmZsYXRlKCkgY2FuIGJlIG1hZGUgd2l0aCBtb3JlIGlucHV0IG9yIG91dHB1dCBzcGFjZS4gQSBaX0JVRl9FUlJPUgorICAgIG1heSBpbiBmYWN0IGJlIHVuYXZvaWRhYmxlIGRlcGVuZGluZyBvbiBob3cgdGhlIGZ1bmN0aW9ucyBhcmUgdXNlZCwgc2luY2UKKyAgICBpdCBpcyBub3QgcG9zc2libGUgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBtb3JlIG91dHB1dCBwZW5kaW5nCisgICAgd2hlbiBzdHJtLmF2YWlsX291dCByZXR1cm5zIHdpdGggemVyby4KIAogIDYuIFdoZXJlJ3MgdGhlIHpsaWIgZG9jdW1lbnRhdGlvbiAobWFuIHBhZ2VzLCBldGMuKT8KIApAQCAtODgsMTMgKzkzLDE3MSBAQAogMTQuIFdoeSBkb2VzICJtYWtlIHRlc3QiIGZhaWwgb24gTWFjIE9TIFg/CiAKICAgICBNYWMgT1MgWCBhbHJlYWR5IGluY2x1ZGVzIHpsaWIgYXMgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHNvIC1seiBsaW5rcyB0aGUKLSAgICBzaGFyZWQgbGlicmFyeSBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdCB0aGUgIm1ha2UiIGNvbXBpbGVkLiBGb3IgemxpYgotICAgIDEuMS4zLCB0aGUgdHdvIGFyZSBpbmNvbXBhdGlibGUgZHVlIHRvIGRpZmZlcmVudCBjb21waWxlLXRpbWUKLSAgICBvcHRpb25zLiBTaW1wbHkgY2hhbmdlIHRoZSAtbHogaW4gdGhlIE1ha2VmaWxlIHRvIGxpYnouYSwgYW5kIGl0IHdpbGwgdXNlCi0gICAgdGhlIGNvbXBpbGVkIGxpYnJhcnkgaW5zdGVhZCBvZiB0aGUgc2hhcmVkIG9uZSBhbmQgdGhlICJtYWtlIHRlc3QiIHdpbGwKLSAgICBzdWNjZWVkLgorICAgIHNoYXJlZCBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIG9uZSB0aGF0IHRoZSAibWFrZSIgY29tcGlsZWQuIFRoZSB0d28gYXJlCisgICAgaW5jb21wYXRpYmxlIGR1ZSB0byBkaWZmZXJlbnQgY29tcGlsZS10aW1lIG9wdGlvbnMuIFNpbXBseSBjaGFuZ2UgdGhlIC1segorICAgIGluIHRoZSBNYWtlZmlsZSB0byBsaWJ6LmEsIGFuZCBpdCB3aWxsIHVzZSB0aGUgY29tcGlsZWQgbGlicmFyeSBpbnN0ZWFkCisgICAgb2YgdGhlIHNoYXJlZCBvbmUgYW5kIHRoZSAibWFrZSB0ZXN0IiB3aWxsIHN1Y2NlZWQuCiAKIDE1LiBJIGhhdmUgYSBxdWVzdGlvbiBhYm91dCBPdHRvUERGCiAKICAgICBXZSBhcmUgbm90IHRoZSBhdXRob3JzIG9mIE90dG9QREYuIFRoZSByZWFsIGF1dGhvciBpcyBvbiB0aGUgT3R0b1BERiB3ZWIKICAgICBzaXRlIEpvZWwgSGFpbmxleSBqaGFpbmxleUBteW5ka3J5bWUuY29tLgorCisxNi4gV2h5IGRvZXMgZ3ppcCBnaXZlIGFuIGVycm9yIG9uIGEgZmlsZSBJIG1ha2Ugd2l0aCBjb21wcmVzcy9kZWZsYXRlPworCisgICAgVGhlIGNvbXByZXNzIGFuZCBkZWZsYXRlIGZ1bmN0aW9ucyBwcm9kdWNlIGRhdGEgaW4gdGhlIHpsaWIgZm9ybWF0LCB3aGljaAorICAgIGlzIGRpZmZlcmVudCBhbmQgaW5jb21wYXRpYmxlIHdpdGggdGhlIGd6aXAgZm9ybWF0LiBUaGUgZ3oqIGZ1bmN0aW9ucyBpbgorICAgIHpsaWIgb24gdGhlIG90aGVyIGhhbmQgdXNlIHRoZSBnemlwIGZvcm1hdC4gQm90aCB0aGUgemxpYiBhbmQgZ3ppcAorICAgIGZvcm1hdHMgdXNlIHRoZSBzYW1lIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQsIGJ1dCBoYXZlIGRpZmZlcmVudCBoZWFkZXJzCisgICAgYW5kIHRyYWlsZXJzLgorCisxNy4gT2ssIHNvIHdoeSBhcmUgdGhlcmUgdHdvIGRpZmZlcmVudCBmb3JtYXRzPworCisgICAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byByZXRhaW4gdGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBhYm91dAorICAgIGEgc2luZ2xlIGZpbGUsIHN1Y2ggYXMgdGhlIG5hbWUgYW5kIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuIFRoZSB6bGliCisgICAgZm9ybWF0IG9uIHRoZSBvdGhlciBoYW5kIHdhcyBkZXNpZ25lZCBmb3IgaW4tbWVtb3J5IGFuZCBjb21tdW5pY2F0aW9uCisgICAgY2hhbm5lbCBhcHBsaWNhdGlvbnMsIGFuZCBoYXMgYSBtdWNoIG1vcmUgY29tcGFjdCBoZWFkZXIgYW5kIHRyYWlsZXIgYW5kCisgICAgdXNlcyBhIGZhc3RlciBpbnRlZ3JpdHkgY2hlY2sgdGhhbiBnemlwLgorCisxOC4gV2VsbCB0aGF0J3MgbmljZSwgYnV0IGhvdyBkbyBJIG1ha2UgYSBnemlwIGZpbGUgaW4gbWVtb3J5PworCisgICAgUmVhZCBSRkMgMTk1MiBmb3IgdGhlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyIGZvcm1hdCwgYW5kIHJvbGwgeW91ciBvd24KKyAgICBnemlwIGZvcm1hdHRlZCBkYXRhIHVzaW5nIHJhdyBkZWZsYXRlIGFuZCBjcmMzMigpLgorCisxOS4gSXMgemxpYiB0aHJlYWQtc2FmZT8KKworICAgIFllcy4gSG93ZXZlciBhbnkgbGlicmFyeSByb3V0aW5lcyB0aGF0IHpsaWIgdXNlcyBhbmQgYW55IGFwcGxpY2F0aW9uLQorICAgIHByb3ZpZGVkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIG11c3QgYWxzbyBiZSB0aHJlYWQtc2FmZS4gT2YgY291cnNlLAorICAgIHlvdSBzaG91bGQgb25seSBvcGVyYXRlIG9uIGFueSBnaXZlbiB6bGliIG9yIGd6aXAgc3RyZWFtIGZyb20gYSBzaW5nbGUKKyAgICB0aHJlYWQuIHpsaWIncyBneiogZnVuY3Rpb25zIHVzZSBzdGRpbyBsaWJyYXJ5IHJvdXRpbmVzLCBhbmQgbW9zdCBvZgorICAgIHpsaWIncyBmdW5jdGlvbnMgdXNlIHRoZSBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGJ5IGRlZmF1bHQuCisgICAgemxpYidzIEluaXQgZnVuY3Rpb25zIGFsbG93IGZvciB0aGUgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBjdXN0b20gbWVtb3J5CisgICAgYWxsb2NhdGlvbiByb3V0aW5lcy4KKworMjAuIENhbiBJIHVzZSB6bGliIGluIG15IGNvbW1lcmNpYWwgYXBwbGljYXRpb24/CisKKyAgICBZZXMuIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KKworMjEuIElzIHpsaWIgdW5kZXIgdGhlIEdOVSBsaWNlbnNlPworCisgICAgTm8uIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KKworMjIuIFdpbGwgemxpYiB3b3JrIG9uIGEgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGFyY2hpdGVjdHVyZSwgYW5kIGNhbiBJCisgICAgZXhjaGFuZ2UgY29tcHJlc3NlZCBkYXRhIGJldHdlZW4gdGhlbT8KKworICAgIFllcyBhbmQgeWVzLgorCisyMy4gV2lsbCB6bGliIHdvcmsgb24gYSA2NC1iaXQgbWFjaGluZT8KKworICAgIEl0IHNob3VsZC4gSXQgaGFzIGJlZW4gdGVzdGVkIG9uIDY0LWJpdCBtYWNoaW5lcywgYW5kIGhhcyBubyBkZXBlbmRlbmNlCisgICAgb24gYW55IGRhdGEgdHlwZXMgYmVpbmcgbGltaXRlZCB0byAzMi1iaXRzIGluIGxlbmd0aC4gSWYgeW91IGhhdmUgYW55CisgICAgZGlmZmljdWx0aWVzLCBwbGVhc2UgcHJvdmlkZSBhIGNvbXBsZXRlIHByb2JsZW0gcmVwb3J0IHRvIHpsaWJAZ3ppcC5vcmcKKworMjQuIFdpbGwgemxpYiBkZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeT8KKworICAgIE5vLiBUaGUgUEtXYXJlIERDTCB1c2VzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgY29tcHJlc3NlZCBkYXRhIGZvcm1hdAorICAgIHRoYW4gZG9lcyBQS1pJUCBhbmQgemxpYi4gSG93ZXZlciwgeW91IGNhbiBsb29rIGluIHpsaWIncyBjb250cmliL2JsYXN0CisgICAgZGlyZWN0b3J5IGZvciBhIHBvc3NpYmxlIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbS4KKworMjUuIENhbiBJIGFjY2VzcyBkYXRhIHJhbmRvbWx5IGluIGEgY29tcHJlc3NlZCBzdHJlYW0/CisKKyAgICBObywgbm90IHdpdGhvdXQgc29tZSBwcmVwYXJhdGlvbi4gSWYgd2hlbiBjb21wcmVzc2luZyB5b3UgcGVyaW9kaWNhbGx5CisgICAgdXNlIFpfRlVMTF9GTFVTSCwgY2FyZWZ1bGx5IHdyaXRlIGFsbCB0aGUgcGVuZGluZyBkYXRhIGF0IHRob3NlIHBvaW50cywKKyAgICBhbmQga2VlcCBhbiBpbmRleCBvZiB0aG9zZSBsb2NhdGlvbnMsIHRoZW4geW91IGNhbiBzdGFydCBkZWNvbXByZXNzaW9uCisgICAgYXQgdGhvc2UgcG9pbnRzLiBZb3UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIG5vdCB1c2UgWl9GVUxMX0ZMVVNIIHRvbworICAgIG9mdGVuLCBzaW5jZSBpdCBjYW4gc2lnbmlmaWNhbnRseSBkZWdyYWRlIGNvbXByZXNzaW9uLgorCisyNi4gRG9lcyB6bGliIHdvcmsgb24gTVZTLCBPUy8zOTAsIENJQ1MsIGV0Yy4/CisKKyAgICBXZSBkb24ndCBrbm93IGZvciBzdXJlLiBXZSBoYXZlIGhlYXJkIG9jY2FzaW9uYWwgcmVwb3J0cyBvZiBzdWNjZXNzIG9uCisgICAgdGhlc2Ugc3lzdGVtcy4gSWYgeW91IGRvIHVzZSBpdCBvbiBvbmUgb2YgdGhlc2UsIHBsZWFzZSBwcm92aWRlIHVzIHdpdGgKKyAgICBhIHJlcG9ydCwgaW5zdHJ1Y3Rpb25zLCBhbmQgcGF0Y2hlcyB0aGF0IHdlIGNhbiByZWZlcmVuY2Ugd2hlbiB3ZSBnZXQKKyAgICB0aGVzZSBxdWVzdGlvbnMuIFRoYW5rcy4KKworMjcuIElzIHRoZXJlIHNvbWUgc2ltcGxlciwgZWFzaWVyIHRvIHJlYWQgdmVyc2lvbiBvZiBpbmZsYXRlIEkgY2FuIGxvb2sgYXQKKyAgICB0byB1bmRlcnN0YW5kIHRoZSBkZWZsYXRlIGZvcm1hdD8KKworICAgIEZpcnN0IG9mZiwgeW91IHNob3VsZCByZWFkIFJGQyAxOTUxLiBTZWNvbmQsIHllcy4gTG9vayBpbiB6bGliJ3MKKyAgICBjb250cmliL3B1ZmYgZGlyZWN0b3J5LgorCisyOC4gRG9lcyB6bGliIGluZnJpbmdlIG9uIGFueSBwYXRlbnRzPworCisgICAgQXMgZmFyIGFzIHdlIGtub3csIG5vLiBJbiBmYWN0LCB0aGF0IHdhcyBvcmlnaW5hbGx5IHRoZSB3aG9sZSBwb2ludCBiZWhpbmQKKyAgICB6bGliLiBMb29rIGhlcmUgZm9yIHNvbWUgbW9yZSBpbmZvcm1hdGlvbjoKKworICAgIGh0dHA6Ly93d3cuZ3ppcC5vcmcvI2ZhcTExCisKKzI5LiBDYW4gemxpYiB3b3JrIHdpdGggZ3JlYXRlciB0aGFuIDQgR0Igb2YgZGF0YT8KKworICAgIFllcy4gaW5mbGF0ZSgpIGFuZCBkZWZsYXRlKCkgd2lsbCBwcm9jZXNzIGFueSBhbW91bnQgb2YgZGF0YSBjb3JyZWN0bHkuCisgICAgSG93ZXZlciB0aGUgc3RybS50b3RhbF9pbiBhbmQgc3RybV90b3RhbF9vdXQgY291bnRlcnMgbWF5IGJlIGxpbWl0ZWQgdG8KKyAgICA0IEdCLiBUaGUgdXNlciBjYW4gZWFzaWx5IHNldCB1cCB0aGVpciBvd24gY291bnRlcnMgdXBkYXRlZCBhZnRlciBlYWNoCisgICAgY2FsbCBvZiBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpIHRvIGNvdW50IGJleW9uZCA0IEdCLiBjb21wcmVzcygpIGFuZAorICAgIHVuY29tcHJlc3MoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCLCBzaW5jZSB0aGV5IG9wZXJhdGUgaW4gYSBzaW5nbGUKKyAgICBjYWxsIHVzaW5nIHVuc2lnbmVkIGxvbmcgbGVuZ3Rocy4gZ3pzZWVrKCkgbWF5IGJlIGxpbWl0ZWQgdG8gNCBHQgorICAgIGRlcGVuZGluZyBvbiBob3cgemxpYiBpcyBjb21waWxlZC4KKworMzAuIERvZXMgemxpYiBoYXZlIGFueSBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXM/CisKKyAgICBUaGUgb25seSBvbmUgdGhhdCB3ZSBhcmUgYXdhcmUgb2YgaXMgcG90ZW50aWFsbHkgaW4gZ3pwcmludGYoKS4gSWYgemxpYgorICAgIGlzIGNvbXBpbGVkIHRvIHVzZSBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSwgdGhlbiB0aGVyZSBpcyBubyBwcm90ZWN0aW9uCisgICAgYWdhaW5zdCBhIGJ1ZmZlciBvdmVyZmxvdyBvZiBhIDRLIHN0cmluZyBzcGFjZSwgb3RoZXIgdGhhbiB0aGUgY2FsbGVyIG9mCisgICAgZ3pwcmludGYoKSBhc3N1cmluZyB0aGF0IHRoZSBvdXRwdXQgd2lsbCBub3QgZXhjZWVkIDRLLiBPbiB0aGUgb3RoZXIKKyAgICBoYW5kLCBpZiB6bGliIGlzIGNvbXBpbGVkIHRvIHVzZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpLCB0aGVuIHRoZXJlIGlzCisgICAgbm8gdnVsbmVyYWJpbGl0eS4KKworICAgIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHpsaWIuIFZlcnNpb25zCisgICAgMS4xLjMgYW5kIGJlZm9yZSB3ZXJlIHN1YmplY3QgdG8gYSBkb3VibGUtZnJlZSB2dWxuZXJhYmlsaXR5LgorCiszMS4gSXMgdGhlcmUgYSBKYXZhIHZlcnNpb24gb2YgemxpYj8KKworICAgIFByb2JhYmx5IHdoYXQgeW91IHdhbnQgaXMgdG8gdXNlIHpsaWIgaW4gSmF2YS4gemxpYiBpcyBhbHJlYWR5IGluY2x1ZGVkCisgICAgYXMgcGFydCBvZiB0aGUgSmF2YSBTREsgaW4gdGhlIGphdmEudXRpbC56aXAgY2xhc3MuIElmIHlvdSByZWFsbHkgd2FudAorICAgIGEgdmVyc2lvbiBvZiB6bGliIHdyaXR0ZW4gaW4gdGhlIEphdmEgbGFuZ3VhZ2UsIGxvb2sgb24gdGhlIHpsaWIgaG9tZQorICAgIHBhZ2UgZm9yIGxpbmtzOiBodHRwOi8vd3d3LnpsaWIub3JnLworCiszMi4gSSBnZXQgdGhpcyBvciB0aGF0IGNvbXBpbGVyIG9yIHNvdXJjZS1jb2RlIHNjYW5uZXIgd2FybmluZy4gQ2FuJ3QgeW91IGd1eXMKKyAgICB3cml0ZSBwcm9wZXIgY29kZT8KKworICAgIE1hbnkgeWVhcnMgYWdvLCB3ZSBnYXZlIHVwIGF0dGVtcHRpbmcgdG8gYXZvaWQgd2FybmluZ3Mgb24gZXZlcnkgY29tcGlsZXIKKyAgICBpbiB0aGUgdW5pdmVyc2UuIEl0IGp1c3QgZ290IHRvIGJlIGEgd2FzdGUgb2YgdGltZSwgYW5kIHNvbWUgY29tcGlsZXJzCisgICAgd2VyZSBkb3ducmlnaHQgc2lsbHkuIFNvIG5vdywgd2Ugc2ltcGx5IG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlIGFsd2F5cworICAgIHdvcmtzLgorCiszMy4gV2lsbCB6bGliIHJlYWQgdGhlIChpbnNlcnQgYW55IGFuY2llbnQgb3IgYXJjYW5lIGZvcm1hdCBoZXJlKSBjb21wcmVzc2VkCisgICAgZGF0YSBmb3JtYXQ/CisKKyAgICBQcm9iYWJseSBub3QuIExvb2sgaW4gdGhlIGNvbXAuY29tcHJlc3Npb24gRkFRIGZvciBwb2ludGVycyB0byB2YXJpb3VzCisgICAgZm9ybWF0cyBhbmQgYXNzb2NpYXRlZCBzb2Z0d2FyZS4KKworMzQuIEhvdyBjYW4gSSBlbmNyeXB0L2RlY3J5cHQgemlwIGZpbGVzIHdpdGggemxpYj8KKworICAgIHpsaWIgZG9lc24ndCBzdXBwb3J0IGVuY3J5cHRpb24uIFBLWklQIGVuY3J5cHRpb24gaXMgdmVyeSB3ZWFrIGFuZCBjYW4gYmUKKyAgICBicm9rZW4gd2l0aCBmcmVlbHkgYXZhaWxhYmxlIHByb2dyYW1zLiBUbyBnZXQgc3Ryb25nIGVuY3J5cHRpb24sIHVzZSBncGcKKyAgICB3aGljaCBhbHJlYWR5IGluY2x1ZGVzIHpsaWIgY29tcHJlc3Npb24uCisKKzM1LiBXaGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgImd6aXAiIGFuZCAiZGVmbGF0ZSIgSFRUUCAxLjEgZW5jb2RpbmdzPworCisgICAgImd6aXAiIGlzIHRoZSBnemlwIGZvcm1hdCwgYW5kICJkZWZsYXRlIiBpcyB0aGUgemxpYiBmb3JtYXQuIFRoZXkgc2hvdWxkCisgICAgcHJvYmFibHkgaGF2ZSBjYWxsZWQgdGhlIHNlY29uZCBvbmUgInpsaWIiIGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW9uCisgICAgd2l0aCB0aGUgcmF3IGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdC4gV2hpbGUgdGhlIEhUVFAgMS4xIFJGQyAyNjE2CisgICAgY29ycmVjdGx5IHBvaW50cyB0byB0aGUgemxpYiBzcGVjaWZpY2F0aW9uIGluIFJGQyAxOTUwIGZvciB0aGUgImRlZmxhdGUiCisgICAgdHJhbnNmZXIgZW5jb2RpbmcsIHRoZXJlIGhhdmUgYmVlbiByZXBvcnRzIG9mIHNlcnZlcnMgYW5kIGJyb3dzZXJzIHRoYXQKKyAgICBpbmNvcnJlY3RseSBwcm9kdWNlIG9yIGV4cGVjdCByYXcgZGVmbGF0ZSBkYXRhIHBlciB0aGUgZGVmbGF0ZQorICAgIHNwZWNmaWNpYXRpb24gaW4gUkZDIDE5NTEsIG1vc3Qgbm90YWJseSBNaWNyb3NvZnQuIFNvIGV2ZW4gdGhvdWdoIHRoZQorICAgICJkZWZsYXRlIiB0cmFuc2ZlciBlbmNvZGluZyB1c2luZyB0aGUgemxpYiBmb3JtYXQgd291bGQgYmUgdGhlIG1vcmUKKyAgICBlZmZpY2llbnQgYXBwcm9hY2ggKGFuZCBpbiBmYWN0IGV4YWN0bHkgd2hhdCB0aGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkCisgICAgZm9yKSwgdXNpbmcgdGhlICJnemlwIiB0cmFuc2ZlciBlbmNvZGluZyBpcyBwcm9iYWJseSBtb3JlIHJlbGlhYmxlIGR1ZSB0bworICAgIGFuIHVuZm9ydHVuYXRlIGNob2ljZSBvZiBuYW1lIG9uIHRoZSBwYXJ0IG9mIHRoZSBIVFRQIDEuMSBhdXRob3JzLgorCiszNi4gRG9lcyB6bGliIHN1cHBvcnQgdGhlIG5ldyAiRGVmbGF0ZTY0IiBmb3JtYXQgaW50cm9kdWNlZCBieSBQS1dhcmU/CisKKyAgICBOby4gUEtXYXJlIGhhcyBhcHBhcmVudGx5IGRlY2lkZWQgdG8ga2VlcCB0aGF0IGZvcm1hdCBwcm9wcmlldGFyeSwgc2luY2UKKyAgICB0aGV5IGhhdmUgbm90IGRvY3VtZW50ZWQgaXQgYXMgdGhleSBoYXZlIHByZXZpb3VzIGNvbXByZXNzaW9uIGZvcm1hdHMuCisgICAgSW4gYW55IGNhc2UsIHRoZSBjb21wcmVzc2lvbiBpbXByb3ZlbWVudHMgYXJlIHNvIG1vZGVzdCBjb21wYXJlZCB0byBvdGhlcgorICAgIG1vcmUgbW9kZXJuIGFwcHJvYWNoZXMsIHRoYXQgaXQncyBub3Qgd29ydGggdGhlIGVmZm9ydCB0byBpbXBsZW1lbnQuCisKKzM3LiBDYW4geW91IHBsZWFzZSBzaWduIHRoZXNlIGxlbmd0aHkgbGVnYWwgZG9jdW1lbnRzIGFuZCBmYXggdGhlbSBiYWNrIHRvIHVzCisgICAgc28gdGhhdCB3ZSBjYW4gdXNlIHlvdXIgc29mdHdhcmUgaW4gb3VyIHByb2R1Y3Q/CisKKyAgICBOby4KZGlmZiAtLWdpdCBhL0lOREVYIGIvSU5ERVgKaW5kZXggOGEyNDU3Ni4uODdkZjk1OSAxMDA2NDQKLS0tIGEvSU5ERVgKKysrIGIvSU5ERVgKQEAgLTEsMzYgKzEsMTYgQEAKIENoYW5nZUxvZwkJaGlzdG9yeSBvZiBjaGFuZ2VzCi1JTkRFWAkJCXRoaXMgZmlsZQogRkFRCQkJRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgemxpYgotTWFrZV92bXMuY29tCQlzY3JpcHQgZm9yIFZheC9WTVMKK0lOREVYCQkJdGhpcyBmaWxlCiBNYWtlZmlsZQkJbWFrZWZpbGUgZm9yIFVuaXggKGdlbmVyYXRlZCBieSBjb25maWd1cmUpCiBNYWtlZmlsZS5pbgkJbWFrZWZpbGUgZm9yIFVuaXggKHRlbXBsYXRlIGZvciBjb25maWd1cmUpCi1NYWtlZmlsZS5yaXNjb3MgCW1ha2VmaWxlIGZvciBSSVNDT1MKIFJFQURNRQkJCWd1ZXNzIHdoYXQKIGFsZ29yaXRobS50eHQJCWRlc2NyaXB0aW9uIG9mIHRoZSAoZGUpY29tcHJlc3Npb24gYWxnb3JpdGhtCiBjb25maWd1cmUJCWNvbmZpZ3VyZSBzY3JpcHQgZm9yIFVuaXgKLWRlc2NyaXAubW1zCQltYWtlZmlsZSBmb3IgVmF4L1ZNUwotemxpYi4zCQkJbWluaSBtYW4gcGFnZSBmb3IgemxpYiAodm9sdW50ZWVycyB0byB3cml0ZSBmdWxsCi0JCQltYW4gcGFnZXMgZnJvbSB6bGliLmggd2VsY29tZS4gd3JpdGUgdG8gamxvdXBAZ3ppcC5vcmcpCit6Y29uZi5pbi5oCQl0ZW1wbGF0ZSBmb3IgemNvbmYuaCAodXNlZCBieSBjb25maWd1cmUpCiAKLWFtaWdhL01ha2VmaWxlLnNhcwltYWtlZmlsZSBmb3IgQW1pZ2EgU0FTL0MKLWFtaWdhL01ha2VmaWxlLnB1cCAgICAgIG1ha2VmaWxlIGZvciBBbWlnYSBwb3dlclVQIFNBUy9DIFBQQwotCi1tc2Rvcy9NYWtlZmlsZS53MzIgICAgICBtYWtlZmlsZSBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgMzItYml0Ci1tc2Rvcy9NYWtlZmlsZS5iMzIJbWFrZWZpbGUgZm9yIEJvcmxhbmQgQysrICAgMzItYml0Ci1tc2Rvcy9NYWtlZmlsZS5ib3IJbWFrZWZpbGUgZm9yIEJvcmxhbmQgQy9DKysgMTYtYml0Ci1tc2Rvcy9NYWtlZmlsZS5kajIJbWFrZWZpbGUgZm9yIERKR1BQIDIueAotbXNkb3MvTWFrZWZpbGUuZW14CW1ha2VmaWxlIGZvciBFTVggMC45YyAoMzItYml0IERPUy9PUzIpCi1tc2Rvcy9NYWtlZmlsZS5tc2MJbWFrZWZpbGUgZm9yIE1pY3Jvc29mdCBDIDE2LWJpdAotbXNkb3MvTWFrZWZpbGUudGMJbWFrZWZpbGUgZm9yIFR1cmJvIEMKLW1zZG9zL01ha2VmaWxlLndhdAltYWtlZmlsZSBmb3IgV2F0Y29tIEMKLW1zZG9zL3psaWIuZGVmICAgICAgICAJZGVmaW5pdGlvbiBmaWxlIGZvciBXaW5kb3dzIERMTAotbXNkb3MvemxpYi5yYyAgICAgICAgIAlkZWZpbml0aW9uIGZpbGUgZm9yIFdpbmRvd3MgRExMCi0KLW50L01ha2VmaWxlLm50CQltYWtlZmlsZSBmb3IgV2luZG93cyBOVAotbnQvemxpYi5kbnQJCWRlZmluaXRpb24gZmlsZSBmb3IgV2luZG93cyBOVCBETEwKLW50L01ha2VmaWxlLmVteAkJbWFrZWZpbGUgZm9yIEVNWCAwLjljL1JTWE5UIDEuNDEgKFdpbjMyIEludGVsKQotbnQvTWFrZWZpbGUuZ2NjCQltYWtlZmlsZSBmb3IgV2luZG93cyBOVCB1c2luZyBHQ0MgKG1pbmd3MzIpCi0KK2FpeC8JCQlpbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIGFuIEFJWCBzaGFyZWQgbGlicmFyeQorb2xkLwkJCW1ha2VmaWxlcyBmb3IgdmFyaW91cyBhcmNoaXRlY3R1cmVzIGFuZCB6bGliIGRvY3VtZW50YXRpb24KKwkJCXRoYXQgaGFzIG5vdCB5ZXQgYmVlbiB1cGRhdGVkIGZvciB6bGliIDEuMi54CiAKIAkJemxpYiBwdWJsaWMgaGVhZGVyIGZpbGVzIChtdXN0IGJlIGtlcHQpOgogemNvbmYuaApAQCAtNDAsMjIgKzIwLDIwIEBACiBhZGxlcjMyLmMKIGNvbXByZXNzLmMKIGNyYzMyLmMKK2NyYzMyLmgKIGRlZmxhdGUuYwogZGVmbGF0ZS5oCiBnemlvLmMKLWluZmJsb2NrLmMKLWluZmJsb2NrLmgKLWluZmNvZGVzLmMKLWluZmNvZGVzLmgKK2luZmJhY2suYwogaW5mZmFzdC5jCiBpbmZmYXN0LmgKK2luZmZpeGVkLmgKIGluZmxhdGUuYworaW5mbGF0ZS5oCiBpbmZ0cmVlcy5jCiBpbmZ0cmVlcy5oCi1pbmZ1dGlsLmMKLWluZnV0aWwuaAotbWFrZXRyZWUuYwogdHJlZXMuYwordHJlZXMuaAogdW5jb21wci5jCiB6dXRpbC5jCiB6dXRpbC5oCkBAIC02NSwyMiArNDMsNCBAQAogbWluaWd6aXAuYwogCiAJCXVuc3VwcG9ydGVkIGNvbnRyaWJ1dGlvbiBieSB0aGlyZCBwYXJ0aWVzCi0KLWNvbnRyaWIvYXNtMzg2LyBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+Ci0JMzg2IGFzbSBjb2RlIHJlcGxhY2luZyBsb25nZXN0X21hdGNoKCkuCi0KLWNvbnRyaWIvbWluaXppcC8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgotCU1pbmkgemlwIGFuZCB1bnppcCBiYXNlZCBvbiB6bGliCi0gICAgICAgIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKLQotY29udHJpYi9pb3N0cmVhbS8gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+Ci0gICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCi0KLWNvbnRyaWIvaW9zdHJlYW0yLyAgYnkgVHlnZSBM+HZzZXQgPFR5Z2UuTG92c2V0QGNtci5ubz4KLQlBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKLQotY29udHJpYi91bnRnei8gIGJ5ICJQZWRybyBBLiBBcmFuZGEgR3V0aVxpcnJleiIgPHBhYWdAdGlkLmVzPgotCUEgdmVyeSBzaW1wbGUgdGFyLmd6IGV4dHJhY3RvciB1c2luZyB6bGliCi0KLWNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBieSBDYXJsb3MgUmlvcyA8Y19yaW9zQHNvbmRhLmNsPgotICAgICAgICBIb3cgdG8gdXNlIGNvbXByZXNzKCksIHVuY29tcHJlc3MoKSBhbmQgdGhlIGd6KiBmdW5jdGlvbnMgZnJvbSBWQi4KK1NlZSBjb250cmliL1JFQURNRS5jb250cmliCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDUzMTU2MmIuLjA4N2UzODggMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogIyBNYWtlZmlsZSBmb3IgemxpYgotIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5LgogIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAogCiAjIFRvIGNvbXBpbGUgYW5kIHRlc3QsIHR5cGU6CkBAIC0yMCwxMSArMjAsMTEgQEAKICNDRkxBR1M9LU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKICMgICAgICAgICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMKIAotTERGTEFHUz0tTC4gLWx6CitMREZMQUdTPWxpYnouYQogTERTSEFSRUQ9JChDQykKIENQUD0kKENDKSAtRQogCi1WRVI9MS4xLjQKK1ZFUj0xLjIuMAogTElCUz1saWJ6LmEKIFNIQVJFRExJQj1saWJ6LnNvCiAKQEAgLTM5LDEzICszOSwxNCBAQAogaW5jbHVkZWRpciA9ICR7cHJlZml4fS9pbmNsdWRlCiAKIE9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAotICAgICAgIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJsb2NrLm8gaW5mdHJlZXMubyBpbmZjb2Rlcy5vIGluZnV0aWwubyBpbmZmYXN0Lm8KKyAgICAgICB6dXRpbC5vIGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KIAogT0JKQSA9CiAjIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vCiAKIFRFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCiAKKyMgTm90ZTogdGhpcyBoYXNuJ3QgYmVlbiB1cGRhdGVkIGZvciB6bGliIDEuMi4wCiBESVNURklMRVMgPSBSRUFETUUgRkFRIElOREVYIENoYW5nZUxvZyBjb25maWd1cmUgTWFrZSpbYS16MC05XSAqLltjaF0gKi5tbXMgXAogICBhbGdvcml0aG0udHh0IHpsaWIuMyB6bGliLmh0bWwgXAogICBtc2Rvcy9NYWtlKlthLXowLTldIG1zZG9zL3psaWIuZGVmIG1zZG9zL3psaWIucmMgXApAQCAtOTMsNiArOTQsNyBAQAogCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBtaW5pZ3ppcC5vICQoTERGTEFHUykKIAogaW5zdGFsbDogJChMSUJTKQorCS1AaWYgWyAhIC1kICQoZXhlY19wcmVmaXgpIF07IHRoZW4gbWtkaXIgJChleGVjX3ByZWZpeCk7IGZpCiAJLUBpZiBbICEgLWQgJChpbmNsdWRlZGlyKSAgXTsgdGhlbiBta2RpciAkKGluY2x1ZGVkaXIpOyBmaQogCS1AaWYgWyAhIC1kICQobGliZGlyKSBdOyB0aGVuIG1rZGlyICQobGliZGlyKTsgZmkKIAljcCB6bGliLmggemNvbmYuaCAkKGluY2x1ZGVkaXIpCkBAIC0xMjYsNiArMTI4LDggQEAKIAkgICBfbWF0Y2gucyBtYWtldHJlZQogCiBkaXN0Y2xlYW46CWNsZWFuCisJY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKKwljcCAtcCB6Y29uZi5pbi5oIHpjb25mLmgKIAogemlwOgogCW12IE1ha2VmaWxlIE1ha2VmaWxlfjsgY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKQEAgLTEzNSw2ICsxMzksNyBAQAogCW12IE1ha2VmaWxlfiBNYWtlZmlsZQogCiBkaXN0OgorCWVjaG8gV2FybmluZzogdGhpcyBoYXNuJ3QgYmVlbiB1cGRhdGVkIGZvciB6bGliIDEuMi4wIC0tIGRvbid0IHVzZQogCW12IE1ha2VmaWxlIE1ha2VmaWxlfjsgY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKIAlybSAtZiB0ZXN0LmMgenRlc3QqLmMgY29udHJpYi9taW5pemlwL3Rlc3QuemlwCiAJZD16bGliLWBzZWQgLW4gJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgO1wKQEAgLTE1NywxOCArMTYyLDE0IEBACiAKIGFkbGVyMzIubzogemxpYi5oIHpjb25mLmgKIGNvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCi1jcmMzMi5vOiB6bGliLmggemNvbmYuaAorY3JjMzIubzogY3JjMzIuaCB6bGliLmggemNvbmYuaAogZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAogZXhhbXBsZS5vOiB6bGliLmggemNvbmYuaAogZ3ppby5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZibG9jay5vOiBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mY29kZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mY29kZXMubzogaW5mdHJlZXMuaCBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mdXRpbC5oIGluZmZhc3QuaAotaW5mZmFzdC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLWluZmZhc3QubzogaW5mYmxvY2suaCBpbmZjb2Rlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKLWluZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCitpbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZsYXRlLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZiYWNrLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCiBpbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLWluZnV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKIG1pbmlnemlwLm86ICB6bGliLmggemNvbmYuaCAKIHRyZWVzLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKIHVuY29tcHIubzogemxpYi5oIHpjb25mLmgKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggNTMxNTYyYi4uMDg3ZTM4OCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTEsNSArMSw1IEBACiAjIE1ha2VmaWxlIGZvciB6bGliCi0jIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCisjIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCiAjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCiAKICMgVG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKQEAgLTIwLDExICsyMCwxMSBAQAogI0NGTEFHUz0tTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV2NvbnZlcnNpb24gXAogIyAgICAgICAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcwogCi1MREZMQUdTPS1MLiAtbHoKK0xERkxBR1M9bGliei5hCiBMRFNIQVJFRD0kKENDKQogQ1BQPSQoQ0MpIC1FCiAKLVZFUj0xLjEuNAorVkVSPTEuMi4wCiBMSUJTPWxpYnouYQogU0hBUkVETElCPWxpYnouc28KIApAQCAtMzksMTMgKzM5LDE0IEBACiBpbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKIAogT0JKUyA9IGFkbGVyMzIubyBjb21wcmVzcy5vIGNyYzMyLm8gZ3ppby5vIHVuY29tcHIubyBkZWZsYXRlLm8gdHJlZXMubyBcCi0gICAgICAgenV0aWwubyBpbmZsYXRlLm8gaW5mYmxvY2subyBpbmZ0cmVlcy5vIGluZmNvZGVzLm8gaW5mdXRpbC5vIGluZmZhc3QubworICAgICAgIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubwogCiBPQkpBID0KICMgdG8gdXNlIHRoZSBhc20gY29kZTogbWFrZSBPQkpBPW1hdGNoLm8KIAogVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KIAorIyBOb3RlOiB0aGlzIGhhc24ndCBiZWVuIHVwZGF0ZWQgZm9yIHpsaWIgMS4yLjAKIERJU1RGSUxFUyA9IFJFQURNRSBGQVEgSU5ERVggQ2hhbmdlTG9nIGNvbmZpZ3VyZSBNYWtlKlthLXowLTldICouW2NoXSAqLm1tcyBcCiAgIGFsZ29yaXRobS50eHQgemxpYi4zIHpsaWIuaHRtbCBcCiAgIG1zZG9zL01ha2UqW2EtejAtOV0gbXNkb3MvemxpYi5kZWYgbXNkb3MvemxpYi5yYyBcCkBAIC05Myw2ICs5NCw3IEBACiAJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChMREZMQUdTKQogCiBpbnN0YWxsOiAkKExJQlMpCisJLUBpZiBbICEgLWQgJChleGVjX3ByZWZpeCkgXTsgdGhlbiBta2RpciAkKGV4ZWNfcHJlZml4KTsgZmkKIAktQGlmIFsgISAtZCAkKGluY2x1ZGVkaXIpICBdOyB0aGVuIG1rZGlyICQoaW5jbHVkZWRpcik7IGZpCiAJLUBpZiBbICEgLWQgJChsaWJkaXIpIF07IHRoZW4gbWtkaXIgJChsaWJkaXIpOyBmaQogCWNwIHpsaWIuaCB6Y29uZi5oICQoaW5jbHVkZWRpcikKQEAgLTEyNiw2ICsxMjgsOCBAQAogCSAgIF9tYXRjaC5zIG1ha2V0cmVlCiAKIGRpc3RjbGVhbjoJY2xlYW4KKwljcCAtcCBNYWtlZmlsZS5pbiBNYWtlZmlsZQorCWNwIC1wIHpjb25mLmluLmggemNvbmYuaAogCiB6aXA6CiAJbXYgTWFrZWZpbGUgTWFrZWZpbGV+OyBjcCAtcCBNYWtlZmlsZS5pbiBNYWtlZmlsZQpAQCAtMTM1LDYgKzEzOSw3IEBACiAJbXYgTWFrZWZpbGV+IE1ha2VmaWxlCiAKIGRpc3Q6CisJZWNobyBXYXJuaW5nOiB0aGlzIGhhc24ndCBiZWVuIHVwZGF0ZWQgZm9yIHpsaWIgMS4yLjAgLS0gZG9uJ3QgdXNlCiAJbXYgTWFrZWZpbGUgTWFrZWZpbGV+OyBjcCAtcCBNYWtlZmlsZS5pbiBNYWtlZmlsZQogCXJtIC1mIHRlc3QuYyB6dGVzdCouYyBjb250cmliL21pbml6aXAvdGVzdC56aXAKIAlkPXpsaWItYHNlZCAtbiAnL1ZFUlNJT04gIi9zLy4qIlwoLipcKSIuKi9cMS9wJyA8IHpsaWIuaGA7XApAQCAtMTU3LDE4ICsxNjIsMTQgQEAKIAogYWRsZXIzMi5vOiB6bGliLmggemNvbmYuaAogY29tcHJlc3MubzogemxpYi5oIHpjb25mLmgKLWNyYzMyLm86IHpsaWIuaCB6Y29uZi5oCitjcmMzMi5vOiBjcmMzMi5oIHpsaWIuaCB6Y29uZi5oCiBkZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiBleGFtcGxlLm86IHpsaWIuaCB6Y29uZi5oCiBnemlvLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWluZmJsb2NrLm86IGluZmJsb2NrLmggaW5mdHJlZXMuaCBpbmZjb2Rlcy5oIGluZnV0aWwuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZjb2Rlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZjb2Rlcy5vOiBpbmZ0cmVlcy5oIGluZmJsb2NrLmggaW5mY29kZXMuaCBpbmZ1dGlsLmggaW5mZmFzdC5oCi1pbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotaW5mZmFzdC5vOiBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mdXRpbC5oIGluZmZhc3QuaAotaW5mbGF0ZS5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmgKK2luZmZhc3QubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZmJhY2subzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKIGluZnRyZWVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotaW5mdXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmggaW5mdHJlZXMuaCBpbmZjb2Rlcy5oIGluZnV0aWwuaAogbWluaWd6aXAubzogIHpsaWIuaCB6Y29uZi5oIAogdHJlZXMubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaAogdW5jb21wci5vOiB6bGliLmggemNvbmYuaApkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDI5ZDY3MTQuLjI2YWIyYjYgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTEsNCArMSw0IEBACi16bGliIDEuMS40IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4gIEFsbCB0aGUgY29kZQoremxpYiAxLjIuMCBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuICBBbGwgdGhlIGNvZGUKIGlzIHRocmVhZCBzYWZlLiAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeQogaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIAogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUKQEAgLTMyLDIyICszMiw3IEBACiBpc3N1ZSBvZiAgRHIuIERvYmIncyBKb3VybmFsOyBhIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGluCiBodHRwOi8vZG9nbWEubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQogCi1UaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4xLjQgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgQ2hhbmdlTG9nLgotVGhlIG9ubHkgY2hhbmdlcyBtYWRlIHNpbmNlIDEuMS4zIGFyZSBidWcgY29ycmVjdGlvbnM6Ci0KLS0gWkZSRUUgd2FzIHJlcGVhdGVkIG9uIHNhbWUgYWxsb2NhdGlvbiBvbiBzb21lIGVycm9yIGNvbmRpdGlvbnMuCi0gIFRoaXMgY3JlYXRlcyBhIHNlY3VyaXR5IHByb2JsZW0gZGVzY3JpYmVkIGluCi0gIGh0dHA6Ly93d3cuemxpYi5vcmcvYWR2aXNvcnktMjAwMi0wMy0xMS50eHQKLS0gUmV0dXJuZWQgaW5jb3JyZWN0IGVycm9yIChaX01FTV9FUlJPUikgb24gc29tZSBpbnZhbGlkIGRhdGEKLS0gQXZvaWQgYWNjZXNzZXMgYmVmb3JlIHdpbmRvdyBmb3IgaW52YWxpZCBkaXN0YW5jZXMgd2l0aCBpbmZsYXRlIHdpbmRvdwotICBsZXNzIHRoYW4gMzJLLgotLSBmb3JjZSB3aW5kb3dCaXRzID4gOCB0byBhdm9pZCBhIGJ1ZyBpbiB0aGUgZW5jb2RlciBmb3IgYSB3aW5kb3cgc2l6ZQotICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuCi0KLVRoZSBiZXRhIHZlcnNpb24gMS4xLjViZXRhIGluY2x1ZGVzIG1hbnkgbW9yZSBjaGFuZ2VzLiBBIG5ldyBvZmZpY2lhbAotdmVyc2lvbiAxLjEuNSB3aWxsIGJlIHJlbGVhc2VkIGFzIHNvb24gYXMgZXh0ZW5zaXZlIHRlc3RpbmcgaGFzIGJlZW4KLWNvbXBsZXRlZCBvbiBpdC4KLQorVGhlIGNoYW5nZXMgbWFkZSBpbiB2ZXJzaW9uIDEuMi4wIGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIENoYW5nZUxvZy4KIAogVW5zdXBwb3J0ZWQgdGhpcmQgcGFydHkgY29udHJpYnV0aW9ucyBhcmUgcHJvdmlkZWQgaW4gZGlyZWN0b3J5ICJjb250cmliIi4KIApAQCAtNTUsNyArNDAsNyBAQAogaHR0cDovL3d3dy5qYXZhc29mdC5jb20vcHJvZHVjdHMvSkRLLzEuMS9kb2NzL2FwaS9QYWNrYWdlLWphdmEudXRpbC56aXAuaHRtbAogU2VlIHRoZSB6bGliIGhvbWUgcGFnZSBodHRwOi8vd3d3LnpsaWIub3JnIGZvciBkZXRhaWxzLgogCi1BIFBlcmwgaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIDxwbWFycXVlc3NAYmZzZWMuYnQuY28udWs+CitBIFBlcmwgaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIDxwbXFzQGNwYW4ub3JnPgogaXMgaW4gdGhlIENQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspIHNpdGVzCiBodHRwOi8vd3d3LmNwYW4ub3JnL21vZHVsZXMvYnktbW9kdWxlL0NvbXByZXNzLwogCkBAIC0xMTYsNyArMTAxLDcgQEAKIAogQ29weXJpZ2h0IG5vdGljZToKIAotIChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorIChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgogCiAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiAgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKZGlmZiAtLWdpdCBhL2FkbGVyMzIuYyBiL2FkbGVyMzIuYwppbmRleCBmYWU4OGI2Li4zMTk2MDNjIDEwMDY0NAotLS0gYS9hZGxlcjMyLmMKKysrIGIvYWRsZXIzMi5jCkBAIC0xLDUgKzEsNSBAQAogLyogYWRsZXIzMi5jIC0tIGNvbXB1dGUgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIGEgZGF0YSBzdHJlYW0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCiAgKi8KIApAQCAtMzAsNyArMzAsNyBAQAogICAgIGlmIChidWYgPT0gWl9OVUxMKSByZXR1cm4gMUw7CiAKICAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBrID0gbGVuIDwgTk1BWCA/IGxlbiA6IE5NQVg7CisgICAgICAgIGsgPSBsZW4gPCBOTUFYID8gKGludClsZW4gOiBOTUFYOwogICAgICAgICBsZW4gLT0gazsKICAgICAgICAgd2hpbGUgKGsgPj0gMTYpIHsKICAgICAgICAgICAgIERPMTYoYnVmKTsKZGlmZiAtLWdpdCBhL2FpeC9SRUFETUUgYi9haXgvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNWJhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9haXgvUkVBRE1FCkBAIC0wLDAgKzEsOSBAQAorVG8gbWFrZSBhIHNoYXJlZCBsaWJyYXJ5OgorCisxLiBDb21waWxlIGEgc3RhdGljIGxpYnJhcnkKKzIuIFVzZSBta2V4cHMgb24gdGhhdCB0byBjcmVhdGUgbGliei5leHAKKzMuIEFwcGx5IHRoZSBjb25maWd1cmUuZGlmZiBwYXRjaCB0byBjb25maWd1cmUKKzQuIFJ1biB0aGUgbmV3IGNvbmZpZ3VyZSB0byBtYWtlIGEgbmV3IE1ha2VmaWxlCis1LiBVc2UgdGhlIG5ldyBNYWtlZmlsZSB0byBtYWtlIHRoZSBzaGFyZWQgbGlicmFyeQorCitDb3VydGVzeSBvZiBkYmFra2VyQGFycmF5YXNvbHV0aW9ucy5jb20KZGlmZiAtLWdpdCBhL2FpeC9jb25maWd1cmUuZGlmZiBiL2FpeC9jb25maWd1cmUuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjk5MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYWl4L2NvbmZpZ3VyZS5kaWZmCkBAIC0wLDAgKzEsNTcgQEAKKyoqKiAuLi9vcmlnL3psaWItMS4xLjQvY29uZmlndXJlCVdlZCBKdWwgIDggMTQ6MTk6MzUgMTk5OAorLS0tIGNvbmZpZ3VyZQlTdW4gRmViICA5IDExOjExOjE5IDIwMDMKKyoqKioqKioqKioqKioqKgorKioqIDE4LDIzICoqKioKKy0tLSAxOCwyNCAtLS0tCisgICMgSWYgeW91IGhhdmUgcHJvYmxlbXMsIHRyeSB3aXRob3V0IGRlZmluaW5nIENDIGFuZCBDRkxBR1MgYmVmb3JlIHJlcG9ydGluZworICAjIGFuIGVycm9yLgorICAKKysgTERGTEFHUz0iLUwuIC1seiIKKyAgTElCUz1saWJ6LmEKKyAgU0hBUkVETElCPWxpYnouc28KKyAgVkVSPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgCisqKioqKioqKioqKioqKioKKyoqKiAxMTYsMTIxICoqKioKKy0tLSAxMTcsMTI4IC0tLS0KKyAgCSAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItS2NvbmZvcm1fcGljIC1PIn0KKyAgCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CisgIAkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn07OworKyAgIEFJWCopICAgICAKKysgCSAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtcW1heG1lbT04MTkyIn0KKysgCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyAtcW1heG1lbT04MTkyIn0KKysgCSAgICAgTERURVNUU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn0KKysgCSAgICAgTERTSEFSRURGTEFHUz0iLUwuIGxpYnouc28iCisrIAkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn07OworICAgICMgc2VuZCB3b3JraW5nIG9wdGlvbnMgZm9yIG90aGVyIHN5c3RlbXMgdG8gc3VwcG9ydEBnemlwLm9yZworICAgICopICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CisgIAkgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQorKioqKioqKioqKioqKioqCisqKiogMTI3LDEzNSAqKioqCisgICAgZWNobyBDaGVja2luZyBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4uLgorICAgICMgd2UgbXVzdCB0ZXN0IGluIHR3byBzdGVwcyAoY2MgdGhlbiBsZCksIHJlcXVpcmVkIGF0IGxlYXN0IG9uIFN1bk9TIDQueAorICAgIGlmIHRlc3QgImAoJENDIC1jICRTRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiIgJiYKKyEgICAgICB0ZXN0ICJgKCRMRFNIQVJFRCAtbyAkdGVzdCRzaGFyZWRfZXh0ICR0ZXN0Lm8pIDI+JjFgIiA9ICIiOyB0aGVuCisgICAgICBDRkxBR1M9IiRTRkxBR1MiCisgICAgICBMSUJTPSIkU0hBUkVETElCLiRWRVIiCisgICAgICBlY2hvIEJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJ5ICRTSEFSRURMSUIuJFZFUiB3aXRoICRDQy4KKyAgICBlbGlmIHRlc3QgLXogIiRvbGRfY2MiIC1hIC16ICIkb2xkX2NmbGFncyI7IHRoZW4KKyAgICAgIGVjaG8gTm8gc2hhcmVkIGxpYnJhcnkgc3VwcHBvcnQuCistLS0gMTM0LDE0MyAtLS0tCisgICAgZWNobyBDaGVja2luZyBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4uLgorICAgICMgd2UgbXVzdCB0ZXN0IGluIHR3byBzdGVwcyAoY2MgdGhlbiBsZCksIHJlcXVpcmVkIGF0IGxlYXN0IG9uIFN1bk9TIDQueAorICAgIGlmIHRlc3QgImAoJENDIC1jICRTRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiIgJiYKKyEgICAgICB0ZXN0ICJgKCRMRFRFU1RTSEFSRUQgLW8gJHRlc3Qkc2hhcmVkX2V4dCAkdGVzdC5vKSAyPiYxYCIgPSAiIjsgdGhlbgorICAgICAgQ0ZMQUdTPSIkU0ZMQUdTIgorICAgICAgTElCUz0iJFNIQVJFRExJQi4kVkVSIgorKyAJTERGTEFHUz0iJExEU0hBUkVERkxBR1MiCisgICAgICBlY2hvIEJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJ5ICRTSEFSRURMSUIuJFZFUiB3aXRoICRDQy4KKyAgICBlbGlmIHRlc3QgLXogIiRvbGRfY2MiIC1hIC16ICIkb2xkX2NmbGFncyI7IHRoZW4KKyAgICAgIGVjaG8gTm8gc2hhcmVkIGxpYnJhcnkgc3VwcHBvcnQuCisqKioqKioqKioqKioqKioKKyoqKiAyMDksMjEyICoqKioKKy0tLSAyMTcsMjIxIC0tLS0KKyAgL15leGVjX3ByZWZpeCAqPS9zJT0uKiU9JGV4ZWNfcHJlZml4JQorICAvXmxpYmRpciAqPS9zJT0uKiU9JGxpYmRpciUKKyAgL15pbmNsdWRlZGlyICo9L3MlPS4qJT0kaW5jbHVkZWRpciUKKysgL15MREZMQUdTICo9L3MlPS4qJT0kTERGTEFHUyUKKyAgIiA+IE1ha2VmaWxlCmRpZmYgLS1naXQgYS9haXgvbWtleHBzIGIvYWl4L21rZXhwcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzU1ZWFlCi0tLSAvZGV2L251bGwKKysrIGIvYWl4L21rZXhwcwpAQCAtMCwwICsxLDM3IEBACisjIS9iaW4va3NoCisjCisjIG1rZXhwcyAtIG1ha2UgZXhwb3J0IGxpc3QKKyMgVGhpcyBwcm9ncmFtIGNyZWF0ZXMgYW4gZXhwb3J0IGxpc3QgYnkgY29tYmluaW5nIGFsbCB0aGUgIi4iIGFuZCBub3JtYWwgbmFtZXMKKyMgaW50byBvbmUgbGlzdC4KKyMKK2lmIFtbICIkIyIgLW5lIDEgXV0KK3RoZW4KKyAgICBwcmludCAiVXNhZ2U6IG1rZXhwcyBBcmNoaXZlRmlsZSIKKyAgICBleGl0IC0yCitmaQoraWYgW1sgISAtZiAkMSBdXQordGhlbgorICAgIHByaW50ICJta2V4cHM6IENhbm5vdCBvcGVuIGZpbGUgXCIkMVwiIgorICAgIGV4aXQgLTEKK2ZpCisKK2R1bXAgLWcgJDEgfCBhd2sgJworQkVHSU4geworICAgICAgICB0b3AgPSAxCit9CisvXlsgXSpbMC05XVswLTldKi8geworICAgIGlmICggKG4gPSBpbmRleCggJDIsICIuIiApKSA+IDAgKSB7CisgICAgICAgIGV4cG9ydF9hcnJheVsgdG9wKysgXSA9IHN1YnN0ciggJDIsIG4rMSwgbGVuZ3RoKCAkMiApKQorICAgIH0KKyAgICBlbHNlIHsKKwlleHBvcnRfYXJyYXlbIHRvcCsrIF0gPSAkMgorICAgIH0KK30KKworRU5EIHsKKyAgICBmb3IgKCBpID0gMTsgaSA8IHRvcDsgaSsrICkKKyAgICB7CisJcHJpbnQgZXhwb3J0X2FycmF5WyBpIF0KKyAgICB9CisKK30nIHwgc29ydCB8IHVuaXEKZGlmZiAtLWdpdCBhL2FsZ29yaXRobS50eHQgYi9hbGdvcml0aG0udHh0CmluZGV4IGNkYzgzMGIuLmY2NGY3YzMgMTAwNjQ0Ci0tLSBhL2FsZ29yaXRobS50eHQKKysrIGIvYWxnb3JpdGhtLnR4dApAQCAtNTksMTAgKzU5LDEwIEBACiAKIDIuMSBJbnRyb2R1Y3Rpb24KIAotVGhlIHJlYWwgcXVlc3Rpb24gaXMsIGdpdmVuIGEgSHVmZm1hbiB0cmVlLCBob3cgdG8gZGVjb2RlIGZhc3QuICBUaGUgbW9zdAotaW1wb3J0YW50IHJlYWxpemF0aW9uIGlzIHRoYXQgc2hvcnRlciBjb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuCi1sb25nZXIgY29kZXMsIHNvIHBheSBhdHRlbnRpb24gdG8gZGVjb2RpbmcgdGhlIHNob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQKLXRoZSBsb25nIGNvZGVzIHRha2UgbG9uZ2VyIHRvIGRlY29kZS4KK1RoZSBrZXkgcXVlc3Rpb24gaXMgaG93IHRvIHJlcHJlc2VudCBhIEh1ZmZtYW4gY29kZSAob3IgYW55IHByZWZpeCBjb2RlKSBzbwordGhhdCB5b3UgY2FuIGRlY29kZSBmYXN0LiAgVGhlIG1vc3QgaW1wb3J0YW50IGNoYXJhY3RlcmlzdGljIGlzIHRoYXQgc2hvcnRlcgorY29kZXMgYXJlIG11Y2ggbW9yZSBjb21tb24gdGhhbiBsb25nZXIgY29kZXMsIHNvIHBheSBhdHRlbnRpb24gdG8gZGVjb2RpbmcgdGhlCitzaG9ydCBjb2RlcyBmYXN0LCBhbmQgbGV0IHRoZSBsb25nIGNvZGVzIHRha2UgbG9uZ2VyIHRvIGRlY29kZS4KIAogaW5mbGF0ZSgpIHNldHMgdXAgYSBmaXJzdCBsZXZlbCB0YWJsZSB0aGF0IGNvdmVycyBzb21lIG51bWJlciBvZiBiaXRzIG9mCiBpbnB1dCBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiBsb25nZXN0IGNvZGUuICBJdCBnZXRzIHRoYXQgbWFueSBiaXRzIGZyb20gdGhlCkBAIC03NywyMCArNzcsMTYgQEAKIGJlIGEgZmlyc3QgbGV2ZWwgdGFibGUgdG8gY292ZXIgYWxsIHRoZSB3YXkgdG8gdGhlIGxvbmdlc3QgY29kZS4gIEhvd2V2ZXIsCiBidWlsZGluZyB0aGUgdGFibGUgZW5kcyB1cCB0YWtpbmcgYSBsb3QgbG9uZ2VyIGZvciBtb3JlIGJpdHMgc2luY2Ugc2hvcnQKIGNvZGVzIGFyZSByZXBsaWNhdGVkIG1hbnkgdGltZXMgaW4gc3VjaCBhIHRhYmxlLiAgV2hhdCBpbmZsYXRlKCkgZG9lcyBpcwotc2ltcGx5IHRvIG1ha2UgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaXJzdCB0YWJsZSBhIHZhcmlhYmxlLCBhbmQgc2V0IGl0Ci1mb3IgdGhlIG1heGltdW0gc3BlZWQuCitzaW1wbHkgdG8gbWFrZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZpcnN0IHRhYmxlIGEgdmFyaWFibGUsIGFuZCAgdGhlbgordG8gc2V0IHRoYXQgdmFyaWFibGUgZm9yIHRoZSBtYXhpbXVtIHNwZWVkLgogCi1pbmZsYXRlKCkgc2VuZHMgbmV3IHRyZWVzIHJlbGF0aXZlbHkgb2Z0ZW4sIHNvIGl0IGlzIHBvc3NpYmx5IHNldCBmb3IgYQotc21hbGxlciBmaXJzdCBsZXZlbCB0YWJsZSB0aGFuIGFuIGFwcGxpY2F0aW9uIHRoYXQgaGFzIG9ubHkgb25lIHRyZWUgZm9yCi1hbGwgdGhlIGRhdGEuICBGb3IgaW5mbGF0ZSwgd2hpY2ggaGFzIDI4NiBwb3NzaWJsZSBjb2RlcyBmb3IgdGhlCi1saXRlcmFsL2xlbmd0aCB0cmVlLCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgdGFibGUgaXMgbmluZSBiaXRzLiAgQWxzbyB0aGUKLWRpc3RhbmNlIHRyZWVzIGhhdmUgMzAgcG9zc2libGUgdmFsdWVzLCBhbmQgdGhlIHNpemUgb2YgdGhlIGZpcnN0IHRhYmxlIGlzCi1zaXggYml0cy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBvZiB0aG9zZSBjYXNlcywgdGhlIHRhYmxlIGVuZGVkIHVwIG9uZSBiaXQKLWxvbmdlciB0aGFuIHRoZSBgYGF2ZXJhZ2UnJyBjb2RlIGxlbmd0aCwgaS5lLiB0aGUgY29kZSBsZW5ndGggb2YgYW4KLWFwcHJveGltYXRlbHkgZmxhdCBjb2RlIHdoaWNoIHdvdWxkIGJlIGEgbGl0dGxlIG1vcmUgdGhhbiBlaWdodCBiaXRzIGZvcgotMjg2IHN5bWJvbHMgYW5kIGEgbGl0dGxlIGxlc3MgdGhhbiBmaXZlIGJpdHMgZm9yIDMwIHN5bWJvbHMuICBJdCB3b3VsZCBiZQotaW50ZXJlc3RpbmcgdG8gc2VlIGlmIG9wdGltaXppbmcgdGhlIGZpcnN0IGxldmVsIHRhYmxlIGZvciBvdGhlcgotYXBwbGljYXRpb25zIGdhdmUgdmFsdWVzIHdpdGhpbiBhIGJpdCBvciB0d28gb2YgdGhlIGZsYXQgY29kZSBzaXplLgorRm9yIGluZmxhdGUsIHdoaWNoIGhhcyAyODYgcG9zc2libGUgY29kZXMgZm9yIHRoZSBsaXRlcmFsL2xlbmd0aCB0cmVlLCB0aGUgc2l6ZQorb2YgdGhlIGZpcnN0IHRhYmxlIGlzIG5pbmUgYml0cy4gIEFsc28gdGhlIGRpc3RhbmNlIHRyZWVzIGhhdmUgMzAgcG9zc2libGUKK3ZhbHVlcywgYW5kIHRoZSBzaXplIG9mIHRoZSBmaXJzdCB0YWJsZSBpcyBzaXggYml0cy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBvZgordGhvc2UgY2FzZXMsIHRoZSB0YWJsZSBlbmRlZCB1cCBvbmUgYml0IGxvbmdlciB0aGFuIHRoZSBgYGF2ZXJhZ2UnJyBjb2RlCitsZW5ndGgsIGkuZS4gdGhlIGNvZGUgbGVuZ3RoIG9mIGFuIGFwcHJveGltYXRlbHkgZmxhdCBjb2RlIHdoaWNoIHdvdWxkIGJlIGEKK2xpdHRsZSBtb3JlIHRoYW4gZWlnaHQgYml0cyBmb3IgMjg2IHN5bWJvbHMgYW5kIGEgbGl0dGxlIGxlc3MgdGhhbiBmaXZlIGJpdHMKK2ZvciAzMCBzeW1ib2xzLgogCiAKIDIuMiBNb3JlIGRldGFpbHMgb24gdGhlIGluZmxhdGUgdGFibGUgbG9va3VwCkBAIC0xNTgsNyArMTU0LDcgQEAKIDExMDogLT4gdGFibGUgWCAoZ29iYmxlIDMgYml0cykKIDExMTogLT4gdGFibGUgWSAoZ29iYmxlIDMgYml0cykKIAotRWFjaCBlbnRyeSBpcyB3aGF0IHRoZSBiaXRzIGRlY29kZSB0byBhbmQgaG93IG1hbnkgYml0cyB0aGF0IGlzLCBpLmUuIGhvdyAgCitFYWNoIGVudHJ5IGlzIHdoYXQgdGhlIGJpdHMgZGVjb2RlIGFzIGFuZCBob3cgbWFueSBiaXRzIHRoYXQgaXMsIGkuZS4gaG93ICAKIG1hbnkgYml0cyB0byBnb2JibGUuICBPciB0aGUgZW50cnkgcG9pbnRzIHRvIGFub3RoZXIgdGFibGUsIHdpdGggdGhlIG51bWJlciBvZgogYml0cyB0byBnb2JibGUgaW1wbGljaXQgaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlLgogCmRpZmYgLS1naXQgYS9jb21wcmVzcy5jIGIvY29tcHJlc3MuYwppbmRleCA4MTRiZDlkLi5mMTBlMjM0IDEwMDY0NAotLS0gYS9jb21wcmVzcy5jCisrKyBiL2NvbXByZXNzLmMKQEAgLTY2LDMgKzY2LDEzIEBACiB7CiAgICAgcmV0dXJuIGNvbXByZXNzMihkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbiwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKIH0KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIElmIHRoZSBkZWZhdWx0IG1lbUxldmVsIG9yIHdpbmRvd0JpdHMgZm9yIGRlZmxhdGVJbml0KCkgaXMgY2hhbmdlZCwgdGhlbgorICAgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSB1cGRhdGVkLgorICovCit1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgKHNvdXJjZUxlbikKKyAgICB1TG9uZyBzb3VyY2VMZW47Cit7CisgICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKyAxMTsKK30KZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCBlODk0MjM1Li41MWVmMTBmIDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC03Miw4ICs3MiwxMSBAQAogICBTRkxBR1M9JHtDRkxBR1MtIi1mUElDIC1PMyJ9CiAgIENGTEFHUz0iJGNmbGFncyIKICAgY2FzZSBgKHVuYW1lIC1zIHx8IGVjaG8gdW5rbm93bikgMj4vZGV2L251bGxgIGluCi0gIExpbnV4IHwgbGludXgpIExEU0hBUkVEPSR7TERTSEFSRUQtImdjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSJ9OzsKLSAgKikgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iZ2NjIC1zaGFyZWQifTs7CisgIExpbnV4IHwgbGludXgpIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSJ9OzsKKyAgSFAtVVgqKSAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQgJFNGTEFHUyJ9CisgICAgICAgICAgICAgICAgIHNoYXJlZF9leHQ9Jy5zbCcKKyAgICAgICAgICAgICAgICAgU0hBUkVETElCPSdsaWJ6LnNsJzs7CisgICopICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIn07OwogICBlc2FjCiBlbHNlCiAgICMgZmluZCBzeXN0ZW0gbmFtZSBhbmQgY29ycmVzcG9uZGluZyBjYyBvcHRpb25zCkBAIC0xMTYsNiArMTE5LDEwIEBACiAJICAgICBTRkxBR1M9JHtDRkxBR1MtIi1LY29uZm9ybV9waWMgLU8ifQogCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CiAJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9OzsKKyAgT3BlblVOSVhcIDUpIAorCSAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItS1BJQyAtTyJ9CisJICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn07OwogICAjIHNlbmQgd29ya2luZyBvcHRpb25zIGZvciBvdGhlciBzeXN0ZW1zIHRvIHN1cHBvcnRAZ3ppcC5vcmcKICAgKikgICAgICAgICBTRkxBR1M9JHtDRkxBR1MtIi1PIn0KIAkgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQpAQCAtMTQ5LDEzICsxNTYsMjE5IEBACiBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KIEVPRgogaWYgdGVzdCAiYCgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIjsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX1VOSVNURF9IIgorICBzZWQgPCB6Y29uZi5pbi5oICIvSEFWRV9VTklTVERfSC9zJTAlMSUiID4gemNvbmYuaAogICBlY2hvICJDaGVja2luZyBmb3IgdW5pc3RkLmguLi4gWWVzLiIKIGVsc2UKKyAgY3AgLXAgemNvbmYuaW4uaCB6Y29uZi5oCiAgIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBOby4iCiBmaQogCiBjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmIChkZWZpbmVkKF9fTVNET1NfXykgfHwgZGVmaW5lZChfV0lORE9XUykgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChTVERDKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCitpbnQgbWFpbigpIAoreworI2lmbmRlZiBTVERDCisgIGNob2tlIG1lCisjZW5kaWYKKworICByZXR1cm4gMDsKK30KK0VPRgorCitpZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCisgIGVjaG8gIkNoZWNraW5nIHdoZXRoZXIgdG8gdXNlIHZzbnByaW50ZigpIG9yIHNucHJpbnRmKCkuLi4gdXNpbmcgdnNucHJpbnRmKCkiCisKKyAgY2F0ID4gJHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBteXRlc3QoY2hhciAqZm10LCAuLi4pCit7CisgIGNoYXIgYnVmWzIwXTsKKyAgdmFfbGlzdCBhcDsKKworICB2YV9zdGFydChhcCwgZm10KTsKKyAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gMDsKK30KKworaW50IG1haW4oKQoreworICByZXR1cm4gKG15dGVzdCgiSGVsbG8lZFxuIiwgMSkpOworfQorRU9GCisgIAorICBpZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCisgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHZzbnByaW50ZigpIGluIHN0ZGlvLmguLi4gWWVzLiIKKworICAgIGNhdCA+JHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBteXRlc3QoY2hhciAqZm10LCAuLi4pCit7CisgIGludCBpOworICBjaGFyIGJ1ZlsyMF07CisgIHZhX2xpc3QgYXA7CisKKyAgdmFfc3RhcnQoYXAsIGZtdCk7CisgIGkgPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcCk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiAwOworfQorCitpbnQgbWFpbigpCit7CisgIHJldHVybiAobXl0ZXN0KCJIZWxsbyVkXG4iLCAxKSk7Cit9CitFT0YKKworICAgIGlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNucHJpbnRmKCkuLi4gWWVzLiIKKyAgICBlbHNlCisgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfdnNucHJpbnRmX3ZvaWQiCisgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIE5vLiIKKyAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSB2c25wcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIKKyAgICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgc3RyaW5nLWZvcm1hdCBzZWN1cml0eSIKKyAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIKKyAgICBmaQorICBlbHNlCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ETk9fdnNucHJpbnRmIgorICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIKKyAgICBlY2hvICIgIFdBUk5JTkc6IHZzbnByaW50ZigpIG5vdCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIHZzcHJpbnRmKCkuIHpsaWIiCisgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBidWZmZXItb3ZlcmZsb3cgc2VjdXJpdHkiCisgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIgorCisgICAgY2F0ID4kdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworaW50IG15dGVzdChjaGFyICpmbXQsIC4uLikKK3sKKyAgaW50IGk7CisgIGNoYXIgYnVmWzIwXTsKKyAgdmFfbGlzdCBhcDsKKworICB2YV9zdGFydChhcCwgZm10KTsKKyAgaSA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcCk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiAwOworfQorCitpbnQgbWFpbigpIAoreworICByZXR1cm4gKG15dGVzdCgiSGVsbG8lZFxuIiwgMSkpOworfQorRU9GCisKKyAgICBpZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCisgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzcHJpbnRmKCkuLi4gWWVzLiIKKyAgICBlbHNlCisgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfdnNwcmludGZfdm9pZCIKKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNwcmludGYoKS4uLiBOby4iCisgICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgdnNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIKKyAgICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgc3RyaW5nLWZvcm1hdCBzZWN1cml0eSIKKyAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIKKyAgICBmaQorICBmaQorZWxzZQorICBlY2hvICJDaGVja2luZyB3aGV0aGVyIHRvIHVzZSB2c25wcmludGYoKSBvciBzbnByaW50ZigpLi4uIHVzaW5nIHNucHJpbnRmKCkiCisKKyAgY2F0ID4kdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworaW50IG15dGVzdCgpIAoreworICBjaGFyIGJ1ZlsyMF07CisKKyAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgImZvbyIpOworICByZXR1cm4gMDsKK30KKworaW50IG1haW4oKSAKK3sKKyAgcmV0dXJuIChteXRlc3QoKSk7Cit9CitFT0YKKworICBpZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCisgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHNucHJpbnRmKCkgaW4gc3RkaW8uaC4uLiBZZXMuIgorCisgICAgY2F0ID4kdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworaW50IG15dGVzdChjaGFyICpmbXQsIC4uLikKK3sKKyAgaW50IGk7CisgIGNoYXIgYnVmWzIwXTsKKworICBpID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgImZvbyIpOworICByZXR1cm4gMDsKK30KKworaW50IG1haW4oKSAKK3sKKyAgcmV0dXJuIChteXRlc3QoKSk7Cit9CitFT0YKKworICAgIGlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBZZXMuIgorICAgIGVsc2UKKyAgICAgIENGTEFHUz0iJENGTEFHUyAtREhBU19zbnByaW50Zl92b2lkIgorICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiBzbnByaW50ZigpLi4uIE5vLiIKKyAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSBzbnByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIgorICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IgorICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIgorICAgIGZpCisgIGVsc2UKKyAgICBDRkxBR1M9IiRDRkxBR1MgLUROT19zbnByaW50ZiIKKyAgICBlY2hvICJDaGVja2luZyBmb3Igc25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIKKyAgICBlY2hvICIgIFdBUk5JTkc6IHNucHJpbnRmKCkgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gc3ByaW50ZigpLiB6bGliIgorICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgYnVmZmVyLW92ZXJmbG93IHNlY3VyaXR5IgorICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIKKworICAgIGNhdCA+JHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBteXRlc3QoY2hhciAqZm10LCAuLi4pIAoreworICBpbnQgaTsKKyAgY2hhciBidWZbMjBdOworCisgIGkgPSBzcHJpbnRmKGJ1ZiwgIiVzIiwgImZvbyIpOworICByZXR1cm4gMDsKK30KKworaW50IG1haW4oKSAKK3sKKyAgcmV0dXJuIChteXRlc3QoKSk7Cit9CitFT0YKKworICAgIGlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc3ByaW50ZigpLi4uIFllcy4iCisgICAgZWxzZQorICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3NwcmludGZfdm9pZCIKKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc3ByaW50ZigpLi4uIE5vLiIKKyAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSBzcHJpbnRmKCkgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuIHpsaWIiCisgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiCisgICAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iCisgICAgZmkKKyAgZmkKK2ZpCisKK2NhdCA+JHRlc3QuYyA8PEVPRgogI2luY2x1ZGUgPGVycm5vLmg+CiBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KIEVPRgpkaWZmIC0tZ2l0IGEvY29udHJpYi9SRUFETUUuY29udHJpYiBiL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIKaW5kZXggN2FkMTkxYy4uZmNlZTAyMCAxMDA2NDQKLS0tIGEvY29udHJpYi9SRUFETUUuY29udHJpYgorKysgYi9jb250cmliL1JFQURNRS5jb250cmliCkBAIC0xMSwxMiArMTEsMTggQEAKICAgICAgICAgYXNtIGNvZGUgZm9yIFBlbnRpdW0gYW5kIFBlbnRpdW0gUHJvCiAgICAgICAgIFNlZSBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sCiAKLWRlbHBoaS8gICAgICBieSBCb2IgRGVsbGFjYSA8Ym9iZGxAeHRyYS5jby5uej4KK2JsYXN0LyAgICAgIGJ5IE1hcmsgQWRsZXIgPG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU+CisJRGVjb21wcmVzc29yIGZvciBvdXRwdXQgb2YgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeQorCitkZWxwaGkvICAgICBieSBCb2IgRGVsbGFjYSA8Ym9iZGxAeHRyYS5jby5uej4KIAlTdXBwb3J0IGZvciBEZWxwaGkKIAotZGVscGhpMi8gICAgIGJ5IERhdmlkZSBNb3JldHRpIDxkYXZlQHJpbWluaS5jb20+CitkZWxwaGkyLyAgICBieSBEYXZpZGUgTW9yZXR0aSA8ZGF2ZUByaW1pbmkuY29tPgogICAgICAgICBBbm90aGVyIHN1cHBvcnQgZm9yIEMrK0J1aWxkZXIgYW5kIERlbHBoaQogCitpbmZsYXRlODYvICBieSBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0PgorCVR1bmVkIHg4NiBnY2MgYXNtIGNvZGUgdG8gcmVwbGFjZSBpbmZsYXRlX2Zhc3QoKQorCiBtaW5pemlwLyAgICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CiAJTWluaSB6aXAgYW5kIHVuemlwIGJhc2VkIG9uIHpsaWIKICAgICAgICAgU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbApkaWZmIC0tZ2l0IGEvY29udHJpYi9ibGFzdC9NYWtlZmlsZSBiL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlODBiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACitibGFzdDogYmxhc3QuYyBibGFzdC5oCisJY2MgLURURVNUIC1vIGJsYXN0IGJsYXN0LmMKKwordGVzdDogYmxhc3QKKwlibGFzdCA8IHRlc3QucGsgfCBjbXAgLSB0ZXN0LnR4dAorCitjbGVhbjoKKwlybSAtZiBibGFzdCBibGFzdC5vCmRpZmYgLS1naXQgYS9jb250cmliL2JsYXN0L1JFQURNRSBiL2NvbnRyaWIvYmxhc3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTYwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2JsYXN0L1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK1JlYWQgYmxhc3QuaCBmb3IgcHVycG9zZSBhbmQgdXNhZ2UuCisKK01hcmsgQWRsZXIKK21hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvYmxhc3QvYmxhc3QuYyBiL2NvbnRyaWIvYmxhc3QvYmxhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RhYjRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9ibGFzdC9ibGFzdC5jCkBAIC0wLDAgKzEsNDQ0IEBACisvKiBibGFzdC5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGJsYXN0LmgKKyAqIHZlcnNpb24gMS4xLCAxNiBGZWIgMjAwMworICoKKyAqIGJsYXN0LmMgZGVjb21wcmVzc2VzIGRhdGEgY29tcHJlc3NlZCBieSB0aGUgUEtXYXJlIENvbXByZXNzaW9uIExpYnJhcnkuCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgc2ltaWxhciB0byB0aGUgZXhwbG9kZSgpIGZ1bmN0aW9uIG9mCisgKiB0aGUgUEtXYXJlIGxpYnJhcnksIGhlbmNlIHRoZSBuYW1lICJibGFzdCIuCisgKgorICogVGhpcyBkZWNvbXByZXNzb3IgaXMgYmFzZWQgb24gdGhlIGV4Y2VsbGVudCBmb3JtYXQgZGVzY3JpcHRpb24gcHJvdmlkZWQgYnkKKyAqIEJlbiBSdWRpYWstR291bGQgaW4gY29tcC5jb21wcmVzc2lvbiBvbiBBdWd1c3QgMTMsIDIwMDEuICBJbnRlcmVzdGluZ2x5LCB0aGUKKyAqIGV4YW1wbGUgQmVuIHByb3ZpZGVkIGluIHRoZSBwb3N0IGlzIGluY29ycmVjdC4gIFRoZSBkaXN0YW5jZSAxMTAwMDEgc2hvdWxkCisgKiBpbnN0ZWFkIGJlIDExMTAwMC4gIFdoZW4gY29ycmVjdGVkLCB0aGUgZXhhbXBsZSBieXRlIHN0cmVhbSBiZWNvbWVzOgorICoKKyAqICAgIDAwIDA0IDgyIDI0IDI1IDhmIDgwIDdmCisgKgorICogd2hpY2ggZGVjb21wcmVzc2VzIHRvICJBSUFJQUlBSUFJQUlBIiAod2l0aG91dCB0aGUgcXVvdGVzKS4KKyAqLworCisvKgorICogQ2hhbmdlIGhpc3Rvcnk6CisgKgorICogMS4wCTEyIEZlYiAyMDAzCS0gRmlyc3QgdmVyc2lvbgorICogMS4xCTE2IEZlYiAyMDAzCS0gRml4ZWQgZGlzdGFuY2UgY2hlY2sgZm9yID4gNCBHQiB1bmNvbXByZXNzZWQgZGF0YQorICovCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4JCS8qIGZvciBzZXRqbXAoKSwgbG9uZ2ptcCgpLCBhbmQgam1wX2J1ZiAqLworI2luY2x1ZGUgImJsYXN0LmgiCQkvKiBwcm90b3R5cGUgZm9yIGJsYXN0KCkgKi8KKworI2RlZmluZSBsb2NhbCBzdGF0aWMJCS8qIGZvciBsb2NhbCBmdW5jdGlvbiBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNQVhCSVRTIDEzCQkvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisjZGVmaW5lIE1BWFdJTiA0MDk2CQkvKiBtYXhpbXVtIHdpbmRvdyBzaXplICovCisKKy8qIGlucHV0IGFuZCBvdXRwdXQgc3RhdGUgKi8KK3N0cnVjdCBzdGF0ZSB7CisgICAgLyogaW5wdXQgc3RhdGUgKi8KKyAgICBibGFzdF9pbiBpbmZ1bjsJCS8qIGlucHV0IGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHVzZXIgKi8KKyAgICB2b2lkICppbmhvdzsJCS8qIG9wYXF1ZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gaW5mdW4oKSAqLworICAgIHVuc2lnbmVkIGNoYXIgKmluOwkJLyogbmV4dCBpbnB1dCBsb2NhdGlvbiAqLworICAgIHVuc2lnbmVkIGxlZnQ7CQkvKiBhdmFpbGFibGUgaW5wdXQgYXQgaW4gKi8KKyAgICBpbnQgYml0YnVmOwkJCS8qIGJpdCBidWZmZXIgKi8KKyAgICBpbnQgYml0Y250OwkJCS8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworICAgIC8qIGlucHV0IGxpbWl0IGVycm9yIHJldHVybiBzdGF0ZSBmb3IgYml0cygpIGFuZCBkZWNvZGUoKSAqLworICAgIGptcF9idWYgZW52OworCisgICAgLyogb3V0cHV0IHN0YXRlICovCisgICAgYmxhc3Rfb3V0IG91dGZ1bjsJCS8qIG91dHB1dCBmdW5jdGlvbiBwcm92aWRlZCBieSB1c2VyICovCisgICAgdm9pZCAqb3V0aG93OwkJLyogb3BhcXVlIGluZm9ybWF0aW9uIHBhc3NlZCB0byBvdXRmdW4oKSAqLworICAgIHVuc2lnbmVkIG5leHQ7CQkvKiBpbmRleCBvZiBuZXh0IHdyaXRlIGxvY2F0aW9uIGluIG91dFtdICovCisgICAgaW50IGZpcnN0OwkJCS8qIHRydWUgdG8gY2hlY2sgZGlzdGFuY2VzIChmb3IgZmlyc3QgNEspICovCisgICAgdW5zaWduZWQgY2hhciBvdXRbTUFYV0lOXTsJLyogb3V0cHV0IGJ1ZmZlciBhbmQgc2xpZGluZyB3aW5kb3cgKi8KK307CisKKy8qCisgKiBSZXR1cm4gbmVlZCBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIFRoaXMgYWx3YXlzIGxlYXZlcyBsZXNzIHRoYW4KKyAqIGVpZ2h0IGJpdHMgaW4gdGhlIGJ1ZmZlci4gIGJpdHMoKSB3b3JrcyBwcm9wZXJseSBmb3IgbmVlZCA9PSAwLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIEJpdHMgYXJlIHN0b3JlZCBpbiBieXRlcyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIG1vc3QKKyAqICAgc2lnbmlmaWNhbnQgYml0LiAgVGhlcmVmb3JlIGJpdHMgYXJlIGRyb3BwZWQgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBiaXQKKyAqICAgYnVmZmVyLCB1c2luZyBzaGlmdCByaWdodCwgYW5kIG5ldyBieXRlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRvcCBvZiB0aGUKKyAqICAgYml0IGJ1ZmZlciwgdXNpbmcgc2hpZnQgbGVmdC4KKyAqLworbG9jYWwgaW50IGJpdHMoc3RydWN0IHN0YXRlICpzLCBpbnQgbmVlZCkKK3sKKyAgICBpbnQgdmFsOwkJLyogYml0IGFjY3VtdWxhdG9yICovCisKKyAgICAvKiBsb2FkIGF0IGxlYXN0IG5lZWQgYml0cyBpbnRvIHZhbCAqLworICAgIHZhbCA9IHMtPmJpdGJ1ZjsKKyAgICB3aGlsZSAocy0+Yml0Y250IDwgbmVlZCkgeworICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSB7CisgICAgICAgICAgICBzLT5sZWZ0ID0gcy0+aW5mdW4ocy0+aW5ob3csICYocy0+aW4pKTsKKyAgICAgICAgICAgIGlmIChzLT5sZWZ0ID09IDApIGxvbmdqbXAocy0+ZW52LCAxKTsJLyogb3V0IG9mIGlucHV0ICovCisgICAgICAgIH0KKyAgICAgICAgdmFsIHw9IChpbnQpKCoocy0+aW4pKyspIDw8IHMtPmJpdGNudDsJCS8qIGxvYWQgZWlnaHQgYml0cyAqLworICAgICAgICBzLT5sZWZ0LS07CisgICAgICAgIHMtPmJpdGNudCArPSA4OworICAgIH0KKworICAgIC8qIGRyb3AgbmVlZCBiaXRzIGFuZCB1cGRhdGUgYnVmZmVyLCBhbHdheXMgemVybyB0byBzZXZlbiBiaXRzIGxlZnQgKi8KKyAgICBzLT5iaXRidWYgPSB2YWwgPj4gbmVlZDsKKyAgICBzLT5iaXRjbnQgLT0gbmVlZDsKKworICAgIC8qIHJldHVybiBuZWVkIGJpdHMsIHplcm9pbmcgdGhlIGJpdHMgYWJvdmUgdGhhdCAqLworICAgIHJldHVybiB2YWwgJiAoKDEgPDwgbmVlZCkgLSAxKTsKK30KKworLyoKKyAqIEh1ZmZtYW4gY29kZSBkZWNvZGluZyB0YWJsZXMuICBjb3VudFsxLi5NQVhCSVRTXSBpcyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb2YKKyAqIGVhY2ggbGVuZ3RoLCB3aGljaCBmb3IgYSBjYW5vbmljYWwgY29kZSBhcmUgc3RlcHBlZCB0aHJvdWdoIGluIG9yZGVyLgorICogc3ltYm9sW10gYXJlIHRoZSBzeW1ib2wgdmFsdWVzIGluIGNhbm9uaWNhbCBvcmRlciwgd2hlcmUgdGhlIG51bWJlciBvZgorICogZW50cmllcyBpcyB0aGUgc3VtIG9mIHRoZSBjb3VudHMgaW4gY291bnRbXS4gIFRoZSBkZWNvZGluZyBwcm9jZXNzIGNhbiBiZQorICogc2VlbiBpbiB0aGUgZnVuY3Rpb24gZGVjb2RlKCkgYmVsb3cuCisgKi8KK3N0cnVjdCBodWZmbWFuIHsKKyAgICBzaG9ydCAqY291bnQ7CS8qIG51bWJlciBvZiBzeW1ib2xzIG9mIGVhY2ggbGVuZ3RoICovCisgICAgc2hvcnQgKnN5bWJvbDsJLyogY2Fub25pY2FsbHkgb3JkZXJlZCBzeW1ib2xzICovCit9OworCisvKgorICogRGVjb2RlIGEgY29kZSBmcm9tIHRoZSBzdHJlYW0gcyB1c2luZyBodWZmbWFuIHRhYmxlIGguICBSZXR1cm4gdGhlIHN5bWJvbCBvcgorICogYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGVyZSBpcyBhbiBlcnJvci4gIElmIGFsbCBvZiB0aGUgbGVuZ3RocyBhcmUgemVybywgaS5lLgorICogYW4gZW1wdHkgY29kZSwgb3IgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSBhbmQgYW4gaW52YWxpZCBjb2RlIGlzIHJlY2VpdmVkLAorICogdGhlbiAtOSBpcyByZXR1cm5lZCBhZnRlciByZWFkaW5nIE1BWEJJVFMgYml0cy4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBUaGUgY29kZXMgYXMgc3RvcmVkIGluIHRoZSBjb21wcmVzc2VkIGRhdGEgYXJlIGJpdC1yZXZlcnNlZCByZWxhdGl2ZSB0bworICogICBhIHNpbXBsZSBpbnRlZ2VyIG9yZGVyaW5nIG9mIGNvZGVzIG9mIHRoZSBzYW1lIGxlbmd0aHMuICBIZW5jZSBiZWxvdyB0aGUKKyAqICAgYml0cyBhcmUgcHVsbGVkIGZyb20gdGhlIGNvbXByZXNzZWQgZGF0YSBvbmUgYXQgYSB0aW1lIGFuZCB1c2VkIHRvCisgKiAgIGJ1aWxkIHRoZSBjb2RlIHZhbHVlIHJldmVyc2VkIGZyb20gd2hhdCBpcyBpbiB0aGUgc3RyZWFtIGluIG9yZGVyIHRvCisgKiAgIHBlcm1pdCBzaW1wbGUgaW50ZWdlciBjb21wYXJpc29ucyBmb3IgZGVjb2RpbmcuCisgKgorICogLSBUaGUgZmlyc3QgY29kZSBmb3IgdGhlIHNob3J0ZXN0IGxlbmd0aCBpcyBhbGwgb25lcy4gIFN1YnNlcXVlbnQgY29kZXMgb2YKKyAqICAgdGhlIHNhbWUgbGVuZ3RoIGFyZSBzaW1wbHkgaW50ZWdlciBkZWNyZW1lbnRzIG9mIHRoZSBwcmV2aW91cyBjb2RlLiAgV2hlbgorICogICBtb3ZpbmcgdXAgYSBsZW5ndGgsIGEgb25lIGJpdCBpcyBhcHBlbmRlZCB0byB0aGUgY29kZS4gIEZvciBhIGNvbXBsZXRlCisgKiAgIGNvZGUsIHRoZSBsYXN0IGNvZGUgb2YgdGhlIGxvbmdlc3QgbGVuZ3RoIHdpbGwgYmUgYWxsIHplcm9zLiAgVG8gc3VwcG9ydAorICogICB0aGlzIG9yZGVyaW5nLCB0aGUgYml0cyBwdWxsZWQgZHVyaW5nIGRlY29kaW5nIGFyZSBpbnZlcnRlZCB0byBhcHBseSB0aGUKKyAqICAgbW9yZSAibmF0dXJhbCIgb3JkZXJpbmcgc3RhcnRpbmcgd2l0aCBhbGwgemVyb3MgYW5kIGluY3JlbWVudGluZy4KKyAqLworbG9jYWwgaW50IGRlY29kZShzdHJ1Y3Qgc3RhdGUgKnMsIHN0cnVjdCBodWZmbWFuICpoKQoreworICAgIGludCBsZW47CQkvKiBjdXJyZW50IG51bWJlciBvZiBiaXRzIGluIGNvZGUgKi8KKyAgICBpbnQgY29kZTsJCS8qIGxlbiBiaXRzIGJlaW5nIGRlY29kZWQgKi8KKyAgICBpbnQgZmlyc3Q7CQkvKiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gKi8KKyAgICBpbnQgY291bnQ7CQkvKiBudW1iZXIgb2YgY29kZXMgb2YgbGVuZ3RoIGxlbiAqLworICAgIGludCBpbmRleDsJCS8qIGluZGV4IG9mIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiBpbiBzeW1ib2wgdGFibGUgKi8KKyAgICBpbnQgYml0YnVmOwkJLyogYml0cyBmcm9tIHN0cmVhbSAqLworICAgIGludCBsZWZ0OwkJLyogYml0cyBsZWZ0IGluIG5leHQgb3IgbGVmdCB0byBwcm9jZXNzICovCisgICAgc2hvcnQgKm5leHQ7CS8qIG5leHQgbnVtYmVyIG9mIGNvZGVzICovCisKKyAgICBiaXRidWYgPSBzLT5iaXRidWY7CisgICAgbGVmdCA9IHMtPmJpdGNudDsKKyAgICBjb2RlID0gZmlyc3QgPSBpbmRleCA9IDA7CisgICAgbGVuID0gMTsKKyAgICBuZXh0ID0gaC0+Y291bnQgKyAxOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHdoaWxlIChsZWZ0LS0pIHsKKyAgICAgICAgICAgIGNvZGUgfD0gKGJpdGJ1ZiAmIDEpIF4gMTsJLyogaW52ZXJ0IGNvZGUgKi8KKyAgICAgICAgICAgIGJpdGJ1ZiA+Pj0gMTsKKyAgICAgICAgICAgIGNvdW50ID0gKm5leHQrKzsKKyAgICAgICAgICAgIGlmIChjb2RlIDwgZmlyc3QgKyBjb3VudCkgewkvKiBpZiBsZW5ndGggbGVuLCByZXR1cm4gc3ltYm9sICovCisgICAgICAgICAgICAgICAgcy0+Yml0YnVmID0gYml0YnVmOworICAgICAgICAgICAgICAgIHMtPmJpdGNudCA9IChzLT5iaXRjbnQgLSBsZW4pICYgNzsKKyAgICAgICAgICAgICAgICByZXR1cm4gaC0+c3ltYm9sW2luZGV4ICsgKGNvZGUgLSBmaXJzdCldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggKz0gY291bnQ7CQkvKiBlbHNlIHVwZGF0ZSBmb3IgbmV4dCBsZW5ndGggKi8KKyAgICAgICAgICAgIGZpcnN0ICs9IGNvdW50OworICAgICAgICAgICAgZmlyc3QgPDw9IDE7CisgICAgICAgICAgICBjb2RlIDw8PSAxOworICAgICAgICAgICAgbGVuKys7CisgICAgICAgIH0KKyAgICAgICAgbGVmdCA9IChNQVhCSVRTKzEpIC0gbGVuOworICAgICAgICBpZiAobGVmdCA9PSAwKSBicmVhazsKKyAgICAgICAgaWYgKHMtPmxlZnQgPT0gMCkgeworICAgICAgICAgICAgcy0+bGVmdCA9IHMtPmluZnVuKHMtPmluaG93LCAmKHMtPmluKSk7CisgICAgICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSBsb25nam1wKHMtPmVudiwgMSk7CS8qIG91dCBvZiBpbnB1dCAqLworICAgICAgICB9CisgICAgICAgIGJpdGJ1ZiA9ICoocy0+aW4pKys7CisgICAgICAgIHMtPmxlZnQtLTsKKyAgICAgICAgaWYgKGxlZnQgPiA4KSBsZWZ0ID0gODsKKyAgICB9CisgICAgcmV0dXJuIC05OwkJCQkvKiByYW4gb3V0IG9mIGNvZGVzICovCit9CisKKy8qCisgKiBHaXZlbiBhIGxpc3Qgb2YgcmVwZWF0ZWQgY29kZSBsZW5ndGhzIHJlcFswLi5uLTFdLCB3aGVyZSBlYWNoIGJ5dGUgaXMgYQorICogY291bnQgKGhpZ2ggZm91ciBiaXRzICsgMSkgYW5kIGEgY29kZSBsZW5ndGggKGxvdyBmb3VyIGJpdHMpLCBnZW5lcmF0ZSB0aGUKKyAqIGxpc3Qgb2YgY29kZSBsZW5ndGhzLiAgVGhpcyBjb21wYWN0aW9uIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBjb2RlLgorICogVGhlbiBnaXZlbiB0aGUgbGlzdCBvZiBjb2RlIGxlbmd0aHMgbGVuZ3RoWzAuLm4tMV0gcmVwcmVzZW50aW5nIGEgY2Fub25pY2FsCisgKiBIdWZmbWFuIGNvZGUgZm9yIG4gc3ltYm9scywgY29uc3RydWN0IHRoZSB0YWJsZXMgcmVxdWlyZWQgdG8gZGVjb2RlIHRob3NlCisgKiBjb2Rlcy4gIFRob3NlIHRhYmxlcyBhcmUgdGhlIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCwgYW5kIHRoZSBzeW1ib2xzCisgKiBzb3J0ZWQgYnkgbGVuZ3RoLCByZXRhaW5pbmcgdGhlaXIgb3JpZ2luYWwgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoLiAgVGhlCisgKiByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IgYSBjb21wbGV0ZSBjb2RlIHNldCwgbmVnYXRpdmUgZm9yIGFuIG92ZXItCisgKiBzdWJzY3JpYmVkIGNvZGUgc2V0LCBhbmQgcG9zaXRpdmUgZm9yIGFuIGluY29tcGxldGUgY29kZSBzZXQuICBUaGUgdGFibGVzCisgKiBjYW4gYmUgdXNlZCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gb3IgcG9zaXRpdmUsIGJ1dCB0aGV5IGNhbm5vdCBiZSB1c2VkCisgKiBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLCBpdCBpcyBub3QKKyAqIHBvc3NpYmxlIGZvciBkZWNvZGUoKSB1c2luZyB0aGF0IHRhYmxlIHRvIHJldHVybiBhbiBlcnJvci0tYW55IHN0cmVhbSBvZgorICogZW5vdWdoIGJpdHMgd2lsbCByZXNvbHZlIHRvIGEgc3ltYm9sLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgdGhlbgorICogaXQgaXMgcG9zc2libGUgZm9yIGRlY29kZSgpIHVzaW5nIHRoYXQgdGFibGUgdG8gcmV0dXJuIGFuIGVycm9yIGZvciByZWNlaXZlZAorICogY29kZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbmNvbXBsZXRlIGxlbmd0aHMuCisgKi8KK2xvY2FsIGludCBjb25zdHJ1Y3Qoc3RydWN0IGh1ZmZtYW4gKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlcCwgaW50IG4pCit7CisgICAgaW50IHN5bWJvbDsJCS8qIGN1cnJlbnQgc3ltYm9sIHdoZW4gc3RlcHBpbmcgdGhyb3VnaCBsZW5ndGhbXSAqLworICAgIGludCBsZW47CQkvKiBjdXJyZW50IGxlbmd0aCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggaC0+Y291bnRbXSAqLworICAgIGludCBsZWZ0OwkJLyogbnVtYmVyIG9mIHBvc3NpYmxlIGNvZGVzIGxlZnQgb2YgY3VycmVudCBsZW5ndGggKi8KKyAgICBzaG9ydCBvZmZzW01BWEJJVFMrMV07CS8qIG9mZnNldHMgaW4gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqLworICAgIHNob3J0IGxlbmd0aFsyNTZdOwkvKiBjb2RlIGxlbmd0aHMgKi8KKworICAgIC8qIGNvbnZlcnQgY29tcGFjdCByZXBlYXQgY291bnRzIGludG8gc3ltYm9sIGJpdCBsZW5ndGggbGlzdCAqLworICAgIHN5bWJvbCA9IDA7CisgICAgZG8geworICAgICAgICBsZW4gPSAqcmVwKys7CisgICAgICAgIGxlZnQgPSAobGVuID4+IDQpICsgMTsKKyAgICAgICAgbGVuICY9IDE1OworICAgICAgICBkbyB7CisgICAgICAgICAgICBsZW5ndGhbc3ltYm9sKytdID0gbGVuOworICAgICAgICB9IHdoaWxlICgtLWxlZnQpOworICAgIH0gd2hpbGUgKC0tbik7CisgICAgbiA9IHN5bWJvbDsKKworICAgIC8qIGNvdW50IG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLworICAgIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKQorICAgICAgICBoLT5jb3VudFtsZW5dID0gMDsKKyAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IG47IHN5bWJvbCsrKQorICAgICAgICAoaC0+Y291bnRbbGVuZ3RoW3N5bWJvbF1dKSsrOwkvKiBhc3N1bWVzIGxlbmd0aHMgYXJlIHdpdGhpbiBib3VuZHMgKi8KKyAgICBpZiAoaC0+Y291bnRbMF0gPT0gbikJCS8qIG5vIGNvZGVzISAqLworICAgICAgICByZXR1cm4gMDsJCQkvKiBjb21wbGV0ZSwgYnV0IGRlY29kZSgpIHdpbGwgZmFpbCAqLworCisgICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCisgICAgbGVmdCA9IDE7CQkJCS8qIG9uZSBwb3NzaWJsZSBjb2RlIG9mIHplcm8gbGVuZ3RoICovCisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKKyAgICAgICAgbGVmdCA8PD0gMTsJCQkvKiBvbmUgbW9yZSBiaXQsIGRvdWJsZSBjb2RlcyBsZWZ0ICovCisgICAgICAgIGxlZnQgLT0gaC0+Y291bnRbbGVuXTsJCS8qIGRlZHVjdCBjb3VudCBmcm9tIHBvc3NpYmxlIGNvZGVzICovCisgICAgICAgIGlmIChsZWZ0IDwgMCkgcmV0dXJuIGxlZnQ7CS8qIG92ZXItc3Vic2NyaWJlZC0tcmV0dXJuIG5lZ2F0aXZlICovCisgICAgfQkJCQkJLyogbGVmdCA+IDAgbWVhbnMgaW5jb21wbGV0ZSAqLworCisgICAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi8KKyAgICBvZmZzWzFdID0gMDsKKyAgICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKQorICAgICAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgaC0+Y291bnRbbGVuXTsKKworICAgIC8qCisgICAgICogcHV0IHN5bWJvbHMgaW4gdGFibGUgc29ydGVkIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoCisgICAgICogbGVuZ3RoCisgICAgICovCisgICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBuOyBzeW1ib2wrKykKKyAgICAgICAgaWYgKGxlbmd0aFtzeW1ib2xdICE9IDApCisgICAgICAgICAgICBoLT5zeW1ib2xbb2Zmc1tsZW5ndGhbc3ltYm9sXV0rK10gPSBzeW1ib2w7CisKKyAgICAvKiByZXR1cm4gemVybyBmb3IgY29tcGxldGUgc2V0LCBwb3NpdGl2ZSBmb3IgaW5jb21wbGV0ZSBzZXQgKi8KKyAgICByZXR1cm4gbGVmdDsKK30KKworLyoKKyAqIERlY29kZSBQS1dhcmUgQ29tcHJlc3Npb24gTGlicmFyeSBzdHJlYW0uCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gRmlyc3QgYnl0ZSBpcyAwIGlmIGxpdGVyYWxzIGFyZSB1bmNvZGVkIG9yIDEgaWYgdGhleSBhcmUgY29kZWQuICBTZWNvbmQKKyAqICAgYnl0ZSBpcyA0LCA1LCBvciA2IGZvciB0aGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMgaW4gdGhlIGRpc3RhbmNlIGNvZGUuCisgKiAgIFRoaXMgaXMgdGhlIGJhc2UtMiBsb2dhcml0aG0gb2YgdGhlIGRpY3Rpb25hcnkgc2l6ZSBtaW51cyBzaXguCisgKgorICogLSBDb21wcmVzc2VkIGRhdGEgaXMgYSBjb21iaW5hdGlvbiBvZiBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzCisgKiAgIHRlcm1pbmF0ZWQgYnkgYW4gZW5kIGNvZGUuICBMaXRlcmFscyBhcmUgZWl0aGVyIEh1ZmZtYW4gY29kZWQgb3IKKyAqICAgdW5jb2RlZCBieXRlcy4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgYSBjb2RlZCBsZW5ndGggZm9sbG93ZWQgYnkgYQorICogICBjb2RlZCBkaXN0YW5jZSB0byByZXByZXNlbnQgYSBzdHJpbmcgdGhhdCBvY2N1cnMgZWFybGllciBpbiB0aGUKKyAqICAgdW5jb21wcmVzc2VkIGRhdGEgdGhhdCBvY2N1cnMgYWdhaW4gYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgKgorICogLSBBIGJpdCBwcmVjZWRpbmcgYSBsaXRlcmFsIG9yIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGluZGljYXRlcyB3aGljaCBjb21lcworICogICBuZXh0LCAwIGZvciBsaXRlcmFscywgMSBmb3IgbGVuZ3RoL2Rpc3RhbmNlLgorICoKKyAqIC0gSWYgbGl0ZXJhbHMgYXJlIHVuY29kZWQsIHRoZW4gdGhlIG5leHQgZWlnaHQgYml0cyBhcmUgdGhlIGxpdGVyYWwsIGluIHRoZQorICogICBub3JtYWwgYml0IG9yZGVyIGluIHRoIHN0cmVhbSwgaS5lLiBubyBiaXQtcmV2ZXJzYWwgaXMgbmVlZGVkLiBTaW1pbGFybHksCisgKiAgIG5vIGJpdCByZXZlcnNhbCBpcyBuZWVkZWQgZm9yIGVpdGhlciB0aGUgbGVuZ3RoIGV4dHJhIGJpdHMgb3IgdGhlIGRpc3RhbmNlCisgKiAgIGV4dHJhIGJpdHMuCisgKgorICogLSBMaXRlcmFsIGJ5dGVzIGFyZSBzaW1wbHkgd3JpdHRlbiB0byB0aGUgb3V0cHV0LiAgQSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcworICogICBhbiBpbnN0cnVjdGlvbiB0byBjb3B5IHByZXZpb3VzbHkgdW5jb21wcmVzc2VkIGJ5dGVzIHRvIHRoZSBvdXRwdXQuICBUaGUKKyAqICAgY29weSBpcyBmcm9tIGRpc3RhbmNlIGJ5dGVzIGJhY2sgaW4gdGhlIG91dHB1dCBzdHJlYW0sIGNvcHlpbmcgZm9yIGxlbmd0aAorICogICBieXRlcy4KKyAqCisgKiAtIERpc3RhbmNlcyBwb2ludGluZyBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYXJlIG5vdAorICogICBwZXJtaXR0ZWQuCisgKgorICogLSBPdmVybGFwcGVkIGNvcGllcywgd2hlcmUgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGRpc3RhbmNlLCBhcmUKKyAqICAgYWxsb3dlZCBhbmQgY29tbW9uLiAgRm9yIGV4YW1wbGUsIGEgZGlzdGFuY2Ugb2Ygb25lIGFuZCBhIGxlbmd0aCBvZiA1MTgKKyAqICAgc2ltcGx5IGNvcGllcyB0aGUgbGFzdCBieXRlIDUxOCB0aW1lcy4gIEEgZGlzdGFuY2Ugb2YgZm91ciBhbmQgYSBsZW5ndGggb2YKKyAqICAgdHdlbHZlIGNvcGllcyB0aGUgbGFzdCBmb3VyIGJ5dGVzIHRocmVlIHRpbWVzLiAgQSBzaW1wbGUgZm9yd2FyZCBjb3B5CisgKiAgIGlnbm9yaW5nIHdoZXRoZXIgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGRpc3RhbmNlIG9yIG5vdCBpbXBsZW1lbnRzCisgKiAgIHRoaXMgY29ycmVjdGx5LgorICovCitsb2NhbCBpbnQgZGVjb21wKHN0cnVjdCBzdGF0ZSAqcykKK3sKKyAgICBpbnQgbGl0OwkJLyogdHJ1ZSBpZiBsaXRlcmFscyBhcmUgY29kZWQgKi8KKyAgICBpbnQgZGljdDsJCS8qIGxvZzIoZGljdGlvbmFyeSBzaXplKSAtIDYgKi8KKyAgICBpbnQgc3ltYm9sOwkJLyogZGVjb2RlZCBzeW1ib2wsIGV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlICovCisgICAgaW50IGxlbjsJCS8qIGxlbmd0aCBmb3IgY29weSAqLworICAgIGludCBkaXN0OwkJLyogZGlzdGFuY2UgZm9yIGNvcHkgKi8KKyAgICBpbnQgY29weTsJCS8qIGNvcHkgY291bnRlciAqLworICAgIHVuc2lnbmVkIGNoYXIgKmZyb20sICp0bzsJLyogY29weSBwb2ludGVycyAqLworICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsJCQkJLyogYnVpbGQgdGFibGVzIG9uY2UgKi8KKyAgICBzdGF0aWMgc2hvcnQgbGl0Y250W01BWEJJVFMrMV0sIGxpdHN5bVsyNTZdOwkvKiBsaXRjb2RlIG1lbW9yeSAqLworICAgIHN0YXRpYyBzaG9ydCBsZW5jbnRbTUFYQklUUysxXSwgbGVuc3ltWzE2XTsJCS8qIGxlbmNvZGUgbWVtb3J5ICovCisgICAgc3RhdGljIHNob3J0IGRpc3RjbnRbTUFYQklUUysxXSwgZGlzdHN5bVs2NF07CS8qIGRpc3Rjb2RlIG1lbW9yeSAqLworICAgIHN0YXRpYyBzdHJ1Y3QgaHVmZm1hbiBsaXRjb2RlID0ge2xpdGNudCwgbGl0c3ltfTsJLyogbGVuZ3RoIGNvZGUgKi8KKyAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gbGVuY29kZSA9IHtsZW5jbnQsIGxlbnN5bX07CS8qIGxlbmd0aCBjb2RlICovCisgICAgc3RhdGljIHN0cnVjdCBodWZmbWFuIGRpc3Rjb2RlID0ge2Rpc3RjbnQsIGRpc3RzeW19Oy8qIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgLyogYml0IGxlbmd0aHMgb2YgbGl0ZXJhbCBjb2RlcyAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGxpdGxlbltdID0geworCTExLCAxMjQsIDgsIDcsIDI4LCA3LCAxODgsIDEzLCA3NiwgNCwgMTAsIDgsIDEyLCAxMCwgMTIsIDEwLCA4LCAyMywgOCwKKwk5LCA3LCA2LCA3LCA4LCA3LCA2LCA1NSwgOCwgMjMsIDI0LCAxMiwgMTEsIDcsIDksIDExLCAxMiwgNiwgNywgMjIsIDUsCisJNywgMjQsIDYsIDExLCA5LCA2LCA3LCAyMiwgNywgMTEsIDM4LCA3LCA5LCA4LCAyNSwgMTEsIDgsIDExLCA5LCAxMiwKKwk4LCAxMiwgNSwgMzgsIDUsIDM4LCA1LCAxMSwgNywgNSwgNiwgMjEsIDYsIDEwLCA1MywgOCwgNywgMjQsIDEwLCAyNywKKwk0NCwgMjUzLCAyNTMsIDI1MywgMjUyLCAyNTIsIDI1MiwgMTMsIDEyLCA0NSwgMTIsIDQ1LCAxMiwgNjEsIDEyLCA0NSwKKwk0NCwgMTczfTsKKyAgICAgICAgLyogYml0IGxlbmd0aHMgb2YgbGVuZ3RoIGNvZGVzIDAuLjE1ICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGVubGVuW10gPSB7MiwgMzUsIDM2LCA1MywgMzgsIDIzfTsKKyAgICAgICAgLyogYml0IGxlbmd0aHMgb2YgZGlzdGFuY2UgY29kZXMgMC4uNjMgKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaXN0bGVuW10gPSB7MiwgMjAsIDUzLCAyMzAsIDI0NywgMTUxLCAyNDh9OworICAgIHN0YXRpYyBjb25zdCBzaG9ydCBiYXNlWzE2XSA9IHsJLyogYmFzZSBmb3IgbGVuZ3RoIGNvZGVzICovCisgICAgICAgIDMsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMiwgMTYsIDI0LCA0MCwgNzIsIDEzNiwgMjY0fTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBleHRyYVsxNl0gPSB7CS8qIGV4dHJhIGJpdHMgZm9yIGxlbmd0aCBjb2RlcyAqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fTsKKworICAgIC8qIHNldCB1cCBkZWNvZGluZyB0YWJsZXMgKG9uY2UtLW1pZ2h0IG5vdCBiZSB0aHJlYWQtc2FmZSkgKi8KKyAgICBpZiAodmlyZ2luKSB7CisgICAgICAgIGNvbnN0cnVjdCgmbGl0Y29kZSwgbGl0bGVuLCBzaXplb2YobGl0bGVuKSk7CisgICAgICAgIGNvbnN0cnVjdCgmbGVuY29kZSwgbGVubGVuLCBzaXplb2YobGVubGVuKSk7CisgICAgICAgIGNvbnN0cnVjdCgmZGlzdGNvZGUsIGRpc3RsZW4sIHNpemVvZihkaXN0bGVuKSk7CisgICAgICAgIHZpcmdpbiA9IDA7CisgICAgfQorCisgICAgLyogcmVhZCBoZWFkZXIgKi8KKyAgICBsaXQgPSBiaXRzKHMsIDgpOworICAgIGlmIChsaXQgPiAxKSByZXR1cm4gLTE7CisgICAgZGljdCA9IGJpdHMocywgOCk7CisgICAgaWYgKGRpY3QgPCA0IHx8IGRpY3QgPiA2KSByZXR1cm4gLTI7CisKKyAgICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycyAqLworICAgIGRvIHsKKyAgICAgICAgaWYgKGJpdHMocywgMSkpIHsKKyAgICAgICAgICAgIC8qIGdldCBsZW5ndGggKi8KKyAgICAgICAgICAgIHN5bWJvbCA9IGRlY29kZShzLCAmbGVuY29kZSk7CisgICAgICAgICAgICBsZW4gPSBiYXNlW3N5bWJvbF0gKyBiaXRzKHMsIGV4dHJhW3N5bWJvbF0pOworICAgICAgICAgICAgaWYgKGxlbiA9PSA1MTkpIGJyZWFrOwkJLyogZW5kIGNvZGUgKi8KKworICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlICovCisgICAgICAgICAgICBzeW1ib2wgPSBsZW4gPT0gMiA/IDIgOiBkaWN0OworICAgICAgICAgICAgZGlzdCA9IGRlY29kZShzLCAmZGlzdGNvZGUpIDw8IHN5bWJvbDsKKyAgICAgICAgICAgIGRpc3QgKz0gYml0cyhzLCBzeW1ib2wpOworICAgICAgICAgICAgZGlzdCsrOworICAgICAgICAgICAgaWYgKHMtPmZpcnN0ICYmIGRpc3QgPiBzLT5uZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMzsJCS8qIGRpc3RhbmNlIHRvbyBmYXIgYmFjayAqLworCisgICAgICAgICAgICAvKiBjb3B5IGxlbmd0aCBieXRlcyBmcm9tIGRpc3RhbmNlIGJ5dGVzIGJhY2sgKi8KKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB0byA9IHMtPm91dCArIHMtPm5leHQ7CisgICAgICAgICAgICAgICAgZnJvbSA9IHRvIC0gZGlzdDsKKyAgICAgICAgICAgICAgICBjb3B5ID0gTUFYV0lOOworICAgICAgICAgICAgICAgIGlmIChzLT5uZXh0IDwgZGlzdCkgeworICAgICAgICAgICAgICAgICAgICBmcm9tICs9IGNvcHk7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBkaXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3B5IC09IHMtPm5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBsZW4pIGNvcHkgPSBsZW47CisgICAgICAgICAgICAgICAgbGVuIC09IGNvcHk7CisgICAgICAgICAgICAgICAgcy0+bmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgKnRvKysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7CisgICAgICAgICAgICAgICAgaWYgKHMtPm5leHQgPT0gTUFYV0lOKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5vdXRmdW4ocy0+b3V0aG93LCBzLT5vdXQsIHMtPm5leHQpKSByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bmV4dCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPmZpcnN0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChsZW4gIT0gMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBnZXQgbGl0ZXJhbCBhbmQgd3JpdGUgaXQgKi8KKyAgICAgICAgICAgIHN5bWJvbCA9IGxpdCA/IGRlY29kZShzLCAmbGl0Y29kZSkgOiBiaXRzKHMsIDgpOworICAgICAgICAgICAgcy0+b3V0W3MtPm5leHQrK10gPSBzeW1ib2w7CisgICAgICAgICAgICBpZiAocy0+bmV4dCA9PSBNQVhXSU4pIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+b3V0ZnVuKHMtPm91dGhvdywgcy0+b3V0LCBzLT5uZXh0KSkgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgcy0+bmV4dCA9IDA7CisgICAgICAgICAgICAgICAgcy0+Zmlyc3QgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoMSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFNlZSBjb21tZW50cyBpbiBibGFzdC5oICovCitpbnQgYmxhc3QoYmxhc3RfaW4gaW5mdW4sIHZvaWQgKmluaG93LCBibGFzdF9vdXQgb3V0ZnVuLCB2b2lkICpvdXRob3cpCit7CisgICAgc3RydWN0IHN0YXRlIHM7CQkvKiBpbnB1dC9vdXRwdXQgc3RhdGUgKi8KKyAgICBpbnQgZXJyOwkJCS8qIHJldHVybiB2YWx1ZSAqLworCisgICAgLyogaW5pdGlhbGl6ZSBpbnB1dCBzdGF0ZSAqLworICAgIHMuaW5mdW4gPSBpbmZ1bjsKKyAgICBzLmluaG93ID0gaW5ob3c7CisgICAgcy5sZWZ0ID0gMDsKKyAgICBzLmJpdGJ1ZiA9IDA7CisgICAgcy5iaXRjbnQgPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBvdXRwdXQgc3RhdGUgKi8KKyAgICBzLm91dGZ1biA9IG91dGZ1bjsKKyAgICBzLm91dGhvdyA9IG91dGhvdzsKKyAgICBzLm5leHQgPSAwOworICAgIHMuZmlyc3QgPSAxOworCisgICAgLyogcmV0dXJuIGlmIGJpdHMoKSBvciBkZWNvZGUoKSB0cmllcyB0byByZWFkIHBhc3QgYXZhaWxhYmxlIGlucHV0ICovCisgICAgaWYgKHNldGptcChzLmVudikgIT0gMCkJCS8qIGlmIGNhbWUgYmFjayBoZXJlIHZpYSBsb25nam1wKCksICovCisgICAgICAgIGVyciA9IDI7CQkJLyogIHRoZW4gc2tpcCBkZWNvbXAoKSwgcmV0dXJuIGVycm9yICovCisgICAgZWxzZQorICAgICAgICBlcnIgPSBkZWNvbXAoJnMpOwkJLyogZGVjb21wcmVzcyAqLworCisgICAgLyogd3JpdGUgYW55IGxlZnRvdmVyIG91dHB1dCBhbmQgdXBkYXRlIHRoZSBlcnJvciBjb2RlIGlmIG5lZWRlZCAqLworICAgIGlmIChlcnIgIT0gMSAmJiBzLm5leHQgJiYgcy5vdXRmdW4ocy5vdXRob3csIHMub3V0LCBzLm5leHQpICYmIGVyciA9PSAwKQorICAgICAgICBlcnIgPSAxOworICAgIHJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBURVNUCisvKiBFeGFtcGxlIG9mIGhvdyB0byB1c2UgYmxhc3QoKSAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgQ0hVTksgMTYzODQKKworbG9jYWwgdW5zaWduZWQgaW5mKHZvaWQgKmhvdywgdW5zaWduZWQgY2hhciAqKmJ1ZikKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBob2xkW0NIVU5LXTsKKworICAgICpidWYgPSBob2xkOworICAgIHJldHVybiBmcmVhZChob2xkLCAxLCBDSFVOSywgKEZJTEUgKilob3cpOworfQorCitsb2NhbCBpbnQgb3V0Zih2b2lkICpob3csIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuKQoreworICAgIHJldHVybiBmd3JpdGUoYnVmLCAxLCBsZW4sIChGSUxFICopaG93KSAhPSBsZW47Cit9CisKKy8qIERlY29tcHJlc3MgYSBQS1dhcmUgQ29tcHJlc3Npb24gTGlicmFyeSBzdHJlYW0gZnJvbSBzdGRpbiB0byBzdGRvdXQgKi8KK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IHJldCwgbjsKKworICAgIC8qIGRlY29tcHJlc3MgdG8gc3Rkb3V0ICovCisgICAgcmV0ID0gYmxhc3QoaW5mLCBzdGRpbiwgb3V0Ziwgc3Rkb3V0KTsKKyAgICBpZiAocmV0ICE9IDApIGZwcmludGYoc3RkZXJyLCAiYmxhc3QgZXJyb3I6ICVkXG4iLCByZXQpOworCisgICAgLyogc2VlIGlmIHRoZXJlIGFyZSBhbnkgbGVmdG92ZXIgYnl0ZXMgKi8KKyAgICBuID0gMDsKKyAgICB3aGlsZSAoZ2V0Y2hhcigpICE9IEVPRikgbisrOworICAgIGlmIChuKSBmcHJpbnRmKHN0ZGVyciwgImJsYXN0IHdhcm5pbmc6ICVkIHVudXNlZCBieXRlcyBvZiBpbnB1dFxuIiwgbik7CisKKyAgICAvKiByZXR1cm4gYmxhc3QoKSBlcnJvciBjb2RlICovCisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29udHJpYi9ibGFzdC9ibGFzdC5oIGIvY29udHJpYi9ibGFzdC9ibGFzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTc4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2JsYXN0L2JsYXN0LmgKQEAgLTAsMCArMSw3MSBAQAorLyogYmxhc3QuaCAtLSBpbnRlcmZhY2UgZm9yIGJsYXN0LmMKKyAgQ29weXJpZ2h0IChDKSAyMDAzIE1hcmsgQWRsZXIKKyAgdmVyc2lvbiAxLjEsIDE2IEZlYiAyMDAzCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgTWFyayBBZGxlcgltYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisgKi8KKworCisvKgorICogYmxhc3QoKSBkZWNvbXByZXNzZXMgdGhlIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgKERDTCkgY29tcHJlc3NlZAorICogZm9ybWF0LiAgSXQgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyB0aGUgZXhwbG9kZSgpIGZ1bmN0aW9uIGluCisgKiB0aGF0IGxpYnJhcnkuICAoTm90ZTogUEtXYXJlIG92ZXJ1c2VkIHRoZSAiaW1wbG9kZSIgdmVyYiwgYW5kIHRoZSBmb3JtYXQKKyAqIHVzZWQgYnkgdGhlaXIgbGlicmFyeSBpbXBsb2RlKCkgZnVuY3Rpb24gaXMgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgaW1wbG9kZSBjb21wcmVzc2lvbiBtZXRob2Qgc3VwcG9ydGVkIGJ5IFBLWklQLikKKyAqLworCisKK3R5cGVkZWYgdW5zaWduZWQgKCpibGFzdF9pbikodm9pZCAqaG93LCB1bnNpZ25lZCBjaGFyICoqYnVmKTsKK3R5cGVkZWYgaW50ICgqYmxhc3Rfb3V0KSh2b2lkICpob3csIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuKTsKKy8qIERlZmluaXRpb25zIGZvciBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zIHBhc3NlZCB0byBibGFzdCgpLiAgU2VlIGJlbG93IGZvcgorICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb25zIG5lZWQgdG8gZG8uCisgKi8KKworCitpbnQgYmxhc3QoYmxhc3RfaW4gaW5mdW4sIHZvaWQgKmluaG93LCBibGFzdF9vdXQgb3V0ZnVuLCB2b2lkICpvdXRob3cpOworLyogRGVjb21wcmVzcyBpbnB1dCB0byBvdXRwdXQgdXNpbmcgdGhlIHByb3ZpZGVkIGluZnVuKCkgYW5kIG91dGZ1bigpIGNhbGxzLgorICogT24gc3VjY2VzcywgdGhlIHJldHVybiB2YWx1ZSBvZiBibGFzdCgpIGlzIHplcm8uICBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbgorICogdGhlIHNvdXJjZSBkYXRhLCBpLmUuIGl0IGlzIG5vdCBpbiB0aGUgcHJvcGVyIGZvcm1hdCwgdGhlbiBhIG5lZ2F0aXZlIHZhbHVlCisgKiBpcyByZXR1cm5lZC4gIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlIG9yIHRoZXJlIGlzIG5vdCBlbm91Z2gKKyAqIG91dHB1dCBzcGFjZSwgdGhlbiBhIHBvc2l0aXZlIGVycm9yIGlzIHJldHVybmVkLgorICoKKyAqIFRoZSBpbnB1dCBmdW5jdGlvbiBpcyBpbnZva2VkOiBsZW4gPSBpbmZ1bihob3csICZidWYpLCB3aGVyZSBidWYgaXMgc2V0IGJ5CisgKiBpbmZ1bigpIHRvIHBvaW50IHRvIHRoZSBpbnB1dCBidWZmZXIsIGFuZCBpbmZ1bigpIHJldHVybnMgdGhlIG51bWJlciBvZgorICogYXZhaWxhYmxlIGJ5dGVzIHRoZXJlLiAgSWYgaW5mdW4oKSByZXR1cm5zIHplcm8sIHRoZW4gYmxhc3QoKSByZXR1cm5zIHdpdGgKKyAqIGFuIGlucHV0IGVycm9yLiAgKGJsYXN0KCkgb25seSBhc2tzIGZvciBpbnB1dCBpZiBpdCBuZWVkcyBpdC4pICBpbmhvdyBpcyBmb3IKKyAqIHVzZSBieSB0aGUgYXBwbGljYXRpb24gdG8gcGFzcyBhbiBpbnB1dCBkZXNjcmlwdG9yIHRvIGluZnVuKCksIGlmIGRlc2lyZWQuCisgKgorICogVGhlIG91dHB1dCBmdW5jdGlvbiBpcyBpbnZva2VkOiBlcnIgPSBvdXRmdW4oaG93LCBidWYsIGxlbiksIHdoZXJlIHRoZSBieXRlcworICogdG8gYmUgd3JpdHRlbiBhcmUgYnVmWzAuLmxlbi0xXS4gIElmIGVyciBpcyBub3QgemVybywgdGhlbiBibGFzdCgpIHJldHVybnMKKyAqIHdpdGggYW4gb3V0cHV0IGVycm9yLiAgb3V0ZnVuKCkgaXMgYWx3YXlzIGNhbGxlZCB3aXRoIGxlbiA8PSA0MDk2LiAgb3V0aG93CisgKiBpcyBmb3IgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBwYXNzIGFuIG91dHB1dCBkZXNjcmlwdG9yIHRvIG91dGZ1bigpLCBpZgorICogZGVzaXJlZC4KKyAqCisgKiBUaGUgcmV0dXJuIGNvZGVzIGFyZToKKyAqCisgKiAgIDI6ICByYW4gb3V0IG9mIGlucHV0IGJlZm9yZSBjb21wbGV0aW5nIGRlY29tcHJlc3Npb24KKyAqICAgMTogIG91dHB1dCBlcnJvciBiZWZvcmUgY29tcGxldGluZyBkZWNvbXByZXNzaW9uCisgKiAgIDA6ICBzdWNjZXNzZnVsIGRlY29tcHJlc3Npb24KKyAqICAtMTogIGxpdGVyYWwgZmxhZyBub3QgemVybyBvciBvbmUKKyAqICAtMjogIGRpY3Rpb25hcnkgc2l6ZSBub3QgaW4gNC4uNgorICogIC0zOiAgZGlzdGFuY2UgaXMgdG9vIGZhciBiYWNrCisgKgorICogQXQgdGhlIGJvdHRvbSBvZiBibGFzdC5jIGlzIGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IHVzZXMgYmxhc3QoKSB0aGF0IGNhbiBiZQorICogY29tcGlsZWQgdG8gcHJvZHVjZSBhIGNvbW1hbmQtbGluZSBkZWNvbXByZXNzaW9uIGZpbHRlciBieSBkZWZpbmluZyBURVNULgorICovCmRpZmYgLS1naXQgYS9jb250cmliL2JsYXN0L3Rlc3QucGsgYi9jb250cmliL2JsYXN0L3Rlc3QucGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxMGIyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYmxhc3QvdGVzdC5wawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL2JsYXN0L3Rlc3QudHh0IGIvY29udHJpYi9ibGFzdC90ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRmMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9ibGFzdC90ZXN0LnR4dApAQCAtMCwwICsxIEBACitBSUFJQUlBSUFJQUlBClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9pbmZsYXRlODYvaW5mZmFzdC5TIGIvY29udHJpYi9pbmZsYXRlODYvaW5mZmFzdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTgwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMKQEAgLTAsMCArMSwxMDk1IEBACisvKg0KKyAqIGluZmZhc3QuUyBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2Y6DQorICoNCisgKiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZw0KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXINCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIA0KKyAqDQorICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+DQorICogUGxlYXNlIHVzZSB0aGUgY29weXJpZ2h0IGNvbmRpdGlvbnMgYWJvdmUuDQorICogDQorICogVGhpcyB2ZXJzaW9uIChKYW4tMjMtMjAwMykgb2YgaW5mbGF0ZV9mYXN0IHdhcyBjb2RlZCBhbmQgdGVzdGVkIHVuZGVyDQorICogR05VL0xpbnV4IG9uIGEgcGVudGl1bSAzLCB1c2luZyB0aGUgZ2NjLTMuMiBjb21waWxlciBkaXN0cmlidXRpb24uICBPbiB0aGF0DQorICogbWFjaGluZSwgSSBmb3VuZCB0aGF0IGd6aXAgc3R5bGUgYXJjaGl2ZXMgZGVjb21wcmVzc2VkIGFib3V0IDIwJSBmYXN0ZXIgdGhhbg0KKyAqIHRoZSBnY2MtMy4yIC1PMyAtZm9taXQtZnJhbWUtcG9pbnRlciBjb21waWxlZCB2ZXJzaW9uLiAgWW91ciByZXN1bHRzIHdpbGwNCisgKiBkZXBlbmQgb24gaG93IGxhcmdlIG9mIGEgYnVmZmVyIGlzIHVzZWQgZm9yIHpfc3RyZWFtLm5leHRfaW4gJiBuZXh0X291dA0KKyAqICg4Sy0zMksgd29ya2VkIGJlc3QgZm9yIG15IDI1NksgY3B1IGNhY2hlKSBhbmQgaG93IG11Y2ggb3ZlcmhlYWQgdGhlcmUgaXMgaW4NCisgKiBzdHJlYW0gcHJvY2Vzc2luZyBJL08gYW5kIGNyYzMyL2FkZGxlcjMyLiAgSW4gbXkgY2FzZSwgdGhpcyByb3V0aW5lIHVzZWQNCisgKiA3MCUgb2YgdGhlIGNwdSB0aW1lIGFuZCBjcmMzMiB1c2VkIDIwJS4NCisgKg0KKyAqIEkgYW0gY29uZmlkZW50IHRoYXQgdGhpcyB2ZXJzaW9uIHdpbGwgd29yayBpbiB0aGUgZ2VuZXJhbCBjYXNlLCBidXQgSSBoYXZlDQorICogbm90IHRlc3RlZCBhIHdpZGUgdmFyaWV0eSBvZiBkYXRhc2V0cyBvciBhIHdpZGUgdmFyaWV0eSBvZiBwbGF0Zm9ybXMuDQorICoNCisgKiBKYW4tMjQtMjAwMyAtLSBBZGRlZCAtRFVTRV9NTVggZGVmaW5lIGZvciBzbGlnaHRseSBmYXN0ZXIgaW5mbGF0aW5nLg0KKyAqIEl0IHNob3VsZCBiZSBhIHJ1bnRpbWUgZmxhZyBpbnN0ZWFkIG9mIGNvbXBpbGUgdGltZSBmbGFnLi4uDQorICovDQorDQorLmZpbGUgImluZmZhc3QuUyINCisNCisuZ2xvYmwgaW5mbGF0ZV9mYXN0DQorDQorLnRleHQNCisuYWxpZ24gNCwwDQorLkxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlX21zZzoNCisuc3RyaW5nICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiDQorDQorLmFsaWduIDQsMA0KKy5MX2ludmFsaWRfZGlzdGFuY2VfY29kZV9tc2c6DQorLnN0cmluZyAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIg0KKw0KKy5hbGlnbiA0LDANCisuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnOg0KKy5zdHJpbmcgImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIg0KKw0KKyNpZiBkZWZpbmVkKCBVU0VfTU1YICkNCisuYWxpZ24gNCwwDQorLkxfbWFzazogLyogbWFza1tOXSA9ICggMSA8PCBOICkgLSAxICovDQorLmxvbmcgMA0KKy5sb25nIDENCisubG9uZyAzDQorLmxvbmcgNw0KKy5sb25nIDE1DQorLmxvbmcgMzENCisubG9uZyA2Mw0KKy5sb25nIDEyNw0KKy5sb25nIDI1NQ0KKy5sb25nIDUxMQ0KKy5sb25nIDEwMjMNCisubG9uZyAyMDQ3DQorLmxvbmcgNDA5NQ0KKy5sb25nIDgxOTENCisubG9uZyAxNjM4Mw0KKy5sb25nIDMyNzY3DQorLmxvbmcgNjU1MzUNCisubG9uZyAxMzEwNzENCisubG9uZyAyNjIxNDMNCisubG9uZyA1MjQyODcNCisubG9uZyAxMDQ4NTc1DQorLmxvbmcgMjA5NzE1MQ0KKy5sb25nIDQxOTQzMDMNCisubG9uZyA4Mzg4NjA3DQorLmxvbmcgMTY3NzcyMTUNCisubG9uZyAzMzU1NDQzMQ0KKy5sb25nIDY3MTA4ODYzDQorLmxvbmcgMTM0MjE3NzI3DQorLmxvbmcgMjY4NDM1NDU1DQorLmxvbmcgNTM2ODcwOTExDQorLmxvbmcgMTA3Mzc0MTgyMw0KKy5sb25nIDIxNDc0ODM2NDcNCisubG9uZyA0Mjk0OTY3Mjk1DQorI2VuZGlmDQorDQorLnRleHQNCisNCisvKg0KKyAqIHN0cnVjdCB6X3N0cmVhbSBvZmZzZXRzLCBpbiB6bGliLmgNCisgKi8NCisjZGVmaW5lIG5leHRfaW5fc3RybSAgIDAgICAvKiBzdHJtLT5uZXh0X2luICovDQorI2RlZmluZSBhdmFpbF9pbl9zdHJtICA0ICAgLyogc3RybS0+YXZhaWxfaW4gKi8NCisjZGVmaW5lIG5leHRfb3V0X3N0cm0gIDEyICAvKiBzdHJtLT5uZXh0X291dCAqLw0KKyNkZWZpbmUgYXZhaWxfb3V0X3N0cm0gMTYgIC8qIHN0cm0tPmF2YWlsX291dCAqLw0KKyNkZWZpbmUgbXNnX3N0cm0gICAgICAgMjQgIC8qIHN0cm0tPm1zZyAqLw0KKyNkZWZpbmUgc3RhdGVfc3RybSAgICAgMjggIC8qIHN0cm0tPnN0YXRlICovDQorDQorLyoNCisgKiBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBvZmZzZXRzLCBpbiBpbmZsYXRlLmgNCisgKi8NCisjZGVmaW5lIG1vZGVfc3RhdGUgICAgIDAgICAvKiBzdGF0ZS0+bW9kZSAqLw0KKyNkZWZpbmUgd3NpemVfc3RhdGUgICAgMzIgIC8qIHN0YXRlLT53c2l6ZSAqLw0KKyNkZWZpbmUgd3JpdGVfc3RhdGUgICAgMzYgIC8qIHN0YXRlLT53cml0ZSAqLw0KKyNkZWZpbmUgd2luZG93X3N0YXRlICAgNDAgIC8qIHN0YXRlLT53aW5kb3cgKi8NCisjZGVmaW5lIGhvbGRfc3RhdGUgICAgIDQ0ICAvKiBzdGF0ZS0+aG9sZCAqLw0KKyNkZWZpbmUgYml0c19zdGF0ZSAgICAgNDggIC8qIHN0YXRlLT5iaXRzICovDQorI2RlZmluZSBsZW5jb2RlX3N0YXRlICA2NCAgLyogc3RhdGUtPmxlbmNvZGUgKi8NCisjZGVmaW5lIGRpc3Rjb2RlX3N0YXRlIDY4ICAvKiBzdGF0ZS0+ZGlzdGNvZGUgKi8NCisjZGVmaW5lIGxlbmJpdHNfc3RhdGUgIDcyICAvKiBzdGF0ZS0+bGVuYml0cyAqLw0KKyNkZWZpbmUgZGlzdGJpdHNfc3RhdGUgNzYgIC8qIHN0YXRlLT5kaXN0Yml0cyAqLw0KKw0KKy8qDQorICogaW5mbGF0ZV9mYXN0J3MgYWN0aXZhdGlvbiByZWNvcmQNCisgKi8NCisjZGVmaW5lIGxvY2FsX3Zhcl9zaXplIDU2IC8qIGhvdyBtdWNoIGxvY2FsIHNwYWNlIGZvciB2YXJzICovDQorI2RlZmluZSBzdHJtX3NwICAgICAgICA4MCAvKiBmaXJzdCBhcmc6IHpfc3RyZWFtICogKGxvY2FsX3Zhcl9zaXplICsgMjQpICovDQorI2RlZmluZSBzdGFydF9zcCAgICAgICA4NCAvKiBzZWNvbmQgYXJnOiB1bnNpZ25lZCBpbnQgKGxvY2FsX3Zhcl9zaXplICsgMjgpICovDQorDQorLyoNCisgKiBvZmZzZXRzIGZvciBsb2NhbCB2YXJzIG9uIHN0YWNrDQorICovDQorI2RlZmluZSBvdXQgICAgICAgICAgICA1MiAgLyogdW5zaWduZWQgY2hhciogKi8NCisjZGVmaW5lIHdpbmRvdyAgICAgICAgIDQ4ICAvKiB1bnNpZ25lZCBjaGFyKiAqLw0KKyNkZWZpbmUgd3NpemUgICAgICAgICAgNDQgIC8qIHVuc2lnbmVkIGludCAqLw0KKyNkZWZpbmUgd3JpdGUgICAgICAgICAgNDAgIC8qIHVuc2lnbmVkIGludCAqLw0KKyNkZWZpbmUgaW4gICAgICAgICAgICAgMzYgIC8qIHVuc2lnbmVkIGNoYXIqICovDQorI2RlZmluZSBiZWcgICAgICAgICAgICAzMiAgLyogdW5zaWduZWQgY2hhciogKi8NCisjZGVmaW5lIGRpc3QgICAgICAgICAgIDI4ICAvKiB1bnNpZ25lZCBpbnQgKi8NCisjZGVmaW5lIGxlbiAgICAgICAgICAgIDI0ICAvKiB1bnNpZ25lZCBpbnQgKi8NCisjZGVmaW5lIGxhc3QgICAgICAgICAgIDIwICAvKiB1bnNpZ25lZCBjaGFyKiAqLw0KKyNkZWZpbmUgZW5kICAgICAgICAgICAgMTYgIC8qIHVuc2lnbmVkIGNoYXIqICovDQorI2RlZmluZSBkY29kZSAgICAgICAgICAxMiAgLyogY29kZSogKi8NCisjZGVmaW5lIGxjb2RlICAgICAgICAgICA4ICAvKiBjb2RlKiAqLw0KKyNkZWZpbmUgZG1hc2sgICAgICAgICAgIDQgIC8qIHVuc2lnbmVkIGludCAqLw0KKyNkZWZpbmUgbG1hc2sgICAgICAgICAgIDAgIC8qIHVuc2lnbmVkIGludCAqLw0KKw0KKy8qDQorICogdHlwZWRlZiBlbnVtIGluZmxhdGVfbW9kZSBjb25zdHMsIGluIGluZmxhdGUuaA0KKyAqLw0KKyNpZm5kZWYgTk9fR1VOWklQDQorI2RlZmluZSBHVU5aSVANCisjZW5kaWYNCisNCisjaWZkZWYgR1VOWklQDQorI2RlZmluZSBJTkZMQVRFX01PREVfVFlQRSAxMSAgLyogc3RhdGUtPm1vZGUgZmxhZ3MgZW51bS1lZCBpbiBpbmZsYXRlLmggKi8NCisjZGVmaW5lIElORkxBVEVfTU9ERV9CQUQgIDI2DQorI2Vsc2UNCisjZGVmaW5lIElORkxBVEVfTU9ERV9UWVBFIDMNCisjZGVmaW5lIElORkxBVEVfTU9ERV9CQUQgIDE3DQorI2VuZGlmDQorDQorDQorLmFsaWduIDE2LDB4OTANCitpbmZsYXRlX2Zhc3Q6DQorICAgICAgICBwdXNobCAgICVlZGkNCisgICAgICAgIHB1c2hsICAgJWVzaQ0KKyAgICAgICAgcHVzaGwgICAlZWJwDQorICAgICAgICBwdXNobCAgICVlYngNCisgICAgICAgIHB1c2hmICAgLyogc2F2ZSBlZmxhZ3MgKHN0cm1fc3AsIHN0YXRlX3NwIGFzc3VtZXMgdGhpcyBpcyAzMiBiaXRzKSAqLw0KKyAgICAgICAgc3VibCAgICAkbG9jYWxfdmFyX3NpemUsICVlc3ANCisgICAgICAgIGNsZA0KKyNpZiBkZWZpbmVkKCBVU0VfTU1YICkNCisgICAgICAgIGVtbXMNCisjZW5kaWYNCisNCisjZGVmaW5lIHN0cm1fciAgJWVzaQ0KKyNkZWZpbmUgc3RhdGVfciAlZWRpDQorDQorICAgICAgICBtb3ZsICAgIHN0cm1fc3AoJWVzcCksIHN0cm1fcg0KKyAgICAgICAgbW92bCAgICBzdGF0ZV9zdHJtKHN0cm1fciksIHN0YXRlX3INCisNCisgICAgICAgIC8qIGluID0gc3RybS0+bmV4dF9pbjsNCisgICAgICAgICAqIG91dCA9IHN0cm0tPm5leHRfb3V0Ow0KKyAgICAgICAgICogbGFzdCA9IGluICsgc3RybS0+YXZhaWxfaW4gLSA1Ow0KKyAgICAgICAgICogYmVnID0gb3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsNCisgICAgICAgICAqIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOw0KKyAgICAgICAgICovDQorICAgICAgICBtb3ZsICAgIG5leHRfaW5fc3RybShzdHJtX3IpLCAlZWF4DQorICAgICAgICBtb3ZsICAgIG5leHRfb3V0X3N0cm0oc3RybV9yKSwgJWVieA0KKyAgICAgICAgbW92bCAgICBhdmFpbF9pbl9zdHJtKHN0cm1fciksICVlZHgNCisgICAgICAgIG1vdmwgICAgYXZhaWxfb3V0X3N0cm0oc3RybV9yKSwgJWVjeA0KKyAgICAgICAgbW92bCAgICBzdGFydF9zcCglZXNwKSwgJWVicA0KKw0KKyAgICAgICAgYWRkbCAgICAlZWF4LCAlZWR4ICAgICAgLyogYXZhaWxfaW4gKz0gbmV4dF9pbiAqLw0KKyAgICAgICAgc3VibCAgICAkNSwgJWVkeCAgICAgICAgLyogYXZhaWxfaW4gLT0gNSAqLw0KKw0KKyAgICAgICAgc3VibCAgICAlZWN4LCAlZWJwICAgICAgLyogc3RhcnQgLT0gYXZhaWxfb3V0ICovDQorICAgICAgICBuZWdsICAgICVlYnAgICAgICAgICAgICAvKiBzdGFydCA9IC1zdGFydCAqLw0KKyAgICAgICAgYWRkbCAgICAlZWJ4LCAlZWJwICAgICAgLyogc3RhcnQgKz0gbmV4dF9vdXQgKi8NCisNCisgICAgICAgIHN1YmwgICAgJDI1NywgJWVjeCAgICAgIC8qIGF2YWlsX291dCAtPSAyNTcgKi8NCisgICAgICAgIGFkZGwgICAgJWVieCwgJWVjeCAgICAgIC8qIGF2YWlsX291dCArPSBvdXQgKi8NCisNCisgICAgICAgIG1vdmwgICAgJWVheCwgaW4oJWVzcCkNCisgICAgICAgIG1vdmwgICAgJWVieCwgb3V0KCVlc3ApDQorICAgICAgICBtb3ZsICAgICVlZHgsIGxhc3QoJWVzcCkNCisgICAgICAgIG1vdmwgICAgJWVicCwgYmVnKCVlc3ApDQorICAgICAgICBtb3ZsICAgICVlY3gsIGVuZCglZXNwKQ0KKw0KKyAgICAgICAgLyogd3NpemUgPSBzdGF0ZS0+d3NpemU7DQorICAgICAgICAgKiB3cml0ZSA9IHN0YXRlLT53cml0ZTsNCisgICAgICAgICAqIHdpbmRvdyA9IHN0YXRlLT53aW5kb3c7DQorICAgICAgICAgKiBob2xkID0gc3RhdGUtPmhvbGQ7DQorICAgICAgICAgKiBiaXRzID0gc3RhdGUtPmJpdHM7DQorICAgICAgICAgKiBsY29kZSA9IHN0YXRlLT5sZW5jb2RlOw0KKyAgICAgICAgICogZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7DQorICAgICAgICAgKiBsbWFzayA9ICggMSA8PCBzdGF0ZS0+bGVuYml0cyApIC0gMTsNCisgICAgICAgICAqIGRtYXNrID0gKCAxIDw8IHN0YXRlLT5kaXN0Yml0cyApIC0gMTsNCisgICAgICAgICAqLw0KKw0KKyAgICAgICAgbW92bCAgICBsZW5jb2RlX3N0YXRlKHN0YXRlX3IpLCAlZWF4DQorICAgICAgICBtb3ZsICAgIGRpc3Rjb2RlX3N0YXRlKHN0YXRlX3IpLCAlZWN4DQorDQorICAgICAgICBtb3ZsICAgICVlYXgsIGxjb2RlKCVlc3ApDQorICAgICAgICBtb3ZsICAgICVlY3gsIGRjb2RlKCVlc3ApDQorDQorICAgICAgICBtb3ZsICAgICQxLCAlZWF4DQorICAgICAgICBtb3ZsICAgIGxlbmJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gNCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4DQorICAgICAgICBkZWNsICAgICVlYXgNCisgICAgICAgIG1vdmwgICAgJWVheCwgbG1hc2soJWVzcCkNCisNCisgICAgICAgIG1vdmwgICAgJDEsICVlYXgNCisgICAgICAgIG1vdmwgICAgZGlzdGJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gNCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4DQorICAgICAgICBkZWNsICAgICVlYXgNCisgICAgICAgIG1vdmwgICAgJWVheCwgZG1hc2soJWVzcCkNCisNCisgICAgICAgIG1vdmwgICAgd3NpemVfc3RhdGUoc3RhdGVfciksICVlYXgNCisgICAgICAgIG1vdmwgICAgd3JpdGVfc3RhdGUoc3RhdGVfciksICVlY3gNCisgICAgICAgIG1vdmwgICAgd2luZG93X3N0YXRlKHN0YXRlX3IpLCAlZWR4DQorDQorICAgICAgICBtb3ZsICAgICVlYXgsIHdzaXplKCVlc3ApDQorICAgICAgICBtb3ZsICAgICVlY3gsIHdyaXRlKCVlc3ApDQorICAgICAgICBtb3ZsICAgICVlZHgsIHdpbmRvdyglZXNwKQ0KKw0KKyNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KKw0KKyNkZWZpbmUgaG9sZF9yICAgICAlZWJwDQorI2RlZmluZSBiaXRzX3IgICAgICVibA0KKyNkZWZpbmUgYml0c2xvbmdfciAlZWJ4DQorDQorICAgICAgICBtb3ZsICAgIGhvbGRfc3RhdGUoc3RhdGVfciksIGhvbGRfcg0KKyAgICAgICAgbW92bCAgICBiaXRzX3N0YXRlKHN0YXRlX3IpLCBiaXRzbG9uZ19yDQorDQorI2Vsc2UgLyogVVNFX01NWCAqLw0KKw0KKyNkZWZpbmUgaG9sZF9tbSAgICAlbW0wDQorI2RlZmluZSBiaXRzX3IgICAgICVlYnANCisjZGVmaW5lIGJpdHNsb25nX3IgJWVicA0KKw0KKyAgICAgICAgbW92bCAgICBob2xkX3N0YXRlKHN0YXRlX3IpLCAlZWJ4DQorICAgICAgICBtb3ZsICAgIGJpdHNfc3RhdGUoc3RhdGVfciksIGJpdHNsb25nX3INCisNCisjZW5kaWYNCisNCisjdW5kZWYgc3RybV9yDQorI3VuZGVmIHN0YXRlX3INCisjZGVmaW5lIGluX3IgICAgICAgJWVzaQ0KKyNkZWZpbmUgZnJvbV9yICAgICAlZXNpDQorI2RlZmluZSBvdXRfciAgICAgICVlZGkNCisNCisgICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3INCisNCisjaWYgISBkZWZpbmVkICggVVNFX01NWCApDQorDQorICAgICAgICAvKiBhbGlnbiBpbl9yIG9uIHdvcmQgYm91bmRhcnkgKi8NCisgICAgICAgIHRlc3RsICAgJDEsIGluX3INCisgICAgICAgIGp6ICAgICAgLkxfaXNfYWxpZ25lZA0KKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4DQorICAgICAgICBtb3ZiICAgIChpbl9yKSwgJWFsDQorICAgICAgICBpbmNsICAgIGluX3INCisgICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wNCisgICAgICAgIGFkZGIgICAgJDgsIGJpdHNfcg0KKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgNCisgICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yDQorDQorI2Vsc2UNCisgICAgICAgIC8qIGFsaWduIGluX3Igb24gbG9uZyBib3VuZGFyeSAqLw0KKy5MX2FsaWduX2xvbmc6DQorICAgICAgICB0ZXN0bCAgICQzLCBpbl9yDQorICAgICAgICBqeiAgICAgIC5MX2lzX2FsaWduZWQNCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheA0KKyAgICAgICAgbW92YiAgICAoaW5fciksICVhbA0KKyAgICAgICAgaW5jbCAgICBpbl9yDQorICAgICAgICBtb3ZsICAgIGJpdHNfciwgJWVjeA0KKyAgICAgICAgYWRkbCAgICAkOCwgYml0c19yDQorICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KKyAgICAgICAgb3JsICAgICAlZWF4LCAlZWJ4DQorICAgICAgICBqbXAgICAgIC5MX2FsaWduX2xvbmcNCisNCisjZW5kaWYNCisNCisuTF9pc19hbGlnbmVkOg0KKyAgICAgICAgbW92bCAgICBvdXQoJWVzcCksIG91dF9yDQorDQorI2lmIGRlZmluZWQgKCBVU0VfTU1YICkNCisNCisjZGVmaW5lIHVzZWRfbW0gICAlbW0xDQorI2RlZmluZSBkbWFzazJfbW0gJW1tMg0KKyNkZWZpbmUgbG1hc2syX21tICVtbTMNCisjZGVmaW5lIGxtYXNrX21tICAlbW00DQorI2RlZmluZSBkbWFza19tbSAgJW1tNQ0KKyNkZWZpbmUgdG1wX21tICAgICVtbTYNCisNCisgICAgICAgIG1vdmwgICAgb3V0KCVlc3ApLCBvdXRfcg0KKyAgICAgICAgbW92ZCAgICBsbWFzayglZXNwKSwgbG1hc2tfbW0gDQorICAgICAgICBtb3ZxICAgIGxtYXNrX21tLCBsbWFzazJfbW0NCisgICAgICAgIG1vdmQgICAgZG1hc2soJWVzcCksIGRtYXNrX21tDQorICAgICAgICBtb3ZxICAgIGRtYXNrX21tLCBkbWFzazJfbW0NCisgICAgICAgIG1vdmQgICAgJWVieCwgaG9sZF9tbQ0KKyAgICAgICAgcHhvciAgICB1c2VkX21tLCB1c2VkX21tDQorICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIGVieCA9IGxjb2RlICovDQorI2VuZGlmDQorDQorICAgICAgICBqbXAgICAgIC5MX2RvX2xvb3ANCisNCisuYWxpZ24gMTYsMHg5MA0KKw0KKyNpZiAhIGRlZmluZWQgKCBVU0VfTU1YICkNCisNCisuTF9kb19sb29wOg0KKyAgICAgICAgLyogcmVnczogJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dA0KKyAgICAgICAgICoNCisgICAgICAgICAqIGRvIHsgDQorICAgICAgICAgKiAgIGlmIChiaXRzIDwgMTUpIHsNCisgICAgICAgICAqICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsNCisgICAgICAgICAqICAgICBiaXRzICs9IDE2DQorICAgICAgICAgKiAgIH0NCisgICAgICAgICAqICAgdGhpcyA9IGxjb2RlW2hvbGQgJiBsbWFza10NCisgICAgICAgICAqLw0KKyAgICAgICAgY21wYiAgICAkMTUsIGJpdHNfcg0KKyAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGUgICAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLw0KKw0KKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4DQorICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovDQorICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovDQorICAgICAgICBhZGRiICAgICQxNiwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8NCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4DQorICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLw0KKw0KKy5MX2dldF9sZW5ndGhfY29kZToNCisgICAgICAgIG1vdmwgICAgbG1hc2soJWVzcCksICVlZHggICAgICAgLyogZWR4ID0gbG1hc2sgKi8NCisgICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlY3ggICAgICAgLyogZWN4ID0gbGNvZGUgKi8NCisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWR4ICAgICAgICAgICAgLyogZWR4ICY9IGhvbGQgKi8NCisgICAgICAgIG1vdmwgICAgKCVlY3gsJWVkeCw0KSwgJWVheCAgICAgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLw0KKw0KKyNlbHNlIC8qIFVTRV9NTVggKi8NCisNCisuTF9kb19sb29wOg0KKyAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8NCisNCisgICAgICAgIGNtcGwgICAgJDMyLCBiaXRzX3INCisgICAgICAgIGphICAgICAgLkxfZ2V0X2xlbmd0aF9jb2RlICAgICAgLyogaWYgKDMyIDwgYml0cykgKi8NCisNCisgICAgICAgIG1vdmQgICAgYml0c19yLCB0bXBfbW0NCisgICAgICAgIG1vdmQgICAgKGluX3IpLCAlbW03DQorICAgICAgICBhZGRsICAgICQ0LCBpbl9yDQorICAgICAgICBwc2xscSAgIHRtcF9tbSwgJW1tNw0KKyAgICAgICAgYWRkbCAgICAkMzIsIGJpdHNfcg0KKyAgICAgICAgcG9yICAgICAlbW03LCBob2xkX21tICAgICAgICAgICAvKiBob2xkX21tIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovDQorDQorLkxfZ2V0X2xlbmd0aF9jb2RlOg0KKyAgICAgICAgcGFuZCAgICBob2xkX21tLCBsbWFza19tbQ0KKyAgICAgICAgbW92ZCAgICBsbWFza19tbSwgJWVheA0KKyAgICAgICAgbW92cSAgICBsbWFzazJfbW0sIGxtYXNrX21tDQorICAgICAgICBtb3ZsICAgICglZWJ4LCVlYXgsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8NCisNCisjZW5kaWYNCisNCisjaWYgISBkZWZpbmVkKCBVU0VfTU1YICkNCisNCisuTF9kb2xlbjoNCisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBpbiwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQNCisgICAgICAgICAqDQorICAgICAgICAgKiBkb2xlbjoNCisgICAgICAgICAqICAgIGJpdHMgLT0gdGhpcy5iaXRzOw0KKyAgICAgICAgICogICAgaG9sZCA+Pj0gdGhpcy5iaXRzDQorICAgICAgICAgKi8NCisgICAgICAgIG1vdmIgICAgJWFoLCAlY2wgICAgICAgICAgICAgICAgLyogY2wgPSB0aGlzLmJpdHMgKi8NCisgICAgICAgIHN1YmIgICAgJWFoLCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8NCisgICAgICAgIHNocmwgICAgJWNsLCBob2xkX3IgICAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovDQorDQorICAgICAgICAvKiBjaGVjayBpZiBvcCBpcyBhIGxpdGVyYWwNCisgICAgICAgICAqIGlmIChvcCA9PSAwKSB7DQorICAgICAgICAgKiAgICBQVVAob3V0KSA9IHRoaXMudmFsOw0KKyAgICAgICAgICogIH0NCisgICAgICAgICAqLw0KKyAgICAgICAgdGVzdGIgICAlYWwsICVhbA0KKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZSAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8NCisNCisgICAgICAgIHNocmwgICAgJDE2LCAlZWF4ICAgICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8NCisgICAgICAgIHN0b3NiDQorDQorI2Vsc2UgLyogVVNFX01NWCAqLw0KKw0KKyNkZWZpbmUgbGVuX3IgICVlZHgNCisNCisuTF9kb2xlbjoNCisgICAgICAgIG1vdnpibCAgJWFoLCAlZWN4ICAgICAgICAgICAgICAgLyogZWN4ID0gdGhpcy5iaXRzICovDQorICAgICAgICBtb3ZsICAgICVlYXgsIGxlbl9yICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8NCisgICAgICAgIHNocmwgICAgJDE2LCBsZW5fciAgICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8NCisgICAgICAgIG1vdmQgICAgJWVjeCwgdXNlZF9tbQ0KKyAgICAgICAgc3VibCAgICAlZWN4LCBiaXRzX3IgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLw0KKw0KKyAgICAgICAgdGVzdGIgICAlYWwsICVhbA0KKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZSAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8NCisNCisgICAgICAgIG1vdmIgICAgJWRsLCAob3V0X3IpDQorICAgICAgICBpbmNsICAgIG91dF9yDQorDQorI2VuZGlmDQorDQorLkxfd2hpbGVfdGVzdDoNCisgICAgICAgIC8qIHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKQ0KKyAgICAgICAgICovDQorICAgICAgICBjbXBsICAgIG91dF9yLCBlbmQoJWVzcCkNCisgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcCAgICAgICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovDQorDQorICAgICAgICBjbXBsICAgIGluX3IsIGxhc3QoJWVzcCkNCisgICAgICAgIGphICAgICAgLkxfZG9fbG9vcCAgICAgICAgICAgICAgLyogaWYgKGluIDwgbGFzdCkgKi8NCisgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcA0KKw0KKyNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KKw0KKy5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlOg0KKyAgICAgICAgLyogcmVnczogJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGxlbg0KKyAgICAgICAgICoNCisgICAgICAgICAqIGVsc2UgaWYgKG9wICYgMTYpIHsNCisgICAgICAgICAqICAgbGVuID0gdGhpcy52YWwNCisgICAgICAgICAqICAgb3AgJj0gMTUNCisgICAgICAgICAqICAgaWYgKG9wKSB7DQorICAgICAgICAgKiAgICAgaWYgKG9wID4gYml0cykgew0KKyAgICAgICAgICogICAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7DQorICAgICAgICAgKiAgICAgICBiaXRzICs9IDE2DQorICAgICAgICAgKiAgICAgfQ0KKyAgICAgICAgICogICAgIGxlbiArPSBob2xkICYgbWFza1tvcF07DQorICAgICAgICAgKiAgICAgYml0cyAtPSBvcDsNCisgICAgICAgICAqICAgICBob2xkID4+PSBvcDsNCisgICAgICAgICAqICAgfQ0KKyAgICAgICAgICovDQorI2RlZmluZSBsZW5fciAlZWR4DQorICAgICAgICBtb3ZsICAgICVlYXgsIGxlbl9yICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8NCisgICAgICAgIHNocmwgICAgJDE2LCBsZW5fciAgICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8NCisgICAgICAgIG1vdmIgICAgJWFsLCAlY2wNCisNCisgICAgICAgIHRlc3RiICAgJDE2LCAlYWwNCisgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aCAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovDQorICAgICAgICBhbmRiICAgICQxNSwgJWNsICAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovDQorICAgICAgICBqeiAgICAgIC5MX3NhdmVfbGVuICAgICAgICAgICAgIC8qIGlmICghb3ApICovDQorICAgICAgICBjbXBiICAgICVjbCwgYml0c19yDQorICAgICAgICBqYWUgICAgIC5MX2FkZF9iaXRzX3RvX2xlbiAgICAgIC8qIGlmIChvcCA8PSBiaXRzKSAqLw0KKw0KKyAgICAgICAgbW92YiAgICAlY2wsICVjaCAgICAgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLw0KKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4DQorICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovDQorICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovDQorICAgICAgICBhZGRiICAgICQxNiwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8NCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4DQorICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLw0KKyAgICAgICAgbW92YiAgICAlY2gsICVjbCAgICAgICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovDQorDQorLkxfYWRkX2JpdHNfdG9fbGVuOg0KKyAgICAgICAgbW92bCAgICAkMSwgJWVheA0KKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgNCisgICAgICAgIGRlY2wgICAgJWVheA0KKyAgICAgICAgc3ViYiAgICAlY2wsIGJpdHNfcg0KKyAgICAgICAgYW5kbCAgICBob2xkX3IsICVlYXggICAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLw0KKyAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfcg0KKyAgICAgICAgYWRkbCAgICAlZWF4LCBsZW5fciAgICAgICAgICAgICAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovDQorDQorLkxfc2F2ZV9sZW46DQorICAgICAgICBtb3ZsICAgIGxlbl9yLCBsZW4oJWVzcCkgICAgICAgIC8qIHNhdmUgbGVuICovDQorI3VuZGVmICBsZW5fcg0KKw0KKy5MX2RlY29kZV9kaXN0YW5jZToNCisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBpbiwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0DQorICAgICAgICAgKg0KKyAgICAgICAgICogICBpZiAoYml0cyA8IDE1KSB7DQorICAgICAgICAgKiAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7DQorICAgICAgICAgKiAgICAgYml0cyArPSAxNg0KKyAgICAgICAgICogICB9DQorICAgICAgICAgKiAgIHRoaXMgPSBkY29kZVtob2xkICYgZG1hc2tdOw0KKyAgICAgICAgICogZG9kaXN0Og0KKyAgICAgICAgICogICBiaXRzIC09IHRoaXMuYml0czsNCisgICAgICAgICAqICAgaG9sZCA+Pj0gdGhpcy5iaXRzOw0KKyAgICAgICAgICogICBvcCA9IHRoaXMub3A7DQorICAgICAgICAgKi8NCisNCisgICAgICAgIGNtcGIgICAgJDE1LCBiaXRzX3INCisgICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RhbmNlX2NvZGUgICAgLyogaWYgKDE1IDwgYml0cykgKi8NCisNCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheA0KKyAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLw0KKyAgICAgICAgbW92YiAgICBiaXRzX3IsICVjbCAgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLw0KKyAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovDQorICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KKyAgICAgICAgb3JsICAgICAlZWF4LCBob2xkX3IgICAgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8NCisNCisuTF9nZXRfZGlzdGFuY2VfY29kZToNCisgICAgICAgIG1vdmwgICAgZG1hc2soJWVzcCksICVlZHggICAgICAgLyogZWR4ID0gZG1hc2sgKi8NCisgICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlY3ggICAgICAgLyogZWN4ID0gZGNvZGUgKi8NCisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWR4ICAgICAgICAgICAgLyogZWR4ICY9IGhvbGQgKi8NCisgICAgICAgIG1vdmwgICAgKCVlY3gsJWVkeCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGRtYXNrXSAqLw0KKw0KKyNlbHNlIC8qIFVTRV9NTVggKi8NCisNCisuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToNCisgICAgICAgIHRlc3RiICAgJDE2LCAlYWwNCisgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aCAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovDQorICAgICAgICBhbmRsICAgICQxNSwgJWVheCAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovDQorICAgICAgICBqeiAgICAgIC5MX2RlY29kZV9kaXN0YW5jZSAgICAgIC8qIGlmICghb3ApICovDQorDQorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLw0KKyAgICAgICAgbW92ZCAgICAlZWF4LCB1c2VkX21tDQorICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gNCisgICAgICAgIHN1YmwgICAgJWVheCwgYml0c19yDQorICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3gNCisgICAgICAgIGFkZGwgICAgJWVjeCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLw0KKw0KKy5MX2RlY29kZV9kaXN0YW5jZToNCisNCisgICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovDQorDQorICAgICAgICBjbXBsICAgICQzMiwgYml0c19yDQorICAgICAgICBqYSAgICAgIC5MX2dldF9kaXN0X2NvZGUgICAgICAgIC8qIGlmICgzMiA8IGJpdHMpICovDQorDQorICAgICAgICBtb3ZkICAgIGJpdHNfciwgdG1wX21tDQorICAgICAgICBtb3ZkICAgIChpbl9yKSwgJW1tNw0KKyAgICAgICAgYWRkbCAgICAkNCwgaW5fcg0KKyAgICAgICAgcHNsbHEgICB0bXBfbW0sICVtbTcNCisgICAgICAgIGFkZGwgICAgJDMyLCBiaXRzX3INCisgICAgICAgIHBvciAgICAgJW1tNywgaG9sZF9tbSAgICAgICAgICAgLyogaG9sZF9tbSB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLw0KKw0KKy5MX2dldF9kaXN0X2NvZGU6DQorICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIGVieCA9IGRjb2RlICovDQorICAgICAgICBwYW5kICAgIGhvbGRfbW0sIGRtYXNrX21tDQorICAgICAgICBtb3ZkICAgIGRtYXNrX21tLCAlZWF4DQorICAgICAgICBtb3ZxICAgIGRtYXNrMl9tbSwgZG1hc2tfbW0NCisgICAgICAgIG1vdmwgICAgKCVlYngsJWVheCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGxtYXNrXSAqLw0KKw0KKyNlbmRpZg0KKw0KKyNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KKw0KKyNkZWZpbmUgZGlzdF9yICVlZHgNCisuTF9kb2Rpc3Q6DQorICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovDQorICAgICAgICBzaHJsICAgICQxNiwgZGlzdF9yICAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzLnZhbCAqLw0KKyAgICAgICAgbW92YiAgICAlYWgsICVjbA0KKyAgICAgICAgc3ViYiAgICAlYWgsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLw0KKyAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfciAgICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8NCisNCisgICAgICAgIC8qIGlmIChvcCAmIDE2KSB7DQorICAgICAgICAgKiAgIGRpc3QgPSB0aGlzLnZhbA0KKyAgICAgICAgICogICBvcCAmPSAxNQ0KKyAgICAgICAgICogICBpZiAob3AgPiBiaXRzKSB7DQorICAgICAgICAgKiAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7DQorICAgICAgICAgKiAgICAgYml0cyArPSAxNg0KKyAgICAgICAgICogICB9DQorICAgICAgICAgKiAgIGRpc3QgKz0gaG9sZCAmIG1hc2tbb3BdOw0KKyAgICAgICAgICogICBiaXRzIC09IG9wOw0KKyAgICAgICAgICogICBob2xkID4+PSBvcDsNCisgICAgICAgICAqLw0KKyAgICAgICAgbW92YiAgICAlYWwsICVjbCAgICAgICAgICAgICAgICAvKiBjbCA9IHRoaXMub3AgKi8NCisNCisgICAgICAgIHRlc3RiICAgJDE2LCAlYWwgICAgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLw0KKyAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdA0KKyAgICAgICAgYW5kYiAgICAkMTUsICVjbCAgICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLw0KKyAgICAgICAganogICAgICAuTF9jaGVja19kaXN0X29uZQ0KKyAgICAgICAgY21wYiAgICAlY2wsIGJpdHNfcg0KKyAgICAgICAgamFlICAgICAuTF9hZGRfYml0c190b19kaXN0ICAgICAvKiBpZiAob3AgPD0gYml0cykgOTcuNiUgKi8NCisNCisgICAgICAgIG1vdmIgICAgJWNsLCAlY2ggICAgICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8NCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheA0KKyAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLw0KKyAgICAgICAgbW92YiAgICBiaXRzX3IsICVjbCAgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLw0KKyAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovDQorICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KKyAgICAgICAgb3JsICAgICAlZWF4LCBob2xkX3IgICAgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8NCisgICAgICAgIG1vdmIgICAgJWNoLCAlY2wgICAgICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLw0KKw0KKy5MX2FkZF9iaXRzX3RvX2Rpc3Q6DQorICAgICAgICBtb3ZsICAgICQxLCAlZWF4DQorICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KKyAgICAgICAgZGVjbCAgICAlZWF4ICAgICAgICAgICAgICAgICAgICAvKiAoMSA8PCBvcCkgLSAxICovDQorICAgICAgICBzdWJiICAgICVjbCwgYml0c19yDQorICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovDQorICAgICAgICBzaHJsICAgICVjbCwgaG9sZF9yDQorICAgICAgICBhZGRsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKSAqLw0KKyAgICAgICAgam1wICAgICAuTF9jaGVja193aW5kb3cNCisNCisjZWxzZSAvKiBVU0VfTU1YICovDQorDQorI2RlZmluZSBkaXN0X3IgJWVieA0KKy5MX2RvZGlzdDoNCisgICAgICAgIG1vdnpibCAgJWFoLCAlZWN4ICAgICAgICAgICAgICAgLyogZWN4ID0gdGhpcy5iaXRzICovDQorICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3Rfcg0KKyAgICAgICAgc2hybCAgICAkMTYsIGRpc3RfciAgICAgICAgICAgICAvKiBkaXN0ICA9IHRoaXMudmFsICovDQorICAgICAgICBzdWJsICAgICVlY3gsIGJpdHNfciAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovDQorICAgICAgICBtb3ZkICAgICVlY3gsIHVzZWRfbW0NCisNCisgICAgICAgIHRlc3RiICAgJDE2LCAlYWwgICAgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLw0KKyAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdCANCisgICAgICAgIGFuZGwgICAgJDE1LCAlZWF4ICAgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8NCisgICAgICAgIGp6ICAgICAgLkxfY2hlY2tfZGlzdF9vbmUNCisNCisuTF9hZGRfYml0c190b19kaXN0Og0KKyAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8NCisgICAgICAgIG1vdmQgICAgJWVheCwgdXNlZF9tbSAgICAgICAgICAgLyogc2F2ZSBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgb3AgKi8NCisgICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeCAgICAgICAgICAgLyogZ2V0IHRoZSBuZXh0IGJpdHMgb24gaW5wdXQgc3RyZWFtICovDQorICAgICAgICBzdWJsICAgICVlYXgsIGJpdHNfciAgICAgICAgICAgIC8qIGJpdHMgLT0gb3AgYml0cyAqLw0KKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4ICAvKiBlY3ggICA9IGhvbGQgJiBtYXNrW29wXSAqLw0KKyAgICAgICAgYWRkbCAgICAlZWN4LCBkaXN0X3IgICAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiBtYXNrW29wXSAqLw0KKyAgICAgICAgam1wICAgICAuTF9jaGVja193aW5kb3cNCisNCisjZW5kaWYNCisNCisuYWxpZ24gMTYsMHg5MA0KKw0KKy5MX2NoZWNrX2Rpc3Rfb25lOg0KKyAgICAgICAgY21wbCAgICAkMSwgZGlzdF9yDQorICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvdw0KKyAgICAgICAgY21wbCAgICBvdXRfciwgYmVnKCVlc3ApDQorICAgICAgICBqZSAgICAgIC5MX2NoZWNrX3dpbmRvdw0KKw0KKyAgICAgICAgZGVjbCAgICBvdXRfcg0KKyNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KKyAgICAgICAgbW92bCAgICBsZW4oJWVzcCksICVlY3gNCisjZWxzZQ0KKyAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeA0KKyNlbmRpZg0KKyAgICAgICAgbW92YiAgICAob3V0X3IpLCAlYWwNCisgICAgICAgIHN1YmwgICAgJDMsICVlY3gNCisNCisgICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQ0KKyAgICAgICAgbW92YiAgICAlYWwsIDIob3V0X3IpDQorICAgICAgICBtb3ZiICAgICVhbCwgMyhvdXRfcikNCisgICAgICAgIGFkZGwgICAgJDQsIG91dF9yDQorICAgICAgICByZXAgICAgIHN0b3NiDQorDQorI2lmIGRlZmluZWQoIFVTRV9NTVggKQ0KKyAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBtb3ZlIGxjb2RlIGJhY2sgdG8gJWVieCwgdG9zcyBkaXN0ICovDQorI2VuZGlmDQorICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QNCisNCisuYWxpZ24gMTYsMHg5MA0KKw0KKy5MX2NoZWNrX3dpbmRvdzoNCisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QNCisgICAgICAgICAqICAgICAgICVlY3ggPSBuYnl0ZXMNCisgICAgICAgICAqDQorICAgICAgICAgKiBuYnl0ZXMgPSBvdXQgLSBiZWc7DQorICAgICAgICAgKiBpZiAoZGlzdCA8PSBuYnl0ZXMpIHsNCisgICAgICAgICAqICAgZnJvbSA9IG91dCAtIGRpc3Q7DQorICAgICAgICAgKiAgIGRvIHsNCisgICAgICAgICAqICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsNCisgICAgICAgICAqICAgfSB3aGlsZSAoLS1sZW4gPiAwKSB7DQorICAgICAgICAgKiB9DQorICAgICAgICAgKi8NCisNCisgICAgICAgIG1vdmwgICAgaW5fciwgaW4oJWVzcCkgICAgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8NCisgICAgICAgIG1vdmwgICAgb3V0X3IsICVlYXgNCisgICAgICAgIHN1YmwgICAgYmVnKCVlc3ApLCAlZWF4ICAgICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovDQorDQorICAgICAgICBjbXBsICAgIGRpc3RfciwgJWVheA0KKyAgICAgICAgamIgICAgICAuTF9jbGlwX3dpbmRvdyAgICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLw0KKw0KKyNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KKyAgICAgICAgbW92bCAgICBsZW4oJWVzcCksICVlY3gNCisjZWxzZQ0KKyAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeA0KKyNlbmRpZg0KKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yDQorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovDQorDQorICAgICAgICBzdWJsICAgICQzLCAlZWN4DQorICAgICAgICBtb3ZiICAgIChmcm9tX3IpLCAlYWwNCisgICAgICAgIG1vdmIgICAgJWFsLCAob3V0X3IpDQorICAgICAgICBtb3ZiICAgIDEoZnJvbV9yKSwgJWFsDQorICAgICAgICBtb3ZiICAgIDIoZnJvbV9yKSwgJWRsDQorICAgICAgICBhZGRsICAgICQzLCBmcm9tX3INCisgICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQ0KKyAgICAgICAgbW92YiAgICAlZGwsIDIob3V0X3IpDQorICAgICAgICBhZGRsICAgICQzLCBvdXRfcg0KKyAgICAgICAgcmVwICAgICBtb3ZzYg0KKw0KKyAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovDQorI2lmIGRlZmluZWQoIFVTRV9NTVggKQ0KKyAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBtb3ZlIGxjb2RlIGJhY2sgdG8gJWVieCwgdG9zcyBkaXN0ICovDQorI2VuZGlmDQorICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QNCisNCisuYWxpZ24gMTYsMHg5MA0KKw0KKyNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KKw0KKy5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6DQorICAgICAgICAvKiBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgew0KKyAgICAgICAgICogICB0aGlzID0gbGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmIG1hc2tbb3BdKV07DQorICAgICAgICAgKiB9DQorICAgICAgICAgKi8NCisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwNCisgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQorDQorICAgICAgICBtb3ZsICAgICQxLCAlZWF4DQorICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KKyAgICAgICAgZGVjbCAgICAlZWF4DQorICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovDQorICAgICAgICBhZGRsICAgICVlZHgsICVlYXggICAgICAgICAgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLw0KKyAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBsY29kZSAqLw0KKyAgICAgICAgbW92bCAgICAoJWVkeCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVt2YWwgKyAoaG9sZCZtYXNrW29wXSldICovDQorICAgICAgICBqbXAgICAgIC5MX2RvbGVuDQorDQorI2Vsc2UgLyogVVNFX01NWCAqLw0KKw0KKy5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6IA0KKyAgICAgICAgdGVzdGIgICAkNjQsICVhbA0KKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8NCisNCisgICAgICAgIGFuZGwgICAgJDE1LCAlZWF4DQorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLw0KKyAgICAgICAgbW92ZCAgICBob2xkX21tLCAlZWN4DQorICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3gNCisgICAgICAgIGFkZGwgICAgbGVuX3IsICVlY3gNCisgICAgICAgIG1vdmwgICAgKCVlYngsJWVjeCw0KSwgJWVheCAgICAgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLw0KKyAgICAgICAgam1wICAgICAuTF9kb2xlbg0KKw0KKyNlbmRpZg0KKw0KKy5hbGlnbiAxNiwweDkwDQorDQorI2lmICEgZGVmaW5lZCggVVNFX01NWCApDQorDQorLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6DQorICAgICAgICAvKiBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgew0KKyAgICAgICAgICogICB0aGlzID0gZGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmIG1hc2tbb3BdKV07DQorICAgICAgICAgKiB9DQorICAgICAgICAgKi8NCisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwNCisgICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQorDQorICAgICAgICBtb3ZsICAgICQxLCAlZWF4DQorICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KKyAgICAgICAgZGVjbCAgICAlZWF4DQorICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovDQorICAgICAgICBhZGRsICAgICVlZHgsICVlYXggICAgICAgICAgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLw0KKyAgICAgICAgbW92bCAgICBkY29kZSglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBkY29kZSAqLw0KKyAgICAgICAgbW92bCAgICAoJWVkeCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBkY29kZVt2YWwgKyAoaG9sZCZtYXNrW29wXSldICovDQorICAgICAgICBqbXAgICAgIC5MX2RvZGlzdA0KKw0KKyNlbHNlIC8qIFVTRV9NTVggKi8NCisNCisuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDoNCisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwNCisgICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQorDQorICAgICAgICBhbmRsICAgICQxNSwgJWVheA0KKyAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8NCisgICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeA0KKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4DQorICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWF4ICAgICAgIC8qIGVjeCA9IGRjb2RlICovDQorICAgICAgICBhZGRsICAgIGRpc3RfciwgJWVjeA0KKyAgICAgICAgbW92bCAgICAoJWVheCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovDQorICAgICAgICBqbXAgICAgIC5MX2RvZGlzdA0KKw0KKyNlbmRpZg0KKw0KKy5hbGlnbiAxNiwweDkwDQorLkxfY2xpcF93aW5kb3c6DQorICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0DQorICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzDQorICAgICAgICAgKg0KKyAgICAgICAgICogZWxzZSB7DQorICAgICAgICAgKiAgIGlmIChkaXN0ID4gd3NpemUpIHsNCisgICAgICAgICAqICAgICBpbnZhbGlkIGRpc3RhbmNlDQorICAgICAgICAgKiAgIH0NCisgICAgICAgICAqICAgZnJvbSA9IHdpbmRvdzsNCisgICAgICAgICAqICAgbmJ5dGVzID0gZGlzdCAtIG5ieXRlczsNCisgICAgICAgICAqICAgaWYgKHdyaXRlID09IDApIHsNCisgICAgICAgICAqICAgICBmcm9tICs9IHdzaXplIC0gbmJ5dGVzOw0KKyAgICAgICAgICovDQorI2RlZmluZSBuYnl0ZXNfciAlZWN4DQorDQorICAgICAgICBtb3ZsICAgICVlYXgsIG5ieXRlc19yDQorICAgICAgICBtb3ZsICAgIHdzaXplKCVlc3ApLCAlZWF4ICAgICAgIC8qIHByZXBhcmUgZm9yIGRpc3QgY29tcGFyZSAqLw0KKyAgICAgICAgbmVnbCAgICBuYnl0ZXNfciAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovDQorICAgICAgICBtb3ZsICAgIHdpbmRvdyglZXNwKSwgZnJvbV9yICAgIC8qIGZyb20gPSB3aW5kb3cgKi8NCisNCisgICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4DQorICAgICAgICBqYiAgICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhciAvKiBpZiAoZGlzdCA+IHdzaXplKSAqLw0KKw0KKyAgICAgICAgYWRkbCAgICBkaXN0X3IsIG5ieXRlc19yICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovDQorICAgICAgICBjbXBsICAgICQwLCB3cml0ZSglZXNwKQ0KKyAgICAgICAgam5lICAgICAuTF93cmFwX2Fyb3VuZF93aW5kb3cgICAvKiBpZiAod3JpdGUgIT0gMCkgKi8NCisNCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsICVlYXgNCisgICAgICAgIGFkZGwgICAgJWVheCwgZnJvbV9yICAgICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLw0KKw0KKyAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdA0KKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcywgJWVheCA9IGxlbg0KKyAgICAgICAgICoNCisgICAgICAgICAqICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7DQorICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOw0KKyAgICAgICAgICogICAgICAgZG8gew0KKyAgICAgICAgICogICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsNCisgICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsNCisgICAgICAgICAqICAgICAgIGZyb20gPSBvdXQgLSBkaXN0Ow0KKyAgICAgICAgICogICAgIH0NCisgICAgICAgICAqICAgfQ0KKyAgICAgICAgICovDQorDQorI2lmICEgZGVmaW5lZCggVVNFX01NWCApDQorI2RlZmluZSBsZW5fciAlZWF4DQorICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgbGVuX3INCisjZW5kaWYNCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yDQorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KKw0KKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovDQorICAgICAgICByZXAgICAgIG1vdnNiDQorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3INCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCisgICAgICAgIGptcCAgICAgLkxfZG9fY29weTENCisNCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yDQorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KKw0KKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovDQorICAgICAgICByZXAgICAgIG1vdnNiDQorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3INCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCisgICAgICAgIGptcCAgICAgLkxfZG9fY29weTENCisNCisuTF93cmFwX2Fyb3VuZF93aW5kb3c6DQorICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0DQorICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzLCAlZWF4ID0gd3JpdGUsICVlYXggPSBsZW4NCisgICAgICAgICAqDQorICAgICAgICAgKiAgIGVsc2UgaWYgKHdyaXRlIDwgbmJ5dGVzKSB7DQorICAgICAgICAgKiAgICAgZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gbmJ5dGVzOw0KKyAgICAgICAgICogICAgIG5ieXRlcyAtPSB3cml0ZTsNCisgICAgICAgICAqICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7DQorICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOw0KKyAgICAgICAgICogICAgICAgZG8gew0KKyAgICAgICAgICogICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsNCisgICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsNCisgICAgICAgICAqICAgICAgIGZyb20gPSB3aW5kb3c7DQorICAgICAgICAgKiAgICAgICBuYnl0ZXMgPSB3cml0ZTsNCisgICAgICAgICAqICAgICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsNCisgICAgICAgICAqICAgICAgICAgbGVuIC09IG5ieXRlczsNCisgICAgICAgICAqICAgICAgICAgZG8gew0KKyAgICAgICAgICogICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOw0KKyAgICAgICAgICogICAgICAgICB9IHdoaWxlKC0tbmJ5dGVzKTsNCisgICAgICAgICAqICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7DQorICAgICAgICAgKiAgICAgICB9DQorICAgICAgICAgKiAgICAgfQ0KKyAgICAgICAgICogICB9DQorICAgICAgICAgKi8NCisjZGVmaW5lIHdyaXRlX3IgJWVheA0KKw0KKyAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgd3JpdGVfcg0KKyAgICAgICAgY21wbCAgICB3cml0ZV9yLCBuYnl0ZXNfcg0KKyAgICAgICAgamJlICAgICAuTF9jb250aWd1b3VzX2luX3dpbmRvdyAvKiBpZiAod3JpdGUgPj0gbmJ5dGVzKSAqLw0KKw0KKyAgICAgICAgYWRkbCAgICB3c2l6ZSglZXNwKSwgZnJvbV9yDQorICAgICAgICBhZGRsICAgIHdyaXRlX3IsIGZyb21fcg0KKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBuYnl0ZXMgKi8NCisgICAgICAgIHN1YmwgICAgd3JpdGVfciwgbmJ5dGVzX3IgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovDQorI3VuZGVmIHdyaXRlX3INCisNCisjaWYgISBkZWZpbmVkKCBVU0VfTU1YICkNCisgICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCBsZW5fcg0KKyNlbmRpZg0KKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3INCisgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovDQorDQorICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8NCisgICAgICAgIHJlcCAgICAgbW92c2INCisgICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLw0KKyAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgbmJ5dGVzX3IgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLw0KKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3INCisgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovDQorDQorICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8NCisgICAgICAgIHJlcCAgICAgbW92c2INCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcg0KKyAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLw0KKyAgICAgICAgam1wICAgICAuTF9kb19jb3B5MQ0KKw0KKy5MX2NvbnRpZ3VvdXNfaW5fd2luZG93Og0KKyAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdA0KKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcywgJWVheCA9IHdyaXRlLCAlZWF4ID0gbGVuDQorICAgICAgICAgKg0KKyAgICAgICAgICogICBlbHNlIHsNCisgICAgICAgICAqICAgICBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzOw0KKyAgICAgICAgICogICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsNCisgICAgICAgICAqICAgICAgIGxlbiAtPSBuYnl0ZXM7DQorICAgICAgICAgKiAgICAgICBkbyB7DQorICAgICAgICAgKiAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOw0KKyAgICAgICAgICogICAgICAgfSB3aGlsZSAoLS1uYnl0ZXMpOw0KKyAgICAgICAgICogICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7DQorICAgICAgICAgKiAgICAgfQ0KKyAgICAgICAgICogICB9DQorICAgICAgICAgKi8NCisjZGVmaW5lIHdyaXRlX3IgJWVheA0KKw0KKyAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3INCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLw0KKyN1bmRlZiB3cml0ZV9yDQorDQorI2lmICEgZGVmaW5lZCggVVNFX01NWCApDQorICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgbGVuX3INCisjZW5kaWYNCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yDQorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KKw0KKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovDQorICAgICAgICByZXAgICAgIG1vdnNiDQorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3INCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCisNCisuTF9kb19jb3B5MToNCisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0DQorICAgICAgICAgKiAgICAgICAlZWF4ID0gbGVuDQorICAgICAgICAgKg0KKyAgICAgICAgICogICAgIHdoaWxlIChsZW4gPiAwKSB7DQorICAgICAgICAgKiAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsNCisgICAgICAgICAqICAgICAgIGxlbi0tOw0KKyAgICAgICAgICogICAgIH0NCisgICAgICAgICAqICAgfQ0KKyAgICAgICAgICogfSB3aGlsZSAoaW4gPCBsYXN0ICYmIG91dCA8IGVuZCk7DQorICAgICAgICAgKi8NCisjdW5kZWYgbmJ5dGVzX3INCisjZGVmaW5lIGluX3IgJWVzaQ0KKw0KKyAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeA0KKyAgICAgICAgcmVwICAgICBtb3ZzYg0KKw0KKyAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovDQorI2lmIGRlZmluZWQoIFVTRV9NTVggKQ0KKyAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBtb3ZlIGxjb2RlIGJhY2sgdG8gJWVieCwgdG9zcyBkaXN0ICovDQorI2VuZGlmDQorICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QNCisNCisjdW5kZWYgbGVuX3INCisjdW5kZWYgZnJvbV9yDQorI3VuZGVmIGRpc3Rfcg0KKw0KKy5MX2ludmFsaWRfZGlzdGFuY2VfY29kZToNCisgICAgICAgIC8qIGVsc2Ugew0KKyAgICAgICAgICogICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsNCisgICAgICAgICAqICAgc3RhdGUtPm1vZGUgPSBCQUQ7DQorICAgICAgICAgKiB9DQorICAgICAgICAgKi8NCisgICAgICAgIG1vdmwgICAgJC5MX2ludmFsaWRfZGlzdGFuY2VfY29kZV9tc2csICVlY3gNCisgICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9CQUQsICVlZHgNCisgICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQ0KKw0KKy5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jazoNCisgICAgICAgIC8qIGVsc2UgaWYgKG9wICYgMzIpIHsNCisgICAgICAgICAqICAgc3RhdGUtPm1vZGUgPSBUWVBFOw0KKyAgICAgICAgICogICBicmVhazsNCisgICAgICAgICAqIH0NCisgICAgICAgICAqLw0KKyAgICAgICAgdGVzdGIgICAkMzIsICVhbA0KKyAgICAgICAganogICAgICAuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUgIC8qIGlmICgob3AgJiAzMikgPT0gMCkgKi8NCisNCisgICAgICAgIG1vdmwgICAgJDAsICVlY3gNCisgICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9UWVBFLCAlZWR4DQorICAgICAgICBqbXAgICAgIC5MX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCisNCisuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6DQorICAgICAgICAvKiBlbHNlIHsNCisgICAgICAgICAqICAgc3RybS0+bXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7DQorICAgICAgICAgKiAgIHN0YXRlLT5tb2RlID0gQkFEOw0KKyAgICAgICAgICogfQ0KKyAgICAgICAgICovDQorICAgICAgICBtb3ZsICAgICQuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnLCAlZWN4DQorICAgICAgICBtb3ZsICAgICRJTkZMQVRFX01PREVfQkFELCAlZWR4DQorICAgICAgICBqbXAgICAgIC5MX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCisNCisuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6DQorICAgICAgICAvKiBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOw0KKyAgICAgICAgICogc3RhdGUtPm1vZGUgPSBCQUQ7DQorICAgICAgICAgKi8NCisgICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogZnJvbV9yIGhhcyBpbidzIHJlZywgcHV0IGluIGJhY2sgKi8NCisgICAgICAgIG1vdmwgICAgJC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2csICVlY3gNCisgICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9CQUQsICVlZHgNCisgICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQ0KKw0KKy5MX3VwZGF0ZV9zdHJlYW1fc3RhdGU6DQorICAgICAgICAvKiBzZXQgc3RybS0+bXNnID0gJWVjeCwgc3RybS0+c3RhdGUtPm1vZGUgPSAlZWR4ICovDQorICAgICAgICBtb3ZsICAgIHN0cm1fc3AoJWVzcCksICVlYXgNCisgICAgICAgIHRlc3RsICAgJWVjeCwgJWVjeCAgICAgICAgICAgICAgLyogaWYgKG1zZyAhPSBOVUxMKSAqLw0KKyAgICAgICAganogICAgICAuTF9za2lwX21zZw0KKyAgICAgICAgbW92bCAgICAlZWN4LCBtc2dfc3RybSglZWF4KSAgICAvKiBzdHJtLT5tc2cgPSBtc2cgKi8NCisuTF9za2lwX21zZzoNCisgICAgICAgIG1vdmwgICAgc3RhdGVfc3RybSglZWF4KSwgJWVheCAgLyogc3RhdGUgPSBzdHJtLT5zdGF0ZSAqLw0KKyAgICAgICAgbW92bCAgICAlZWR4LCBtb2RlX3N0YXRlKCVlYXgpICAvKiBzdGF0ZS0+bW9kZSA9IGVkeCAoQkFEIHwgVFlQRSkgKi8NCisNCisuTF9icmVha19sb29wOg0KKw0KKyNkZWZpbmUgc3RybV9yICAlZWF4DQorI2RlZmluZSBzdGF0ZV9yICVlZHgNCisNCisgICAgICAgIC8qIGxlbiA9IGJpdHMgPj4gMzsNCisgICAgICAgICAqIGluIC09IGxlbjsNCisgICAgICAgICAqIGJpdHMgLT0gbGVuIDw8IDM7DQorICAgICAgICAgKiBob2xkICY9ICgxVSA8PCBiaXRzKSAtIDE7DQorICAgICAgICAgKiBzdGF0ZS0+aG9sZCA9IGhvbGQ7DQorICAgICAgICAgKiBzdGF0ZS0+Yml0cyA9IGJpdHM7DQorICAgICAgICAgKiBzdHJtLT5uZXh0X2luID0gaW47DQorICAgICAgICAgKiBzdHJtLT5uZXh0X291dCA9IG91dDsNCisgICAgICAgICAqLw0KKyAgICAgICAgbW92bCAgICBzdHJtX3NwKCVlc3ApLCBzdHJtX3INCisgICAgICAgIG1vdmwgICAgYml0c2xvbmdfciwgJWVjeA0KKyAgICAgICAgbW92bCAgICBzdGF0ZV9zdHJtKHN0cm1fciksIHN0YXRlX3INCisgICAgICAgIHNocmwgICAgJDMsICVlY3gNCisgICAgICAgIHN1YmwgICAgJWVjeCwgaW5fcg0KKyAgICAgICAgc2hsbCAgICAkMywgJWVjeA0KKyAgICAgICAgc3VibCAgICAlZWN4LCBiaXRzbG9uZ19yDQorICAgICAgICBtb3ZsICAgIG91dF9yLCBuZXh0X291dF9zdHJtKHN0cm1fcikNCisgICAgICAgIG1vdmwgICAgaW5fciwgbmV4dF9pbl9zdHJtKHN0cm1fcikNCisgICAgICAgIG1vdmwgICAgYml0c2xvbmdfciwgYml0c19zdGF0ZShzdGF0ZV9yKQ0KKw0KKyAgICAgICAgbW92bCAgICBiaXRzbG9uZ19yLCAlZWN4DQorICAgICAgICBtb3ZsICAgICQxLCAlZWJ4ICAgICAgICAgICAgICAgIC8qIG92ZXJ3cml0ZXMgYml0c2xvbmdfciwgJWJsICovDQorICAgICAgICBzaGxsICAgICVjbCwgJWVieA0KKyAgICAgICAgZGVjbCAgICAlZWJ4DQorDQorI3VuZGVmIGJpdHNfcg0KKyN1bmRlZiBiaXRzbG9uZ19yDQorDQorI2lmICEgZGVmaW5lZCggVVNFX01NWCApDQorDQorICAgICAgICBhbmRsICAgICVlYngsIGhvbGRfcg0KKyAgICAgICAgbW92bCAgICBob2xkX3IsIGhvbGRfc3RhdGUoc3RhdGVfcikNCisNCisjZWxzZSAvKiBVU0VfTU1YICovDQorDQorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLw0KKyAgICAgICAgbW92ZCAgICBob2xkX21tLCAlZWN4DQorICAgICAgICBhbmRsICAgICVlYngsICVlY3gNCisgICAgICAgIG1vdmwgICAgJWVjeCwgaG9sZF9zdGF0ZShzdGF0ZV9yKQ0KKw0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgbGFzdF9yICVlYngNCisNCisgICAgICAgIC8qIHN0cm0tPmF2YWlsX2luID0gaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gaW4pIDogNSAtIChpbiAtIGxhc3QpICovDQorICAgICAgICBtb3ZsICAgIGxhc3QoJWVzcCksIGxhc3Rfcg0KKyAgICAgICAgY21wbCAgICBpbl9yLCBsYXN0X3INCisgICAgICAgIGpiZSAgICAgLkxfbGFzdF9pc19zbWFsbGVyICAgICAvKiBpZiAoaW4gPj0gbGFzdCkgKi8NCisNCisgICAgICAgIHN1YmwgICAgaW5fciwgbGFzdF9yICAgICAgICAgICAvKiBsYXN0IC09IGluICovDQorICAgICAgICBhZGRsICAgICQ1LCBsYXN0X3IgICAgICAgICAgICAgLyogbGFzdCArPSA1ICovDQorICAgICAgICBtb3ZsICAgIGxhc3RfciwgYXZhaWxfaW5fc3RybShzdHJtX3IpDQorICAgICAgICBqbXAgICAgIC5MX2ZpeHVwX291dA0KKy5MX2xhc3RfaXNfc21hbGxlcjoNCisgICAgICAgIHN1YmwgICAgbGFzdF9yLCBpbl9yICAgICAgICAgICAvKiBpbiAtPSBsYXN0ICovDQorICAgICAgICBuZWdsICAgIGluX3IgICAgICAgICAgICAgICAgICAgLyogaW4gPSAtaW4gKi8NCisgICAgICAgIGFkZGwgICAgJDUsIGluX3IgICAgICAgICAgICAgICAvKiBpbiArPSA1ICovDQorICAgICAgICBtb3ZsICAgIGluX3IsIGF2YWlsX2luX3N0cm0oc3RybV9yKQ0KKw0KKyN1bmRlZiBsYXN0X3INCisjZGVmaW5lIGVuZF9yICVlYngNCisNCisuTF9maXh1cF9vdXQ6DQorICAgICAgICAvKiBzdHJtLT5hdmFpbF9vdXQgPSBvdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gb3V0KSA6IDI1NyAtIChvdXQgLSBlbmQpKi8NCisgICAgICAgIG1vdmwgICAgZW5kKCVlc3ApLCBlbmRfcg0KKyAgICAgICAgY21wbCAgICBvdXRfciwgZW5kX3INCisgICAgICAgIGpiZSAgICAgLkxfZW5kX2lzX3NtYWxsZXIgICAgICAvKiBpZiAob3V0ID49IGVuZCkgKi8NCisNCisgICAgICAgIHN1YmwgICAgb3V0X3IsIGVuZF9yICAgICAgICAgICAvKiBlbmQgLT0gb3V0ICovDQorICAgICAgICBhZGRsICAgICQyNTcsIGVuZF9yICAgICAgICAgICAgLyogZW5kICs9IDI1NyAqLw0KKyAgICAgICAgbW92bCAgICBlbmRfciwgYXZhaWxfb3V0X3N0cm0oc3RybV9yKQ0KKyAgICAgICAgam1wICAgICAuTF9kb25lDQorLkxfZW5kX2lzX3NtYWxsZXI6DQorICAgICAgICBzdWJsICAgIGVuZF9yLCBvdXRfciAgICAgICAgICAgLyogb3V0IC09IGVuZCAqLw0KKyAgICAgICAgbmVnbCAgICBvdXRfciAgICAgICAgICAgICAgICAgIC8qIG91dCA9IC1vdXQgKi8NCisgICAgICAgIGFkZGwgICAgJDI1Nywgb3V0X3IgICAgICAgICAgICAvKiBvdXQgKz0gMjU3ICovDQorICAgICAgICBtb3ZsICAgIG91dF9yLCBhdmFpbF9vdXRfc3RybShzdHJtX3IpDQorDQorI3VuZGVmIGVuZF9yDQorDQorLkxfZG9uZToNCisjaWYgZGVmaW5lZCggVVNFX01NWCApDQorICAgICAgICBlbW1zDQorI2VuZGlmDQorICAgICAgICBhZGRsICAgICRsb2NhbF92YXJfc2l6ZSwgJWVzcA0KKyAgICAgICAgcG9wZg0KKyAgICAgICAgcG9wbCAgICAlZWJ4DQorICAgICAgICBwb3BsICAgICVlYnANCisgICAgICAgIHBvcGwgICAgJWVzaQ0KKyAgICAgICAgcG9wbCAgICAlZWRpDQorICAgICAgICByZXQNCisNCisudHlwZSBpbmZsYXRlX2Zhc3QsQGZ1bmN0aW9uDQorLnNpemUgaW5mbGF0ZV9mYXN0LC4taW5mbGF0ZV9mYXN0DQpkaWZmIC0tZ2l0IGEvY29udHJpYi9wdWZmL01ha2VmaWxlIGIvY29udHJpYi9wdWZmL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjY5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3B1ZmYvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACitwdWZmOiBwdWZmLmMgcHVmZi5oCisJY2MgLURURVNUIC1vIHB1ZmYgcHVmZi5jCisKK3Rlc3Q6IHB1ZmYKKwlwdWZmIHplcm9zLnJhdworCitjbGVhbjoKKwlybSAtZiBwdWZmIHB1ZmYubwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wdWZmL1JFQURNRSBiL2NvbnRyaWIvcHVmZi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliMzUzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcHVmZi9SRUFETUUKQEAgLTAsMCArMSw2MyBAQAorUHVmZiAtLSBBIFNpbXBsZSBJbmZsYXRlCiszIE1hciAyMDAzCitNYXJrIEFkbGVyCittYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKK1doYXQgdGhpcyBpcyAtLQorCitwdWZmLmMgcHJvdmlkZXMgdGhlIHJvdXRpbmUgcHVmZigpIHRvIGRlY29tcHJlc3MgdGhlIGRlZmxhdGUgZGF0YSBmb3JtYXQuICBJdAorZG9lcyBzbyBtb3JlIHNsb3dseSB0aGFuIHpsaWIsIGJ1dCB0aGUgY29kZSBpcyBhYm91dCBvbmUtZmlmdGggdGhlIHNpemUgb2YgdGhlCitpbmZsYXRlIGNvZGUgaW4gemxpYiwgYW5kIHdyaXR0ZW4gdG8gYmUgdmVyeSBlYXN5IHRvIHJlYWQuCisKK1doeSBJIHdyb3RlIHRoaXMgLS0KKworcHVmZi5jIHdhcyB3cml0dGVuIHRvIGRvY3VtZW50IHRoZSBkZWZsYXRlIGZvcm1hdCB1bmFtYmlndW91c2x5LCBieSB2aXJ0dWUgb2YKK2JlaW5nIHdvcmtpbmcgQyBjb2RlLiAgSXQgaXMgbWVhbnQgdG8gc3VwcGxlbWVudCBSRkMgMTk1MSwgd2hpY2ggZm9ybWFsbHkKK2Rlc2NyaWJlcyB0aGUgZGVmbGF0ZSBmb3JtYXQuICBJIGhhdmUgcmVjZWl2ZWQgbWFueSBxdWVzdGlvbnMgb24gZGV0YWlscyBvZiB0aGUKK2RlZmxhdGUgZm9ybWF0LCBhbmQgSSBob3BlIHRoYXQgcmVhZGluZyB0aGlzIGNvZGUgd2lsbCBhbnN3ZXIgdGhvc2UgcXVlc3Rpb25zLiAKK3B1ZmYuYyBpcyBoZWF2aWx5IGNvbW1lbnRlZCB3aXRoIGRldGFpbHMgb2YgdGhlIGRlZmxhdGUgZm9ybWF0LCBlc3BlY2lhbGx5Cit0aG9zZSBsaXR0bGUgbm9va3MgYW5kIGNyYW5pZXMgb2YgdGhlIGZvcm1hdCB0aGF0IG1pZ2h0IG5vdCBiZSBvYnZpb3VzIGZyb20gYQorc3BlY2lmaWNhdGlvbi4KKworcHVmZi5jIG1heSBhbHNvIGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgd2hlcmUgY29kZSBzaXplIG9yIG1lbW9yeSB1c2FnZSBpcyBhCit2ZXJ5IGxpbWl0ZWQgcmVzb3VyY2UsIGFuZCBzcGVlZCBpcyBub3QgYXMgaW1wb3J0YW50LgorCitIb3cgdG8gdXNlIGl0IC0tCisKK1dlbGwsIG1vc3QgbGlrZWx5IHlvdSBzaG91bGQganVzdCBiZSByZWFkaW5nIHB1ZmYuYyBhbmQgdXNpbmcgemxpYiBmb3IgYWN0dWFsCithcHBsaWNhdGlvbnMsIGJ1dCBpZiB5b3UgbXVzdCAuLi4KKworSW5jbHVkZSBwdWZmLmggaW4geW91ciBjb2RlLCB3aGljaCBwcm92aWRlcyB0aGlzIHByb3RvdHlwZToKKworaW50IHB1ZmYodW5zaWduZWQgY2hhciAqZGVzdCwJCS8qIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcG9pbnRlciAqLworICAgICAgICAgdW5zaWduZWQgbG9uZyAqZGVzdGxlbiwJLyogYW1vdW50IG9mIG91dHB1dCBzcGFjZSAqLworICAgICAgICAgdW5zaWduZWQgY2hhciAqc291cmNlLAkJLyogcG9pbnRlciB0byBzb3VyY2UgZGF0YSBwb2ludGVyICovCisgICAgICAgICB1bnNpZ25lZCBsb25nICpzb3VyY2VsZW4pOwkvKiBhbW91bnQgb2YgaW5wdXQgYXZhaWxhYmxlICovCisKK1RoZW4geW91IGNhbiBjYWxsIHB1ZmYoKSB0byBkZWNvbXByZXNzIGEgZGVmbGF0ZSBzdHJlYW0gdGhhdCBpcyBpbiBtZW1vcnkgaW4KK2l0cyBlbnRpcmV0eSBhdCBzb3VyY2UsIHRvIGEgc3VmZmljaWVudGx5IHNpemVkIGJsb2NrIG9mIG1lbW9yeSBmb3IgdGhlCitkZWNvbXByZXNzZWQgZGF0YSBhdCBkZXN0LiAgcHVmZigpIGlzIHRoZSBvbmx5IGV4dGVybmFsIHN5bWJvbCBpbiBwdWZmLmMgIFRoZQorb25seSBDIGxpYnJhcnkgZnVuY3Rpb25zIHRoYXQgcHVmZi5jIG5lZWRzIGFyZSBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpLCB3aGljaAorYXJlIHVzZWQgdG8gc2ltcGxpZnkgZXJyb3IgY2hlY2tpbmcgaW4gdGhlIGNvZGUgdG8gaW1wcm92ZSByZWFkYWJpbHR5LiAgcHVmZi5jCitkb2VzIG5vIG1lbW9yeSBhbGxvY2F0aW9uLCBhbmQgdXNlcyBsZXNzIHRoYW4gMksgYnl0ZXMgb2ZmIG9mIHRoZSBzdGFjay4KKworSWYgZGVzdGxlbiBpcyBub3QgZW5vdWdoIHNwYWNlIGZvciB0aGUgdW5jb21wcmVzc2VkIGRhdGEsIHRoZW4gaW5mbGF0ZSB3aWxsCityZXR1cm4gYW4gZXJyb3Igd2l0aG91dCB3cml0aW5nIG1vcmUgdGhhbiBkZXN0bGVuIGJ5dGVzLiAgTm90ZSB0aGF0IHRoaXMgbWVhbnMKK3RoYXQgaW4gb3JkZXIgdG8gZGVjb21wcmVzcyB0aGUgZGVmbGF0ZSBkYXRhIHN1Y2Nlc3NmdWxseSwgeW91IG5lZWQgdG8ga25vdwordGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFoZWFkIG9mIHRpbWUuCisKK0lmIG5lZWRlZCwgcHVmZigpIGNhbiBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIHdpdGggbm8KK291dHB1dCBzcGFjZS4gIFRoaXMgaXMgZG9uZSBieSBwYXNzaW5nIGRlc3QgZXF1YWwgdG8gKHVuc2lnbmVkIGNoYXIgKikwLiAgVGhlbgordGhlIGluaXRpYWwgdmFsdWUgb2YgKmRlc3RsZW4gaXMgaWdub3JlZCBhbmQgKmRlc3RsZW4gaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YKK3RoZSB1bmNvbXByZXNzZWQgZGF0YS4gIFNvIGlmIHRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpcyBub3Qga25vd24sCit0aGVuIHR3byBwYXNzZXMgb2YgcHVmZigpIGNhbiBiZSB1c2VkLS1maXJzdCB0byBkZXRlcm1pbmUgdGhlIHNpemUsIGFuZCBzZWNvbmQKK3RvIGRvIHRoZSBhY3R1YWwgaW5mbGF0aW9uIGFmdGVyIGFsbG9jYXRpbmcgdGhlIGFwcHJvcHJpYXRlIG1lbW9yeS4gIE5vdAorcHJldHR5LCBidXQgaXQgd29ya3MuICAoVGhpcyBpcyBvbmUgb2YgdGhlIHJlYXNvbnMgeW91IHNob3VsZCBiZSB1c2luZyB6bGliLikKKworVGhlIGRlZmxhdGUgZm9ybWF0IGlzIHNlbGYtdGVybWluYXRpbmcuICBJZiB0aGUgZGVmbGF0ZSBzdHJlYW0gZG9lcyBub3QgZW5kCitpbiAqc291cmNlbGVuIGJ5dGVzLCBwdWZmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3Igd2l0aG91dCByZWFkaW5nIGF0IG9yIHBhc3QKK2VuZHNvdXJjZS4KKworT24gcmV0dXJuLCAqc291cmNlbGVuIGlzIHVwZGF0ZWQgdG8gdGhlIGFtb3VudCBvZiBpbnB1dCBkYXRhIGNvbnN1bWVkLCBhbmQKKypkZXN0bGVuIGlzIHVwZGF0ZWQgdG8gdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLiAgU2VlIHRoZSBjb21tZW50cworaW4gcHVmZi5jIGZvciB0aGUgcG9zc2libGUgcmV0dXJuIGNvZGVzIGZvciBwdWZmKCkuCmRpZmYgLS1naXQgYS9jb250cmliL3B1ZmYvcHVmZi5jIGIvY29udHJpYi9wdWZmL3B1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjAzOWRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wdWZmL3B1ZmYuYwpAQCAtMCwwICsxLDgzMyBAQAorLyoKKyAqIHB1ZmYuYworICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwdWZmLmgKKyAqIHZlcnNpb24gMS43LCAzIE1hciAyMDAzCisgKgorICogcHVmZi5jIGlzIGEgc2ltcGxlIGluZmxhdGUgd3JpdHRlbiB0byBiZSBhbiB1bmFtYmlndW91cyB3YXkgdG8gc3BlY2lmeSB0aGUKKyAqIGRlZmxhdGUgZm9ybWF0LiAgSXQgaXMgbm90IHdyaXR0ZW4gZm9yIHNwZWVkIGJ1dCByYXRoZXIgc2ltcGxpY2l0eS4gIEFzIGEKKyAqIHNpZGUgYmVuZWZpdCwgdGhpcyBjb2RlIG1pZ2h0IGFjdHVhbGx5IGJlIHVzZWZ1bCB3aGVuIHNtYWxsIGNvZGUgaXMgbW9yZQorICogaW1wb3J0YW50IHRoYW4gc3BlZWQsIHN1Y2ggYXMgYm9vdHN0cmFwIGFwcGxpY2F0aW9ucy4gIEZvciB0eXBpY2FsIGRlZmxhdGUKKyAqIGRhdGEsIHpsaWIncyBpbmZsYXRlKCkgaXMgYWJvdXQgZm91ciB0aW1lcyBhcyBmYXN0IGFzIHB1ZmYoKS4gIHpsaWIncworICogaW5mbGF0ZSBjb21waWxlcyB0byBhcm91bmQgMjBLIG9uIG15IG1hY2hpbmUsIHdoZXJlYXMgcHVmZi5jIGNvbXBpbGVzIHRvCisgKiBhcm91bmQgNEsgb24gbXkgbWFjaGluZSAoYSBQb3dlclBDIHVzaW5nIEdOVSBjYykuICBJZiB0aGUgZmFzdGVyIGRlY29kZSgpCisgKiBmdW5jdGlvbiBoZXJlIGlzIHVzZWQsIHRoZW4gcHVmZigpIGlzIG9ubHkgdHdpY2UgYXMgc2xvdyBhcyB6bGliJ3MKKyAqIGluZmxhdGUoKS4KKyAqCisgKiBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSBjb21lcyBmcm9tIHRoZSBzdGFjay4gIFRoZSBzdGFjayByZXF1aXJlZAorICogaXMgbGVzcyB0aGFuIDJLIGJ5dGVzLiAgVGhpcyBjb2RlIGlzIGNvbXBhdGlibGUgd2l0aCAxNi1iaXQgaW50J3MgYW5kCisgKiBhc3N1bWVzIHRoYXQgbG9uZydzIGFyZSBhdCBsZWFzdCAzMiBiaXRzLiAgcHVmZi5jIHVzZXMgdGhlIHNob3J0IGRhdGEgdHlwZSwKKyAqIGFzc3VtZWQgdG8gYmUgMTYgYml0cywgZm9yIGFycmF5cyBpbiBvcmRlciB0byB0byBjb25zZXJ2ZSBtZW1vcnkuICBUaGUgY29kZQorICogd29ya3Mgd2hldGhlciBpbnRlZ2VycyBhcmUgc3RvcmVkIGJpZyBlbmRpYW4gb3IgbGl0dGxlIGVuZGlhbi4KKyAqCisgKiBJbiB0aGUgY29tbWVudHMgYmVsb3cgYXJlICJGb3JtYXQgbm90ZXMiIHRoYXQgZGVzY3JpYmUgdGhlIGluZmxhdGUgcHJvY2VzcworICogYW5kIGRvY3VtZW50IHNvbWUgb2YgdGhlIGxlc3Mgb2J2aW91cyBhc3BlY3RzIG9mIHRoZSBmb3JtYXQuICBUaGlzIHNvdXJjZQorICogY29kZSBpcyBtZWFudCB0byBzdXBwbGVtZW50IFJGQyAxOTUxLCB3aGljaCBmb3JtYWxseSBkZXNjcmliZXMgdGhlIGRlZmxhdGUKKyAqIGZvcm1hdDoKKyAqCisgKiAgICBodHRwOi8vd3d3LnpsaWIub3JnL3JmYy1kZWZsYXRlLmh0bWwKKyAqLworCisvKgorICogQ2hhbmdlIGhpc3Rvcnk6CisgKgorICogMS4wICAxMCBGZWIgMjAwMiAgICAgLSBGaXJzdCB2ZXJzaW9uCisgKiAxLjEgIDE3IEZlYiAyMDAyICAgICAtIENsYXJpZmljYXRpb25zIG9mIHNvbWUgY29tbWVudHMgYW5kIG5vdGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFVwZGF0ZSBwdWZmKCkgZGVzdCBhbmQgc291cmNlIHBvaW50ZXJzIG9uIG5lZ2F0aXZlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyB0byBmYWNpbGl0YXRlIGRlYnVnZ2luZyBkZWZsYXRvcnMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gUmVtb3ZlIGxvbmdlc3QgZnJvbSBzdHJ1Y3QgaHVmZm1hbiAtLSBub3QgbmVlZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFNpbXBsaWZ5IG9mZnNbXSBpbmRleCBpbiBjb25zdHJ1Y3QoKQorICogICAgICAgICAgICAgICAgICAgICAgLSBBZGQgaW5wdXQgc2l6ZSBhbmQgY2hlY2tpbmcsIHVzaW5nIGxvbmdqbXAoKSB0bworICogICAgICAgICAgICAgICAgICAgICAgICBtYWludGFpbiBlYXN5IHJlYWRhYmlsaXR5CisgKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBzaG9ydCBkYXRhIHR5cGUgZm9yIGxhcmdlIGFycmF5cworICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgcG9pbnRlcnMgaW5zdGVhZCBvZiBsb25nIHRvIHNwZWNpZnkgc291cmNlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzaXplcyB0byBhdm9pZCBhcmJpdHJhcnkgNCBHQiBsaW1pdHMKKyAqIDEuMiAgMTcgTWFyIDIwMDIgICAgIC0gQWRkIGZhc3RlciB2ZXJzaW9uIG9mIGRlY29kZSgpLCBkb3VibGVzIHNwZWVkICghKSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGxlYXZlIHNpbXBsZSB2ZXJzaW9uIGZvciByZWFkYWJpbHR5CisgKiAgICAgICAgICAgICAgICAgICAgICAtIE1ha2Ugc3VyZSBpbnZhbGlkIGRpc3RhbmNlcyBkZXRlY3RlZCBpZiBwb2ludGVycworICogICAgICAgICAgICAgICAgICAgICAgICBhcmUgMTYgYml0cworICogICAgICAgICAgICAgICAgICAgICAgLSBGaXggZml4ZWQgY29kZXMgdGFibGUgZXJyb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBhIHNjYW5uaW5nIG1vZGUgZm9yIGRldGVybWluaW5nIHNpemUgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGRhdGEKKyAqIDEuMyAgMjAgTWFyIDIwMDIgICAgIC0gR28gYmFjayB0byBsZW5ndGhzIGZvciBwdWZmKCkgcGFyYW1ldGVycyBbSmVhbi1sb3VwXQorICogICAgICAgICAgICAgICAgICAgICAgLSBBZGQgYSBwdWZmLmggZmlsZSBmb3IgdGhlIGludGVyZmFjZQorICogICAgICAgICAgICAgICAgICAgICAgLSBBZGQgYnJhY2VzIGluIHB1ZmYoKSBmb3IgZWxzZSBkbyBbSmVhbi1sb3VwXQorICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgaW5kZXhlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzIGZvciByZWFkYWJpbGl0eQorICogMS40ICAzMSBNYXIgMjAwMiAgICAgLSBTaW1wbGlmeSBjb25zdHJ1Y3QoKSBjb2RlIHNldCBjaGVjaworICogICAgICAgICAgICAgICAgICAgICAgLSBGaXggc29tZSBjb21tZW50cworICogICAgICAgICAgICAgICAgICAgICAgLSBBZGQgRklYTENPREVTICNkZWZpbmUKKyAqIDEuNSAgIDYgQXByIDIwMDIgICAgIC0gTWlub3IgY29tbWVudCBmaXhlcworICogMS42ICAgNyBBdWcgMjAwMiAgICAgLSBNaW5vciBmb3JtYXQgY2hhbmdlcworICogMS43ICAgMyBNYXIgMjAwMiAgICAgLSBBZGRlZCB0ZXN0IGNvZGUgZm9yIGRpc3RyaWJ1dGlvbgorICogICAgICAgICAgICAgICAgICAgICAgLSBBZGRlZCB6bGliLWxpa2UgbGljZW5zZQorICovCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgICAgICAgLyogZm9yIHNldGptcCgpLCBsb25nam1wKCksIGFuZCBqbXBfYnVmICovCisjaW5jbHVkZSAicHVmZi5oIiAgICAgICAgICAgICAgIC8qIHByb3RvdHlwZSBmb3IgcHVmZigpICovCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljICAgICAgICAgICAgLyogZm9yIGxvY2FsIGZ1bmN0aW9uIGRlZmluaXRpb25zICovCisjZGVmaW5lIE5JTCAoKHVuc2lnbmVkIGNoYXIgKikwKSAgICAgICAgLyogZm9yIG5vIG91dHB1dCBvcHRpb24gKi8KKworLyoKKyAqIE1heGltdW1zIGZvciBhbGxvY2F0aW9ucyBhbmQgbG9vcHMuICBJdCBpcyBub3QgdXNlZnVsIHRvIGNoYW5nZSB0aGVzZSAtLQorICogdGhleSBhcmUgZml4ZWQgYnkgdGhlIGRlZmxhdGUgZm9ybWF0LgorICovCisjZGVmaW5lIE1BWEJJVFMgMTUgICAgICAgICAgICAgIC8qIG1heGltdW0gYml0cyBpbiBhIGNvZGUgKi8KKyNkZWZpbmUgTUFYTENPREVTIDI4NiAgICAgICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KKyNkZWZpbmUgTUFYRENPREVTIDMwICAgICAgICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyNkZWZpbmUgTUFYQ09ERVMgKE1BWExDT0RFUytNQVhEQ09ERVMpICAvKiBtYXhpbXVtIGNvZGVzIGxlbmd0aHMgdG8gcmVhZCAqLworI2RlZmluZSBGSVhMQ09ERVMgMjg4ICAgICAgICAgICAvKiBudW1iZXIgb2YgZml4ZWQgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KKworLyogaW5wdXQgYW5kIG91dHB1dCBzdGF0ZSAqLworc3RydWN0IHN0YXRlIHsKKyAgICAvKiBvdXRwdXQgc3RhdGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpvdXQ7ICAgICAgICAgLyogb3V0cHV0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGxvbmcgb3V0bGVuOyAgICAgICAvKiBhdmFpbGFibGUgc3BhY2UgYXQgb3V0ICovCisgICAgdW5zaWduZWQgbG9uZyBvdXRjbnQ7ICAgICAgIC8qIGJ5dGVzIHdyaXR0ZW4gdG8gb3V0IHNvIGZhciAqLworCisgICAgLyogaW5wdXQgc3RhdGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICppbjsgICAgICAgICAgLyogaW5wdXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgbG9uZyBpbmxlbjsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhdCBpbiAqLworICAgIHVuc2lnbmVkIGxvbmcgaW5jbnQ7ICAgICAgICAvKiBieXRlcyByZWFkIHNvIGZhciAqLworICAgIGludCBiaXRidWY7ICAgICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgICAgaW50IGJpdGNudDsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworICAgIC8qIGlucHV0IGxpbWl0IGVycm9yIHJldHVybiBzdGF0ZSBmb3IgYml0cygpIGFuZCBkZWNvZGUoKSAqLworICAgIGptcF9idWYgZW52OworfTsKKworLyoKKyAqIFJldHVybiBuZWVkIGJpdHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgVGhpcyBhbHdheXMgbGVhdmVzIGxlc3MgdGhhbgorICogZWlnaHQgYml0cyBpbiB0aGUgYnVmZmVyLiAgYml0cygpIHdvcmtzIHByb3Blcmx5IGZvciBuZWVkID09IDAuCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gQml0cyBhcmUgc3RvcmVkIGluIGJ5dGVzIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgbW9zdAorICogICBzaWduaWZpY2FudCBiaXQuICBUaGVyZWZvcmUgYml0cyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIGJpdAorICogICBidWZmZXIsIHVzaW5nIHNoaWZ0IHJpZ2h0LCBhbmQgbmV3IGJ5dGVzIGFyZSBhcHBlbmRlZCB0byB0aGUgdG9wIG9mIHRoZQorICogICBiaXQgYnVmZmVyLCB1c2luZyBzaGlmdCBsZWZ0LgorICovCitsb2NhbCBpbnQgYml0cyhzdHJ1Y3Qgc3RhdGUgKnMsIGludCBuZWVkKQoreworICAgIGxvbmcgdmFsOyAgICAgICAgICAgLyogYml0IGFjY3VtdWxhdG9yIChjYW4gdXNlIHVwIHRvIDIwIGJpdHMpICovCisKKyAgICAvKiBsb2FkIGF0IGxlYXN0IG5lZWQgYml0cyBpbnRvIHZhbCAqLworICAgIHZhbCA9IHMtPmJpdGJ1ZjsKKyAgICB3aGlsZSAocy0+Yml0Y250IDwgbmVlZCkgeworICAgICAgICBpZiAocy0+aW5jbnQgPT0gcy0+aW5sZW4pIGxvbmdqbXAocy0+ZW52LCAxKTsgICAvKiBvdXQgb2YgaW5wdXQgKi8KKyAgICAgICAgdmFsIHw9IChsb25nKShzLT5pbltzLT5pbmNudCsrXSkgPDwgcy0+Yml0Y250OyAgLyogbG9hZCBlaWdodCBiaXRzICovCisgICAgICAgIHMtPmJpdGNudCArPSA4OworICAgIH0KKworICAgIC8qIGRyb3AgbmVlZCBiaXRzIGFuZCB1cGRhdGUgYnVmZmVyLCBhbHdheXMgemVybyB0byBzZXZlbiBiaXRzIGxlZnQgKi8KKyAgICBzLT5iaXRidWYgPSAoaW50KSh2YWwgPj4gbmVlZCk7CisgICAgcy0+Yml0Y250IC09IG5lZWQ7CisKKyAgICAvKiByZXR1cm4gbmVlZCBiaXRzLCB6ZXJvaW5nIHRoZSBiaXRzIGFib3ZlIHRoYXQgKi8KKyAgICByZXR1cm4gKGludCkodmFsICYgKCgxTCA8PCBuZWVkKSAtIDEpKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYSBzdG9yZWQgYmxvY2suCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gQWZ0ZXIgdGhlIHR3by1iaXQgc3RvcmVkIGJsb2NrIHR5cGUgKDAwKSwgdGhlIHN0b3JlZCBibG9jayBsZW5ndGggYW5kCisgKiAgIHN0b3JlZCBieXRlcyBhcmUgYnl0ZS1hbGlnbmVkIGZvciBmYXN0IGNvcHlpbmcuICBUaGVyZWZvcmUgYW55IGxlZnRvdmVyCisgKiAgIGJpdHMgaW4gdGhlIGJ5dGUgdGhhdCBoYXMgdGhlIGxhc3QgYml0IG9mIHRoZSB0eXBlLCBhcyBtYW55IGFzIHNldmVuLCBhcmUKKyAqICAgZGlzY2FyZGVkLiAgVGhlIHZhbHVlIG9mIHRoZSBkaXNjYXJkZWQgYml0cyBhcmUgbm90IGRlZmluZWQgYW5kIHNob3VsZCBub3QKKyAqICAgYmUgY2hlY2tlZCBhZ2FpbnN0IGFueSBleHBlY3RhdGlvbi4KKyAqCisgKiAtIFRoZSBzZWNvbmQgaW52ZXJ0ZWQgY29weSBvZiB0aGUgc3RvcmVkIGJsb2NrIGxlbmd0aCBkb2VzIG5vdCBoYXZlIHRvIGJlCisgKiAgIGNoZWNrZWQsIGJ1dCBpdCdzIHByb2JhYmx5IGEgZ29vZCBpZGVhIHRvIGRvIHNvIGFueXdheS4KKyAqCisgKiAtIEEgc3RvcmVkIGJsb2NrIGNhbiBoYXZlIHplcm8gbGVuZ3RoLiAgVGhpcyBpcyBzb21ldGltZXMgdXNlZCB0byBieXRlLWFsaWduCisgKiAgIHN1YnNldHMgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBmb3IgcmFuZG9tIGFjY2VzcyBvciBwYXJ0aWFsIHJlY292ZXJ5LgorICovCitsb2NhbCBpbnQgc3RvcmVkKHN0cnVjdCBzdGF0ZSAqcykKK3sKKyAgICB1bnNpZ25lZCBsZW47ICAgICAgIC8qIGxlbmd0aCBvZiBzdG9yZWQgYmxvY2sgKi8KKworICAgIC8qIGRpc2NhcmQgbGVmdG92ZXIgYml0cyBmcm9tIGN1cnJlbnQgYnl0ZSAoYXNzdW1lcyBzLT5iaXRjbnQgPCA4KSAqLworICAgIHMtPmJpdGJ1ZiA9IDA7CisgICAgcy0+Yml0Y250ID0gMDsKKworICAgIC8qIGdldCBsZW5ndGggYW5kIGNoZWNrIGFnYWluc3QgaXRzIG9uZSdzIGNvbXBsZW1lbnQgKi8KKyAgICBpZiAocy0+aW5jbnQgKyA0ID4gcy0+aW5sZW4pIHJldHVybiAyOyAgICAgIC8qIG5vdCBlbm91Z2ggaW5wdXQgKi8KKyAgICBsZW4gPSBzLT5pbltzLT5pbmNudCsrXTsKKyAgICBsZW4gfD0gcy0+aW5bcy0+aW5jbnQrK10gPDwgODsKKyAgICBpZiAocy0+aW5bcy0+aW5jbnQrK10gIT0gKH5sZW4gJiAweGZmKSB8fAorICAgICAgICBzLT5pbltzLT5pbmNudCsrXSAhPSAoKH5sZW4gPj4gOCkgJiAweGZmKSkKKyAgICAgICAgcmV0dXJuIC0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpZG4ndCBtYXRjaCBjb21wbGVtZW50ISAqLworCisgICAgLyogY29weSBsZW4gYnl0ZXMgZnJvbSBpbiB0byBvdXQgKi8KKyAgICBpZiAocy0+aW5jbnQgKyBsZW4gPiBzLT5pbmxlbikgcmV0dXJuIDI7ICAgIC8qIG5vdCBlbm91Z2ggaW5wdXQgKi8KKyAgICBpZiAocy0+b3V0ICE9IE5JTCkgeworICAgICAgICBpZiAocy0+b3V0Y250ICsgbGVuID4gcy0+b3V0bGVuKQorICAgICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgKi8KKyAgICAgICAgd2hpbGUgKGxlbi0tKQorICAgICAgICAgICAgcy0+b3V0W3MtPm91dGNudCsrXSA9IHMtPmluW3MtPmluY250KytdOworICAgIH0KKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3Qgc2Nhbm5pbmcgKi8KKyAgICAgICAgcy0+b3V0Y250ICs9IGxlbjsKKyAgICAgICAgcy0+aW5jbnQgKz0gbGVuOworICAgIH0KKworICAgIC8qIGRvbmUgd2l0aCBhIHZhbGlkIHN0b3JlZCBibG9jayAqLworICAgIHJldHVybiAwOworfQorCisvKgorICogSHVmZm1hbiBjb2RlIGRlY29kaW5nIHRhYmxlcy4gIGNvdW50WzEuLk1BWEJJVFNdIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZgorICogZWFjaCBsZW5ndGgsIHdoaWNoIGZvciBhIGNhbm9uaWNhbCBjb2RlIGFyZSBzdGVwcGVkIHRocm91Z2ggaW4gb3JkZXIuCisgKiBzeW1ib2xbXSBhcmUgdGhlIHN5bWJvbCB2YWx1ZXMgaW4gY2Fub25pY2FsIG9yZGVyLCB3aGVyZSB0aGUgbnVtYmVyIG9mCisgKiBlbnRyaWVzIGlzIHRoZSBzdW0gb2YgdGhlIGNvdW50cyBpbiBjb3VudFtdLiAgVGhlIGRlY29kaW5nIHByb2Nlc3MgY2FuIGJlCisgKiBzZWVuIGluIHRoZSBmdW5jdGlvbiBkZWNvZGUoKSBiZWxvdy4KKyAqLworc3RydWN0IGh1ZmZtYW4geworICAgIHNob3J0ICpjb3VudDsgICAgICAgLyogbnVtYmVyIG9mIHN5bWJvbHMgb2YgZWFjaCBsZW5ndGggKi8KKyAgICBzaG9ydCAqc3ltYm9sOyAgICAgIC8qIGNhbm9uaWNhbGx5IG9yZGVyZWQgc3ltYm9scyAqLworfTsKKworLyoKKyAqIERlY29kZSBhIGNvZGUgZnJvbSB0aGUgc3RyZWFtIHMgdXNpbmcgaHVmZm1hbiB0YWJsZSBoLiAgUmV0dXJuIHRoZSBzeW1ib2wgb3IKKyAqIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlcmUgaXMgYW4gZXJyb3IuICBJZiBhbGwgb2YgdGhlIGxlbmd0aHMgYXJlIHplcm8sIGkuZS4KKyAqIGFuIGVtcHR5IGNvZGUsIG9yIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUgYW5kIGFuIGludmFsaWQgY29kZSBpcyByZWNlaXZlZCwKKyAqIHRoZW4gLTkgaXMgcmV0dXJuZWQgYWZ0ZXIgcmVhZGluZyBNQVhCSVRTIGJpdHMuCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gVGhlIGNvZGVzIGFzIHN0b3JlZCBpbiB0aGUgY29tcHJlc3NlZCBkYXRhIGFyZSBiaXQtcmV2ZXJzZWQgcmVsYXRpdmUgdG8KKyAqICAgYSBzaW1wbGUgaW50ZWdlciBvcmRlcmluZyBvZiBjb2RlcyBvZiB0aGUgc2FtZSBsZW5ndGhzLiAgSGVuY2UgYmVsb3cgdGhlCisgKiAgIGJpdHMgYXJlIHB1bGxlZCBmcm9tIHRoZSBjb21wcmVzc2VkIGRhdGEgb25lIGF0IGEgdGltZSBhbmQgdXNlZCB0bworICogICBidWlsZCB0aGUgY29kZSB2YWx1ZSByZXZlcnNlZCBmcm9tIHdoYXQgaXMgaW4gdGhlIHN0cmVhbSBpbiBvcmRlciB0bworICogICBwZXJtaXQgc2ltcGxlIGludGVnZXIgY29tcGFyaXNvbnMgZm9yIGRlY29kaW5nLiAgQSB0YWJsZS1iYXNlZCBkZWNvZGluZworICogICBzY2hlbWUgKGFzIHVzZWQgaW4gemxpYikgZG9lcyBub3QgbmVlZCB0byBkbyB0aGlzIHJldmVyc2FsLgorICoKKyAqIC0gVGhlIGZpcnN0IGNvZGUgZm9yIHRoZSBzaG9ydGVzdCBsZW5ndGggaXMgYWxsIHplcm9zLiAgU3Vic2VxdWVudCBjb2RlcyBvZgorICogICB0aGUgc2FtZSBsZW5ndGggYXJlIHNpbXBseSBpbnRlZ2VyIGluY3JlbWVudHMgb2YgdGhlIHByZXZpb3VzIGNvZGUuICBXaGVuCisgKiAgIG1vdmluZyB1cCBhIGxlbmd0aCwgYSB6ZXJvIGJpdCBpcyBhcHBlbmRlZCB0byB0aGUgY29kZS4gIEZvciBhIGNvbXBsZXRlCisgKiAgIGNvZGUsIHRoZSBsYXN0IGNvZGUgb2YgdGhlIGxvbmdlc3QgbGVuZ3RoIHdpbGwgYmUgYWxsIG9uZXMuCisgKgorICogLSBJbmNvbXBsZXRlIGNvZGVzIGFyZSBoYW5kbGVkIGJ5IHRoaXMgZGVjb2Rlciwgc2luY2UgdGhleSBhcmUgcGVybWl0dGVkCisgKiAgIGluIHRoZSBkZWZsYXRlIGZvcm1hdC4gIFNlZSB0aGUgZm9ybWF0IG5vdGVzIGZvciBmaXhlZCgpIGFuZCBkeW5hbWljKCkuCisgKi8KKyNpZmRlZiBTTE9XCitsb2NhbCBpbnQgZGVjb2RlKHN0cnVjdCBzdGF0ZSAqcywgc3RydWN0IGh1ZmZtYW4gKmgpCit7CisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBjdXJyZW50IG51bWJlciBvZiBiaXRzIGluIGNvZGUgKi8KKyAgICBpbnQgY29kZTsgICAgICAgICAgIC8qIGxlbiBiaXRzIGJlaW5nIGRlY29kZWQgKi8KKyAgICBpbnQgZmlyc3Q7ICAgICAgICAgIC8qIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiAqLworICAgIGludCBjb3VudDsgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGxlbmd0aCBsZW4gKi8KKyAgICBpbnQgaW5kZXg7ICAgICAgICAgIC8qIGluZGV4IG9mIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiBpbiBzeW1ib2wgdGFibGUgKi8KKworICAgIGNvZGUgPSBmaXJzdCA9IGluZGV4ID0gMDsKKyAgICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgeworICAgICAgICBjb2RlIHw9IGJpdHMocywgMSk7ICAgICAgICAgICAgIC8qIGdldCBuZXh0IGJpdCAqLworICAgICAgICBjb3VudCA9IGgtPmNvdW50W2xlbl07CisgICAgICAgIGlmIChjb2RlIDwgZmlyc3QgKyBjb3VudCkgICAgICAgLyogaWYgbGVuZ3RoIGxlbiwgcmV0dXJuIHN5bWJvbCAqLworICAgICAgICAgICAgcmV0dXJuIGgtPnN5bWJvbFtpbmRleCArIChjb2RlIC0gZmlyc3QpXTsKKyAgICAgICAgaW5kZXggKz0gY291bnQ7ICAgICAgICAgICAgICAgICAvKiBlbHNlIHVwZGF0ZSBmb3IgbmV4dCBsZW5ndGggKi8KKyAgICAgICAgZmlyc3QgKz0gY291bnQ7CisgICAgICAgIGZpcnN0IDw8PSAxOworICAgICAgICBjb2RlIDw8PSAxOworICAgIH0KKyAgICByZXR1cm4gLTk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByYW4gb3V0IG9mIGNvZGVzICovCit9CisKKy8qCisgKiBBIGZhc3RlciB2ZXJzaW9uIG9mIGRlY29kZSgpIGZvciByZWFsIGFwcGxpY2F0aW9ucyBvZiB0aGlzIGNvZGUuICAgSXQncyBub3QKKyAqIGFzIHJlYWRhYmxlLCBidXQgaXQgbWFrZXMgcHVmZigpIHR3aWNlIGFzIGZhc3QuICBBbmQgaXQgb25seSBtYWtlcyB0aGUgY29kZQorICogYSBmZXcgcGVyY2VudCBsYXJnZXIuCisgKi8KKyNlbHNlIC8qICFTTE9XICovCitsb2NhbCBpbnQgZGVjb2RlKHN0cnVjdCBzdGF0ZSAqcywgc3RydWN0IGh1ZmZtYW4gKmgpCit7CisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBjdXJyZW50IG51bWJlciBvZiBiaXRzIGluIGNvZGUgKi8KKyAgICBpbnQgY29kZTsgICAgICAgICAgIC8qIGxlbiBiaXRzIGJlaW5nIGRlY29kZWQgKi8KKyAgICBpbnQgZmlyc3Q7ICAgICAgICAgIC8qIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiAqLworICAgIGludCBjb3VudDsgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGxlbmd0aCBsZW4gKi8KKyAgICBpbnQgaW5kZXg7ICAgICAgICAgIC8qIGluZGV4IG9mIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiBpbiBzeW1ib2wgdGFibGUgKi8KKyAgICBpbnQgYml0YnVmOyAgICAgICAgIC8qIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBpbnQgbGVmdDsgICAgICAgICAgIC8qIGJpdHMgbGVmdCBpbiBuZXh0IG9yIGxlZnQgdG8gcHJvY2VzcyAqLworICAgIHNob3J0ICpuZXh0OyAgICAgICAgLyogbmV4dCBudW1iZXIgb2YgY29kZXMgKi8KKworICAgIGJpdGJ1ZiA9IHMtPmJpdGJ1ZjsKKyAgICBsZWZ0ID0gcy0+Yml0Y250OworICAgIGNvZGUgPSBmaXJzdCA9IGluZGV4ID0gMDsKKyAgICBsZW4gPSAxOworICAgIG5leHQgPSBoLT5jb3VudCArIDE7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgd2hpbGUgKGxlZnQtLSkgeworICAgICAgICAgICAgY29kZSB8PSBiaXRidWYgJiAxOworICAgICAgICAgICAgYml0YnVmID4+PSAxOworICAgICAgICAgICAgY291bnQgPSAqbmV4dCsrOworICAgICAgICAgICAgaWYgKGNvZGUgPCBmaXJzdCArIGNvdW50KSB7IC8qIGlmIGxlbmd0aCBsZW4sIHJldHVybiBzeW1ib2wgKi8KKyAgICAgICAgICAgICAgICBzLT5iaXRidWYgPSBiaXRidWY7CisgICAgICAgICAgICAgICAgcy0+Yml0Y250ID0gKHMtPmJpdGNudCAtIGxlbikgJiA3OworICAgICAgICAgICAgICAgIHJldHVybiBoLT5zeW1ib2xbaW5kZXggKyAoY29kZSAtIGZpcnN0KV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCArPSBjb3VudDsgICAgICAgICAgICAgLyogZWxzZSB1cGRhdGUgZm9yIG5leHQgbGVuZ3RoICovCisgICAgICAgICAgICBmaXJzdCArPSBjb3VudDsKKyAgICAgICAgICAgIGZpcnN0IDw8PSAxOworICAgICAgICAgICAgY29kZSA8PD0gMTsKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICB9CisgICAgICAgIGxlZnQgPSAoTUFYQklUUysxKSAtIGxlbjsKKyAgICAgICAgaWYgKGxlZnQgPT0gMCkgYnJlYWs7CisgICAgICAgIGlmIChzLT5pbmNudCA9PSBzLT5pbmxlbikgbG9uZ2ptcChzLT5lbnYsIDEpOyAgIC8qIG91dCBvZiBpbnB1dCAqLworICAgICAgICBiaXRidWYgPSBzLT5pbltzLT5pbmNudCsrXTsKKyAgICAgICAgaWYgKGxlZnQgPiA4KSBsZWZ0ID0gODsKKyAgICB9CisgICAgcmV0dXJuIC05OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmFuIG91dCBvZiBjb2RlcyAqLworfQorI2VuZGlmIC8qIFNMT1cgKi8KKworLyoKKyAqIEdpdmVuIHRoZSBsaXN0IG9mIGNvZGUgbGVuZ3RocyBsZW5ndGhbMC4ubi0xXSByZXByZXNlbnRpbmcgYSBjYW5vbmljYWwKKyAqIEh1ZmZtYW4gY29kZSBmb3IgbiBzeW1ib2xzLCBjb25zdHJ1Y3QgdGhlIHRhYmxlcyByZXF1aXJlZCB0byBkZWNvZGUgdGhvc2UKKyAqIGNvZGVzLiAgVGhvc2UgdGFibGVzIGFyZSB0aGUgbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoLCBhbmQgdGhlIHN5bWJvbHMKKyAqIHNvcnRlZCBieSBsZW5ndGgsIHJldGFpbmluZyB0aGVpciBvcmlnaW5hbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGguICBUaGUKKyAqIHJldHVybiB2YWx1ZSBpcyB6ZXJvIGZvciBhIGNvbXBsZXRlIGNvZGUgc2V0LCBuZWdhdGl2ZSBmb3IgYW4gb3Zlci0KKyAqIHN1YnNjcmliZWQgY29kZSBzZXQsIGFuZCBwb3NpdGl2ZSBmb3IgYW4gaW5jb21wbGV0ZSBjb2RlIHNldC4gIFRoZSB0YWJsZXMKKyAqIGNhbiBiZSB1c2VkIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBvciBwb3NpdGl2ZSwgYnV0IHRoZXkgY2Fubm90IGJlIHVzZWQKKyAqIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8sIGl0IGlzIG5vdAorICogcG9zc2libGUgZm9yIGRlY29kZSgpIHVzaW5nIHRoYXQgdGFibGUgdG8gcmV0dXJuIGFuIGVycm9yLS1hbnkgc3RyZWFtIG9mCisgKiBlbm91Z2ggYml0cyB3aWxsIHJlc29sdmUgdG8gYSBzeW1ib2wuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHBvc2l0aXZlLCB0aGVuCisgKiBpdCBpcyBwb3NzaWJsZSBmb3IgZGVjb2RlKCkgdXNpbmcgdGhhdCB0YWJsZSB0byByZXR1cm4gYW4gZXJyb3IgZm9yIHJlY2VpdmVkCisgKiBjb2RlcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGluY29tcGxldGUgbGVuZ3Rocy4KKyAqCisgKiBOb3QgdXNlZCBieSBkZWNvZGUoKSwgYnV0IHVzZWQgZm9yIGVycm9yIGNoZWNraW5nLCBoLT5jb3VudFswXSBpcyB0aGUgbnVtYmVyCisgKiBvZiB0aGUgbiBzeW1ib2xzIG5vdCBpbiB0aGUgY29kZS4gIFNvIG4gLSBoLT5jb3VudFswXSBpcyB0aGUgbnVtYmVyIG9mCisgKiBjb2Rlcy4gIFRoaXMgaXMgdXNlZnVsIGZvciBjaGVja2luZyBmb3IgaW5jb21wbGV0ZSBjb2RlcyB0aGF0IGhhdmUgbW9yZSB0aGFuCisgKiBvbmUgc3ltYm9sLCB3aGljaCBpcyBhbiBlcnJvciBpbiBhIGR5bmFtaWMgYmxvY2suCisgKgorICogQXNzdW1wdGlvbjogZm9yIGFsbCBpIGluIDAuLm4tMSwgMCA8PSBsZW5ndGhbaV0gPD0gTUFYQklUUworICogVGhpcyBpcyBhc3N1cmVkIGJ5IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIGxlbmd0aCBhcnJheXMgaW4gZHluYW1pYygpIGFuZAorICogZml4ZWQoKSBhbmQgaXMgbm90IHZlcmlmaWVkIGJ5IGNvbnN0cnVjdCgpLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIFBlcm1pdHRlZCBhbmQgZXhwZWN0ZWQgZXhhbXBsZXMgb2YgaW5jb21wbGV0ZSBjb2RlcyBhcmUgb25lIG9mIHRoZSBmaXhlZAorICogICBjb2RlcyBhbmQgYW55IGNvZGUgd2l0aCBhIHNpbmdsZSBzeW1ib2wgd2hpY2ggaW4gZGVmbGF0ZSBpcyBjb2RlZCBhcyBvbmUKKyAqICAgYml0IGluc3RlYWQgb2YgemVybyBiaXRzLiAgU2VlIHRoZSBmb3JtYXQgbm90ZXMgZm9yIGZpeGVkKCkgYW5kIGR5bmFtaWMoKS4KKyAqCisgKiAtIFdpdGhpbiBhIGdpdmVuIGNvZGUgbGVuZ3RoLCB0aGUgc3ltYm9scyBhcmUga2VwdCBpbiBhc2NlbmRpbmcgb3JkZXIgZm9yCisgKiAgIHRoZSBjb2RlIGJpdHMgZGVmaW5pdGlvbi4KKyAqLworbG9jYWwgaW50IGNvbnN0cnVjdChzdHJ1Y3QgaHVmZm1hbiAqaCwgc2hvcnQgKmxlbmd0aCwgaW50IG4pCit7CisgICAgaW50IHN5bWJvbDsgICAgICAgICAvKiBjdXJyZW50IHN5bWJvbCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggbGVuZ3RoW10gKi8KKyAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIGN1cnJlbnQgbGVuZ3RoIHdoZW4gc3RlcHBpbmcgdGhyb3VnaCBoLT5jb3VudFtdICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAvKiBudW1iZXIgb2YgcG9zc2libGUgY29kZXMgbGVmdCBvZiBjdXJyZW50IGxlbmd0aCAqLworICAgIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgICAvKiBvZmZzZXRzIGluIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKworICAgIC8qIGNvdW50IG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLworICAgIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKQorICAgICAgICBoLT5jb3VudFtsZW5dID0gMDsKKyAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IG47IHN5bWJvbCsrKQorICAgICAgICAoaC0+Y291bnRbbGVuZ3RoW3N5bWJvbF1dKSsrOyAgIC8qIGFzc3VtZXMgbGVuZ3RocyBhcmUgd2l0aGluIGJvdW5kcyAqLworICAgIGlmIChoLT5jb3VudFswXSA9PSBuKSAgICAgICAgICAgICAgIC8qIG5vIGNvZGVzISAqLworICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBsZXRlLCBidXQgZGVjb2RlKCkgd2lsbCBmYWlsICovCisKKyAgICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi8KKyAgICBsZWZ0ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbmUgcG9zc2libGUgY29kZSBvZiB6ZXJvIGxlbmd0aCAqLworICAgIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7CisgICAgICAgIGxlZnQgPDw9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogb25lIG1vcmUgYml0LCBkb3VibGUgY29kZXMgbGVmdCAqLworICAgICAgICBsZWZ0IC09IGgtPmNvdW50W2xlbl07ICAgICAgICAgIC8qIGRlZHVjdCBjb3VudCBmcm9tIHBvc3NpYmxlIGNvZGVzICovCisgICAgICAgIGlmIChsZWZ0IDwgMCkgcmV0dXJuIGxlZnQ7ICAgICAgLyogb3Zlci1zdWJzY3JpYmVkLS1yZXR1cm4gbmVnYXRpdmUgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZWZ0ID4gMCBtZWFucyBpbmNvbXBsZXRlICovCisKKyAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLworICAgIG9mZnNbMV0gPSAwOworICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCisgICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBoLT5jb3VudFtsZW5dOworCisgICAgLyoKKyAgICAgKiBwdXQgc3ltYm9scyBpbiB0YWJsZSBzb3J0ZWQgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2gKKyAgICAgKiBsZW5ndGgKKyAgICAgKi8KKyAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IG47IHN5bWJvbCsrKQorICAgICAgICBpZiAobGVuZ3RoW3N5bWJvbF0gIT0gMCkKKyAgICAgICAgICAgIGgtPnN5bWJvbFtvZmZzW2xlbmd0aFtzeW1ib2xdXSsrXSA9IHN5bWJvbDsKKworICAgIC8qIHJldHVybiB6ZXJvIGZvciBjb21wbGV0ZSBzZXQsIHBvc2l0aXZlIGZvciBpbmNvbXBsZXRlIHNldCAqLworICAgIHJldHVybiBsZWZ0OworfQorCisvKgorICogRGVjb2RlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcyB1bnRpbCBhbiBlbmQtb2YtYmxvY2sgY29kZS4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBDb21wcmVzc2VkIGRhdGEgdGhhdCBpcyBhZnRlciB0aGUgYmxvY2sgdHlwZSBpZiBmaXhlZCBvciBhZnRlciB0aGUgY29kZQorICogICBkZXNjcmlwdGlvbiBpZiBkeW5hbWljIGlzIGEgY29tYmluYXRpb24gb2YgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZQorICogICBwYWlycyB0ZXJtaW5hdGVkIGJ5IGFuZCBlbmQtb2YtYmxvY2sgY29kZS4gIExpdGVyYWxzIGFyZSBzaW1wbHkgSHVmZm1hbgorICogICBjb2RlZCBieXRlcy4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgYSBjb2RlZCBsZW5ndGggZm9sbG93ZWQgYnkgYQorICogICBjb2RlZCBkaXN0YW5jZSB0byByZXByZXNlbnQgYSBzdHJpbmcgdGhhdCBvY2N1cnMgZWFybGllciBpbiB0aGUKKyAqICAgdW5jb21wcmVzc2VkIGRhdGEgdGhhdCBvY2N1cnMgYWdhaW4gYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgKgorICogLSBMaXRlcmFscywgbGVuZ3RocywgYW5kIHRoZSBlbmQtb2YtYmxvY2sgY29kZSBhcmUgY29tYmluZWQgaW50byBhIHNpbmdsZQorICogICBjb2RlIG9mIHVwIHRvIDI4NiBzeW1ib2xzLiAgVGhleSBhcmUgMjU2IGxpdGVyYWxzICgwLi4yNTUpLCAyOSBsZW5ndGgKKyAqICAgc3ltYm9scyAoMjU3Li4yODUpLCBhbmQgdGhlIGVuZC1vZi1ibG9jayBzeW1ib2wgKDI1NikuCisgKgorICogLSBUaGVyZSBhcmUgMjU2IHBvc3NpYmxlIGxlbmd0aHMgKDMuLjI1OCksIGFuZCBzbyAyOSBzeW1ib2xzIGFyZSBub3QgZW5vdWdoCisgKiAgIHRvIHJlcHJlc2VudCBhbGwgb2YgdGhvc2UuICBMZW5ndGhzIDMuLjEwIGFuZCAyNTggYXJlIGluIGZhY3QgcmVwcmVzZW50ZWQKKyAqICAgYnkganVzdCBhIGxlbmd0aCBzeW1ib2wuICBMZW5ndGhzIDExLi4yNTcgYXJlIHJlcHJlc2VudGVkIGFzIGEgc3ltYm9sIGFuZAorICogICBzb21lIG51bWJlciBvZiBleHRyYSBiaXRzIHRoYXQgYXJlIGFkZGVkIGFzIGFuIGludGVnZXIgdG8gdGhlIGJhc2UgbGVuZ3RoCisgKiAgIG9mIHRoZSBsZW5ndGggc3ltYm9sLiAgVGhlIG51bWJlciBvZiBleHRyYSBiaXRzIGlzIGRldGVybWluZWQgYnkgdGhlIGJhc2UKKyAqICAgbGVuZ3RoIHN5bWJvbC4gIFRoZXNlIGFyZSBpbiB0aGUgc3RhdGljIGFycmF5cyBiZWxvdywgbGVuc1tdIGZvciB0aGUgYmFzZQorICogICBsZW5ndGhzIGFuZCBsZXh0W10gZm9yIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBleHRyYSBiaXRzLgorICoKKyAqIC0gVGhlIHJlYXNvbiB0aGF0IDI1OCBnZXRzIGl0cyBvd24gc3ltYm9sIGlzIHRoYXQgdGhlIGxvbmdlc3QgbGVuZ3RoIGlzIHVzZWQKKyAqICAgb2Z0ZW4gaW4gaGlnaGx5IHJlZHVuZGFudCBmaWxlcy4gIE5vdGUgdGhhdCAyNTggY2FuIGFsc28gYmUgY29kZWQgYXMgdGhlCisgKiAgIGJhc2UgdmFsdWUgMjI3IHBsdXMgdGhlIG1heGltdW0gZXh0cmEgdmFsdWUgb2YgMzEuICBXaGlsZSBhIGdvb2QgZGVmbGF0ZQorICogICBzaG91bGQgbmV2ZXIgZG8gdGhpcywgaXQgaXMgbm90IGFuIGVycm9yLCBhbmQgc2hvdWxkIGJlIGRlY29kZWQgcHJvcGVybHkuCisgKgorICogLSBJZiBhIGxlbmd0aCBpcyBkZWNvZGVkLCBpbmNsdWRpbmcgaXRzIGV4dHJhIGJpdHMgaWYgYW55LCB0aGVuIGl0IGlzCisgKiAgIGZvbGxvd2VkIGEgZGlzdGFuY2UgY29kZS4gIFRoZXJlIGFyZSB1cCB0byAzMCBkaXN0YW5jZSBzeW1ib2xzLiAgQWdhaW4KKyAqICAgdGhlcmUgYXJlIG1hbnkgbW9yZSBwb3NzaWJsZSBkaXN0YW5jZXMgKDEuLjMyNzY4KSwgc28gZXh0cmEgYml0cyBhcmUgYWRkZWQKKyAqICAgdG8gYSBiYXNlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBzeW1ib2wuICBUaGUgZGlzdGFuY2VzIDEuLjQgZ2V0IHRoZWlyCisgKiAgIG93biBzeW1ib2wsIGJ1dCB0aGUgcmVzdCByZXF1aXJlIGV4dHJhIGJpdHMuICBUaGUgYmFzZSBkaXN0YW5jZXMgYW5kCisgKiAgIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGV4dHJhIGJpdHMgYXJlIGJlbG93IGluIHRoZSBzdGF0aWMgYXJyYXlzIGRpc3RbXQorICogICBhbmQgZGV4dFtdLgorICoKKyAqIC0gTGl0ZXJhbCBieXRlcyBhcmUgc2ltcGx5IHdyaXR0ZW4gdG8gdGhlIG91dHB1dC4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMKKyAqICAgYW4gaW5zdHJ1Y3Rpb24gdG8gY29weSBwcmV2aW91c2x5IHVuY29tcHJlc3NlZCBieXRlcyB0byB0aGUgb3V0cHV0LiAgVGhlCisgKiAgIGNvcHkgaXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrIGluIHRoZSBvdXRwdXQgc3RyZWFtLCBjb3B5aW5nIGZvciBsZW5ndGgKKyAqICAgYnl0ZXMuCisgKgorICogLSBEaXN0YW5jZXMgcG9pbnRpbmcgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGFyZSBub3QKKyAqICAgcGVybWl0dGVkLgorICoKKyAqIC0gT3ZlcmxhcHBlZCBjb3BpZXMsIHdoZXJlIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSwgYXJlCisgKiAgIGFsbG93ZWQgYW5kIGNvbW1vbi4gIEZvciBleGFtcGxlLCBhIGRpc3RhbmNlIG9mIG9uZSBhbmQgYSBsZW5ndGggb2YgMjU4CisgKiAgIHNpbXBseSBjb3BpZXMgdGhlIGxhc3QgYnl0ZSAyNTggdGltZXMuICBBIGRpc3RhbmNlIG9mIGZvdXIgYW5kIGEgbGVuZ3RoIG9mCisgKiAgIHR3ZWx2ZSBjb3BpZXMgdGhlIGxhc3QgZm91ciBieXRlcyB0aHJlZSB0aW1lcy4gIEEgc2ltcGxlIGZvcndhcmQgY29weQorICogICBpZ25vcmluZyB3aGV0aGVyIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSBvciBub3QgaW1wbGVtZW50cworICogICB0aGlzIGNvcnJlY3RseS4gIFlvdSBzaG91bGQgbm90IHVzZSBtZW1jcHkoKSBzaW5jZSBpdHMgYmVoYXZpb3IgaXMgbm90CisgKiAgIGRlZmluZWQgZm9yIG92ZXJsYXBwZWQgYXJyYXlzLiAgWW91IHNob3VsZCBub3QgdXNlIG1lbW1vdmUoKSBvciBiY29weSgpCisgKiAgIHNpbmNlIHRob3VnaCB0aGVpciBiZWhhdmlvciAtaXMtIGRlZmluZWQgZm9yIG92ZXJsYXBwaW5nIGFycmF5cywgaXQgaXMKKyAqICAgZGVmaW5lZCB0byBkbyB0aGUgd3JvbmcgdGhpbmcgaW4gdGhpcyBjYXNlLgorICovCitsb2NhbCBpbnQgY29kZXMoc3RydWN0IHN0YXRlICpzLAorICAgICAgICAgICAgICAgIHN0cnVjdCBodWZmbWFuICpsZW5jb2RlLAorICAgICAgICAgICAgICAgIHN0cnVjdCBodWZmbWFuICpkaXN0Y29kZSkKK3sKKyAgICBpbnQgc3ltYm9sOyAgICAgICAgIC8qIGRlY29kZWQgc3ltYm9sICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBsZW5ndGggZm9yIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIGZvciBjb3B5ICovCisgICAgc3RhdGljIGNvbnN0IHNob3J0IGxlbnNbMjldID0geyAvKiBTaXplIGJhc2UgZm9yIGxlbmd0aCBjb2RlcyAyNTcuLjI4NSAqLworICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OH07CisgICAgc3RhdGljIGNvbnN0IHNob3J0IGxleHRbMjldID0geyAvKiBFeHRyYSBiaXRzIGZvciBsZW5ndGggY29kZXMgMjU3Li4yODUgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAgICAgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgMH07CisgICAgc3RhdGljIGNvbnN0IHNob3J0IGRpc3RzWzMwXSA9IHsgLyogT2Zmc2V0IGJhc2UgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKKyAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAorICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKKyAgICBzdGF0aWMgY29uc3Qgc2hvcnQgZGV4dFszMF0gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCisgICAgICAgIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsCisgICAgICAgIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLAorICAgICAgICAxMiwgMTIsIDEzLCAxM307CisKKyAgICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycyAqLworICAgIGRvIHsKKyAgICAgICAgc3ltYm9sID0gZGVjb2RlKHMsIGxlbmNvZGUpOworICAgICAgICBpZiAoc3ltYm9sIDwgMCkgcmV0dXJuIHN5bWJvbDsgIC8qIGludmFsaWQgc3ltYm9sICovCisgICAgICAgIGlmIChzeW1ib2wgPCAyNTYpIHsgICAgICAgICAgICAgLyogbGl0ZXJhbDogc3ltYm9sIGlzIHRoZSBieXRlICovCisgICAgICAgICAgICAvKiB3cml0ZSBvdXQgdGhlIGxpdGVyYWwgKi8KKyAgICAgICAgICAgIGlmIChzLT5vdXQgIT0gTklMKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPm91dGNudCA9PSBzLT5vdXRsZW4pIHJldHVybiAxOworICAgICAgICAgICAgICAgIHMtPm91dFtzLT5vdXRjbnRdID0gc3ltYm9sOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+b3V0Y250Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3ltYm9sID4gMjU2KSB7ICAgICAgICAvKiBsZW5ndGggKi8KKyAgICAgICAgICAgIC8qIGdldCBhbmQgY29tcHV0ZSBsZW5ndGggKi8KKyAgICAgICAgICAgIHN5bWJvbCAtPSAyNTc7CisgICAgICAgICAgICBpZiAoc3ltYm9sID49IDI5KSByZXR1cm4gLTk7ICAgICAgICAvKiBpbnZhbGlkIGZpeGVkIGNvZGUgKi8KKyAgICAgICAgICAgIGxlbiA9IGxlbnNbc3ltYm9sXSArIGJpdHMocywgbGV4dFtzeW1ib2xdKTsKKworICAgICAgICAgICAgLyogZ2V0IGFuZCBjaGVjayBkaXN0YW5jZSAqLworICAgICAgICAgICAgc3ltYm9sID0gZGVjb2RlKHMsIGRpc3Rjb2RlKTsKKyAgICAgICAgICAgIGlmIChzeW1ib2wgPCAwKSByZXR1cm4gc3ltYm9sOyAgICAgIC8qIGludmFsaWQgc3ltYm9sICovCisgICAgICAgICAgICBkaXN0ID0gZGlzdHNbc3ltYm9sXSArIGJpdHMocywgZGV4dFtzeW1ib2xdKTsKKyAgICAgICAgICAgIGlmIChkaXN0ID4gcy0+b3V0Y250KQorICAgICAgICAgICAgICAgIHJldHVybiAtMTA7ICAgICAvKiBkaXN0YW5jZSB0b28gZmFyIGJhY2sgKi8KKworICAgICAgICAgICAgLyogY29weSBsZW5ndGggYnl0ZXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrICovCisgICAgICAgICAgICBpZiAocy0+b3V0ICE9IE5JTCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5vdXRjbnQgKyBsZW4gPiBzLT5vdXRsZW4pIHJldHVybiAxOworICAgICAgICAgICAgICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAgICAgICAgICAgICBzLT5vdXRbcy0+b3V0Y250XSA9IHMtPm91dFtzLT5vdXRjbnQgLSBkaXN0XTsKKyAgICAgICAgICAgICAgICAgICAgcy0+b3V0Y250Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMtPm91dGNudCArPSBsZW47CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChzeW1ib2wgIT0gMjU2KTsgICAgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgc3ltYm9sICovCisKKyAgICAvKiBkb25lIHdpdGggYSB2YWxpZCBmaXhlZCBvciBkeW5hbWljIGJsb2NrICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgZml4ZWQgY29kZXMgYmxvY2suCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gVGhpcyBibG9jayB0eXBlIGNhbiBiZSB1c2VmdWwgZm9yIGNvbXByZXNzaW5nIHNtYWxsIGFtb3VudHMgb2YgZGF0YSBmb3IKKyAqICAgd2hpY2ggdGhlIHNpemUgb2YgdGhlIGNvZGUgZGVzY3JpcHRpb25zIGluIGEgZHluYW1pYyBibG9jayBleGNlZWRzIHRoZQorICogICBiZW5lZml0IG9mIGN1c3RvbSBjb2RlcyBmb3IgdGhhdCBibG9jay4gIEZvciBmaXhlZCBjb2Rlcywgbm8gYml0cyBhcmUKKyAqICAgc3BlbnQgb24gY29kZSBkZXNjcmlwdGlvbnMuICBJbnN0ZWFkIHRoZSBjb2RlIGxlbmd0aHMgZm9yIGxpdGVyYWwvbGVuZ3RoCisgKiAgIGNvZGVzIGFuZCBkaXN0YW5jZSBjb2RlcyBhcmUgZml4ZWQuICBUaGUgc3BlY2lmaWMgbGVuZ3RocyBmb3IgZWFjaCBzeW1ib2wKKyAqICAgY2FuIGJlIHNlZW4gaW4gdGhlICJmb3IiIGxvb3BzIGJlbG93LgorICoKKyAqIC0gVGhlIGxpdGVyYWwvbGVuZ3RoIGNvZGUgaXMgY29tcGxldGUsIGJ1dCBoYXMgdHdvIHN5bWJvbHMgdGhhdCBhcmUgaW52YWxpZAorICogICBhbmQgc2hvdWxkIHJlc3VsdCBpbiBhbiBlcnJvciBpZiByZWNlaXZlZC4gIFRoaXMgY2Fubm90IGJlIGltcGxlbWVudGVkCisgKiAgIHNpbXBseSBhcyBhbiBpbmNvbXBsZXRlIGNvZGUgc2luY2UgdGhvc2UgdHdvIHN5bWJvbHMgYXJlIGluIHRoZSAibWlkZGxlIgorICogICBvZiB0aGUgY29kZS4gIFRoZXkgYXJlIGVpZ2h0IGJpdHMgbG9uZyBhbmQgdGhlIGxvbmdlc3QgbGl0ZXJhbC9sZW5ndGhcCisgKiAgIGNvZGUgaXMgbmluZSBiaXRzLiAgVGhlcmVmb3JlIHRoZSBjb2RlIG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCB0aG9zZQorICogICBzeW1ib2xzLCBhbmQgdGhlIGludmFsaWQgc3ltYm9scyBtdXN0IGJlIGRldGVjdGVkIGFmdGVyIGRlY29kaW5nLgorICoKKyAqIC0gVGhlIGZpeGVkIGRpc3RhbmNlIGNvZGVzIGFsc28gaGF2ZSB0d28gaW52YWxpZCBzeW1ib2xzIHRoYXQgc2hvdWxkIHJlc3VsdAorICogICBpbiBhbiBlcnJvciBpZiByZWNlaXZlZC4gIFNpbmNlIGFsbCBvZiB0aGUgZGlzdGFuY2UgY29kZXMgYXJlIHRoZSBzYW1lCisgKiAgIGxlbmd0aCwgdGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYW4gaW5jb21wbGV0ZSBjb2RlLiAgVGhlbiB0aGUgaW52YWxpZAorICogICBjb2RlcyBhcmUgZGV0ZWN0ZWQgd2hpbGUgZGVjb2RpbmcuCisgKi8KK2xvY2FsIGludCBmaXhlZChzdHJ1Y3Qgc3RhdGUgKnMpCit7CisgICAgc3RhdGljIGludCB2aXJnaW4gPSAxOworICAgIHN0YXRpYyBzaG9ydCBsZW5jbnRbTUFYQklUUysxXSwgbGVuc3ltW0ZJWExDT0RFU107CisgICAgc3RhdGljIHNob3J0IGRpc3RjbnRbTUFYQklUUysxXSwgZGlzdHN5bVtNQVhEQ09ERVNdOworICAgIHN0YXRpYyBzdHJ1Y3QgaHVmZm1hbiBsZW5jb2RlID0ge2xlbmNudCwgbGVuc3ltfTsKKyAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gZGlzdGNvZGUgPSB7ZGlzdGNudCwgZGlzdHN5bX07CisKKyAgICAvKiBidWlsZCBmaXhlZCBodWZmbWFuIHRhYmxlcyBpZiBmaXJzdCBjYWxsIChtYXkgbm90IGJlIHRocmVhZCBzYWZlKSAqLworICAgIGlmICh2aXJnaW4pIHsKKyAgICAgICAgaW50IHN5bWJvbDsKKyAgICAgICAgc2hvcnQgbGVuZ3Roc1tGSVhMQ09ERVNdOworCisgICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCisgICAgICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgMTQ0OyBzeW1ib2wrKykKKyAgICAgICAgICAgIGxlbmd0aHNbc3ltYm9sXSA9IDg7CisgICAgICAgIGZvciAoOyBzeW1ib2wgPCAyNTY7IHN5bWJvbCsrKQorICAgICAgICAgICAgbGVuZ3Roc1tzeW1ib2xdID0gOTsKKyAgICAgICAgZm9yICg7IHN5bWJvbCA8IDI4MDsgc3ltYm9sKyspCisgICAgICAgICAgICBsZW5ndGhzW3N5bWJvbF0gPSA3OworICAgICAgICBmb3IgKDsgc3ltYm9sIDwgRklYTENPREVTOyBzeW1ib2wrKykKKyAgICAgICAgICAgIGxlbmd0aHNbc3ltYm9sXSA9IDg7CisgICAgICAgIGNvbnN0cnVjdCgmbGVuY29kZSwgbGVuZ3RocywgRklYTENPREVTKTsKKworICAgICAgICAvKiBkaXN0YW5jZSB0YWJsZSAqLworICAgICAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IE1BWERDT0RFUzsgc3ltYm9sKyspCisgICAgICAgICAgICBsZW5ndGhzW3N5bWJvbF0gPSA1OworICAgICAgICBjb25zdHJ1Y3QoJmRpc3Rjb2RlLCBsZW5ndGhzLCBNQVhEQ09ERVMpOworCisgICAgICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovCisgICAgICAgIHZpcmdpbiA9IDA7CisgICAgfQorCisgICAgLyogZGVjb2RlIGRhdGEgdW50aWwgZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgICByZXR1cm4gY29kZXMocywgJmxlbmNvZGUsICZkaXN0Y29kZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgZHluYW1pYyBjb2RlcyBibG9jay4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBBIGR5bmFtaWMgYmxvY2sgc3RhcnRzIHdpdGggYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGl0ZXJhbC9sZW5ndGggYW5kCisgKiAgIGRpc3RhbmNlIGNvZGVzIGZvciB0aGF0IGJsb2NrLiAgTmV3IGR5bmFtaWMgYmxvY2tzIGFsbG93IHRoZSBjb21wcmVzc29yIHRvCisgKiAgIHJhcGlkbHkgYWRhcHQgdG8gY2hhbmdpbmcgZGF0YSB3aXRoIG5ldyBjb2RlcyBvcHRpbWl6ZWQgZm9yIHRoYXQgZGF0YS4KKyAqCisgKiAtIFRoZSBjb2RlcyB1c2VkIGJ5IHRoZSBkZWZsYXRlIGZvcm1hdCBhcmUgImNhbm9uaWNhbCIsIHdoaWNoIG1lYW5zIHRoYXQKKyAqICAgdGhlIGFjdHVhbCBiaXRzIG9mIHRoZSBjb2RlcyBhcmUgZ2VuZXJhdGVkIGluIGFuIHVuYW1iaWd1b3VzIHdheSBzaW1wbHkKKyAqICAgZnJvbSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBjb2RlLiAgVGhlcmVmb3JlIHRoZSBjb2RlIGRlc2NyaXB0aW9ucworICogICBhcmUgc2ltcGx5IGEgbGlzdCBvZiBjb2RlIGxlbmd0aHMgZm9yIGVhY2ggc3ltYm9sLgorICoKKyAqIC0gVGhlIGNvZGUgbGVuZ3RocyBhcmUgc3RvcmVkIGluIG9yZGVyIGZvciB0aGUgc3ltYm9scywgc28gbGVuZ3RocyBhcmUKKyAqICAgcHJvdmlkZWQgZm9yIGVhY2ggb2YgdGhlIGxpdGVyYWwvbGVuZ3RoIHN5bWJvbHMsIGFuZCBmb3IgZWFjaCBvZiB0aGUKKyAqICAgZGlzdGFuY2Ugc3ltYm9scy4KKyAqCisgKiAtIElmIGEgc3ltYm9sIGlzIG5vdCB1c2VkIGluIHRoZSBibG9jaywgdGhpcyBpcyByZXByZXNlbnRlZCBieSBhIHplcm8gYXMKKyAqICAgYXMgdGhlIGNvZGUgbGVuZ3RoLiAgVGhpcyBkb2VzIG5vdCBtZWFuIGEgemVyby1sZW5ndGggY29kZSwgYnV0IHJhdGhlcgorICogICB0aGF0IG5vIGNvZGUgc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHRoaXMgc3ltYm9sLiAgVGhlcmUgaXMgbm8gd2F5IGluIHRoZQorICogICBkZWZsYXRlIGZvcm1hdCB0byByZXByZXNlbnQgYSB6ZXJvLWxlbmd0aCBjb2RlLgorICoKKyAqIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgaW4gYSBjb2RlIGlzIDE1LCBzbyB0aGUgcG9zc2libGUgbGVuZ3RocyBmb3IKKyAqICAgYW55IGNvZGUgYXJlIDEuLjE1LgorICoKKyAqIC0gVGhlIGZhY3QgdGhhdCBhIGxlbmd0aCBvZiB6ZXJvIGlzIG5vdCBwZXJtaXR0ZWQgZm9yIGEgY29kZSBoYXMgYW4KKyAqICAgaW50ZXJlc3RpbmcgY29uc2VxdWVuY2UuICBOb3JtYWxseSBpZiBvbmx5IG9uZSBzeW1ib2wgaXMgdXNlZCBmb3IgYSBnaXZlbgorICogICBjb2RlLCB0aGVuIGluIGZhY3QgdGhhdCBjb2RlIGNvdWxkIGJlIHJlcHJlc2VudGVkIHdpdGggemVybyBiaXRzLiAgSG93ZXZlcgorICogICBpbiBkZWZsYXRlLCB0aGF0IGNvZGUgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSBiaXQuICBTbyBmb3IgZXhhbXBsZSwgaWYKKyAqICAgb25seSBhIHNpbmdsZSBkaXN0YW5jZSBiYXNlIHN5bWJvbCBhcHBlYXJzIGluIGEgYmxvY2ssIHRoZW4gaXQgd2lsbCBiZQorICogICByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBjb2RlIG9mIGxlbmd0aCBvbmUsIGluIHBhcnRpY3VsYXIgb25lIDAgYml0LiAgVGhpcworICogICBpcyBhbiBpbmNvbXBsZXRlIGNvZGUsIHNpbmNlIGlmIGEgMSBiaXQgaXMgcmVjZWl2ZWQsIGl0IGhhcyBubyBtZWFuaW5nLAorICogICBhbmQgc2hvdWxkIHJlc3VsdCBpbiBhbiBlcnJvci4gIFNvIGluY29tcGxldGUgZGlzdGFuY2UgY29kZXMgb2Ygb25lIHN5bWJvbAorICogICBzaG91bGQgYmUgcGVybWl0dGVkLCBhbmQgdGhlIHJlY2VpcHQgb2YgaW52YWxpZCBjb2RlcyBzaG91bGQgYmUgaGFuZGxlZC4KKyAqCisgKiAtIEl0IGlzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIHNpbmdsZSBsaXRlcmFsL2xlbmd0aCBjb2RlLCBidXQgdGhhdCBjb2RlCisgKiAgIG11c3QgYmUgdGhlIGVuZC1vZi1ibG9jayBjb2RlLCBzaW5jZSBldmVyeSBkeW5hbWljIGJsb2NrIGhhcyBvbmUuICBUaGlzCisgKiAgIGlzIG5vdCB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGNyZWF0ZSBhbiBlbXB0eSBibG9jayAoYW4gZW1wdHkgZml4ZWQKKyAqICAgYmxvY2sgaXMgZmV3ZXIgYml0cyksIGJ1dCBpdCBpcyBhbGxvd2VkIGJ5IHRoZSBmb3JtYXQuICBTbyBpbmNvbXBsZXRlCisgKiAgIGxpdGVyYWwvbGVuZ3RoIGNvZGVzIG9mIG9uZSBzeW1ib2wgc2hvdWxkIGFsc28gYmUgcGVybWl0dGVkLgorICoKKyAqIC0gVGhlIGxpc3Qgb2YgdXAgdG8gMjg2IGxlbmd0aC9saXRlcmFsIGxlbmd0aHMgYW5kIHVwIHRvIDMwIGRpc3RhbmNlIGxlbmd0aHMKKyAqICAgYXJlIHRoZW1zZWx2ZXMgY29tcHJlc3NlZCB1c2luZyBIdWZmbWFuIGNvZGVzIGFuZCBydW4tbGVuZ3RoIGVuY29kaW5nLiAgSW4KKyAqICAgdGhlIGxpc3Qgb2YgY29kZSBsZW5ndGhzLCBhIDAgc3ltYm9sIG1lYW5zIG5vIGNvZGUsIGEgMS4uMTUgc3ltYm9sIG1lYW5zCisgKiAgIHRoYXQgbGVuZ3RoLCBhbmQgdGhlIHN5bWJvbHMgMTYsIDE3LCBhbmQgMTggYXJlIHJ1bi1sZW5ndGggaW5zdHJ1Y3Rpb25zLgorICogICBFYWNoIG9mIDE2LCAxNywgYW5kIDE4IGFyZSBmb2xsd2VkIGJ5IGV4dHJhIGJpdHMgdG8gZGVmaW5lIHRoZSBsZW5ndGggb2YKKyAqICAgdGhlIHJ1bi4gIDE2IGNvcGllcyB0aGUgbGFzdCBsZW5ndGggMyB0byA2IHRpbWVzLiAgMTcgcmVwcmVzZW50cyAzIHRvIDEwCisgKiAgIHplcm8gbGVuZ3RocywgYW5kIDE4IHJlcHJlc2VudHMgMTEgdG8gMTM4IHplcm8gbGVuZ3Rocy4gIFVudXNlZCBzeW1ib2xzCisgKiAgIGFyZSBjb21tb24sIGhlbmNlIHRoZSBzcGVjaWFsIGNvZGluZyBmb3IgemVybyBsZW5ndGhzLgorICoKKyAqIC0gVGhlIHN5bWJvbHMgZm9yIDAuLjE4IGFyZSBIdWZmbWFuIGNvZGVkLCBhbmQgc28gdGhhdCBjb2RlIG11c3QgYmUKKyAqICAgZGVzY3JpYmVkIGZpcnN0LiAgVGhpcyBpcyBzaW1wbHkgYSBzZXF1ZW5jZSBvZiB1cCB0byAxOSB0aHJlZS1iaXQgdmFsdWVzCisgKiAgIHJlcHJlc2VudGluZyBubyBjb2RlICgwKSBvciB0aGUgY29kZSBsZW5ndGggZm9yIHRoYXQgc3ltYm9sICgxLi43KS4KKyAqCisgKiAtIEEgZHluYW1pYyBibG9jayBzdGFydHMgd2l0aCB0aHJlZSBmaXhlZC1zaXplIGNvdW50cyBmcm9tIHdoaWNoIGlzIGNvbXB1dGVkCisgKiAgIHRoZSBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZSBsZW5ndGhzLCB0aGUgbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGUKKyAqICAgbGVuZ3RocywgYW5kIHRoZSBudW1iZXIgb2YgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzIChvaywgeW91IGNvbWUgdXAgd2l0aAorICogICBhIGJldHRlciBuYW1lISkgaW4gdGhlIGNvZGUgZGVzY3JpcHRpb25zLiAgRm9yIHRoZSBsaXRlcmFsL2xlbmd0aCBhbmQKKyAqICAgZGlzdGFuY2UgY29kZXMsIGxlbmd0aHMgYWZ0ZXIgdGhvc2UgcHJvdmlkZWQgYXJlIGNvbnNpZGVyZWQgemVybywgaS5lLiBubworICogICBjb2RlLiAgVGhlIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyBhcmUgcmVjZWl2ZWQgaW4gYSBwZXJtdXRlZCBvcmRlciAoc2VlCisgKiAgIHRoZSBvcmRlcltdIGFycmF5IGJlbG93KSB0byBtYWtlIGEgc2hvcnQgY29kZSBsZW5ndGggY29kZSBsZW5ndGggbGlzdCBtb3JlCisgKiAgIGxpa2VseS4gIEFzIGl0IHR1cm5zIG91dCwgdmVyeSBzaG9ydCBhbmQgdmVyeSBsb25nIGNvZGVzIGFyZSBsZXNzIGxpa2VseQorICogICB0byBiZSBzZWVuIGluIGEgZHluYW1pYyBjb2RlIGRlc2NyaXB0aW9uLCBoZW5jZSB3aGF0IG1heSBhcHBlYXIgaW5pdGlhbGx5CisgKiAgIHRvIGJlIGEgcGVjdWxpYXIgb3JkZXJpbmcuCisgKgorICogLSBHaXZlbiB0aGUgbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGUgbGVuZ3RocyAobmxlbikgYW5kIGRpc3RhbmNlIGNvZGUKKyAqICAgbGVuZ3RocyAobmRpc3QpLCB0aGVuIHRoZXkgYXJlIHRyZWF0ZWQgYXMgb25lIGxvbmcgbGlzdCBvZiBubGVuICsgbmRpc3QKKyAqICAgY29kZSBsZW5ndGhzLiAgVGhlcmVmb3JlIHJ1bi1sZW5ndGggY29kaW5nIGNhbiBhbmQgb2Z0ZW4gZG9lcyBjcm9zcyB0aGUKKyAqICAgYm91bmRhcnkgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgbGVuZ3Rocy4KKyAqCisgKiAtIFNvIHRvIHN1bW1hcml6ZSwgdGhlIGNvZGUgZGVzY3JpcHRpb24gYXQgdGhlIHN0YXJ0IG9mIGEgZHluYW1pYyBibG9jayBpcworICogICB0aHJlZSBjb3VudHMgZm9yIHRoZSBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGZvciB0aGUgbGl0ZXJhbC9sZW5ndGggY29kZXMsCisgKiAgIHRoZSBkaXN0YW5jZSBjb2RlcywgYW5kIHRoZSBjb2RlIGxlbmd0aCBjb2Rlcy4gIFRoaXMgaXMgZm9sbG93ZWQgYnkgdGhlCisgKiAgIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocywgdGhyZWUgYml0cyBlYWNoLiAgVGhpcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUKKyAqICAgY29kZSBsZW5ndGggY29kZSB3aGljaCBpcyB1c2VkIHRvIHJlYWQgdGhlIHJlbWFpbmRlciBvZiB0aGUgbGVuZ3Rocy4gIFRoZW4KKyAqICAgdGhlIGxpdGVyYWwvbGVuZ3RoIGNvZGUgbGVuZ3RocyBhbmQgZGlzdGFuY2UgbGVuZ3RocyBhcmUgcmVhZCBhcyBhIHNpbmdsZQorICogICBzZXQgb2YgbGVuZ3RocyB1c2luZyB0aGUgY29kZSBsZW5ndGggY29kZXMuICBDb2RlcyBhcmUgY29uc3RydWN0ZWQgZnJvbQorICogICB0aGUgcmVzdWx0aW5nIHR3byBzZXRzIG9mIGxlbmd0aHMsIGFuZCB0aGVuIGZpbmFsbHkgeW91IGNhbiBzdGFydAorICogICBkZWNvZGluZyBhY3R1YWwgY29tcHJlc3NlZCBkYXRhIGluIHRoZSBibG9jay4KKyAqCisgKiAtIEZvciByZWZlcmVuY2UsIGEgInR5cGljYWwiIHNpemUgZm9yIHRoZSBjb2RlIGRlc2NyaXB0aW9uIGluIGEgZHluYW1pYworICogICBibG9jayBpcyBhcm91bmQgODAgYnl0ZXMuCisgKi8KK2xvY2FsIGludCBkeW5hbWljKHN0cnVjdCBzdGF0ZSAqcykKK3sKKyAgICBpbnQgbmxlbiwgbmRpc3QsIG5jb2RlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RocyBpbiBkZXNjcmlwdG9yICovCisgICAgaW50IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggb2YgbGVuZ3Roc1tdICovCisgICAgaW50IGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RydWN0KCkgcmV0dXJuIHZhbHVlICovCisgICAgc2hvcnQgbGVuZ3Roc1tNQVhDT0RFU107ICAgICAgICAgICAgLyogZGVzY3JpcHRvciBjb2RlIGxlbmd0aHMgKi8KKyAgICBzaG9ydCBsZW5jbnRbTUFYQklUUysxXSwgbGVuc3ltW01BWExDT0RFU107ICAgICAgICAgLyogbGVuY29kZSBtZW1vcnkgKi8KKyAgICBzaG9ydCBkaXN0Y250W01BWEJJVFMrMV0sIGRpc3RzeW1bTUFYRENPREVTXTsgICAgICAgLyogZGlzdGNvZGUgbWVtb3J5ICovCisgICAgc3RydWN0IGh1ZmZtYW4gbGVuY29kZSA9IHtsZW5jbnQsIGxlbnN5bX07ICAgICAgICAgIC8qIGxlbmd0aCBjb2RlICovCisgICAgc3RydWN0IGh1ZmZtYW4gZGlzdGNvZGUgPSB7ZGlzdGNudCwgZGlzdHN5bX07ICAgICAgIC8qIGRpc3RhbmNlIGNvZGUgKi8KKyAgICBzdGF0aWMgY29uc3Qgc2hvcnQgb3JkZXJbMTldID0gICAgICAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aCBjb2RlcyAqLworICAgICAgICB7MTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07CisKKyAgICAvKiBnZXQgbnVtYmVyIG9mIGxlbmd0aHMgaW4gZWFjaCB0YWJsZSwgY2hlY2sgbGVuZ3RocyAqLworICAgIG5sZW4gPSBiaXRzKHMsIDUpICsgMjU3OworICAgIG5kaXN0ID0gYml0cyhzLCA1KSArIDE7CisgICAgbmNvZGUgPSBiaXRzKHMsIDQpICsgNDsKKyAgICBpZiAobmxlbiA+IE1BWExDT0RFUyB8fCBuZGlzdCA+IE1BWERDT0RFUykKKyAgICAgICAgcmV0dXJuIC0zOyAgICAgICAgICAgICAgICAgICAgICAvKiBiYWQgY291bnRzICovCisKKyAgICAvKiByZWFkIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAocmVhbGx5KSwgbWlzc2luZyBsZW5ndGhzIGFyZSB6ZXJvICovCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmNvZGU7IGluZGV4KyspCisgICAgICAgIGxlbmd0aHNbb3JkZXJbaW5kZXhdXSA9IGJpdHMocywgMyk7CisgICAgZm9yICg7IGluZGV4IDwgMTk7IGluZGV4KyspCisgICAgICAgIGxlbmd0aHNbb3JkZXJbaW5kZXhdXSA9IDA7CisKKyAgICAvKiBidWlsZCBodWZmbWFuIHRhYmxlIGZvciBjb2RlIGxlbmd0aHMgY29kZXMgKHVzZSBsZW5jb2RlIHRlbXBvcmFyaWx5KSAqLworICAgIGVyciA9IGNvbnN0cnVjdCgmbGVuY29kZSwgbGVuZ3RocywgMTkpOworICAgIGlmIChlcnIgIT0gMCkgcmV0dXJuIC00OyAgICAgICAgICAgIC8qIHJlcXVpcmUgY29tcGxldGUgY29kZSBzZXQgaGVyZSAqLworCisgICAgLyogcmVhZCBsZW5ndGgvbGl0ZXJhbCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGggdGFibGVzICovCisgICAgaW5kZXggPSAwOworICAgIHdoaWxlIChpbmRleCA8IG5sZW4gKyBuZGlzdCkgeworICAgICAgICBpbnQgc3ltYm9sOyAgICAgICAgICAgICAvKiBkZWNvZGVkIHZhbHVlICovCisgICAgICAgIGludCBsZW47ICAgICAgICAgICAgICAgIC8qIGxhc3QgbGVuZ3RoIHRvIHJlcGVhdCAqLworCisgICAgICAgIHN5bWJvbCA9IGRlY29kZShzLCAmbGVuY29kZSk7CisgICAgICAgIGlmIChzeW1ib2wgPCAxNikgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGluIDAuLjE1ICovCisgICAgICAgICAgICBsZW5ndGhzW2luZGV4KytdID0gc3ltYm9sOworICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlcGVhdCBpbnN0cnVjdGlvbiAqLworICAgICAgICAgICAgbGVuID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtZSByZXBlYXRpbmcgemVyb3MgKi8KKyAgICAgICAgICAgIGlmIChzeW1ib2wgPT0gMTYpIHsgICAgICAgICAvKiByZXBlYXQgbGFzdCBsZW5ndGggMy4uNiB0aW1lcyAqLworICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTU7ICAgICAgLyogbm8gbGFzdCBsZW5ndGghICovCisgICAgICAgICAgICAgICAgbGVuID0gbGVuZ3Roc1tpbmRleCAtIDFdOyAgICAgICAvKiBsYXN0IGxlbmd0aCAqLworICAgICAgICAgICAgICAgIHN5bWJvbCA9IDMgKyBiaXRzKHMsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3ltYm9sID09IDE3KSAgICAgIC8qIHJlcGVhdCB6ZXJvIDMuLjEwIHRpbWVzICovCisgICAgICAgICAgICAgICAgc3ltYm9sID0gMyArIGJpdHMocywgMyk7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLyogPT0gMTgsIHJlcGVhdCB6ZXJvIDExLi4xMzggdGltZXMgKi8KKyAgICAgICAgICAgICAgICBzeW1ib2wgPSAxMSArIGJpdHMocywgNyk7CisgICAgICAgICAgICBpZiAoaW5kZXggKyBzeW1ib2wgPiBubGVuICsgbmRpc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIC02OyAgICAgICAgICAgICAgLyogdG9vIG1hbnkgbGVuZ3RocyEgKi8KKyAgICAgICAgICAgIHdoaWxlIChzeW1ib2wtLSkgICAgICAgICAgICAvKiByZXBlYXQgbGFzdCBvciB6ZXJvIHN5bWJvbCB0aW1lcyAqLworICAgICAgICAgICAgICAgIGxlbmd0aHNbaW5kZXgrK10gPSBsZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBidWlsZCBodWZmbWFuIHRhYmxlIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLworICAgIGVyciA9IGNvbnN0cnVjdCgmbGVuY29kZSwgbGVuZ3Rocywgbmxlbik7CisgICAgaWYgKGVyciA8IDAgfHwgKGVyciA+IDAgJiYgbmxlbiAtIGxlbmNvZGUuY291bnRbMF0gIT0gMSkpCisgICAgICAgIHJldHVybiAtNzsgICAgICAvKiBvbmx5IGFsbG93IGluY29tcGxldGUgY29kZXMgaWYganVzdCBvbmUgY29kZSAqLworCisgICAgLyogYnVpbGQgaHVmZm1hbiB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi8KKyAgICBlcnIgPSBjb25zdHJ1Y3QoJmRpc3Rjb2RlLCBsZW5ndGhzICsgbmxlbiwgbmRpc3QpOworICAgIGlmIChlcnIgPCAwIHx8IChlcnIgPiAwICYmIG5kaXN0IC0gZGlzdGNvZGUuY291bnRbMF0gIT0gMSkpCisgICAgICAgIHJldHVybiAtODsgICAgICAvKiBvbmx5IGFsbG93IGluY29tcGxldGUgY29kZXMgaWYganVzdCBvbmUgY29kZSAqLworCisgICAgLyogZGVjb2RlIGRhdGEgdW50aWwgZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgICByZXR1cm4gY29kZXMocywgJmxlbmNvZGUsICZkaXN0Y29kZSk7Cit9CisKKy8qCisgKiBJbmZsYXRlIHNvdXJjZSB0byBkZXN0LiAgT24gcmV0dXJuLCBkZXN0bGVuIGFuZCBzb3VyY2VsZW4gYXJlIHVwZGF0ZWQgdG8gdGhlCisgKiBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhbmQgdGhlIHNpemUgb2YgdGhlIGRlZmxhdGUgZGF0YSByZXNwZWN0aXZlbHkuCisgKiBPbiBzdWNjZXNzLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHB1ZmYoKSBpcyB6ZXJvLiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlCisgKiBzb3VyY2UgZGF0YSwgaS5lLiBpdCBpcyBub3QgaW4gdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVuIGEgbmVnYXRpdmUgdmFsdWUgaXMKKyAqIHJldHVybmVkLiAgSWYgdGhlcmUgaXMgbm90IGVub3VnaCBpbnB1dCBhdmFpbGFibGUgb3IgdGhlcmUgaXMgbm90IGVub3VnaAorICogb3V0cHV0IHNwYWNlLCB0aGVuIGEgcG9zaXRpdmUgZXJyb3IgaXMgcmV0dXJuZWQuICBJbiB0aGF0IGNhc2UsIGRlc3RsZW4gYW5kCisgKiBzb3VyY2VsZW4gYXJlIG5vdCB1cGRhdGVkIHRvIGZhY2lsaXRhdGUgcmV0cnlpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIHdpdGggdGhlCisgKiBwcm92aXNpb24gb2YgbW9yZSBpbnB1dCBkYXRhIG9yIG1vcmUgb3V0cHV0IHNwYWNlLiAgSW4gdGhlIGNhc2Ugb2YgaW52YWxpZAorICogaW5mbGF0ZSBkYXRhIChhIG5lZ2F0aXZlIGVycm9yKSwgdGhlIGRlc3QgYW5kIHNvdXJjZSBwb2ludGVycyBhcmUgdXBkYXRlZCB0bworICogZmFjaWxpdGF0ZSB0aGUgZGVidWdnaW5nIG9mIGRlZmxhdG9ycy4KKyAqCisgKiBwdWZmKCkgYWxzbyBoYXMgYSBtb2RlIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aXRoCisgKiBubyBvdXRwdXQgd3JpdHRlbi4gIEZvciB0aGlzIGRlc3QgbXVzdCBiZSAodW5zaWduZWQgY2hhciAqKTAuICBJbiB0aGlzIGNhc2UsCisgKiB0aGUgaW5wdXQgdmFsdWUgb2YgKmRlc3RsZW4gaXMgaWdub3JlZCwgYW5kIG9uIHJldHVybiAqZGVzdGxlbiBpcyBzZXQgdG8gdGhlCisgKiBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0LgorICoKKyAqIFRoZSByZXR1cm4gY29kZXMgYXJlOgorICoKKyAqICAgMjogIGF2YWlsYWJsZSBpbmZsYXRlIGRhdGEgZGlkIG5vdCB0ZXJtaW5hdGUKKyAqICAgMTogIG91dHB1dCBzcGFjZSBleGhhdXN0ZWQgYmVmb3JlIGNvbXBsZXRpbmcgaW5mbGF0ZQorICogICAwOiAgc3VjY2Vzc2Z1bCBpbmZsYXRlCisgKiAgLTE6ICBpbnZhbGlkIGJsb2NrIHR5cGUgKHR5cGUgPT0gMykKKyAqICAtMjogIHN0b3JlZCBibG9jayBsZW5ndGggZGlkIG5vdCBtYXRjaCBvbmUncyBjb21wbGVtZW50CisgKiAgLTM6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IHRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBjb2RlcworICogIC00OiAgZHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiBjb2RlIGxlbmd0aHMgY29kZXMgaW5jb21wbGV0ZQorICogIC01OiAgZHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiByZXBlYXQgbGVuZ3RocyB3aXRoIG5vIGZpcnN0IGxlbmd0aAorICogIC02OiAgZHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiByZXBlYXQgbW9yZSB0aGFuIHNwZWNpZmllZCBsZW5ndGhzCisgKiAgLTc6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IGludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSBsZW5ndGhzCisgKiAgLTg6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IGludmFsaWQgZGlzdGFuY2UgY29kZSBsZW5ndGhzCisgKiAgLTk6ICBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIG9yIGRpc3RhbmNlIGNvZGUgaW4gZml4ZWQgb3IgZHluYW1pYyBibG9jaworICogLTEwOiAgZGlzdGFuY2UgaXMgdG9vIGZhciBiYWNrIGluIGZpeGVkIG9yIGR5bmFtaWMgYmxvY2sKKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBUaHJlZSBiaXRzIGFyZSByZWFkIGZvciBlYWNoIGJsb2NrIHRvIGRldGVybWluZSB0aGUga2luZCBvZiBibG9jayBhbmQKKyAqICAgd2hldGhlciBvciBub3QgaXQgaXMgdGhlIGxhc3QgYmxvY2suICBUaGVuIHRoZSBibG9jayBpcyBkZWNvZGVkIGFuZCB0aGUKKyAqICAgcHJvY2VzcyByZXBlYXRlZCBpZiBpdCB3YXMgbm90IHRoZSBsYXN0IGJsb2NrLgorICoKKyAqIC0gVGhlIGxlZnRvdmVyIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgZGVmbGF0ZSBkYXRhIGFmdGVyIHRoZSBsYXN0CisgKiAgIGJsb2NrIChpZiBpdCB3YXMgYSBmaXhlZCBvciBkeW5hbWljIGJsb2NrKSBhcmUgdW5kZWZpbmVkIGFuZCBoYXZlIG5vCisgKiAgIGV4cGVjdGVkIHZhbHVlcyB0byBjaGVjay4KKyAqLworaW50IHB1ZmYodW5zaWduZWQgY2hhciAqZGVzdCwgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcG9pbnRlciAqLworICAgICAgICAgdW5zaWduZWQgbG9uZyAqZGVzdGxlbiwgICAgICAgIC8qIGFtb3VudCBvZiBvdXRwdXQgc3BhY2UgKi8KKyAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgICAgICAgICAvKiBwb2ludGVyIHRvIHNvdXJjZSBkYXRhIHBvaW50ZXIgKi8KKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnNvdXJjZWxlbikgICAgICAvKiBhbW91bnQgb2YgaW5wdXQgYXZhaWxhYmxlICovCit7CisgICAgc3RydWN0IHN0YXRlIHM7ICAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBzdGF0ZSAqLworICAgIGludCBsYXN0LCB0eXBlOyAgICAgICAgICAgICAvKiBibG9jayBpbmZvcm1hdGlvbiAqLworICAgIGludCBlcnI7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWUgKi8KKworICAgIC8qIGluaXRpYWxpemUgb3V0cHV0IHN0YXRlICovCisgICAgcy5vdXQgPSBkZXN0OworICAgIHMub3V0bGVuID0gKmRlc3RsZW47ICAgICAgICAgICAgICAgIC8qIGlnbm9yZWQgaWYgZGVzdCBpcyBOSUwgKi8KKyAgICBzLm91dGNudCA9IDA7CisKKyAgICAvKiBpbml0aWFsaXplIGlucHV0IHN0YXRlICovCisgICAgcy5pbiA9IHNvdXJjZTsKKyAgICBzLmlubGVuID0gKnNvdXJjZWxlbjsKKyAgICBzLmluY250ID0gMDsKKyAgICBzLmJpdGJ1ZiA9IDA7CisgICAgcy5iaXRjbnQgPSAwOworCisgICAgLyogcmV0dXJuIGlmIGJpdHMoKSBvciBkZWNvZGUoKSB0cmllcyB0byByZWFkIHBhc3QgYXZhaWxhYmxlIGlucHV0ICovCisgICAgaWYgKHNldGptcChzLmVudikgIT0gMCkgICAgICAgICAgICAgLyogaWYgY2FtZSBiYWNrIGhlcmUgdmlhIGxvbmdqbXAoKSAqLworICAgICAgICBlcnIgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gc2tpcCBkby1sb29wLCByZXR1cm4gZXJyb3IgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgLyogcHJvY2VzcyBibG9ja3MgdW50aWwgbGFzdCBibG9jayBvciBlcnJvciAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBsYXN0ID0gYml0cygmcywgMSk7ICAgICAgICAgLyogb25lIGlmIGxhc3QgYmxvY2sgKi8KKyAgICAgICAgICAgIHR5cGUgPSBiaXRzKCZzLCAyKTsgICAgICAgICAvKiBibG9jayB0eXBlIDAuLjMgKi8KKyAgICAgICAgICAgIGVyciA9IHR5cGUgPT0gMCA/IHN0b3JlZCgmcykgOgorICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gMSA/IGZpeGVkKCZzKSA6CisgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gMiA/IGR5bmFtaWMoJnMpIDoKKyAgICAgICAgICAgICAgICAgICAgLTEpKTsgICAgICAgICAgICAgICAvKiB0eXBlID09IDMsIGludmFsaWQgKi8KKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgYnJlYWs7ICAgICAgICAvKiByZXR1cm4gd2l0aCBlcnJvciAqLworICAgICAgICB9IHdoaWxlICghbGFzdCk7CisgICAgfQorCisgICAgLyogdXBkYXRlIHRoZSBsZW5ndGhzIGFuZCByZXR1cm4gKi8KKyAgICBpZiAoZXJyIDw9IDApIHsKKyAgICAgICAgKmRlc3RsZW4gPSBzLm91dGNudDsKKyAgICAgICAgKnNvdXJjZWxlbiA9IHMuaW5jbnQ7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBURVNUCisvKiBFeGFtcGxlIG9mIGhvdyB0byB1c2UgcHVmZigpICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCitsb2NhbCB1bnNpZ25lZCBjaGFyICp5YW5rKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKmxlbikKK3sKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgIEZJTEUgKmluOworICAgIHN0cnVjdCBzdGF0IHM7CisKKyAgICAqbGVuID0gMDsKKyAgICBpZiAoc3RhdChuYW1lLCAmcykpIHJldHVybiBOVUxMOworICAgIGlmICgocy5zdF9tb2RlICYgU19JRk1UKSAhPSBTX0lGUkVHKSByZXR1cm4gTlVMTDsKKyAgICBzaXplID0gKHVuc2lnbmVkIGxvbmcpKHMuc3Rfc2l6ZSk7CisgICAgaWYgKHNpemUgPT0gMCB8fCAob2ZmX3Qpc2l6ZSAhPSBzLnN0X3NpemUpIHJldHVybiBOVUxMOworICAgIGluID0gZm9wZW4obmFtZSwgInIiKTsKKyAgICBpZiAoaW4gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgYnVmID0gbWFsbG9jKHNpemUpOworICAgIGlmIChidWYgIT0gTlVMTCAmJiBmcmVhZChidWYsIDEsIHNpemUsIGluKSAhPSBzaXplKSB7CisgICAgICAgIGZyZWUoYnVmKTsKKyAgICAgICAgYnVmID0gTlVMTDsKKyAgICB9CisgICAgZmNsb3NlKGluKTsKKyAgICAqbGVuID0gc2l6ZTsgICAgCisgICAgcmV0dXJuIGJ1ZjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgY2hhciAqc291cmNlOworICAgIHVuc2lnbmVkIGxvbmcgbGVuLCBzb3VyY2VsZW4sIGRlc3RsZW47CisKKyAgICBpZiAoYXJnYyA8IDIpIHJldHVybiAyOworICAgIHNvdXJjZSA9IHlhbmsoYXJndlsxXSwgJmxlbik7CisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSByZXR1cm4gMjsKKyAgICBzb3VyY2VsZW4gPSBsZW47CisgICAgcmV0ID0gcHVmZihOSUwsICZkZXN0bGVuLCBzb3VyY2UsICZzb3VyY2VsZW4pOworICAgIGlmIChyZXQpCisgICAgICAgIHByaW50ZigicHVmZigpIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkXG4iLCByZXQpOworICAgIGVsc2UgeworICAgICAgICBwcmludGYoInB1ZmYoKSBzdWNjZWVkZWQgdW5jb21wcmVzc2luZyAlbHUgYnl0ZXNcbiIsIGRlc3RsZW4pOworICAgICAgICBpZiAoc291cmNlbGVuIDwgbGVuKSBwcmludGYoIiVsdSBjb21wcmVzc2VkIGJ5dGVzIHVudXNlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIHNvdXJjZWxlbik7CisgICAgfQorICAgIGZyZWUoc291cmNlKTsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb250cmliL3B1ZmYvcHVmZi5oIGIvY29udHJpYi9wdWZmL3B1ZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWVhN2UxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wdWZmL3B1ZmYuaApAQCAtMCwwICsxLDMxIEBACisvKiBwdWZmLmgKKyAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIE1hcmsgQWRsZXIsIGFsbCByaWdodHMgcmVzZXJ2ZWQKKyAgdmVyc2lvbiAxLjcsIDMgTWFyIDIwMDIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvciBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBNYXJrIEFkbGVyCW1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKyAqLworCisKKy8qCisgKiBTZWUgcHVmZi5jIGZvciBwdXJwb3NlIGFuZCB1c2FnZS4KKyAqLworaW50IHB1ZmYodW5zaWduZWQgY2hhciAqZGVzdCwgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcG9pbnRlciAqLworICAgICAgICAgdW5zaWduZWQgbG9uZyAqZGVzdGxlbiwgICAgICAgIC8qIGFtb3VudCBvZiBvdXRwdXQgc3BhY2UgKi8KKyAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgICAgICAgICAvKiBwb2ludGVyIHRvIHNvdXJjZSBkYXRhIHBvaW50ZXIgKi8KKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnNvdXJjZWxlbik7ICAgICAvKiBhbW91bnQgb2YgaW5wdXQgYXZhaWxhYmxlICovCmRpZmYgLS1naXQgYS9jb250cmliL3B1ZmYvemVyb3MucmF3IGIvY29udHJpYi9wdWZmL3plcm9zLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdiN2JlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wdWZmL3plcm9zLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jcmMzMi5jIGIvY3JjMzIuYwppbmRleCA2MGRlY2EyLi5kMGE5ZjVlIDEwMDY0NAotLS0gYS9jcmMzMi5jCisrKyBiL2NyYzMyLmMKQEAgLTEsMjIgKzEsNjggQEAKIC8qIGNyYzMyLmMgLS0gY29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogVGhhbmtzIHRvIFJvZG5leSBCcm93biA8cmJyb3duNjRAY3NjLmNvbS5hdT4gZm9yIGhpcyBjb250cmlidXRpb24gb2YgZmFzdGVyCisgKiBDUkMgbWV0aG9kczogZXhjbHVzaXZlLW9yaW5nIDMyIGJpdHMgb2YgZGF0YSBhdCBhIHRpbWUsIGFuZCBwcmUtY29tcHV0aW5nCisgKiB0YWJsZXMgZm9yIHVwZGF0aW5nIHRoZSBzaGlmdCByZWdpc3RlciBpbiBvbmUgc3RlcCB3aXRoIHRocmVlIGV4Y2x1c2l2ZS1vcnMKKyAqIGluc3RlYWQgb2YgZm91ciBzdGVwcyB3aXRoIGZvdXIgZXhjbHVzaXZlLW9ycy4gIFRoaXMgcmVzdWx0cyBhYm91dCBhIDUwJQorICogaW5jcmVhc2UgaW4gc3BlZWQgb24gYSBQb3dlciBQQyB1c2luZyBnY2MgLU8zLgogICovCiAKIC8qIEAoIykgJElkJCAqLwogCisjaWZkZWYgTUFLRUNSQ0gKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBpZm5kZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyMgICAgZGVmaW5lIERZTkFNSUNfQ1JDX1RBQkxFCisjICBlbmRpZiAvKiAhRFlOQU1JQ19DUkNfVEFCTEUgKi8KKyNlbmRpZiAvKiBNQUtFQ1JDSCAqLworCiAjaW5jbHVkZSAiemxpYi5oIgogCiAjZGVmaW5lIGxvY2FsIHN0YXRpYwogCisvKiBGaW5kIGEgZm91ci1ieXRlIGludGVnZXIgdHlwZSBmb3IgY3JjMzJfbGl0dGxlKCkgYW5kIGNyYzMyX2JpZygpLiAqLworI2lmbmRlZiBOT0JZRk9VUgorIyAgaWZkZWYgX19TVERDX18gICAgICAgLyogbmVlZCBBTlNJIEMgbGltaXRzLmggdG8gZGV0ZXJtaW5lIHNpemVzICovCisjICAgIGluY2x1ZGUgPGxpbWl0cy5oPgorIyAgICBkZWZpbmUgQllGT1VSCisjICAgIGlmIChVSU5UX01BWCA9PSA0Mjk0OTY3Mjk1KQorICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHU0OworIyAgICBlbGlmIChVTE9OR19NQVggPT0gNDI5NDk2NzI5NSkKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdTQ7CisjICAgIGVsaWYgKFVTSFJUX01BWCA9PSA0Mjk0OTY3Mjk1KQorICAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTQ7CisjICAgIGVsc2UKKyMgICAgICB1bmRlZiBCWUZPVVIgICAgIC8qIGNhbid0IGZpbmQgYSBmb3VyLWJ5dGUgaW50ZWdlciB0eXBlISAqLworIyAgICBlbmRpZgorIyAgZW5kaWYgLyogX19TVERDX18gKi8KKyNlbmRpZiAvKiAhTk9CWUZPVVIgKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIGRvaW5nIHRoZSBjcmMgZm91ciBkYXRhIGJ5dGVzIGF0IGEgdGltZS4gKi8KKyNpZmRlZiBCWUZPVVIKKyMgIGRlZmluZSBSRVYodykgKCgodyk+PjI0KSsoKCh3KT4+OCkmMHhmZjAwKSsgXAorICAgICAgICAgICAgICAgICgoKHcpJjB4ZmYwMCk8PDgpKygoKHcpJjB4ZmYpPDwyNCkpCisgICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZSBPRigodW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisgICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2JpZyBPRigodW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisjICBkZWZpbmUgVEJMUyA4CisjZWxzZQorIyAgZGVmaW5lIFRCTFMgMQorI2VuZGlmIC8qIEJZRk9VUiAqLworCiAjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKIAogbG9jYWwgaW50IGNyY190YWJsZV9lbXB0eSA9IDE7Ci1sb2NhbCB1TG9uZ2YgY3JjX3RhYmxlWzI1Nl07Citsb2NhbCB1bnNpZ25lZCBsb25nIEZBUiBjcmNfdGFibGVbVEJMU11bMjU2XTsKIGxvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUgT0YoKHZvaWQpKTsKKyNpZmRlZiBNQUtFQ1JDSAorICAgbG9jYWwgdm9pZCB3cml0ZV90YWJsZSBPRigoRklMRSAqLCBjb25zdCB1bnNpZ25lZCBsb25nIEZBUiAqKSk7CisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KIAogLyoKLSAgR2VuZXJhdGUgYSB0YWJsZSBmb3IgYSBieXRlLXdpc2UgMzItYml0IENSQyBjYWxjdWxhdGlvbiBvbiB0aGUgcG9seW5vbWlhbDoKKyAgR2VuZXJhdGUgdGFibGVzIGZvciBhIGJ5dGUtd2lzZSAzMi1iaXQgQ1JDIGNhbGN1bGF0aW9uIG9uIHRoZSBwb2x5bm9taWFsOgogICB4XjMyK3heMjYreF4yMyt4XjIyK3heMTYreF4xMit4XjExK3heMTAreF44K3heNyt4XjUreF40K3heMit4KzEuCiAKICAgUG9seW5vbWlhbHMgb3ZlciBHRigyKSBhcmUgcmVwcmVzZW50ZWQgaW4gYmluYXJ5LCBvbmUgYml0IHBlciBjb2VmZmljaWVudCwKQEAgLTM1LDEyOCArODEsMjI4IEBACiAgIG91dCBpcyBhIG9uZSkuICBXZSBzdGFydCB3aXRoIHRoZSBoaWdoZXN0IHBvd2VyIChsZWFzdCBzaWduaWZpY2FudCBiaXQpIG9mCiAgIHEgYW5kIHJlcGVhdCBmb3IgYWxsIGVpZ2h0IGJpdHMgb2YgcS4KIAotICBUaGUgdGFibGUgaXMgc2ltcGx5IHRoZSBDUkMgb2YgYWxsIHBvc3NpYmxlIGVpZ2h0IGJpdCB2YWx1ZXMuICBUaGlzIGlzIGFsbAotICB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGdlbmVyYXRlIENSQydzIG9uIGRhdGEgYSBieXRlIGF0IGEgdGltZSBmb3IgYWxsCi0gIGNvbWJpbmF0aW9ucyBvZiBDUkMgcmVnaXN0ZXIgdmFsdWVzIGFuZCBpbmNvbWluZyBieXRlcy4KKyAgVGhlIGZpcnN0IHRhYmxlIGlzIHNpbXBseSB0aGUgQ1JDIG9mIGFsbCBwb3NzaWJsZSBlaWdodCBiaXQgdmFsdWVzLiAgVGhpcyBpcworICBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBnZW5lcmF0ZSBDUkNzIG9uIGRhdGEgYSBieXRlIGF0IGEgdGltZSBmb3IgYWxsCisgIGNvbWJpbmF0aW9ucyBvZiBDUkMgcmVnaXN0ZXIgdmFsdWVzIGFuZCBpbmNvbWluZyBieXRlcy4gIFRoZSByZW1haW5pbmcgdGFibGVzCisgIGFsbG93IGZvciB3b3JkLWF0LWEtdGltZSBDUkMgY2FsY3VsYXRpb24gZm9yIGJvdGggYmlnLWVuZGlhbiBhbmQgbGl0dGxlLQorICBlbmRpYW4gbWFjaGluZXMsIHdoZXJlIGEgd29yZCBpcyBmb3VyIGJ5dGVzLgogKi8KIGxvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUoKQogewotICB1TG9uZyBjOwotICBpbnQgbiwgazsKLSAgdUxvbmcgcG9seTsgICAgICAgICAgICAvKiBwb2x5bm9taWFsIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuICovCi0gIC8qIHRlcm1zIG9mIHBvbHlub21pYWwgZGVmaW5pbmcgdGhpcyBjcmMgKGV4Y2VwdCB4XjMyKTogKi8KLSAgc3RhdGljIGNvbnN0IEJ5dGUgcFtdID0gezAsMSwyLDQsNSw3LDgsMTAsMTEsMTIsMTYsMjIsMjMsMjZ9OworICAgIHVuc2lnbmVkIGxvbmcgYzsKKyAgICBpbnQgbiwgazsKKyAgICB1bnNpZ25lZCBsb25nIHBvbHk7ICAgICAgICAgICAgLyogcG9seW5vbWlhbCBleGNsdXNpdmUtb3IgcGF0dGVybiAqLworICAgIC8qIHRlcm1zIG9mIHBvbHlub21pYWwgZGVmaW5pbmcgdGhpcyBjcmMgKGV4Y2VwdCB4XjMyKTogKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwW10gPSB7MCwxLDIsNCw1LDcsOCwxMCwxMSwxMiwxNiwyMiwyMywyNn07CiAKLSAgLyogbWFrZSBleGNsdXNpdmUtb3IgcGF0dGVybiBmcm9tIHBvbHlub21pYWwgKDB4ZWRiODgzMjBMKSAqLwotICBwb2x5ID0gMEw7Ci0gIGZvciAobiA9IDA7IG4gPCBzaXplb2YocCkvc2l6ZW9mKEJ5dGUpOyBuKyspCi0gICAgcG9seSB8PSAxTCA8PCAoMzEgLSBwW25dKTsKLSAKLSAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKQotICB7Ci0gICAgYyA9ICh1TG9uZyluOwotICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCi0gICAgICBjID0gYyAmIDEgPyBwb2x5IF4gKGMgPj4gMSkgOiBjID4+IDE7Ci0gICAgY3JjX3RhYmxlW25dID0gYzsKLSAgfQorICAgIC8qIG1ha2UgZXhjbHVzaXZlLW9yIHBhdHRlcm4gZnJvbSBwb2x5bm9taWFsICgweGVkYjg4MzIwTCkgKi8KKyAgICBwb2x5ID0gMFVMOworICAgIGZvciAobiA9IDA7IG4gPCBzaXplb2YocCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOyBuKyspCisgICAgICAgIHBvbHkgfD0gMVVMIDw8ICgzMSAtIHBbbl0pOworCisgICAgLyogZ2VuZXJhdGUgYSBjcmMgZm9yIGV2ZXJ5IDgtYml0IHZhbHVlICovCisgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKSB7CisgICAgICAgIGMgPSAodW5zaWduZWQgbG9uZyluOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKQorICAgICAgICAgICAgYyA9IGMgJiAxID8gcG9seSBeIChjID4+IDEpIDogYyA+PiAxOworICAgICAgICBjcmNfdGFibGVbMF1bbl0gPSBjOworICAgIH0KKworI2lmZGVmIEJZRk9VUgorICAgIC8qIGdlbmVyYXRlIGNyYyBmb3IgZWFjaCB2YWx1ZSBmb2xsb3dlZCBieSBvbmUsIHR3bywgYW5kIHRocmVlIHplcm9zLCBhbmQKKyAgICAgICB0aGVuIHRoZSBieXRlIHJldmVyc2FsIG9mIHRob3NlIGFzIHdlbGwgYXMgdGhlIGZpcnN0IHRhYmxlICovCisgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKSB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bbl07CisgICAgICAgIGNyY190YWJsZVs0XVtuXSA9IFJFVihjKTsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtjICYgMHhmZl0gXiAoYyA+PiA4KTsKKyAgICAgICAgICAgIGNyY190YWJsZVtrXVtuXSA9IGM7CisgICAgICAgICAgICBjcmNfdGFibGVbayArIDRdW25dID0gUkVWKGMpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEJZRk9VUiAqLworCiAgIGNyY190YWJsZV9lbXB0eSA9IDA7CisKKyNpZmRlZiBNQUtFQ1JDSAorICAgIC8qIHdyaXRlIG91dCBDUkMgdGFibGVzIHRvIGNyYzMyLmggKi8KKyAgICB7CisgICAgICAgIEZJTEUgKm91dDsKKworICAgICAgICBvdXQgPSBmb3BlbigiY3JjMzIuaCIsICJ3Iik7CisgICAgICAgIGlmIChvdXQgPT0gTlVMTCkgcmV0dXJuOworICAgICAgICBmcHJpbnRmKG91dCwgIi8qIGNyYzMyLmggLS0gdGFibGVzIGZvciByYXBpZCBDUkMgY2FsY3VsYXRpb25cbiIpOworICAgICAgICBmcHJpbnRmKG91dCwgIiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNyYzMyLmNcbiAqL1xuXG4iKTsKKyAgICAgICAgZnByaW50ZihvdXQsICJsb2NhbCBjb25zdCB1bnNpZ25lZCBsb25nIEZBUiAiKTsKKyAgICAgICAgZnByaW50ZihvdXQsICJjcmNfdGFibGVbVEJMU11bMjU2XSA9XG57XG4gIHtcbiIpOworICAgICAgICB3cml0ZV90YWJsZShvdXQsIGNyY190YWJsZVswXSk7CisjICBpZmRlZiBCWUZPVVIKKyAgICAgICAgZnByaW50ZihvdXQsICIjaWZkZWYgQllGT1VSXG4iKTsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykgeworICAgICAgICAgICAgZnByaW50ZihvdXQsICIgIH0sXG4gIHtcbiIpOworICAgICAgICAgICAgd3JpdGVfdGFibGUob3V0LCBjcmNfdGFibGVba10pOworICAgICAgICB9CisgICAgICAgIGZwcmludGYob3V0LCAiI2VuZGlmXG4iKTsKKyMgIGVuZGlmIC8qIEJZRk9VUiAqLworICAgICAgICBmcHJpbnRmKG91dCwgIiAgfVxufTtcbiIpOworICAgICAgICBmY2xvc2Uob3V0KTsKKyAgICB9CisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KIH0KLSNlbHNlCisKKyNpZmRlZiBNQUtFQ1JDSAorbG9jYWwgdm9pZCB3cml0ZV90YWJsZShvdXQsIHRhYmxlKQorICAgIEZJTEUgKm91dDsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nIEZBUiAqdGFibGU7Cit7CisgICAgaW50IG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspCisgICAgICAgIGZwcmludGYob3V0LCAiJXMweCUwOGx4VUwlcyIsIG4gJSA1ID8gIiIgOiAiICAgICIsIHRhYmxlW25dLAorICAgICAgICAgICAgICAgIG4gPT0gMjU1ID8gIlxuIiA6IChuICUgNSA9PSA0ID8gIixcbiIgOiAiLCAiKSk7Cit9CisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KKworI2Vsc2UgLyogIURZTkFNSUNfQ1JDX1RBQkxFICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRhYmxlIG9mIENSQy0zMidzIG9mIGFsbCBzaW5nbGUtYnl0ZSB2YWx1ZXMgKG1hZGUgYnkgbWFrZV9jcmNfdGFibGUpCisgKiBUYWJsZXMgb2YgQ1JDLTMycyBvZiBhbGwgc2luZ2xlLWJ5dGUgdmFsdWVzLCBtYWRlIGJ5IG1ha2VfY3JjX3RhYmxlKCkuCiAgKi8KLWxvY2FsIGNvbnN0IHVMb25nZiBjcmNfdGFibGVbMjU2XSA9IHsKLSAgMHgwMDAwMDAwMEwsIDB4NzcwNzMwOTZMLCAweGVlMGU2MTJjTCwgMHg5OTA5NTFiYUwsIDB4MDc2ZGM0MTlMLAotICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCi0gIDB4ZTBkNWU5MWVMLCAweDk3ZDJkOTg4TCwgMHgwOWI2NGMyYkwsIDB4N2ViMTdjYmRMLCAweGU3YjgyZDA3TCwKLSAgMHg5MGJmMWQ5MUwsIDB4MWRiNzEwNjRMLCAweDZhYjAyMGYyTCwgMHhmM2I5NzE0OEwsIDB4ODRiZTQxZGVMLAotICAweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwgMHgxMzZjOTg1NkwsCi0gIDB4NjQ2YmE4YzBMLCAweGZkNjJmOTdhTCwgMHg4YTY1YzllY0wsIDB4MTQwMTVjNGZMLCAweDYzMDY2Y2Q5TCwKLSAgMHhmYTBmM2Q2M0wsIDB4OGQwODBkZjVMLCAweDNiNmUyMGM4TCwgMHg0YzY5MTA1ZUwsIDB4ZDU2MDQxZTRMLAotICAweGEyNjc3MTcyTCwgMHgzYzAzZTRkMUwsIDB4NGIwNGQ0NDdMLCAweGQyMGQ4NWZkTCwgMHhhNTBhYjU2YkwsCi0gIDB4MzViNWE4ZmFMLCAweDQyYjI5ODZjTCwgMHhkYmJiYzlkNkwsIDB4YWNiY2Y5NDBMLCAweDMyZDg2Y2UzTCwKLSAgMHg0NWRmNWM3NUwsIDB4ZGNkNjBkY2ZMLCAweGFiZDEzZDU5TCwgMHgyNmQ5MzBhY0wsIDB4NTFkZTAwM2FMLAotICAweGM4ZDc1MTgwTCwgMHhiZmQwNjExNkwsIDB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsCi0gIDB4YjhiZGE1MGZMLCAweDI4MDJiODllTCwgMHg1ZjA1ODgwOEwsIDB4YzYwY2Q5YjJMLCAweGIxMGJlOTI0TCwKLSAgMHgyZjZmN2M4N0wsIDB4NTg2ODRjMTFMLCAweGMxNjExZGFiTCwgMHhiNjY2MmQzZEwsIDB4NzZkYzQxOTBMLAotICAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLCAweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsCi0gIDB4OWZiZmU0YTVMLCAweGU4YjhkNDMzTCwgMHg3ODA3YzlhMkwsIDB4MGYwMGY5MzRMLCAweDk2MDlhODhlTCwKLSAgMHhlMTBlOTgxOEwsIDB4N2Y2YTBkYmJMLCAweDA4NmQzZDJkTCwgMHg5MTY0NmM5N0wsIDB4ZTY2MzVjMDFMLAotICAweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwgMHg2YzA2OTVlZEwsCi0gIDB4MWIwMWE1N2JMLCAweDgyMDhmNGMxTCwgMHhmNTBmYzQ1N0wsIDB4NjViMGQ5YzZMLCAweDEyYjdlOTUwTCwKLSAgMHg4YmJlYjhlYUwsIDB4ZmNiOTg4N2NMLCAweDYyZGQxZGRmTCwgMHgxNWRhMmQ0OUwsIDB4OGNkMzdjZjNMLAotICAweGZiZDQ0YzY1TCwgMHg0ZGIyNjE1OEwsIDB4M2FiNTUxY2VMLCAweGEzYmMwMDc0TCwgMHhkNGJiMzBlMkwsCi0gIDB4NGFkZmE1NDFMLCAweDNkZDg5NWQ3TCwgMHhhNGQxYzQ2ZEwsIDB4ZDNkNmY0ZmJMLCAweDQzNjllOTZhTCwKLSAgMHgzNDZlZDlmY0wsIDB4YWQ2Nzg4NDZMLCAweGRhNjBiOGQwTCwgMHg0NDA0MmQ3M0wsIDB4MzMwMzFkZTVMLAotICAweGFhMGE0YzVmTCwgMHhkZDBkN2NjOUwsIDB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsCi0gIDB4YzkwYzIwODZMLCAweDU3NjhiNTI1TCwgMHgyMDZmODViM0wsIDB4Yjk2NmQ0MDlMLCAweGNlNjFlNDlmTCwKLSAgMHg1ZWRlZjkwZUwsIDB4MjlkOWM5OThMLCAweGIwZDA5ODIyTCwgMHhjN2Q3YThiNEwsIDB4NTliMzNkMTdMLAotICAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLCAweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsCi0gIDB4MDNiNmUyMGNMLCAweDc0YjFkMjlhTCwgMHhlYWQ1NDczOUwsIDB4OWRkMjc3YWZMLCAweDA0ZGIyNjE1TCwKLSAgMHg3M2RjMTY4M0wsIDB4ZTM2MzBiMTJMLCAweDk0NjQzYjg0TCwgMHgwZDZkNmEzZUwsIDB4N2E2YTVhYThMLAotICAweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwgMHhmMDBmOTM0NEwsCi0gIDB4ODcwOGEzZDJMLCAweDFlMDFmMjY4TCwgMHg2OTA2YzJmZUwsIDB4Zjc2MjU3NWRMLCAweDgwNjU2N2NiTCwKLSAgMHgxOTZjMzY3MUwsIDB4NmU2YjA2ZTdMLCAweGZlZDQxYjc2TCwgMHg4OWQzMmJlMEwsIDB4MTBkYTdhNWFMLAotICAweDY3ZGQ0YWNjTCwgMHhmOWI5ZGY2ZkwsIDB4OGViZWVmZjlMLCAweDE3YjdiZTQzTCwgMHg2MGIwOGVkNUwsCi0gIDB4ZDZkNmEzZThMLCAweGExZDE5MzdlTCwgMHgzOGQ4YzJjNEwsIDB4NGZkZmYyNTJMLCAweGQxYmI2N2YxTCwKLSAgMHhhNmJjNTc2N0wsIDB4M2ZiNTA2ZGRMLCAweDQ4YjIzNjRiTCwgMHhkODBkMmJkYUwsIDB4YWYwYTFiNGNMLAotICAweDM2MDM0YWY2TCwgMHg0MTA0N2E2MEwsIDB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsCi0gIDB4NDY2OWJlNzlMLCAweGNiNjFiMzhjTCwgMHhiYzY2ODMxYUwsIDB4MjU2ZmQyYTBMLCAweDUyNjhlMjM2TCwKLSAgMHhjYzBjNzc5NUwsIDB4YmIwYjQ3MDNMLCAweDIyMDIxNmI5TCwgMHg1NTA1MjYyZkwsIDB4YzViYTNiYmVMLAotICAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLCAweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsCi0gIDB4MmNkOTllOGJMLCAweDViZGVhZTFkTCwgMHg5YjY0YzJiMEwsIDB4ZWM2M2YyMjZMLCAweDc1NmFhMzljTCwKLSAgMHgwMjZkOTMwYUwsIDB4OWMwOTA2YTlMLCAweGViMGUzNjNmTCwgMHg3MjA3Njc4NUwsIDB4MDUwMDU3MTNMLAotICAweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwgMHg5MmQyOGU5YkwsCi0gIDB4ZTVkNWJlMGRMLCAweDdjZGNlZmI3TCwgMHgwYmRiZGYyMUwsIDB4ODZkM2QyZDRMLCAweGYxZDRlMjQyTCwKLSAgMHg2OGRkYjNmOEwsIDB4MWZkYTgzNmVMLCAweDgxYmUxNmNkTCwgMHhmNmI5MjY1YkwsIDB4NmZiMDc3ZTFMLAotICAweDE4Yjc0Nzc3TCwgMHg4ODA4NWFlNkwsIDB4ZmYwZjZhNzBMLCAweDY2MDYzYmNhTCwgMHgxMTAxMGI1Y0wsCi0gIDB4OGY2NTllZmZMLCAweGY4NjJhZTY5TCwgMHg2MTZiZmZkM0wsIDB4MTY2Y2NmNDVMLCAweGEwMGFlMjc4TCwKLSAgMHhkNzBkZDJlZUwsIDB4NGUwNDgzNTRMLCAweDM5MDNiM2MyTCwgMHhhNzY3MjY2MUwsIDB4ZDA2MDE2ZjdMLAotICAweDQ5Njk0NzRkTCwgMHgzZTZlNzdkYkwsIDB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsCi0gIDB4MzdkODNiZjBMLCAweGE5YmNhZTUzTCwgMHhkZWJiOWVjNUwsIDB4NDdiMmNmN2ZMLCAweDMwYjVmZmU5TCwKLSAgMHhiZGJkZjIxY0wsIDB4Y2FiYWMyOGFMLCAweDUzYjM5MzMwTCwgMHgyNGI0YTNhNkwsIDB4YmFkMDM2MDVMLAotICAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLCAweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsCi0gIDB4NWQ2ODFiMDJMLCAweDJhNmYyYjk0TCwgMHhiNDBiYmUzN0wsIDB4YzMwYzhlYTFMLCAweDVhMDVkZjFiTCwKLSAgMHgyZDAyZWY4ZEwKLX07Ci0jZW5kaWYKKyNpbmNsdWRlICJjcmMzMi5oIgorI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgYXNtIHZlcnNpb25zIG9mIGNyYzMyKCkKICAqLwotY29uc3QgdUxvbmdmICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlKCkKK2NvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlKCkKIHsKICNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQogICBpZiAoY3JjX3RhYmxlX2VtcHR5KSBtYWtlX2NyY190YWJsZSgpOwotI2VuZGlmCi0gIHJldHVybiAoY29uc3QgdUxvbmdmICopY3JjX3RhYmxlOworI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCisgIHJldHVybiAoY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKiljcmNfdGFibGU7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgRE8xKGJ1ZikgY3JjID0gY3JjX3RhYmxlWygoaW50KWNyYyBeICgqYnVmKyspKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsKLSNkZWZpbmUgRE8yKGJ1ZikgIERPMShidWYpOyBETzEoYnVmKTsKLSNkZWZpbmUgRE80KGJ1ZikgIERPMihidWYpOyBETzIoYnVmKTsKLSNkZWZpbmUgRE84KGJ1ZikgIERPNChidWYpOyBETzQoYnVmKTsKKyNkZWZpbmUgRE8xIGNyYyA9IGNyY190YWJsZVswXVsoKGludCljcmMgXiAoKmJ1ZisrKSkgJiAweGZmXSBeIChjcmMgPj4gOCkKKyNkZWZpbmUgRE84IERPMTsgRE8xOyBETzE7IERPMTsgRE8xOyBETzE7IERPMTsgRE8xCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVMb25nIFpFWFBPUlQgY3JjMzIoY3JjLCBidWYsIGxlbikKLSAgICB1TG9uZyBjcmM7Ci0gICAgY29uc3QgQnl0ZWYgKmJ1ZjsKLSAgICB1SW50IGxlbjsKK3Vuc2lnbmVkIGxvbmcgWkVYUE9SVCBjcmMzMihjcmMsIGJ1ZiwgbGVuKQorICAgIHVuc2lnbmVkIGxvbmcgY3JjOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7CisgICAgdW5zaWduZWQgbGVuOwogewotICAgIGlmIChidWYgPT0gWl9OVUxMKSByZXR1cm4gMEw7CisgICAgaWYgKGJ1ZiA9PSBaX05VTEwpIHJldHVybiAwVUw7CisKICNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQogICAgIGlmIChjcmNfdGFibGVfZW1wdHkpCi0gICAgICBtYWtlX2NyY190YWJsZSgpOwotI2VuZGlmCi0gICAgY3JjID0gY3JjIF4gMHhmZmZmZmZmZkw7Ci0gICAgd2hpbGUgKGxlbiA+PSA4KQorICAgICAgICBtYWtlX2NyY190YWJsZSgpOworI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCisKKyNpZmRlZiBCWUZPVVIKICAgICB7Ci0gICAgICBETzgoYnVmKTsKLSAgICAgIGxlbiAtPSA4OworICAgICAgICB1NCBlbmRpYW47CisKKyAgICAgICAgZW5kaWFuID0gMTsKKyAgICAgICAgaWYgKCooKHVuc2lnbmVkIGNoYXIgKikoJmVuZGlhbikpKQorICAgICAgICAgICAgcmV0dXJuIGNyYzMyX2xpdHRsZShjcmMsIGJ1ZiwgbGVuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNyYzMyX2JpZyhjcmMsIGJ1ZiwgbGVuKTsKKyAgICB9CisjZWxzZSAvKiAhQllGT1VSICovCisgICAgY3JjID0gY3JjIF4gMHhmZmZmZmZmZlVMOworICAgIHdoaWxlIChsZW4gPj0gOCkgeworICAgICAgICBETzg7CisgICAgICAgIGxlbiAtPSA4OwogICAgIH0KICAgICBpZiAobGVuKSBkbyB7Ci0gICAgICBETzEoYnVmKTsKKyAgICAgICAgRE8xOwogICAgIH0gd2hpbGUgKC0tbGVuKTsKLSAgICByZXR1cm4gY3JjIF4gMHhmZmZmZmZmZkw7CisgICAgcmV0dXJuIGNyYyBeIDB4ZmZmZmZmZmZVTDsKKyNlbmRpZiAvKiBCWUZPVVIgKi8KIH0KKworI2lmZGVmIEJZRk9VUgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIERPTElUNCBjIF49ICpidWY0Kys7IFwKKyAgICAgICAgYyA9IGNyY190YWJsZVszXVtjICYgMHhmZl0gXiBjcmNfdGFibGVbMl1bKGMgPj4gOCkgJiAweGZmXSBeIFwKKyAgICAgICAgICAgIGNyY190YWJsZVsxXVsoYyA+PiAxNikgJiAweGZmXSBeIGNyY190YWJsZVswXVtjID4+IDI0XQorI2RlZmluZSBET0xJVDMyIERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHVuc2lnbmVkIGxvbmcgY3JjMzJfbGl0dGxlKGNyYywgYnVmLCBsZW4pCisgICAgdW5zaWduZWQgbG9uZyBjcmM7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgcmVnaXN0ZXIgdTQgYzsKKyAgICByZWdpc3RlciBjb25zdCB1NCBGQVIgKmJ1ZjQ7CisKKyAgICBjID0gKHU0KWNyYzsKKyAgICBjID0gfmM7CisgICAgd2hpbGUgKGxlbiAmJiAoKGludClidWYgJiAzKSkgeworICAgICAgICBjID0gY3JjX3RhYmxlWzBdWyhjIF4gKmJ1ZisrKSAmIDB4ZmZdIF4gKGMgPj4gOCk7CisgICAgICAgIGxlbi0tOworICAgIH0KKworICAgIGJ1ZjQgPSAoY29uc3QgdTQgRkFSICopYnVmOworICAgIHdoaWxlIChsZW4gPj0gMzIpIHsKKyAgICAgICAgRE9MSVQzMjsKKyAgICAgICAgbGVuIC09IDMyOworICAgIH0KKyAgICB3aGlsZSAobGVuID49IDQpIHsKKyAgICAgICAgRE9MSVQ0OworICAgICAgICBsZW4gLT0gNDsKKyAgICB9CisgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICopYnVmNDsKKworICAgIGlmIChsZW4pIGRvIHsKKyAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOworICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICBjID0gfmM7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKWM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgRE9CSUc0IGMgXj0gKisrYnVmNDsgXAorICAgICAgICBjID0gY3JjX3RhYmxlWzRdW2MgJiAweGZmXSBeIGNyY190YWJsZVs1XVsoYyA+PiA4KSAmIDB4ZmZdIF4gXAorICAgICAgICAgICAgY3JjX3RhYmxlWzZdWyhjID4+IDE2KSAmIDB4ZmZdIF4gY3JjX3RhYmxlWzddW2MgPj4gMjRdCisjZGVmaW5lIERPQklHMzIgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9iaWcoY3JjLCBidWYsIGxlbikKKyAgICB1bnNpZ25lZCBsb25nIGNyYzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICByZWdpc3RlciB1NCBjOworICAgIHJlZ2lzdGVyIGNvbnN0IHU0IEZBUiAqYnVmNDsKKworICAgIGMgPSBSRVYoKHU0KWNyYyk7CisgICAgYyA9IH5jOworICAgIHdoaWxlIChsZW4gJiYgKChpbnQpYnVmICYgMykpIHsKKyAgICAgICAgYyA9IGNyY190YWJsZVs0XVsoYyA+PiAyNCkgXiAqYnVmKytdIF4gKGMgPDwgOCk7CisgICAgICAgIGxlbi0tOworICAgIH0KKworICAgIGJ1ZjQgPSAoY29uc3QgdTQgRkFSICopYnVmOworICAgIGJ1ZjQtLTsKKyAgICB3aGlsZSAobGVuID49IDMyKSB7CisgICAgICAgIERPQklHMzI7CisgICAgICAgIGxlbiAtPSAzMjsKKyAgICB9CisgICAgd2hpbGUgKGxlbiA+PSA0KSB7CisgICAgICAgIERPQklHNDsKKyAgICAgICAgbGVuIC09IDQ7CisgICAgfQorICAgIGJ1ZjQrKzsKKyAgICBidWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKilidWY0OworCisgICAgaWYgKGxlbikgZG8geworICAgICAgICBjID0gY3JjX3RhYmxlWzRdWyhjID4+IDI0KSBeICpidWYrK10gXiAoYyA8PCA4KTsKKyAgICB9IHdoaWxlICgtLWxlbik7CisgICAgYyA9IH5jOworICAgIHJldHVybiAodW5zaWduZWQgbG9uZykoUkVWKGMpKTsKK30KKworI2VuZGlmIC8qIEJZRk9VUiAqLwpkaWZmIC0tZ2l0IGEvY3JjMzIuaCBiL2NyYzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1M2I2MQotLS0gL2Rldi9udWxsCisrKyBiL2NyYzMyLmgKQEAgLTAsMCArMSw0NDEgQEAKKy8qIGNyYzMyLmggLS0gdGFibGVzIGZvciByYXBpZCBDUkMgY2FsY3VsYXRpb24KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNyYzMyLmMKKyAqLworCitsb2NhbCBjb25zdCB1bnNpZ25lZCBsb25nIEZBUiBjcmNfdGFibGVbVEJMU11bMjU2XSA9Cit7CisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4NzcwNzMwOTZVTCwgMHhlZTBlNjEyY1VMLCAweDk5MDk1MWJhVUwsIDB4MDc2ZGM0MTlVTCwKKyAgICAweDcwNmFmNDhmVUwsIDB4ZTk2M2E1MzVVTCwgMHg5ZTY0OTVhM1VMLCAweDBlZGI4ODMyVUwsIDB4NzlkY2I4YTRVTCwKKyAgICAweGUwZDVlOTFlVUwsIDB4OTdkMmQ5ODhVTCwgMHgwOWI2NGMyYlVMLCAweDdlYjE3Y2JkVUwsIDB4ZTdiODJkMDdVTCwKKyAgICAweDkwYmYxZDkxVUwsIDB4MWRiNzEwNjRVTCwgMHg2YWIwMjBmMlVMLCAweGYzYjk3MTQ4VUwsIDB4ODRiZTQxZGVVTCwKKyAgICAweDFhZGFkNDdkVUwsIDB4NmRkZGU0ZWJVTCwgMHhmNGQ0YjU1MVVMLCAweDgzZDM4NWM3VUwsIDB4MTM2Yzk4NTZVTCwKKyAgICAweDY0NmJhOGMwVUwsIDB4ZmQ2MmY5N2FVTCwgMHg4YTY1YzllY1VMLCAweDE0MDE1YzRmVUwsIDB4NjMwNjZjZDlVTCwKKyAgICAweGZhMGYzZDYzVUwsIDB4OGQwODBkZjVVTCwgMHgzYjZlMjBjOFVMLCAweDRjNjkxMDVlVUwsIDB4ZDU2MDQxZTRVTCwKKyAgICAweGEyNjc3MTcyVUwsIDB4M2MwM2U0ZDFVTCwgMHg0YjA0ZDQ0N1VMLCAweGQyMGQ4NWZkVUwsIDB4YTUwYWI1NmJVTCwKKyAgICAweDM1YjVhOGZhVUwsIDB4NDJiMjk4NmNVTCwgMHhkYmJiYzlkNlVMLCAweGFjYmNmOTQwVUwsIDB4MzJkODZjZTNVTCwKKyAgICAweDQ1ZGY1Yzc1VUwsIDB4ZGNkNjBkY2ZVTCwgMHhhYmQxM2Q1OVVMLCAweDI2ZDkzMGFjVUwsIDB4NTFkZTAwM2FVTCwKKyAgICAweGM4ZDc1MTgwVUwsIDB4YmZkMDYxMTZVTCwgMHgyMWI0ZjRiNVVMLCAweDU2YjNjNDIzVUwsIDB4Y2ZiYTk1OTlVTCwKKyAgICAweGI4YmRhNTBmVUwsIDB4MjgwMmI4OWVVTCwgMHg1ZjA1ODgwOFVMLCAweGM2MGNkOWIyVUwsIDB4YjEwYmU5MjRVTCwKKyAgICAweDJmNmY3Yzg3VUwsIDB4NTg2ODRjMTFVTCwgMHhjMTYxMWRhYlVMLCAweGI2NjYyZDNkVUwsIDB4NzZkYzQxOTBVTCwKKyAgICAweDAxZGI3MTA2VUwsIDB4OThkMjIwYmNVTCwgMHhlZmQ1MTAyYVVMLCAweDcxYjE4NTg5VUwsIDB4MDZiNmI1MWZVTCwKKyAgICAweDlmYmZlNGE1VUwsIDB4ZThiOGQ0MzNVTCwgMHg3ODA3YzlhMlVMLCAweDBmMDBmOTM0VUwsIDB4OTYwOWE4OGVVTCwKKyAgICAweGUxMGU5ODE4VUwsIDB4N2Y2YTBkYmJVTCwgMHgwODZkM2QyZFVMLCAweDkxNjQ2Yzk3VUwsIDB4ZTY2MzVjMDFVTCwKKyAgICAweDZiNmI1MWY0VUwsIDB4MWM2YzYxNjJVTCwgMHg4NTY1MzBkOFVMLCAweGYyNjIwMDRlVUwsIDB4NmMwNjk1ZWRVTCwKKyAgICAweDFiMDFhNTdiVUwsIDB4ODIwOGY0YzFVTCwgMHhmNTBmYzQ1N1VMLCAweDY1YjBkOWM2VUwsIDB4MTJiN2U5NTBVTCwKKyAgICAweDhiYmViOGVhVUwsIDB4ZmNiOTg4N2NVTCwgMHg2MmRkMWRkZlVMLCAweDE1ZGEyZDQ5VUwsIDB4OGNkMzdjZjNVTCwKKyAgICAweGZiZDQ0YzY1VUwsIDB4NGRiMjYxNThVTCwgMHgzYWI1NTFjZVVMLCAweGEzYmMwMDc0VUwsIDB4ZDRiYjMwZTJVTCwKKyAgICAweDRhZGZhNTQxVUwsIDB4M2RkODk1ZDdVTCwgMHhhNGQxYzQ2ZFVMLCAweGQzZDZmNGZiVUwsIDB4NDM2OWU5NmFVTCwKKyAgICAweDM0NmVkOWZjVUwsIDB4YWQ2Nzg4NDZVTCwgMHhkYTYwYjhkMFVMLCAweDQ0MDQyZDczVUwsIDB4MzMwMzFkZTVVTCwKKyAgICAweGFhMGE0YzVmVUwsIDB4ZGQwZDdjYzlVTCwgMHg1MDA1NzEzY1VMLCAweDI3MDI0MWFhVUwsIDB4YmUwYjEwMTBVTCwKKyAgICAweGM5MGMyMDg2VUwsIDB4NTc2OGI1MjVVTCwgMHgyMDZmODViM1VMLCAweGI5NjZkNDA5VUwsIDB4Y2U2MWU0OWZVTCwKKyAgICAweDVlZGVmOTBlVUwsIDB4MjlkOWM5OThVTCwgMHhiMGQwOTgyMlVMLCAweGM3ZDdhOGI0VUwsIDB4NTliMzNkMTdVTCwKKyAgICAweDJlYjQwZDgxVUwsIDB4YjdiZDVjM2JVTCwgMHhjMGJhNmNhZFVMLCAweGVkYjg4MzIwVUwsIDB4OWFiZmIzYjZVTCwKKyAgICAweDAzYjZlMjBjVUwsIDB4NzRiMWQyOWFVTCwgMHhlYWQ1NDczOVVMLCAweDlkZDI3N2FmVUwsIDB4MDRkYjI2MTVVTCwKKyAgICAweDczZGMxNjgzVUwsIDB4ZTM2MzBiMTJVTCwgMHg5NDY0M2I4NFVMLCAweDBkNmQ2YTNlVUwsIDB4N2E2YTVhYThVTCwKKyAgICAweGU0MGVjZjBiVUwsIDB4OTMwOWZmOWRVTCwgMHgwYTAwYWUyN1VMLCAweDdkMDc5ZWIxVUwsIDB4ZjAwZjkzNDRVTCwKKyAgICAweDg3MDhhM2QyVUwsIDB4MWUwMWYyNjhVTCwgMHg2OTA2YzJmZVVMLCAweGY3NjI1NzVkVUwsIDB4ODA2NTY3Y2JVTCwKKyAgICAweDE5NmMzNjcxVUwsIDB4NmU2YjA2ZTdVTCwgMHhmZWQ0MWI3NlVMLCAweDg5ZDMyYmUwVUwsIDB4MTBkYTdhNWFVTCwKKyAgICAweDY3ZGQ0YWNjVUwsIDB4ZjliOWRmNmZVTCwgMHg4ZWJlZWZmOVVMLCAweDE3YjdiZTQzVUwsIDB4NjBiMDhlZDVVTCwKKyAgICAweGQ2ZDZhM2U4VUwsIDB4YTFkMTkzN2VVTCwgMHgzOGQ4YzJjNFVMLCAweDRmZGZmMjUyVUwsIDB4ZDFiYjY3ZjFVTCwKKyAgICAweGE2YmM1NzY3VUwsIDB4M2ZiNTA2ZGRVTCwgMHg0OGIyMzY0YlVMLCAweGQ4MGQyYmRhVUwsIDB4YWYwYTFiNGNVTCwKKyAgICAweDM2MDM0YWY2VUwsIDB4NDEwNDdhNjBVTCwgMHhkZjYwZWZjM1VMLCAweGE4NjdkZjU1VUwsIDB4MzE2ZThlZWZVTCwKKyAgICAweDQ2NjliZTc5VUwsIDB4Y2I2MWIzOGNVTCwgMHhiYzY2ODMxYVVMLCAweDI1NmZkMmEwVUwsIDB4NTI2OGUyMzZVTCwKKyAgICAweGNjMGM3Nzk1VUwsIDB4YmIwYjQ3MDNVTCwgMHgyMjAyMTZiOVVMLCAweDU1MDUyNjJmVUwsIDB4YzViYTNiYmVVTCwKKyAgICAweGIyYmQwYjI4VUwsIDB4MmJiNDVhOTJVTCwgMHg1Y2IzNmEwNFVMLCAweGMyZDdmZmE3VUwsIDB4YjVkMGNmMzFVTCwKKyAgICAweDJjZDk5ZThiVUwsIDB4NWJkZWFlMWRVTCwgMHg5YjY0YzJiMFVMLCAweGVjNjNmMjI2VUwsIDB4NzU2YWEzOWNVTCwKKyAgICAweDAyNmQ5MzBhVUwsIDB4OWMwOTA2YTlVTCwgMHhlYjBlMzYzZlVMLCAweDcyMDc2Nzg1VUwsIDB4MDUwMDU3MTNVTCwKKyAgICAweDk1YmY0YTgyVUwsIDB4ZTJiODdhMTRVTCwgMHg3YmIxMmJhZVVMLCAweDBjYjYxYjM4VUwsIDB4OTJkMjhlOWJVTCwKKyAgICAweGU1ZDViZTBkVUwsIDB4N2NkY2VmYjdVTCwgMHgwYmRiZGYyMVVMLCAweDg2ZDNkMmQ0VUwsIDB4ZjFkNGUyNDJVTCwKKyAgICAweDY4ZGRiM2Y4VUwsIDB4MWZkYTgzNmVVTCwgMHg4MWJlMTZjZFVMLCAweGY2YjkyNjViVUwsIDB4NmZiMDc3ZTFVTCwKKyAgICAweDE4Yjc0Nzc3VUwsIDB4ODgwODVhZTZVTCwgMHhmZjBmNmE3MFVMLCAweDY2MDYzYmNhVUwsIDB4MTEwMTBiNWNVTCwKKyAgICAweDhmNjU5ZWZmVUwsIDB4Zjg2MmFlNjlVTCwgMHg2MTZiZmZkM1VMLCAweDE2NmNjZjQ1VUwsIDB4YTAwYWUyNzhVTCwKKyAgICAweGQ3MGRkMmVlVUwsIDB4NGUwNDgzNTRVTCwgMHgzOTAzYjNjMlVMLCAweGE3NjcyNjYxVUwsIDB4ZDA2MDE2ZjdVTCwKKyAgICAweDQ5Njk0NzRkVUwsIDB4M2U2ZTc3ZGJVTCwgMHhhZWQxNmE0YVVMLCAweGQ5ZDY1YWRjVUwsIDB4NDBkZjBiNjZVTCwKKyAgICAweDM3ZDgzYmYwVUwsIDB4YTliY2FlNTNVTCwgMHhkZWJiOWVjNVVMLCAweDQ3YjJjZjdmVUwsIDB4MzBiNWZmZTlVTCwKKyAgICAweGJkYmRmMjFjVUwsIDB4Y2FiYWMyOGFVTCwgMHg1M2IzOTMzMFVMLCAweDI0YjRhM2E2VUwsIDB4YmFkMDM2MDVVTCwKKyAgICAweGNkZDcwNjkzVUwsIDB4NTRkZTU3MjlVTCwgMHgyM2Q5NjdiZlVMLCAweGIzNjY3YTJlVUwsIDB4YzQ2MTRhYjhVTCwKKyAgICAweDVkNjgxYjAyVUwsIDB4MmE2ZjJiOTRVTCwgMHhiNDBiYmUzN1VMLCAweGMzMGM4ZWExVUwsIDB4NWEwNWRmMWJVTCwKKyAgICAweDJkMDJlZjhkVUwKKyNpZmRlZiBCWUZPVVIKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHgxOTFiMzE0MVVMLCAweDMyMzY2MjgyVUwsIDB4MmIyZDUzYzNVTCwgMHg2NDZjYzUwNFVMLAorICAgIDB4N2Q3N2Y0NDVVTCwgMHg1NjVhYTc4NlVMLCAweDRmNDE5NmM3VUwsIDB4YzhkOThhMDhVTCwgMHhkMWMyYmI0OVVMLAorICAgIDB4ZmFlZmU4OGFVTCwgMHhlM2Y0ZDljYlVMLCAweGFjYjU0ZjBjVUwsIDB4YjVhZTdlNGRVTCwgMHg5ZTgzMmQ4ZVVMLAorICAgIDB4ODc5ODFjY2ZVTCwgMHg0YWMyMTI1MVVMLCAweDUzZDkyMzEwVUwsIDB4NzhmNDcwZDNVTCwgMHg2MWVmNDE5MlVMLAorICAgIDB4MmVhZWQ3NTVVTCwgMHgzN2I1ZTYxNFVMLCAweDFjOThiNWQ3VUwsIDB4MDU4Mzg0OTZVTCwgMHg4MjFiOTg1OVVMLAorICAgIDB4OWIwMGE5MThVTCwgMHhiMDJkZmFkYlVMLCAweGE5MzZjYjlhVUwsIDB4ZTY3NzVkNWRVTCwgMHhmZjZjNmMxY1VMLAorICAgIDB4ZDQ0MTNmZGZVTCwgMHhjZDVhMGU5ZVVMLCAweDk1ODQyNGEyVUwsIDB4OGM5ZjE1ZTNVTCwgMHhhN2IyNDYyMFVMLAorICAgIDB4YmVhOTc3NjFVTCwgMHhmMWU4ZTFhNlVMLCAweGU4ZjNkMGU3VUwsIDB4YzNkZTgzMjRVTCwgMHhkYWM1YjI2NVVMLAorICAgIDB4NWQ1ZGFlYWFVTCwgMHg0NDQ2OWZlYlVMLCAweDZmNmJjYzI4VUwsIDB4NzY3MGZkNjlVTCwgMHgzOTMxNmJhZVVMLAorICAgIDB4MjAyYTVhZWZVTCwgMHgwYjA3MDkyY1VMLCAweDEyMWMzODZkVUwsIDB4ZGY0NjM2ZjNVTCwgMHhjNjVkMDdiMlVMLAorICAgIDB4ZWQ3MDU0NzFVTCwgMHhmNDZiNjUzMFVMLCAweGJiMmFmM2Y3VUwsIDB4YTIzMWMyYjZVTCwgMHg4OTFjOTE3NVVMLAorICAgIDB4OTAwN2EwMzRVTCwgMHgxNzlmYmNmYlVMLCAweDBlODQ4ZGJhVUwsIDB4MjVhOWRlNzlVTCwgMHgzY2IyZWYzOFVMLAorICAgIDB4NzNmMzc5ZmZVTCwgMHg2YWU4NDhiZVVMLCAweDQxYzUxYjdkVUwsIDB4NThkZTJhM2NVTCwgMHhmMDc5NGYwNVVMLAorICAgIDB4ZTk2MjdlNDRVTCwgMHhjMjRmMmQ4N1VMLCAweGRiNTQxY2M2VUwsIDB4OTQxNThhMDFVTCwgMHg4ZDBlYmI0MFVMLAorICAgIDB4YTYyM2U4ODNVTCwgMHhiZjM4ZDljMlVMLCAweDM4YTBjNTBkVUwsIDB4MjFiYmY0NGNVTCwgMHgwYTk2YTc4ZlVMLAorICAgIDB4MTM4ZDk2Y2VVTCwgMHg1Y2NjMDAwOVVMLCAweDQ1ZDczMTQ4VUwsIDB4NmVmYTYyOGJVTCwgMHg3N2UxNTNjYVVMLAorICAgIDB4YmFiYjVkNTRVTCwgMHhhM2EwNmMxNVVMLCAweDg4OGQzZmQ2VUwsIDB4OTE5NjBlOTdVTCwgMHhkZWQ3OTg1MFVMLAorICAgIDB4YzdjY2E5MTFVTCwgMHhlY2UxZmFkMlVMLCAweGY1ZmFjYjkzVUwsIDB4NzI2MmQ3NWNVTCwgMHg2Yjc5ZTYxZFVMLAorICAgIDB4NDA1NGI1ZGVVTCwgMHg1OTRmODQ5ZlVMLCAweDE2MGUxMjU4VUwsIDB4MGYxNTIzMTlVTCwgMHgyNDM4NzBkYVVMLAorICAgIDB4M2QyMzQxOWJVTCwgMHg2NWZkNmJhN1VMLCAweDdjZTY1YWU2VUwsIDB4NTdjYjA5MjVVTCwgMHg0ZWQwMzg2NFVMLAorICAgIDB4MDE5MWFlYTNVTCwgMHgxODhhOWZlMlVMLCAweDMzYTdjYzIxVUwsIDB4MmFiY2ZkNjBVTCwgMHhhZDI0ZTFhZlVMLAorICAgIDB4YjQzZmQwZWVVTCwgMHg5ZjEyODMyZFVMLCAweDg2MDliMjZjVUwsIDB4Yzk0ODI0YWJVTCwgMHhkMDUzMTVlYVVMLAorICAgIDB4ZmI3ZTQ2MjlVTCwgMHhlMjY1Nzc2OFVMLCAweDJmM2Y3OWY2VUwsIDB4MzYyNDQ4YjdVTCwgMHgxZDA5MWI3NFVMLAorICAgIDB4MDQxMjJhMzVVTCwgMHg0YjUzYmNmMlVMLCAweDUyNDg4ZGIzVUwsIDB4Nzk2NWRlNzBVTCwgMHg2MDdlZWYzMVVMLAorICAgIDB4ZTdlNmYzZmVVTCwgMHhmZWZkYzJiZlVMLCAweGQ1ZDA5MTdjVUwsIDB4Y2NjYmEwM2RVTCwgMHg4MzhhMzZmYVVMLAorICAgIDB4OWE5MTA3YmJVTCwgMHhiMWJjNTQ3OFVMLCAweGE4YTc2NTM5VUwsIDB4M2I4Mzk4NGJVTCwgMHgyMjk4YTkwYVVMLAorICAgIDB4MDliNWZhYzlVTCwgMHgxMGFlY2I4OFVMLCAweDVmZWY1ZDRmVUwsIDB4NDZmNDZjMGVVTCwgMHg2ZGQ5M2ZjZFVMLAorICAgIDB4NzRjMjBlOGNVTCwgMHhmMzVhMTI0M1VMLCAweGVhNDEyMzAyVUwsIDB4YzE2YzcwYzFVTCwgMHhkODc3NDE4MFVMLAorICAgIDB4OTczNmQ3NDdVTCwgMHg4ZTJkZTYwNlVMLCAweGE1MDBiNWM1VUwsIDB4YmMxYjg0ODRVTCwgMHg3MTQxOGExYVVMLAorICAgIDB4Njg1YWJiNWJVTCwgMHg0Mzc3ZTg5OFVMLCAweDVhNmNkOWQ5VUwsIDB4MTUyZDRmMWVVTCwgMHgwYzM2N2U1ZlVMLAorICAgIDB4MjcxYjJkOWNVTCwgMHgzZTAwMWNkZFVMLCAweGI5OTgwMDEyVUwsIDB4YTA4MzMxNTNVTCwgMHg4YmFlNjI5MFVMLAorICAgIDB4OTJiNTUzZDFVTCwgMHhkZGY0YzUxNlVMLCAweGM0ZWZmNDU3VUwsIDB4ZWZjMmE3OTRVTCwgMHhmNmQ5OTZkNVVMLAorICAgIDB4YWUwN2JjZTlVTCwgMHhiNzFjOGRhOFVMLCAweDljMzFkZTZiVUwsIDB4ODUyYWVmMmFVTCwgMHhjYTZiNzllZFVMLAorICAgIDB4ZDM3MDQ4YWNVTCwgMHhmODVkMWI2ZlVMLCAweGUxNDYyYTJlVUwsIDB4NjZkZTM2ZTFVTCwgMHg3ZmM1MDdhMFVMLAorICAgIDB4NTRlODU0NjNVTCwgMHg0ZGYzNjUyMlVMLCAweDAyYjJmM2U1VUwsIDB4MWJhOWMyYTRVTCwgMHgzMDg0OTE2N1VMLAorICAgIDB4Mjk5ZmEwMjZVTCwgMHhlNGM1YWViOFVMLCAweGZkZGU5ZmY5VUwsIDB4ZDZmM2NjM2FVTCwgMHhjZmU4ZmQ3YlVMLAorICAgIDB4ODBhOTZiYmNVTCwgMHg5OWIyNWFmZFVMLCAweGIyOWYwOTNlVUwsIDB4YWI4NDM4N2ZVTCwgMHgyYzFjMjRiMFVMLAorICAgIDB4MzUwNzE1ZjFVTCwgMHgxZTJhNDYzMlVMLCAweDA3MzE3NzczVUwsIDB4NDg3MGUxYjRVTCwgMHg1MTZiZDBmNVVMLAorICAgIDB4N2E0NjgzMzZVTCwgMHg2MzVkYjI3N1VMLCAweGNiZmFkNzRlVUwsIDB4ZDJlMWU2MGZVTCwgMHhmOWNjYjVjY1VMLAorICAgIDB4ZTBkNzg0OGRVTCwgMHhhZjk2MTI0YVVMLCAweGI2OGQyMzBiVUwsIDB4OWRhMDcwYzhVTCwgMHg4NGJiNDE4OVVMLAorICAgIDB4MDMyMzVkNDZVTCwgMHgxYTM4NmMwN1VMLCAweDMxMTUzZmM0VUwsIDB4MjgwZTBlODVVTCwgMHg2NzRmOTg0MlVMLAorICAgIDB4N2U1NGE5MDNVTCwgMHg1NTc5ZmFjMFVMLCAweDRjNjJjYjgxVUwsIDB4ODEzOGM1MWZVTCwgMHg5ODIzZjQ1ZVVMLAorICAgIDB4YjMwZWE3OWRVTCwgMHhhYTE1OTZkY1VMLCAweGU1NTQwMDFiVUwsIDB4ZmM0ZjMxNWFVTCwgMHhkNzYyNjI5OVVMLAorICAgIDB4Y2U3OTUzZDhVTCwgMHg0OWUxNGYxN1VMLCAweDUwZmE3ZTU2VUwsIDB4N2JkNzJkOTVVTCwgMHg2MmNjMWNkNFVMLAorICAgIDB4MmQ4ZDhhMTNVTCwgMHgzNDk2YmI1MlVMLCAweDFmYmJlODkxVUwsIDB4MDZhMGQ5ZDBVTCwgMHg1ZTdlZjNlY1VMLAorICAgIDB4NDc2NWMyYWRVTCwgMHg2YzQ4OTE2ZVVMLCAweDc1NTNhMDJmVUwsIDB4M2ExMjM2ZThVTCwgMHgyMzA5MDdhOVVMLAorICAgIDB4MDgyNDU0NmFVTCwgMHgxMTNmNjUyYlVMLCAweDk2YTc3OWU0VUwsIDB4OGZiYzQ4YTVVTCwgMHhhNDkxMWI2NlVMLAorICAgIDB4YmQ4YTJhMjdVTCwgMHhmMmNiYmNlMFVMLCAweGViZDA4ZGExVUwsIDB4YzBmZGRlNjJVTCwgMHhkOWU2ZWYyM1VMLAorICAgIDB4MTRiY2UxYmRVTCwgMHgwZGE3ZDBmY1VMLCAweDI2OGE4MzNmVUwsIDB4M2Y5MWIyN2VVTCwgMHg3MGQwMjRiOVVMLAorICAgIDB4NjljYjE1ZjhVTCwgMHg0MmU2NDYzYlVMLCAweDViZmQ3NzdhVUwsIDB4ZGM2NTZiYjVVTCwgMHhjNTdlNWFmNFVMLAorICAgIDB4ZWU1MzA5MzdVTCwgMHhmNzQ4Mzg3NlVMLCAweGI4MDlhZWIxVUwsIDB4YTExMjlmZjBVTCwgMHg4YTNmY2MzM1VMLAorICAgIDB4OTMyNGZkNzJVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDAxYzI2YTM3VUwsIDB4MDM4NGQ0NmVVTCwgMHgwMjQ2YmU1OVVMLCAweDA3MDlhOGRjVUwsCisgICAgMHgwNmNiYzJlYlVMLCAweDA0OGQ3Y2IyVUwsIDB4MDU0ZjE2ODVVTCwgMHgwZTEzNTFiOFVMLCAweDBmZDEzYjhmVUwsCisgICAgMHgwZDk3ODVkNlVMLCAweDBjNTVlZmUxVUwsIDB4MDkxYWY5NjRVTCwgMHgwOGQ4OTM1M1VMLCAweDBhOWUyZDBhVUwsCisgICAgMHgwYjVjNDczZFVMLCAweDFjMjZhMzcwVUwsIDB4MWRlNGM5NDdVTCwgMHgxZmEyNzcxZVVMLCAweDFlNjAxZDI5VUwsCisgICAgMHgxYjJmMGJhY1VMLCAweDFhZWQ2MTliVUwsIDB4MThhYmRmYzJVTCwgMHgxOTY5YjVmNVVMLCAweDEyMzVmMmM4VUwsCisgICAgMHgxM2Y3OThmZlVMLCAweDExYjEyNmE2VUwsIDB4MTA3MzRjOTFVTCwgMHgxNTNjNWExNFVMLCAweDE0ZmUzMDIzVUwsCisgICAgMHgxNmI4OGU3YVVMLCAweDE3N2FlNDRkVUwsIDB4Mzg0ZDQ2ZTBVTCwgMHgzOThmMmNkN1VMLCAweDNiYzk5MjhlVUwsCisgICAgMHgzYTBiZjhiOVVMLCAweDNmNDRlZTNjVUwsIDB4M2U4Njg0MGJVTCwgMHgzY2MwM2E1MlVMLCAweDNkMDI1MDY1VUwsCisgICAgMHgzNjVlMTc1OFVMLCAweDM3OWM3ZDZmVUwsIDB4MzVkYWMzMzZVTCwgMHgzNDE4YTkwMVVMLCAweDMxNTdiZjg0VUwsCisgICAgMHgzMDk1ZDViM1VMLCAweDMyZDM2YmVhVUwsIDB4MzMxMTAxZGRVTCwgMHgyNDZiZTU5MFVMLCAweDI1YTk4ZmE3VUwsCisgICAgMHgyN2VmMzFmZVVMLCAweDI2MmQ1YmM5VUwsIDB4MjM2MjRkNGNVTCwgMHgyMmEwMjc3YlVMLCAweDIwZTY5OTIyVUwsCisgICAgMHgyMTI0ZjMxNVVMLCAweDJhNzhiNDI4VUwsIDB4MmJiYWRlMWZVTCwgMHgyOWZjNjA0NlVMLCAweDI4M2UwYTcxVUwsCisgICAgMHgyZDcxMWNmNFVMLCAweDJjYjM3NmMzVUwsIDB4MmVmNWM4OWFVTCwgMHgyZjM3YTJhZFVMLCAweDcwOWE4ZGMwVUwsCisgICAgMHg3MTU4ZTdmN1VMLCAweDczMWU1OWFlVUwsIDB4NzJkYzMzOTlVTCwgMHg3NzkzMjUxY1VMLCAweDc2NTE0ZjJiVUwsCisgICAgMHg3NDE3ZjE3MlVMLCAweDc1ZDU5YjQ1VUwsIDB4N2U4OWRjNzhVTCwgMHg3ZjRiYjY0ZlVMLCAweDdkMGQwODE2VUwsCisgICAgMHg3Y2NmNjIyMVVMLCAweDc5ODA3NGE0VUwsIDB4Nzg0MjFlOTNVTCwgMHg3YTA0YTBjYVVMLCAweDdiYzZjYWZkVUwsCisgICAgMHg2Y2JjMmViMFVMLCAweDZkN2U0NDg3VUwsIDB4NmYzOGZhZGVVTCwgMHg2ZWZhOTBlOVVMLCAweDZiYjU4NjZjVUwsCisgICAgMHg2YTc3ZWM1YlVMLCAweDY4MzE1MjAyVUwsIDB4NjlmMzM4MzVVTCwgMHg2MmFmN2YwOFVMLCAweDYzNmQxNTNmVUwsCisgICAgMHg2MTJiYWI2NlVMLCAweDYwZTljMTUxVUwsIDB4NjVhNmQ3ZDRVTCwgMHg2NDY0YmRlM1VMLCAweDY2MjIwM2JhVUwsCisgICAgMHg2N2UwNjk4ZFVMLCAweDQ4ZDdjYjIwVUwsIDB4NDkxNWExMTdVTCwgMHg0YjUzMWY0ZVVMLCAweDRhOTE3NTc5VUwsCisgICAgMHg0ZmRlNjNmY1VMLCAweDRlMWMwOWNiVUwsIDB4NGM1YWI3OTJVTCwgMHg0ZDk4ZGRhNVVMLCAweDQ2YzQ5YTk4VUwsCisgICAgMHg0NzA2ZjBhZlVMLCAweDQ1NDA0ZWY2VUwsIDB4NDQ4MjI0YzFVTCwgMHg0MWNkMzI0NFVMLCAweDQwMGY1ODczVUwsCisgICAgMHg0MjQ5ZTYyYVVMLCAweDQzOGI4YzFkVUwsIDB4NTRmMTY4NTBVTCwgMHg1NTMzMDI2N1VMLCAweDU3NzViYzNlVUwsCisgICAgMHg1NmI3ZDYwOVVMLCAweDUzZjhjMDhjVUwsIDB4NTIzYWFhYmJVTCwgMHg1MDdjMTRlMlVMLCAweDUxYmU3ZWQ1VUwsCisgICAgMHg1YWUyMzllOFVMLCAweDViMjA1M2RmVUwsIDB4NTk2NmVkODZVTCwgMHg1OGE0ODdiMVVMLCAweDVkZWI5MTM0VUwsCisgICAgMHg1YzI5ZmIwM1VMLCAweDVlNmY0NTVhVUwsIDB4NWZhZDJmNmRVTCwgMHhlMTM1MWI4MFVMLCAweGUwZjc3MWI3VUwsCisgICAgMHhlMmIxY2ZlZVVMLCAweGUzNzNhNWQ5VUwsIDB4ZTYzY2IzNWNVTCwgMHhlN2ZlZDk2YlVMLCAweGU1Yjg2NzMyVUwsCisgICAgMHhlNDdhMGQwNVVMLCAweGVmMjY0YTM4VUwsIDB4ZWVlNDIwMGZVTCwgMHhlY2EyOWU1NlVMLCAweGVkNjBmNDYxVUwsCisgICAgMHhlODJmZTJlNFVMLCAweGU5ZWQ4OGQzVUwsIDB4ZWJhYjM2OGFVTCwgMHhlYTY5NWNiZFVMLCAweGZkMTNiOGYwVUwsCisgICAgMHhmY2QxZDJjN1VMLCAweGZlOTc2YzllVUwsIDB4ZmY1NTA2YTlVTCwgMHhmYTFhMTAyY1VMLCAweGZiZDg3YTFiVUwsCisgICAgMHhmOTllYzQ0MlVMLCAweGY4NWNhZTc1VUwsIDB4ZjMwMGU5NDhVTCwgMHhmMmMyODM3ZlVMLCAweGYwODQzZDI2VUwsCisgICAgMHhmMTQ2NTcxMVVMLCAweGY0MDk0MTk0VUwsIDB4ZjVjYjJiYTNVTCwgMHhmNzhkOTVmYVVMLCAweGY2NGZmZmNkVUwsCisgICAgMHhkOTc4NWQ2MFVMLCAweGQ4YmEzNzU3VUwsIDB4ZGFmYzg5MGVVTCwgMHhkYjNlZTMzOVVMLCAweGRlNzFmNWJjVUwsCisgICAgMHhkZmIzOWY4YlVMLCAweGRkZjUyMWQyVUwsIDB4ZGMzNzRiZTVVTCwgMHhkNzZiMGNkOFVMLCAweGQ2YTk2NmVmVUwsCisgICAgMHhkNGVmZDhiNlVMLCAweGQ1MmRiMjgxVUwsIDB4ZDA2MmE0MDRVTCwgMHhkMWEwY2UzM1VMLCAweGQzZTY3MDZhVUwsCisgICAgMHhkMjI0MWE1ZFVMLCAweGM1NWVmZTEwVUwsIDB4YzQ5Yzk0MjdVTCwgMHhjNmRhMmE3ZVVMLCAweGM3MTg0MDQ5VUwsCisgICAgMHhjMjU3NTZjY1VMLCAweGMzOTUzY2ZiVUwsIDB4YzFkMzgyYTJVTCwgMHhjMDExZTg5NVVMLCAweGNiNGRhZmE4VUwsCisgICAgMHhjYThmYzU5ZlVMLCAweGM4Yzk3YmM2VUwsIDB4YzkwYjExZjFVTCwgMHhjYzQ0MDc3NFVMLCAweGNkODY2ZDQzVUwsCisgICAgMHhjZmMwZDMxYVVMLCAweGNlMDJiOTJkVUwsIDB4OTFhZjk2NDBVTCwgMHg5MDZkZmM3N1VMLCAweDkyMmI0MjJlVUwsCisgICAgMHg5M2U5MjgxOVVMLCAweDk2YTYzZTljVUwsIDB4OTc2NDU0YWJVTCwgMHg5NTIyZWFmMlVMLCAweDk0ZTA4MGM1VUwsCisgICAgMHg5ZmJjYzdmOFVMLCAweDllN2VhZGNmVUwsIDB4OWMzODEzOTZVTCwgMHg5ZGZhNzlhMVVMLCAweDk4YjU2ZjI0VUwsCisgICAgMHg5OTc3MDUxM1VMLCAweDliMzFiYjRhVUwsIDB4OWFmM2QxN2RVTCwgMHg4ZDg5MzUzMFVMLCAweDhjNGI1ZjA3VUwsCisgICAgMHg4ZTBkZTE1ZVVMLCAweDhmY2Y4YjY5VUwsIDB4OGE4MDlkZWNVTCwgMHg4YjQyZjdkYlVMLCAweDg5MDQ0OTgyVUwsCisgICAgMHg4OGM2MjNiNVVMLCAweDgzOWE2NDg4VUwsIDB4ODI1ODBlYmZVTCwgMHg4MDFlYjBlNlVMLCAweDgxZGNkYWQxVUwsCisgICAgMHg4NDkzY2M1NFVMLCAweDg1NTFhNjYzVUwsIDB4ODcxNzE4M2FVTCwgMHg4NmQ1NzIwZFVMLCAweGE5ZTJkMGEwVUwsCisgICAgMHhhODIwYmE5N1VMLCAweGFhNjYwNGNlVUwsIDB4YWJhNDZlZjlVTCwgMHhhZWViNzg3Y1VMLCAweGFmMjkxMjRiVUwsCisgICAgMHhhZDZmYWMxMlVMLCAweGFjYWRjNjI1VUwsIDB4YTdmMTgxMThVTCwgMHhhNjMzZWIyZlVMLCAweGE0NzU1NTc2VUwsCisgICAgMHhhNWI3M2Y0MVVMLCAweGEwZjgyOWM0VUwsIDB4YTEzYTQzZjNVTCwgMHhhMzdjZmRhYVVMLCAweGEyYmU5NzlkVUwsCisgICAgMHhiNWM0NzNkMFVMLCAweGI0MDYxOWU3VUwsIDB4YjY0MGE3YmVVTCwgMHhiNzgyY2Q4OVVMLCAweGIyY2RkYjBjVUwsCisgICAgMHhiMzBmYjEzYlVMLCAweGIxNDkwZjYyVUwsIDB4YjA4YjY1NTVVTCwgMHhiYmQ3MjI2OFVMLCAweGJhMTU0ODVmVUwsCisgICAgMHhiODUzZjYwNlVMLCAweGI5OTE5YzMxVUwsIDB4YmNkZThhYjRVTCwgMHhiZDFjZTA4M1VMLCAweGJmNWE1ZWRhVUwsCisgICAgMHhiZTk4MzRlZFVMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4YjhiYzY3NjVVTCwgMHhhYTA5Yzg4YlVMLCAweDEyYjVhZmVlVUwsIDB4OGY2Mjk3NTdVTCwKKyAgICAweDM3ZGVmMDMyVUwsIDB4MjU2YjVmZGNVTCwgMHg5ZGQ3MzhiOVVMLCAweGM1YjQyOGVmVUwsIDB4N2QwODRmOGFVTCwKKyAgICAweDZmYmRlMDY0VUwsIDB4ZDcwMTg3MDFVTCwgMHg0YWQ2YmZiOFVMLCAweGYyNmFkOGRkVUwsIDB4ZTBkZjc3MzNVTCwKKyAgICAweDU4NjMxMDU2VUwsIDB4NTAxOTU3OWZVTCwgMHhlOGE1MzBmYVVMLCAweGZhMTA5ZjE0VUwsIDB4NDJhY2Y4NzFVTCwKKyAgICAweGRmN2JjMGM4VUwsIDB4NjdjN2E3YWRVTCwgMHg3NTcyMDg0M1VMLCAweGNkY2U2ZjI2VUwsIDB4OTVhZDdmNzBVTCwKKyAgICAweDJkMTExODE1VUwsIDB4M2ZhNGI3ZmJVTCwgMHg4NzE4ZDA5ZVVMLCAweDFhY2ZlODI3VUwsIDB4YTI3MzhmNDJVTCwKKyAgICAweGIwYzYyMGFjVUwsIDB4MDg3YTQ3YzlVTCwgMHhhMDMyYWYzZVVMLCAweDE4OGVjODViVUwsIDB4MGEzYjY3YjVVTCwKKyAgICAweGIyODcwMGQwVUwsIDB4MmY1MDM4NjlVTCwgMHg5N2VjNWYwY1VMLCAweDg1NTlmMGUyVUwsIDB4M2RlNTk3ODdVTCwKKyAgICAweDY1ODY4N2QxVUwsIDB4ZGQzYWUwYjRVTCwgMHhjZjhmNGY1YVVMLCAweDc3MzMyODNmVUwsIDB4ZWFlNDEwODZVTCwKKyAgICAweDUyNTg3N2UzVUwsIDB4NDBlZGQ4MGRVTCwgMHhmODUxYmY2OFVMLCAweGYwMmJmOGExVUwsIDB4NDg5NzlmYzRVTCwKKyAgICAweDVhMjIzMDJhVUwsIDB4ZTI5ZTU3NGZVTCwgMHg3ZjQ5NmZmNlVMLCAweGM3ZjUwODkzVUwsIDB4ZDU0MGE3N2RVTCwKKyAgICAweDZkZmNjMDE4VUwsIDB4MzU5ZmQwNGVVTCwgMHg4ZDIzYjcyYlVMLCAweDlmOTYxOGM1VUwsIDB4MjcyYTdmYTBVTCwKKyAgICAweGJhZmQ0NzE5VUwsIDB4MDI0MTIwN2NVTCwgMHgxMGY0OGY5MlVMLCAweGE4NDhlOGY3VUwsIDB4OWIxNDU4M2RVTCwKKyAgICAweDIzYTgzZjU4VUwsIDB4MzExZDkwYjZVTCwgMHg4OWExZjdkM1VMLCAweDE0NzZjZjZhVUwsIDB4YWNjYWE4MGZVTCwKKyAgICAweGJlN2YwN2UxVUwsIDB4MDZjMzYwODRVTCwgMHg1ZWEwNzBkMlVMLCAweGU2MWMxN2I3VUwsIDB4ZjRhOWI4NTlVTCwKKyAgICAweDRjMTVkZjNjVUwsIDB4ZDFjMmU3ODVVTCwgMHg2OTdlODBlMFVMLCAweDdiY2IyZjBlVUwsIDB4YzM3NzQ4NmJVTCwKKyAgICAweGNiMGQwZmEyVUwsIDB4NzNiMTY4YzdVTCwgMHg2MTA0YzcyOVVMLCAweGQ5YjhhMDRjVUwsIDB4NDQ2Zjk4ZjVVTCwKKyAgICAweGZjZDNmZjkwVUwsIDB4ZWU2NjUwN2VVTCwgMHg1NmRhMzcxYlVMLCAweDBlYjkyNzRkVUwsIDB4YjYwNTQwMjhVTCwKKyAgICAweGE0YjBlZmM2VUwsIDB4MWMwYzg4YTNVTCwgMHg4MWRiYjAxYVVMLCAweDM5NjdkNzdmVUwsIDB4MmJkMjc4OTFVTCwKKyAgICAweDkzNmUxZmY0VUwsIDB4M2IyNmY3MDNVTCwgMHg4MzlhOTA2NlVMLCAweDkxMmYzZjg4VUwsIDB4Mjk5MzU4ZWRVTCwKKyAgICAweGI0NDQ2MDU0VUwsIDB4MGNmODA3MzFVTCwgMHgxZTRkYThkZlVMLCAweGE2ZjFjZmJhVUwsIDB4ZmU5MmRmZWNVTCwKKyAgICAweDQ2MmViODg5VUwsIDB4NTQ5YjE3NjdVTCwgMHhlYzI3NzAwMlVMLCAweDcxZjA0OGJiVUwsIDB4Yzk0YzJmZGVVTCwKKyAgICAweGRiZjk4MDMwVUwsIDB4NjM0NWU3NTVVTCwgMHg2YjNmYTA5Y1VMLCAweGQzODNjN2Y5VUwsIDB4YzEzNjY4MTdVTCwKKyAgICAweDc5OGEwZjcyVUwsIDB4ZTQ1ZDM3Y2JVTCwgMHg1Y2UxNTBhZVVMLCAweDRlNTRmZjQwVUwsIDB4ZjZlODk4MjVVTCwKKyAgICAweGFlOGI4ODczVUwsIDB4MTYzN2VmMTZVTCwgMHgwNDgyNDBmOFVMLCAweGJjM2UyNzlkVUwsIDB4MjFlOTFmMjRVTCwKKyAgICAweDk5NTU3ODQxVUwsIDB4OGJlMGQ3YWZVTCwgMHgzMzVjYjBjYVVMLCAweGVkNTliNjNiVUwsIDB4NTVlNWQxNWVVTCwKKyAgICAweDQ3NTA3ZWIwVUwsIDB4ZmZlYzE5ZDVVTCwgMHg2MjNiMjE2Y1VMLCAweGRhODc0NjA5VUwsIDB4YzgzMmU5ZTdVTCwKKyAgICAweDcwOGU4ZTgyVUwsIDB4MjhlZDllZDRVTCwgMHg5MDUxZjliMVVMLCAweDgyZTQ1NjVmVUwsIDB4M2E1ODMxM2FVTCwKKyAgICAweGE3OGYwOTgzVUwsIDB4MWYzMzZlZTZVTCwgMHgwZDg2YzEwOFVMLCAweGI1M2FhNjZkVUwsIDB4YmQ0MGUxYTRVTCwKKyAgICAweDA1ZmM4NmMxVUwsIDB4MTc0OTI5MmZVTCwgMHhhZmY1NGU0YVVMLCAweDMyMjI3NmYzVUwsIDB4OGE5ZTExOTZVTCwKKyAgICAweDk4MmJiZTc4VUwsIDB4MjA5N2Q5MWRVTCwgMHg3OGY0Yzk0YlVMLCAweGMwNDhhZTJlVUwsIDB4ZDJmZDAxYzBVTCwKKyAgICAweDZhNDE2NmE1VUwsIDB4Zjc5NjVlMWNVTCwgMHg0ZjJhMzk3OVVMLCAweDVkOWY5Njk3VUwsIDB4ZTUyM2YxZjJVTCwKKyAgICAweDRkNmIxOTA1VUwsIDB4ZjVkNzdlNjBVTCwgMHhlNzYyZDE4ZVVMLCAweDVmZGViNmViVUwsIDB4YzIwOThlNTJVTCwKKyAgICAweDdhYjVlOTM3VUwsIDB4NjgwMDQ2ZDlVTCwgMHhkMGJjMjFiY1VMLCAweDg4ZGYzMWVhVUwsIDB4MzA2MzU2OGZVTCwKKyAgICAweDIyZDZmOTYxVUwsIDB4OWE2YTllMDRVTCwgMHgwN2JkYTZiZFVMLCAweGJmMDFjMWQ4VUwsIDB4YWRiNDZlMzZVTCwKKyAgICAweDE1MDgwOTUzVUwsIDB4MWQ3MjRlOWFVTCwgMHhhNWNlMjlmZlVMLCAweGI3N2I4NjExVUwsIDB4MGZjN2UxNzRVTCwKKyAgICAweDkyMTBkOWNkVUwsIDB4MmFhY2JlYThVTCwgMHgzODE5MTE0NlVMLCAweDgwYTU3NjIzVUwsIDB4ZDhjNjY2NzVVTCwKKyAgICAweDYwN2EwMTEwVUwsIDB4NzJjZmFlZmVVTCwgMHhjYTczYzk5YlVMLCAweDU3YTRmMTIyVUwsIDB4ZWYxODk2NDdVTCwKKyAgICAweGZkYWQzOWE5VUwsIDB4NDUxMTVlY2NVTCwgMHg3NjRkZWUwNlVMLCAweGNlZjE4OTYzVUwsIDB4ZGM0NDI2OGRVTCwKKyAgICAweDY0Zjg0MWU4VUwsIDB4ZjkyZjc5NTFVTCwgMHg0MTkzMWUzNFVMLCAweDUzMjZiMWRhVUwsIDB4ZWI5YWQ2YmZVTCwKKyAgICAweGIzZjljNmU5VUwsIDB4MGI0NWExOGNVTCwgMHgxOWYwMGU2MlVMLCAweGExNGM2OTA3VUwsIDB4M2M5YjUxYmVVTCwKKyAgICAweDg0MjczNmRiVUwsIDB4OTY5Mjk5MzVVTCwgMHgyZTJlZmU1MFVMLCAweDI2NTRiOTk5VUwsIDB4OWVlOGRlZmNVTCwKKyAgICAweDhjNWQ3MTEyVUwsIDB4MzRlMTE2NzdVTCwgMHhhOTM2MmVjZVVMLCAweDExOGE0OWFiVUwsIDB4MDMzZmU2NDVVTCwKKyAgICAweGJiODM4MTIwVUwsIDB4ZTNlMDkxNzZVTCwgMHg1YjVjZjYxM1VMLCAweDQ5ZTk1OWZkVUwsIDB4ZjE1NTNlOThVTCwKKyAgICAweDZjODIwNjIxVUwsIDB4ZDQzZTYxNDRVTCwgMHhjNjhiY2VhYVVMLCAweDdlMzdhOWNmVUwsIDB4ZDY3ZjQxMzhVTCwKKyAgICAweDZlYzMyNjVkVUwsIDB4N2M3Njg5YjNVTCwgMHhjNGNhZWVkNlVMLCAweDU5MWRkNjZmVUwsIDB4ZTFhMWIxMGFVTCwKKyAgICAweGYzMTQxZWU0VUwsIDB4NGJhODc5ODFVTCwgMHgxM2NiNjlkN1VMLCAweGFiNzcwZWIyVUwsIDB4YjljMmExNWNVTCwKKyAgICAweDAxN2VjNjM5VUwsIDB4OWNhOWZlODBVTCwgMHgyNDE1OTllNVVMLCAweDM2YTAzNjBiVUwsIDB4OGUxYzUxNmVVTCwKKyAgICAweDg2NjYxNmE3VUwsIDB4M2VkYTcxYzJVTCwgMHgyYzZmZGUyY1VMLCAweDk0ZDNiOTQ5VUwsIDB4MDkwNDgxZjBVTCwKKyAgICAweGIxYjhlNjk1VUwsIDB4YTMwZDQ5N2JVTCwgMHgxYmIxMmUxZVVMLCAweDQzZDIzZTQ4VUwsIDB4ZmI2ZTU5MmRVTCwKKyAgICAweGU5ZGJmNmMzVUwsIDB4NTE2NzkxYTZVTCwgMHhjY2IwYTkxZlVMLCAweDc0MGNjZTdhVUwsIDB4NjZiOTYxOTRVTCwKKyAgICAweGRlMDUwNmYxVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHg5NjMwMDc3N1VMLCAweDJjNjEwZWVlVUwsIDB4YmE1MTA5OTlVTCwgMHgxOWM0NmQwN1VMLAorICAgIDB4OGZmNDZhNzBVTCwgMHgzNWE1NjNlOVVMLCAweGEzOTU2NDllVUwsIDB4MzI4OGRiMGVVTCwgMHhhNGI4ZGM3OVVMLAorICAgIDB4MWVlOWQ1ZTBVTCwgMHg4OGQ5ZDI5N1VMLCAweDJiNGNiNjA5VUwsIDB4YmQ3Y2IxN2VVTCwgMHgwNzJkYjhlN1VMLAorICAgIDB4OTExZGJmOTBVTCwgMHg2NDEwYjcxZFVMLCAweGYyMjBiMDZhVUwsIDB4NDg3MWI5ZjNVTCwgMHhkZTQxYmU4NFVMLAorICAgIDB4N2RkNGRhMWFVTCwgMHhlYmU0ZGQ2ZFVMLCAweDUxYjVkNGY0VUwsIDB4Yzc4NWQzODNVTCwgMHg1Njk4NmMxM1VMLAorICAgIDB4YzBhODZiNjRVTCwgMHg3YWY5NjJmZFVMLCAweGVjYzk2NThhVUwsIDB4NGY1YzAxMTRVTCwgMHhkOTZjMDY2M1VMLAorICAgIDB4NjMzZDBmZmFVTCwgMHhmNTBkMDg4ZFVMLCAweGM4MjA2ZTNiVUwsIDB4NWUxMDY5NGNVTCwgMHhlNDQxNjBkNVVMLAorICAgIDB4NzI3MTY3YTJVTCwgMHhkMWU0MDMzY1VMLCAweDQ3ZDQwNDRiVUwsIDB4ZmQ4NTBkZDJVTCwgMHg2YmI1MGFhNVVMLAorICAgIDB4ZmFhOGI1MzVVTCwgMHg2Yzk4YjI0MlVMLCAweGQ2YzliYmRiVUwsIDB4NDBmOWJjYWNVTCwgMHhlMzZjZDgzMlVMLAorICAgIDB4NzU1Y2RmNDVVTCwgMHhjZjBkZDZkY1VMLCAweDU5M2RkMWFiVUwsIDB4YWMzMGQ5MjZVTCwgMHgzYTAwZGU1MVVMLAorICAgIDB4ODA1MWQ3YzhVTCwgMHgxNjYxZDBiZlVMLCAweGI1ZjRiNDIxVUwsIDB4MjNjNGIzNTZVTCwgMHg5OTk1YmFjZlVMLAorICAgIDB4MGZhNWJkYjhVTCwgMHg5ZWI4MDIyOFVMLCAweDA4ODgwNTVmVUwsIDB4YjJkOTBjYzZVTCwgMHgyNGU5MGJiMVVMLAorICAgIDB4ODc3YzZmMmZVTCwgMHgxMTRjNjg1OFVMLCAweGFiMWQ2MWMxVUwsIDB4M2QyZDY2YjZVTCwgMHg5MDQxZGM3NlVMLAorICAgIDB4MDY3MWRiMDFVTCwgMHhiYzIwZDI5OFVMLCAweDJhMTBkNWVmVUwsIDB4ODk4NWIxNzFVTCwgMHgxZmI1YjYwNlVMLAorICAgIDB4YTVlNGJmOWZVTCwgMHgzM2Q0YjhlOFVMLCAweGEyYzkwNzc4VUwsIDB4MzRmOTAwMGZVTCwgMHg4ZWE4MDk5NlVMLAorICAgIDB4MTg5ODBlZTFVTCwgMHhiYjBkNmE3ZlVMLCAweDJkM2Q2ZDA4VUwsIDB4OTc2YzY0OTFVTCwgMHgwMTVjNjNlNlVMLAorICAgIDB4ZjQ1MTZiNmJVTCwgMHg2MjYxNmMxY1VMLCAweGQ4MzA2NTg1VUwsIDB4NGUwMDYyZjJVTCwgMHhlZDk1MDY2Y1VMLAorICAgIDB4N2JhNTAxMWJVTCwgMHhjMWY0MDg4MlVMLCAweDU3YzQwZmY1VUwsIDB4YzZkOWIwNjVVTCwgMHg1MGU5YjcxMlVMLAorICAgIDB4ZWFiOGJlOGJVTCwgMHg3Yzg4YjlmY1VMLCAweGRmMWRkZDYyVUwsIDB4NDkyZGRhMTVVTCwgMHhmMzdjZDM4Y1VMLAorICAgIDB4NjU0Y2Q0ZmJVTCwgMHg1ODYxYjI0ZFVMLCAweGNlNTFiNTNhVUwsIDB4NzQwMGJjYTNVTCwgMHhlMjMwYmJkNFVMLAorICAgIDB4NDFhNWRmNGFVTCwgMHhkNzk1ZDgzZFVMLCAweDZkYzRkMWE0VUwsIDB4ZmJmNGQ2ZDNVTCwgMHg2YWU5Njk0M1VMLAorICAgIDB4ZmNkOTZlMzRVTCwgMHg0Njg4NjdhZFVMLCAweGQwYjg2MGRhVUwsIDB4NzMyZDA0NDRVTCwgMHhlNTFkMDMzM1VMLAorICAgIDB4NWY0YzBhYWFVTCwgMHhjOTdjMGRkZFVMLCAweDNjNzEwNTUwVUwsIDB4YWE0MTAyMjdVTCwgMHgxMDEwMGJiZVVMLAorICAgIDB4ODYyMDBjYzlVTCwgMHgyNWI1Njg1N1VMLCAweGIzODU2ZjIwVUwsIDB4MDlkNDY2YjlVTCwgMHg5ZmU0NjFjZVVMLAorICAgIDB4MGVmOWRlNWVVTCwgMHg5OGM5ZDkyOVVMLCAweDIyOThkMGIwVUwsIDB4YjRhOGQ3YzdVTCwgMHgxNzNkYjM1OVVMLAorICAgIDB4ODEwZGI0MmVVTCwgMHgzYjVjYmRiN1VMLCAweGFkNmNiYWMwVUwsIDB4MjA4M2I4ZWRVTCwgMHhiNmIzYmY5YVVMLAorICAgIDB4MGNlMmI2MDNVTCwgMHg5YWQyYjE3NFVMLCAweDM5NDdkNWVhVUwsIDB4YWY3N2QyOWRVTCwgMHgxNTI2ZGIwNFVMLAorICAgIDB4ODMxNmRjNzNVTCwgMHgxMjBiNjNlM1VMLCAweDg0M2I2NDk0VUwsIDB4M2U2YTZkMGRVTCwgMHhhODVhNmE3YVVMLAorICAgIDB4MGJjZjBlZTRVTCwgMHg5ZGZmMDk5M1VMLCAweDI3YWUwMDBhVUwsIDB4YjE5ZTA3N2RVTCwgMHg0NDkzMGZmMFVMLAorICAgIDB4ZDJhMzA4ODdVTCwgMHg2OGYyMDExZVVMLCAweGZlYzIwNjY5VUwsIDB4NWQ1NzYyZjdVTCwgMHhjYjY3NjU4MFVMLAorICAgIDB4NzEzNjZjMTlVTCwgMHhlNzA2NmI2ZVVMLCAweDc2MWJkNGZlVUwsIDB4ZTAyYmQzODlVTCwgMHg1YTdhZGExMFVMLAorICAgIDB4Y2M0YWRkNjdVTCwgMHg2ZmRmYjlmOVVMLCAweGY5ZWZiZThlVUwsIDB4NDNiZWI3MTdVTCwgMHhkNThlYjA2MFVMLAorICAgIDB4ZThhM2Q2ZDZVTCwgMHg3ZTkzZDFhMVVMLCAweGM0YzJkODM4VUwsIDB4NTJmMmRmNGZVTCwgMHhmMTY3YmJkMVVMLAorICAgIDB4Njc1N2JjYTZVTCwgMHhkZDA2YjUzZlVMLCAweDRiMzZiMjQ4VUwsIDB4ZGEyYjBkZDhVTCwgMHg0YzFiMGFhZlVMLAorICAgIDB4ZjY0YTAzMzZVTCwgMHg2MDdhMDQ0MVVMLCAweGMzZWY2MGRmVUwsIDB4NTVkZjY3YThVTCwgMHhlZjhlNmUzMVVMLAorICAgIDB4NzliZTY5NDZVTCwgMHg4Y2IzNjFjYlVMLCAweDFhODM2NmJjVUwsIDB4YTBkMjZmMjVVTCwgMHgzNmUyNjg1MlVMLAorICAgIDB4OTU3NzBjY2NVTCwgMHgwMzQ3MGJiYlVMLCAweGI5MTYwMjIyVUwsIDB4MmYyNjA1NTVVTCwgMHhiZTNiYmFjNVVMLAorICAgIDB4MjgwYmJkYjJVTCwgMHg5MjVhYjQyYlVMLCAweDA0NmFiMzVjVUwsIDB4YTdmZmQ3YzJVTCwgMHgzMWNmZDBiNVVMLAorICAgIDB4OGI5ZWQ5MmNVTCwgMHgxZGFlZGU1YlVMLCAweGIwYzI2NDliVUwsIDB4MjZmMjYzZWNVTCwgMHg5Y2EzNmE3NVVMLAorICAgIDB4MGE5MzZkMDJVTCwgMHhhOTA2MDk5Y1VMLCAweDNmMzYwZWViVUwsIDB4ODU2NzA3NzJVTCwgMHgxMzU3MDAwNVVMLAorICAgIDB4ODI0YWJmOTVVTCwgMHgxNDdhYjhlMlVMLCAweGFlMmJiMTdiVUwsIDB4MzgxYmI2MGNVTCwgMHg5YjhlZDI5MlVMLAorICAgIDB4MGRiZWQ1ZTVVTCwgMHhiN2VmZGM3Y1VMLCAweDIxZGZkYjBiVUwsIDB4ZDRkMmQzODZVTCwgMHg0MmUyZDRmMVVMLAorICAgIDB4ZjhiM2RkNjhVTCwgMHg2ZTgzZGExZlVMLCAweGNkMTZiZTgxVUwsIDB4NWIyNmI5ZjZVTCwgMHhlMTc3YjA2ZlVMLAorICAgIDB4Nzc0N2I3MThVTCwgMHhlNjVhMDg4OFVMLCAweDcwNmEwZmZmVUwsIDB4Y2EzYjA2NjZVTCwgMHg1YzBiMDExMVVMLAorICAgIDB4ZmY5ZTY1OGZVTCwgMHg2OWFlNjJmOFVMLCAweGQzZmY2YjYxVUwsIDB4NDVjZjZjMTZVTCwgMHg3OGUyMGFhMFVMLAorICAgIDB4ZWVkMjBkZDdVTCwgMHg1NDgzMDQ0ZVVMLCAweGMyYjMwMzM5VUwsIDB4NjEyNjY3YTdVTCwgMHhmNzE2NjBkMFVMLAorICAgIDB4NGQ0NzY5NDlVTCwgMHhkYjc3NmUzZVVMLCAweDRhNmFkMWFlVUwsIDB4ZGM1YWQ2ZDlVTCwgMHg2NjBiZGY0MFVMLAorICAgIDB4ZjAzYmQ4MzdVTCwgMHg1M2FlYmNhOVVMLCAweGM1OWViYmRlVUwsIDB4N2ZjZmIyNDdVTCwgMHhlOWZmYjUzMFVMLAorICAgIDB4MWNmMmJkYmRVTCwgMHg4YWMyYmFjYVVMLCAweDMwOTNiMzUzVUwsIDB4YTZhM2I0MjRVTCwgMHgwNTM2ZDBiYVVMLAorICAgIDB4OTMwNmQ3Y2RVTCwgMHgyOTU3ZGU1NFVMLCAweGJmNjdkOTIzVUwsIDB4MmU3YTY2YjNVTCwgMHhiODRhNjFjNFVMLAorICAgIDB4MDIxYjY4NWRVTCwgMHg5NDJiNmYyYVVMLCAweDM3YmUwYmI0VUwsIDB4YTE4ZTBjYzNVTCwgMHgxYmRmMDU1YVVMLAorICAgIDB4OGRlZjAyMmRVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDQxMzExYjE5VUwsIDB4ODI2MjM2MzJVTCwgMHhjMzUzMmQyYlVMLCAweDA0YzU2YzY0VUwsCisgICAgMHg0NWY0Nzc3ZFVMLCAweDg2YTc1YTU2VUwsIDB4Yzc5NjQxNGZVTCwgMHgwODhhZDljOFVMLCAweDQ5YmJjMmQxVUwsCisgICAgMHg4YWU4ZWZmYVVMLCAweGNiZDlmNGUzVUwsIDB4MGM0ZmI1YWNVTCwgMHg0ZDdlYWViNVVMLCAweDhlMmQ4MzllVUwsCisgICAgMHhjZjFjOTg4N1VMLCAweDUxMTJjMjRhVUwsIDB4MTAyM2Q5NTNVTCwgMHhkMzcwZjQ3OFVMLCAweDkyNDFlZjYxVUwsCisgICAgMHg1NWQ3YWUyZVVMLCAweDE0ZTZiNTM3VUwsIDB4ZDdiNTk4MWNVTCwgMHg5Njg0ODMwNVVMLCAweDU5OTgxYjgyVUwsCisgICAgMHgxOGE5MDA5YlVMLCAweGRiZmEyZGIwVUwsIDB4OWFjYjM2YTlVTCwgMHg1ZDVkNzdlNlVMLCAweDFjNmM2Y2ZmVUwsCisgICAgMHhkZjNmNDFkNFVMLCAweDllMGU1YWNkVUwsIDB4YTIyNDg0OTVVTCwgMHhlMzE1OWY4Y1VMLCAweDIwNDZiMmE3VUwsCisgICAgMHg2MTc3YTliZVVMLCAweGE2ZTFlOGYxVUwsIDB4ZTdkMGYzZThVTCwgMHgyNDgzZGVjM1VMLCAweDY1YjJjNWRhVUwsCisgICAgMHhhYWFlNWQ1ZFVMLCAweGViOWY0NjQ0VUwsIDB4MjhjYzZiNmZVTCwgMHg2OWZkNzA3NlVMLCAweGFlNmIzMTM5VUwsCisgICAgMHhlZjVhMmEyMFVMLCAweDJjMDkwNzBiVUwsIDB4NmQzODFjMTJVTCwgMHhmMzM2NDZkZlVMLCAweGIyMDc1ZGM2VUwsCisgICAgMHg3MTU0NzBlZFVMLCAweDMwNjU2YmY0VUwsIDB4ZjdmMzJhYmJVTCwgMHhiNmMyMzFhMlVMLCAweDc1OTExYzg5VUwsCisgICAgMHgzNGEwMDc5MFVMLCAweGZiYmM5ZjE3VUwsIDB4YmE4ZDg0MGVVTCwgMHg3OWRlYTkyNVVMLCAweDM4ZWZiMjNjVUwsCisgICAgMHhmZjc5ZjM3M1VMLCAweGJlNDhlODZhVUwsIDB4N2QxYmM1NDFVTCwgMHgzYzJhZGU1OFVMLCAweDA1NGY3OWYwVUwsCisgICAgMHg0NDdlNjJlOVVMLCAweDg3MmQ0ZmMyVUwsIDB4YzYxYzU0ZGJVTCwgMHgwMThhMTU5NFVMLCAweDQwYmIwZThkVUwsCisgICAgMHg4M2U4MjNhNlVMLCAweGMyZDkzOGJmVUwsIDB4MGRjNWEwMzhVTCwgMHg0Y2Y0YmIyMVVMLCAweDhmYTc5NjBhVUwsCisgICAgMHhjZTk2OGQxM1VMLCAweDA5MDBjYzVjVUwsIDB4NDgzMWQ3NDVVTCwgMHg4YjYyZmE2ZVVMLCAweGNhNTNlMTc3VUwsCisgICAgMHg1NDVkYmJiYVVMLCAweDE1NmNhMGEzVUwsIDB4ZDYzZjhkODhVTCwgMHg5NzBlOTY5MVVMLCAweDUwOThkN2RlVUwsCisgICAgMHgxMWE5Y2NjN1VMLCAweGQyZmFlMWVjVUwsIDB4OTNjYmZhZjVVTCwgMHg1Y2Q3NjI3MlVMLCAweDFkZTY3OTZiVUwsCisgICAgMHhkZWI1NTQ0MFVMLCAweDlmODQ0ZjU5VUwsIDB4NTgxMjBlMTZVTCwgMHgxOTIzMTUwZlVMLCAweGRhNzAzODI0VUwsCisgICAgMHg5YjQxMjMzZFVMLCAweGE3NmJmZDY1VUwsIDB4ZTY1YWU2N2NVTCwgMHgyNTA5Y2I1N1VMLCAweDY0MzhkMDRlVUwsCisgICAgMHhhM2FlOTEwMVVMLCAweGUyOWY4YTE4VUwsIDB4MjFjY2E3MzNVTCwgMHg2MGZkYmMyYVVMLCAweGFmZTEyNGFkVUwsCisgICAgMHhlZWQwM2ZiNFVMLCAweDJkODMxMjlmVUwsIDB4NmNiMjA5ODZVTCwgMHhhYjI0NDhjOVVMLCAweGVhMTU1M2QwVUwsCisgICAgMHgyOTQ2N2VmYlVMLCAweDY4Nzc2NWUyVUwsIDB4ZjY3OTNmMmZVTCwgMHhiNzQ4MjQzNlVMLCAweDc0MWIwOTFkVUwsCisgICAgMHgzNTJhMTIwNFVMLCAweGYyYmM1MzRiVUwsIDB4YjM4ZDQ4NTJVTCwgMHg3MGRlNjU3OVVMLCAweDMxZWY3ZTYwVUwsCisgICAgMHhmZWYzZTZlN1VMLCAweGJmYzJmZGZlVUwsIDB4N2M5MWQwZDVVTCwgMHgzZGEwY2JjY1VMLCAweGZhMzY4YTgzVUwsCisgICAgMHhiYjA3OTE5YVVMLCAweDc4NTRiY2IxVUwsIDB4Mzk2NWE3YThVTCwgMHg0Yjk4ODMzYlVMLCAweDBhYTk5ODIyVUwsCisgICAgMHhjOWZhYjUwOVVMLCAweDg4Y2JhZTEwVUwsIDB4NGY1ZGVmNWZVTCwgMHgwZTZjZjQ0NlVMLCAweGNkM2ZkOTZkVUwsCisgICAgMHg4YzBlYzI3NFVMLCAweDQzMTI1YWYzVUwsIDB4MDIyMzQxZWFVTCwgMHhjMTcwNmNjMVVMLCAweDgwNDE3N2Q4VUwsCisgICAgMHg0N2Q3MzY5N1VMLCAweDA2ZTYyZDhlVUwsIDB4YzViNTAwYTVVTCwgMHg4NDg0MWJiY1VMLCAweDFhOGE0MTcxVUwsCisgICAgMHg1YmJiNWE2OFVMLCAweDk4ZTg3NzQzVUwsIDB4ZDlkOTZjNWFVTCwgMHgxZTRmMmQxNVVMLCAweDVmN2UzNjBjVUwsCisgICAgMHg5YzJkMWIyN1VMLCAweGRkMWMwMDNlVUwsIDB4MTIwMDk4YjlVTCwgMHg1MzMxODNhMFVMLCAweDkwNjJhZThiVUwsCisgICAgMHhkMTUzYjU5MlVMLCAweDE2YzVmNGRkVUwsIDB4NTdmNGVmYzRVTCwgMHg5NGE3YzJlZlVMLCAweGQ1OTZkOWY2VUwsCisgICAgMHhlOWJjMDdhZVVMLCAweGE4OGQxY2I3VUwsIDB4NmJkZTMxOWNVTCwgMHgyYWVmMmE4NVVMLCAweGVkNzk2YmNhVUwsCisgICAgMHhhYzQ4NzBkM1VMLCAweDZmMWI1ZGY4VUwsIDB4MmUyYTQ2ZTFVTCwgMHhlMTM2ZGU2NlVMLCAweGEwMDdjNTdmVUwsCisgICAgMHg2MzU0ZTg1NFVMLCAweDIyNjVmMzRkVUwsIDB4ZTVmM2IyMDJVTCwgMHhhNGMyYTkxYlVMLCAweDY3OTE4NDMwVUwsCisgICAgMHgyNmEwOWYyOVVMLCAweGI4YWVjNWU0VUwsIDB4Zjk5ZmRlZmRVTCwgMHgzYWNjZjNkNlVMLCAweDdiZmRlOGNmVUwsCisgICAgMHhiYzZiYTk4MFVMLCAweGZkNWFiMjk5VUwsIDB4M2UwOTlmYjJVTCwgMHg3ZjM4ODRhYlVMLCAweGIwMjQxYzJjVUwsCisgICAgMHhmMTE1MDczNVVMLCAweDMyNDYyYTFlVUwsIDB4NzM3NzMxMDdVTCwgMHhiNGUxNzA0OFVMLCAweGY1ZDA2YjUxVUwsCisgICAgMHgzNjgzNDY3YVVMLCAweDc3YjI1ZDYzVUwsIDB4NGVkN2ZhY2JVTCwgMHgwZmU2ZTFkMlVMLCAweGNjYjVjY2Y5VUwsCisgICAgMHg4ZDg0ZDdlMFVMLCAweDRhMTI5NmFmVUwsIDB4MGIyMzhkYjZVTCwgMHhjODcwYTA5ZFVMLCAweDg5NDFiYjg0VUwsCisgICAgMHg0NjVkMjMwM1VMLCAweDA3NmMzODFhVUwsIDB4YzQzZjE1MzFVTCwgMHg4NTBlMGUyOFVMLCAweDQyOTg0ZjY3VUwsCisgICAgMHgwM2E5NTQ3ZVVMLCAweGMwZmE3OTU1VUwsIDB4ODFjYjYyNGNVTCwgMHgxZmM1Mzg4MVVMLCAweDVlZjQyMzk4VUwsCisgICAgMHg5ZGE3MGViM1VMLCAweGRjOTYxNWFhVUwsIDB4MWIwMDU0ZTVVTCwgMHg1YTMxNGZmY1VMLCAweDk5NjI2MmQ3VUwsCisgICAgMHhkODUzNzljZVVMLCAweDE3NGZlMTQ5VUwsIDB4NTY3ZWZhNTBVTCwgMHg5NTJkZDc3YlVMLCAweGQ0MWNjYzYyVUwsCisgICAgMHgxMzhhOGQyZFVMLCAweDUyYmI5NjM0VUwsIDB4OTFlOGJiMWZVTCwgMHhkMGQ5YTAwNlVMLCAweGVjZjM3ZTVlVUwsCisgICAgMHhhZGMyNjU0N1VMLCAweDZlOTE0ODZjVUwsIDB4MmZhMDUzNzVVTCwgMHhlODM2MTIzYVVMLCAweGE5MDcwOTIzVUwsCisgICAgMHg2YTU0MjQwOFVMLCAweDJiNjUzZjExVUwsIDB4ZTQ3OWE3OTZVTCwgMHhhNTQ4YmM4ZlVMLCAweDY2MWI5MWE0VUwsCisgICAgMHgyNzJhOGFiZFVMLCAweGUwYmNjYmYyVUwsIDB4YTE4ZGQwZWJVTCwgMHg2MmRlZmRjMFVMLCAweDIzZWZlNmQ5VUwsCisgICAgMHhiZGUxYmMxNFVMLCAweGZjZDBhNzBkVUwsIDB4M2Y4MzhhMjZVTCwgMHg3ZWIyOTEzZlVMLCAweGI5MjRkMDcwVUwsCisgICAgMHhmODE1Y2I2OVVMLCAweDNiNDZlNjQyVUwsIDB4N2E3N2ZkNWJVTCwgMHhiNTZiNjVkY1VMLCAweGY0NWE3ZWM1VUwsCisgICAgMHgzNzA5NTNlZVVMLCAweDc2Mzg0OGY3VUwsIDB4YjFhZTA5YjhVTCwgMHhmMDlmMTJhMVVMLCAweDMzY2MzZjhhVUwsCisgICAgMHg3MmZkMjQ5M1VMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4Mzc2YWMyMDFVTCwgMHg2ZWQ0ODQwM1VMLCAweDU5YmU0NjAyVUwsIDB4ZGNhODA5MDdVTCwKKyAgICAweGViYzJjYjA2VUwsIDB4YjI3YzhkMDRVTCwgMHg4NTE2NGYwNVVMLCAweGI4NTExMzBlVUwsIDB4OGYzYmQxMGZVTCwKKyAgICAweGQ2ODU5NzBkVUwsIDB4ZTFlZjU1MGNVTCwgMHg2NGY5MWEwOVVMLCAweDUzOTNkODA4VUwsIDB4MGEyZDllMGFVTCwKKyAgICAweDNkNDc1YzBiVUwsIDB4NzBhMzI2MWNVTCwgMHg0N2M5ZTQxZFVMLCAweDFlNzdhMjFmVUwsIDB4MjkxZDYwMWVVTCwKKyAgICAweGFjMGIyZjFiVUwsIDB4OWI2MWVkMWFVTCwgMHhjMmRmYWIxOFVMLCAweGY1YjU2OTE5VUwsIDB4YzhmMjM1MTJVTCwKKyAgICAweGZmOThmNzEzVUwsIDB4YTYyNmIxMTFVTCwgMHg5MTRjNzMxMFVMLCAweDE0NWEzYzE1VUwsIDB4MjMzMGZlMTRVTCwKKyAgICAweDdhOGViODE2VUwsIDB4NGRlNDdhMTdVTCwgMHhlMDQ2NGQzOFVMLCAweGQ3MmM4ZjM5VUwsIDB4OGU5MmM5M2JVTCwKKyAgICAweGI5ZjgwYjNhVUwsIDB4M2NlZTQ0M2ZVTCwgMHgwYjg0ODYzZVVMLCAweDUyM2FjMDNjVUwsIDB4NjU1MDAyM2RVTCwKKyAgICAweDU4MTc1ZTM2VUwsIDB4NmY3ZDljMzdVTCwgMHgzNmMzZGEzNVVMLCAweDAxYTkxODM0VUwsIDB4ODRiZjU3MzFVTCwKKyAgICAweGIzZDU5NTMwVUwsIDB4ZWE2YmQzMzJVTCwgMHhkZDAxMTEzM1VMLCAweDkwZTU2YjI0VUwsIDB4YTc4ZmE5MjVVTCwKKyAgICAweGZlMzFlZjI3VUwsIDB4Yzk1YjJkMjZVTCwgMHg0YzRkNjIyM1VMLCAweDdiMjdhMDIyVUwsIDB4MjI5OWU2MjBVTCwKKyAgICAweDE1ZjMyNDIxVUwsIDB4MjhiNDc4MmFVTCwgMHgxZmRlYmEyYlVMLCAweDQ2NjBmYzI5VUwsIDB4NzEwYTNlMjhVTCwKKyAgICAweGY0MWM3MTJkVUwsIDB4YzM3NmIzMmNVTCwgMHg5YWM4ZjUyZVVMLCAweGFkYTIzNzJmVUwsIDB4YzA4ZDlhNzBVTCwKKyAgICAweGY3ZTc1ODcxVUwsIDB4YWU1OTFlNzNVTCwgMHg5OTMzZGM3MlVMLCAweDFjMjU5Mzc3VUwsIDB4MmI0ZjUxNzZVTCwKKyAgICAweDcyZjExNzc0VUwsIDB4NDU5YmQ1NzVVTCwgMHg3OGRjODk3ZVVMLCAweDRmYjY0YjdmVUwsIDB4MTYwODBkN2RVTCwKKyAgICAweDIxNjJjZjdjVUwsIDB4YTQ3NDgwNzlVTCwgMHg5MzFlNDI3OFVMLCAweGNhYTAwNDdhVUwsIDB4ZmRjYWM2N2JVTCwKKyAgICAweGIwMmViYzZjVUwsIDB4ODc0NDdlNmRVTCwgMHhkZWZhMzg2ZlVMLCAweGU5OTBmYTZlVUwsIDB4NmM4NmI1NmJVTCwKKyAgICAweDViZWM3NzZhVUwsIDB4MDI1MjMxNjhVTCwgMHgzNTM4ZjM2OVVMLCAweDA4N2ZhZjYyVUwsIDB4M2YxNTZkNjNVTCwKKyAgICAweDY2YWIyYjYxVUwsIDB4NTFjMWU5NjBVTCwgMHhkNGQ3YTY2NVVMLCAweGUzYmQ2NDY0VUwsIDB4YmEwMzIyNjZVTCwKKyAgICAweDhkNjllMDY3VUwsIDB4MjBjYmQ3NDhVTCwgMHgxN2ExMTU0OVVMLCAweDRlMWY1MzRiVUwsIDB4Nzk3NTkxNGFVTCwKKyAgICAweGZjNjNkZTRmVUwsIDB4Y2IwOTFjNGVVTCwgMHg5MmI3NWE0Y1VMLCAweGE1ZGQ5ODRkVUwsIDB4OTg5YWM0NDZVTCwKKyAgICAweGFmZjAwNjQ3VUwsIDB4ZjY0ZTQwNDVVTCwgMHhjMTI0ODI0NFVMLCAweDQ0MzJjZDQxVUwsIDB4NzM1ODBmNDBVTCwKKyAgICAweDJhZTY0OTQyVUwsIDB4MWQ4YzhiNDNVTCwgMHg1MDY4ZjE1NFVMLCAweDY3MDIzMzU1VUwsIDB4M2ViYzc1NTdVTCwKKyAgICAweDA5ZDZiNzU2VUwsIDB4OGNjMGY4NTNVTCwgMHhiYmFhM2E1MlVMLCAweGUyMTQ3YzUwVUwsIDB4ZDU3ZWJlNTFVTCwKKyAgICAweGU4MzllMjVhVUwsIDB4ZGY1MzIwNWJVTCwgMHg4NmVkNjY1OVVMLCAweGIxODdhNDU4VUwsIDB4MzQ5MWViNWRVTCwKKyAgICAweDAzZmIyOTVjVUwsIDB4NWE0NTZmNWVVTCwgMHg2ZDJmYWQ1ZlVMLCAweDgwMWIzNWUxVUwsIDB4Yjc3MWY3ZTBVTCwKKyAgICAweGVlY2ZiMWUyVUwsIDB4ZDlhNTczZTNVTCwgMHg1Y2IzM2NlNlVMLCAweDZiZDlmZWU3VUwsIDB4MzI2N2I4ZTVVTCwKKyAgICAweDA1MGQ3YWU0VUwsIDB4Mzg0YTI2ZWZVTCwgMHgwZjIwZTRlZVVMLCAweDU2OWVhMmVjVUwsIDB4NjFmNDYwZWRVTCwKKyAgICAweGU0ZTIyZmU4VUwsIDB4ZDM4OGVkZTlVTCwgMHg4YTM2YWJlYlVMLCAweGJkNWM2OWVhVUwsIDB4ZjBiODEzZmRVTCwKKyAgICAweGM3ZDJkMWZjVUwsIDB4OWU2Yzk3ZmVVTCwgMHhhOTA2NTVmZlVMLCAweDJjMTAxYWZhVUwsIDB4MWI3YWQ4ZmJVTCwKKyAgICAweDQyYzQ5ZWY5VUwsIDB4NzVhZTVjZjhVTCwgMHg0OGU5MDBmM1VMLCAweDdmODNjMmYyVUwsIDB4MjYzZDg0ZjBVTCwKKyAgICAweDExNTc0NmYxVUwsIDB4OTQ0MTA5ZjRVTCwgMHhhMzJiY2JmNVVMLCAweGZhOTU4ZGY3VUwsIDB4Y2RmZjRmZjZVTCwKKyAgICAweDYwNWQ3OGQ5VUwsIDB4NTczN2JhZDhVTCwgMHgwZTg5ZmNkYVVMLCAweDM5ZTMzZWRiVUwsIDB4YmNmNTcxZGVVTCwKKyAgICAweDhiOWZiM2RmVUwsIDB4ZDIyMWY1ZGRVTCwgMHhlNTRiMzdkY1VMLCAweGQ4MGM2YmQ3VUwsIDB4ZWY2NmE5ZDZVTCwKKyAgICAweGI2ZDhlZmQ0VUwsIDB4ODFiMjJkZDVVTCwgMHgwNGE0NjJkMFVMLCAweDMzY2VhMGQxVUwsIDB4NmE3MGU2ZDNVTCwKKyAgICAweDVkMWEyNGQyVUwsIDB4MTBmZTVlYzVVTCwgMHgyNzk0OWNjNFVMLCAweDdlMmFkYWM2VUwsIDB4NDk0MDE4YzdVTCwKKyAgICAweGNjNTY1N2MyVUwsIDB4ZmIzYzk1YzNVTCwgMHhhMjgyZDNjMVVMLCAweDk1ZTgxMWMwVUwsIDB4YThhZjRkY2JVTCwKKyAgICAweDlmYzU4ZmNhVUwsIDB4YzY3YmM5YzhVTCwgMHhmMTExMGJjOVVMLCAweDc0MDc0NGNjVUwsIDB4NDM2ZDg2Y2RVTCwKKyAgICAweDFhZDNjMGNmVUwsIDB4MmRiOTAyY2VVTCwgMHg0MDk2YWY5MVVMLCAweDc3ZmM2ZDkwVUwsIDB4MmU0MjJiOTJVTCwKKyAgICAweDE5MjhlOTkzVUwsIDB4OWMzZWE2OTZVTCwgMHhhYjU0NjQ5N1VMLCAweGYyZWEyMjk1VUwsIDB4YzU4MGUwOTRVTCwKKyAgICAweGY4YzdiYzlmVUwsIDB4Y2ZhZDdlOWVVTCwgMHg5NjEzMzg5Y1VMLCAweGExNzlmYTlkVUwsIDB4MjQ2ZmI1OThVTCwKKyAgICAweDEzMDU3Nzk5VUwsIDB4NGFiYjMxOWJVTCwgMHg3ZGQxZjM5YVVMLCAweDMwMzU4OThkVUwsIDB4MDc1ZjRiOGNVTCwKKyAgICAweDVlZTEwZDhlVUwsIDB4Njk4YmNmOGZVTCwgMHhlYzlkODA4YVVMLCAweGRiZjc0MjhiVUwsIDB4ODI0OTA0ODlVTCwKKyAgICAweGI1MjNjNjg4VUwsIDB4ODg2NDlhODNVTCwgMHhiZjBlNTg4MlVMLCAweGU2YjAxZTgwVUwsIDB4ZDFkYWRjODFVTCwKKyAgICAweDU0Y2M5Mzg0VUwsIDB4NjNhNjUxODVVTCwgMHgzYTE4MTc4N1VMLCAweDBkNzJkNTg2VUwsIDB4YTBkMGUyYTlVTCwKKyAgICAweDk3YmEyMGE4VUwsIDB4Y2UwNDY2YWFVTCwgMHhmOTZlYTRhYlVMLCAweDdjNzhlYmFlVUwsIDB4NGIxMjI5YWZVTCwKKyAgICAweDEyYWM2ZmFkVUwsIDB4MjVjNmFkYWNVTCwgMHgxODgxZjFhN1VMLCAweDJmZWIzM2E2VUwsIDB4NzY1NTc1YTRVTCwKKyAgICAweDQxM2ZiN2E1VUwsIDB4YzQyOWY4YTBVTCwgMHhmMzQzM2FhMVVMLCAweGFhZmQ3Y2EzVUwsIDB4OWQ5N2JlYTJVTCwKKyAgICAweGQwNzNjNGI1VUwsIDB4ZTcxOTA2YjRVTCwgMHhiZWE3NDBiNlVMLCAweDg5Y2Q4MmI3VUwsIDB4MGNkYmNkYjJVTCwKKyAgICAweDNiYjEwZmIzVUwsIDB4NjIwZjQ5YjFVTCwgMHg1NTY1OGJiMFVMLCAweDY4MjJkN2JiVUwsIDB4NWY0ODE1YmFVTCwKKyAgICAweDA2ZjY1M2I4VUwsIDB4MzE5YzkxYjlVTCwgMHhiNDhhZGViY1VMLCAweDgzZTAxY2JkVUwsIDB4ZGE1ZTVhYmZVTCwKKyAgICAweGVkMzQ5OGJlVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHg2NTY3YmNiOFVMLCAweDhiYzgwOWFhVUwsIDB4ZWVhZmI1MTJVTCwgMHg1Nzk3NjI4ZlVMLAorICAgIDB4MzJmMGRlMzdVTCwgMHhkYzVmNmIyNVVMLCAweGI5MzhkNzlkVUwsIDB4ZWYyOGI0YzVVTCwgMHg4YTRmMDg3ZFVMLAorICAgIDB4NjRlMGJkNmZVTCwgMHgwMTg3MDFkN1VMLCAweGI4YmZkNjRhVUwsIDB4ZGRkODZhZjJVTCwgMHgzMzc3ZGZlMFVMLAorICAgIDB4NTYxMDYzNThVTCwgMHg5ZjU3MTk1MFVMLCAweGZhMzBhNWU4VUwsIDB4MTQ5ZjEwZmFVTCwgMHg3MWY4YWM0MlVMLAorICAgIDB4YzhjMDdiZGZVTCwgMHhhZGE3Yzc2N1VMLCAweDQzMDg3Mjc1VUwsIDB4MjY2ZmNlY2RVTCwgMHg3MDdmYWQ5NVVMLAorICAgIDB4MTUxODExMmRVTCwgMHhmYmI3YTQzZlVMLCAweDllZDAxODg3VUwsIDB4MjdlOGNmMWFVTCwgMHg0MjhmNzNhMlVMLAorICAgIDB4YWMyMGM2YjBVTCwgMHhjOTQ3N2EwOFVMLCAweDNlYWYzMmEwVUwsIDB4NWJjODhlMThVTCwgMHhiNTY3M2IwYVVMLAorICAgIDB4ZDAwMDg3YjJVTCwgMHg2OTM4NTAyZlVMLCAweDBjNWZlYzk3VUwsIDB4ZTJmMDU5ODVVTCwgMHg4Nzk3ZTUzZFVMLAorICAgIDB4ZDE4Nzg2NjVVTCwgMHhiNGUwM2FkZFVMLCAweDVhNGY4ZmNmVUwsIDB4M2YyODMzNzdVTCwgMHg4NjEwZTRlYVVMLAorICAgIDB4ZTM3NzU4NTJVTCwgMHgwZGQ4ZWQ0MFVMLCAweDY4YmY1MWY4VUwsIDB4YTFmODJiZjBVTCwgMHhjNDlmOTc0OFVMLAorICAgIDB4MmEzMDIyNWFVTCwgMHg0ZjU3OWVlMlVMLCAweGY2NmY0OTdmVUwsIDB4OTMwOGY1YzdVTCwgMHg3ZGE3NDBkNVVMLAorICAgIDB4MThjMGZjNmRVTCwgMHg0ZWQwOWYzNVVMLCAweDJiYjcyMzhkVUwsIDB4YzUxODk2OWZVTCwgMHhhMDdmMmEyN1VMLAorICAgIDB4MTk0N2ZkYmFVTCwgMHg3YzIwNDEwMlVMLCAweDkyOGZmNDEwVUwsIDB4ZjdlODQ4YThVTCwgMHgzZDU4MTQ5YlVMLAorICAgIDB4NTgzZmE4MjNVTCwgMHhiNjkwMWQzMVVMLCAweGQzZjdhMTg5VUwsIDB4NmFjZjc2MTRVTCwgMHgwZmE4Y2FhY1VMLAorICAgIDB4ZTEwNzdmYmVVTCwgMHg4NDYwYzMwNlVMLCAweGQyNzBhMDVlVUwsIDB4YjcxNzFjZTZVTCwgMHg1OWI4YTlmNFVMLAorICAgIDB4M2NkZjE1NGNVTCwgMHg4NWU3YzJkMVVMLCAweGUwODA3ZTY5VUwsIDB4MGUyZmNiN2JVTCwgMHg2YjQ4NzdjM1VMLAorICAgIDB4YTIwZjBkY2JVTCwgMHhjNzY4YjE3M1VMLCAweDI5YzcwNDYxVUwsIDB4NGNhMGI4ZDlVTCwgMHhmNTk4NmY0NFVMLAorICAgIDB4OTBmZmQzZmNVTCwgMHg3ZTUwNjZlZVVMLCAweDFiMzdkYTU2VUwsIDB4NGQyN2I5MGVVTCwgMHgyODQwMDViNlVMLAorICAgIDB4YzZlZmIwYTRVTCwgMHhhMzg4MGMxY1VMLCAweDFhYjBkYjgxVUwsIDB4N2ZkNzY3MzlVTCwgMHg5MTc4ZDIyYlVMLAorICAgIDB4ZjQxZjZlOTNVTCwgMHgwM2Y3MjYzYlVMLCAweDY2OTA5YTgzVUwsIDB4ODgzZjJmOTFVTCwgMHhlZDU4OTMyOVVMLAorICAgIDB4NTQ2MDQ0YjRVTCwgMHgzMTA3ZjgwY1VMLCAweGRmYTg0ZDFlVUwsIDB4YmFjZmYxYTZVTCwgMHhlY2RmOTJmZVVMLAorICAgIDB4ODliODJlNDZVTCwgMHg2NzE3OWI1NFVMLCAweDAyNzAyN2VjVUwsIDB4YmI0OGYwNzFVTCwgMHhkZTJmNGNjOVVMLAorICAgIDB4MzA4MGY5ZGJVTCwgMHg1NWU3NDU2M1VMLCAweDljYTAzZjZiVUwsIDB4ZjljNzgzZDNVTCwgMHgxNzY4MzZjMVVMLAorICAgIDB4NzIwZjhhNzlVTCwgMHhjYjM3NWRlNFVMLCAweGFlNTBlMTVjVUwsIDB4NDBmZjU0NGVVTCwgMHgyNTk4ZThmNlVMLAorICAgIDB4NzM4ODhiYWVVTCwgMHgxNmVmMzcxNlVMLCAweGY4NDA4MjA0VUwsIDB4OWQyNzNlYmNVTCwgMHgyNDFmZTkyMVVMLAorICAgIDB4NDE3ODU1OTlVTCwgMHhhZmQ3ZTA4YlVMLCAweGNhYjA1YzMzVUwsIDB4M2JiNjU5ZWRVTCwgMHg1ZWQxZTU1NVVMLAorICAgIDB4YjA3ZTUwNDdVTCwgMHhkNTE5ZWNmZlVMLCAweDZjMjEzYjYyVUwsIDB4MDk0Njg3ZGFVTCwgMHhlN2U5MzJjOFVMLAorICAgIDB4ODI4ZThlNzBVTCwgMHhkNDllZWQyOFVMLCAweGIxZjk1MTkwVUwsIDB4NWY1NmU0ODJVTCwgMHgzYTMxNTgzYVVMLAorICAgIDB4ODMwOThmYTdVTCwgMHhlNjZlMzMxZlVMLCAweDA4YzE4NjBkVUwsIDB4NmRhNjNhYjVVTCwgMHhhNGUxNDBiZFVMLAorICAgIDB4YzE4NmZjMDVVTCwgMHgyZjI5NDkxN1VMLCAweDRhNGVmNWFmVUwsIDB4ZjM3NjIyMzJVTCwgMHg5NjExOWU4YVVMLAorICAgIDB4NzhiZTJiOThVTCwgMHgxZGQ5OTcyMFVMLCAweDRiYzlmNDc4VUwsIDB4MmVhZTQ4YzBVTCwgMHhjMDAxZmRkMlVMLAorICAgIDB4YTU2NjQxNmFVTCwgMHgxYzVlOTZmN1VMLCAweDc5MzkyYTRmVUwsIDB4OTc5NjlmNWRVTCwgMHhmMmYxMjNlNVVMLAorICAgIDB4MDUxOTZiNGRVTCwgMHg2MDdlZDdmNVVMLCAweDhlZDE2MmU3VUwsIDB4ZWJiNmRlNWZVTCwgMHg1MjhlMDljMlVMLAorICAgIDB4MzdlOWI1N2FVTCwgMHhkOTQ2MDA2OFVMLCAweGJjMjFiY2QwVUwsIDB4ZWEzMWRmODhVTCwgMHg4ZjU2NjMzMFVMLAorICAgIDB4NjFmOWQ2MjJVTCwgMHgwNDllNmE5YVVMLCAweGJkYTZiZDA3VUwsIDB4ZDhjMTAxYmZVTCwgMHgzNjZlYjRhZFVMLAorICAgIDB4NTMwOTA4MTVVTCwgMHg5YTRlNzIxZFVMLCAweGZmMjljZWE1VUwsIDB4MTE4NjdiYjdVTCwgMHg3NGUxYzcwZlVMLAorICAgIDB4Y2RkOTEwOTJVTCwgMHhhOGJlYWMyYVVMLCAweDQ2MTExOTM4VUwsIDB4MjM3NmE1ODBVTCwgMHg3NTY2YzZkOFVMLAorICAgIDB4MTAwMTdhNjBVTCwgMHhmZWFlY2Y3MlVMLCAweDliYzk3M2NhVUwsIDB4MjJmMWE0NTdVTCwgMHg0Nzk2MThlZlVMLAorICAgIDB4YTkzOWFkZmRVTCwgMHhjYzVlMTE0NVVMLCAweDA2ZWU0ZDc2VUwsIDB4NjM4OWYxY2VVTCwgMHg4ZDI2NDRkY1VMLAorICAgIDB4ZTg0MWY4NjRVTCwgMHg1MTc5MmZmOVVMLCAweDM0MWU5MzQxVUwsIDB4ZGFiMTI2NTNVTCwgMHhiZmQ2OWFlYlVMLAorICAgIDB4ZTljNmY5YjNVTCwgMHg4Y2ExNDUwYlVMLCAweDYyMGVmMDE5VUwsIDB4MDc2OTRjYTFVTCwgMHhiZTUxOWIzY1VMLAorICAgIDB4ZGIzNjI3ODRVTCwgMHgzNTk5OTI5NlVMLCAweDUwZmUyZTJlVUwsIDB4OTliOTU0MjZVTCwgMHhmY2RlZTg5ZVVMLAorICAgIDB4MTI3MTVkOGNVTCwgMHg3NzE2ZTEzNFVMLCAweGNlMmUzNmE5VUwsIDB4YWI0OThhMTFVTCwgMHg0NWU2M2YwM1VMLAorICAgIDB4MjA4MTgzYmJVTCwgMHg3NjkxZTBlM1VMLCAweDEzZjY1YzViVUwsIDB4ZmQ1OWU5NDlVTCwgMHg5ODNlNTVmMVVMLAorICAgIDB4MjEwNjgyNmNVTCwgMHg0NDYxM2VkNFVMLCAweGFhY2U4YmM2VUwsIDB4Y2ZhOTM3N2VVTCwgMHgzODQxN2ZkNlVMLAorICAgIDB4NWQyNmMzNmVVTCwgMHhiMzg5NzY3Y1VMLCAweGQ2ZWVjYWM0VUwsIDB4NmZkNjFkNTlVTCwgMHgwYWIxYTFlMVVMLAorICAgIDB4ZTQxZTE0ZjNVTCwgMHg4MTc5YTg0YlVMLCAweGQ3NjljYjEzVUwsIDB4YjIwZTc3YWJVTCwgMHg1Y2ExYzJiOVVMLAorICAgIDB4MzljNjdlMDFVTCwgMHg4MGZlYTk5Y1VMLCAweGU1OTkxNTI0VUwsIDB4MGIzNmEwMzZVTCwgMHg2ZTUxMWM4ZVVMLAorICAgIDB4YTcxNjY2ODZVTCwgMHhjMjcxZGEzZVVMLCAweDJjZGU2ZjJjVUwsIDB4NDliOWQzOTRVTCwgMHhmMDgxMDQwOVVMLAorICAgIDB4OTVlNmI4YjFVTCwgMHg3YjQ5MGRhM1VMLCAweDFlMmViMTFiVUwsIDB4NDgzZWQyNDNVTCwgMHgyZDU5NmVmYlVMLAorICAgIDB4YzNmNmRiZTlVTCwgMHhhNjkxNjc1MVVMLCAweDFmYTliMGNjVUwsIDB4N2FjZTBjNzRVTCwgMHg5NDYxYjk2NlVMLAorICAgIDB4ZjEwNjA1ZGVVTAorI2VuZGlmCisgIH0KK307CmRpZmYgLS1naXQgYS9kZWZsYXRlLmMgYi9kZWZsYXRlLmMKaW5kZXggMTZlYmRhZC4uZDEzNjI3ZSAxMDA2NDQKLS0tIGEvZGVmbGF0ZS5jCisrKyBiL2RlZmxhdGUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIGRlZmxhdGUuYyAtLSBjb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCiAgKi8KIApAQCAtNTIsNyArNTIsNyBAQAogI2luY2x1ZGUgImRlZmxhdGUuaCIKIAogY29uc3QgY2hhciBkZWZsYXRlX2NvcHlyaWdodFtdID0KLSAgICIgZGVmbGF0ZSAxLjEuNCBDb3B5cmlnaHQgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkgIjsKKyAgICIgZGVmbGF0ZSAxLjIuMCBDb3B5cmlnaHQgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkgIjsKIC8qCiAgIElmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGlzIHdlbGNvbWUKICAgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBwcm9kdWN0LiBJZiBmb3Igc29tZSByZWFzb24geW91IGNhbm5vdApAQCAtMjEyLDcgKzIxMiw3IEBACiB7CiAgICAgZGVmbGF0ZV9zdGF0ZSAqczsKICAgICBpbnQgbm9oZWFkZXIgPSAwOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBteV92ZXJzaW9uID0gWkxJQl9WRVJTSU9OOworICAgIHN0YXRpYyBjb25zdCBjaGFyIG15X3ZlcnNpb25bXSA9IFpMSUJfVkVSU0lPTjsKIAogICAgIHVzaGYgKm92ZXJsYXk7CiAgICAgLyogV2Ugb3ZlcmxheSBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYuIFRoaXMgd29ya3Mgc2luY2UgdGhlIGF2ZXJhZ2UKQEAgLTI3Myw2ICsyNzMsNyBAQAogCiAgICAgaWYgKHMtPndpbmRvdyA9PSBaX05VTEwgfHwgcy0+cHJldiA9PSBaX05VTEwgfHwgcy0+aGVhZCA9PSBaX05VTEwgfHwKICAgICAgICAgcy0+cGVuZGluZ19idWYgPT0gWl9OVUxMKSB7CisgICAgICAgIHMtPnN0YXR1cyA9IEZJTklTSF9TVEFURTsKICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIqKUVSUl9NU0coWl9NRU1fRVJST1IpOwogICAgICAgICBkZWZsYXRlRW5kIChzdHJtKTsKICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwpAQCAtMjk5LDEwICszMDAsMTIgQEAKICAgICBJUG9zIGhhc2hfaGVhZCA9IDA7CiAKICAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IGRpY3Rpb25hcnkgPT0gWl9OVUxMIHx8Ci0gICAgICAgIHN0cm0tPnN0YXRlLT5zdGF0dXMgIT0gSU5JVF9TVEFURSkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgICAgICAoIXN0cm0tPnN0YXRlLT5ub2hlYWRlciAmJiBzdHJtLT5zdGF0ZS0+c3RhdHVzICE9IElOSVRfU1RBVEUpKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAKICAgICBzID0gc3RybS0+c3RhdGU7Ci0gICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKKyAgICBpZiAoIXMtPm5vaGVhZGVyKQorICAgICAgICBzdHJtLT5hZGxlciA9IGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOwogCiAgICAgaWYgKGxlbmd0aCA8IE1JTl9NQVRDSCkgcmV0dXJuIFpfT0s7CiAgICAgaWYgKGxlbmd0aCA+IE1BWF9ESVNUKHMpKSB7CkBAIC0zOTUsNiArMzk4LDQ3IEBACiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZvciB0aGUgZGVmYXVsdCB3aW5kb3dCaXRzIG9mIDE1IGFuZCBtZW1MZXZlbCBvZiA4LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIGEgY2xvc2UgdG8gZXhhY3QsIGFzIHdlbGwgYXMgc21hbGwsIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUuCisgKiBUaGV5IGFyZSBjb2RlZCBhcyBjb25zdGFudHMgaGVyZSBmb3IgYSByZWFzb24tLWlmIHRoZSAjZGVmaW5lJ3MgYXJlCisgKiBjaGFuZ2VkLCB0aGVuIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2hhbmdlZCBhcyB3ZWxsLiAgVGhlIHJldHVybgorICogdmFsdWUgZm9yIDE1IGFuZCA4IG9ubHkgd29ya3MgZm9yIHRob3NlIGV4YWN0IHNldHRpbmdzLgorICoKKyAqIEZvciBhbnkgc2V0dGluZyBvdGhlciB0aGFuIHRob3NlIGRlZmF1bHRzIGZvciB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbCwKKyAqIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIGNvbnNlcnZhdGl2ZSB3b3JzdCBjYXNlIGZvciB0aGUgbWF4aW11bSBleHBhbnNpb24KKyAqIHJlc3VsdGluZyBmcm9tIHVzaW5nIGZpeGVkIGJsb2NrcyBpbnN0ZWFkIG9mIHN0b3JlZCBibG9ja3MsIHdoaWNoIGRlZmxhdGUKKyAqIGNhbiBlbWl0IG9uIGNvbXByZXNzZWQgZGF0YSBmb3Igc29tZSBjb21iaW5hdGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMuCisgKgorICogVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3JlIHNvcGhpc3RpY2F0ZWQgdG8gcHJvdmlkZSBjbG9zZXIgdXBwZXIgYm91bmRzCisgKiBmb3IgZXZlcnkgY29tYmluYXRpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwsIGFzIHdlbGwgYXMgbm9oZWFkZXIuCisgKiBCdXQgZXZlbiB0aGUgY29uc2VydmF0aXZlIHVwcGVyIGJvdW5kIG9mIGFib3V0IDE0JSBleHBhbnNpb24gZG9lcyBub3QKKyAqIHNlZW0gb25lcm91cyBmb3Igb3V0cHV0IGJ1ZmZlciBhbGxvY2F0aW9uLgorICovCit1TG9uZyBaRVhQT1JUIGRlZmxhdGVCb3VuZChzdHJtLCBzb3VyY2VMZW4pCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgdUxvbmcgc291cmNlTGVuOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdUxvbmcgZGVzdExlbjsKKworICAgIC8qIGNvbnNlcnZhdGl2ZSB1cHBlciBib3VuZCAqLworICAgIGRlc3RMZW4gPSBzb3VyY2VMZW4gKworICAgICAgICAgICAgICAoKHNvdXJjZUxlbiArIDcpID4+IDMpICsgKChzb3VyY2VMZW4gKyA2MykgPj4gNikgKyAxMTsKKworICAgIC8qIGlmIGNhbid0IGdldCBwYXJhbWV0ZXJzLCByZXR1cm4gY29uc2VydmF0aXZlIGJvdW5kICovCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkKKyAgICAgICAgcmV0dXJuIGRlc3RMZW47CisKKyAgICAvKiBpZiBub3QgZGVmYXVsdCBwYXJhbWV0ZXJzLCByZXR1cm4gY29uc2VydmF0aXZlIGJvdW5kICovCisgICAgcyA9IHN0cm0tPnN0YXRlOworICAgIGlmIChzLT53X2JpdHMgIT0gMTUgfHwgcy0+aGFzaF9iaXRzICE9IDggKyA3KQorICAgICAgICByZXR1cm4gZGVzdExlbjsKKworICAgIC8qIGRlZmF1bHQgc2V0dGluZ3M6IHJldHVybiB0aWdodCBib3VuZCBmb3IgdGhhdCBjYXNlICovCisgICAgcmV0dXJuIGNvbXByZXNzQm91bmQoc291cmNlTGVuKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogUHV0IGEgc2hvcnQgaW4gdGhlIHBlbmRpbmcgYnVmZmVyLiBUaGUgMTYtYml0IHZhbHVlIGlzIHB1dCBpbiBNU0Igb3JkZXIuCiAgKiBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gc3RhdGUgaXMgY29ycmVjdCBhbmQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4KICAqIHBlbmRpbmdfYnVmLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZS5jIGIvZXhhbXBsZS5jCmluZGV4IGU3ZTM2NzMuLjg4MjBlNTYgMTAwNjQ0Ci0tLSBhL2V4YW1wbGUuYworKysgYi9leGFtcGxlLmMKQEAgLTEsNSArMSw1IEBACiAvKiBleGFtcGxlLmMgLS0gdXNhZ2UgZXhhbXBsZSBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCiAgKi8KIApAQCAtNTUxLDYgKzU1MSw5IEBACiAgICAgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKTsKICAgICB0ZXN0X2RpY3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwogCisgICAgZnJlZShjb21wcik7CisgICAgZnJlZSh1bmNvbXByKTsKKwogICAgIGV4aXQoMCk7CiAgICAgcmV0dXJuIDA7IC8qIHRvIGF2b2lkIHdhcm5pbmcgKi8KIH0KZGlmZiAtLWdpdCBhL2d6aW8uYyBiL2d6aW8uYwppbmRleCAwOWUwYTIwLi4zMzM3MzUzIDEwMDY0NAotLS0gYS9nemlvLmMKKysrIGIvZ3ppby5jCkBAIC0xLDUgKzEsNSBAQAogLyogZ3ppby5jIC0tIElPIG9uIC5neiBmaWxlcwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseS4KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKgogICogQ29tcGlsZSB0aGlzIGZpbGUgd2l0aCAtRE5PX0RFRkxBVEUgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCkBAIC0yNCwxMCArMjQsMTUgQEAKICMgIGRlZmluZSBaX1BSSU5URl9CVUZTSVpFIDQwOTYKICNlbmRpZgogCisjaWZuZGVmIFNUREMKK2V4dGVybiB2b2lkcCAgbWFsbG9jIE9GKCh1SW50IHNpemUpKTsKK2V4dGVybiB2b2lkICAgZnJlZSAgIE9GKCh2b2lkcGYgcHRyKSk7CisjZW5kaWYKKwogI2RlZmluZSBBTExPQyhzaXplKSBtYWxsb2Moc2l6ZSkKICNkZWZpbmUgVFJZRlJFRShwKSB7aWYgKHApIGZyZWUocCk7fQogCi1zdGF0aWMgaW50IGd6X21hZ2ljWzJdID0gezB4MWYsIDB4OGJ9OyAvKiBnemlwIG1hZ2ljIGhlYWRlciAqLworc3RhdGljIGludCBjb25zdCBnel9tYWdpY1syXSA9IHsweDFmLCAweDhifTsgLyogZ3ppcCBtYWdpYyBoZWFkZXIgKi8KIAogLyogZ3ppcCBmbGFnIGJ5dGUgKi8KICNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IGFzY2lpIHRleHQgKi8KQEAgLTI2OCwxOSArMjczLDMzIEBACiAgICAgdUludCBsZW47CiAgICAgaW50IGM7CiAKLSAgICAvKiBDaGVjayB0aGUgZ3ppcCBtYWdpYyBoZWFkZXIgKi8KLSAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IDI7IGxlbisrKSB7Ci0JYyA9IGdldF9ieXRlKHMpOwotCWlmIChjICE9IGd6X21hZ2ljW2xlbl0pIHsKLQkgICAgaWYgKGxlbiAhPSAwKSBzLT5zdHJlYW0uYXZhaWxfaW4rKywgcy0+c3RyZWFtLm5leHRfaW4tLTsKLQkgICAgaWYgKGMgIT0gRU9GKSB7Ci0JCXMtPnN0cmVhbS5hdmFpbF9pbisrLCBzLT5zdHJlYW0ubmV4dF9pbi0tOwotCQlzLT50cmFuc3BhcmVudCA9IDE7Ci0JICAgIH0KLQkgICAgcy0+el9lcnIgPSBzLT5zdHJlYW0uYXZhaWxfaW4gIT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7Ci0JICAgIHJldHVybjsKLQl9CisgICAgLyogQXNzdXJlIHR3byBieXRlcyBpbiB0aGUgYnVmZmVyIHNvIHdlIGNhbiBwZWVrIGFoZWFkIC0tIGhhbmRsZSBjYXNlCisgICAgICAgd2hlcmUgZmlyc3QgYnl0ZSBvZiBoZWFkZXIgaXMgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGFmdGVyIHRoZSBsYXN0CisgICAgICAgZ3ppcCBzZWdtZW50ICovCisgICAgbGVuID0gcy0+c3RyZWFtLmF2YWlsX2luOworICAgIGlmIChsZW4gPCAyKSB7CisgICAgICAgIGlmIChsZW4pIHMtPmluYnVmWzBdID0gcy0+c3RyZWFtLm5leHRfaW5bMF07CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgbGVuID0gZnJlYWQocy0+aW5idWYgKyBsZW4sIDEsIFpfQlVGU0laRSA+PiBsZW4sIHMtPmZpbGUpOworICAgICAgICBpZiAobGVuID09IDAgJiYgZmVycm9yKHMtPmZpbGUpKSBzLT56X2VyciA9IFpfRVJSTk87CisgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiArPSBsZW47CisgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7CisgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPCAyKSB7CisgICAgICAgICAgICBzLT50cmFuc3BhcmVudCA9IHMtPnN0cmVhbS5hdmFpbF9pbjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KKworICAgIC8qIFBlZWsgYWhlYWQgdG8gY2hlY2sgdGhlIGd6aXAgbWFnaWMgaGVhZGVyICovCisgICAgaWYgKHMtPnN0cmVhbS5uZXh0X2luWzBdICE9IGd6X21hZ2ljWzBdIHx8CisJcy0+c3RyZWFtLm5leHRfaW5bMV0gIT0gZ3pfbWFnaWNbMV0pIHsKKyAgICAgICAgcy0+dHJhbnNwYXJlbnQgPSAxOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHMtPnN0cmVhbS5hdmFpbF9pbiAtPSAyOworICAgIHMtPnN0cmVhbS5uZXh0X2luICs9IDI7CisKKyAgICAvKiBDaGVjayB0aGUgcmVzdCBvZiB0aGUgZ3ppcCBoZWFkZXIgKi8KICAgICBtZXRob2QgPSBnZXRfYnl0ZShzKTsKICAgICBmbGFncyA9IGdldF9ieXRlKHMpOwogICAgIGlmIChtZXRob2QgIT0gWl9ERUZMQVRFRCB8fCAoZmxhZ3MgJiBSRVNFUlZFRCkgIT0gMCkgewpAQCAtNDg1LDcgKzUwNCw3IEBACiAqLwogaW50IFpFWFBPUlQgZ3p3cml0ZSAoZmlsZSwgYnVmLCBsZW4pCiAgICAgZ3pGaWxlIGZpbGU7Ci0gICAgY29uc3Qgdm9pZHAgYnVmOworICAgIHZvaWRwYyBidWY7CiAgICAgdW5zaWduZWQgbGVuOwogewogICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CkBAIC01MjksMTQgKzU0OCwzMiBAQAogICAgIGludCBsZW47CiAKICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKLSNpZmRlZiBIQVNfdnNucHJpbnRmCi0gICAgKHZvaWQpdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgdmEpOwotI2Vsc2UKKyNpZmRlZiBOT192c25wcmludGYKKyMgIGlmZGVmIEhBU192c3ByaW50Zl92b2lkCiAgICAgKHZvaWQpdnNwcmludGYoYnVmLCBmb3JtYXQsIHZhKTsKLSNlbmRpZgogICAgIHZhX2VuZCh2YSk7CiAgICAgbGVuID0gc3RybGVuKGJ1Zik7IC8qIHNvbWUgKnNwcmludGYgZG9uJ3QgcmV0dXJuIHRoZSBuYiBvZiBieXRlcyB3cml0dGVuICovCiAgICAgaWYgKGxlbiA8PSAwKSByZXR1cm4gMDsKKyMgIGVsc2UKKyAgICBsZW4gPSB2c3ByaW50ZihidWYsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisgICAgaWYgKGxlbiA8PSAwIHx8IGxlbiA+PSBzaXplb2YoYnVmKSkKKyAgICAgICAgcmV0dXJuIDA7CisjICBlbmRpZgorI2Vsc2UKKyMgIGlmZGVmIEhBU192c25wcmludGZfdm9pZAorICAgICh2b2lkKXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworICAgIGxlbiA9IHN0cmxlbihidWYpOworICAgIGlmIChsZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisjICBlbHNlCisgICAgbGVuID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisgICAgaWYgKGxlbiA8PSAwIHx8IGxlbiA+PSBzaXplb2YoYnVmKSkKKyAgICAgICAgcmV0dXJuIDA7CisjICBlbmRpZgorI2VuZGlmCiAKICAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCBidWYsICh1bnNpZ25lZClsZW4pOwogfQpAQCAtNTUyLDE1ICs1ODksMzIgQEAKICAgICBjaGFyIGJ1ZltaX1BSSU5URl9CVUZTSVpFXTsKICAgICBpbnQgbGVuOwogCi0jaWZkZWYgSEFTX3NucHJpbnRmCi0gICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCi0JICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOwotI2Vsc2UKKyNpZmRlZiBOT19zbnByaW50ZgorIyAgaWZkZWYgSEFTX3NwcmludGZfdm9pZAogICAgIHNwcmludGYoYnVmLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKIAkgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKLSNlbmRpZgogICAgIGxlbiA9IHN0cmxlbihidWYpOyAvKiBvbGQgc3ByaW50ZiBkb2Vzbid0IHJldHVybiB0aGUgbmIgb2YgYnl0ZXMgd3JpdHRlbiAqLwogICAgIGlmIChsZW4gPD0gMCkgcmV0dXJuIDA7CisjICBlbHNlCisgICAgbGVuID0gc3ByaW50ZihidWYsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorCSAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKKyAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IHNpemVvZihidWYpKQorICAgICAgICByZXR1cm4gMDsKKyMgIGVuZGlmCisjZWxzZQorIyAgaWZkZWYgSEFTX3NucHJpbnRmX3ZvaWQKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKwkgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisgICAgbGVuID0gc3RybGVuKGJ1Zik7CisgICAgaWYgKGxlbiA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKyMgIGVsc2UKKyAgICBsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKwkgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPj0gc2l6ZW9mKGJ1ZikpCisgICAgICAgIHJldHVybiAwOworIyAgZW5kaWYKKyNlbmRpZgogCiAgICAgcmV0dXJuIGd6d3JpdGUoZmlsZSwgYnVmLCBsZW4pOwogfQpAQCAtNjgxLDYgKzczNSw3IEBACiAJLyogQXQgdGhpcyBwb2ludCwgb2Zmc2V0IGlzIHRoZSBudW1iZXIgb2YgemVybyBieXRlcyB0byB3cml0ZS4gKi8KIAlpZiAocy0+aW5idWYgPT0gWl9OVUxMKSB7CiAJICAgIHMtPmluYnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7IC8qIGZvciBzZWVraW5nICovCisgICAgICAgICAgICBpZiAocy0+aW5idWYgPT0gWl9OVUxMKSByZXR1cm4gLTFMOwogCSAgICB6bWVtemVybyhzLT5pbmJ1ZiwgWl9CVUZTSVpFKTsKIAl9CiAJd2hpbGUgKG9mZnNldCA+IDApICB7CkBAIC03MjMsNiArNzc4LDcgQEAKIAogICAgIGlmIChvZmZzZXQgIT0gMCAmJiBzLT5vdXRidWYgPT0gWl9OVUxMKSB7CiAJcy0+b3V0YnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7CisgICAgICAgIGlmIChzLT5vdXRidWYgPT0gWl9OVUxMKSByZXR1cm4gLTFMOwogICAgIH0KICAgICB3aGlsZSAob2Zmc2V0ID4gMCkgIHsKIAlpbnQgc2l6ZSA9IFpfQlVGU0laRTsKQEAgLTg2MiwxMiArOTE4LDEzIEBACiAgICAgKmVycm51bSA9IHMtPnpfZXJyOwogICAgIGlmICgqZXJybnVtID09IFpfT0spIHJldHVybiAoY29uc3QgY2hhciopIiI7CiAKLSAgICBtID0gIChjaGFyKikoKmVycm51bSA9PSBaX0VSUk5PID8genN0cmVycm9yKGVycm5vKSA6IHMtPnN0cmVhbS5tc2cpOworICAgIG0gPSAoY2hhciopKCplcnJudW0gPT0gWl9FUlJOTyA/IHpzdHJlcnJvcihlcnJubykgOiBzLT5zdHJlYW0ubXNnKTsKIAogICAgIGlmIChtID09IE5VTEwgfHwgKm0gPT0gJ1wwJykgbSA9IChjaGFyKilFUlJfTVNHKHMtPnpfZXJyKTsKIAogICAgIFRSWUZSRUUocy0+bXNnKTsKICAgICBzLT5tc2cgPSAoY2hhciopQUxMT0Moc3RybGVuKHMtPnBhdGgpICsgc3RybGVuKG0pICsgMyk7CisgICAgaWYgKHMtPm1zZyA9PSBaX05VTEwpIHJldHVybiAoY29uc3QgY2hhciopRVJSX01TRyhaX01FTV9FUlJPUik7CiAgICAgc3RyY3B5KHMtPm1zZywgcy0+cGF0aCk7CiAgICAgc3RyY2F0KHMtPm1zZywgIjogIik7CiAgICAgc3RyY2F0KHMtPm1zZywgbSk7CmRpZmYgLS1naXQgYS9pbmZiYWNrLmMgYi9pbmZiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwOTBhZAotLS0gL2Rldi9udWxsCisrKyBiL2luZmJhY2suYwpAQCAtMCwwICsxLDYxNSBAQAorLyogaW5mYmFjay5jIC0tIGluZmxhdGUgdXNpbmcgYSBjYWxsLWJhY2sgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAgIFRoaXMgY29kZSBpcyBsYXJnZWx5IGNvcGllZCBmcm9tIGluZmxhdGUuYy4gIE5vcm1hbGx5IGVpdGhlciBpbmZiYWNrLm8gb3IKKyAgIGluZmxhdGUubyB3b3VsZCBiZSBsaW5rZWQgaW50byBhbiBhcHBsaWNhdGlvbi0tbm90IGJvdGguICBUaGUgaW50ZXJmYWNlCisgICB3aXRoIGluZmZhc3QuYyBpcyByZXRhaW5lZCBzbyB0aGF0IG9wdGltaXplZCBhc3NlbWJsZXItY29kZWQgdmVyc2lvbnMgb2YKKyAgIGluZmxhdGVfZmFzdCgpIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIGluZmxhdGUuYyBvciBpbmZiYWNrLmMuCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitsb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7CisKKy8qCisgICBzdHJtIHByb3ZpZGVzIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBpbiB6YWxsb2MgYW5kIHpmcmVlLCBvcgorICAgWl9OVUxMIHRvIHVzZSB0aGUgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgIHdpbmRvd0JpdHMgaXMgaW4gdGhlIHJhbmdlIDguLjE1LCBhbmQgd2luZG93IGlzIGEgdXNlci1zdXBwbGllZAorICAgd2luZG93IGFuZCBvdXRwdXQgYnVmZmVyIHRoYXQgaXMgMioqd2luZG93Qml0cyBieXRlcy4KKyAqLworaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XyhzdHJtLCB3aW5kb3dCaXRzLCB3aW5kb3csIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW0gRkFSICpzdHJtOworaW50IHdpbmRvd0JpdHM7Cit1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OworY29uc3QgY2hhciAqdmVyc2lvbjsKK2ludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gWkxJQl9WRVJTSU9OWzBdIHx8CisgICAgICAgIHN0cmVhbV9zaXplICE9IChpbnQpKHNpemVvZih6X3N0cmVhbSkpKQorICAgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCB3aW5kb3cgPT0gWl9OVUxMIHx8CisgICAgICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovCisgICAgaWYgKHN0cm0tPnphbGxvYyA9PSBaX05VTEwpIHsKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworICAgIH0KKyAgICBpZiAoc3RybS0+emZyZWUgPT0gWl9OVUxMKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilaQUxMT0Moc3RybSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CisgICAgc3RybS0+c3RhdGUgPSAodm9pZHBmKXN0YXRlOworICAgIHN0YXRlLT53Yml0cyA9IHdpbmRvd0JpdHM7CisgICAgc3RhdGUtPndzaXplID0gMVUgPDwgd2luZG93Qml0czsKKyAgICBzdGF0ZS0+d2luZG93ID0gd2luZG93OworICAgIHN0YXRlLT53cml0ZSA9IDA7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qCisgICBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvCisgICBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguCisgICBJZiBCVUlMREZJWEVEIGlzIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGlzIHJvdXRpbmUgYnVpbGRzIHRoZSB0YWJsZXMgdGhlCisgICBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kCisgICB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpbgorICAgZXhjaGFuZ2UgZm9yIGEgbGl0dGxlIGV4ZWN1dGlvbiB0aW1lLiAgSG93ZXZlciwgQlVJTERGSVhFRCBzaG91bGQgbm90IGJlCisgICB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luCisgICBtYXkgbm90IGJlIHRocmVhZC1zYWZlLgorICovCitsb2NhbCB2b2lkIGZpeGVkdGFibGVzKHN0YXRlKQorc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKK3sKKyNpZmRlZiBCVUlMREZJWEVECisgICAgc3RhdGljIGludCB2aXJnaW4gPSAxOworICAgIHN0YXRpYyBjb2RlICpsZW5maXgsICpkaXN0Zml4OworICAgIHN0YXRpYyBjb2RlIGZpeGVkWzU0NF07CisKKyAgICAvKiBidWlsZCBmaXhlZCBodWZmbWFuIHRhYmxlcyBpZiBmaXJzdCBjYWxsIChtYXkgbm90IGJlIHRocmVhZCBzYWZlKSAqLworICAgIGlmICh2aXJnaW4pIHsKKyAgICAgICAgdW5zaWduZWQgc3ltLCBiaXRzOworICAgICAgICBzdGF0aWMgY29kZSAqbmV4dDsKKworICAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqLworICAgICAgICBzeW0gPSAwOworICAgICAgICB3aGlsZSAoc3ltIDwgMTQ0KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA4OworICAgICAgICB3aGlsZSAoc3ltIDwgMjU2KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA5OworICAgICAgICB3aGlsZSAoc3ltIDwgMjgwKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA3OworICAgICAgICB3aGlsZSAoc3ltIDwgMjg4KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA4OworICAgICAgICBuZXh0ID0gZml4ZWQ7CisgICAgICAgIGxlbmZpeCA9IG5leHQ7CisgICAgICAgIGJpdHMgPSA5OworICAgICAgICBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCAyODgsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKKworICAgICAgICAvKiBkaXN0YW5jZSB0YWJsZSAqLworICAgICAgICBzeW0gPSAwOworICAgICAgICB3aGlsZSAoc3ltIDwgMzIpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDU7CisgICAgICAgIGRpc3RmaXggPSBuZXh0OworICAgICAgICBiaXRzID0gNTsKKyAgICAgICAgaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMsIDMyLCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7CisKKyAgICAgICAgLyogZG8gdGhpcyBqdXN0IG9uY2UgKi8KKyAgICAgICAgdmlyZ2luID0gMDsKKyAgICB9CisjZWxzZSAvKiAhQlVJTERGSVhFRCAqLworIyAgIGluY2x1ZGUgImluZmZpeGVkLmgiCisjZW5kaWYgLyogQlVJTERGSVhFRCAqLworICAgIHN0YXRlLT5sZW5jb2RlID0gbGVuZml4OworICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKKyAgICBzdGF0ZS0+ZGlzdGNvZGUgPSBkaXN0Zml4OworICAgIHN0YXRlLT5kaXN0Yml0cyA9IDU7Cit9CisKKy8qIE1hY3JvcyBmb3IgaW5mbGF0ZUJhY2soKTogKi8KKworLyogTG9hZCByZXR1cm5lZCBzdGF0ZSBmcm9tIGluZmxhdGVfZmFzdCgpICovCisjZGVmaW5lIExPQUQoKSBcCisgICAgZG8geyBcCisgICAgICAgIHB1dCA9IHN0cm0tPm5leHRfb3V0OyBcCisgICAgICAgIGxlZnQgPSBzdHJtLT5hdmFpbF9vdXQ7IFwKKyAgICAgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47IFwKKyAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX2luOyBcCisgICAgICAgIGhvbGQgPSBzdGF0ZS0+aG9sZDsgXAorICAgICAgICBiaXRzID0gc3RhdGUtPmJpdHM7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBTZXQgc3RhdGUgZnJvbSByZWdpc3RlcnMgZm9yIGluZmxhdGVfZmFzdCgpICovCisjZGVmaW5lIFJFU1RPUkUoKSBcCisgICAgZG8geyBcCisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gcHV0OyBcCisgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IGxlZnQ7IFwKKyAgICAgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7IFwKKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOyBcCisgICAgICAgIHN0YXRlLT5ob2xkID0gaG9sZDsgXAorICAgICAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBDbGVhciB0aGUgaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCisjZGVmaW5lIElOSVRCSVRTKCkgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID0gMDsgXAorICAgICAgICBiaXRzID0gMDsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEFzc3VyZSB0aGF0IHNvbWUgaW5wdXQgaXMgYXZhaWxhYmxlLiAgSWYgaW5wdXQgaXMgcmVxdWVzdGVkLCBidXQgZGVuaWVkLAorICAgdGhlbiByZXR1cm4gYSBaX0JVRl9FUlJPUiBmcm9tIGluZmxhdGVCYWNrKCkuICovCisjZGVmaW5lIFBVTEwoKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChoYXZlID09IDApIHsgXAorICAgICAgICAgICAgaGF2ZSA9IGluKGluX2Rlc2MsICZuZXh0KTsgXAorICAgICAgICAgICAgaWYgKGhhdmUgPT0gMCkgeyBcCisgICAgICAgICAgICAgICAgbmV4dCA9IFpfTlVMTDsgXAorICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCisgICAgICAgICAgICAgICAgZ290byBsZWF2ZTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpCisgICB3aXRoIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgUFVMTEJZVEUoKSBcCisgICAgZG8geyBcCisgICAgICAgIFBVTEwoKTsgXAorICAgICAgICBoYXZlLS07IFwKKyAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAorICAgICAgICBiaXRzICs9IDg7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcworICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpIHdpdGgKKyAgIGFuIGVycm9yLiAqLworI2RlZmluZSBORUVEQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAorICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDwgMTYpICovCisjZGVmaW5lIEJJVFMobikgXAorICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQorCisvKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBEUk9QQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IChuKTsgXAorICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgQllURUJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCisgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCBzb21lIG91dHB1dCBzcGFjZSBpcyBhdmFpbGFibGUsIGJ5IHdyaXRpbmcgb3V0IHRoZSB3aW5kb3cKKyAgIGlmIGl0J3MgZnVsbC4gIElmIHRoZSB3cml0ZSBmYWlscywgcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKSB3aXRoIGEKKyAgIFpfQlVGX0VSUk9SLiAqLworI2RlZmluZSBST09NKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAobGVmdCA9PSAwKSB7IFwKKyAgICAgICAgICAgIHB1dCA9IHN0YXRlLT53aW5kb3c7IFwKKyAgICAgICAgICAgIGxlZnQgPSBzdGF0ZS0+d3NpemU7IFwKKyAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHB1dCwgbGVmdCkpIHsgXAorICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCisgICAgICAgICAgICAgICAgZ290byBsZWF2ZTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKy8qCisgICBzdHJtIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgYW5kIHdpbmRvdyBidWZmZXIgb24gaW5wdXQsCisgICBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHVudXNlZCBpbnB1dCBvbiByZXR1cm4uICBGb3IgWl9EQVRBX0VSUk9SCisgICByZXR1cm5zLCBzdHJtIHdpbGwgYWxzbyBwcm92aWRlIGFuIGVycm9yIG1lc3NhZ2UuCisKKyAgIGluKCkgYW5kIG91dCgpIGFyZSB0aGUgY2FsbC1iYWNrIGlucHV0IGFuZCBvdXRwdXQgZnVuY3Rpb25zLiAgV2hlbgorICAgaW5mbGF0ZUJhY2soKSBuZWVkcyBtb3JlIGlucHV0LCBpdCBjYWxscyBpbigpLiAgV2hlbiBpbmZsYXRlQmFjaygpIGhhcworICAgZmlsbGVkIHRoZSB3aW5kb3cgd2l0aCBvdXRwdXQsIG9yIHdoZW4gaXQgY29tcGxldGVzIHdpdGggZGF0YSBpbiB0aGUKKyAgIHdpbmRvdywgaXQgY2FsbGVkIG91dCgpIHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdAorICAgY2hhbmdlIHRoZSBwcm92aWRlZCBpbnB1dCB1bnRpbCBpbigpIGlzIGNhbGxlZCBhZ2FpbiBvciBpbmZsYXRlQmFjaygpCisgICByZXR1cm5zLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGNoYW5nZSB0aGUgd2luZG93L291dHB1dCBidWZmZXIgdW50aWwKKyAgIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KKworICAgaW4oKSBhbmQgb3V0KCkgYXJlIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBwYXJhbWV0ZXIgcHJvdmlkZWQgaW4gdGhlCisgICBpbmZsYXRlQmFjaygpIGNhbGwuICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyB0aGUKKyAgIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGRvIHRoZSByZWFkIG9yIHdyaXRlLCBhcyB3ZWxsIGFzIGFjY3VtdWxhdGVkCisgICBpbmZvcm1hdGlvbiBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdWNoIGFzIHRvdGFscyBhbmQgY2hlY2sgdmFsdWVzLgorCisgICBpbigpIHNob3VsZCByZXR1cm4gemVybyBvbiBmYWlsdXJlLiAgb3V0KCkgc2hvdWxkIHJldHVybiBub24temVybyBvbgorICAgZmFpbHVyZS4gIElmIGVpdGhlciBpbigpIG9yIG91dCgpIGZhaWxzLCB0aGFuIGluZmxhdGVCYWNrKCkgcmV0dXJucyBhCisgICBaX0JVRl9FUlJPUi4gIHN0cm0tPm5leHRfaW4gY2FuIGJlIGNoZWNrZWQgZm9yIFpfTlVMTCB0byBzZWUgd2hldGhlciBpdAorICAgd2FzIGluKCkgb3Igb3V0KCkgdGhhdCBjYXVzZWQgaW4gdGhlIGVycm9yLiAgT3RoZXJ3aXNlLCAgaW5mbGF0ZUJhY2soKQorICAgcmV0dXJucyBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9EQVRBX0VSUk9SIGZvciBhbiBkZWZsYXRlIGZvcm1hdAorICAgZXJyb3IsIG9yIFpfTUVNX0VSUk9SIGlmIGl0IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdGF0ZS4KKyAgIGluZmxhdGVCYWNrKCkgY2FuIGFsc28gcmV0dXJuIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICBhcmUgbm90IGNvcnJlY3QsIGkuZS4gc3RybSBpcyBaX05VTEwgb3IgdGhlIHN0YXRlIHdhcyBub3QgaW5pdGlhbGl6ZWQuCisgKi8KK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrKHN0cm0sIGluLCBpbl9kZXNjLCBvdXQsIG91dF9kZXNjKQorel9zdHJlYW0gRkFSICpzdHJtOworaW5fZnVuYyBpbjsKK3ZvaWQgRkFSICppbl9kZXNjOworb3V0X2Z1bmMgb3V0Owordm9pZCBGQVIgKm91dF9kZXNjOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgY2hhciAqbmV4dCwgKnB1dDsgIC8qIG5leHQgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIHVuc2lnbmVkIGhhdmUsIGxlZnQ7ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpmcm9tOyAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCisgICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KKyAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb3JkZXJbMTldID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCisgICAgICAgIHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIHN0cm0gZXhpc3RzIGFuZCB0aGF0IHRoZSBzdGF0ZSB3YXMgaW5pdGlhbGl6ZWQgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisKKyAgICAvKiBSZXNldCB0aGUgc3RhdGUgKi8KKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7CisgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgIHN0YXRlLT5sYXN0ID0gMDsKKyAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsKKyAgICBoYXZlID0gbmV4dCAhPSBaX05VTEwgPyBzdHJtLT5hdmFpbF9pbiA6IDA7CisgICAgaG9sZCA9IDA7CisgICAgYml0cyA9IDA7CisgICAgcHV0ID0gc3RhdGUtPndpbmRvdzsKKyAgICBsZWZ0ID0gc3RhdGUtPndzaXplOworCisgICAgLyogSW5mbGF0ZSB1bnRpbCBlbmQgb2YgYmxvY2sgbWFya2VkIGFzIGxhc3QgKi8KKyAgICBmb3IgKDs7KQorICAgICAgICBzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CisgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBhbmQgZGlzcGF0Y2ggYmxvY2sgdHlwZSAqLworICAgICAgICAgICAgaWYgKHN0YXRlLT5sYXN0KSB7CisgICAgICAgICAgICAgICAgQllURUJJVFMoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERPTkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBORUVEQklUUygzKTsKKyAgICAgICAgICAgIHN0YXRlLT5sYXN0ID0gQklUUygxKTsKKyAgICAgICAgICAgIERST1BCSVRTKDEpOworICAgICAgICAgICAgc3dpdGNoIChCSVRTKDIpKSB7CisgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFNUT1JFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpOworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47ICAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUQUJMRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUT1JFRDoKKyAgICAgICAgICAgIC8qIGdldCBhbmQgdmVyaWZ5IHN0b3JlZCBibG9jayBsZW5ndGggKi8KKyAgICAgICAgICAgIEJZVEVCSVRTKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi8KKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT0gKChob2xkID4+IDE2KSBeIDB4ZmZmZikpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpaG9sZCAmIDB4ZmZmZjsKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCkpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKworICAgICAgICAgICAgLyogY29weSBzdG9yZWQgYmxvY2sgZnJvbSBpbnB1dCB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+bGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKKyAgICAgICAgICAgICAgICBQVUxMKCk7CisgICAgICAgICAgICAgICAgUk9PTSgpOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgICAgICB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgcHV0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRBQkxFOgorICAgICAgICAgICAgLyogZ2V0IGR5bmFtaWMgdGFibGUgZW50cmllcyBkZXNjcmlwdG9yICovCisgICAgICAgICAgICBORUVEQklUUygxNCk7CisgICAgICAgICAgICBzdGF0ZS0+bmxlbiA9IEJJVFMoNSkgKyAyNTc7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uZGlzdCA9IEJJVFMoNSkgKyAxOworICAgICAgICAgICAgRFJPUEJJVFMoNSk7CisgICAgICAgICAgICBzdGF0ZS0+bmNvZGUgPSBCSVRTKDQpICsgNDsKKyAgICAgICAgICAgIERST1BCSVRTKDQpOworI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAorICAgICAgICAgICAgaWYgKHN0YXRlLT5ubGVuID4gMjg2IHx8IHN0YXRlLT5uZGlzdCA+IDMwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHRhYmxlIHNpemVzIG9rXG4iKSk7CisKKyAgICAgICAgICAgIC8qIGdldCBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKG5vdCBhIHR5cG8pICovCisgICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmNvZGUpIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAodW5zaWduZWQgc2hvcnQpQklUUygzKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IDE5KQorICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gNzsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLT5sZW5zLCAxOSwgJihzdGF0ZS0+bmV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXG4iKSk7CisKKyAgICAgICAgICAgIC8qIGdldCBsZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgY29kZSBsZW5ndGhzICovCisgICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUrK10gPSB0aGlzLnZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbCA9PSAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkoc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUgLSAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhbCA9PSAxNykgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAxMSArIEJJVFMoNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgKyBjb3B5ID4gc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY29weS0tKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUrK10gPSAodW5zaWduZWQgc2hvcnQpbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgKi8KKyAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOworICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA5OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgc3RhdGUtPm5sZW4sICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZGlzdGNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmRpc3RiaXRzID0gNjsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zICsgc3RhdGUtPm5sZW4sIHN0YXRlLT5uZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5uZXh0KSwgJihzdGF0ZS0+ZGlzdGJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZXMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOworCisgICAgICAgIGNhc2UgTEVOOgorICAgICAgICAgICAgLyogdXNlIGluZmxhdGVfZmFzdCgpIGlmIHdlIGhhdmUgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKKyAgICAgICAgICAgICAgICBSRVNUT1JFKCk7CisgICAgICAgICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXRlLT53c2l6ZSk7CisgICAgICAgICAgICAgICAgTE9BRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnZXQgYSBsaXRlcmFsLCBsZW5ndGgsIG9yIGVuZC1vZi1ibG9jayBjb2RlICovCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5vcCAmJiAodGhpcy5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gdGhpczsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCl0aGlzLnZhbDsKKworICAgICAgICAgICAgLyogcHJvY2VzcyBsaXRlcmFsICovCisgICAgICAgICAgICBpZiAodGhpcy5vcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCB0aGlzLnZhbCA+PSAweDIwICYmIHRoaXMudmFsIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIHRoaXMudmFsKSk7CisgICAgICAgICAgICAgICAgUk9PTSgpOworICAgICAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgZW5kIG9mIGJsb2NrICovCisgICAgICAgICAgICBpZiAodGhpcy5vcCAmIDMyKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSAqLworICAgICAgICAgICAgaWYgKHRoaXMub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGxlbmd0aCBjb2RlIC0tIGdldCBleHRyYSBiaXRzLCBpZiBhbnkgKi8KKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkodGhpcy5vcCkgJiAxNTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBzdGF0ZS0+bGVuZ3RoKSk7CisKKyAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtCSVRTKHN0YXRlLT5kaXN0Yml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgodGhpcy5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gdGhpczsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+ZGlzdGNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyB0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCl0aGlzLnZhbDsKKworICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlIGV4dHJhIGJpdHMsIGlmIGFueSAqLworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+d3NpemUpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBzdGF0ZS0+b2Zmc2V0KSk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgbWF0Y2ggZnJvbSB3aW5kb3cgdG8gb3V0cHV0ICovCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgUk9PTSgpOworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+d3NpemUgLSBzdGF0ZS0+b2Zmc2V0OworICAgICAgICAgICAgICAgIGlmIChjb3B5IDwgbGVmdCkgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gcHV0ICsgY29weTsKKyAgICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQgLSBjb3B5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7CisgICAgICAgICAgICB9IHdoaWxlIChzdGF0ZS0+bGVuZ3RoICE9IDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBET05FOgorICAgICAgICAgICAgLyogaW5mbGF0ZSBzdHJlYW0gdGVybWluYXRlZCBwcm9wZXJseSAtLSB3cml0ZSBsZWZ0b3ZlciBvdXRwdXQgKi8KKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgIGlmIChsZWZ0IDwgc3RhdGUtPndzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgc3RhdGUtPndpbmRvdywgc3RhdGUtPndzaXplIC0gbGVmdCkpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBsZWF2ZTsKKworICAgICAgICBjYXNlIEJBRDoKKyAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gbGVhdmU7CisKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgLyogY2FuJ3QgaGFwcGVuLCBidXQgbWFrZXMgY29tcGlsZXJzIGhhcHB5ICovCisgICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgIH0KKworICAgIC8qIFJldHVybiB1bnVzZWQgaW5wdXQgKi8KKyAgbGVhdmU6CisgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7CisgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrRW5kKHN0cm0pCit6X3N0cmVhbSBGQVIgKnN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+emZyZWUgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOworICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CmRpZmYgLS1naXQgYS9pbmZibG9jay5jIGIvaW5mYmxvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3YTZkNC4uMDAwMDAwMAotLS0gYS9pbmZibG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAzICswLDAgQEAKLS8qIGluZmJsb2NrLmMgLS0gaW50ZXJwcmV0IGFuZCBwcm9jZXNzIGJsb2NrIHR5cGVzIHRvIGxhc3QgYmxvY2sKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mYmxvY2suaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotI2luY2x1ZGUgImluZmNvZGVzLmgiCi0jaW5jbHVkZSAiaW5mdXRpbC5oIgotCi1zdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KLQotLyogc2ltcGxpZnkgdGhlIHVzZSBvZiB0aGUgaW5mbGF0ZV9odWZ0IHR5cGUgd2l0aCBzb21lIGRlZmluZXMgKi8KLSNkZWZpbmUgZXhvcCB3b3JkLndoYXQuRXhvcAotI2RlZmluZSBiaXRzIHdvcmQud2hhdC5CaXRzCi0KLS8qIFRhYmxlIGZvciBkZWZsYXRlIGZyb20gUEtaSVAncyBhcHBub3RlLnR4dC4gKi8KLWxvY2FsIGNvbnN0IHVJbnQgYm9yZGVyW10gPSB7IC8qIE9yZGVyIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLwotICAgICAgICAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKLQotLyoKLSAgIE5vdGVzIGJleW9uZCB0aGUgMS45M2EgYXBwbm90ZS50eHQ6Ci0KLSAgIDEuIERpc3RhbmNlIHBvaW50ZXJzIG5ldmVyIHBvaW50IGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQKLSAgICAgIHN0cmVhbS4KLSAgIDIuIERpc3RhbmNlIHBvaW50ZXJzIGNhbiBwb2ludCBiYWNrIGFjcm9zcyBibG9ja3MsIHVwIHRvIDMyayBhd2F5LgotICAgMy4gVGhlcmUgaXMgYW4gaW1wbGllZCBtYXhpbXVtIG9mIDcgYml0cyBmb3IgdGhlIGJpdCBsZW5ndGggdGFibGUgYW5kCi0gICAgICAxNSBiaXRzIGZvciB0aGUgYWN0dWFsIGRhdGEuCi0gICA0LiBJZiBvbmx5IG9uZSBjb2RlIGV4aXN0cywgdGhlbiBpdCBpcyBlbmNvZGVkIHVzaW5nIG9uZSBiaXQuICAoWmVybwotICAgICAgd291bGQgYmUgbW9yZSBlZmZpY2llbnQsIGJ1dCBwZXJoYXBzIGEgbGl0dGxlIGNvbmZ1c2luZy4pICBJZiB0d28KLSAgICAgIGNvZGVzIGV4aXN0LCB0aGV5IGFyZSBjb2RlZCB1c2luZyBvbmUgYml0IGVhY2ggKDAgYW5kIDEpLgotICAgNS4gVGhlcmUgaXMgbm8gd2F5IG9mIHNlbmRpbmcgemVybyBkaXN0YW5jZSBjb2Rlcy0tYSBkdW1teSBtdXN0IGJlCi0gICAgICBzZW50IGlmIHRoZXJlIGFyZSBub25lLiAgKEhpc3Rvcnk6IGEgcHJlIDIuMCB2ZXJzaW9uIG9mIFBLWklQIHdvdWxkCi0gICAgICBzdG9yZSBibG9ja3Mgd2l0aCBubyBkaXN0YW5jZSBjb2RlcywgYnV0IHRoaXMgd2FzIGRpc2NvdmVyZWQgdG8gYmUKLSAgICAgIHRvbyBoYXJzaCBhIGNyaXRlcmlvbi4pICBWYWxpZCBvbmx5IGZvciAxLjkzYS4gIDIuMDRjIGRvZXMgYWxsb3cKLSAgICAgIHplcm8gZGlzdGFuY2UgY29kZXMsIHdoaWNoIGlzIHNlbnQgYXMgb25lIGNvZGUgb2YgemVybyBiaXRzIGluCi0gICAgICBsZW5ndGguCi0gICA2LiBUaGVyZSBhcmUgdXAgdG8gMjg2IGxpdGVyYWwvbGVuZ3RoIGNvZGVzLiAgQ29kZSAyNTYgcmVwcmVzZW50cyB0aGUKLSAgICAgIGVuZC1vZi1ibG9jay4gIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBzdGF0aWMgbGVuZ3RoIHRyZWUgZGVmaW5lcwotICAgICAgMjg4IGNvZGVzIGp1c3QgdG8gZmlsbCBvdXQgdGhlIEh1ZmZtYW4gY29kZXMuICBDb2RlcyAyODYgYW5kIDI4NwotICAgICAgY2Fubm90IGJlIHVzZWQgdGhvdWdoLCBzaW5jZSB0aGVyZSBpcyBubyBsZW5ndGggYmFzZSBvciBleHRyYSBiaXRzCi0gICAgICBkZWZpbmVkIGZvciB0aGVtLiAgU2ltaWxhcmlseSwgdGhlcmUgYXJlIHVwIHRvIDMwIGRpc3RhbmNlIGNvZGVzLgotICAgICAgSG93ZXZlciwgc3RhdGljIHRyZWVzIGRlZmluZSAzMiBjb2RlcyAoYWxsIDUgYml0cykgdG8gZmlsbCBvdXQgdGhlCi0gICAgICBIdWZmbWFuIGNvZGVzLCBidXQgdGhlIGxhc3QgdHdvIGhhZCBiZXR0ZXIgbm90IHNob3cgdXAgaW4gdGhlIGRhdGEuCi0gICA3LiBVbnppcCBjYW4gY2hlY2sgZHluYW1pYyBIdWZmbWFuIGJsb2NrcyBmb3IgY29tcGxldGUgY29kZSBzZXRzLgotICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGF0IGEgc2luZ2xlIGNvZGUgd291bGQgbm90IGJlIGNvbXBsZXRlIChzZWUgIzQpLgotICAgOC4gVGhlIGZpdmUgYml0cyBmb2xsb3dpbmcgdGhlIGJsb2NrIHR5cGUgaXMgcmVhbGx5IHRoZSBudW1iZXIgb2YKLSAgICAgIGxpdGVyYWwgY29kZXMgc2VudCBtaW51cyAyNTcuCi0gICA5LiBMZW5ndGggY29kZXMgOCwxNiwxNiBhcmUgaW50ZXJwcmV0ZWQgYXMgMTMgbGVuZ3RoIGNvZGVzIG9mIDggYml0cwotICAgICAgKDErNis2KS4gIFRoZXJlZm9yZSwgdG8gb3V0cHV0IHRocmVlIHRpbWVzIHRoZSBsZW5ndGgsIHlvdSBvdXRwdXQKLSAgICAgIHRocmVlIGNvZGVzICgxKzErMSksIHdoZXJlYXMgdG8gb3V0cHV0IGZvdXIgdGltZXMgdGhlIHNhbWUgbGVuZ3RoLAotICAgICAgeW91IG9ubHkgbmVlZCB0d28gY29kZXMgKDErMykuICBIbW0uCi0gIDEwLiBJbiB0aGUgdHJlZSByZWNvbnN0cnVjdGlvbiBhbGdvcml0aG0sIENvZGUgPSBDb2RlICsgSW5jcmVtZW50Ci0gICAgICBvbmx5IGlmIEJpdExlbmd0aChpKSBpcyBub3QgemVyby4gIChQcmV0dHkgb2J2aW91cy4pCi0gIDExLiBDb3JyZWN0aW9uOiA0IEJpdHM6ICMgb2YgQml0IExlbmd0aCBjb2RlcyAtIDQgICAgICg0IC0gMTkpCi0gIDEyLiBOb3RlOiBsZW5ndGggY29kZSAyODQgY2FuIHJlcHJlc2VudCAyMjctMjU4LCBidXQgbGVuZ3RoIGNvZGUgMjg1Ci0gICAgICByZWFsbHkgaXMgMjU4LiAgVGhlIGxhc3QgbGVuZ3RoIGRlc2VydmVzIGl0cyBvd24sIHNob3J0IGNvZGUKLSAgICAgIHNpbmNlIGl0IGdldHMgdXNlZCBhIGxvdCBpbiB2ZXJ5IHJlZHVuZGFudCBmaWxlcy4gIFRoZSBsZW5ndGgKLSAgICAgIDI1OCBpcyBzcGVjaWFsIHNpbmNlIDI1OCAtIDMgKHRoZSBtaW4gbWF0Y2ggbGVuZ3RoKSBpcyAyNTUuCi0gIDEzLiBUaGUgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgYml0IGxlbmd0aHMgYXJlIHJlYWQgYXMgYQotICAgICAgc2luZ2xlIHN0cmVhbSBvZiBsZW5ndGhzLiAgSXQgaXMgcG9zc2libGUgKGFuZCBhZHZhbnRhZ2VvdXMpIGZvcgotICAgICAgYSByZXBlYXQgY29kZSAoMTYsIDE3LCBvciAxOCkgdG8gZ28gYWNyb3NzIHRoZSBib3VuZGFyeSBiZXR3ZWVuCi0gICAgICB0aGUgdHdvIHNldHMgb2YgbGVuZ3Rocy4KLSAqLwotCi0KLXZvaWQgaW5mbGF0ZV9ibG9ja3NfcmVzZXQocywgeiwgYykKLWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKLXpfc3RyZWFtcCB6OwotdUxvbmdmICpjOwotewotICBpZiAoYyAhPSBaX05VTEwpCi0gICAgKmMgPSBzLT5jaGVjazsKLSAgaWYgKHMtPm1vZGUgPT0gQlRSRUUgfHwgcy0+bW9kZSA9PSBEVFJFRSkKLSAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOwotICBpZiAocy0+bW9kZSA9PSBDT0RFUykKLSAgICBpbmZsYXRlX2NvZGVzX2ZyZWUocy0+c3ViLmRlY29kZS5jb2Rlcywgeik7Ci0gIHMtPm1vZGUgPSBUWVBFOwotICBzLT5iaXRrID0gMDsKLSAgcy0+Yml0YiA9IDA7Ci0gIHMtPnJlYWQgPSBzLT53cml0ZSA9IHMtPndpbmRvdzsKLSAgaWYgKHMtPmNoZWNrZm4gIT0gWl9OVUxMKQotICAgIHotPmFkbGVyID0gcy0+Y2hlY2sgPSAoKnMtPmNoZWNrZm4pKDBMLCAoY29uc3QgQnl0ZWYgKilaX05VTEwsIDApOwotICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgYmxvY2tzIHJlc2V0XG4iKSk7Ci19Ci0KLQotaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICppbmZsYXRlX2Jsb2Nrc19uZXcoeiwgYywgdykKLXpfc3RyZWFtcCB6OwotY2hlY2tfZnVuYyBjOwotdUludCB3OwotewotICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Ci0KLSAgaWYgKChzID0gKGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqKVpBTExPQwotICAgICAgICh6LDEsc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSkpKSA9PSBaX05VTEwpCi0gICAgcmV0dXJuIHM7Ci0gIGlmICgocy0+aHVmdHMgPQotICAgICAgIChpbmZsYXRlX2h1ZnQgKilaQUxMT0Moeiwgc2l6ZW9mKGluZmxhdGVfaHVmdCksIE1BTlkpKSA9PSBaX05VTEwpCi0gIHsKLSAgICBaRlJFRSh6LCBzKTsKLSAgICByZXR1cm4gWl9OVUxMOwotICB9Ci0gIGlmICgocy0+d2luZG93ID0gKEJ5dGVmICopWkFMTE9DKHosIDEsIHcpKSA9PSBaX05VTEwpCi0gIHsKLSAgICBaRlJFRSh6LCBzLT5odWZ0cyk7Ci0gICAgWkZSRUUoeiwgcyk7Ci0gICAgcmV0dXJuIFpfTlVMTDsKLSAgfQotICBzLT5lbmQgPSBzLT53aW5kb3cgKyB3OwotICBzLT5jaGVja2ZuID0gYzsKLSAgcy0+bW9kZSA9IFRZUEU7Ci0gIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBibG9ja3MgYWxsb2NhdGVkXG4iKSk7Ci0gIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosIFpfTlVMTCk7Ci0gIHJldHVybiBzOwotfQotCi0KLWludCBpbmZsYXRlX2Jsb2NrcyhzLCB6LCByKQotaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOwotel9zdHJlYW1wIHo7Ci1pbnQgcjsKLXsKLSAgdUludCB0OyAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlICovCi0gIHVMb25nIGI7ICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgQnl0ZWYgKnA7ICAgICAgICAgICAgIC8qIGlucHV0IGRhdGEgcG9pbnRlciAqLwotICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCi0gIEJ5dGVmICpxOyAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KLSAgdUludCBtOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyICovCi0KLSAgLyogY29weSBpbnB1dC9vdXRwdXQgaW5mb3JtYXRpb24gdG8gbG9jYWxzIChVUERBVEUgbWFjcm8gcmVzdG9yZXMpICovCi0gIExPQUQKLQotICAvKiBwcm9jZXNzIGlucHV0IGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgKi8KLSAgd2hpbGUgKDEpIHN3aXRjaCAocy0+bW9kZSkKLSAgewotICAgIGNhc2UgVFlQRToKLSAgICAgIE5FRURCSVRTKDMpCi0gICAgICB0ID0gKHVJbnQpYiAmIDc7Ci0gICAgICBzLT5sYXN0ID0gdCAmIDE7Ci0gICAgICBzd2l0Y2ggKHQgPj4gMSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZWQgKi8KLSAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgcy0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgRFVNUEJJVFMoMykKLSAgICAgICAgICB0ID0gayAmIDc7ICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCi0gICAgICAgICAgRFVNUEJJVFModCkKLSAgICAgICAgICBzLT5tb2RlID0gTEVOUzsgICAgICAgICAgICAgICAvKiBnZXQgbGVuZ3RoIG9mIHN0b3JlZCBibG9jayAqLwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkICovCi0gICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgcy0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgewotICAgICAgICAgICAgdUludCBibCwgYmQ7Ci0gICAgICAgICAgICBpbmZsYXRlX2h1ZnQgKnRsLCAqdGQ7Ci0KLSAgICAgICAgICAgIGluZmxhdGVfdHJlZXNfZml4ZWQoJmJsLCAmYmQsICZ0bCwgJnRkLCB6KTsKLSAgICAgICAgICAgIHMtPnN1Yi5kZWNvZGUuY29kZXMgPSBpbmZsYXRlX2NvZGVzX25ldyhibCwgYmQsIHRsLCB0ZCwgeik7Ci0gICAgICAgICAgICBpZiAocy0+c3ViLmRlY29kZS5jb2RlcyA9PSBaX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHIgPSBaX01FTV9FUlJPUjsKLSAgICAgICAgICAgICAgTEVBVkUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgRFVNUEJJVFMoMykKLSAgICAgICAgICBzLT5tb2RlID0gQ09ERVM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyAqLwotICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgcy0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgRFVNUEJJVFMoMykKLSAgICAgICAgICBzLT5tb2RlID0gVEFCTEU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgLyogaWxsZWdhbCAqLwotICAgICAgICAgIERVTVBCSVRTKDMpCi0gICAgICAgICAgcy0+bW9kZSA9IEJBRDsKLSAgICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgYmxvY2sgdHlwZSI7Ci0gICAgICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICBMRUFWRQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRU5TOgotICAgICAgTkVFREJJVFMoMzIpCi0gICAgICBpZiAoKCgofmIpID4+IDE2KSAmIDB4ZmZmZikgIT0gKGIgJiAweGZmZmYpKQotICAgICAgewotICAgICAgICBzLT5tb2RlID0gQkFEOwotICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOwotICAgICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgICAgICBMRUFWRQotICAgICAgfQotICAgICAgcy0+c3ViLmxlZnQgPSAodUludCliICYgMHhmZmZmOwotICAgICAgYiA9IGsgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBkdW1wIGJpdHMgKi8KLSAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxuIiwgcy0+c3ViLmxlZnQpKTsKLSAgICAgIHMtPm1vZGUgPSBzLT5zdWIubGVmdCA/IFNUT1JFRCA6IChzLT5sYXN0ID8gRFJZIDogVFlQRSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNUT1JFRDoKLSAgICAgIGlmIChuID09IDApCi0gICAgICAgIExFQVZFCi0gICAgICBORUVET1VUCi0gICAgICB0ID0gcy0+c3ViLmxlZnQ7Ci0gICAgICBpZiAodCA+IG4pIHQgPSBuOwotICAgICAgaWYgKHQgPiBtKSB0ID0gbTsKLSAgICAgIHptZW1jcHkocSwgcCwgdCk7Ci0gICAgICBwICs9IHQ7ICBuIC09IHQ7Ci0gICAgICBxICs9IHQ7ICBtIC09IHQ7Ci0gICAgICBpZiAoKHMtPnN1Yi5sZWZ0IC09IHQpICE9IDApCi0gICAgICAgIGJyZWFrOwotICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kLCAlbHUgdG90YWwgb3V0XG4iLAotICAgICAgICAgICAgICB6LT50b3RhbF9vdXQgKyAocSA+PSBzLT5yZWFkID8gcSAtIHMtPnJlYWQgOgotICAgICAgICAgICAgICAocy0+ZW5kIC0gcy0+cmVhZCkgKyAocSAtIHMtPndpbmRvdykpKSk7Ci0gICAgICBzLT5tb2RlID0gcy0+bGFzdCA/IERSWSA6IFRZUEU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQkxFOgotICAgICAgTkVFREJJVFMoMTQpCi0gICAgICBzLT5zdWIudHJlZXMudGFibGUgPSB0ID0gKHVJbnQpYiAmIDB4M2ZmZjsKLSNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKLSAgICAgIGlmICgodCAmIDB4MWYpID4gMjkgfHwgKCh0ID4+IDUpICYgMHgxZikgPiAyOSkKLSAgICAgIHsKLSAgICAgICAgcy0+bW9kZSA9IEJBRDsKLSAgICAgICAgei0+bXNnID0gKGNoYXIqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7Ci0gICAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgIExFQVZFCi0gICAgICB9Ci0jZW5kaWYKLSAgICAgIHQgPSAyNTggKyAodCAmIDB4MWYpICsgKCh0ID4+IDUpICYgMHgxZik7Ci0gICAgICBpZiAoKHMtPnN1Yi50cmVlcy5ibGVucyA9ICh1SW50ZiopWkFMTE9DKHosIHQsIHNpemVvZih1SW50KSkpID09IFpfTlVMTCkKLSAgICAgIHsKLSAgICAgICAgciA9IFpfTUVNX0VSUk9SOwotICAgICAgICBMRUFWRQotICAgICAgfQotICAgICAgRFVNUEJJVFMoMTQpCi0gICAgICBzLT5zdWIudHJlZXMuaW5kZXggPSAwOwotICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOwotICAgICAgcy0+bW9kZSA9IEJUUkVFOwotICAgIGNhc2UgQlRSRUU6Ci0gICAgICB3aGlsZSAocy0+c3ViLnRyZWVzLmluZGV4IDwgNCArIChzLT5zdWIudHJlZXMudGFibGUgPj4gMTApKQotICAgICAgewotICAgICAgICBORUVEQklUUygzKQotICAgICAgICBzLT5zdWIudHJlZXMuYmxlbnNbYm9yZGVyW3MtPnN1Yi50cmVlcy5pbmRleCsrXV0gPSAodUludCliICYgNzsKLSAgICAgICAgRFVNUEJJVFMoMykKLSAgICAgIH0KLSAgICAgIHdoaWxlIChzLT5zdWIudHJlZXMuaW5kZXggPCAxOSkKLSAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zW2JvcmRlcltzLT5zdWIudHJlZXMuaW5kZXgrK11dID0gMDsKLSAgICAgIHMtPnN1Yi50cmVlcy5iYiA9IDc7Ci0gICAgICB0ID0gaW5mbGF0ZV90cmVlc19iaXRzKHMtPnN1Yi50cmVlcy5ibGVucywgJnMtPnN1Yi50cmVlcy5iYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnN1Yi50cmVlcy50Yiwgcy0+aHVmdHMsIHopOwotICAgICAgaWYgKHQgIT0gWl9PSykKLSAgICAgIHsKLSAgICAgICAgciA9IHQ7Ci0gICAgICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIFpGUkVFKHosIHMtPnN1Yi50cmVlcy5ibGVucyk7Ci0gICAgICAgICAgcy0+bW9kZSA9IEJBRDsKLSAgICAgICAgfQotICAgICAgICBMRUFWRQotICAgICAgfQotICAgICAgcy0+c3ViLnRyZWVzLmluZGV4ID0gMDsKLSAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgYml0cyB0cmVlIG9rXG4iKSk7Ci0gICAgICBzLT5tb2RlID0gRFRSRUU7Ci0gICAgY2FzZSBEVFJFRToKLSAgICAgIHdoaWxlICh0ID0gcy0+c3ViLnRyZWVzLnRhYmxlLAotICAgICAgICAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA8IDI1OCArICh0ICYgMHgxZikgKyAoKHQgPj4gNSkgJiAweDFmKSkKLSAgICAgIHsKLSAgICAgICAgaW5mbGF0ZV9odWZ0ICpoOwotICAgICAgICB1SW50IGksIGosIGM7Ci0KLSAgICAgICAgdCA9IHMtPnN1Yi50cmVlcy5iYjsKLSAgICAgICAgTkVFREJJVFModCkKLSAgICAgICAgaCA9IHMtPnN1Yi50cmVlcy50YiArICgodUludCliICYgaW5mbGF0ZV9tYXNrW3RdKTsKLSAgICAgICAgdCA9IGgtPmJpdHM7Ci0gICAgICAgIGMgPSBoLT5iYXNlOwotICAgICAgICBpZiAoYyA8IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgRFVNUEJJVFModCkKLSAgICAgICAgICBzLT5zdWIudHJlZXMuYmxlbnNbcy0+c3ViLnRyZWVzLmluZGV4KytdID0gYzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGMgPT0gMTYuLjE4ICovCi0gICAgICAgIHsKLSAgICAgICAgICBpID0gYyA9PSAxOCA/IDcgOiBjIC0gMTQ7Ci0gICAgICAgICAgaiA9IGMgPT0gMTggPyAxMSA6IDM7Ci0gICAgICAgICAgTkVFREJJVFModCArIGkpCi0gICAgICAgICAgRFVNUEJJVFModCkKLSAgICAgICAgICBqICs9ICh1SW50KWIgJiBpbmZsYXRlX21hc2tbaV07Ci0gICAgICAgICAgRFVNUEJJVFMoaSkKLSAgICAgICAgICBpID0gcy0+c3ViLnRyZWVzLmluZGV4OwotICAgICAgICAgIHQgPSBzLT5zdWIudHJlZXMudGFibGU7Ci0gICAgICAgICAgaWYgKGkgKyBqID4gMjU4ICsgKHQgJiAweDFmKSArICgodCA+PiA1KSAmIDB4MWYpIHx8Ci0gICAgICAgICAgICAgIChjID09IDE2ICYmIGkgPCAxKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOwotICAgICAgICAgICAgcy0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7Ci0gICAgICAgICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgICAgICAgICAgTEVBVkUKLSAgICAgICAgICB9Ci0gICAgICAgICAgYyA9IGMgPT0gMTYgPyBzLT5zdWIudHJlZXMuYmxlbnNbaSAtIDFdIDogMDsKLSAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzLT5zdWIudHJlZXMuYmxlbnNbaSsrXSA9IGM7Ci0gICAgICAgICAgfSB3aGlsZSAoLS1qKTsKLSAgICAgICAgICBzLT5zdWIudHJlZXMuaW5kZXggPSBpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzLT5zdWIudHJlZXMudGIgPSBaX05VTEw7Ci0gICAgICB7Ci0gICAgICAgIHVJbnQgYmwsIGJkOwotICAgICAgICBpbmZsYXRlX2h1ZnQgKnRsLCAqdGQ7Ci0gICAgICAgIGluZmxhdGVfY29kZXNfc3RhdGVmICpjOwotCi0gICAgICAgIGJsID0gOTsgICAgICAgICAvKiBtdXN0IGJlIDw9IDkgZm9yIGxvb2thaGVhZCBhc3N1bXB0aW9ucyAqLwotICAgICAgICBiZCA9IDY7ICAgICAgICAgLyogbXVzdCBiZSA8PSA5IGZvciBsb29rYWhlYWQgYXNzdW1wdGlvbnMgKi8KLSAgICAgICAgdCA9IHMtPnN1Yi50cmVlcy50YWJsZTsKLSAgICAgICAgdCA9IGluZmxhdGVfdHJlZXNfZHluYW1pYygyNTcgKyAodCAmIDB4MWYpLCAxICsgKCh0ID4+IDUpICYgMHgxZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zLCAmYmwsICZiZCwgJnRsLCAmdGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aHVmdHMsIHopOwotICAgICAgICBpZiAodCAhPSBaX09LKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHQgPT0gKHVJbnQpWl9EQVRBX0VSUk9SKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFpGUkVFKHosIHMtPnN1Yi50cmVlcy5ibGVucyk7Ci0gICAgICAgICAgICBzLT5tb2RlID0gQkFEOwotICAgICAgICAgIH0KLSAgICAgICAgICByID0gdDsKLSAgICAgICAgICBMRUFWRQotICAgICAgICB9Ci0gICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdHJlZXMgb2tcbiIpKTsKLSAgICAgICAgaWYgKChjID0gaW5mbGF0ZV9jb2Rlc19uZXcoYmwsIGJkLCB0bCwgdGQsIHopKSA9PSBaX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICByID0gWl9NRU1fRVJST1I7Ci0gICAgICAgICAgTEVBVkUKLSAgICAgICAgfQotICAgICAgICBzLT5zdWIuZGVjb2RlLmNvZGVzID0gYzsKLSAgICAgIH0KLSAgICAgIFpGUkVFKHosIHMtPnN1Yi50cmVlcy5ibGVucyk7Ci0gICAgICBzLT5tb2RlID0gQ09ERVM7Ci0gICAgY2FzZSBDT0RFUzoKLSAgICAgIFVQREFURQotICAgICAgaWYgKChyID0gaW5mbGF0ZV9jb2RlcyhzLCB6LCByKSkgIT0gWl9TVFJFQU1fRU5EKQotICAgICAgICByZXR1cm4gaW5mbGF0ZV9mbHVzaChzLCB6LCByKTsKLSAgICAgIHIgPSBaX09LOwotICAgICAgaW5mbGF0ZV9jb2Rlc19mcmVlKHMtPnN1Yi5kZWNvZGUuY29kZXMsIHopOwotICAgICAgTE9BRAotICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBlbmQsICVsdSB0b3RhbCBvdXRcbiIsCi0gICAgICAgICAgICAgIHotPnRvdGFsX291dCArIChxID49IHMtPnJlYWQgPyBxIC0gcy0+cmVhZCA6Ci0gICAgICAgICAgICAgIChzLT5lbmQgLSBzLT5yZWFkKSArIChxIC0gcy0+d2luZG93KSkpKTsKLSAgICAgIGlmICghcy0+bGFzdCkKLSAgICAgIHsKLSAgICAgICAgcy0+bW9kZSA9IFRZUEU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcy0+bW9kZSA9IERSWTsKLSAgICBjYXNlIERSWToKLSAgICAgIEZMVVNICi0gICAgICBpZiAocy0+cmVhZCAhPSBzLT53cml0ZSkKLSAgICAgICAgTEVBVkUKLSAgICAgIHMtPm1vZGUgPSBET05FOwotICAgIGNhc2UgRE9ORToKLSAgICAgIHIgPSBaX1NUUkVBTV9FTkQ7Ci0gICAgICBMRUFWRQotICAgIGNhc2UgQkFEOgotICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgIExFQVZFCi0gICAgZGVmYXVsdDoKLSAgICAgIHIgPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgIExFQVZFCi0gIH0KLX0KLQotCi1pbnQgaW5mbGF0ZV9ibG9ja3NfZnJlZShzLCB6KQotaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOwotel9zdHJlYW1wIHo7Ci17Ci0gIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosIFpfTlVMTCk7Ci0gIFpGUkVFKHosIHMtPndpbmRvdyk7Ci0gIFpGUkVFKHosIHMtPmh1ZnRzKTsKLSAgWkZSRUUoeiwgcyk7Ci0gIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBibG9ja3MgZnJlZWRcbiIpKTsKLSAgcmV0dXJuIFpfT0s7Ci19Ci0KLQotdm9pZCBpbmZsYXRlX3NldF9kaWN0aW9uYXJ5KHMsIGQsIG4pCi1pbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Ci1jb25zdCBCeXRlZiAqZDsKLXVJbnQgIG47Ci17Ci0gIHptZW1jcHkocy0+d2luZG93LCBkLCBuKTsKLSAgcy0+cmVhZCA9IHMtPndyaXRlID0gcy0+d2luZG93ICsgbjsKLX0KLQotCi0vKiBSZXR1cm5zIHRydWUgaWYgaW5mbGF0ZSBpcyBjdXJyZW50bHkgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGdlbmVyYXRlZAotICogYnkgWl9TWU5DX0ZMVVNIIG9yIFpfRlVMTF9GTFVTSC4gCi0gKiBJTiBhc3NlcnRpb246IHMgIT0gWl9OVUxMCi0gKi8KLWludCBpbmZsYXRlX2Jsb2Nrc19zeW5jX3BvaW50KHMpCi1pbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Ci17Ci0gIHJldHVybiBzLT5tb2RlID09IExFTlM7Ci19CmRpZmYgLS1naXQgYS9pbmZibG9jay5oIGIvaW5mYmxvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczYjIyNi4uMDAwMDAwMAotLS0gYS9pbmZibG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogaW5mYmxvY2suaCAtLSBoZWFkZXIgdG8gdXNlIGluZmJsb2NrLmMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLXN0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZTsKLXR5cGVkZWYgc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlIEZBUiBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWY7Ci0KLWV4dGVybiBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiBpbmZsYXRlX2Jsb2Nrc19uZXcgT0YoKAotICAgIHpfc3RyZWFtcCB6LAotICAgIGNoZWNrX2Z1bmMgYywgICAgICAgICAgICAgICAvKiBjaGVjayBmdW5jdGlvbiAqLwotICAgIHVJbnQgdykpOyAgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSAqLwotCi1leHRlcm4gaW50IGluZmxhdGVfYmxvY2tzIE9GKCgKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbXAgLAotICAgIGludCkpOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIHJldHVybiBjb2RlICovCi0KLWV4dGVybiB2b2lkIGluZmxhdGVfYmxvY2tzX3Jlc2V0IE9GKCgKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbXAgLAotICAgIHVMb25nZiAqKSk7ICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdmFsdWUgb24gb3V0cHV0ICovCi0KLWV4dGVybiBpbnQgaW5mbGF0ZV9ibG9ja3NfZnJlZSBPRigoCi0gICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICosCi0gICAgel9zdHJlYW1wKSk7Ci0KLWV4dGVybiB2b2lkIGluZmxhdGVfc2V0X2RpY3Rpb25hcnkgT0YoKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKLSAgICBjb25zdCBCeXRlZiAqZCwgIC8qIGRpY3Rpb25hcnkgKi8KLSAgICB1SW50ICBuKSk7ICAgICAgIC8qIGRpY3Rpb25hcnkgbGVuZ3RoICovCi0KLWV4dGVybiBpbnQgaW5mbGF0ZV9ibG9ja3Nfc3luY19wb2ludCBPRigoCi0gICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzKSk7CmRpZmYgLS1naXQgYS9pbmZjb2Rlcy5jIGIvaW5mY29kZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiZTU0MS4uMDAwMDAwMAotLS0gYS9pbmZjb2Rlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qIGluZmNvZGVzLmMgLS0gcHJvY2VzcyBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAotICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotI2luY2x1ZGUgImluZnRyZWVzLmgiCi0jaW5jbHVkZSAiaW5mYmxvY2suaCIKLSNpbmNsdWRlICJpbmZjb2Rlcy5oIgotI2luY2x1ZGUgImluZnV0aWwuaCIKLSNpbmNsdWRlICJpbmZmYXN0LmgiCi0KLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cwotCi10eXBlZGVmIGVudW0geyAgICAgICAgLyogd2FpdGluZyBmb3IgImk6Ij1pbnB1dCwgIm86Ij1vdXRwdXQsICJ4OiI9bm90aGluZyAqLwotICAgICAgU1RBUlQsICAgIC8qIHg6IHNldCB1cCBmb3IgTEVOICovCi0gICAgICBMRU4sICAgICAgLyogaTogZ2V0IGxlbmd0aC9saXRlcmFsL2VvYiBuZXh0ICovCi0gICAgICBMRU5FWFQsICAgLyogaTogZ2V0dGluZyBsZW5ndGggZXh0cmEgKGhhdmUgYmFzZSkgKi8KLSAgICAgIERJU1QsICAgICAvKiBpOiBnZXQgZGlzdGFuY2UgbmV4dCAqLwotICAgICAgRElTVEVYVCwgIC8qIGk6IGdldHRpbmcgZGlzdGFuY2UgZXh0cmEgKi8KLSAgICAgIENPUFksICAgICAvKiBvOiBjb3B5aW5nIGJ5dGVzIGluIHdpbmRvdywgd2FpdGluZyBmb3Igc3BhY2UgKi8KLSAgICAgIExJVCwgICAgICAvKiBvOiBnb3QgbGl0ZXJhbCwgd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlICovCi0gICAgICBXQVNILCAgICAgLyogbzogZ290IGVvYiwgcG9zc2libHkgc3RpbGwgb3V0cHV0IHdhaXRpbmcgKi8KLSAgICAgIEVORCwgICAgICAvKiB4OiBnb3QgZW9iIGFuZCBhbGwgZGF0YSBmbHVzaGVkICovCi0gICAgICBCQURDT0RFfSAgLyogeDogZ290IGVycm9yICovCi1pbmZsYXRlX2NvZGVzX21vZGU7Ci0KLS8qIGluZmxhdGUgY29kZXMgcHJpdmF0ZSBzdGF0ZSAqLwotc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGUgewotCi0gIC8qIG1vZGUgKi8KLSAgaW5mbGF0ZV9jb2Rlc19tb2RlIG1vZGU7ICAgICAgLyogY3VycmVudCBpbmZsYXRlX2NvZGVzIG1vZGUgKi8KLQotICAvKiBtb2RlIGRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICB1SW50IGxlbjsKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBpbmZsYXRlX2h1ZnQgKnRyZWU7ICAgICAgIC8qIHBvaW50ZXIgaW50byB0cmVlICovCi0gICAgICB1SW50IG5lZWQ7ICAgICAgICAgICAgICAgIC8qIGJpdHMgbmVlZGVkICovCi0gICAgfSBjb2RlOyAgICAgICAgICAgICAvKiBpZiBMRU4gb3IgRElTVCwgd2hlcmUgaW4gdHJlZSAqLwotICAgIHVJbnQgbGl0OyAgICAgICAgICAgLyogaWYgTElULCBsaXRlcmFsICovCi0gICAgc3RydWN0IHsKLSAgICAgIHVJbnQgZ2V0OyAgICAgICAgICAgICAgICAgLyogYml0cyB0byBnZXQgZm9yIGV4dHJhICovCi0gICAgICB1SW50IGRpc3Q7ICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBmcm9tICovCi0gICAgfSBjb3B5OyAgICAgICAgICAgICAvKiBpZiBFWFQgb3IgQ09QWSwgd2hlcmUgYW5kIGhvdyBtdWNoICovCi0gIH0gc3ViOyAgICAgICAgICAgICAgICAvKiBzdWJtb2RlICovCi0KLSAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICBCeXRlIGxiaXRzOyAgICAgICAgICAgLyogbHRyZWUgYml0cyBkZWNvZGVkIHBlciBicmFuY2ggKi8KLSAgQnl0ZSBkYml0czsgICAgICAgICAgIC8qIGR0cmVlIGJpdHMgZGVjb2RlciBwZXIgYnJhbmNoICovCi0gIGluZmxhdGVfaHVmdCAqbHRyZWU7ICAgICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoL2VvYiB0cmVlICovCi0gIGluZmxhdGVfaHVmdCAqZHRyZWU7ICAgICAgICAgIC8qIGRpc3RhbmNlIHRyZWUgKi8KLQotfTsKLQotCi1pbmZsYXRlX2NvZGVzX3N0YXRlZiAqaW5mbGF0ZV9jb2Rlc19uZXcoYmwsIGJkLCB0bCwgdGQsIHopCi11SW50IGJsLCBiZDsKLWluZmxhdGVfaHVmdCAqdGw7Ci1pbmZsYXRlX2h1ZnQgKnRkOyAvKiBuZWVkIHNlcGFyYXRlIGRlY2xhcmF0aW9uIGZvciBCb3JsYW5kIEMrKyAqLwotel9zdHJlYW1wIHo7Ci17Ci0gIGluZmxhdGVfY29kZXNfc3RhdGVmICpjOwotCi0gIGlmICgoYyA9IChpbmZsYXRlX2NvZGVzX3N0YXRlZiAqKQotICAgICAgIFpBTExPQyh6LDEsc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlKSkpICE9IFpfTlVMTCkKLSAgewotICAgIGMtPm1vZGUgPSBTVEFSVDsKLSAgICBjLT5sYml0cyA9IChCeXRlKWJsOwotICAgIGMtPmRiaXRzID0gKEJ5dGUpYmQ7Ci0gICAgYy0+bHRyZWUgPSB0bDsKLSAgICBjLT5kdHJlZSA9IHRkOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgbmV3XG4iKSk7Ci0gIH0KLSAgcmV0dXJuIGM7Ci19Ci0KLQotaW50IGluZmxhdGVfY29kZXMocywgeiwgcikKLWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKLXpfc3RyZWFtcCB6OwotaW50IHI7Ci17Ci0gIHVJbnQgajsgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSAqLwotICBpbmZsYXRlX2h1ZnQgKnQ7ICAgICAgLyogdGVtcG9yYXJ5IHBvaW50ZXIgKi8KLSAgdUludCBlOyAgICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCi0gIHVMb25nIGI7ICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgQnl0ZWYgKnA7ICAgICAgICAgICAgIC8qIGlucHV0IGRhdGEgcG9pbnRlciAqLwotICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCi0gIEJ5dGVmICpxOyAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KLSAgdUludCBtOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyICovCi0gIEJ5dGVmICpmOyAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGNvcHkgc3RyaW5ncyBmcm9tICovCi0gIGluZmxhdGVfY29kZXNfc3RhdGVmICpjID0gcy0+c3ViLmRlY29kZS5jb2RlczsgIC8qIGNvZGVzIHN0YXRlICovCi0KLSAgLyogY29weSBpbnB1dC9vdXRwdXQgaW5mb3JtYXRpb24gdG8gbG9jYWxzIChVUERBVEUgbWFjcm8gcmVzdG9yZXMpICovCi0gIExPQUQKLQotICAvKiBwcm9jZXNzIGlucHV0IGFuZCBvdXRwdXQgYmFzZWQgb24gY3VycmVudCBzdGF0ZSAqLwotICB3aGlsZSAoMSkgc3dpdGNoIChjLT5tb2RlKQotICB7ICAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yICJpOiI9aW5wdXQsICJvOiI9b3V0cHV0LCAieDoiPW5vdGhpbmcgKi8KLSAgICBjYXNlIFNUQVJUOiAgICAgICAgIC8qIHg6IHNldCB1cCBmb3IgTEVOICovCi0jaWZuZGVmIFNMT1cKLSAgICAgIGlmIChtID49IDI1OCAmJiBuID49IDEwKQotICAgICAgewotICAgICAgICBVUERBVEUKLSAgICAgICAgciA9IGluZmxhdGVfZmFzdChjLT5sYml0cywgYy0+ZGJpdHMsIGMtPmx0cmVlLCBjLT5kdHJlZSwgcywgeik7Ci0gICAgICAgIExPQUQKLSAgICAgICAgaWYgKHIgIT0gWl9PSykKLSAgICAgICAgewotICAgICAgICAgIGMtPm1vZGUgPSByID09IFpfU1RSRUFNX0VORCA/IFdBU0ggOiBCQURDT0RFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYgLyogIVNMT1cgKi8KLSAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBjLT5sYml0czsKLSAgICAgIGMtPnN1Yi5jb2RlLnRyZWUgPSBjLT5sdHJlZTsKLSAgICAgIGMtPm1vZGUgPSBMRU47Ci0gICAgY2FzZSBMRU46ICAgICAgICAgICAvKiBpOiBnZXQgbGVuZ3RoL2xpdGVyYWwvZW9iIG5leHQgKi8KLSAgICAgIGogPSBjLT5zdWIuY29kZS5uZWVkOwotICAgICAgTkVFREJJVFMoaikKLSAgICAgIHQgPSBjLT5zdWIuY29kZS50cmVlICsgKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbal0pOwotICAgICAgRFVNUEJJVFModC0+Yml0cykKLSAgICAgIGUgPSAodUludCkodC0+ZXhvcCk7Ci0gICAgICBpZiAoZSA9PSAwKSAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi8KLSAgICAgIHsKLSAgICAgICAgYy0+c3ViLmxpdCA9IHQtPmJhc2U7Ci0gICAgICAgIFRyYWNldnYoKHN0ZGVyciwgdC0+YmFzZSA+PSAweDIwICYmIHQtPmJhc2UgPCAweDdmID8KLSAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKLSAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIHQtPmJhc2UpKTsKLSAgICAgICAgYy0+bW9kZSA9IExJVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoZSAmIDE2KSAgICAgICAgICAgICAgIC8qIGxlbmd0aCAqLwotICAgICAgewotICAgICAgICBjLT5zdWIuY29weS5nZXQgPSBlICYgMTU7Ci0gICAgICAgIGMtPmxlbiA9IHQtPmJhc2U7Ci0gICAgICAgIGMtPm1vZGUgPSBMRU5FWFQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKChlICYgNjQpID09IDApICAgICAgICAvKiBuZXh0IHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBlOwotICAgICAgICBjLT5zdWIuY29kZS50cmVlID0gdCArIHQtPmJhc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGUgJiAzMikgICAgICAgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi8KLSAgICAgIHsKLSAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKLSAgICAgICAgYy0+bW9kZSA9IFdBU0g7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYy0+bW9kZSA9IEJBRENPREU7ICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KLSAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICBMRUFWRQotICAgIGNhc2UgTEVORVhUOiAgICAgICAgLyogaTogZ2V0dGluZyBsZW5ndGggZXh0cmEgKGhhdmUgYmFzZSkgKi8KLSAgICAgIGogPSBjLT5zdWIuY29weS5nZXQ7Ci0gICAgICBORUVEQklUUyhqKQotICAgICAgYy0+bGVuICs9ICh1SW50KWIgJiBpbmZsYXRlX21hc2tbal07Ci0gICAgICBEVU1QQklUUyhqKQotICAgICAgYy0+c3ViLmNvZGUubmVlZCA9IGMtPmRiaXRzOwotICAgICAgYy0+c3ViLmNvZGUudHJlZSA9IGMtPmR0cmVlOwotICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcbiIsIGMtPmxlbikpOwotICAgICAgYy0+bW9kZSA9IERJU1Q7Ci0gICAgY2FzZSBESVNUOiAgICAgICAgICAvKiBpOiBnZXQgZGlzdGFuY2UgbmV4dCAqLwotICAgICAgaiA9IGMtPnN1Yi5jb2RlLm5lZWQ7Ci0gICAgICBORUVEQklUUyhqKQotICAgICAgdCA9IGMtPnN1Yi5jb2RlLnRyZWUgKyAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1tqXSk7Ci0gICAgICBEVU1QQklUUyh0LT5iaXRzKQotICAgICAgZSA9ICh1SW50KSh0LT5leG9wKTsKLSAgICAgIGlmIChlICYgMTYpICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgKi8KLSAgICAgIHsKLSAgICAgICAgYy0+c3ViLmNvcHkuZ2V0ID0gZSAmIDE1OwotICAgICAgICBjLT5zdWIuY29weS5kaXN0ID0gdC0+YmFzZTsKLSAgICAgICAgYy0+bW9kZSA9IERJU1RFWFQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKChlICYgNjQpID09IDApICAgICAgICAvKiBuZXh0IHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBlOwotICAgICAgICBjLT5zdWIuY29kZS50cmVlID0gdCArIHQtPmJhc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYy0+bW9kZSA9IEJBRENPREU7ICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KLSAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICBMRUFWRQotICAgIGNhc2UgRElTVEVYVDogICAgICAgLyogaTogZ2V0dGluZyBkaXN0YW5jZSBleHRyYSAqLwotICAgICAgaiA9IGMtPnN1Yi5jb3B5LmdldDsKLSAgICAgIE5FRURCSVRTKGopCi0gICAgICBjLT5zdWIuY29weS5kaXN0ICs9ICh1SW50KWIgJiBpbmZsYXRlX21hc2tbal07Ci0gICAgICBEVU1QQklUUyhqKQotICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgYy0+c3ViLmNvcHkuZGlzdCkpOwotICAgICAgYy0+bW9kZSA9IENPUFk7Ci0gICAgY2FzZSBDT1BZOiAgICAgICAgICAvKiBvOiBjb3B5aW5nIGJ5dGVzIGluIHdpbmRvdywgd2FpdGluZyBmb3Igc3BhY2UgKi8KLSAgICAgIGYgPSBxIC0gYy0+c3ViLmNvcHkuZGlzdDsKLSAgICAgIHdoaWxlIChmIDwgcy0+d2luZG93KSAgICAgICAgICAgICAvKiBtb2R1bG8gd2luZG93IHNpemUtIndoaWxlIiBpbnN0ZWFkICovCi0gICAgICAgIGYgKz0gcy0+ZW5kIC0gcy0+d2luZG93OyAgICAgICAgLyogb2YgImlmIiBoYW5kbGVzIGludmFsaWQgZGlzdGFuY2VzICovCi0gICAgICB3aGlsZSAoYy0+bGVuKQotICAgICAgewotICAgICAgICBORUVET1VUCi0gICAgICAgIE9VVEJZVEUoKmYrKykKLSAgICAgICAgaWYgKGYgPT0gcy0+ZW5kKQotICAgICAgICAgIGYgPSBzLT53aW5kb3c7Ci0gICAgICAgIGMtPmxlbi0tOwotICAgICAgfQotICAgICAgYy0+bW9kZSA9IFNUQVJUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMSVQ6ICAgICAgICAgICAvKiBvOiBnb3QgbGl0ZXJhbCwgd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlICovCi0gICAgICBORUVET1VUCi0gICAgICBPVVRCWVRFKGMtPnN1Yi5saXQpCi0gICAgICBjLT5tb2RlID0gU1RBUlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdBU0g6ICAgICAgICAgIC8qIG86IGdvdCBlb2IsIHBvc3NpYmx5IG1vcmUgb3V0cHV0ICovCi0gICAgICBpZiAoayA+IDcpICAgICAgICAvKiByZXR1cm4gdW51c2VkIGJ5dGUsIGlmIGFueSAqLwotICAgICAgewotICAgICAgICBBc3NlcnQoayA8IDE2LCAiaW5mbGF0ZV9jb2RlcyBncmFiYmVkIHRvbyBtYW55IGJ5dGVzIikKLSAgICAgICAgayAtPSA4OwotICAgICAgICBuKys7Ci0gICAgICAgIHAtLTsgICAgICAgICAgICAvKiBjYW4gYWx3YXlzIHJldHVybiBvbmUgKi8KLSAgICAgIH0KLSAgICAgIEZMVVNICi0gICAgICBpZiAocy0+cmVhZCAhPSBzLT53cml0ZSkKLSAgICAgICAgTEVBVkUKLSAgICAgIGMtPm1vZGUgPSBFTkQ7Ci0gICAgY2FzZSBFTkQ6Ci0gICAgICByID0gWl9TVFJFQU1fRU5EOwotICAgICAgTEVBVkUKLSAgICBjYXNlIEJBRENPREU6ICAgICAgIC8qIHg6IGdvdCBlcnJvciAqLwotICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgIExFQVZFCi0gICAgZGVmYXVsdDoKLSAgICAgIHIgPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgIExFQVZFCi0gIH0KLSNpZmRlZiBORUVEX0RVTU1ZX1JFVFVSTgotICByZXR1cm4gWl9TVFJFQU1fRVJST1I7ICAvKiBTb21lIGR1bWIgY29tcGlsZXJzIGNvbXBsYWluIHdpdGhvdXQgdGhpcyAqLwotI2VuZGlmCi19Ci0KLQotdm9pZCBpbmZsYXRlX2NvZGVzX2ZyZWUoYywgeikKLWluZmxhdGVfY29kZXNfc3RhdGVmICpjOwotel9zdHJlYW1wIHo7Ci17Ci0gIFpGUkVFKHosIGMpOwotICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIGZyZWVcbiIpKTsKLX0KZGlmZiAtLWdpdCBhL2luZmNvZGVzLmggYi9pbmZjb2Rlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjgyMWEwLi4wMDAwMDAwCi0tLSBhL2luZmNvZGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBpbmZjb2Rlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mY29kZXMuYwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGU7Ci10eXBlZGVmIHN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlIEZBUiBpbmZsYXRlX2NvZGVzX3N0YXRlZjsKLQotZXh0ZXJuIGluZmxhdGVfY29kZXNfc3RhdGVmICppbmZsYXRlX2NvZGVzX25ldyBPRigoCi0gICAgdUludCwgdUludCwKLSAgICBpbmZsYXRlX2h1ZnQgKiwgaW5mbGF0ZV9odWZ0ICosCi0gICAgel9zdHJlYW1wICkpOwotCi1leHRlcm4gaW50IGluZmxhdGVfY29kZXMgT0YoKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAotICAgIHpfc3RyZWFtcCAsCi0gICAgaW50KSk7Ci0KLWV4dGVybiB2b2lkIGluZmxhdGVfY29kZXNfZnJlZSBPRigoCi0gICAgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbXAgKSk7Ci0KZGlmZiAtLWdpdCBhL2luZmZhc3QuYyBiL2luZmZhc3QuYwppbmRleCBhYTdmMWQ0Li44ZDE0NWMyIDEwMDY0NAotLS0gYS9pbmZmYXN0LmMKKysrIGIvaW5mZmFzdC5jCkBAIC0xLDE4MyArMSwyOTggQEAKLS8qIGluZmZhc3QuYyAtLSBwcm9jZXNzIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMgZmFzdAotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKy8qIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIAogI2luY2x1ZGUgInp1dGlsLmgiCiAjaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZibG9jay5oIgotI2luY2x1ZGUgImluZmNvZGVzLmgiCi0jaW5jbHVkZSAiaW5mdXRpbC5oIgorI2luY2x1ZGUgImluZmxhdGUuaCIKICNpbmNsdWRlICJpbmZmYXN0LmgiCiAKLXN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworLyogQWxsb3cgbWFjaGluZSBkZXBlbmRlbnQgb3B0aW1pemF0aW9uIGZvciBwb3N0LWluY3JlbWVudCBvciBwcmUtaW5jcmVtZW50LgorICAgQmFzZWQgb24gdGVzdGluZyB0byBkYXRlLAorICAgUHJlLWluY3JlbWVudCBwcmVmZXJyZWQgZm9yOgorICAgLSBQb3dlclBDIEczIChBZGxlcikKKyAgIC0gTUlQUyBSNTAwMCAoUmFuZGVycy1QZWhyc29uKQorICAgUG9zdC1pbmNyZW1lbnQgcHJlZmVycmVkIGZvcjoKKyAgIC0gbm9uZQorICAgTm8gbWVhc3VyYWJsZSBkaWZmZXJlbmNlOgorICAgLSBQZW50aXVtIElJSSAoQW5kZXJzb24pCisgKi8KKyNpZmRlZiBQT1NUSU5DCisjICBkZWZpbmUgT0ZGIDAKKyMgIGRlZmluZSBQVVAoYSkgKihhKSsrCisjZWxzZQorIyAgZGVmaW5lIE9GRiAxCisjICBkZWZpbmUgUFVQKGEpICorKyhhKQorI2VuZGlmCiAKLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cworLyoKKyAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcKKyAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpcworICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3IKKyAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGUKKyAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLgogCi0vKiBtYWNyb3MgZm9yIGJpdCBpbnB1dCB3aXRoIG5vIGNoZWNraW5nIGFuZCBmb3IgcmV0dXJuaW5nIHVudXNlZCBieXRlcyAqLwotI2RlZmluZSBHUkFCQklUUyhqKSB7d2hpbGUoazwoaikpe2J8PSgodUxvbmcpTkVYVEJZVEUpPDxrO2srPTg7fX0KLSNkZWZpbmUgVU5HUkFCIHtjPXotPmF2YWlsX2luLW47Yz0oaz4+Myk8Yz9rPj4zOmM7bis9YztwLT1jO2stPWM8PDM7fQorICAgRW50cnkgYXNzdW1wdGlvbnM6CiAKLS8qIENhbGxlZCB3aXRoIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHdyaXRlIGluIHdpbmRvdyBhdCBsZWFzdCAyNTgKLSAgICh0aGUgbWF4aW11bSBzdHJpbmcgbGVuZ3RoKSBhbmQgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGF2YWlsYWJsZQotICAgYXQgbGVhc3QgdGVuLiAgVGhlIHRlbiBieXRlcyBhcmUgc2l4IGJ5dGVzIGZvciB0aGUgbG9uZ2VzdCBsZW5ndGgvCi0gICBkaXN0YW5jZSBwYWlyIHBsdXMgZm91ciBieXRlcyBmb3Igb3ZlcmxvYWRpbmcgdGhlIGJpdCBidWZmZXIuICovCisgICAgICAgIHN0YXRlLT5tb2RlID09IExFTgorICAgICAgICBzdHJtLT5hdmFpbF9pbiA+PSA2CisgICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgKKyAgICAgICAgc3RhcnQgPj0gc3RybS0+YXZhaWxfb3V0CisgICAgICAgIHN0YXRlLT5iaXRzIDwgOAogCi1pbnQgaW5mbGF0ZV9mYXN0KGJsLCBiZCwgdGwsIHRkLCBzLCB6KQotdUludCBibCwgYmQ7Ci1pbmZsYXRlX2h1ZnQgKnRsOwotaW5mbGF0ZV9odWZ0ICp0ZDsgLyogbmVlZCBzZXBhcmF0ZSBkZWNsYXJhdGlvbiBmb3IgQm9ybGFuZCBDKysgKi8KLWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKLXpfc3RyZWFtcCB6OworICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6CisKKyAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0CisgICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrCisgICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhCisKKyAgIE5vdGVzOgorCisgICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGUKKyAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLAorICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy4KKyAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLT5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZAorICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4KKworICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OAorICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpCisgICAgICByZXF1aXJlcyBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCisgICAgICBvdXRwdXQgc3BhY2UuCisgKi8KK3ZvaWQgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KQorel9zdHJlYW1wIHN0cm07Cit1bnNpZ25lZCBzdGFydDsgICAgICAgICAvKiBpbmZsYXRlKCkncyBzdGFydGluZyB2YWx1ZSBmb3Igc3RybS0+YXZhaWxfb3V0ICovCiB7Ci0gIGluZmxhdGVfaHVmdCAqdDsgICAgICAvKiB0ZW1wb3JhcnkgcG9pbnRlciAqLwotICB1SW50IGU7ICAgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBvciBvcGVyYXRpb24gKi8KLSAgdUxvbmcgYjsgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KLSAgdUludCBrOyAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLwotICBCeXRlZiAqcDsgICAgICAgICAgICAgLyogaW5wdXQgZGF0YSBwb2ludGVyICovCi0gIHVJbnQgbjsgICAgICAgICAgICAgICAvKiBieXRlcyBhdmFpbGFibGUgdGhlcmUgKi8KLSAgQnl0ZWYgKnE7ICAgICAgICAgICAgIC8qIG91dHB1dCB3aW5kb3cgd3JpdGUgcG9pbnRlciAqLwotICB1SW50IG07ICAgICAgICAgICAgICAgLyogYnl0ZXMgdG8gZW5kIG9mIHdpbmRvdyBvciByZWFkIHBvaW50ZXIgKi8KLSAgdUludCBtbDsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxpdGVyYWwvbGVuZ3RoIHRyZWUgKi8KLSAgdUludCBtZDsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGRpc3RhbmNlIHRyZWUgKi8KLSAgdUludCBjOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGNvcHkgKi8KLSAgdUludCBkOyAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBmcm9tICovCi0gIEJ5dGVmICpyOyAgICAgICAgICAgICAvKiBjb3B5IHNvdXJjZSBwb2ludGVyICovCisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgICAgLyogbG9jYWwgc3RybS0+bmV4dF9pbiAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpsYXN0OyAgICAvKiB3aGlsZSBpbiA8IGxhc3QsIGVub3VnaCBpbnB1dCBhdmFpbGFibGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqb3V0OyAgICAgLyogbG9jYWwgc3RybS0+bmV4dF9vdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqYmVnOyAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLT5uZXh0X291dCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICplbmQ7ICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi8KKyAgICB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogbG9jYWwgc3RybS0+aG9sZCAqLworICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLT5iaXRzICovCisgICAgY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAgIC8qIGxvY2FsIHN0cm0tPmxlbmNvZGUgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgICAgLyogbG9jYWwgc3RybS0+ZGlzdGNvZGUgKi8KKyAgICB1bnNpZ25lZCBsbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovCisgICAgdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovCisgICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqLworICAgIHVuc2lnbmVkIG9wOyAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi8KKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovCiAKLSAgLyogbG9hZCBpbnB1dCwgb3V0cHV0LCBiaXQgdmFsdWVzICovCi0gIExPQUQKKyAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGluID0gc3RybS0+bmV4dF9pbiAtIE9GRjsKKyAgICBsYXN0ID0gaW4gKyAoc3RybS0+YXZhaWxfaW4gLSA1KTsKKyAgICBvdXQgPSBzdHJtLT5uZXh0X291dCAtIE9GRjsKKyAgICBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOworICAgIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOworICAgIHdzaXplID0gc3RhdGUtPndzaXplOworICAgIHdyaXRlID0gc3RhdGUtPndyaXRlOworICAgIHdpbmRvdyA9IHN0YXRlLT53aW5kb3c7CisgICAgaG9sZCA9IHN0YXRlLT5ob2xkOworICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsKKyAgICBsY29kZSA9IHN0YXRlLT5sZW5jb2RlOworICAgIGRjb2RlID0gc3RhdGUtPmRpc3Rjb2RlOworICAgIGxtYXNrID0gKDFVIDw8IHN0YXRlLT5sZW5iaXRzKSAtIDE7CisgICAgZG1hc2sgPSAoMVUgPDwgc3RhdGUtPmRpc3RiaXRzKSAtIDE7CiAKLSAgLyogaW5pdGlhbGl6ZSBtYXNrcyAqLwotICBtbCA9IGluZmxhdGVfbWFza1tibF07Ci0gIG1kID0gaW5mbGF0ZV9tYXNrW2JkXTsKLQotICAvKiBkbyB1bnRpbCBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBzcGFjZSBmb3IgZmFzdCBsb29wICovCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtZSBjYWxsZWQgd2l0aCBtID49IDI1OCAmJiBuID49IDEwICovCi0gICAgLyogZ2V0IGxpdGVyYWwvbGVuZ3RoIGNvZGUgKi8KLSAgICBHUkFCQklUUygyMCkgICAgICAgICAgICAgICAgLyogbWF4IGJpdHMgZm9yIGxpdGVyYWwvbGVuZ3RoIGNvZGUgKi8KLSAgICBpZiAoKGUgPSAodCA9IHRsICsgKCh1SW50KWIgJiBtbCkpLT5leG9wKSA9PSAwKQotICAgIHsKLSAgICAgIERVTVBCSVRTKHQtPmJpdHMpCi0gICAgICBUcmFjZXZ2KChzdGRlcnIsIHQtPmJhc2UgPj0gMHgyMCAmJiB0LT5iYXNlIDwgMHg3ZiA/Ci0gICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgKiBsaXRlcmFsICclYydcbiIgOgotICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgICogbGl0ZXJhbCAweCUwMnhcbiIsIHQtPmJhc2UpKTsKLSAgICAgICpxKysgPSAoQnl0ZSl0LT5iYXNlOwotICAgICAgbS0tOwotICAgICAgY29udGludWU7Ci0gICAgfQorICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAorICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCiAgICAgZG8gewotICAgICAgRFVNUEJJVFModC0+Yml0cykKLSAgICAgIGlmIChlICYgMTYpCi0gICAgICB7Ci0gICAgICAgIC8qIGdldCBleHRyYSBiaXRzIGZvciBsZW5ndGggKi8KLSAgICAgICAgZSAmPSAxNTsKLSAgICAgICAgYyA9IHQtPmJhc2UgKyAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1tlXSk7Ci0gICAgICAgIERVTVBCSVRTKGUpCi0gICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgKiBsZW5ndGggJXVcbiIsIGMpKTsKLQotICAgICAgICAvKiBkZWNvZGUgZGlzdGFuY2UgYmFzZSBvZiBibG9jayB0byBjb3B5ICovCi0gICAgICAgIEdSQUJCSVRTKDE1KTsgICAgICAgICAgIC8qIG1heCBiaXRzIGZvciBkaXN0YW5jZSBjb2RlICovCi0gICAgICAgIGUgPSAodCA9IHRkICsgKCh1SW50KWIgJiBtZCkpLT5leG9wOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgRFVNUEJJVFModC0+Yml0cykKLSAgICAgICAgICBpZiAoZSAmIDE2KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGdldCBleHRyYSBiaXRzIHRvIGFkZCB0byBkaXN0YW5jZSBiYXNlICovCi0gICAgICAgICAgICBlICY9IDE1OwotICAgICAgICAgICAgR1JBQkJJVFMoZSkgICAgICAgICAvKiBnZXQgZXh0cmEgYml0cyAodXAgdG8gMTMpICovCi0gICAgICAgICAgICBkID0gdC0+YmFzZSArICgodUludCliICYgaW5mbGF0ZV9tYXNrW2VdKTsKLSAgICAgICAgICAgIERVTVBCSVRTKGUpCi0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgICogZGlzdGFuY2UgJXVcbiIsIGQpKTsKLQotICAgICAgICAgICAgLyogZG8gdGhlIGNvcHkgKi8KLSAgICAgICAgICAgIG0gLT0gYzsKLSAgICAgICAgICAgIHIgPSBxIC0gZDsKLSAgICAgICAgICAgIGlmIChyIDwgcy0+d2luZG93KSAgICAgICAgICAgICAgICAgIC8qIHdyYXAgaWYgbmVlZGVkICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICByICs9IHMtPmVuZCAtIHMtPndpbmRvdzsgICAgICAgIC8qIGZvcmNlIHBvaW50ZXIgaW4gd2luZG93ICovCi0gICAgICAgICAgICAgIH0gd2hpbGUgKHIgPCBzLT53aW5kb3cpOyAgICAgICAgICAvKiBjb3ZlcnMgaW52YWxpZCBkaXN0YW5jZXMgKi8KLSAgICAgICAgICAgICAgZSA9IHMtPmVuZCAtIHI7Ci0gICAgICAgICAgICAgIGlmIChjID4gZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMgLT0gZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JhcHBlZCBjb3B5ICovCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAqcSsrID0gKnIrKzsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWUpOwotICAgICAgICAgICAgICAgIHIgPSBzLT53aW5kb3c7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAqcSsrID0gKnIrKzsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3JtYWwgY29weSAqLwotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnErKyA9ICpyKys7ICBjLS07Ci0gICAgICAgICAgICAgICAgKnErKyA9ICpyKys7ICBjLS07Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAqcSsrID0gKnIrKzsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3JtYWwgY29weSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAqcSsrID0gKnIrKzsgIGMtLTsKLSAgICAgICAgICAgICAgKnErKyA9ICpyKys7ICBjLS07Ci0gICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAqcSsrID0gKnIrKzsKLSAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgoZSAmIDY0KSA9PSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHQgKz0gdC0+YmFzZTsKLSAgICAgICAgICAgIGUgPSAodCArPSAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1tlXSkpLT5leG9wOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgICAgVU5HUkFCCi0gICAgICAgICAgICBVUERBVEUKLSAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICgxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoKGUgJiA2NCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdCArPSB0LT5iYXNlOwotICAgICAgICBpZiAoKGUgPSAodCArPSAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1tlXSkpLT5leG9wKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgRFVNUEJJVFModC0+Yml0cykKLSAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIHQtPmJhc2UgPj0gMHgyMCAmJiB0LT5iYXNlIDwgMHg3ZiA/Ci0gICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgICogbGl0ZXJhbCAnJWMnXG4iIDoKLSAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgKiBsaXRlcmFsIDB4JTAyeFxuIiwgdC0+YmFzZSkpOwotICAgICAgICAgICpxKysgPSAoQnl0ZSl0LT5iYXNlOwotICAgICAgICAgIG0tLTsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGJpdHMgPCAxNSkgeworICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUgJiAzMikKLSAgICAgIHsKLSAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICAqIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICBVTkdSQUIKLSAgICAgICAgVVBEQVRFCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FTkQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKLSAgICAgICAgVU5HUkFCCi0gICAgICAgIFVQREFURQotICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgICAgfQotICAgIH0gd2hpbGUgKDEpOwotICB9IHdoaWxlIChtID49IDI1OCAmJiBuID49IDEwKTsKKyAgICAgICAgdGhpcyA9IGxjb2RlW2hvbGQgJiBsbWFza107CisgICAgICBkb2xlbjoKKyAgICAgICAgb3AgPSAodW5zaWduZWQpKHRoaXMuYml0cyk7CisgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICBiaXRzIC09IG9wOworICAgICAgICBvcCA9ICh1bnNpZ25lZCkodGhpcy5vcCk7CisgICAgICAgIGlmIChvcCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIHRoaXMudmFsID49IDB4MjAgJiYgdGhpcy52YWwgPCAweDdmID8KKyAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKKyAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIHRoaXMudmFsKSk7CisgICAgICAgICAgICBQVVAob3V0KSA9ICh1bnNpZ25lZCBjaGFyKSh0aGlzLnZhbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovCisgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKHRoaXMudmFsKTsKKyAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovCisgICAgICAgICAgICBpZiAob3ApIHsKKyAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuICs9IGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOworICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgbGVuKSk7CisgICAgICAgICAgICBpZiAoYml0cyA8IDE1KSB7CisgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKKyAgICAgICAgICBkb2Rpc3Q6CisgICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkodGhpcy5iaXRzKTsKKyAgICAgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLm9wKTsKKyAgICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi8KKyAgICAgICAgICAgICAgICBkaXN0ID0gKHVuc2lnbmVkKSh0aGlzLnZhbCk7CisgICAgICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLworICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpc3QgKz0gaG9sZCAmICgoMVUgPDwgb3ApIC0gMSk7CisgICAgICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBkaXN0KSk7CisgICAgICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKG91dCAtIGJlZyk7ICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdCA+IHdzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7CisgICAgICAgICAgICAgICAgICAgIG9wID0gZGlzdCAtIG9wOyAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGUgPT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdyaXRlIDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3cml0ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgb3AgLT0gd3JpdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlIDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gd3JpdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3cml0ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgICAgIHRoaXMgPSBkY29kZVt0aGlzLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOworICAgICAgICAgICAgICAgIGdvdG8gZG9kaXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICB0aGlzID0gbGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmICgoMVUgPDwgb3ApIC0gMSkpXTsKKyAgICAgICAgICAgIGdvdG8gZG9sZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKTsKIAotICAvKiBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dC0tcmVzdG9yZSBwb2ludGVycyBhbmQgcmV0dXJuICovCi0gIFVOR1JBQgotICBVUERBVEUKLSAgcmV0dXJuIFpfT0s7CisgICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovCisgICAgbGVuID0gYml0cyA+PiAzOworICAgIGluIC09IGxlbjsKKyAgICBiaXRzIC09IGxlbiA8PCAzOworICAgIGhvbGQgJj0gKDFVIDw8IGJpdHMpIC0gMTsKKworICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovCisgICAgc3RybS0+bmV4dF9pbiA9IGluICsgT0ZGOworICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0ICsgT0ZGOworICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShpbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBpbikgOiA1IC0gKGluIC0gbGFzdCkpOworICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkob3V0IDwgZW5kID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NyArIChlbmQgLSBvdXQpIDogMjU3IC0gKG91dCAtIGVuZCkpOworICAgIHN0YXRlLT5ob2xkID0gaG9sZDsKKyAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7CisgICAgcmV0dXJuOwogfQorCisvKgorICAgaW5mbGF0ZV9mYXN0KCkgc3BlZWR1cHMgdGhhdCB0dXJuZWQgb3V0IHNsb3dlciAob24gYSBQb3dlclBDIEczIDc1MENYZSk6CisgICAtIFVzaW5nIGJpdCBmaWVsZHMgZm9yIGNvZGUgc3RydWN0dXJlCisgICAtIERpZmZlcmVudCBvcCBkZWZpbml0aW9uIHRvIGF2b2lkICYgZm9yIGV4dHJhIGJpdHMgKGRvICYgZm9yIHRhYmxlIGJpdHMpCisgICAtIFRocmVlIHNlcGFyYXRlIGRlY29kaW5nIGRvLWxvb3BzIGZvciBkaXJlY3QsIHdpbmRvdywgYW5kIHdyaXRlID09IDAKKyAgIC0gU3BlY2lhbCBjYXNlIGZvciBkaXN0YW5jZSA+IDEgY29waWVzIHRvIGRvIG92ZXJsYXBwZWQgbG9hZCBhbmQgc3RvcmUgY29weQorICAgLSBFeHBsaWNpdCBicmFuY2ggcHJlZGljdGlvbnMgKGJhc2VkIG9uIG1lYXN1cmVkIGJyYW5jaCBwcm9iYWJpbGl0aWVzKQorICAgLSBEZWZlcnJpbmcgbWF0Y2ggY29weSBhbmQgaW50ZXJzcGVyc2VkIGl0IHdpdGggZGVjb2Rpbmcgc3Vic2VxdWVudCBjb2RlcworICAgLSBTd2FwcGluZyBsaXRlcmFsL2xlbmd0aCBlbHNlCisgICAtIFN3YXBwaW5nIHdpbmRvdy9kaXJlY3QgZWxzZQorICAgLSBMYXJnZXIgdW5yb2xsZWQgY29weSBsb29wcyAodGhyZWUgaXMgYWJvdXQgcmlnaHQpCisgICAtIE1vdmluZyBsZW4gLT0gMyBzdGF0ZW1lbnQgaW50byBtaWRkbGUgb2YgbG9vcAorICovCmRpZmYgLS1naXQgYS9pbmZmYXN0LmggYi9pbmZmYXN0LmgKaW5kZXggYTMxYTRiYi4uOTc3MTAxYiAxMDA2NDQKLS0tIGEvaW5mZmFzdC5oCisrKyBiL2luZmZhc3QuaApAQCAtMSw1ICsxLDUgQEAKIC8qIGluZmZhc3QuaCAtLSBoZWFkZXIgdG8gdXNlIGluZmZhc3QuYwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCkBAIC04LDEwICs4LDQgQEAKICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KICAqLwogCi1leHRlcm4gaW50IGluZmxhdGVfZmFzdCBPRigoCi0gICAgdUludCwKLSAgICB1SW50LAotICAgIGluZmxhdGVfaHVmdCAqLAotICAgIGluZmxhdGVfaHVmdCAqLAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAotICAgIHpfc3RyZWFtcCApKTsKK3ZvaWQgaW5mbGF0ZV9mYXN0IE9GKCh6X3N0cmVhbXAgc3RybSwgdW5zaWduZWQgc3RhcnQpKTsKZGlmZiAtLWdpdCBhL2luZmZpeGVkLmggYi9pbmZmaXhlZC5oCmluZGV4IDc3ZjdlNzYuLjc1ZWQ0YjUgMTAwNjQ0Ci0tLSBhL2luZmZpeGVkLmgKKysrIGIvaW5mZml4ZWQuaApAQCAtMSwxNTEgKzEsOTQgQEAKLS8qIGluZmZpeGVkLmggLS0gdGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzCi0gKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgbWFrZXRyZWUuYyBwcm9ncmFtCi0gKi8KKyAgICAvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcworICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZCgpLgorICAgICAqLwogCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KKyAgICAvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdAorICAgICAgIGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZAorICAgICAgIGlzIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAgICAgKi8KIAotbG9jYWwgdUludCBmaXhlZF9ibCA9IDk7Ci1sb2NhbCB1SW50IGZpeGVkX2JkID0gNTsKLWxvY2FsIGluZmxhdGVfaHVmdCBmaXhlZF90bFtdID0gewotICAgIHt7ezk2LDd9fSwyNTZ9LCB7e3swLDh9fSw4MH0sIHt7ezAsOH19LDE2fSwge3t7ODQsOH19LDExNX0sCi0gICAge3t7ODIsN319LDMxfSwge3t7MCw4fX0sMTEyfSwge3t7MCw4fX0sNDh9LCB7e3swLDl9fSwxOTJ9LAotICAgIHt7ezgwLDd9fSwxMH0sIHt7ezAsOH19LDk2fSwge3t7MCw4fX0sMzJ9LCB7e3swLDl9fSwxNjB9LAotICAgIHt7ezAsOH19LDB9LCB7e3swLDh9fSwxMjh9LCB7e3swLDh9fSw2NH0sIHt7ezAsOX19LDIyNH0sCi0gICAge3t7ODAsN319LDZ9LCB7e3swLDh9fSw4OH0sIHt7ezAsOH19LDI0fSwge3t7MCw5fX0sMTQ0fSwKLSAgICB7e3s4Myw3fX0sNTl9LCB7e3swLDh9fSwxMjB9LCB7e3swLDh9fSw1Nn0sIHt7ezAsOX19LDIwOH0sCi0gICAge3t7ODEsN319LDE3fSwge3t7MCw4fX0sMTA0fSwge3t7MCw4fX0sNDB9LCB7e3swLDl9fSwxNzZ9LAotICAgIHt7ezAsOH19LDh9LCB7e3swLDh9fSwxMzZ9LCB7e3swLDh9fSw3Mn0sIHt7ezAsOX19LDI0MH0sCi0gICAge3t7ODAsN319LDR9LCB7e3swLDh9fSw4NH0sIHt7ezAsOH19LDIwfSwge3t7ODUsOH19LDIyN30sCi0gICAge3t7ODMsN319LDQzfSwge3t7MCw4fX0sMTE2fSwge3t7MCw4fX0sNTJ9LCB7e3swLDl9fSwyMDB9LAotICAgIHt7ezgxLDd9fSwxM30sIHt7ezAsOH19LDEwMH0sIHt7ezAsOH19LDM2fSwge3t7MCw5fX0sMTY4fSwKLSAgICB7e3swLDh9fSw0fSwge3t7MCw4fX0sMTMyfSwge3t7MCw4fX0sNjh9LCB7e3swLDl9fSwyMzJ9LAotICAgIHt7ezgwLDd9fSw4fSwge3t7MCw4fX0sOTJ9LCB7e3swLDh9fSwyOH0sIHt7ezAsOX19LDE1Mn0sCi0gICAge3t7ODQsN319LDgzfSwge3t7MCw4fX0sMTI0fSwge3t7MCw4fX0sNjB9LCB7e3swLDl9fSwyMTZ9LAotICAgIHt7ezgyLDd9fSwyM30sIHt7ezAsOH19LDEwOH0sIHt7ezAsOH19LDQ0fSwge3t7MCw5fX0sMTg0fSwKLSAgICB7e3swLDh9fSwxMn0sIHt7ezAsOH19LDE0MH0sIHt7ezAsOH19LDc2fSwge3t7MCw5fX0sMjQ4fSwKLSAgICB7e3s4MCw3fX0sM30sIHt7ezAsOH19LDgyfSwge3t7MCw4fX0sMTh9LCB7e3s4NSw4fX0sMTYzfSwKLSAgICB7e3s4Myw3fX0sMzV9LCB7e3swLDh9fSwxMTR9LCB7e3swLDh9fSw1MH0sIHt7ezAsOX19LDE5Nn0sCi0gICAge3t7ODEsN319LDExfSwge3t7MCw4fX0sOTh9LCB7e3swLDh9fSwzNH0sIHt7ezAsOX19LDE2NH0sCi0gICAge3t7MCw4fX0sMn0sIHt7ezAsOH19LDEzMH0sIHt7ezAsOH19LDY2fSwge3t7MCw5fX0sMjI4fSwKLSAgICB7e3s4MCw3fX0sN30sIHt7ezAsOH19LDkwfSwge3t7MCw4fX0sMjZ9LCB7e3swLDl9fSwxNDh9LAotICAgIHt7ezg0LDd9fSw2N30sIHt7ezAsOH19LDEyMn0sIHt7ezAsOH19LDU4fSwge3t7MCw5fX0sMjEyfSwKLSAgICB7e3s4Miw3fX0sMTl9LCB7e3swLDh9fSwxMDZ9LCB7e3swLDh9fSw0Mn0sIHt7ezAsOX19LDE4MH0sCi0gICAge3t7MCw4fX0sMTB9LCB7e3swLDh9fSwxMzh9LCB7e3swLDh9fSw3NH0sIHt7ezAsOX19LDI0NH0sCi0gICAge3t7ODAsN319LDV9LCB7e3swLDh9fSw4Nn0sIHt7ezAsOH19LDIyfSwge3t7MTkyLDh9fSwwfSwKLSAgICB7e3s4Myw3fX0sNTF9LCB7e3swLDh9fSwxMTh9LCB7e3swLDh9fSw1NH0sIHt7ezAsOX19LDIwNH0sCi0gICAge3t7ODEsN319LDE1fSwge3t7MCw4fX0sMTAyfSwge3t7MCw4fX0sMzh9LCB7e3swLDl9fSwxNzJ9LAotICAgIHt7ezAsOH19LDZ9LCB7e3swLDh9fSwxMzR9LCB7e3swLDh9fSw3MH0sIHt7ezAsOX19LDIzNn0sCi0gICAge3t7ODAsN319LDl9LCB7e3swLDh9fSw5NH0sIHt7ezAsOH19LDMwfSwge3t7MCw5fX0sMTU2fSwKLSAgICB7e3s4NCw3fX0sOTl9LCB7e3swLDh9fSwxMjZ9LCB7e3swLDh9fSw2Mn0sIHt7ezAsOX19LDIyMH0sCi0gICAge3t7ODIsN319LDI3fSwge3t7MCw4fX0sMTEwfSwge3t7MCw4fX0sNDZ9LCB7e3swLDl9fSwxODh9LAotICAgIHt7ezAsOH19LDE0fSwge3t7MCw4fX0sMTQyfSwge3t7MCw4fX0sNzh9LCB7e3swLDl9fSwyNTJ9LAotICAgIHt7ezk2LDd9fSwyNTZ9LCB7e3swLDh9fSw4MX0sIHt7ezAsOH19LDE3fSwge3t7ODUsOH19LDEzMX0sCi0gICAge3t7ODIsN319LDMxfSwge3t7MCw4fX0sMTEzfSwge3t7MCw4fX0sNDl9LCB7e3swLDl9fSwxOTR9LAotICAgIHt7ezgwLDd9fSwxMH0sIHt7ezAsOH19LDk3fSwge3t7MCw4fX0sMzN9LCB7e3swLDl9fSwxNjJ9LAotICAgIHt7ezAsOH19LDF9LCB7e3swLDh9fSwxMjl9LCB7e3swLDh9fSw2NX0sIHt7ezAsOX19LDIyNn0sCi0gICAge3t7ODAsN319LDZ9LCB7e3swLDh9fSw4OX0sIHt7ezAsOH19LDI1fSwge3t7MCw5fX0sMTQ2fSwKLSAgICB7e3s4Myw3fX0sNTl9LCB7e3swLDh9fSwxMjF9LCB7e3swLDh9fSw1N30sIHt7ezAsOX19LDIxMH0sCi0gICAge3t7ODEsN319LDE3fSwge3t7MCw4fX0sMTA1fSwge3t7MCw4fX0sNDF9LCB7e3swLDl9fSwxNzh9LAotICAgIHt7ezAsOH19LDl9LCB7e3swLDh9fSwxMzd9LCB7e3swLDh9fSw3M30sIHt7ezAsOX19LDI0Mn0sCi0gICAge3t7ODAsN319LDR9LCB7e3swLDh9fSw4NX0sIHt7ezAsOH19LDIxfSwge3t7ODAsOH19LDI1OH0sCi0gICAge3t7ODMsN319LDQzfSwge3t7MCw4fX0sMTE3fSwge3t7MCw4fX0sNTN9LCB7e3swLDl9fSwyMDJ9LAotICAgIHt7ezgxLDd9fSwxM30sIHt7ezAsOH19LDEwMX0sIHt7ezAsOH19LDM3fSwge3t7MCw5fX0sMTcwfSwKLSAgICB7e3swLDh9fSw1fSwge3t7MCw4fX0sMTMzfSwge3t7MCw4fX0sNjl9LCB7e3swLDl9fSwyMzR9LAotICAgIHt7ezgwLDd9fSw4fSwge3t7MCw4fX0sOTN9LCB7e3swLDh9fSwyOX0sIHt7ezAsOX19LDE1NH0sCi0gICAge3t7ODQsN319LDgzfSwge3t7MCw4fX0sMTI1fSwge3t7MCw4fX0sNjF9LCB7e3swLDl9fSwyMTh9LAotICAgIHt7ezgyLDd9fSwyM30sIHt7ezAsOH19LDEwOX0sIHt7ezAsOH19LDQ1fSwge3t7MCw5fX0sMTg2fSwKLSAgICB7e3swLDh9fSwxM30sIHt7ezAsOH19LDE0MX0sIHt7ezAsOH19LDc3fSwge3t7MCw5fX0sMjUwfSwKLSAgICB7e3s4MCw3fX0sM30sIHt7ezAsOH19LDgzfSwge3t7MCw4fX0sMTl9LCB7e3s4NSw4fX0sMTk1fSwKLSAgICB7e3s4Myw3fX0sMzV9LCB7e3swLDh9fSwxMTV9LCB7e3swLDh9fSw1MX0sIHt7ezAsOX19LDE5OH0sCi0gICAge3t7ODEsN319LDExfSwge3t7MCw4fX0sOTl9LCB7e3swLDh9fSwzNX0sIHt7ezAsOX19LDE2Nn0sCi0gICAge3t7MCw4fX0sM30sIHt7ezAsOH19LDEzMX0sIHt7ezAsOH19LDY3fSwge3t7MCw5fX0sMjMwfSwKLSAgICB7e3s4MCw3fX0sN30sIHt7ezAsOH19LDkxfSwge3t7MCw4fX0sMjd9LCB7e3swLDl9fSwxNTB9LAotICAgIHt7ezg0LDd9fSw2N30sIHt7ezAsOH19LDEyM30sIHt7ezAsOH19LDU5fSwge3t7MCw5fX0sMjE0fSwKLSAgICB7e3s4Miw3fX0sMTl9LCB7e3swLDh9fSwxMDd9LCB7e3swLDh9fSw0M30sIHt7ezAsOX19LDE4Mn0sCi0gICAge3t7MCw4fX0sMTF9LCB7e3swLDh9fSwxMzl9LCB7e3swLDh9fSw3NX0sIHt7ezAsOX19LDI0Nn0sCi0gICAge3t7ODAsN319LDV9LCB7e3swLDh9fSw4N30sIHt7ezAsOH19LDIzfSwge3t7MTkyLDh9fSwwfSwKLSAgICB7e3s4Myw3fX0sNTF9LCB7e3swLDh9fSwxMTl9LCB7e3swLDh9fSw1NX0sIHt7ezAsOX19LDIwNn0sCi0gICAge3t7ODEsN319LDE1fSwge3t7MCw4fX0sMTAzfSwge3t7MCw4fX0sMzl9LCB7e3swLDl9fSwxNzR9LAotICAgIHt7ezAsOH19LDd9LCB7e3swLDh9fSwxMzV9LCB7e3swLDh9fSw3MX0sIHt7ezAsOX19LDIzOH0sCi0gICAge3t7ODAsN319LDl9LCB7e3swLDh9fSw5NX0sIHt7ezAsOH19LDMxfSwge3t7MCw5fX0sMTU4fSwKLSAgICB7e3s4NCw3fX0sOTl9LCB7e3swLDh9fSwxMjd9LCB7e3swLDh9fSw2M30sIHt7ezAsOX19LDIyMn0sCi0gICAge3t7ODIsN319LDI3fSwge3t7MCw4fX0sMTExfSwge3t7MCw4fX0sNDd9LCB7e3swLDl9fSwxOTB9LAotICAgIHt7ezAsOH19LDE1fSwge3t7MCw4fX0sMTQzfSwge3t7MCw4fX0sNzl9LCB7e3swLDl9fSwyNTR9LAotICAgIHt7ezk2LDd9fSwyNTZ9LCB7e3swLDh9fSw4MH0sIHt7ezAsOH19LDE2fSwge3t7ODQsOH19LDExNX0sCi0gICAge3t7ODIsN319LDMxfSwge3t7MCw4fX0sMTEyfSwge3t7MCw4fX0sNDh9LCB7e3swLDl9fSwxOTN9LAotICAgIHt7ezgwLDd9fSwxMH0sIHt7ezAsOH19LDk2fSwge3t7MCw4fX0sMzJ9LCB7e3swLDl9fSwxNjF9LAotICAgIHt7ezAsOH19LDB9LCB7e3swLDh9fSwxMjh9LCB7e3swLDh9fSw2NH0sIHt7ezAsOX19LDIyNX0sCi0gICAge3t7ODAsN319LDZ9LCB7e3swLDh9fSw4OH0sIHt7ezAsOH19LDI0fSwge3t7MCw5fX0sMTQ1fSwKLSAgICB7e3s4Myw3fX0sNTl9LCB7e3swLDh9fSwxMjB9LCB7e3swLDh9fSw1Nn0sIHt7ezAsOX19LDIwOX0sCi0gICAge3t7ODEsN319LDE3fSwge3t7MCw4fX0sMTA0fSwge3t7MCw4fX0sNDB9LCB7e3swLDl9fSwxNzd9LAotICAgIHt7ezAsOH19LDh9LCB7e3swLDh9fSwxMzZ9LCB7e3swLDh9fSw3Mn0sIHt7ezAsOX19LDI0MX0sCi0gICAge3t7ODAsN319LDR9LCB7e3swLDh9fSw4NH0sIHt7ezAsOH19LDIwfSwge3t7ODUsOH19LDIyN30sCi0gICAge3t7ODMsN319LDQzfSwge3t7MCw4fX0sMTE2fSwge3t7MCw4fX0sNTJ9LCB7e3swLDl9fSwyMDF9LAotICAgIHt7ezgxLDd9fSwxM30sIHt7ezAsOH19LDEwMH0sIHt7ezAsOH19LDM2fSwge3t7MCw5fX0sMTY5fSwKLSAgICB7e3swLDh9fSw0fSwge3t7MCw4fX0sMTMyfSwge3t7MCw4fX0sNjh9LCB7e3swLDl9fSwyMzN9LAotICAgIHt7ezgwLDd9fSw4fSwge3t7MCw4fX0sOTJ9LCB7e3swLDh9fSwyOH0sIHt7ezAsOX19LDE1M30sCi0gICAge3t7ODQsN319LDgzfSwge3t7MCw4fX0sMTI0fSwge3t7MCw4fX0sNjB9LCB7e3swLDl9fSwyMTd9LAotICAgIHt7ezgyLDd9fSwyM30sIHt7ezAsOH19LDEwOH0sIHt7ezAsOH19LDQ0fSwge3t7MCw5fX0sMTg1fSwKLSAgICB7e3swLDh9fSwxMn0sIHt7ezAsOH19LDE0MH0sIHt7ezAsOH19LDc2fSwge3t7MCw5fX0sMjQ5fSwKLSAgICB7e3s4MCw3fX0sM30sIHt7ezAsOH19LDgyfSwge3t7MCw4fX0sMTh9LCB7e3s4NSw4fX0sMTYzfSwKLSAgICB7e3s4Myw3fX0sMzV9LCB7e3swLDh9fSwxMTR9LCB7e3swLDh9fSw1MH0sIHt7ezAsOX19LDE5N30sCi0gICAge3t7ODEsN319LDExfSwge3t7MCw4fX0sOTh9LCB7e3swLDh9fSwzNH0sIHt7ezAsOX19LDE2NX0sCi0gICAge3t7MCw4fX0sMn0sIHt7ezAsOH19LDEzMH0sIHt7ezAsOH19LDY2fSwge3t7MCw5fX0sMjI5fSwKLSAgICB7e3s4MCw3fX0sN30sIHt7ezAsOH19LDkwfSwge3t7MCw4fX0sMjZ9LCB7e3swLDl9fSwxNDl9LAotICAgIHt7ezg0LDd9fSw2N30sIHt7ezAsOH19LDEyMn0sIHt7ezAsOH19LDU4fSwge3t7MCw5fX0sMjEzfSwKLSAgICB7e3s4Miw3fX0sMTl9LCB7e3swLDh9fSwxMDZ9LCB7e3swLDh9fSw0Mn0sIHt7ezAsOX19LDE4MX0sCi0gICAge3t7MCw4fX0sMTB9LCB7e3swLDh9fSwxMzh9LCB7e3swLDh9fSw3NH0sIHt7ezAsOX19LDI0NX0sCi0gICAge3t7ODAsN319LDV9LCB7e3swLDh9fSw4Nn0sIHt7ezAsOH19LDIyfSwge3t7MTkyLDh9fSwwfSwKLSAgICB7e3s4Myw3fX0sNTF9LCB7e3swLDh9fSwxMTh9LCB7e3swLDh9fSw1NH0sIHt7ezAsOX19LDIwNX0sCi0gICAge3t7ODEsN319LDE1fSwge3t7MCw4fX0sMTAyfSwge3t7MCw4fX0sMzh9LCB7e3swLDl9fSwxNzN9LAotICAgIHt7ezAsOH19LDZ9LCB7e3swLDh9fSwxMzR9LCB7e3swLDh9fSw3MH0sIHt7ezAsOX19LDIzN30sCi0gICAge3t7ODAsN319LDl9LCB7e3swLDh9fSw5NH0sIHt7ezAsOH19LDMwfSwge3t7MCw5fX0sMTU3fSwKLSAgICB7e3s4NCw3fX0sOTl9LCB7e3swLDh9fSwxMjZ9LCB7e3swLDh9fSw2Mn0sIHt7ezAsOX19LDIyMX0sCi0gICAge3t7ODIsN319LDI3fSwge3t7MCw4fX0sMTEwfSwge3t7MCw4fX0sNDZ9LCB7e3swLDl9fSwxODl9LAotICAgIHt7ezAsOH19LDE0fSwge3t7MCw4fX0sMTQyfSwge3t7MCw4fX0sNzh9LCB7e3swLDl9fSwyNTN9LAotICAgIHt7ezk2LDd9fSwyNTZ9LCB7e3swLDh9fSw4MX0sIHt7ezAsOH19LDE3fSwge3t7ODUsOH19LDEzMX0sCi0gICAge3t7ODIsN319LDMxfSwge3t7MCw4fX0sMTEzfSwge3t7MCw4fX0sNDl9LCB7e3swLDl9fSwxOTV9LAotICAgIHt7ezgwLDd9fSwxMH0sIHt7ezAsOH19LDk3fSwge3t7MCw4fX0sMzN9LCB7e3swLDl9fSwxNjN9LAotICAgIHt7ezAsOH19LDF9LCB7e3swLDh9fSwxMjl9LCB7e3swLDh9fSw2NX0sIHt7ezAsOX19LDIyN30sCi0gICAge3t7ODAsN319LDZ9LCB7e3swLDh9fSw4OX0sIHt7ezAsOH19LDI1fSwge3t7MCw5fX0sMTQ3fSwKLSAgICB7e3s4Myw3fX0sNTl9LCB7e3swLDh9fSwxMjF9LCB7e3swLDh9fSw1N30sIHt7ezAsOX19LDIxMX0sCi0gICAge3t7ODEsN319LDE3fSwge3t7MCw4fX0sMTA1fSwge3t7MCw4fX0sNDF9LCB7e3swLDl9fSwxNzl9LAotICAgIHt7ezAsOH19LDl9LCB7e3swLDh9fSwxMzd9LCB7e3swLDh9fSw3M30sIHt7ezAsOX19LDI0M30sCi0gICAge3t7ODAsN319LDR9LCB7e3swLDh9fSw4NX0sIHt7ezAsOH19LDIxfSwge3t7ODAsOH19LDI1OH0sCi0gICAge3t7ODMsN319LDQzfSwge3t7MCw4fX0sMTE3fSwge3t7MCw4fX0sNTN9LCB7e3swLDl9fSwyMDN9LAotICAgIHt7ezgxLDd9fSwxM30sIHt7ezAsOH19LDEwMX0sIHt7ezAsOH19LDM3fSwge3t7MCw5fX0sMTcxfSwKLSAgICB7e3swLDh9fSw1fSwge3t7MCw4fX0sMTMzfSwge3t7MCw4fX0sNjl9LCB7e3swLDl9fSwyMzV9LAotICAgIHt7ezgwLDd9fSw4fSwge3t7MCw4fX0sOTN9LCB7e3swLDh9fSwyOX0sIHt7ezAsOX19LDE1NX0sCi0gICAge3t7ODQsN319LDgzfSwge3t7MCw4fX0sMTI1fSwge3t7MCw4fX0sNjF9LCB7e3swLDl9fSwyMTl9LAotICAgIHt7ezgyLDd9fSwyM30sIHt7ezAsOH19LDEwOX0sIHt7ezAsOH19LDQ1fSwge3t7MCw5fX0sMTg3fSwKLSAgICB7e3swLDh9fSwxM30sIHt7ezAsOH19LDE0MX0sIHt7ezAsOH19LDc3fSwge3t7MCw5fX0sMjUxfSwKLSAgICB7e3s4MCw3fX0sM30sIHt7ezAsOH19LDgzfSwge3t7MCw4fX0sMTl9LCB7e3s4NSw4fX0sMTk1fSwKLSAgICB7e3s4Myw3fX0sMzV9LCB7e3swLDh9fSwxMTV9LCB7e3swLDh9fSw1MX0sIHt7ezAsOX19LDE5OX0sCi0gICAge3t7ODEsN319LDExfSwge3t7MCw4fX0sOTl9LCB7e3swLDh9fSwzNX0sIHt7ezAsOX19LDE2N30sCi0gICAge3t7MCw4fX0sM30sIHt7ezAsOH19LDEzMX0sIHt7ezAsOH19LDY3fSwge3t7MCw5fX0sMjMxfSwKLSAgICB7e3s4MCw3fX0sN30sIHt7ezAsOH19LDkxfSwge3t7MCw4fX0sMjd9LCB7e3swLDl9fSwxNTF9LAotICAgIHt7ezg0LDd9fSw2N30sIHt7ezAsOH19LDEyM30sIHt7ezAsOH19LDU5fSwge3t7MCw5fX0sMjE1fSwKLSAgICB7e3s4Miw3fX0sMTl9LCB7e3swLDh9fSwxMDd9LCB7e3swLDh9fSw0M30sIHt7ezAsOX19LDE4M30sCi0gICAge3t7MCw4fX0sMTF9LCB7e3swLDh9fSwxMzl9LCB7e3swLDh9fSw3NX0sIHt7ezAsOX19LDI0N30sCi0gICAge3t7ODAsN319LDV9LCB7e3swLDh9fSw4N30sIHt7ezAsOH19LDIzfSwge3t7MTkyLDh9fSwwfSwKLSAgICB7e3s4Myw3fX0sNTF9LCB7e3swLDh9fSwxMTl9LCB7e3swLDh9fSw1NX0sIHt7ezAsOX19LDIwN30sCi0gICAge3t7ODEsN319LDE1fSwge3t7MCw4fX0sMTAzfSwge3t7MCw4fX0sMzl9LCB7e3swLDl9fSwxNzV9LAotICAgIHt7ezAsOH19LDd9LCB7e3swLDh9fSwxMzV9LCB7e3swLDh9fSw3MX0sIHt7ezAsOX19LDIzOX0sCi0gICAge3t7ODAsN319LDl9LCB7e3swLDh9fSw5NX0sIHt7ezAsOH19LDMxfSwge3t7MCw5fX0sMTU5fSwKLSAgICB7e3s4NCw3fX0sOTl9LCB7e3swLDh9fSwxMjd9LCB7e3swLDh9fSw2M30sIHt7ezAsOX19LDIyM30sCi0gICAge3t7ODIsN319LDI3fSwge3t7MCw4fX0sMTExfSwge3t7MCw4fX0sNDd9LCB7e3swLDl9fSwxOTF9LAotICAgIHt7ezAsOH19LDE1fSwge3t7MCw4fX0sMTQzfSwge3t7MCw4fX0sNzl9LCB7e3swLDl9fSwyNTV9Ci0gIH07Ci1sb2NhbCBpbmZsYXRlX2h1ZnQgZml4ZWRfdGRbXSA9IHsKLSAgICB7e3s4MCw1fX0sMX0sIHt7ezg3LDV9fSwyNTd9LCB7e3s4Myw1fX0sMTd9LCB7e3s5MSw1fX0sNDA5N30sCi0gICAge3t7ODEsNX19LDV9LCB7e3s4OSw1fX0sMTAyNX0sIHt7ezg1LDV9fSw2NX0sIHt7ezkzLDV9fSwxNjM4NX0sCi0gICAge3t7ODAsNX19LDN9LCB7e3s4OCw1fX0sNTEzfSwge3t7ODQsNX19LDMzfSwge3t7OTIsNX19LDgxOTN9LAotICAgIHt7ezgyLDV9fSw5fSwge3t7OTAsNX19LDIwNDl9LCB7e3s4Niw1fX0sMTI5fSwge3t7MTkyLDV9fSwyNDU3N30sCi0gICAge3t7ODAsNX19LDJ9LCB7e3s4Nyw1fX0sMzg1fSwge3t7ODMsNX19LDI1fSwge3t7OTEsNX19LDYxNDV9LAotICAgIHt7ezgxLDV9fSw3fSwge3t7ODksNX19LDE1Mzd9LCB7e3s4NSw1fX0sOTd9LCB7e3s5Myw1fX0sMjQ1Nzd9LAotICAgIHt7ezgwLDV9fSw0fSwge3t7ODgsNX19LDc2OX0sIHt7ezg0LDV9fSw0OX0sIHt7ezkyLDV9fSwxMjI4OX0sCi0gICAge3t7ODIsNX19LDEzfSwge3t7OTAsNX19LDMwNzN9LCB7e3s4Niw1fX0sMTkzfSwge3t7MTkyLDV9fSwyNDU3N30KLSAgfTsKKyAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbNTEyXSA9IHsKKyAgICAgICAgezk2LDcsMH0sezAsOCw4MH0sezAsOCwxNn0sezIwLDgsMTE1fSx7MTgsNywzMX0sezAsOCwxMTJ9LHswLDgsNDh9LAorICAgICAgICB7MCw5LDE5Mn0sezE2LDcsMTB9LHswLDgsOTZ9LHswLDgsMzJ9LHswLDksMTYwfSx7MCw4LDB9LHswLDgsMTI4fSwKKyAgICAgICAgezAsOCw2NH0sezAsOSwyMjR9LHsxNiw3LDZ9LHswLDgsODh9LHswLDgsMjR9LHswLDksMTQ0fSx7MTksNyw1OX0sCisgICAgICAgIHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOH0sezE3LDcsMTd9LHswLDgsMTA0fSx7MCw4LDQwfSx7MCw5LDE3Nn0sCisgICAgICAgIHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LHswLDksMjQwfSx7MTYsNyw0fSx7MCw4LDg0fSx7MCw4LDIwfSwKKyAgICAgICAgezIxLDgsMjI3fSx7MTksNyw0M30sezAsOCwxMTZ9LHswLDgsNTJ9LHswLDksMjAwfSx7MTcsNywxM30sezAsOCwxMDB9LAorICAgICAgICB7MCw4LDM2fSx7MCw5LDE2OH0sezAsOCw0fSx7MCw4LDEzMn0sezAsOCw2OH0sezAsOSwyMzJ9LHsxNiw3LDh9LAorICAgICAgICB7MCw4LDkyfSx7MCw4LDI4fSx7MCw5LDE1Mn0sezIwLDcsODN9LHswLDgsMTI0fSx7MCw4LDYwfSx7MCw5LDIxNn0sCisgICAgICAgIHsxOCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sezAsOSwxODR9LHswLDgsMTJ9LHswLDgsMTQwfSx7MCw4LDc2fSwKKyAgICAgICAgezAsOSwyNDh9LHsxNiw3LDN9LHswLDgsODJ9LHswLDgsMTh9LHsyMSw4LDE2M30sezE5LDcsMzV9LHswLDgsMTE0fSwKKyAgICAgICAgezAsOCw1MH0sezAsOSwxOTZ9LHsxNyw3LDExfSx7MCw4LDk4fSx7MCw4LDM0fSx7MCw5LDE2NH0sezAsOCwyfSwKKyAgICAgICAgezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI4fSx7MTYsNyw3fSx7MCw4LDkwfSx7MCw4LDI2fSx7MCw5LDE0OH0sCisgICAgICAgIHsyMCw3LDY3fSx7MCw4LDEyMn0sezAsOCw1OH0sezAsOSwyMTJ9LHsxOCw3LDE5fSx7MCw4LDEwNn0sezAsOCw0Mn0sCisgICAgICAgIHswLDksMTgwfSx7MCw4LDEwfSx7MCw4LDEzOH0sezAsOCw3NH0sezAsOSwyNDR9LHsxNiw3LDV9LHswLDgsODZ9LAorICAgICAgICB7MCw4LDIyfSx7NjQsOCwwfSx7MTksNyw1MX0sezAsOCwxMTh9LHswLDgsNTR9LHswLDksMjA0fSx7MTcsNywxNX0sCisgICAgICAgIHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3Mn0sezAsOCw2fSx7MCw4LDEzNH0sezAsOCw3MH0sezAsOSwyMzZ9LAorICAgICAgICB7MTYsNyw5fSx7MCw4LDk0fSx7MCw4LDMwfSx7MCw5LDE1Nn0sezIwLDcsOTl9LHswLDgsMTI2fSx7MCw4LDYyfSwKKyAgICAgICAgezAsOSwyMjB9LHsxOCw3LDI3fSx7MCw4LDExMH0sezAsOCw0Nn0sezAsOSwxODh9LHswLDgsMTR9LHswLDgsMTQyfSwKKyAgICAgICAgezAsOCw3OH0sezAsOSwyNTJ9LHs5Niw3LDB9LHswLDgsODF9LHswLDgsMTd9LHsyMSw4LDEzMX0sezE4LDcsMzF9LAorICAgICAgICB7MCw4LDExM30sezAsOCw0OX0sezAsOSwxOTR9LHsxNiw3LDEwfSx7MCw4LDk3fSx7MCw4LDMzfSx7MCw5LDE2Mn0sCisgICAgICAgIHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LHswLDksMjI2fSx7MTYsNyw2fSx7MCw4LDg5fSx7MCw4LDI1fSwKKyAgICAgICAgezAsOSwxNDZ9LHsxOSw3LDU5fSx7MCw4LDEyMX0sezAsOCw1N30sezAsOSwyMTB9LHsxNyw3LDE3fSx7MCw4LDEwNX0sCisgICAgICAgIHswLDgsNDF9LHswLDksMTc4fSx7MCw4LDl9LHswLDgsMTM3fSx7MCw4LDczfSx7MCw5LDI0Mn0sezE2LDcsNH0sCisgICAgICAgIHswLDgsODV9LHswLDgsMjF9LHsxNiw4LDI1OH0sezE5LDcsNDN9LHswLDgsMTE3fSx7MCw4LDUzfSx7MCw5LDIwMn0sCisgICAgICAgIHsxNyw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sezAsOSwxNzB9LHswLDgsNX0sezAsOCwxMzN9LHswLDgsNjl9LAorICAgICAgICB7MCw5LDIzNH0sezE2LDcsOH0sezAsOCw5M30sezAsOCwyOX0sezAsOSwxNTR9LHsyMCw3LDgzfSx7MCw4LDEyNX0sCisgICAgICAgIHswLDgsNjF9LHswLDksMjE4fSx7MTgsNywyM30sezAsOCwxMDl9LHswLDgsNDV9LHswLDksMTg2fSx7MCw4LDEzfSwKKyAgICAgICAgezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUwfSx7MTYsNywzfSx7MCw4LDgzfSx7MCw4LDE5fSx7MjEsOCwxOTV9LAorICAgICAgICB7MTksNywzNX0sezAsOCwxMTV9LHswLDgsNTF9LHswLDksMTk4fSx7MTcsNywxMX0sezAsOCw5OX0sezAsOCwzNX0sCisgICAgICAgIHswLDksMTY2fSx7MCw4LDN9LHswLDgsMTMxfSx7MCw4LDY3fSx7MCw5LDIzMH0sezE2LDcsN30sezAsOCw5MX0sCisgICAgICAgIHswLDgsMjd9LHswLDksMTUwfSx7MjAsNyw2N30sezAsOCwxMjN9LHswLDgsNTl9LHswLDksMjE0fSx7MTgsNywxOX0sCisgICAgICAgIHswLDgsMTA3fSx7MCw4LDQzfSx7MCw5LDE4Mn0sezAsOCwxMX0sezAsOCwxMzl9LHswLDgsNzV9LHswLDksMjQ2fSwKKyAgICAgICAgezE2LDcsNX0sezAsOCw4N30sezAsOCwyM30sezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE5fSx7MCw4LDU1fSwKKyAgICAgICAgezAsOSwyMDZ9LHsxNyw3LDE1fSx7MCw4LDEwM30sezAsOCwzOX0sezAsOSwxNzR9LHswLDgsN30sezAsOCwxMzV9LAorICAgICAgICB7MCw4LDcxfSx7MCw5LDIzOH0sezE2LDcsOX0sezAsOCw5NX0sezAsOCwzMX0sezAsOSwxNTh9LHsyMCw3LDk5fSwKKyAgICAgICAgezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIyfSx7MTgsNywyN30sezAsOCwxMTF9LHswLDgsNDd9LHswLDksMTkwfSwKKyAgICAgICAgezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LHswLDksMjU0fSx7OTYsNywwfSx7MCw4LDgwfSx7MCw4LDE2fSwKKyAgICAgICAgezIwLDgsMTE1fSx7MTgsNywzMX0sezAsOCwxMTJ9LHswLDgsNDh9LHswLDksMTkzfSx7MTYsNywxMH0sezAsOCw5Nn0sCisgICAgICAgIHswLDgsMzJ9LHswLDksMTYxfSx7MCw4LDB9LHswLDgsMTI4fSx7MCw4LDY0fSx7MCw5LDIyNX0sezE2LDcsNn0sCisgICAgICAgIHswLDgsODh9LHswLDgsMjR9LHswLDksMTQ1fSx7MTksNyw1OX0sezAsOCwxMjB9LHswLDgsNTZ9LHswLDksMjA5fSwKKyAgICAgICAgezE3LDcsMTd9LHswLDgsMTA0fSx7MCw4LDQwfSx7MCw5LDE3N30sezAsOCw4fSx7MCw4LDEzNn0sezAsOCw3Mn0sCisgICAgICAgIHswLDksMjQxfSx7MTYsNyw0fSx7MCw4LDg0fSx7MCw4LDIwfSx7MjEsOCwyMjd9LHsxOSw3LDQzfSx7MCw4LDExNn0sCisgICAgICAgIHswLDgsNTJ9LHswLDksMjAxfSx7MTcsNywxM30sezAsOCwxMDB9LHswLDgsMzZ9LHswLDksMTY5fSx7MCw4LDR9LAorICAgICAgICB7MCw4LDEzMn0sezAsOCw2OH0sezAsOSwyMzN9LHsxNiw3LDh9LHswLDgsOTJ9LHswLDgsMjh9LHswLDksMTUzfSwKKyAgICAgICAgezIwLDcsODN9LHswLDgsMTI0fSx7MCw4LDYwfSx7MCw5LDIxN30sezE4LDcsMjN9LHswLDgsMTA4fSx7MCw4LDQ0fSwKKyAgICAgICAgezAsOSwxODV9LHswLDgsMTJ9LHswLDgsMTQwfSx7MCw4LDc2fSx7MCw5LDI0OX0sezE2LDcsM30sezAsOCw4Mn0sCisgICAgICAgIHswLDgsMTh9LHsyMSw4LDE2M30sezE5LDcsMzV9LHswLDgsMTE0fSx7MCw4LDUwfSx7MCw5LDE5N30sezE3LDcsMTF9LAorICAgICAgICB7MCw4LDk4fSx7MCw4LDM0fSx7MCw5LDE2NX0sezAsOCwyfSx7MCw4LDEzMH0sezAsOCw2Nn0sezAsOSwyMjl9LAorICAgICAgICB7MTYsNyw3fSx7MCw4LDkwfSx7MCw4LDI2fSx7MCw5LDE0OX0sezIwLDcsNjd9LHswLDgsMTIyfSx7MCw4LDU4fSwKKyAgICAgICAgezAsOSwyMTN9LHsxOCw3LDE5fSx7MCw4LDEwNn0sezAsOCw0Mn0sezAsOSwxODF9LHswLDgsMTB9LHswLDgsMTM4fSwKKyAgICAgICAgezAsOCw3NH0sezAsOSwyNDV9LHsxNiw3LDV9LHswLDgsODZ9LHswLDgsMjJ9LHs2NCw4LDB9LHsxOSw3LDUxfSwKKyAgICAgICAgezAsOCwxMTh9LHswLDgsNTR9LHswLDksMjA1fSx7MTcsNywxNX0sezAsOCwxMDJ9LHswLDgsMzh9LHswLDksMTczfSwKKyAgICAgICAgezAsOCw2fSx7MCw4LDEzNH0sezAsOCw3MH0sezAsOSwyMzd9LHsxNiw3LDl9LHswLDgsOTR9LHswLDgsMzB9LAorICAgICAgICB7MCw5LDE1N30sezIwLDcsOTl9LHswLDgsMTI2fSx7MCw4LDYyfSx7MCw5LDIyMX0sezE4LDcsMjd9LHswLDgsMTEwfSwKKyAgICAgICAgezAsOCw0Nn0sezAsOSwxODl9LHswLDgsMTR9LHswLDgsMTQyfSx7MCw4LDc4fSx7MCw5LDI1M30sezk2LDcsMH0sCisgICAgICAgIHswLDgsODF9LHswLDgsMTd9LHsyMSw4LDEzMX0sezE4LDcsMzF9LHswLDgsMTEzfSx7MCw4LDQ5fSx7MCw5LDE5NX0sCisgICAgICAgIHsxNiw3LDEwfSx7MCw4LDk3fSx7MCw4LDMzfSx7MCw5LDE2M30sezAsOCwxfSx7MCw4LDEyOX0sezAsOCw2NX0sCisgICAgICAgIHswLDksMjI3fSx7MTYsNyw2fSx7MCw4LDg5fSx7MCw4LDI1fSx7MCw5LDE0N30sezE5LDcsNTl9LHswLDgsMTIxfSwKKyAgICAgICAgezAsOCw1N30sezAsOSwyMTF9LHsxNyw3LDE3fSx7MCw4LDEwNX0sezAsOCw0MX0sezAsOSwxNzl9LHswLDgsOX0sCisgICAgICAgIHswLDgsMTM3fSx7MCw4LDczfSx7MCw5LDI0M30sezE2LDcsNH0sezAsOCw4NX0sezAsOCwyMX0sezE2LDgsMjU4fSwKKyAgICAgICAgezE5LDcsNDN9LHswLDgsMTE3fSx7MCw4LDUzfSx7MCw5LDIwM30sezE3LDcsMTN9LHswLDgsMTAxfSx7MCw4LDM3fSwKKyAgICAgICAgezAsOSwxNzF9LHswLDgsNX0sezAsOCwxMzN9LHswLDgsNjl9LHswLDksMjM1fSx7MTYsNyw4fSx7MCw4LDkzfSwKKyAgICAgICAgezAsOCwyOX0sezAsOSwxNTV9LHsyMCw3LDgzfSx7MCw4LDEyNX0sezAsOCw2MX0sezAsOSwyMTl9LHsxOCw3LDIzfSwKKyAgICAgICAgezAsOCwxMDl9LHswLDgsNDV9LHswLDksMTg3fSx7MCw4LDEzfSx7MCw4LDE0MX0sezAsOCw3N30sezAsOSwyNTF9LAorICAgICAgICB7MTYsNywzfSx7MCw4LDgzfSx7MCw4LDE5fSx7MjEsOCwxOTV9LHsxOSw3LDM1fSx7MCw4LDExNX0sezAsOCw1MX0sCisgICAgICAgIHswLDksMTk5fSx7MTcsNywxMX0sezAsOCw5OX0sezAsOCwzNX0sezAsOSwxNjd9LHswLDgsM30sezAsOCwxMzF9LAorICAgICAgICB7MCw4LDY3fSx7MCw5LDIzMX0sezE2LDcsN30sezAsOCw5MX0sezAsOCwyN30sezAsOSwxNTF9LHsyMCw3LDY3fSwKKyAgICAgICAgezAsOCwxMjN9LHswLDgsNTl9LHswLDksMjE1fSx7MTgsNywxOX0sezAsOCwxMDd9LHswLDgsNDN9LHswLDksMTgzfSwKKyAgICAgICAgezAsOCwxMX0sezAsOCwxMzl9LHswLDgsNzV9LHswLDksMjQ3fSx7MTYsNyw1fSx7MCw4LDg3fSx7MCw4LDIzfSwKKyAgICAgICAgezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE5fSx7MCw4LDU1fSx7MCw5LDIwN30sezE3LDcsMTV9LHswLDgsMTAzfSwKKyAgICAgICAgezAsOCwzOX0sezAsOSwxNzV9LHswLDgsN30sezAsOCwxMzV9LHswLDgsNzF9LHswLDksMjM5fSx7MTYsNyw5fSwKKyAgICAgICAgezAsOCw5NX0sezAsOCwzMX0sezAsOSwxNTl9LHsyMCw3LDk5fSx7MCw4LDEyN30sezAsOCw2M30sezAsOSwyMjN9LAorICAgICAgICB7MTgsNywyN30sezAsOCwxMTF9LHswLDgsNDd9LHswLDksMTkxfSx7MCw4LDE1fSx7MCw4LDE0M30sezAsOCw3OX0sCisgICAgICAgIHswLDksMjU1fQorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY29kZSBkaXN0Zml4WzMyXSA9IHsKKyAgICAgICAgezE2LDUsMX0sezIzLDUsMjU3fSx7MTksNSwxN30sezI3LDUsNDA5N30sezE3LDUsNX0sezI1LDUsMTAyNX0sCisgICAgICAgIHsyMSw1LDY1fSx7MjksNSwxNjM4NX0sezE2LDUsM30sezI0LDUsNTEzfSx7MjAsNSwzM30sezI4LDUsODE5M30sCisgICAgICAgIHsxOCw1LDl9LHsyNiw1LDIwNDl9LHsyMiw1LDEyOX0sezY0LDUsMH0sezE2LDUsMn0sezIzLDUsMzg1fSwKKyAgICAgICAgezE5LDUsMjV9LHsyNyw1LDYxNDV9LHsxNyw1LDd9LHsyNSw1LDE1Mzd9LHsyMSw1LDk3fSx7MjksNSwyNDU3N30sCisgICAgICAgIHsxNiw1LDR9LHsyNCw1LDc2OX0sezIwLDUsNDl9LHsyOCw1LDEyMjg5fSx7MTgsNSwxM30sezI2LDUsMzA3M30sCisgICAgICAgIHsyMiw1LDE5M30sezY0LDUsMH0KKyAgICB9OwpkaWZmIC0tZ2l0IGEvaW5mbGF0ZS5jIGIvaW5mbGF0ZS5jCmluZGV4IGRmYjJlODYuLjM2ZmJiNzUgMTAwNjQ0Ci0tLSBhL2luZmxhdGUuYworKysgYi9pbmZsYXRlLmMKQEAgLTEsMzY2ICsxLDEyNDkgQEAKLS8qIGluZmxhdGUuYyAtLSB6bGliIGludGVyZmFjZSB0byBpbmZsYXRlIG1vZHVsZXMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisvKiBpbmZsYXRlLmMgLS0gemxpYiBkZWNvbXByZXNzaW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqIENoYW5nZSBoaXN0b3J5OgorICoKKyAqIDEuMi5iZXRhMCAgICAyNCBOb3YgMjAwMgorICogLSBGaXJzdCB2ZXJzaW9uIC0tIGNvbXBsZXRlIHJld3JpdGUgb2YgaW5mbGF0ZSB0byBzaW1wbGlmeSBjb2RlLCBhdm9pZAorICogICBjcmVhdGlvbiBvZiB3aW5kb3cgd2hlbiBub3QgbmVlZGVkLCBtaW5pbWl6ZSB1c2Ugb2Ygd2luZG93IHdoZW4gaXQgaXMKKyAqICAgbmVlZGVkLCBtYWtlIGluZmZhc3QuYyBldmVuIGZhc3RlciwgaW1wbGVtZW50IGd6aXAgZGVjb2RpbmcsIGFuZCB0bworICogICBpbXByb3ZlIGNvZGUgcmVhZGFiaWxpdHkgYW5kIHN0eWxlIG92ZXIgdGhlIHByZXZpb3VzIHpsaWIgaW5mbGF0ZSBjb2RlCisgKgorICogMS4yLmJldGExICAgIDI1IE5vdiAyMDAyCisgKiAtIFVzZSBwb2ludGVycyBmb3IgYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgY2hlY2tpbmcgaW4gaW5mZmFzdC5jCisgKiAtIFJlbW92ZSBpbnB1dCBhbmQgb3V0cHV0IGNvdW50ZXJzIGluIGluZmZhc3QuYworICogLSBDaGFuZ2UgaW5mZmFzdC5jIGVudHJ5IGFuZCBsb29wIGZyb20gYXZhaWxfaW4gPj0gNyB0byA+PSA2CisgKiAtIFJlbW92ZSB1bm5lY2Vzc2FyeSBzZWNvbmQgYnl0ZSBwdWxsIGZyb20gbGVuZ3RoIGV4dHJhIGluIGluZmZhc3QuYworICogLSBVbnJvbGwgZGlyZWN0IGNvcHkgdG8gdGhyZWUgY29waWVzIHBlciBsb29wIGluIGluZmZhc3QuYworICoKKyAqIDEuMi5iZXRhMiAgICA0IERlYyAyMDAyCisgKiAtIENoYW5nZSBleHRlcm5hbCByb3V0aW5lIG5hbWVzIHRvIHJlZHVjZSBwb3RlbnRpYWwgY29uZmxpY3RzCisgKiAtIENvcnJlY3QgZmlsZW5hbWUgdG8gaW5mZml4ZWQuaCBmb3IgZml4ZWQgdGFibGVzIGluIGluZmxhdGUuYworICogLSBNYWtlIGhidWZbXSB1bnNpZ25lZCBjaGFyIHRvIG1hdGNoIHBhcmFtZXRlciB0eXBlIGluIGluZmxhdGUuYworICogLSBDaGFuZ2Ugc3RybS0+bmV4dF9vdXRbLXN0YXRlLT5vZmZzZXRdIHRvICooc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+b2Zmc2V0KQorICogICB0byBhdm9pZCBuZWdhdGlvbiBwcm9ibGVtIG9uIEFscGhhcyAoNjQgYml0KSBpbiBpbmZsYXRlLmMKKyAqCisgKiAxLjIuYmV0YTMgICAgMjIgRGVjIDIwMDIKKyAqIC0gQWRkIGNvbW1lbnRzIG9uIHN0YXRlLT5iaXRzIGFzc2VydGlvbiBpbiBpbmZmYXN0LmMKKyAqIC0gQWRkIGNvbW1lbnRzIG9uIG9wIGZpZWxkIGluIGluZnRyZWVzLmgKKyAqIC0gRml4IGJ1ZyBpbiByZXVzZSBvZiBhbGxvY2F0ZWQgd2luZG93IGFmdGVyIGluZmxhdGVSZXNldCgpCisgKiAtIFJlbW92ZSBiaXQgZmllbGRzLS1iYWNrIHRvIGJ5dGUgc3RydWN0dXJlIGZvciBzcGVlZAorICogLSBSZW1vdmUgZGlzdGFuY2UgZXh0cmEgPT0gMCBjaGVjayBpbiBpbmZsYXRlX2Zhc3QoKS0tb25seSBoZWxwcyBmb3IgbGVuZ3RocworICogLSBDaGFuZ2UgcG9zdC1pbmNyZW1lbnRzIHRvIHByZS1pbmNyZW1lbnRzIGluIGluZmxhdGVfZmFzdCgpLCBQUEMgYmlhc2VkPworICogLSBBZGQgY29tcGlsZSB0aW1lIG9wdGlvbiwgUE9TVElOQywgdG8gdXNlIHBvc3QtaW5jcmVtZW50cyBpbnN0ZWFkIChJbnRlbD8pCisgKiAtIE1ha2UgTUFUQ0ggY29weSBpbiBpbmZsYXRlKCkgbXVjaCBmYXN0ZXIgZm9yIHdoZW4gaW5mbGF0ZV9mYXN0KCkgbm90IHVzZWQKKyAqIC0gVXNlIGxvY2FsIGNvcGllcyBvZiBzdHJlYW0gbmV4dCBhbmQgYXZhaWwgdmFsdWVzLCBhcyB3ZWxsIGFzIGxvY2FsIGJpdAorICogICBidWZmZXIgYW5kIGJpdCBjb3VudCBpbiBpbmZsYXRlKCktLWZvciBzcGVlZCB3aGVuIGluZmxhdGVfZmFzdCgpIG5vdCB1c2VkCisgKgorICogMS4yLmJldGE0ICAgIDEgSmFuIDIwMDMKKyAqIC0gU3BsaXQgcHRyIC0gMjU3IHN0YXRlbWVudHMgaW4gaW5mbGF0ZV90YWJsZSgpIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCisgKiAtIE1vdmUgYSBjb21tZW50IG9uIG91dHB1dCBidWZmZXIgc2l6ZXMgZnJvbSBpbmZmYXN0LmMgdG8gaW5mbGF0ZS5jCisgKiAtIEFkZCBjb21tZW50cyBpbiBpbmZmYXN0LmMgdG8gaW50cm9kdWNlIHRoZSBpbmZsYXRlX2Zhc3QoKSByb3V0aW5lCisgKiAtIFJlYXJyYW5nZSB3aW5kb3cgY29waWVzIGluIGluZmxhdGVfZmFzdCgpIGZvciBzcGVlZCBhbmQgc2ltcGxpZmljYXRpb24KKyAqIC0gVW5yb2xsIGxhc3QgY29weSBmb3Igd2luZG93IG1hdGNoIGluIGluZmxhdGVfZmFzdCgpCisgKiAtIFVzZSBsb2NhbCBjb3BpZXMgb2Ygd2luZG93IHZhcmlhYmxlcyBpbiBpbmZsYXRlX2Zhc3QoKSBmb3Igc3BlZWQKKyAqIC0gUHVsbCBvdXQgY29tbW9uIHdyaXRlID09IDAgY2FzZSBmb3Igc3BlZWQgaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gTWFrZSBvcCBhbmQgbGVuIGluIGluZmxhdGVfZmFzdCgpIHVuc2lnbmVkIGZvciBjb25zaXN0ZW5jeQorICogLSBBZGQgRkFSIHRvIGxjb2RlIGFuZCBkY29kZSBkZWNsYXJhdGlvbnMgaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gU2ltcGxpZmllZCBiYWQgZGlzdGFuY2UgY2hlY2sgaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gQWRkZWQgaW5mbGF0ZUJhY2tJbml0KCksIGluZmxhdGVCYWNrKCksIGFuZCBpbmZsYXRlQmFja0VuZCgpIGluIG5ldworICogICBzb3VyY2UgZmlsZSBpbmZiYWNrLmMgdG8gcHJvdmlkZSBhIGNhbGwtYmFjayBpbnRlcmZhY2UgdG8gaW5mbGF0ZSBmb3IKKyAqICAgcHJvZ3JhbXMgbGlrZSBnemlwIGFuZCB1bnppcCAtLSB1c2VzIHdpbmRvdyBhcyBvdXRwdXQgYnVmZmVyIHRvIGF2b2lkCisgKiAgIHdpbmRvdyBjb3B5aW5nCisgKgorICogMS4yLmJldGE1ICAgIDEgSmFuIDIwMDMKKyAqIC0gSW1wcm92ZWQgaW5mbGF0ZUJhY2soKSBpbnRlcmZhY2UgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBwcm92aWRlIGluaXRpYWwKKyAqICAgaW5wdXQgaW4gc3RybS4KKyAqIC0gRml4ZWQgc3RvcmVkIGJsb2NrcyBidWcgaW4gaW5mbGF0ZUJhY2soKQorICoKKyAqIDEuMi5iZXRhNiAgICA0IEphbiAyMDAzCisgKiAtIEFkZGVkIGNvbW1lbnRzIGluIGluZmZhc3QuYyBvbiBlZmZlY3RpdmVuZXNzIG9mIFBPU1RJTkMKKyAqIC0gVHlwZWNhc3RpbmcgYWxsIGFyb3VuZCB0byByZWR1Y2UgY29tcGlsZXIgd2FybmluZ3MKKyAqIC0gQ2hhbmdlZCBsb29wcyBmcm9tIHdoaWxlICgxKSBvciBkbyB7fSB3aGlsZSAoMSkgdG8gZm9yICg7OyksIGFnYWluIHRvCisgKiAgIG1ha2UgY29tcGlsZXJzIGhhcHB5CisgKiAtIENoYW5nZWQgdHlwZSBvZiB3aW5kb3cgaW4gaW5mbGF0ZUJhY2tJbml0KCkgdG8gdW5zaWduZWQgY2hhciAqCisgKgorICogMS4yLmJldGE3ICAgIDI3IEphbiAyMDAzCisgKiAtIENoYW5nZWQgbWFueSB0eXBlcyB0byB1bnNpZ25lZCBvciB1bnNpZ25lZCBzaG9ydCB0byBhdm9pZCB3YXJuaW5ncworICogLSBBZGRlZCBpbmZsYXRlQ29weSgpIGZ1bmN0aW9uCisgKgorICogMS4yLjAJOSBNYXIgMjAwMworICogLSBDaGFuZ2VkIGluZmxhdGVCYWNrKCkgaW50ZXJmYWNlIHRvIHByb3ZpZGUgc2VwYXJhdGUgb3BhcXVlIGRlc2NyaXB0b3JzCisgKiAgIGZvciB0aGUgaW4oKSBhbmQgb3V0KCkgZnVuY3Rpb25zCisgKiAtIENoYW5nZWQgaW5mbGF0ZUJhY2soKSBhcmd1bWVudCBhbmQgaW5fZnVuYyB0eXBlZGVmIHRvIHN3YXAgdGhlIGxlbmd0aAorICogICBhbmQgYnVmZmVyIGFkZHJlc3MgcmV0dXJuIHZhbHVlcyBmb3IgdGhlIGlucHV0IGZ1bmN0aW9uCisgKiAtIENoZWNrIG5leHRfaW4gYW5kIG5leHRfb3V0IGZvciBaX05VTEwgb24gZW50cnkgdG8gaW5mbGF0ZSgpCisgKgorICogUmVtYWluZGVyIG9mIGNoYW5nZSBoaXN0b3J5IGlzIGluIENoYW5nZUxvZyBpbiB6bGliIGRpc3RyaWJ1dGlvbi4KICAqLwogCiAjaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZibG9jay5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisjaW5jbHVkZSAiaW5mbGF0ZS5oIgorI2luY2x1ZGUgImluZmZhc3QuaCIKIAotc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLwotCi10eXBlZGVmIGVudW0gewotICAgICAgTUVUSE9ELCAgIC8qIHdhaXRpbmcgZm9yIG1ldGhvZCBieXRlICovCi0gICAgICBGTEFHLCAgICAgLyogd2FpdGluZyBmb3IgZmxhZyBieXRlICovCi0gICAgICBESUNUNCwgICAgLyogZm91ciBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBESUNUMywgICAgLyogdGhyZWUgZGljdGlvbmFyeSBjaGVjayBieXRlcyB0byBnbyAqLwotICAgICAgRElDVDIsICAgIC8qIHR3byBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBESUNUMSwgICAgLyogb25lIGRpY3Rpb25hcnkgY2hlY2sgYnl0ZSB0byBnbyAqLwotICAgICAgRElDVDAsICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5ICovCi0gICAgICBCTE9DS1MsICAgLyogZGVjb21wcmVzc2luZyBibG9ja3MgKi8KLSAgICAgIENIRUNLNCwgICAvKiBmb3VyIGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBDSEVDSzMsICAgLyogdGhyZWUgY2hlY2sgYnl0ZXMgdG8gZ28gKi8KLSAgICAgIENIRUNLMiwgICAvKiB0d28gY2hlY2sgYnl0ZXMgdG8gZ28gKi8KLSAgICAgIENIRUNLMSwgICAvKiBvbmUgY2hlY2sgYnl0ZSB0byBnbyAqLwotICAgICAgRE9ORSwgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lICovCi0gICAgICBCQUR9ICAgICAgLyogZ290IGFuIGVycm9yLS1zdGF5IGhlcmUgKi8KLWluZmxhdGVfbW9kZTsKLQotLyogaW5mbGF0ZSBwcml2YXRlIHN0YXRlICovCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgewotCi0gIC8qIG1vZGUgKi8KLSAgaW5mbGF0ZV9tb2RlICBtb2RlOyAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCi0KLSAgLyogbW9kZSBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KLSAgdW5pb24gewotICAgIHVJbnQgbWV0aG9kOyAgICAgICAgLyogaWYgRkxBR1MsIG1ldGhvZCBieXRlICovCi0gICAgc3RydWN0IHsKLSAgICAgIHVMb25nIHdhczsgICAgICAgICAgICAgICAgLyogY29tcHV0ZWQgY2hlY2sgdmFsdWUgKi8KLSAgICAgIHVMb25nIG5lZWQ7ICAgICAgICAgICAgICAgLyogc3RyZWFtIGNoZWNrIHZhbHVlICovCi0gICAgfSBjaGVjazsgICAgICAgICAgICAvKiBpZiBDSEVDSywgY2hlY2sgdmFsdWVzIHRvIGNvbXBhcmUgKi8KLSAgICB1SW50IG1hcmtlcjsgICAgICAgIC8qIGlmIEJBRCwgaW5mbGF0ZVN5bmMncyBtYXJrZXIgYnl0ZXMgY291bnQgKi8KLSAgfSBzdWI7ICAgICAgICAvKiBzdWJtb2RlICovCi0KLSAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICBpbnQgIG5vd3JhcDsgICAgICAgICAgLyogZmxhZyBmb3Igbm8gd3JhcHBlciAqLwotICB1SW50IHdiaXRzOyAgICAgICAgICAgLyogbG9nMih3aW5kb3cgc2l6ZSkgICg4Li4xNSwgZGVmYXVsdHMgdG8gMTUpICovCi0gIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAKLSAgICAqYmxvY2tzOyAgICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZV9ibG9ja3Mgc3RhdGUgKi8KLQotfTsKLQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoeikKLXpfc3RyZWFtcCB6OwotewotICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMKQotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgei0+dG90YWxfaW4gPSB6LT50b3RhbF9vdXQgPSAwOwotICB6LT5tc2cgPSBaX05VTEw7Ci0gIHotPnN0YXRlLT5tb2RlID0gei0+c3RhdGUtPm5vd3JhcCA/IEJMT0NLUyA6IE1FVEhPRDsKLSAgaW5mbGF0ZV9ibG9ja3NfcmVzZXQoei0+c3RhdGUtPmJsb2NrcywgeiwgWl9OVUxMKTsKLSAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiByZXNldFxuIikpOwotICByZXR1cm4gWl9PSzsKLX0KLQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlRW5kKHopCi16X3N0cmVhbXAgejsKLXsKLSAgaWYgKHogPT0gWl9OVUxMIHx8IHotPnN0YXRlID09IFpfTlVMTCB8fCB6LT56ZnJlZSA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICBpZiAoei0+c3RhdGUtPmJsb2NrcyAhPSBaX05VTEwpCi0gICAgaW5mbGF0ZV9ibG9ja3NfZnJlZSh6LT5zdGF0ZS0+YmxvY2tzLCB6KTsKLSAgWkZSRUUoeiwgei0+c3RhdGUpOwotICB6LT5zdGF0ZSA9IFpfTlVMTDsKLSAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBlbmRcbiIpKTsKLSAgcmV0dXJuIFpfT0s7Ci19Ci0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyh6LCB3LCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKLXpfc3RyZWFtcCB6OwotaW50IHc7Ci1jb25zdCBjaGFyICp2ZXJzaW9uOwotaW50IHN0cmVhbV9zaXplOwotewotICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKLSAgICAgIHN0cmVhbV9zaXplICE9IHNpemVvZih6X3N0cmVhbSkpCi0gICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOwotCi0gIC8qIGluaXRpYWxpemUgc3RhdGUgKi8KLSAgaWYgKHogPT0gWl9OVUxMKQotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgei0+bXNnID0gWl9OVUxMOwotICBpZiAoei0+emFsbG9jID09IFpfTlVMTCkKLSAgewotICAgIHotPnphbGxvYyA9IHpjYWxsb2M7Ci0gICAgei0+b3BhcXVlID0gKHZvaWRwZikwOwotICB9Ci0gIGlmICh6LT56ZnJlZSA9PSBaX05VTEwpIHotPnpmcmVlID0gemNmcmVlOwotICBpZiAoKHotPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKikKLSAgICAgICBaQUxMT0MoeiwxLHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUpKSkgPT0gWl9OVUxMKQotICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgei0+c3RhdGUtPmJsb2NrcyA9IFpfTlVMTDsKLQotICAvKiBoYW5kbGUgdW5kb2N1bWVudGVkIG5vd3JhcCBvcHRpb24gKG5vIHpsaWIgaGVhZGVyIG9yIGNoZWNrKSAqLwotICB6LT5zdGF0ZS0+bm93cmFwID0gMDsKLSAgaWYgKHcgPCAwKQotICB7Ci0gICAgdyA9IC0gdzsKLSAgICB6LT5zdGF0ZS0+bm93cmFwID0gMTsKLSAgfQotCi0gIC8qIHNldCB3aW5kb3cgc2l6ZSAqLwotICBpZiAodyA8IDggfHwgdyA+IDE1KQotICB7Ci0gICAgaW5mbGF0ZUVuZCh6KTsKLSAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gIH0KLSAgei0+c3RhdGUtPndiaXRzID0gKHVJbnQpdzsKLQotICAvKiBjcmVhdGUgaW5mbGF0ZV9ibG9ja3Mgc3RhdGUgKi8KLSAgaWYgKCh6LT5zdGF0ZS0+YmxvY2tzID0KLSAgICAgIGluZmxhdGVfYmxvY2tzX25ldyh6LCB6LT5zdGF0ZS0+bm93cmFwID8gWl9OVUxMIDogYWRsZXIzMiwgKHVJbnQpMSA8PCB3KSkKLSAgICAgID09IFpfTlVMTCkKLSAgewotICAgIGluZmxhdGVFbmQoeik7Ci0gICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICB9Ci0gIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7Ci0KLSAgLyogcmVzZXQgc3RhdGUgKi8KLSAgaW5mbGF0ZVJlc2V0KHopOwotICByZXR1cm4gWl9PSzsKLX0KLQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8oeiwgdmVyc2lvbiwgc3RyZWFtX3NpemUpCi16X3N0cmVhbXAgejsKLWNvbnN0IGNoYXIgKnZlcnNpb247Ci1pbnQgc3RyZWFtX3NpemU7Ci17Ci0gIHJldHVybiBpbmZsYXRlSW5pdDJfKHosIERFRl9XQklUUywgdmVyc2lvbiwgc3RyZWFtX3NpemUpOwotfQotCi0KLSNkZWZpbmUgTkVFREJZVEUge2lmKHotPmF2YWlsX2luPT0wKXJldHVybiByO3I9Zjt9Ci0jZGVmaW5lIE5FWFRCWVRFICh6LT5hdmFpbF9pbi0tLHotPnRvdGFsX2luKyssKnotPm5leHRfaW4rKykKLQotaW50IFpFWFBPUlQgaW5mbGF0ZSh6LCBmKQotel9zdHJlYW1wIHo7Ci1pbnQgZjsKLXsKLSAgaW50IHI7Ci0gIHVJbnQgYjsKLQotICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPm5leHRfaW4gPT0gWl9OVUxMKQotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgZiA9IGYgPT0gWl9GSU5JU0ggPyBaX0JVRl9FUlJPUiA6IFpfT0s7Ci0gIHIgPSBaX0JVRl9FUlJPUjsKLSAgd2hpbGUgKDEpIHN3aXRjaCAoei0+c3RhdGUtPm1vZGUpCi0gIHsKLSAgICBjYXNlIE1FVEhPRDoKLSAgICAgIE5FRURCWVRFCi0gICAgICBpZiAoKCh6LT5zdGF0ZS0+c3ViLm1ldGhvZCA9IE5FWFRCWVRFKSAmIDB4ZikgIT0gWl9ERUZMQVRFRCkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOwotICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICgoei0+c3RhdGUtPnN1Yi5tZXRob2QgPj4gNCkgKyA4ID4gei0+c3RhdGUtPndiaXRzKQotICAgICAgewotICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIHdpbmRvdyBzaXplIjsKLSAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSA1OyAgICAgICAvKiBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IEZMQUc7Ci0gICAgY2FzZSBGTEFHOgotICAgICAgTkVFREJZVEUKLSAgICAgIGIgPSBORVhUQllURTsKLSAgICAgIGlmICgoKHotPnN0YXRlLT5zdWIubWV0aG9kIDw8IDgpICsgYikgJSAzMSkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikiaW5jb3JyZWN0IGhlYWRlciBjaGVjayI7Ci0gICAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gNTsgICAgICAgLyogY2FuJ3QgdHJ5IGluZmxhdGVTeW5jICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiB6bGliIGhlYWRlciBva1xuIikpOwotICAgICAgaWYgKCEoYiAmIFBSRVNFVF9ESUNUKSkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCTE9DS1M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUNDsKLSAgICBjYXNlIERJQ1Q0OgotICAgICAgTkVFREJZVEUKLSAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCA9ICh1TG9uZylORVhUQllURSA8PCAyNDsKLSAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDM7Ci0gICAgY2FzZSBESUNUMzoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDE2OwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUMjsKLSAgICBjYXNlIERJQ1QyOgotICAgICAgTkVFREJZVEUKLSAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEUgPDwgODsKLSAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDE7Ci0gICAgY2FzZSBESUNUMToKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFOwotICAgICAgei0+YWRsZXIgPSB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQ7Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IERJQ1QwOwotICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUOwotICAgIGNhc2UgRElDVDA6Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgIHotPm1zZyA9IChjaGFyKikibmVlZCBkaWN0aW9uYXJ5IjsKLSAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gMDsgICAgICAgLyogY2FuIHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIGNhc2UgQkxPQ0tTOgotICAgICAgciA9IGluZmxhdGVfYmxvY2tzKHotPnN0YXRlLT5ibG9ja3MsIHosIHIpOwotICAgICAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQotICAgICAgewotICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSAwOyAgICAgICAvKiBjYW4gdHJ5IGluZmxhdGVTeW5jICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKHIgPT0gWl9PSykKLSAgICAgICAgciA9IGY7Ci0gICAgICBpZiAociAhPSBaX1NUUkVBTV9FTkQpCi0gICAgICAgIHJldHVybiByOwotICAgICAgciA9IGY7Ci0gICAgICBpbmZsYXRlX2Jsb2Nrc19yZXNldCh6LT5zdGF0ZS0+YmxvY2tzLCB6LCAmei0+c3RhdGUtPnN1Yi5jaGVjay53YXMpOwotICAgICAgaWYgKHotPnN0YXRlLT5ub3dyYXApCi0gICAgICB7Ci0gICAgICAgIHotPnN0YXRlLT5tb2RlID0gRE9ORTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLNDsKLSAgICBjYXNlIENIRUNLNDoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgPSAodUxvbmcpTkVYVEJZVEUgPDwgMjQ7Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLMzsKLSAgICBjYXNlIENIRUNLMzoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDE2OwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzI7Ci0gICAgY2FzZSBDSEVDSzI6Ci0gICAgICBORUVEQllURQotICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURSA8PCA4OwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzE7Ci0gICAgY2FzZSBDSEVDSzE6Ci0gICAgICBORUVEQllURQotICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURTsKLQotICAgICAgaWYgKHotPnN0YXRlLT5zdWIuY2hlY2sud2FzICE9IHotPnN0YXRlLT5zdWIuY2hlY2submVlZCkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikiaW5jb3JyZWN0IGRhdGEgY2hlY2siOwotICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogemxpYiBjaGVjayBva1xuIikpOwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBET05FOwotICAgIGNhc2UgRE9ORToKLSAgICAgIHJldHVybiBaX1NUUkVBTV9FTkQ7Ci0gICAgY2FzZSBCQUQ6Ci0gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gIH0KLSNpZmRlZiBORUVEX0RVTU1ZX1JFVFVSTgotICByZXR1cm4gWl9TVFJFQU1fRVJST1I7ICAvKiBTb21lIGR1bWIgY29tcGlsZXJzIGNvbXBsYWluIHdpdGhvdXQgdGhpcyAqLworI2lmZGVmIE1BS0VGSVhFRAorIyAgaWZuZGVmIEJVSUxERklYRUQKKyMgICAgZGVmaW5lIEJVSUxERklYRUQKKyMgIGVuZGlmCiAjZW5kaWYKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworbG9jYWwgdm9pZCBmaXhlZHRhYmxlcyBPRigoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZSkpOworbG9jYWwgaW50IHVwZGF0ZXdpbmRvdyBPRigoel9zdHJlYW1wIHN0cm0sIHVuc2lnbmVkIG91dCkpOworI2lmZGVmIEJVSUxERklYRUQKKyAgIHZvaWQgbWFrZWZpeGVkIE9GKCh2b2lkKSk7CisjZW5kaWYKK2xvY2FsIHVuc2lnbmVkIHN5bmNzZWFyY2ggT0YoKHVuc2lnbmVkICpoYXZlLCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7CisKK2ludCBaRVhQT1JUIGluZmxhdGVSZXNldChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBzdHJtLT50b3RhbF9pbiA9IHN0cm0tPnRvdGFsX291dCA9IHN0YXRlLT50b3RhbCA9IDA7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOworICAgIHN0YXRlLT5tb2RlID0gSEVBRDsKKyAgICBzdGF0ZS0+bGFzdCA9IDA7CisgICAgc3RhdGUtPmhhdmVkaWN0ID0gMDsKKyAgICBzdGF0ZS0+d3NpemUgPSAwOworICAgIHN0YXRlLT5ob2xkID0gMDsKKyAgICBzdGF0ZS0+Yml0cyA9IDA7CisgICAgc3RhdGUtPmxlbmNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGUgPSBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IHJlc2V0XG4iKSk7CisgICAgcmV0dXJuIFpfT0s7CiB9CiAKLQotaW50IFpFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkoeiwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkKLXpfc3RyZWFtcCB6OwotY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnk7Ci11SW50ICBkaWN0TGVuZ3RoOworaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyhzdHJtLCB3aW5kb3dCaXRzLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKK3pfc3RyZWFtcCBzdHJtOworaW50IHdpbmRvd0JpdHM7Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOwogewotICB1SW50IGxlbmd0aCA9IGRpY3RMZW5ndGg7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKIAotICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPnN0YXRlLT5tb2RlICE9IERJQ1QwKQotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICBpZiAoYWRsZXIzMigxTCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkgIT0gei0+YWRsZXIpIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gIHotPmFkbGVyID0gMUw7Ci0KLSAgaWYgKGxlbmd0aCA+PSAoKHVJbnQpMTw8ei0+c3RhdGUtPndiaXRzKSkKLSAgewotICAgIGxlbmd0aCA9ICgxPDx6LT5zdGF0ZS0+d2JpdHMpLTE7Ci0gICAgZGljdGlvbmFyeSArPSBkaWN0TGVuZ3RoIC0gbGVuZ3RoOwotICB9Ci0gIGluZmxhdGVfc2V0X2RpY3Rpb25hcnkoei0+c3RhdGUtPmJsb2NrcywgZGljdGlvbmFyeSwgbGVuZ3RoKTsKLSAgei0+c3RhdGUtPm1vZGUgPSBCTE9DS1M7Ci0gIHJldHVybiBaX09LOwotfQotCi0KLWludCBaRVhQT1JUIGluZmxhdGVTeW5jKHopCi16X3N0cmVhbXAgejsKLXsKLSAgdUludCBuOyAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gbG9vayBhdCAqLwotICBCeXRlZiAqcDsgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZXMgKi8KLSAgdUludCBtOyAgICAgICAvKiBudW1iZXIgb2YgbWFya2VyIGJ5dGVzIGZvdW5kIGluIGEgcm93ICovCi0gIHVMb25nIHIsIHc7ICAgLyogdGVtcG9yYXJpZXMgdG8gc2F2ZSB0b3RhbF9pbiBhbmQgdG90YWxfb3V0ICovCi0KLSAgLyogc2V0IHVwICovCi0gIGlmICh6ID09IFpfTlVMTCB8fCB6LT5zdGF0ZSA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICBpZiAoei0+c3RhdGUtPm1vZGUgIT0gQkFEKQotICB7Ci0gICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSAwOwotICB9Ci0gIGlmICgobiA9IHotPmF2YWlsX2luKSA9PSAwKQotICAgIHJldHVybiBaX0JVRl9FUlJPUjsKLSAgcCA9IHotPm5leHRfaW47Ci0gIG0gPSB6LT5zdGF0ZS0+c3ViLm1hcmtlcjsKLQotICAvKiBzZWFyY2ggKi8KLSAgd2hpbGUgKG4gJiYgbSA8IDQpCi0gIHsKLSAgICBzdGF0aWMgY29uc3QgQnl0ZSBtYXJrWzRdID0gezAsIDAsIDB4ZmYsIDB4ZmZ9OwotICAgIGlmICgqcCA9PSBtYXJrW21dKQotICAgICAgbSsrOwotICAgIGVsc2UgaWYgKCpwKQotICAgICAgbSA9IDA7CisgICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gWkxJQl9WRVJTSU9OWzBdIHx8CisgICAgICAgIHN0cmVhbV9zaXplICE9IChpbnQpKHNpemVvZih6X3N0cmVhbSkpKQorICAgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOworICAgIGlmIChzdHJtID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovCisgICAgaWYgKHN0cm0tPnphbGxvYyA9PSBaX05VTEwpIHsKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworICAgIH0KKyAgICBpZiAoc3RybS0+emZyZWUgPT0gWl9OVUxMKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKKyAgICAgICAgICAgIFpBTExPQyhzdHJtLCAxLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoc3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKKyAgICBzdHJtLT5zdGF0ZSA9ICh2b2lkcGYpc3RhdGU7CisgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CisgICAgICAgIHN0YXRlLT53cmFwID0gMDsKKyAgICAgICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzOworICAgIH0KICAgICBlbHNlCi0gICAgICBtID0gNCAtIG07Ci0gICAgcCsrLCBuLS07Ci0gIH0KLQotICAvKiByZXN0b3JlICovCi0gIHotPnRvdGFsX2luICs9IHAgLSB6LT5uZXh0X2luOwotICB6LT5uZXh0X2luID0gcDsKLSAgei0+YXZhaWxfaW4gPSBuOwotICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IG07Ci0KLSAgLyogcmV0dXJuIG5vIGpveSBvciBzZXQgdXAgdG8gcmVzdGFydCBvbiBhIG5ldyBibG9jayAqLwotICBpZiAobSAhPSA0KQotICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gIHIgPSB6LT50b3RhbF9pbjsgIHcgPSB6LT50b3RhbF9vdXQ7Ci0gIGluZmxhdGVSZXNldCh6KTsKLSAgei0+dG90YWxfaW4gPSByOyAgei0+dG90YWxfb3V0ID0gdzsKLSAgei0+c3RhdGUtPm1vZGUgPSBCTE9DS1M7Ci0gIHJldHVybiBaX09LOworICAgICAgICBzdGF0ZS0+d3JhcCA9IDE7CisgICAgaWYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkgeworICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZSk7CisgICAgICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIHN0YXRlLT53Yml0cyA9ICh1bnNpZ25lZCl3aW5kb3dCaXRzOworICAgIHN0YXRlLT53aW5kb3cgPSBaX05VTEw7CisgICAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTsKIH0KIAotCi0vKiBSZXR1cm5zIHRydWUgaWYgaW5mbGF0ZSBpcyBjdXJyZW50bHkgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGdlbmVyYXRlZAotICogYnkgWl9TWU5DX0ZMVVNIIG9yIFpfRlVMTF9GTFVTSC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IG9uZSBQUFAKLSAqIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYW4gYWRkaXRpb25hbCBzYWZldHkgY2hlY2suIFBQUCB1c2VzIFpfU1lOQ19GTFVTSAotICogYnV0IHJlbW92ZXMgdGhlIGxlbmd0aCBieXRlcyBvZiB0aGUgcmVzdWx0aW5nIGVtcHR5IHN0b3JlZCBibG9jay4gV2hlbgotICogZGVjb21wcmVzc2luZywgUFBQIGNoZWNrcyB0aGF0IGF0IHRoZSBlbmQgb2YgaW5wdXQgcGFja2V0LCBpbmZsYXRlIGlzCi0gKiB3YWl0aW5nIGZvciB0aGVzZSBsZW5ndGggYnl0ZXMuCi0gKi8KLWludCBaRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQoeikKLXpfc3RyZWFtcCB6OworaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfKHN0cm0sIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW1wIHN0cm07Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOwogewotICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPnN0YXRlLT5ibG9ja3MgPT0gWl9OVUxMKQotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgcmV0dXJuIGluZmxhdGVfYmxvY2tzX3N5bmNfcG9pbnQoei0+c3RhdGUtPmJsb2Nrcyk7CisgICAgcmV0dXJuIGluZmxhdGVJbml0Ml8oc3RybSwgREVGX1dCSVRTLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7Cit9CisKKy8qCisgICBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvCisgICBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguCisgICBJZiBCVUlMREZJWEVEIGlzIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGlzIHJvdXRpbmUgYnVpbGRzIHRoZSB0YWJsZXMgdGhlCisgICBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kCisgICB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpbgorICAgZXhjaGFuZ2UgZm9yIGEgbGl0dGxlIGV4ZWN1dGlvbiB0aW1lLiAgSG93ZXZlciwgQlVJTERGSVhFRCBzaG91bGQgbm90IGJlCisgICB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luCisgICBtYXkgbm90IGJlIHRocmVhZC1zYWZlLgorICovCitsb2NhbCB2b2lkIGZpeGVkdGFibGVzKHN0YXRlKQorc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKK3sKKyNpZmRlZiBCVUlMREZJWEVECisgICAgc3RhdGljIGludCB2aXJnaW4gPSAxOworICAgIHN0YXRpYyBjb2RlICpsZW5maXgsICpkaXN0Zml4OworICAgIHN0YXRpYyBjb2RlIGZpeGVkWzU0NF07CisKKyAgICAvKiBidWlsZCBmaXhlZCBodWZmbWFuIHRhYmxlcyBpZiBmaXJzdCBjYWxsIChtYXkgbm90IGJlIHRocmVhZCBzYWZlKSAqLworICAgIGlmICh2aXJnaW4pIHsKKyAgICAgICAgdW5zaWduZWQgc3ltLCBiaXRzOworICAgICAgICBzdGF0aWMgY29kZSAqbmV4dDsKKworICAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqLworICAgICAgICBzeW0gPSAwOworICAgICAgICB3aGlsZSAoc3ltIDwgMTQ0KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA4OworICAgICAgICB3aGlsZSAoc3ltIDwgMjU2KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA5OworICAgICAgICB3aGlsZSAoc3ltIDwgMjgwKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA3OworICAgICAgICB3aGlsZSAoc3ltIDwgMjg4KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA4OworICAgICAgICBuZXh0ID0gZml4ZWQ7CisgICAgICAgIGxlbmZpeCA9IG5leHQ7CisgICAgICAgIGJpdHMgPSA5OworICAgICAgICBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCAyODgsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKKworICAgICAgICAvKiBkaXN0YW5jZSB0YWJsZSAqLworICAgICAgICBzeW0gPSAwOworICAgICAgICB3aGlsZSAoc3ltIDwgMzIpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDU7CisgICAgICAgIGRpc3RmaXggPSBuZXh0OworICAgICAgICBiaXRzID0gNTsKKyAgICAgICAgaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMsIDMyLCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7CisKKyAgICAgICAgLyogZG8gdGhpcyBqdXN0IG9uY2UgKi8KKyAgICAgICAgdmlyZ2luID0gMDsKKyAgICB9CisjZWxzZSAvKiAhQlVJTERGSVhFRCAqLworIyAgIGluY2x1ZGUgImluZmZpeGVkLmgiCisjZW5kaWYgLyogQlVJTERGSVhFRCAqLworICAgIHN0YXRlLT5sZW5jb2RlID0gbGVuZml4OworICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKKyAgICBzdGF0ZS0+ZGlzdGNvZGUgPSBkaXN0Zml4OworICAgIHN0YXRlLT5kaXN0Yml0cyA9IDU7Cit9CisKKyNpZmRlZiBNQUtFRklYRUQKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKgorICAgV3JpdGUgb3V0IHRoZSBpbmZmaXhlZC5oIHRoYXQgaXMgI2luY2x1ZGUnZCBhYm92ZS4gIERlZmluaW5nIE1BS0VGSVhFRCBhbHNvCisgICBkZWZpbmVzIEJVSUxERklYRUQsIHNvIHRoZSB0YWJsZXMgYXJlIGJ1aWx0IG9uIHRoZSBmbHkuICBtYWtlZml4ZWQoKSB3cml0ZXMKKyAgIHRob3NlIHRhYmxlcyB0byBzdGRvdXQsIHdoaWNoIHdvdWxkIGJlIHBpcGVkIHRvIGluZmZpeGVkLmguICBBIHNtYWxsIHByb2dyYW0KKyAgIGNhbiBzaW1wbHkgY2FsbCBtYWtlZml4ZWQgdG8gZG8gdGhpczoKKworICAgIHZvaWQgbWFrZWZpeGVkKHZvaWQpOworCisgICAgaW50IG1haW4odm9pZCkKKyAgICB7CisgICAgICAgIG1ha2VmaXhlZCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgIFRoZW4gdGhhdCBjYW4gYmUgbGlua2VkIHdpdGggemxpYiBidWlsdCB3aXRoIE1BS0VGSVhFRCBkZWZpbmVkIGFuZCBydW46CisKKyAgICBhLm91dCA+IGluZmZpeGVkLmgKKyAqLwordm9pZCBtYWtlZml4ZWQoKQoreworICAgIHVuc2lnbmVkIGxvdywgc2l6ZTsKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBzdGF0ZTsKKworICAgIGZpeGVkdGFibGVzKCZzdGF0ZSk7CisgICAgcHV0cygiICAgIC8qIGluZmZpeGVkLmggLS0gdGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzIik7CisgICAgcHV0cygiICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZCgpLiIpOworICAgIHB1dHMoIiAgICAgKi8iKTsKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCIgICAgLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4iKTsKKyAgICBwdXRzKCIgICAgICAgSXQgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBsaWJyYXJ5IGFuZCBpcyIpOworICAgIHB1dHMoIiAgICAgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguIik7CisgICAgcHV0cygiICAgICAqLyIpOworICAgIHB1dHMoIiIpOworICAgIHNpemUgPSAxVSA8PCA5OworICAgIHByaW50ZigiICAgIHN0YXRpYyBjb25zdCBjb2RlIGxlbmZpeFsldV0gPSB7Iiwgc2l6ZSk7CisgICAgbG93ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICgobG93ICUgNykgPT0gMCkgcHJpbnRmKCJcbiAgICAgICAgIik7CisgICAgICAgIHByaW50ZigieyV1LCV1LCVkfSIsIHN0YXRlLmxlbmNvZGVbbG93XS5vcCwgc3RhdGUubGVuY29kZVtsb3ddLmJpdHMsCisgICAgICAgICAgICAgICBzdGF0ZS5sZW5jb2RlW2xvd10udmFsKTsKKyAgICAgICAgaWYgKCsrbG93ID09IHNpemUpIGJyZWFrOworICAgICAgICBwdXRjaGFyKCcsJyk7CisgICAgfQorICAgIHB1dHMoIlxuICAgIH07Iik7CisgICAgc2l6ZSA9IDFVIDw8IDU7CisgICAgcHJpbnRmKCJcbiAgICBzdGF0aWMgY29uc3QgY29kZSBkaXN0Zml4WyV1XSA9IHsiLCBzaXplKTsKKyAgICBsb3cgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKChsb3cgJSA2KSA9PSAwKSBwcmludGYoIlxuICAgICAgICAiKTsKKyAgICAgICAgcHJpbnRmKCJ7JXUsJXUsJWR9Iiwgc3RhdGUuZGlzdGNvZGVbbG93XS5vcCwgc3RhdGUuZGlzdGNvZGVbbG93XS5iaXRzLAorICAgICAgICAgICAgICAgc3RhdGUuZGlzdGNvZGVbbG93XS52YWwpOworICAgICAgICBpZiAoKytsb3cgPT0gc2l6ZSkgYnJlYWs7CisgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICB9CisgICAgcHV0cygiXG4gICAgfTsiKTsKK30KKyNlbmRpZiAvKiBNQUtFRklYRUQgKi8KKworLyoKKyAgIFVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3Qgd3NpemUgKG5vcm1hbGx5IDMySykgYnl0ZXMgd3JpdHRlbiBiZWZvcmUKKyAgIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWQKKyAgIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXMKKyAgIGluZmxhdGUgY2FsbCwgYnV0IHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgc3RyZWFtIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC4KKyAgIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5CisgICBpcyBsb2FkZWQuCisKKyAgIFByb3ZpZGluZyBvdXRwdXQgYnVmZmVycyBsYXJnZXIgdGhhbiAzMksgdG8gaW5mbGF0ZSgpIHNob3VsZCBwcm92aWRlIGEgc3BlZWQKKyAgIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3cKKyAgIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mCisgICBvdXRwdXQgd2lsbCBmYWxsIGluIHRoZSBvdXRwdXQgZGF0YSwgbWFraW5nIG1hdGNoIGNvcGllcyBzaW1wbGVyIGFuZCBmYXN0ZXIuCisgICBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLgorICovCitsb2NhbCBpbnQgdXBkYXRld2luZG93KHN0cm0sIG91dCkKK3pfc3RyZWFtcCBzdHJtOwordW5zaWduZWQgb3V0OworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgY29weSwgZGlzdDsKKworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworCisgICAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqLworICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgeworICAgICAgICBzdGF0ZS0+d2luZG93ID0gKHVuc2lnbmVkIGNoYXIgRkFSICopCisgICAgICAgICAgICAgICAgICAgICAgICBaQUxMT0Moc3RybSwgMVUgPDwgc3RhdGUtPndiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7CisgICAgICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogaWYgd2luZG93IG5vdCBpbiB1c2UgeWV0LCBpbml0aWFsaXplICovCisgICAgaWYgKHN0YXRlLT53c2l6ZSA9PSAwKSB7CisgICAgICAgIHN0YXRlLT53c2l6ZSA9IDFVIDw8IHN0YXRlLT53Yml0czsKKyAgICAgICAgc3RhdGUtPndyaXRlID0gMDsKKyAgICB9CisKKyAgICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi8KKyAgICBjb3B5ID0gb3V0IC0gc3RybS0+YXZhaWxfb3V0OworICAgIGlmIChjb3B5ID49IHN0YXRlLT53c2l6ZSkgeworICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIHN0cm0tPm5leHRfb3V0IC0gc3RhdGUtPndzaXplLCBzdGF0ZS0+d3NpemUpOworICAgICAgICBzdGF0ZS0+d3JpdGUgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGlzdCA9IHN0YXRlLT53c2l6ZSAtIHN0YXRlLT53cml0ZTsKKyAgICAgICAgaWYgKGRpc3QgPiBjb3B5KSBkaXN0ID0gY29weTsKKyAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPndyaXRlLCBzdHJtLT5uZXh0X291dCAtIGNvcHksIGRpc3QpOworICAgICAgICBjb3B5IC09IGRpc3Q7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIHN0cm0tPm5leHRfb3V0IC0gY29weSwgY29weSk7CisgICAgICAgICAgICBzdGF0ZS0+d3JpdGUgPSBjb3B5OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RhdGUtPndyaXRlICs9IGRpc3Q7CisgICAgICAgICAgICBpZiAoc3RhdGUtPndyaXRlID09IHN0YXRlLT53c2l6ZSkgc3RhdGUtPndyaXRlID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogTWFjcm9zIGZvciBpbmZsYXRlKCk6ICovCisKKy8qIGNoZWNrIGZ1bmN0aW9uIHRvIHVzZSBhZGxlcjMyKCkgZm9yIHpsaWIgb3IgY3JjMzIoKSBmb3IgZ3ppcCAqLworI2lmZGVmIEdVTlpJUAorIyAgZGVmaW5lIFVQREFURShjaGVjaywgYnVmLCBsZW4pIFwKKyAgICAoc3RhdGUtPmZsYWdzID8gY3JjMzIoY2hlY2ssIGJ1ZiwgbGVuKSA6IGFkbGVyMzIoY2hlY2ssIGJ1ZiwgbGVuKSkKKyNlbHNlCisjICBkZWZpbmUgVVBEQVRFKGNoZWNrLCBidWYsIGxlbikgYWRsZXIzMihjaGVjaywgYnVmLCBsZW4pCisjZW5kaWYKKworLyogY2hlY2sgbWFjcm9zIGZvciBoZWFkZXIgY3JjICovCisjaWZkZWYgR1VOWklQCisjICBkZWZpbmUgQ1JDMihjaGVjaywgd29yZCkgXAorICAgIGRvIHsgXAorICAgICAgICBoYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpKHdvcmQpOyBcCisgICAgICAgIGhidWZbMV0gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDgpOyBcCisgICAgICAgIGNoZWNrID0gY3JjMzIoY2hlY2ssIGhidWYsIDIpOyBcCisgICAgfSB3aGlsZSAoMCkKKworIyAgZGVmaW5lIENSQzQoY2hlY2ssIHdvcmQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSh3b3JkKTsgXAorICAgICAgICBoYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiA4KTsgXAorICAgICAgICBoYnVmWzJdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiAxNik7IFwKKyAgICAgICAgaGJ1ZlszXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gMjQpOyBcCisgICAgICAgIGNoZWNrID0gY3JjMzIoY2hlY2ssIGhidWYsIDQpOyBcCisgICAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBMb2FkIHJlZ2lzdGVycyB3aXRoIHN0YXRlIGluIGluZmxhdGUoKSBmb3Igc3BlZWQgKi8KKyNkZWZpbmUgTE9BRCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcHV0ID0gc3RybS0+bmV4dF9vdXQ7IFwKKyAgICAgICAgbGVmdCA9IHN0cm0tPmF2YWlsX291dDsgXAorICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsgXAorICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfaW47IFwKKyAgICAgICAgaG9sZCA9IHN0YXRlLT5ob2xkOyBcCisgICAgICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJlc3RvcmUgc3RhdGUgZnJvbSByZWdpc3RlcnMgaW4gaW5mbGF0ZSgpICovCisjZGVmaW5lIFJFU1RPUkUoKSBcCisgICAgZG8geyBcCisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gcHV0OyBcCisgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IGxlZnQ7IFwKKyAgICAgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7IFwKKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOyBcCisgICAgICAgIHN0YXRlLT5ob2xkID0gaG9sZDsgXAorICAgICAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBDbGVhciB0aGUgaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCisjZGVmaW5lIElOSVRCSVRTKCkgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID0gMDsgXAorICAgICAgICBiaXRzID0gMDsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlKCkKKyAgIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgUFVMTEJZVEUoKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChoYXZlID09IDApIGdvdG8gbGVhdmU7IFwKKyAgICAgICAgaGF2ZS0tOyBcCisgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKCpuZXh0KyspIDw8IGJpdHM7IFwKKyAgICAgICAgYml0cyArPSA4OyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQXNzdXJlIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IG4gYml0cyBpbiB0aGUgYml0IGFjY3VtdWxhdG9yLiAgSWYgdGhlcmUgaXMKKyAgIG5vdCBlbm91Z2ggYXZhaWxhYmxlIGlucHV0IHRvIGRvIHRoYXQsIHRoZW4gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLiAqLworI2RlZmluZSBORUVEQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAorICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDwgMTYpICovCisjZGVmaW5lIEJJVFMobikgXAorICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQorCisvKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBEUk9QQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IChuKTsgXAorICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgQllURUJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCisgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZXZlcnNlIHRoZSBieXRlcyBpbiBhIDMyLWJpdCB2YWx1ZSAqLworI2RlZmluZSBSRVZFUlNFKHEpIFwKKyAgICAoKCgocSkgPj4gMjQpICYgMHhmZikgKyAoKChxKSA+PiA4KSAmIDB4ZmYwMCkgKyBcCisgICAgICgoKHEpICYgMHhmZjAwKSA8PCA4KSArICgoKHEpICYgMHhmZikgPDwgMjQpKQorCisvKgorICAgaW5mbGF0ZSgpIHVzZXMgYSBzdGF0ZSBtYWNoaW5lIHRvIHByb2Nlc3MgYXMgbXVjaCBpbnB1dCBkYXRhIGFuZCBnZW5lcmF0ZSBhcworICAgbXVjaCBvdXRwdXQgZGF0YSBhcyBwb3NzaWJsZSBiZWZvcmUgcmV0dXJuaW5nLiAgVGhlIHN0YXRlIG1hY2hpbmUgaXMKKyAgIHN0cnVjdHVyZWQgcm91Z2hseSBhcyBmb2xsb3dzOgorCisgICAgZm9yICg7Oykgc3dpdGNoIChzdGF0ZSkgeworICAgIC4uLgorICAgIGNhc2UgU1RBVEVuOgorICAgICAgICBpZiAobm90IGVub3VnaCBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSB0byBtYWtlIHByb2dyZXNzKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAuLi4gbWFrZSBwcm9ncmVzcyAuLi4KKyAgICAgICAgc3RhdGUgPSBTVEFURW07CisgICAgICAgIGJyZWFrOworICAgIC4uLgorICAgIH0KKworICAgc28gd2hlbiBpbmZsYXRlKCkgaXMgY2FsbGVkIGFnYWluLCB0aGUgc2FtZSBjYXNlIGlzIGF0dGVtcHRlZCBhZ2FpbiwgYW5kCisgICBpZiB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2VzIGFyZSBwcm92aWRlZCwgdGhlIG1hY2hpbmUgcHJvY2VlZHMgdG8gdGhlCisgICBuZXh0IHN0YXRlLiAgVGhlIE5FRURCSVRTKCkgbWFjcm8gaXMgdXN1YWxseSB0aGUgd2F5IHRoZSBzdGF0ZSBldmFsdWF0ZXMKKyAgIHdoZXRoZXIgaXQgY2FuIHByb2NlZWQgb3Igc2hvdWxkIHJldHVybi4gIE5FRURCSVRTKCkgZG9lcyB0aGUgcmV0dXJuIGlmCisgICB0aGUgcmVxdWVzdGVkIGJpdHMgYXJlIG5vdCBhdmFpbGFibGUuICBUaGUgdHlwaWNhbCB1c2Ugb2YgdGhlIEJJVFMgbWFjcm9zCisgICBpczoKKworICAgICAgICBORUVEQklUUyhuKTsKKyAgICAgICAgLi4uIGRvIHNvbWV0aGluZyB3aXRoIEJJVFMobikgLi4uCisgICAgICAgIERST1BCSVRTKG4pOworCisgICB3aGVyZSBORUVEQklUUyhuKSBlaXRoZXIgcmV0dXJucyBmcm9tIGluZmxhdGUoKSBpZiB0aGVyZSBpc24ndCBlbm91Z2gKKyAgIGlucHV0IGxlZnQgdG8gbG9hZCBuIGJpdHMgaW50byB0aGUgYWNjdW11bGF0b3IsIG9yIGl0IGNvbnRpbnVlcy4gIEJJVFMobikKKyAgIGdpdmVzIHRoZSBsb3cgbiBiaXRzIGluIHRoZSBhY2N1bXVsYXRvci4gIFdoZW4gZG9uZSwgRFJPUEJJVFMobikgZHJvcHMKKyAgIHRoZSBsb3cgbiBiaXRzIG9mZiB0aGUgYWNjdW11bGF0b3IuICBJTklUQklUUygpIGNsZWFycyB0aGUgYWNjdW11bGF0b3IKKyAgIGFuZCBzZXRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdHMgdG8gemVyby4gIEJZVEVCSVRTKCkgZGlzY2FyZHMganVzdAorICAgZW5vdWdoIGJpdHMgdG8gcHV0IHRoZSBhY2N1bXVsYXRvciBvbiBhIGJ5dGUgYm91bmRhcnkuICBBZnRlciBCWVRFQklUUygpCisgICBhbmQgYSBORUVEQklUUyg4KSwgdGhlbiBCSVRTKDgpIHdvdWxkIHJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0uCisKKyAgIE5FRURCSVRTKG4pIHVzZXMgUFVMTEJZVEUoKSB0byBnZXQgYW4gYXZhaWxhYmxlIGJ5dGUgb2YgaW5wdXQsIG9yIHRvIHJldHVybgorICAgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAgVGhlIGRlY29kaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBjb2RlcyB1c2VzCisgICBQVUxMQllURSgpIGRpcmVjdGx5IGluIG9yZGVyIHRvIHB1bGwganVzdCBlbm91Z2ggYnl0ZXMgdG8gZGVjb2RlIHRoZSBuZXh0CisgICBjb2RlLCBhbmQgbm8gbW9yZS4KKworICAgU29tZSBzdGF0ZXMgbG9vcCB1bnRpbCB0aGV5IGdldCBlbm91Z2ggaW5wdXQsIG1ha2luZyBzdXJlIHRoYXQgZW5vdWdoCisgICBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIHRvIGNvbnRpbnVlIHRoZSBsb29wIHdoZXJlIGl0IGxlZnQgb2ZmCisgICBpZiBORUVEQklUUygpIHJldHVybnMgaW4gdGhlIGxvb3AuICBGb3IgZXhhbXBsZSwgd2FudCwgbmVlZCwgYW5kIGtlZXAKKyAgIHdvdWxkIGFsbCBoYXZlIHRvIGFjdHVhbGx5IGJlIHBhcnQgb2YgdGhlIHNhdmVkIHN0YXRlIGluIGNhc2UgTkVFREJJVFMoKQorICAgcmV0dXJuczoKKworICAgIGNhc2UgU1RBVEV3OgorICAgICAgICB3aGlsZSAod2FudCA8IG5lZWQpIHsKKyAgICAgICAgICAgIE5FRURCSVRTKG4pOworICAgICAgICAgICAga2VlcFt3YW50KytdID0gQklUUyhuKTsKKyAgICAgICAgICAgIERST1BCSVRTKG4pOworICAgICAgICB9CisgICAgICAgIHN0YXRlID0gU1RBVEV4OworICAgIGNhc2UgU1RBVEV4OgorCisgICBBcyBzaG93biBhYm92ZSwgaWYgdGhlIG5leHQgc3RhdGUgaXMgYWxzbyB0aGUgbmV4dCBjYXNlLCB0aGVuIHRoZSBicmVhaworICAgaXMgb21pdHRlZC4KKworICAgQSBzdGF0ZSBtYXkgYWxzbyByZXR1cm4gaWYgdGhlcmUgaXMgbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgYXZhaWxhYmxlIHRvCisgICBjb21wbGV0ZSB0aGF0IHN0YXRlLiAgVGhvc2Ugc3RhdGVzIGFyZSBjb3B5aW5nIHN0b3JlZCBkYXRhLCB3cml0aW5nIGEKKyAgIGxpdGVyYWwgYnl0ZSwgYW5kIGNvcHlpbmcgYSBtYXRjaGluZyBzdHJpbmcuCisKKyAgIFdoZW4gcmV0dXJuaW5nLCBhICJnb3RvIGxlYXZlIiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgdG90YWwgY291bnRlcnMsIHVwZGF0ZQorICAgdGhlIGNoZWNrIHZhbHVlLCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgYW55IHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgZHVyaW5nCisgICB0aGF0IGluZmxhdGUoKSBjYWxsIGluIG9yZGVyIHRvIHJldHVybiB0aGUgcHJvcGVyIHJldHVybiBjb2RlLiAgUHJvZ3Jlc3MgaXMKKyAgIGRlZmluZWQgYXMgYSBjaGFuZ2UgaW4gZWl0aGVyIHN0cm0tPmF2YWlsX2luIG9yIHN0cm0tPmF2YWlsX291dC4gIFdoZW4gdGhlcmUKKyAgIGlzIGEgd2luZG93LCBnb3RvIGxlYXZlIHdpbGwgdXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCBvdXRwdXQgd3JpdHRlbi4KKyAgIElmIGEgZ290byBsZWF2ZSBvY2N1cnMgaW4gdGhlIG1pZGRsZSBvZiBkZWNvbXByZXNzaW9uIGFuZCB0aGVyZSBpcyBubyB3aW5kb3cKKyAgIGN1cnJlbnRseSwgZ290byBsZWF2ZSB3aWxsIGNyZWF0ZSBvbmUgYW5kIGNvcHkgb3V0cHV0IHRvIHRoZSB3aW5kb3cgZm9yIHRoZQorICAgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KKworICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgb25seSBhZmZlY3RzIHRoZQorICAgcmV0dXJuIGNvZGUgKHBlciB6bGliLmgpLiAgaW5mbGF0ZSgpIGFsd2F5cyB3cml0ZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSB0bworICAgc3RybS0+bmV4dF9vdXQsIGdpdmVuIHRoZSBzcGFjZSBhdmFpbGFibGUgYW5kIHRoZSBwcm92aWRlZCBpbnB1dC0tdGhlIGVmZmVjdAorICAgZG9jdW1lbnRlZCBpbiB6bGliLmggb2YgWl9TWU5DX0ZMVVNILiAgRnVydGhlcm1vcmUsIGluZmxhdGUoKSBhbHdheXMgZGVmZXJzCisgICB0aGUgYWxsb2NhdGlvbiBvZiBhbmQgY29weWluZyBpbnRvIGEgc2xpZGluZyB3aW5kb3cgdW50aWwgbmVjZXNzYXJ5LCB3aGljaAorICAgcHJvdmlkZXMgdGhlIGVmZmVjdCBkb2N1bWVudGVkIGluIHpsaWIuaCBmb3IgWl9GSU5JU0ggd2hlbiB0aGUgZW50aXJlIGlucHV0CisgICBzdHJlYW0gYXZhaWxhYmxlLiAgU28gdGhlIG9ubHkgdGhpbmcgdGhlIGZsdXNoIHBhcmFtZXRlciBhY3R1YWxseSBkb2VzIGlzOgorICAgd2hlbiBmbHVzaCBpcyBzZXQgdG8gWl9GSU5JU0gsIGluZmxhdGUoKSBjYW5ub3QgcmV0dXJuIFpfT0suICBJbnN0ZWFkIGl0CisgICB3aWxsIHJldHVybiBaX0JVRl9FUlJPUiBpZiBpdCBoYXMgbm90IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICovCisKK2ludCBaRVhQT1JUIGluZmxhdGUoc3RybSwgZmx1c2gpCit6X3N0cmVhbXAgc3RybTsKK2ludCBmbHVzaDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgKm5leHQsICpwdXQ7ICAvKiBuZXh0IGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBoYXZlLCBsZWZ0OyAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBpbiwgb3V0OyAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpmcm9tOyAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCisgICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KKyAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKyNpZmRlZiBHVU5aSVAKKyAgICB1bnNpZ25lZCBjaGFyIGhidWZbNF07ICAgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi8KKyNlbmRpZgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT5uZXh0X291dCA9PSBaX05VTEwgfHwKKyAgICAgICAgKHN0cm0tPm5leHRfaW4gPT0gWl9OVUxMICYmIHN0cm0tPmF2YWlsX2luICE9IDApKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBMT0FEKCk7CisgICAgaW4gPSBoYXZlOworICAgIG91dCA9IGxlZnQ7CisgICAgcmV0ID0gWl9PSzsKKyAgICBmb3IgKDs7KQorICAgICAgICBzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CisgICAgICAgIGNhc2UgSEVBRDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTkVFREJJVFMoMTYpOworI2lmZGVmIEdVTlpJUAorICAgICAgICAgICAgaWYgKGhvbGQgPT0gMHg4YjFmKSB7ICAgICAgIC8qIGd6aXAgaGVhZGVyICovCisgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBGTEFHUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5mbGFncyA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGV4cGVjdCB6bGliIGhlYWRlciAqLworI2VuZGlmCisgICAgICAgICAgICBpZiAoKChCSVRTKDgpIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChCSVRTKDQpICE9IFpfREVGTEFURUQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyAgICAgICAgICAgIGlmIChCSVRTKDQpICsgOCA+IHN0YXRlLT53Yml0cykgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgd2luZG93IHNpemUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXG4iKSk7CisgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgR1VOWklQCisgICAgICAgIGNhc2UgRkxBR1M6CisgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICBzdGF0ZS0+ZmxhZ3MgPSAoaW50KShob2xkKTsKKyAgICAgICAgICAgIGlmICgoc3RhdGUtPmZsYWdzICYgMHhmZikgIT0gWl9ERUZMQVRFRCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweGUwMDApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVElNRTsKKyAgICAgICAgY2FzZSBUSU1FOgorICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDNChzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gT1M7CisgICAgICAgIGNhc2UgT1M6CisgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBFWExFTjsKKyAgICAgICAgY2FzZSBFWExFTjoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA0MDApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCkoaG9sZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEVYVFJBOworICAgICAgICBjYXNlIEVYVFJBOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDQwMCkgeworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoKSBnb3RvIGxlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBOQU1FOworICAgICAgICBjYXNlIE5BTUU6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwODAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBsZWF2ZTsKKyAgICAgICAgICAgICAgICBjb3B5ID0gMDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkobmV4dFtjb3B5KytdKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDAwKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Y2hlY2sgPSBjcmMzMihzdGF0ZS0+Y2hlY2ssIG5leHQsIGNvcHkpOworICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgaWYgKGxlbikgZ290byBsZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ09NTUVOVDsKKyAgICAgICAgY2FzZSBDT01NRU5UOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MTAwMCkgeworICAgICAgICAgICAgICAgIGlmIChoYXZlID09IDApIGdvdG8gbGVhdmU7CisgICAgICAgICAgICAgICAgY29weSA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKG5leHRbY29weSsrXSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwMCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGlmIChsZW4pIGdvdG8gbGVhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEhDUkM7CisgICAgICAgIGNhc2UgSENSQzoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICAgICAgaWYgKGhvbGQgIT0gKHN0YXRlLT5jaGVjayAmIDB4ZmZmZikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaGVhZGVyIGNyYyBtaXNtYXRjaCI7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIERJQ1RJRDoKKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gUkVWRVJTRShob2xkKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJQ1Q7CisgICAgICAgIGNhc2UgRElDVDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZWRpY3QgPT0gMCkgeworICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGFzdCkgeworICAgICAgICAgICAgICAgIEJZVEVCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDSEVDSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgc3RhdGUtPmxhc3QgPSBCSVRTKDEpOworICAgICAgICAgICAgRFJPUEJJVFMoMSk7CisgICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gU1RPUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsgICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRBQkxFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYmxvY2sgdHlwZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUygyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUT1JFRDoKKyAgICAgICAgICAgIEJZVEVCSVRTKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi8KKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT0gKChob2xkID4+IDE2KSBeIDB4ZmZmZikpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpaG9sZCAmIDB4ZmZmZjsKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCkpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ09QWTsKKyAgICAgICAgY2FzZSBDT1BZOgorICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA9PSAwKSBnb3RvIGxlYXZlOworICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRBQkxFOgorICAgICAgICAgICAgTkVFREJJVFMoMTQpOworICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OworICAgICAgICAgICAgRFJPUEJJVFMoNSk7CisgICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5MRU5TOworICAgICAgICBjYXNlIExFTkxFTlM6CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmNvZGUpIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAodW5zaWduZWQgc2hvcnQpQklUUygzKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IDE5KQorICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gNzsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLT5sZW5zLCAxOSwgJihzdGF0ZS0+bmV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPREVMRU5TOworICAgICAgICBjYXNlIENPREVMRU5TOgorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbCA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gdGhpcy52YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWwgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YWwgPT0gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzICovCisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Yml0cyA9IDY7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLCBzdGF0ZS0+bmRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYoc3RhdGUtPmRpc3RiaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG9rXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgY2FzZSBMRU46CisgICAgICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBvdXQpOworICAgICAgICAgICAgICAgIExPQUQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYmICh0aGlzLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgdGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKXRoaXMudmFsOworICAgICAgICAgICAgaWYgKChpbnQpKHRoaXMub3ApID09IDApIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIHRoaXMudmFsID49IDB4MjAgJiYgdGhpcy52YWwgPCAweDdmID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgdGhpcy52YWwpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExJVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYgMzIpIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5FWFQ7CisgICAgICAgIGNhc2UgTEVORVhUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBzdGF0ZS0+bGVuZ3RoKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJU1Q7CisgICAgICAgIGNhc2UgRElTVDoKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmRpc3Rjb2RlW0JJVFMoc3RhdGUtPmRpc3RiaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh0aGlzLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgaWYgKHRoaXMub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKXRoaXMudmFsOworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESVNURVhUOworICAgICAgICBjYXNlIERJU1RFWFQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiAoc3RhdGUtPndzaXplID8gc3RhdGUtPndzaXplIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCAtIGxlZnQpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgc3RhdGUtPm9mZnNldCkpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNQVRDSDsKKyAgICAgICAgY2FzZSBNQVRDSDoKKyAgICAgICAgICAgIGlmIChsZWZ0ID09IDApIGdvdG8gbGVhdmU7CisgICAgICAgICAgICBjb3B5ID0gb3V0IC0gbGVmdDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPm9mZnNldCAtIGNvcHk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+d3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d3JpdGU7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53c2l6ZSAtIGNvcHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53cml0ZSAtIGNvcHkpOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7CisgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGggPT0gMCkgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSVQ6CisgICAgICAgICAgICBpZiAobGVmdCA9PSAwKSBnb3RvIGxlYXZlOworICAgICAgICAgICAgKnB1dCsrID0gKHVuc2lnbmVkIGNoYXIpKHN0YXRlLT5sZW5ndGgpOworICAgICAgICAgICAgbGVmdC0tOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSEVDSzoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgICAgICBvdXQgLT0gbGVmdDsKKyAgICAgICAgICAgICAgICBzdHJtLT50b3RhbF9vdXQgKz0gb3V0OworICAgICAgICAgICAgICAgIHN0YXRlLT50b3RhbCArPSBvdXQ7CisgICAgICAgICAgICAgICAgaWYgKG91dCkKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFKHN0YXRlLT5jaGVjaywgcHV0IC0gb3V0LCBvdXQpOworICAgICAgICAgICAgICAgIG91dCA9IGxlZnQ7CisgICAgICAgICAgICAgICAgaWYgKCgKKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5mbGFncyA/IGhvbGQgOgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICBSRVZFUlNFKGhvbGQpKSAhPSBzdGF0ZS0+Y2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGRhdGEgY2hlY2siOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxuIikpOworICAgICAgICAgICAgfQorI2lmZGVmIEdVTlpJUAorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5HVEg7CisgICAgICAgIGNhc2UgTEVOR1RIOgorICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwICYmIHN0YXRlLT5mbGFncykgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgICAgICBpZiAoaG9sZCAhPSAoc3RhdGUtPnRvdGFsICYgMHhmZmZmZmZmZikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGxlbmd0aCBjaGVjayI7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxuIikpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERPTkU7CisgICAgICAgIGNhc2UgRE9ORToKKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgIGNhc2UgQkFEOgorICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgY2FzZSBNRU06CisgICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgICAgIGNhc2UgU1lOQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgLyoKKyAgICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS4KKyAgICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyCisgICAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuCisgICAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLgorICAgICAqLworICBsZWF2ZToKKyAgICBSRVNUT1JFKCk7CisgICAgaWYgKHN0YXRlLT53c2l6ZSB8fCAoc3RhdGUtPm1vZGUgPCBDSEVDSyAmJiBvdXQgIT0gc3RybS0+YXZhaWxfb3V0KSkKKyAgICAgICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBvdXQpKSB7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE1FTTsKKyAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICAgICAgfQorICAgIGluIC09IHN0cm0tPmF2YWlsX2luOworICAgIG91dCAtPSBzdHJtLT5hdmFpbF9vdXQ7CisgICAgc3RybS0+dG90YWxfaW4gKz0gaW47CisgICAgc3RybS0+dG90YWxfb3V0ICs9IG91dDsKKyAgICBzdGF0ZS0+dG90YWwgKz0gb3V0OworICAgIGlmIChzdGF0ZS0+d3JhcCAmJiBvdXQpCisgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KKyAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHN0cm0tPm5leHRfb3V0IC0gb3V0LCBvdXQpOworICAgIGlmICgoKGluID09IDAgJiYgb3V0ID09IDApIHx8IGZsdXNoID09IFpfRklOSVNIKSAmJiByZXQgPT0gWl9PSykKKyAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUVuZChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IFpfTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGlmIChzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgWkZSRUUoc3RybSwgc3RhdGUtPndpbmRvdyk7CisgICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOworICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpCit6X3N0cmVhbXAgc3RybTsKK2NvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5OwordUludCBkaWN0TGVuZ3RoOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgbG9uZyBpZDsKKworICAgIC8qIGNoZWNrIHN0YXRlICovCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBESUNUKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiBjaGVjayBmb3IgY29ycmVjdCBkaWN0aW9uYXJ5IGlkICovCisgICAgaWQgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworICAgIGlkID0gYWRsZXIzMihpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7CisgICAgaWYgKGlkICE9IHN0YXRlLT5jaGVjaykgcmV0dXJuIFpfREFUQV9FUlJPUjsKKworICAgIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgKi8KKyAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0tPmF2YWlsX291dCkpIHsKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBNRU07CisgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB9CisgICAgaWYgKGRpY3RMZW5ndGggPiBzdGF0ZS0+d3NpemUpCisgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgZGljdGlvbmFyeSArIGRpY3RMZW5ndGggLSBzdGF0ZS0+d3NpemUsCisgICAgICAgICAgICAgICAgc3RhdGUtPndzaXplKTsKKyAgICBlbHNlCisgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53c2l6ZSAtIGRpY3RMZW5ndGgsIGRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgZGljdExlbmd0aCk7CisgICAgc3RhdGUtPmhhdmVkaWN0ID0gMTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgZGljdGlvbmFyeSBzZXRcbiIpKTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAgIFNlYXJjaCBidWZbMC4ubGVuLTFdIGZvciB0aGUgcGF0dGVybjogMCwgMCwgMHhmZiwgMHhmZi4gIFJldHVybiB3aGVuIGZvdW5kCisgICBvciB3aGVuIG91dCBvZiBpbnB1dC4gIFdoZW4gY2FsbGVkLCAqaGF2ZSBpcyB0aGUgbnVtYmVyIG9mIHBhdHRlcm4gYnl0ZXMKKyAgIGZvdW5kIGluIG9yZGVyIHNvIGZhciwgaW4gMC4uMy4gIE9uIHJldHVybiAqaGF2ZSBpcyB1cGRhdGVkIHRvIHRoZSBuZXcKKyAgIHN0YXRlLiAgSWYgb24gcmV0dXJuICpoYXZlIGVxdWFscyBmb3VyLCB0aGVuIHRoZSBwYXR0ZXJuIHdhcyBmb3VuZCBhbmQgdGhlCisgICByZXR1cm4gdmFsdWUgaXMgaG93IG1hbnkgYnl0ZXMgd2VyZSByZWFkIGluY2x1ZGluZyB0aGUgbGFzdCBieXRlIG9mIHRoZQorICAgcGF0dGVybi4gIElmICpoYXZlIGlzIGxlc3MgdGhhbiBmb3VyLCB0aGVuIHRoZSBwYXR0ZXJuIGhhcyBub3QgYmVlbiBmb3VuZAorICAgeWV0IGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGxlbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgc3luY3NlYXJjaCgpIGNhbiBiZQorICAgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBkYXRhIGFuZCB0aGUgKmhhdmUgc3RhdGUuICAqaGF2ZSBpcyBpbml0aWFsaXplZCB0bworICAgemVybyBmb3IgdGhlIGZpcnN0IGNhbGwuCisgKi8KK2xvY2FsIHVuc2lnbmVkIHN5bmNzZWFyY2goaGF2ZSwgYnVmLCBsZW4pCit1bnNpZ25lZCAqaGF2ZTsKK3Vuc2lnbmVkIGNoYXIgRkFSICpidWY7Cit1bnNpZ25lZCBsZW47Cit7CisgICAgdW5zaWduZWQgZ290OworICAgIHVuc2lnbmVkIG5leHQ7CisKKyAgICBnb3QgPSAqaGF2ZTsKKyAgICBuZXh0ID0gMDsKKyAgICB3aGlsZSAobmV4dCA8IGxlbiAmJiBnb3QgPCA0KSB7CisgICAgICAgIGlmICgoaW50KShidWZbbmV4dF0pID09IChnb3QgPCAyID8gMCA6IDB4ZmYpKQorICAgICAgICAgICAgZ290Kys7CisgICAgICAgIGVsc2UgaWYgKGJ1ZltuZXh0XSkKKyAgICAgICAgICAgIGdvdCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdCA9IDQgLSBnb3Q7CisgICAgICAgIG5leHQrKzsKKyAgICB9CisgICAgKmhhdmUgPSBnb3Q7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVTeW5jKHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGxvb2sgYXQgb3IgbG9va2VkIGF0ICovCisgICAgdW5zaWduZWQgbG9uZyBpbiwgb3V0OyAgICAgIC8qIHRlbXBvcmFyeSB0byBzYXZlIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsgICAgICAgLyogdG8gcmVzdG9yZSBiaXQgYnVmZmVyIHRvIGJ5dGUgc3RyaW5nICovCisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgc3RhdGUtPmJpdHMgPCA4KSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICAvKiBpZiBmaXJzdCB0aW1lLCBzdGFydCBzZWFyY2ggaW4gYml0IGJ1ZmZlciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBTWU5DKSB7CisgICAgICAgIHN0YXRlLT5tb2RlID0gU1lOQzsKKyAgICAgICAgc3RhdGUtPmhvbGQgPDw9IHN0YXRlLT5iaXRzICYgNzsKKyAgICAgICAgc3RhdGUtPmJpdHMgLT0gc3RhdGUtPmJpdHMgJiA3OworICAgICAgICBsZW4gPSAwOworICAgICAgICB3aGlsZSAoc3RhdGUtPmJpdHMgPj0gOCkgeworICAgICAgICAgICAgYnVmW2xlbisrXSA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+aG9sZCk7CisgICAgICAgICAgICBzdGF0ZS0+aG9sZCA+Pj0gODsKKyAgICAgICAgICAgIHN0YXRlLT5iaXRzIC09IDg7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICBzeW5jc2VhcmNoKCYoc3RhdGUtPmhhdmUpLCBidWYsIGxlbik7CisgICAgfQorCisgICAgLyogc2VhcmNoIGF2YWlsYWJsZSBpbnB1dCAqLworICAgIGxlbiA9IHN5bmNzZWFyY2goJihzdGF0ZS0+aGF2ZSksIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKKyAgICBzdHJtLT5hdmFpbF9pbiAtPSBsZW47CisgICAgc3RybS0+bmV4dF9pbiArPSBsZW47CisgICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOworCisgICAgLyogcmV0dXJuIG5vIGpveSBvciBzZXQgdXAgdG8gcmVzdGFydCBpbmZsYXRlKCkgb24gYSBuZXcgYmxvY2sgKi8KKyAgICBpZiAoc3RhdGUtPmhhdmUgIT0gNCkgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICBpbiA9IHN0cm0tPnRvdGFsX2luOyAgb3V0ID0gc3RybS0+dG90YWxfb3V0OworICAgIGluZmxhdGVSZXNldChzdHJtKTsKKyAgICBzdHJtLT50b3RhbF9pbiA9IGluOyAgc3RybS0+dG90YWxfb3V0ID0gb3V0OworICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAgIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkIGJ5CisgICBaX1NZTkNfRkxVU0ggb3IgWl9GVUxMX0ZMVVNILiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgb25lIFBQUAorICAgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHNhZmV0eSBjaGVjay4gUFBQIHVzZXMKKyAgIFpfU1lOQ19GTFVTSCBidXQgcmVtb3ZlcyB0aGUgbGVuZ3RoIGJ5dGVzIG9mIHRoZSByZXN1bHRpbmcgZW1wdHkgc3RvcmVkCisgICBibG9jay4gV2hlbiBkZWNvbXByZXNzaW5nLCBQUFAgY2hlY2tzIHRoYXQgYXQgdGhlIGVuZCBvZiBpbnB1dCBwYWNrZXQsCisgICBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIHRoZXNlIGxlbmd0aCBieXRlcy4KKyAqLworaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICByZXR1cm4gc3RhdGUtPm1vZGUgPT0gU1RPUkVEICYmIHN0YXRlLT5iaXRzID09IDA7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVDb3B5KGRlc3QsIHNvdXJjZSkKK3pfc3RyZWFtcCBkZXN0Oworel9zdHJlYW1wIHNvdXJjZTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqY29weTsKKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OworCisgICAgLyogY2hlY2sgaW5wdXQgKi8KKyAgICBpZiAoZGVzdCA9PSBaX05VTEwgfHwgc291cmNlID09IFpfTlVMTCB8fCBzb3VyY2UtPnN0YXRlID09IFpfTlVMTCB8fAorICAgICAgICBzb3VyY2UtPnphbGxvYyA9PSBaX05VTEwgfHwgc291cmNlLT56ZnJlZSA9PSBaX05VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzb3VyY2UtPnN0YXRlOworCisgICAgLyogYWxsb2NhdGUgc3BhY2UgKi8KKyAgICBjb3B5ID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKQorICAgICAgICAgICBaQUxMT0Moc291cmNlLCAxLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoY29weSA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB3aW5kb3cgPSBaX05VTEw7CisgICAgaWYgKHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMKSB7CisgICAgICAgIHdpbmRvdyA9ICh1bnNpZ25lZCBjaGFyIEZBUiAqKQorICAgICAgICAgICAgICAgICBaQUxMT0Moc291cmNlLCAxVSA8PCBzdGF0ZS0+d2JpdHMsIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7CisgICAgICAgIGlmICh3aW5kb3cgPT0gWl9OVUxMKSB7CisgICAgICAgICAgICBaRlJFRShzb3VyY2UsIGNvcHkpOworICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29weSBzdGF0ZSAqLworICAgICpkZXN0ID0gKnNvdXJjZTsKKyAgICAqY29weSA9ICpzdGF0ZTsKKyAgICBjb3B5LT5sZW5jb2RlID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPmxlbmNvZGUgLSBzdGF0ZS0+Y29kZXMpOworICAgIGNvcHktPmRpc3Rjb2RlID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPmRpc3Rjb2RlIC0gc3RhdGUtPmNvZGVzKTsKKyAgICBjb3B5LT5uZXh0ID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPm5leHQgLSBzdGF0ZS0+Y29kZXMpOworICAgIGlmICh3aW5kb3cgIT0gWl9OVUxMKQorICAgICAgICB6bWVtY3B5KHdpbmRvdywgc3RhdGUtPndpbmRvdywgMVUgPDwgc3RhdGUtPndiaXRzKTsKKyAgICBjb3B5LT53aW5kb3cgPSB3aW5kb3c7CisgICAgZGVzdC0+c3RhdGUgPSAodm9pZHBmKWNvcHk7CisgICAgcmV0dXJuIFpfT0s7CiB9CmRpZmYgLS1naXQgYS9pbmZsYXRlLmggYi9pbmZsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjYzgyYgotLS0gL2Rldi9udWxsCisrKyBiL2luZmxhdGUuaApAQCAtMCwwICsxLDExNSBAQAorLyogaW5mbGF0ZS5oIC0tIGludGVybmFsIGluZmxhdGUgc3RhdGUgZGVmaW5pdGlvbgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBkZWZpbmUgTk9fR1VOWklQIHdoZW4gY29tcGlsaW5nIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGRlY29kaW5nIGJ5IGluZmxhdGUoKS4gIE5PX0dVTlpJUCB3b3VsZCBiZSB1c2VkIHRvIGF2b2lkIGxpbmtpbmcgaW4KKyAgIHRoZSBjcmMgY29kZSB3aGVuIGl0IGlzIG5vdCBuZWVkZWQuICBGb3Igc2hhcmVkIGxpYnJhcmllcywgZ3ppcCBkZWNvZGluZworICAgc2hvdWxkIGJlIGxlZnQgZW5hYmxlZC4gKi8KKyNpZm5kZWYgTk9fR1VOWklQCisjICBkZWZpbmUgR1VOWklQCisjZW5kaWYKKworLyogUG9zc2libGUgaW5mbGF0ZSBtb2RlcyBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBIRUFELCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi8KKyNpZmRlZiBHVU5aSVAKKyAgICBGTEFHUywgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqLworICAgIFRJTUUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1vZGlmaWNhdGlvbiB0aW1lIChnemlwKSAqLworICAgIE9TLCAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqLworICAgIEVYTEVOLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi8KKyAgICBFWFRSQSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBieXRlcyAoZ3ppcCkgKi8KKyAgICBOQU1FLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqLworICAgIENPTU1FTlQsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqLworICAgIEhDUkMsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGhlYWRlciBjcmMgKGd6aXApICovCisjZW5kaWYKKyAgICBESUNUSUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovCisgICAgRElDVCwgICAgICAgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsICovCisgICAgICAgIFRZUEUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi8KKyAgICAgICAgU1RPUkVELCAgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi8KKyAgICAgICAgQ09QWSwgICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi8KKyAgICAgICAgVEFCTEUsICAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovCisgICAgICAgIExFTkxFTlMsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgICAgICBDT0RFTEVOUywgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgICAgIExFTiwgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgY29kZSAqLworICAgICAgICAgICAgTEVORVhULCAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIERJU1QsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIERJU1RFWFQsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIE1BVENILCAgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqLworICAgICAgICAgICAgTElULCAgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi8KKyAgICBDSEVDSywgICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi8KKyNpZmRlZiBHVU5aSVAKKyAgICBMRU5HVEgsICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqLworI2VuZGlmCisgICAgRE9ORSwgICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KKyAgICBCQUQsICAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgTUVNLCAgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KKyAgICBTWU5DICAgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi8KK30gaW5mbGF0ZV9tb2RlOworCisvKgorICAgIFN0YXRlIHRyYW5zaXRpb25zIGJldHdlZW4gYWJvdmUgbW9kZXMgLQorCisgICAgKG1vc3QgbW9kZXMgY2FuIGdvIHRvIHRoZSBCQUQgb3IgTUVNIG1vZGUgLS0gbm90IHNob3duIGZvciBjbGFyaXR5KQorCisgICAgUHJvY2VzcyBoZWFkZXI6CisgICAgICAgIEhFQUQgLT4gKGd6aXApIG9yICh6bGliKQorICAgICAgICAoZ3ppcCkgLT4gRkxBR1MgLT4gVElNRSAtPiBPUyAtPiBFWExFTiAtPiBFWFRSQSAtPiBOQU1FCisgICAgICAgIE5BTUUgLT4gQ09NTUVOVCAtPiBIQ1JDIC0+IFRZUEUKKyAgICAgICAgKHpsaWIpIC0+IERJQ1RJRCBvciBUWVBFCisgICAgICAgIERJQ1RJRCAtPiBESUNUIC0+IFRZUEUKKyAgICBSZWFkIGRlZmxhdGUgYmxvY2tzOgorICAgICAgICAgICAgVFlQRSAtPiBTVE9SRUQgb3IgVEFCTEUgb3IgTEVOIG9yIENIRUNLCisgICAgICAgICAgICBTVE9SRUQgLT4gQ09QWSAtPiBUWVBFCisgICAgICAgICAgICBUQUJMRSAtPiBMRU5MRU5TIC0+IENPREVMRU5TIC0+IExFTgorICAgIFJlYWQgZGVmbGF0ZSBjb2RlczoKKyAgICAgICAgICAgICAgICBMRU4gLT4gTEVORVhUIG9yIExJVCBvciBUWVBFCisgICAgICAgICAgICAgICAgTEVORVhUIC0+IERJU1QgLT4gRElTVEVYVCAtPiBNQVRDSCAtPiBMRU4KKyAgICAgICAgICAgICAgICBMSVQgLT4gTEVOCisgICAgUHJvY2VzcyB0cmFpbGVyOgorICAgICAgICBDSEVDSyAtPiBMRU5HVEggLT4gRE9ORQorICovCisKKy8qIHN0YXRlIG1haW50YWluZWQgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMuICBBcHByb3hpbWF0ZWx5IDdLIGJ5dGVzLiAqLworc3RydWN0IGluZmxhdGVfc3RhdGUgeworICAgIGluZmxhdGVfbW9kZSBtb2RlOyAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqLworICAgIGludCBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgbGFzdCBibG9jayAqLworICAgIGludCB3cmFwOyAgICAgICAgICAgICAgICAgICAvKiB0cnVlIHRvIHByb2Nlc3MgaGVhZGVyIGFuZCB0cmFpbGVyICovCisgICAgaW50IGhhdmVkaWN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqLworICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpICovCisgICAgdW5zaWduZWQgbG9uZyBjaGVjazsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovCisgICAgdW5zaWduZWQgbG9uZyB0b3RhbDsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIG91dHB1dCBjb3VudCAqLworICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdiaXRzOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqLworICAgIHVuc2lnbmVkIHdzaXplOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovCisgICAgICAgIC8qIGJpdCBhY2N1bXVsYXRvciAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gImluIiAqLworICAgICAgICAvKiBmb3Igc3RyaW5nIGFuZCBzdG9yZWQgYmxvY2sgY29weWluZyAqLworICAgIHVuc2lnbmVkIGxlbmd0aDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBvZmZzZXQ7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovCisgICAgICAgIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqLworICAgIHVuc2lnbmVkIGV4dHJhOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqLworICAgICAgICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqLworICAgIGNvZGUgY29uc3QgRkFSICpsZW5jb2RlOyAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqZGlzdGNvZGU7ICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovCisgICAgdW5zaWduZWQgbGVuYml0czsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi8KKyAgICB1bnNpZ25lZCBkaXN0Yml0czsgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgZGlzdGNvZGUgKi8KKyAgICAgICAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqLworICAgIHVuc2lnbmVkIG5jb2RlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgbmxlbjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgbmRpc3Q7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBoYXZlOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBpbiBsZW5zW10gKi8KKyAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqLworICAgIHVuc2lnbmVkIHNob3J0IGxlbnNbMzIwXTsgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgc2hvcnQgd29ya1syODhdOyAgIC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqLworICAgIGNvZGUgY29kZXNbRU5PVUdIXTsgICAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi8KK307CmRpZmYgLS1naXQgYS9pbmZ0cmVlcy5jIGIvaW5mdHJlZXMuYwppbmRleCA0YzMyY2EzLi4yNGNhMDg5IDEwMDY0NAotLS0gYS9pbmZ0cmVlcy5jCisrKyBiL2luZnRyZWVzLmMKQEAgLTEsNDU0ICsxLDMyMSBAQAogLyogaW5mdHJlZXMuYyAtLSBnZW5lcmF0ZSBIdWZmbWFuIHRyZWVzIGZvciBlZmZpY2llbnQgZGVjb2RpbmcKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIAogI2luY2x1ZGUgInp1dGlsLmgiCiAjaW5jbHVkZSAiaW5mdHJlZXMuaCIKIAotI2lmICFkZWZpbmVkKEJVSUxERklYRUQpICYmICFkZWZpbmVkKFNUREMpCi0jICBkZWZpbmUgQlVJTERGSVhFRCAgIC8qIG5vbiBBTlNJIGNvbXBpbGVycyBtYXkgbm90IGFjY2VwdCBpbmZmaXhlZC5oICovCi0jZW5kaWYKKyNkZWZpbmUgTUFYQklUUyAxNQogCiBjb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBpbmZsYXRlIDEuMS40IENvcHlyaWdodCAxOTk1LTIwMDIgTWFyayBBZGxlciAiOworICAgIiBpbmZsYXRlIDEuMi4wIENvcHlyaWdodCAxOTk1LTIwMDMgTWFyayBBZGxlciAiOwogLyoKICAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQogICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CiAgIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcwogICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KICAqLwotc3RydWN0IGludGVybmFsX3N0YXRlICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KLQotLyogc2ltcGxpZnkgdGhlIHVzZSBvZiB0aGUgaW5mbGF0ZV9odWZ0IHR5cGUgd2l0aCBzb21lIGRlZmluZXMgKi8KLSNkZWZpbmUgZXhvcCB3b3JkLndoYXQuRXhvcAotI2RlZmluZSBiaXRzIHdvcmQud2hhdC5CaXRzCi0KLQotbG9jYWwgaW50IGh1ZnRfYnVpbGQgT0YoKAotICAgIHVJbnRmICosICAgICAgICAgICAgLyogY29kZSBsZW5ndGhzIGluIGJpdHMgKi8KLSAgICB1SW50LCAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyAqLwotICAgIHVJbnQsICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mICJzaW1wbGUiIGNvZGVzICovCi0gICAgY29uc3QgdUludGYgKiwgICAgICAvKiBsaXN0IG9mIGJhc2UgdmFsdWVzIGZvciBub24tc2ltcGxlIGNvZGVzICovCi0gICAgY29uc3QgdUludGYgKiwgICAgICAvKiBsaXN0IG9mIGV4dHJhIGJpdHMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiBGQVIqLC8qIHJlc3VsdDogc3RhcnRpbmcgdGFibGUgKi8KLSAgICB1SW50ZiAqLCAgICAgICAgICAgIC8qIG1heGltdW0gbG9va3VwIGJpdHMgKHJldHVybnMgYWN0dWFsKSAqLwotICAgIGluZmxhdGVfaHVmdCAqLCAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCi0gICAgdUludCAqLCAgICAgICAgICAgICAvKiBodWZ0cyB1c2VkIGluIHNwYWNlICovCi0gICAgdUludGYgKiApKTsgICAgICAgICAvKiBzcGFjZSBmb3IgdmFsdWVzICovCi0KLS8qIFRhYmxlcyBmb3IgZGVmbGF0ZSBmcm9tIFBLWklQJ3MgYXBwbm90ZS50eHQuICovCi1sb2NhbCBjb25zdCB1SW50IGNwbGVuc1szMV0gPSB7IC8qIENvcHkgbGVuZ3RocyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLwotICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAotICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07Ci0gICAgICAgIC8qIHNlZSBub3RlICMxMyBhYm92ZSBhYm91dCAyNTggKi8KLWxvY2FsIGNvbnN0IHVJbnQgY3BsZXh0WzMxXSA9IHsgLyogRXh0cmEgYml0cyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLwotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLAotICAgICAgICAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwLCAxMTIsIDExMn07IC8qIDExMj09aW52YWxpZCAqLwotbG9jYWwgY29uc3QgdUludCBjcGRpc3RbMzBdID0geyAvKiBDb3B5IG9mZnNldHMgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCi0gICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKLSAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAotICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKLWxvY2FsIGNvbnN0IHVJbnQgY3BkZXh0WzMwXSA9IHsgLyogRXh0cmEgYml0cyBmb3IgZGlzdGFuY2UgY29kZXMgKi8KLSAgICAgICAgMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwKLSAgICAgICAgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsCi0gICAgICAgIDEyLCAxMiwgMTMsIDEzfTsKIAogLyoKLSAgIEh1ZmZtYW4gY29kZSBkZWNvZGluZyBpcyBwZXJmb3JtZWQgdXNpbmcgYSBtdWx0aS1sZXZlbCB0YWJsZSBsb29rdXAuCi0gICBUaGUgZmFzdGVzdCB3YXkgdG8gZGVjb2RlIGlzIHRvIHNpbXBseSBidWlsZCBhIGxvb2t1cCB0YWJsZSB3aG9zZQotICAgc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb25nZXN0IGNvZGUuICBIb3dldmVyLCB0aGUgdGltZSBpdCB0YWtlcwotICAgdG8gYnVpbGQgdGhpcyB0YWJsZSBjYW4gYWxzbyBiZSBhIGZhY3RvciBpZiB0aGUgZGF0YSBiZWluZyBkZWNvZGVkCi0gICBpcyBub3QgdmVyeSBsb25nLiAgVGhlIG1vc3QgY29tbW9uIGNvZGVzIGFyZSBuZWNlc3NhcmlseSB0aGUKLSAgIHNob3J0ZXN0IGNvZGVzLCBzbyB0aG9zZSBjb2RlcyBkb21pbmF0ZSB0aGUgZGVjb2RpbmcgdGltZSwgYW5kIGhlbmNlCi0gICB0aGUgc3BlZWQuICBUaGUgaWRlYSBpcyB5b3UgY2FuIGhhdmUgYSBzaG9ydGVyIHRhYmxlIHRoYXQgZGVjb2RlcyB0aGUKLSAgIHNob3J0ZXIsIG1vcmUgcHJvYmFibGUgY29kZXMsIGFuZCB0aGVuIHBvaW50IHRvIHN1YnNpZGlhcnkgdGFibGVzIGZvcgotICAgdGhlIGxvbmdlciBjb2Rlcy4gIFRoZSB0aW1lIGl0IGNvc3RzIHRvIGRlY29kZSB0aGUgbG9uZ2VyIGNvZGVzIGlzCi0gICB0aGVuIHRyYWRlZCBhZ2FpbnN0IHRoZSB0aW1lIGl0IHRha2VzIHRvIG1ha2UgbG9uZ2VyIHRhYmxlcy4KLQotICAgVGhpcyByZXN1bHRzIG9mIHRoaXMgdHJhZGUgYXJlIGluIHRoZSB2YXJpYWJsZXMgbGJpdHMgYW5kIGRiaXRzCi0gICBiZWxvdy4gIGxiaXRzIGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGUgZmlyc3QgbGV2ZWwgdGFibGUgZm9yIGxpdGVyYWwvCi0gICBsZW5ndGggY29kZXMgY2FuIGRlY29kZSBpbiBvbmUgc3RlcCwgYW5kIGRiaXRzIGlzIHRoZSBzYW1lIHRoaW5nIGZvcgotICAgdGhlIGRpc3RhbmNlIGNvZGVzLiAgU3Vic2VxdWVudCB0YWJsZXMgYXJlIGFsc28gbGVzcyB0aGFuIG9yIGVxdWFsIHRvCi0gICB0aG9zZSBzaXplcy4gIFRoZXNlIHZhbHVlcyBtYXkgYmUgYWRqdXN0ZWQgZWl0aGVyIHdoZW4gYWxsIG9mIHRoZQotICAgY29kZXMgYXJlIHNob3J0ZXIgdGhhbiB0aGF0LCBpbiB3aGljaCBjYXNlIHRoZSBsb25nZXN0IGNvZGUgbGVuZ3RoIGluCi0gICBiaXRzIGlzIHVzZWQsIG9yIHdoZW4gdGhlIHNob3J0ZXN0IGNvZGUgaXMgKmxvbmdlciogdGhhbiB0aGUgcmVxdWVzdGVkCi0gICB0YWJsZSBzaXplLCBpbiB3aGljaCBjYXNlIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXN0IGNvZGUgaW4gYml0cyBpcwotICAgdXNlZC4KLQotICAgVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGUgdHdvIHRhYmxlcywgc2luY2UgdGhleSBjb2RlIGEKLSAgIGRpZmZlcmVudCBudW1iZXIgb2YgcG9zc2liaWxpdGllcyBlYWNoLiAgVGhlIGxpdGVyYWwvbGVuZ3RoIHRhYmxlCi0gICBjb2RlcyAyODYgcG9zc2libGUgdmFsdWVzLCBvciBpbiBhIGZsYXQgY29kZSwgYSBsaXR0bGUgb3ZlciBlaWdodAotICAgYml0cy4gIFRoZSBkaXN0YW5jZSB0YWJsZSBjb2RlcyAzMCBwb3NzaWJsZSB2YWx1ZXMsIG9yIGEgbGl0dGxlIGxlc3MKLSAgIHRoYW4gZml2ZSBiaXRzLCBmbGF0LiAgVGhlIG9wdGltdW0gdmFsdWVzIGZvciBzcGVlZCBlbmQgdXAgYmVpbmcKLSAgIGFib3V0IG9uZSBiaXQgbW9yZSB0aGFuIHRob3NlLCBzbyBsYml0cyBpcyA4KzEgYW5kIGRiaXRzIGlzIDUrMS4KLSAgIFRoZSBvcHRpbXVtIHZhbHVlcyBtYXkgZGlmZmVyIHRob3VnaCBmcm9tIG1hY2hpbmUgdG8gbWFjaGluZSwgYW5kCi0gICBwb3NzaWJseSBldmVuIGJldHdlZW4gY29tcGlsZXJzLiAgWW91ciBtaWxlYWdlIG1heSB2YXJ5LgorICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KKyAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCisgICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAorICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKKyAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCisgICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQorICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKKyAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290CisgICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KICAqLwotCi0KLS8qIElmIEJNQVggbmVlZHMgdG8gYmUgbGFyZ2VyIHRoYW4gMTYsIHRoZW4gaCBhbmQgeFtdIHNob3VsZCBiZSB1TG9uZy4gKi8KLSNkZWZpbmUgQk1BWCAxNSAgICAgICAgIC8qIG1heGltdW0gYml0IGxlbmd0aCBvZiBhbnkgY29kZSAqLwotCi1sb2NhbCBpbnQgaHVmdF9idWlsZChiLCBuLCBzLCBkLCBlLCB0LCBtLCBocCwgaG4sIHYpCi11SW50ZiAqYjsgICAgICAgICAgICAgICAvKiBjb2RlIGxlbmd0aHMgaW4gYml0cyAoYWxsIGFzc3VtZWQgPD0gQk1BWCkgKi8KLXVJbnQgbjsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyAoYXNzdW1lZCA8PSAyODgpICovCi11SW50IHM7ICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc2ltcGxlLXZhbHVlZCBjb2RlcyAoMC4ucy0xKSAqLwotY29uc3QgdUludGYgKmQ7ICAgICAgICAgLyogbGlzdCBvZiBiYXNlIHZhbHVlcyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLwotY29uc3QgdUludGYgKmU7ICAgICAgICAgLyogbGlzdCBvZiBleHRyYSBiaXRzIGZvciBub24tc2ltcGxlIGNvZGVzICovCi1pbmZsYXRlX2h1ZnQgKiBGQVIgKnQ7ICAvKiByZXN1bHQ6IHN0YXJ0aW5nIHRhYmxlICovCi11SW50ZiAqbTsgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGxvb2t1cCBiaXRzLCByZXR1cm5zIGFjdHVhbCAqLwotaW5mbGF0ZV9odWZ0ICpocDsgICAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCi11SW50ICpobjsgICAgICAgICAgICAgICAvKiBodWZ0cyB1c2VkIGluIHNwYWNlICovCi11SW50ZiAqdjsgICAgICAgICAgICAgICAvKiB3b3JraW5nIGFyZWE6IHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RoICovCi0vKiBHaXZlbiBhIGxpc3Qgb2YgY29kZSBsZW5ndGhzIGFuZCBhIG1heGltdW0gdGFibGUgc2l6ZSwgbWFrZSBhIHNldCBvZgotICAgdGFibGVzIHRvIGRlY29kZSB0aGF0IHNldCBvZiBjb2Rlcy4gIFJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SCi0gICBpZiB0aGUgZ2l2ZW4gY29kZSBzZXQgaXMgaW5jb21wbGV0ZSAodGhlIHRhYmxlcyBhcmUgc3RpbGwgYnVpbHQgaW4gdGhpcwotICAgY2FzZSksIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZC4gKi8KK2ludCBpbmZsYXRlX3RhYmxlKHR5cGUsIGxlbnMsIGNvZGVzLCB0YWJsZSwgYml0cywgd29yaykKK2NvZGV0eXBlIHR5cGU7Cit1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnM7Cit1bnNpZ25lZCBjb2RlczsKK2NvZGUgKiBGQVIgKnRhYmxlOwordW5zaWduZWQgKmJpdHM7Cit1bnNpZ25lZCBzaG9ydCBGQVIgKndvcms7CiB7CisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovCisgICAgdW5zaWduZWQgc3ltOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqLworICAgIHVuc2lnbmVkIG1pbiwgbWF4OyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIHJvb3Q7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGN1cnI7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGRyb3A7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgdXNlZDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovCisgICAgdW5zaWduZWQgaHVmZjsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqLworICAgIHVuc2lnbmVkIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovCisgICAgdW5zaWduZWQgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovCisgICAgdW5zaWduZWQgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqLworICAgIGNvZGUgdGhpczsgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi8KKyAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqYmFzZTsgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqZXh0cmE7ICAgICAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqLworICAgIGludCBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqLworICAgIHVuc2lnbmVkIHNob3J0IGNvdW50W01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLworICAgIHVuc2lnbmVkIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxiYXNlWzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi8KKyAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwKKyAgICAgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsZXh0WzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovCisgICAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LAorICAgICAgICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzMsIDE5NH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRiYXNlWzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqLworICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCisgICAgICAgIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwKKyAgICAgICAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRleHRbMzJdID0geyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqLworICAgICAgICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMiwKKyAgICAgICAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsCisgICAgICAgIDI4LCAyOCwgMjksIDI5LCA2NCwgNjR9OwogCi0gIHVJbnQgYTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50ZXIgZm9yIGNvZGVzIG9mIGxlbmd0aCBrICovCi0gIHVJbnQgY1tCTUFYKzFdOyAgICAgICAgICAgICAgIC8qIGJpdCBsZW5ndGggY291bnQgdGFibGUgKi8KLSAgdUludCBmOyAgICAgICAgICAgICAgICAgICAgICAgLyogaSByZXBlYXRzIGluIHRhYmxlIGV2ZXJ5IGYgZW50cmllcyAqLwotICBpbnQgZzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCi0gIGludCBoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGxldmVsICovCi0gIHJlZ2lzdGVyIHVJbnQgaTsgICAgICAgICAgICAgIC8qIGNvdW50ZXIsIGN1cnJlbnQgY29kZSAqLwotICByZWdpc3RlciB1SW50IGo7ICAgICAgICAgICAgICAvKiBjb3VudGVyICovCi0gIHJlZ2lzdGVyIGludCBrOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGN1cnJlbnQgY29kZSAqLwotICBpbnQgbDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIHBlciB0YWJsZSAocmV0dXJuZWQgaW4gbSkgKi8KLSAgdUludCBtYXNrOyAgICAgICAgICAgICAgICAgICAgLyogKDEgPDwgdykgLSAxLCB0byBhdm9pZCBjYyAtTyBidWcgb24gSFAgKi8KLSAgcmVnaXN0ZXIgdUludGYgKnA7ICAgICAgICAgICAgLyogcG9pbnRlciBpbnRvIGNbXSwgYltdLCBvciB2W10gKi8KLSAgaW5mbGF0ZV9odWZ0ICpxOyAgICAgICAgICAgICAgLyogcG9pbnRzIHRvIGN1cnJlbnQgdGFibGUgKi8KLSAgc3RydWN0IGluZmxhdGVfaHVmdF9zIHI7ICAgICAgLyogdGFibGUgZW50cnkgZm9yIHN0cnVjdHVyZSBhc3NpZ25tZW50ICovCi0gIGluZmxhdGVfaHVmdCAqdVtCTUFYXTsgICAgICAgIC8qIHRhYmxlIHN0YWNrICovCi0gIHJlZ2lzdGVyIGludCB3OyAgICAgICAgICAgICAgIC8qIGJpdHMgYmVmb3JlIHRoaXMgdGFibGUgPT0gKGwgKiBoKSAqLwotICB1SW50IHhbQk1BWCsxXTsgICAgICAgICAgICAgICAvKiBiaXQgb2Zmc2V0cywgdGhlbiBjb2RlIHN0YWNrICovCi0gIHVJbnRmICp4cDsgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgaW50byB4ICovCi0gIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkdW1teSBjb2RlcyBhZGRlZCAqLwotICB1SW50IHo7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBjdXJyZW50IHRhYmxlICovCisgICAgLyoKKyAgICAgICBQcm9jZXNzIGEgc2V0IG9mIGNvZGUgbGVuZ3RocyB0byBjcmVhdGUgYSBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLiAgVGhlCisgICAgICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGUKKyAgICAgICBzeW1ib2xzIGJ5IGxlbmd0aCBmcm9tIHNob3J0IHRvIGxvbmcsIGFuZCByZXRhaW5pbmcgdGhlIHN5bWJvbCBvcmRlcgorICAgICAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHMKKyAgICAgICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlcgorICAgICAgIGluY3JlbWVudHMgZm9yIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHplcm9zIGFyZSBhcHBlbmRlZCBhcyB0aGUgbGVuZ3RoCisgICAgICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkcworICAgICAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGUKKyAgICAgICBkZWNvZGluZyB0YWJsZXMgYXJlIGJ1aWx0IGluIHRoZSBsYXJnZSBsb29wIGJlbG93LCB0aGUgaW50ZWdlciBjb2RlcworICAgICAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuCiAKKyAgICAgICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpbgorICAgICAgIGxlbnNbXSBhcmUgaW4gdGhlIHJhbmdlIDAuLk1BWEJJVFMuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoaXMuCisgICAgICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXQKKyAgICAgICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLgogCi0gIC8qIEdlbmVyYXRlIGNvdW50cyBmb3IgZWFjaCBiaXQgbGVuZ3RoICovCi0gIHAgPSBjOwotI2RlZmluZSBDMCAqcCsrID0gMDsKLSNkZWZpbmUgQzIgQzAgQzAgQzAgQzAKLSNkZWZpbmUgQzQgQzIgQzIgQzIgQzIKLSAgQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgY1tdLS1hc3N1bWUgQk1BWCsxIGlzIDE2ICovCi0gIHAgPSBiOyAgaSA9IG47Ci0gIGRvIHsKLSAgICBjWypwKytdKys7ICAgICAgICAgICAgICAgICAgLyogYXNzdW1lIGFsbCBlbnRyaWVzIDw9IEJNQVggKi8KLSAgfSB3aGlsZSAoLS1pKTsKLSAgaWYgKGNbMF0gPT0gbikgICAgICAgICAgICAgICAgLyogbnVsbCBpbnB1dC0tYWxsIHplcm8gbGVuZ3RoIGNvZGVzICovCi0gIHsKLSAgICAqdCA9IChpbmZsYXRlX2h1ZnQgKilaX05VTEw7Ci0gICAgKm0gPSAwOwotICAgIHJldHVybiBaX09LOwotICB9CisgICAgICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLAorICAgICAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZQorICAgICAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZAorICAgICAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieQorICAgICAgIHRoZSBjYWxsZXIuCiAKKyAgICAgICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nCisgICAgICAgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoIGNvZGVzLCBkZXRlcm1pbmluZyBpZiB0aGVyZSBhcmUgYW55CisgICAgICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWQKKyAgICAgICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGUKKyAgICAgICBkZWNvZGluZyB0YWJsZXMuCisgICAgICovCiAKLSAgLyogRmluZCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCwgYm91bmQgKm0gYnkgdGhvc2UgKi8KLSAgbCA9ICptOwotICBmb3IgKGogPSAxOyBqIDw9IEJNQVg7IGorKykKLSAgICBpZiAoY1tqXSkKLSAgICAgIGJyZWFrOwotICBrID0gajsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGNvZGUgbGVuZ3RoICovCi0gIGlmICgodUludClsIDwgaikKLSAgICBsID0gajsKLSAgZm9yIChpID0gQk1BWDsgaTsgaS0tKQotICAgIGlmIChjW2ldKQotICAgICAgYnJlYWs7Ci0gIGcgPSBpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gY29kZSBsZW5ndGggKi8KLSAgaWYgKCh1SW50KWwgPiBpKQotICAgIGwgPSBpOwotICAqbSA9IGw7CisgICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCisgICAgICAgIGNvdW50W2xlbl0gPSAwOworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7CiAKKyAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLworICAgIHJvb3QgPSAqYml0czsKKyAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKKyAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7CisgICAgaWYgKG1heCA9PSAwKSByZXR1cm4gLTE7ICAgICAgICAgICAgLyogbm8gY29kZXMhICovCisgICAgZm9yIChtaW4gPSAxOyBtaW4gPD0gTUFYQklUUzsgbWluKyspCisgICAgICAgIGlmIChjb3VudFttaW5dICE9IDApIGJyZWFrOworICAgIGlmIChyb290IDwgbWluKSByb290ID0gbWluOwogCi0gIC8qIEFkanVzdCBsYXN0IGxlbmd0aCBjb3VudCB0byBmaWxsIG91dCBjb2RlcywgaWYgbmVlZGVkICovCi0gIGZvciAoeSA9IDEgPDwgajsgaiA8IGk7IGorKywgeSA8PD0gMSkKLSAgICBpZiAoKHkgLT0gY1tqXSkgPCAwKQotICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgaWYgKCh5IC09IGNbaV0pIDwgMCkKLSAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICBjW2ldICs9IHk7CisgICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCisgICAgbGVmdCA9IDE7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKKyAgICAgICAgbGVmdCA8PD0gMTsKKyAgICAgICAgbGVmdCAtPSBjb3VudFtsZW5dOworICAgICAgICBpZiAobGVmdCA8IDApIHJldHVybiAtMTsgICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqLworICAgIH0KKyAgICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT0gQ09ERVMgfHwgKGNvZGVzIC0gY291bnRbMF0gIT0gMSkpKQorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovCiAKKyAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLworICAgIG9mZnNbMV0gPSAwOworICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCisgICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dOwogCi0gIC8qIEdlbmVyYXRlIHN0YXJ0aW5nIG9mZnNldHMgaW50byB0aGUgdmFsdWUgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCi0gIHhbMV0gPSBqID0gMDsKLSAgcCA9IGMgKyAxOyAgeHAgPSB4ICsgMjsKLSAgd2hpbGUgKC0taSkgeyAgICAgICAgICAgICAgICAgLyogbm90ZSB0aGF0IGkgPT0gZyBmcm9tIGFib3ZlICovCi0gICAgKnhwKysgPSAoaiArPSAqcCsrKTsKLSAgfQorICAgIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi8KKyAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykKKyAgICAgICAgaWYgKGxlbnNbc3ltXSAhPSAwKSB3b3JrW29mZnNbbGVuc1tzeW1dXSsrXSA9ICh1bnNpZ25lZCBzaG9ydClzeW07CiAKKyAgICAvKgorICAgICAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZworICAgICAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmCisgICAgICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wCisgICAgICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLAorICAgICAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG8KKyAgICAgICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy4KIAotICAvKiBNYWtlIGEgdGFibGUgb2YgdmFsdWVzIGluIG9yZGVyIG9mIGJpdCBsZW5ndGhzICovCi0gIHAgPSBiOyAgaSA9IDA7Ci0gIGRvIHsKLSAgICBpZiAoKGogPSAqcCsrKSAhPSAwKQotICAgICAgdlt4W2pdKytdID0gaTsKLSAgfSB3aGlsZSAoKytpIDwgbik7Ci0gIG4gPSB4W2ddOyAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBuIHRvIGxlbmd0aCBvZiB2ICovCisgICAgICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkcworICAgICAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4CisgICAgICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGEKKyAgICAgICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXMKKyAgICAgICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuCiAKKyAgICAgICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZQorICAgICAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoCisgICAgICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmUKKyAgICAgICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuCiAKLSAgLyogR2VuZXJhdGUgdGhlIEh1ZmZtYW4gY29kZXMgYW5kIGZvciBlYWNoLCBtYWtlIHRoZSB0YWJsZSBlbnRyaWVzICovCi0gIHhbMF0gPSBpID0gMDsgICAgICAgICAgICAgICAgIC8qIGZpcnN0IEh1ZmZtYW4gY29kZSBpcyB6ZXJvICovCi0gIHAgPSB2OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYWIgdmFsdWVzIGluIGJpdCBvcmRlciAqLwotICBoID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBubyB0YWJsZXMgeWV0LS1sZXZlbCAtMSAqLwotICB3ID0gLWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGRlY29kZWQgPT0gKGwgKiBoKSAqLwotICB1WzBdID0gKGluZmxhdGVfaHVmdCAqKVpfTlVMTDsgICAgICAgIC8qIGp1c3QgdG8ga2VlcCBjb21waWxlcnMgaGFwcHkgKi8KLSAgcSA9IChpbmZsYXRlX2h1ZnQgKilaX05VTEw7ICAgLyogZGl0dG8gKi8KLSAgeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZGl0dG8gKi8KKyAgICAgICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZQorICAgICAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgd2hlbiBhIExFTlMgdGFibGUgaXMgYmVpbmcgbWFkZQorICAgICAgIGFnYWluc3QgdGhlIHNwYWNlIGluICp0YWJsZSwgRU5PVUdILCBtaW51cyB0aGUgbWF4aW11bSBzcGFjZSBuZWVkZWQgYnkKKyAgICAgICB0aGUgd29yc3QgY2FzZSBkaXN0YW5jZSBjb2RlLCBNQVhELiAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgdGhlCisgICAgICAgc3VmZmljaWVuY3kgb2YgRU5PVUdIIGhhcyBub3QgYmVlbiBwcm92ZW4gZXhoYXVzdGl2ZWx5LCBoZW5jZSB0aGUgY2hlY2suCisgICAgICAgVGhpcyBhc3N1bWVzIHRoYXQgd2hlbiB0eXBlID09IExFTlMsIGJpdHMgPT0gOS4KIAotICAvKiBnbyB0aHJvdWdoIHRoZSBiaXQgbGVuZ3RocyAoayBhbHJlYWR5IGlzIGJpdHMgaW4gc2hvcnRlc3QgY29kZSkgKi8KLSAgZm9yICg7IGsgPD0gZzsgaysrKQotICB7Ci0gICAgYSA9IGNba107Ci0gICAgd2hpbGUgKGEtLSkKLSAgICB7Ci0gICAgICAvKiBoZXJlIGkgaXMgdGhlIEh1ZmZtYW4gY29kZSBvZiBsZW5ndGggayBiaXRzIGZvciB2YWx1ZSAqcCAqLwotICAgICAgLyogbWFrZSB0YWJsZXMgdXAgdG8gcmVxdWlyZWQgbGV2ZWwgKi8KLSAgICAgIHdoaWxlIChrID4gdyArIGwpCi0gICAgICB7Ci0gICAgICAgIGgrKzsKLSAgICAgICAgdyArPSBsOyAgICAgICAgICAgICAgICAgLyogcHJldmlvdXMgdGFibGUgYWx3YXlzIGwgYml0cyAqLworICAgICAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4KKyAgICAgICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzCisgICAgICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxscworICAgICAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy4KKyAgICAgKi8KIAotICAgICAgICAvKiBjb21wdXRlIG1pbmltdW0gc2l6ZSB0YWJsZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbCBiaXRzICovCi0gICAgICAgIHogPSBnIC0gdzsKLSAgICAgICAgeiA9IHogPiAodUludClsID8gbCA6IHo7ICAgICAgICAvKiB0YWJsZSBzaXplIHVwcGVyIGxpbWl0ICovCi0gICAgICAgIGlmICgoZiA9IDEgPDwgKGogPSBrIC0gdykpID4gYSArIDEpICAgICAvKiB0cnkgYSBrLXcgYml0IHRhYmxlICovCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvbyBmZXcgY29kZXMgZm9yIGstdyBiaXQgdGFibGUgKi8KLSAgICAgICAgICBmIC09IGEgKyAxOyAgICAgICAgICAgLyogZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgbGVmdCAqLwotICAgICAgICAgIHhwID0gYyArIGs7Ci0gICAgICAgICAgaWYgKGogPCB6KQotICAgICAgICAgICAgd2hpbGUgKCsraiA8IHopICAgICAvKiB0cnkgc21hbGxlciB0YWJsZXMgdXAgdG8geiBiaXRzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICgoZiA8PD0gMSkgPD0gKisreHApCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIGVub3VnaCBjb2RlcyB0byB1c2UgdXAgaiBiaXRzICovCi0gICAgICAgICAgICAgIGYgLT0gKnhwOyAgICAgICAgIC8qIGVsc2UgZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgKi8KLSAgICAgICAgICAgIH0KKyAgICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqLworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ09ERVM6CisgICAgICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqLworICAgICAgICBlbmQgPSAxOTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMRU5TOgorICAgICAgICBiYXNlID0gbGJhc2U7CisgICAgICAgIGJhc2UgLT0gMjU3OworICAgICAgICBleHRyYSA9IGxleHQ7CisgICAgICAgIGV4dHJhIC09IDI1NzsKKyAgICAgICAgZW5kID0gMjU2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIERJU1RTICovCisgICAgICAgIGJhc2UgPSBkYmFzZTsKKyAgICAgICAgZXh0cmEgPSBkZXh0OworICAgICAgICBlbmQgPSAtMTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHN0YXRlIGZvciBsb29wICovCisgICAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi8KKyAgICBzeW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBzeW1ib2wgKi8KKyAgICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi8KKyAgICBuZXh0ID0gKnRhYmxlOyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovCisgICAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqLworICAgIGRyb3AgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgdG8gZHJvcCBmcm9tIGNvZGUgZm9yIGluZGV4ICovCisgICAgbG93ID0gKHVuc2lnbmVkKSgtMSk7ICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi8KKyAgICB1c2VkID0gMVUgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqLworICAgIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovCisKKyAgICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi8KKyAgICBpZiAodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIIC0gTUFYRCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi8KKyAgICAgICAgdGhpcy5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOworICAgICAgICBpZiAoKGludCkod29ya1tzeW1dKSA8IGVuZCkgeworICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKTA7CisgICAgICAgICAgICB0aGlzLnZhbCA9IHdvcmtbc3ltXTsKICAgICAgICAgfQotICAgICAgICB6ID0gMSA8PCBqOyAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyaWVzIGZvciBqLWJpdCB0YWJsZSAqLworICAgICAgICBlbHNlIGlmICgoaW50KSh3b3JrW3N5bV0pID4gZW5kKSB7CisgICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpKGV4dHJhW3dvcmtbc3ltXV0pOworICAgICAgICAgICAgdGhpcy52YWwgPSBiYXNlW3dvcmtbc3ltXV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpKDMyICsgNjQpOyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgdGhpcy52YWwgPSAwOworICAgICAgICB9CiAKLSAgICAgICAgLyogYWxsb2NhdGUgbmV3IHRhYmxlICovCi0gICAgICAgIGlmICgqaG4gKyB6ID4gTUFOWSkgICAgIC8qIChub3RlOiBkb2Vzbid0IG1hdHRlciBmb3IgZml4ZWQpICovCi0gICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsgIC8qIG92ZXJmbG93IG9mIE1BTlkgKi8KLSAgICAgICAgdVtoXSA9IHEgPSBocCArICpobjsKLSAgICAgICAgKmhuICs9IHo7CisgICAgICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovCisgICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gZHJvcCk7CisgICAgICAgIGZpbGwgPSAxVSA8PCBjdXJyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBmaWxsIC09IGluY3I7CisgICAgICAgICAgICBuZXh0WyhodWZmID4+IGRyb3ApICsgZmlsbF0gPSB0aGlzOworICAgICAgICB9IHdoaWxlIChmaWxsICE9IDApOwogCi0gICAgICAgIC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSwgaWYgdGhlcmUgaXMgb25lICovCi0gICAgICAgIGlmIChoKQotICAgICAgICB7Ci0gICAgICAgICAgeFtoXSA9IGk7ICAgICAgICAgICAgIC8qIHNhdmUgcGF0dGVybiBmb3IgYmFja2luZyB1cCAqLwotICAgICAgICAgIHIuYml0cyA9IChCeXRlKWw7ICAgICAvKiBiaXRzIHRvIGR1bXAgYmVmb3JlIHRoaXMgdGFibGUgKi8KLSAgICAgICAgICByLmV4b3AgPSAoQnl0ZSlqOyAgICAgLyogYml0cyBpbiB0aGlzIHRhYmxlICovCi0gICAgICAgICAgaiA9IGkgPj4gKHcgLSBsKTsKLSAgICAgICAgICByLmJhc2UgPSAodUludCkocSAtIHVbaC0xXSAtIGopOyAgIC8qIG9mZnNldCB0byB0aGlzIHRhYmxlICovCi0gICAgICAgICAgdVtoLTFdW2pdID0gcjsgICAgICAgIC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSAqLworICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOworICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCisgICAgICAgICAgICBpbmNyID4+PSAxOworICAgICAgICBpZiAoaW5jciAhPSAwKSB7CisgICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOworICAgICAgICAgICAgaHVmZiArPSBpbmNyOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAqdCA9IHE7ICAgICAgICAgICAgICAgLyogZmlyc3QgdGFibGUgaXMgcmV0dXJuZWQgcmVzdWx0ICovCi0gICAgICB9CisgICAgICAgICAgICBodWZmID0gMDsKIAotICAgICAgLyogc2V0IHVwIHRhYmxlIGVudHJ5IGluIHIgKi8KLSAgICAgIHIuYml0cyA9IChCeXRlKShrIC0gdyk7Ci0gICAgICBpZiAocCA+PSB2ICsgbikKLSAgICAgICAgci5leG9wID0gMTI4ICsgNjQ7ICAgICAgLyogb3V0IG9mIHZhbHVlcy0taW52YWxpZCBjb2RlICovCi0gICAgICBlbHNlIGlmICgqcCA8IHMpCi0gICAgICB7Ci0gICAgICAgIHIuZXhvcCA9IChCeXRlKSgqcCA8IDI1NiA/IDAgOiAzMiArIDY0KTsgICAgIC8qIDI1NiBpcyBlbmQtb2YtYmxvY2sgKi8KLSAgICAgICAgci5iYXNlID0gKnArKzsgICAgICAgICAgLyogc2ltcGxlIGNvZGUgaXMganVzdCB0aGUgdmFsdWUgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgci5leG9wID0gKEJ5dGUpKGVbKnAgLSBzXSArIDE2ICsgNjQpOy8qIG5vbi1zaW1wbGUtLWxvb2sgdXAgaW4gbGlzdHMgKi8KLSAgICAgICAgci5iYXNlID0gZFsqcCsrIC0gc107Ci0gICAgICB9CisgICAgICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqLworICAgICAgICBzeW0rKzsKKyAgICAgICAgaWYgKC0tKGNvdW50W2xlbl0pID09IDApIHsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gbWF4KSBicmVhazsKKyAgICAgICAgICAgIGxlbiA9IGxlbnNbd29ya1tzeW1dXTsKKyAgICAgICAgfQogCi0gICAgICAvKiBmaWxsIGNvZGUtbGlrZSBlbnRyaWVzIHdpdGggciAqLwotICAgICAgZiA9IDEgPDwgKGsgLSB3KTsKLSAgICAgIGZvciAoaiA9IGkgPj4gdzsgaiA8IHo7IGogKz0gZikKLSAgICAgICAgcVtqXSA9IHI7CisgICAgICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqLworICAgICAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovCisgICAgICAgICAgICBpZiAoZHJvcCA9PSAwKQorICAgICAgICAgICAgICAgIGRyb3AgPSByb290OwogCi0gICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBrLWJpdCBjb2RlIGkgKi8KLSAgICAgIGZvciAoaiA9IDEgPDwgKGsgLSAxKTsgaSAmIGo7IGogPj49IDEpCi0gICAgICAgIGkgXj0gajsKLSAgICAgIGkgXj0gajsKKyAgICAgICAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi8KKyAgICAgICAgICAgIG5leHQgKz0gMVUgPDwgY3VycjsKIAotICAgICAgLyogYmFja3VwIG92ZXIgZmluaXNoZWQgdGFibGVzICovCi0gICAgICBtYXNrID0gKDEgPDwgdykgLSAxOyAgICAgIC8qIG5lZWRlZCBvbiBIUCwgY2MgLU8gYnVnICovCi0gICAgICB3aGlsZSAoKGkgJiBtYXNrKSAhPSB4W2hdKQotICAgICAgewotICAgICAgICBoLS07ICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBuZWVkIHRvIHVwZGF0ZSBxICovCi0gICAgICAgIHcgLT0gbDsKLSAgICAgICAgbWFzayA9ICgxIDw8IHcpIC0gMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KKyAgICAgICAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqLworICAgICAgICAgICAgY3VyciA9IGxlbiAtIGRyb3A7CisgICAgICAgICAgICBsZWZ0ID0gKGludCkoMSA8PCBjdXJyKTsKKyAgICAgICAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkgeworICAgICAgICAgICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdOworICAgICAgICAgICAgICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgIGN1cnIrKzsKKyAgICAgICAgICAgICAgICBsZWZ0IDw8PSAxOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovCisgICAgICAgICAgICB1c2VkICs9IDFVIDw8IGN1cnI7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIIC0gTUFYRCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKIAotICAvKiBSZXR1cm4gWl9CVUZfRVJST1IgaWYgd2Ugd2VyZSBnaXZlbiBhbiBpbmNvbXBsZXRlIHRhYmxlICovCi0gIHJldHVybiB5ICE9IDAgJiYgZyAhPSAxID8gWl9CVUZfRVJST1IgOiBaX09LOwotfQotCi0KLWludCBpbmZsYXRlX3RyZWVzX2JpdHMoYywgYmIsIHRiLCBocCwgeikKLXVJbnRmICpjOyAgICAgICAgICAgICAgIC8qIDE5IGNvZGUgbGVuZ3RocyAqLwotdUludGYgKmJiOyAgICAgICAgICAgICAgLyogYml0cyB0cmVlIGRlc2lyZWQvYWN0dWFsIGRlcHRoICovCi1pbmZsYXRlX2h1ZnQgKiBGQVIgKnRiOyAvKiBiaXRzIHRyZWUgcmVzdWx0ICovCi1pbmZsYXRlX2h1ZnQgKmhwOyAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KLXpfc3RyZWFtcCB6OyAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLwotewotICBpbnQgcjsKLSAgdUludCBobiA9IDA7ICAgICAgICAgIC8qIGh1ZnRzIHVzZWQgaW4gc3BhY2UgKi8KLSAgdUludGYgKnY7ICAgICAgICAgICAgIC8qIHdvcmsgYXJlYSBmb3IgaHVmdF9idWlsZCAqLwotCi0gIGlmICgodiA9ICh1SW50ZiopWkFMTE9DKHosIDE5LCBzaXplb2YodUludCkpKSA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICByID0gaHVmdF9idWlsZChjLCAxOSwgMTksICh1SW50ZiopWl9OVUxMLCAodUludGYqKVpfTlVMTCwKLSAgICAgICAgICAgICAgICAgdGIsIGJiLCBocCwgJmhuLCB2KTsKLSAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQotICAgIHotPm1zZyA9IChjaGFyKikib3ZlcnN1YnNjcmliZWQgZHluYW1pYyBiaXQgbGVuZ3RocyB0cmVlIjsKLSAgZWxzZSBpZiAociA9PSBaX0JVRl9FUlJPUiB8fCAqYmIgPT0gMCkKLSAgewotICAgIHotPm1zZyA9IChjaGFyKikiaW5jb21wbGV0ZSBkeW5hbWljIGJpdCBsZW5ndGhzIHRyZWUiOwotICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gIH0KLSAgWkZSRUUoeiwgdik7Ci0gIHJldHVybiByOwotfQotCi0KLWludCBpbmZsYXRlX3RyZWVzX2R5bmFtaWMobmwsIG5kLCBjLCBibCwgYmQsIHRsLCB0ZCwgaHAsIHopCi11SW50IG5sOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KLXVJbnQgbmQ7ICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLwotdUludGYgKmM7ICAgICAgICAgICAgICAgLyogdGhhdCBtYW55ICh0b3RhbCkgY29kZSBsZW5ndGhzICovCi11SW50ZiAqYmw7ICAgICAgICAgICAgICAvKiBsaXRlcmFsIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotdUludGYgKmJkOyAgICAgICAgICAgICAgLyogZGlzdGFuY2UgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi1pbmZsYXRlX2h1ZnQgKiBGQVIgKnRsOyAvKiBsaXRlcmFsL2xlbmd0aCB0cmVlIHJlc3VsdCAqLwotaW5mbGF0ZV9odWZ0ICogRkFSICp0ZDsgLyogZGlzdGFuY2UgdHJlZSByZXN1bHQgKi8KLWluZmxhdGVfaHVmdCAqaHA7ICAgICAgIC8qIHNwYWNlIGZvciB0cmVlcyAqLwotel9zdHJlYW1wIHo7ICAgICAgICAgICAgLyogZm9yIG1lc3NhZ2VzICovCi17Ci0gIGludCByOwotICB1SW50IGhuID0gMDsgICAgICAgICAgLyogaHVmdHMgdXNlZCBpbiBzcGFjZSAqLwotICB1SW50ZiAqdjsgICAgICAgICAgICAgLyogd29yayBhcmVhIGZvciBodWZ0X2J1aWxkICovCi0KLSAgLyogYWxsb2NhdGUgd29yayBhcmVhICovCi0gIGlmICgodiA9ICh1SW50ZiopWkFMTE9DKHosIDI4OCwgc2l6ZW9mKHVJbnQpKSkgPT0gWl9OVUxMKQotICAgIHJldHVybiBaX01FTV9FUlJPUjsKLQotICAvKiBidWlsZCBsaXRlcmFsL2xlbmd0aCB0cmVlICovCi0gIHIgPSBodWZ0X2J1aWxkKGMsIG5sLCAyNTcsIGNwbGVucywgY3BsZXh0LCB0bCwgYmwsIGhwLCAmaG4sIHYpOwotICBpZiAociAhPSBaX09LIHx8ICpibCA9PSAwKQotICB7Ci0gICAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQotICAgICAgei0+bXNnID0gKGNoYXIqKSJvdmVyc3Vic2NyaWJlZCBsaXRlcmFsL2xlbmd0aCB0cmVlIjsKLSAgICBlbHNlIGlmIChyICE9IFpfTUVNX0VSUk9SKQotICAgIHsKLSAgICAgIHotPm1zZyA9IChjaGFyKikiaW5jb21wbGV0ZSBsaXRlcmFsL2xlbmd0aCB0cmVlIjsKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgfQotICAgIFpGUkVFKHosIHYpOwotICAgIHJldHVybiByOwotICB9Ci0KLSAgLyogYnVpbGQgZGlzdGFuY2UgdHJlZSAqLwotICByID0gaHVmdF9idWlsZChjICsgbmwsIG5kLCAwLCBjcGRpc3QsIGNwZGV4dCwgdGQsIGJkLCBocCwgJmhuLCB2KTsKLSAgaWYgKHIgIT0gWl9PSyB8fCAoKmJkID09IDAgJiYgbmwgPiAyNTcpKQotICB7Ci0gICAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQotICAgICAgei0+bXNnID0gKGNoYXIqKSJvdmVyc3Vic2NyaWJlZCBkaXN0YW5jZSB0cmVlIjsKLSAgICBlbHNlIGlmIChyID09IFpfQlVGX0VSUk9SKSB7Ci0jaWZkZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKLSAgICAgIHIgPSBaX09LOwotICAgIH0KLSNlbHNlCi0gICAgICB6LT5tc2cgPSAoY2hhciopImluY29tcGxldGUgZGlzdGFuY2UgdHJlZSI7Ci0gICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgIH0KLSAgICBlbHNlIGlmIChyICE9IFpfTUVNX0VSUk9SKQotICAgIHsKLSAgICAgIHotPm1zZyA9IChjaGFyKikiZW1wdHkgZGlzdGFuY2UgdHJlZSB3aXRoIGxlbmd0aHMiOwotICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICB9Ci0gICAgWkZSRUUoeiwgdik7Ci0gICAgcmV0dXJuIHI7Ci0jZW5kaWYKLSAgfQotCi0gIC8qIGRvbmUgKi8KLSAgWkZSRUUoeiwgdik7Ci0gIHJldHVybiBaX09LOwotfQotCi0KLS8qIGJ1aWxkIGZpeGVkIHRhYmxlcyBvbmx5IG9uY2UtLWtlZXAgdGhlbSBoZXJlICovCi0jaWZkZWYgQlVJTERGSVhFRAotbG9jYWwgaW50IGZpeGVkX2J1aWx0ID0gMDsKLSNkZWZpbmUgRklYRURIIDU0NCAgICAgIC8qIG51bWJlciBvZiBodWZ0cyB1c2VkIGJ5IGZpeGVkIHRhYmxlcyAqLwotbG9jYWwgaW5mbGF0ZV9odWZ0IGZpeGVkX21lbVtGSVhFREhdOwotbG9jYWwgdUludCBmaXhlZF9ibDsKLWxvY2FsIHVJbnQgZml4ZWRfYmQ7Ci1sb2NhbCBpbmZsYXRlX2h1ZnQgKmZpeGVkX3RsOwotbG9jYWwgaW5mbGF0ZV9odWZ0ICpmaXhlZF90ZDsKLSNlbHNlCi0jaW5jbHVkZSAiaW5mZml4ZWQuaCIKLSNlbmRpZgotCi0KLWludCBpbmZsYXRlX3RyZWVzX2ZpeGVkKGJsLCBiZCwgdGwsIHRkLCB6KQotdUludGYgKmJsOyAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi11SW50ZiAqYmQ7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi1pbmZsYXRlX2h1ZnQgKiBGQVIgKnRsOyAgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KLWluZmxhdGVfaHVmdCAqIEZBUiAqdGQ7ICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLwotel9zdHJlYW1wIHo7ICAgICAgICAgICAgIC8qIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAqLwotewotI2lmZGVmIEJVSUxERklYRUQKLSAgLyogYnVpbGQgZml4ZWQgdGFibGVzIGlmIG5vdCBhbHJlYWR5ICovCi0gIGlmICghZml4ZWRfYnVpbHQpCi0gIHsKLSAgICBpbnQgazsgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLwotICAgIHVJbnQgZiA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIGh1ZnRzIHVzZWQgaW4gZml4ZWRfbWVtICovCi0gICAgdUludGYgKmM7ICAgICAgICAgICAvKiBsZW5ndGggbGlzdCBmb3IgaHVmdF9idWlsZCAqLwotICAgIHVJbnRmICp2OyAgICAgICAgICAgLyogd29yayBhcmVhIGZvciBodWZ0X2J1aWxkICovCi0KLSAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBpZiAoKGMgPSAodUludGYqKVpBTExPQyh6LCAyODgsIHNpemVvZih1SW50KSkpID09IFpfTlVMTCkKLSAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICBpZiAoKHYgPSAodUludGYqKVpBTExPQyh6LCAyODgsIHNpemVvZih1SW50KSkpID09IFpfTlVMTCkKLSAgICB7Ci0gICAgICBaRlJFRSh6LCBjKTsKLSAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICAgICAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovCisgICAgICAgICAgICBsb3cgPSBodWZmICYgbWFzazsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10ub3AgPSAodW5zaWduZWQgY2hhciljdXJyOworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpcm9vdDsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10udmFsID0gKHVuc2lnbmVkIHNob3J0KShuZXh0IC0gKnRhYmxlKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIC8qIGxpdGVyYWwgdGFibGUgKi8KLSAgICBmb3IgKGsgPSAwOyBrIDwgMTQ0OyBrKyspCi0gICAgICBjW2tdID0gODsKLSAgICBmb3IgKDsgayA8IDI1NjsgaysrKQotICAgICAgY1trXSA9IDk7Ci0gICAgZm9yICg7IGsgPCAyODA7IGsrKykKLSAgICAgIGNba10gPSA3OwotICAgIGZvciAoOyBrIDwgMjg4OyBrKyspCi0gICAgICBjW2tdID0gODsKLSAgICBmaXhlZF9ibCA9IDk7Ci0gICAgaHVmdF9idWlsZChjLCAyODgsIDI1NywgY3BsZW5zLCBjcGxleHQsICZmaXhlZF90bCwgJmZpeGVkX2JsLAotICAgICAgICAgICAgICAgZml4ZWRfbWVtLCAmZiwgdik7CisgICAgLyoKKyAgICAgICBGaWxsIGluIHJlc3Qgb2YgdGFibGUgZm9yIGluY29tcGxldGUgY29kZXMuICBUaGlzIGxvb3AgaXMgc2ltaWxhciB0byB0aGUKKyAgICAgICBsb29wIGFib3ZlIGluIGluY3JlbWVudGluZyBodWZmIGZvciB0YWJsZSBpbmRpY2VzLiAgSXQgaXMgYXNzdW1lZCB0aGF0CisgICAgICAgbGVuIGlzIGVxdWFsIHRvIGN1cnIgKyBkcm9wLCBzbyB0aGVyZSBpcyBubyBsb29wIG5lZWRlZCB0byBpbmNyZW1lbnQKKyAgICAgICB0aHJvdWdoIGhpZ2ggaW5kZXggYml0cy4gIFdoZW4gdGhlIGN1cnJlbnQgc3ViLXRhYmxlIGlzIGZpbGxlZCwgdGhlIGxvb3AKKyAgICAgICBkcm9wcyBiYWNrIHRvIHRoZSByb290IHRhYmxlIHRvIGZpbGwgaW4gYW55IHJlbWFpbmluZyBlbnRyaWVzIHRoZXJlLgorICAgICAqLworICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcik2NDsgICAgICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqLworICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKKyAgICB0aGlzLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkwOworICAgIHdoaWxlIChodWZmICE9IDApIHsKKyAgICAgICAgLyogd2hlbiBkb25lIHdpdGggc3ViLXRhYmxlLCBkcm9wIGJhY2sgdG8gcm9vdCB0YWJsZSAqLworICAgICAgICBpZiAoZHJvcCAhPSAwICYmIChodWZmICYgbWFzaykgIT0gbG93KSB7CisgICAgICAgICAgICBkcm9wID0gMDsKKyAgICAgICAgICAgIGxlbiA9IHJvb3Q7CisgICAgICAgICAgICBuZXh0ID0gKnRhYmxlOworICAgICAgICAgICAgY3VyciA9IHJvb3Q7CisgICAgICAgICAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcilsZW47CisgICAgICAgIH0KIAotICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCi0gICAgZm9yIChrID0gMDsgayA8IDMwOyBrKyspCi0gICAgICBjW2tdID0gNTsKLSAgICBmaXhlZF9iZCA9IDU7Ci0gICAgaHVmdF9idWlsZChjLCAzMCwgMCwgY3BkaXN0LCBjcGRleHQsICZmaXhlZF90ZCwgJmZpeGVkX2JkLAotICAgICAgICAgICAgICAgZml4ZWRfbWVtLCAmZiwgdik7CisgICAgICAgIC8qIHB1dCBpbnZhbGlkIGNvZGUgbWFya2VyIGluIHRhYmxlICovCisgICAgICAgIG5leHRbaHVmZiA+PiBkcm9wXSA9IHRoaXM7CiAKLSAgICAvKiBkb25lICovCi0gICAgWkZSRUUoeiwgdik7Ci0gICAgWkZSRUUoeiwgYyk7Ci0gICAgZml4ZWRfYnVpbHQgPSAxOwotICB9Ci0jZW5kaWYKLSAgKmJsID0gZml4ZWRfYmw7Ci0gICpiZCA9IGZpeGVkX2JkOwotICAqdGwgPSBmaXhlZF90bDsKLSAgKnRkID0gZml4ZWRfdGQ7Ci0gIHJldHVybiBaX09LOworICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOworICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCisgICAgICAgICAgICBpbmNyID4+PSAxOworICAgICAgICBpZiAoaW5jciAhPSAwKSB7CisgICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOworICAgICAgICAgICAgaHVmZiArPSBpbmNyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGh1ZmYgPSAwOworICAgIH0KKworICAgIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqLworICAgICp0YWJsZSArPSB1c2VkOworICAgICpiaXRzID0gcm9vdDsKKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luZnRyZWVzLmggYi9pbmZ0cmVlcy5oCmluZGV4IDA0YjczYjcuLjQ5ZWVlYjkgMTAwNjQ0Ci0tLSBhL2luZnRyZWVzLmgKKysrIGIvaW5mdHJlZXMuaApAQCAtMSw2ICsxLDYgQEAKIC8qIGluZnRyZWVzLmggLS0gaGVhZGVyIHRvIHVzZSBpbmZ0cmVlcy5jCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCkBAIC04LDUxICs4LDQ4IEBACiAgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCiAgKi8KIAotLyogSHVmZm1hbiBjb2RlIGxvb2t1cCB0YWJsZSBlbnRyeS0tdGhpcyBlbnRyeSBpcyBmb3VyIGJ5dGVzIGZvciBtYWNoaW5lcwotICAgdGhhdCBoYXZlIDE2LWJpdCBwb2ludGVycyAoZS5nLiBQQydzIGluIHRoZSBzbWFsbCBvciBtZWRpdW0gbW9kZWwpLiAqLworLyogU3RydWN0dXJlIGZvciBkZWNvZGluZyB0YWJsZXMuICBFYWNoIGVudHJ5IHByb3ZpZGVzIGVpdGhlciB0aGUKKyAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgY29kZSB0aGF0CisgICBpbmRleGVkIHRoYXQgdGFibGUgZW50cnksIG9yIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBhbm90aGVyCisgICB0YWJsZSB0aGF0IGluZGV4ZXMgbW9yZSBiaXRzIG9mIHRoZSBjb2RlLiAgb3AgaW5kaWNhdGVzIHdoZXRoZXIKKyAgIHRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciB0YWJsZSwgYSBsaXRlcmFsLCBhIGxlbmd0aCBvcgorICAgZGlzdGFuY2UsIGFuIGVuZC1vZi1ibG9jaywgb3IgYW4gaW52YWxpZCBjb2RlLiAgRm9yIGEgdGFibGUKKyAgIHBvaW50ZXIsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wIGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBvZgorICAgdGhhdCB0YWJsZS4gIEZvciBhIGxlbmd0aCBvciBkaXN0YW5jZSwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AKKyAgIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBnZXQgYWZ0ZXIgdGhlIGNvZGUuICBiaXRzIGlzCisgICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHBhcnQgb2YgdGhlIGNvZGUgdG8gZHJvcCBvZmYKKyAgIG9mIHRoZSBiaXQgYnVmZmVyLiAgdmFsIGlzIHRoZSBhY3R1YWwgYnl0ZSB0byBvdXRwdXQgaW4gdGhlIGNhc2UKKyAgIG9mIGEgbGl0ZXJhbCwgdGhlIGJhc2UgbGVuZ3RoIG9yIGRpc3RhbmNlLCBvciB0aGUgb2Zmc2V0IGZyb20KKyAgIHRoZSBjdXJyZW50IHRhYmxlIHRvIHRoZSBuZXh0IHRhYmxlLiAgRWFjaCBlbnRyeSBpcyBmb3VyIGJ5dGVzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgb3A7ICAgICAgICAgICAvKiBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIHRhYmxlIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgICAgICAgLyogYml0cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7ICAgICAgICAgLyogb2Zmc2V0IGluIHRhYmxlIG9yIGNvZGUgdmFsdWUgKi8KK30gY29kZTsKIAotdHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV9odWZ0X3MgRkFSIGluZmxhdGVfaHVmdDsKLQotc3RydWN0IGluZmxhdGVfaHVmdF9zIHsKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBCeXRlIEV4b3A7ICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyBvciBvcGVyYXRpb24gKi8KLSAgICAgIEJ5dGUgQml0czsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBzdWJjb2RlICovCi0gICAgfSB3aGF0OwotICAgIHVJbnQgcGFkOyAgICAgICAgICAgLyogcGFkIHN0cnVjdHVyZSB0byBhIHBvd2VyIG9mIDIgKDQgYnl0ZXMgZm9yICovCi0gIH0gd29yZDsgICAgICAgICAgICAgICAvKiAgMTYtYml0LCA4IGJ5dGVzIGZvciAzMi1iaXQgaW50J3MpICovCi0gIHVJbnQgYmFzZTsgICAgICAgICAgICAvKiBsaXRlcmFsLCBsZW5ndGggYmFzZSwgZGlzdGFuY2UgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRhYmxlIG9mZnNldCAqLwotfTsKKy8qIG9wIHZhbHVlcyBhcyBzZXQgYnkgaW5mbGF0ZV90YWJsZSgpOgorICAgIDAwMDAwMDAwIC0gbGl0ZXJhbAorICAgIDAwMDB0dHR0IC0gdGFibGUgbGluaywgdHR0dCAhPSAwIGlzIHRoZSBudW1iZXIgb2YgdGFibGUgaW5kZXggYml0cworICAgIDAwMDFlZWVlIC0gbGVuZ3RoIG9yIGRpc3RhbmNlLCBlZWVlIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cworICAgIDAxMTAwMDAwIC0gZW5kIG9mIGJsb2NrCisgICAgMDEwMDAwMDAgLSBpbnZhbGlkIGNvZGUKKyAqLwogCiAvKiBNYXhpbXVtIHNpemUgb2YgZHluYW1pYyB0cmVlLiAgVGhlIG1heGltdW0gZm91bmQgaW4gYSBsb25nIGJ1dCBub24tCi0gICBleGhhdXN0aXZlIHNlYXJjaCB3YXMgMTAwNCBodWZ0IHN0cnVjdHVyZXMgKDg1MCBmb3IgbGVuZ3RoL2xpdGVyYWxzCisgICBleGhhdXN0aXZlIHNlYXJjaCB3YXMgMTAwNCBjb2RlIHN0cnVjdHVyZXMgKDg1MCBmb3IgbGVuZ3RoL2xpdGVyYWxzCiAgICBhbmQgMTU0IGZvciBkaXN0YW5jZXMsIHRoZSBsYXR0ZXIgYWN0dWFsbHkgdGhlIHJlc3VsdCBvZiBhbgotICAgZXhoYXVzdGl2ZSBzZWFyY2gpLiAgVGhlIGFjdHVhbCBtYXhpbXVtIGlzIG5vdCBrbm93biwgYnV0IHRoZQotICAgdmFsdWUgYmVsb3cgaXMgbW9yZSB0aGFuIHNhZmUuICovCi0jZGVmaW5lIE1BTlkgMTQ0MAorICAgZXhoYXVzdGl2ZSBzZWFyY2gpLiAgVGhlIHRydWUgbWF4aW11bSBpcyBub3Qga25vd24sIGJ1dCB0aGUgdmFsdWUKKyAgIGJlbG93IGlzIG1vcmUgdGhhbiBzYWZlLiAqLworI2RlZmluZSBFTk9VR0ggMTQ0MAorI2RlZmluZSBNQVhEIDE1NAogCi1leHRlcm4gaW50IGluZmxhdGVfdHJlZXNfYml0cyBPRigoCi0gICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIDE5IGNvZGUgbGVuZ3RocyAqLwotICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIHRyZWUgZGVzaXJlZC9hY3R1YWwgZGVwdGggKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiBGQVIgKiwgICAgICAgLyogYml0cyB0cmVlIHJlc3VsdCAqLwotICAgIGluZmxhdGVfaHVmdCAqLCAgICAgICAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KLSAgICB6X3N0cmVhbXApKTsgICAgICAgICAgICAgICAgLyogZm9yIG1lc3NhZ2VzICovCisvKiBUeXBlIG9mIGNvZGUgdG8gYnVpbGQgZm9yIGluZnRhYmxlKCkgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQ09ERVMsCisgICAgTEVOUywKKyAgICBESVNUUworfSBjb2RldHlwZTsKIAotZXh0ZXJuIGludCBpbmZsYXRlX3RyZWVzX2R5bmFtaWMgT0YoKAotICAgIHVJbnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KLSAgICB1SW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCi0gICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIHRoYXQgbWFueSAodG90YWwpIGNvZGUgbGVuZ3RocyAqLwotICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiBGQVIgKiwgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiBGQVIgKiwgICAgICAgLyogZGlzdGFuY2UgdHJlZSByZXN1bHQgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiwgICAgICAgICAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCi0gICAgel9zdHJlYW1wKSk7ICAgICAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLwotCi1leHRlcm4gaW50IGluZmxhdGVfdHJlZXNfZml4ZWQgT0YoKAotICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiBGQVIgKiwgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiBGQVIgKiwgICAgICAgLyogZGlzdGFuY2UgdHJlZSByZXN1bHQgKi8KLSAgICB6X3N0cmVhbXApKTsgICAgICAgICAgICAgICAgLyogZm9yIG1lbW9yeSBhbGxvY2F0aW9uICovCitleHRlcm4gaW50IGluZmxhdGVfdGFibGUgT0YoKGNvZGV0eXBlIHR5cGUsIHVuc2lnbmVkIHNob3J0IEZBUiAqbGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29kZXMsIGNvZGUgKiBGQVIgKnRhYmxlLCB1bnNpZ25lZCAqYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrKSk7CmRpZmYgLS1naXQgYS9pbmZ1dGlsLmMgYi9pbmZ1dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDc2MjIuLjAwMDAwMDAKLS0tIGEvaW5mdXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyogaW5mbGF0ZV91dGlsLmMgLS0gZGF0YSBhbmQgcm91dGluZXMgY29tbW9uIHRvIGJsb2NrcyBhbmQgY29kZXMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mYmxvY2suaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotI2luY2x1ZGUgImluZmNvZGVzLmgiCi0jaW5jbHVkZSAiaW5mdXRpbC5oIgotCi1zdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KLQotLyogQW5kJ2luZyB3aXRoIG1hc2tbbl0gbWFza3MgdGhlIGxvd2VyIG4gYml0cyAqLwotdUludCBpbmZsYXRlX21hc2tbMTddID0gewotICAgIDB4MDAwMCwKLSAgICAweDAwMDEsIDB4MDAwMywgMHgwMDA3LCAweDAwMGYsIDB4MDAxZiwgMHgwMDNmLCAweDAwN2YsIDB4MDBmZiwKLSAgICAweDAxZmYsIDB4MDNmZiwgMHgwN2ZmLCAweDBmZmYsIDB4MWZmZiwgMHgzZmZmLCAweDdmZmYsIDB4ZmZmZgotfTsKLQotCi0vKiBjb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgc2xpZGluZyB3aW5kb3cgdG8gdGhlIG91dHB1dCBhcmVhICovCi1pbnQgaW5mbGF0ZV9mbHVzaChzLCB6LCByKQotaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOwotel9zdHJlYW1wIHo7Ci1pbnQgcjsKLXsKLSAgdUludCBuOwotICBCeXRlZiAqcDsKLSAgQnl0ZWYgKnE7Ci0KLSAgLyogbG9jYWwgY29waWVzIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KLSAgcCA9IHotPm5leHRfb3V0OwotICBxID0gcy0+cmVhZDsKLQotICAvKiBjb21wdXRlIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGFzIGZhciBhcyBlbmQgb2Ygd2luZG93ICovCi0gIG4gPSAodUludCkoKHEgPD0gcy0+d3JpdGUgPyBzLT53cml0ZSA6IHMtPmVuZCkgLSBxKTsKLSAgaWYgKG4gPiB6LT5hdmFpbF9vdXQpIG4gPSB6LT5hdmFpbF9vdXQ7Ci0gIGlmIChuICYmIHIgPT0gWl9CVUZfRVJST1IpIHIgPSBaX09LOwotCi0gIC8qIHVwZGF0ZSBjb3VudGVycyAqLwotICB6LT5hdmFpbF9vdXQgLT0gbjsKLSAgei0+dG90YWxfb3V0ICs9IG47Ci0KLSAgLyogdXBkYXRlIGNoZWNrIGluZm9ybWF0aW9uICovCi0gIGlmIChzLT5jaGVja2ZuICE9IFpfTlVMTCkKLSAgICB6LT5hZGxlciA9IHMtPmNoZWNrID0gKCpzLT5jaGVja2ZuKShzLT5jaGVjaywgcSwgbik7Ci0KLSAgLyogY29weSBhcyBmYXIgYXMgZW5kIG9mIHdpbmRvdyAqLwotICB6bWVtY3B5KHAsIHEsIG4pOwotICBwICs9IG47Ci0gIHEgKz0gbjsKLQotICAvKiBzZWUgaWYgbW9yZSB0byBjb3B5IGF0IGJlZ2lubmluZyBvZiB3aW5kb3cgKi8KLSAgaWYgKHEgPT0gcy0+ZW5kKQotICB7Ci0gICAgLyogd3JhcCBwb2ludGVycyAqLwotICAgIHEgPSBzLT53aW5kb3c7Ci0gICAgaWYgKHMtPndyaXRlID09IHMtPmVuZCkKLSAgICAgIHMtPndyaXRlID0gcy0+d2luZG93OwotCi0gICAgLyogY29tcHV0ZSBieXRlcyB0byBjb3B5ICovCi0gICAgbiA9ICh1SW50KShzLT53cml0ZSAtIHEpOwotICAgIGlmIChuID4gei0+YXZhaWxfb3V0KSBuID0gei0+YXZhaWxfb3V0OwotICAgIGlmIChuICYmIHIgPT0gWl9CVUZfRVJST1IpIHIgPSBaX09LOwotCi0gICAgLyogdXBkYXRlIGNvdW50ZXJzICovCi0gICAgei0+YXZhaWxfb3V0IC09IG47Ci0gICAgei0+dG90YWxfb3V0ICs9IG47Ci0KLSAgICAvKiB1cGRhdGUgY2hlY2sgaW5mb3JtYXRpb24gKi8KLSAgICBpZiAocy0+Y2hlY2tmbiAhPSBaX05VTEwpCi0gICAgICB6LT5hZGxlciA9IHMtPmNoZWNrID0gKCpzLT5jaGVja2ZuKShzLT5jaGVjaywgcSwgbik7Ci0KLSAgICAvKiBjb3B5ICovCi0gICAgem1lbWNweShwLCBxLCBuKTsKLSAgICBwICs9IG47Ci0gICAgcSArPSBuOwotICB9Ci0KLSAgLyogdXBkYXRlIHBvaW50ZXJzICovCi0gIHotPm5leHRfb3V0ID0gcDsKLSAgcy0+cmVhZCA9IHE7Ci0KLSAgLyogZG9uZSAqLwotICByZXR1cm4gcjsKLX0KZGlmZiAtLWdpdCBhL2luZnV0aWwuaCBiL2luZnV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwMWRmOC4uMDAwMDAwMAotLS0gYS9pbmZ1dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKiBpbmZ1dGlsLmggLS0gdHlwZXMgYW5kIG1hY3JvcyBjb21tb24gdG8gYmxvY2tzIGFuZCBjb2RlcwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotI2lmbmRlZiBfSU5GVVRJTF9ICi0jZGVmaW5lIF9JTkZVVElMX0gKLQotdHlwZWRlZiBlbnVtIHsKLSAgICAgIFRZUEUsICAgICAvKiBnZXQgdHlwZSBiaXRzICgzLCBpbmNsdWRpbmcgZW5kIGJpdCkgKi8KLSAgICAgIExFTlMsICAgICAvKiBnZXQgbGVuZ3RocyBmb3Igc3RvcmVkICovCi0gICAgICBTVE9SRUQsICAgLyogcHJvY2Vzc2luZyBzdG9yZWQgYmxvY2sgKi8KLSAgICAgIFRBQkxFLCAgICAvKiBnZXQgdGFibGUgbGVuZ3RocyAqLwotICAgICAgQlRSRUUsICAgIC8qIGdldCBiaXQgbGVuZ3RocyB0cmVlIGZvciBhIGR5bmFtaWMgYmxvY2sgKi8KLSAgICAgIERUUkVFLCAgICAvKiBnZXQgbGVuZ3RoLCBkaXN0YW5jZSB0cmVlcyBmb3IgYSBkeW5hbWljIGJsb2NrICovCi0gICAgICBDT0RFUywgICAgLyogcHJvY2Vzc2luZyBmaXhlZCBvciBkeW5hbWljIGJsb2NrICovCi0gICAgICBEUlksICAgICAgLyogb3V0cHV0IHJlbWFpbmluZyB3aW5kb3cgYnl0ZXMgKi8KLSAgICAgIERPTkUsICAgICAvKiBmaW5pc2hlZCBsYXN0IGJsb2NrLCBkb25lICovCi0gICAgICBCQUR9ICAgICAgLyogZ290IGEgZGF0YSBlcnJvci0tc3R1Y2sgaGVyZSAqLwotaW5mbGF0ZV9ibG9ja19tb2RlOwotCi0vKiBpbmZsYXRlIGJsb2NrcyBzZW1pLXByaXZhdGUgc3RhdGUgKi8KLXN0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB7Ci0KLSAgLyogbW9kZSAqLwotICBpbmZsYXRlX2Jsb2NrX21vZGUgIG1vZGU7ICAgICAvKiBjdXJyZW50IGluZmxhdGVfYmxvY2sgbW9kZSAqLwotCi0gIC8qIG1vZGUgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0gIHVuaW9uIHsKLSAgICB1SW50IGxlZnQ7ICAgICAgICAgIC8qIGlmIFNUT1JFRCwgYnl0ZXMgbGVmdCB0byBjb3B5ICovCi0gICAgc3RydWN0IHsKLSAgICAgIHVJbnQgdGFibGU7ICAgICAgICAgICAgICAgLyogdGFibGUgbGVuZ3RocyAoMTQgYml0cykgKi8KLSAgICAgIHVJbnQgaW5kZXg7ICAgICAgICAgICAgICAgLyogaW5kZXggaW50byBibGVucyAob3IgYm9yZGVyKSAqLwotICAgICAgdUludGYgKmJsZW5zOyAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBjb2RlcyAqLwotICAgICAgdUludCBiYjsgICAgICAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RoIHRyZWUgZGVwdGggKi8KLSAgICAgIGluZmxhdGVfaHVmdCAqdGI7ICAgICAgICAgLyogYml0IGxlbmd0aCBkZWNvZGluZyB0cmVlICovCi0gICAgfSB0cmVlczsgICAgICAgICAgICAvKiBpZiBEVFJFRSwgZGVjb2RpbmcgaW5mbyBmb3IgdHJlZXMgKi8KLSAgICBzdHJ1Y3QgewotICAgICAgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgCi0gICAgICAgICAqY29kZXM7Ci0gICAgfSBkZWNvZGU7ICAgICAgICAgICAvKiBpZiBDT0RFUywgY3VycmVudCBzdGF0ZSAqLwotICB9IHN1YjsgICAgICAgICAgICAgICAgLyogc3VibW9kZSAqLwotICB1SW50IGxhc3Q7ICAgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrICovCi0KLSAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICB1SW50IGJpdGs7ICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCi0gIHVMb25nIGJpdGI7ICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIGluZmxhdGVfaHVmdCAqaHVmdHM7ICAvKiBzaW5nbGUgbWFsbG9jIGZvciB0cmVlIHNwYWNlICovCi0gIEJ5dGVmICp3aW5kb3c7ICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLwotICBCeXRlZiAqZW5kOyAgICAgICAgICAgLyogb25lIGJ5dGUgYWZ0ZXIgc2xpZGluZyB3aW5kb3cgKi8KLSAgQnl0ZWYgKnJlYWQ7ICAgICAgICAgIC8qIHdpbmRvdyByZWFkIHBvaW50ZXIgKi8KLSAgQnl0ZWYgKndyaXRlOyAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBwb2ludGVyICovCi0gIGNoZWNrX2Z1bmMgY2hlY2tmbjsgICAvKiBjaGVjayBmdW5jdGlvbiAqLwotICB1TG9uZyBjaGVjazsgICAgICAgICAgLyogY2hlY2sgb24gb3V0cHV0ICovCi0KLX07Ci0KLQotLyogZGVmaW5lcyBmb3IgaW5mbGF0ZSBpbnB1dC9vdXRwdXQgKi8KLS8qICAgdXBkYXRlIHBvaW50ZXJzIGFuZCByZXR1cm4gKi8KLSNkZWZpbmUgVVBEQklUUyB7cy0+Yml0Yj1iO3MtPmJpdGs9azt9Ci0jZGVmaW5lIFVQRElOIHt6LT5hdmFpbF9pbj1uO3otPnRvdGFsX2luKz1wLXotPm5leHRfaW47ei0+bmV4dF9pbj1wO30KLSNkZWZpbmUgVVBET1VUIHtzLT53cml0ZT1xO30KLSNkZWZpbmUgVVBEQVRFIHtVUERCSVRTIFVQRElOIFVQRE9VVH0KLSNkZWZpbmUgTEVBVkUge1VQREFURSByZXR1cm4gaW5mbGF0ZV9mbHVzaChzLHoscik7fQotLyogICBnZXQgYnl0ZXMgYW5kIGJpdHMgKi8KLSNkZWZpbmUgTE9BRElOIHtwPXotPm5leHRfaW47bj16LT5hdmFpbF9pbjtiPXMtPmJpdGI7az1zLT5iaXRrO30KLSNkZWZpbmUgTkVFREJZVEUge2lmKG4pcj1aX09LO2Vsc2UgTEVBVkV9Ci0jZGVmaW5lIE5FWFRCWVRFIChuLS0sKnArKykKLSNkZWZpbmUgTkVFREJJVFMoaikge3doaWxlKGs8KGopKXtORUVEQllURTtifD0oKHVMb25nKU5FWFRCWVRFKTw8aztrKz04O319Ci0jZGVmaW5lIERVTVBCSVRTKGopIHtiPj49KGopO2stPShqKTt9Ci0vKiAgIG91dHB1dCBieXRlcyAqLwotI2RlZmluZSBXQVZBSUwgKHVJbnQpKHE8cy0+cmVhZD9zLT5yZWFkLXEtMTpzLT5lbmQtcSkKLSNkZWZpbmUgTE9BRE9VVCB7cT1zLT53cml0ZTttPSh1SW50KVdBVkFJTDt9Ci0jZGVmaW5lIFdSQVAge2lmKHE9PXMtPmVuZCYmcy0+cmVhZCE9cy0+d2luZG93KXtxPXMtPndpbmRvdzttPSh1SW50KVdBVkFJTDt9fQotI2RlZmluZSBGTFVTSCB7VVBET1VUIHI9aW5mbGF0ZV9mbHVzaChzLHoscik7IExPQURPVVR9Ci0jZGVmaW5lIE5FRURPVVQge2lmKG09PTApe1dSQVAgaWYobT09MCl7RkxVU0ggV1JBUCBpZihtPT0wKSBMRUFWRX19cj1aX09LO30KLSNkZWZpbmUgT1VUQllURShhKSB7KnErKz0oQnl0ZSkoYSk7bS0tO30KLS8qICAgbG9hZCBsb2NhbCBwb2ludGVycyAqLwotI2RlZmluZSBMT0FEIHtMT0FESU4gTE9BRE9VVH0KLQotLyogbWFza3MgZm9yIGxvd2VyIGJpdHMgKHNpemUgZ2l2ZW4gdG8gYXZvaWQgc2lsbHkgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrKSAqLwotZXh0ZXJuIHVJbnQgaW5mbGF0ZV9tYXNrWzE3XTsKLQotLyogY29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIHNsaWRpbmcgd2luZG93IHRvIHRoZSBvdXRwdXQgYXJlYSAqLwotZXh0ZXJuIGludCBpbmZsYXRlX2ZsdXNoIE9GKCgKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbXAgLAotICAgIGludCkpOwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgICAgICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tYWtldHJlZS5jIGIvbWFrZXRyZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2ZDRiMS4uMDAwMDAwMAotLS0gYS9tYWtldHJlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogbWFrZXRyZWUuYyAtLSBtYWtlIGluZmZpeGVkLmggdGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBUaGlzIHByb2dyYW0gaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgY29tcGxldGVuZXNzLgotICAgWW91IGRvIG5vdCBuZWVkIHRvIGNvbXBpbGUgb3IgcnVuIHRoaXMgcHJvZ3JhbSBzaW5jZSBpbmZmaXhlZC5oCi0gICBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24uICBUbyB1c2UgdGhpcyBwcm9ncmFtCi0gICB5b3UgbmVlZCB0byBjb21waWxlIHpsaWIgd2l0aCBCVUlMREZJWEVEIGRlZmluZWQgYW5kIHRoZW4gY29tcGlsZQotICAgYW5kIGxpbmsgdGhpcyBwcm9ncmFtIHdpdGggdGhlIHpsaWIgbGlicmFyeS4gIFRoZW4gdGhlIG91dHB1dCBvZgotICAgdGhpcyBwcm9ncmFtIGNhbiBiZSBwaXBlZCB0byBpbmZmaXhlZC5oLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJ6dXRpbC5oIgotI2luY2x1ZGUgImluZnRyZWVzLmgiCi0KLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cwotCi0vKiBnZW5lcmF0ZSBpbml0aWFsaXphdGlvbiB0YWJsZSBmb3IgYW4gaW5mbGF0ZV9odWZ0IHN0cnVjdHVyZSBhcnJheSAqLwotdm9pZCBtYWtldHJlZSh1SW50IGIsIGluZmxhdGVfaHVmdCAqdCkKLXsKLSAgaW50IGksIGU7Ci0KLSAgaSA9IDA7Ci0gIHdoaWxlICgxKQotICB7Ci0gICAgZSA9IHRbaV0uZXhvcDsKLSAgICBpZiAoZSAmJiAoZSAmICgxNis2NCkpID09IDApICAgICAgICAvKiB0YWJsZSBwb2ludGVyICovCi0gICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtldHJlZTogY2Fubm90IGluaXRpYWxpemUgc3ViLXRhYmxlcyFcbiIpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgaWYgKGkgJSA0ID09IDApCi0gICAgICBwcmludGYoIlxuICAgIik7Ci0gICAgcHJpbnRmKCIge3t7JXUsJXV9fSwldX0iLCB0W2ldLmV4b3AsIHRbaV0uYml0cywgdFtpXS5iYXNlKTsKLSAgICBpZiAoKytpID09ICgxPDxiKSkKLSAgICAgIGJyZWFrOwotICAgIHB1dGNoYXIoJywnKTsKLSAgfQotICBwdXRzKCIiKTsKLX0KLQotLyogY3JlYXRlIHRoZSBmaXhlZCB0YWJsZXMgaW4gQyBpbml0aWFsaXphdGlvbiBzeW50YXggKi8KLXZvaWQgbWFpbih2b2lkKQotewotICBpbnQgcjsKLSAgdUludCBibCwgYmQ7Ci0gIGluZmxhdGVfaHVmdCAqdGwsICp0ZDsKLSAgel9zdHJlYW0gejsKLQotICB6LnphbGxvYyA9IHpjYWxsb2M7Ci0gIHoub3BhcXVlID0gKHZvaWRwZikwOwotICB6LnpmcmVlID0gemNmcmVlOwotICByID0gaW5mbGF0ZV90cmVlc19maXhlZCgmYmwsICZiZCwgJnRsLCAmdGQsICZ6KTsKLSAgaWYgKHIpCi0gIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImluZmxhdGVfdHJlZXNfZml4ZWQgZXJyb3IgJWRcbiIsIHIpOwotICAgIHJldHVybjsKLSAgfQotICBwdXRzKCIvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcyIpOwotICBwdXRzKCIgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgbWFrZXRyZWUuYyBwcm9ncmFtIik7Ci0gIHB1dHMoIiAqLyIpOwotICBwdXRzKCIiKTsKLSAgcHV0cygiLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMiKTsKLSAgcHV0cygiICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzIik7Ci0gIHB1dHMoIiAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4iKTsKLSAgcHV0cygiICovIik7Ci0gIHB1dHMoIiIpOwotICBwcmludGYoImxvY2FsIHVJbnQgZml4ZWRfYmwgPSAlZDtcbiIsIGJsKTsKLSAgcHJpbnRmKCJsb2NhbCB1SW50IGZpeGVkX2JkID0gJWQ7XG4iLCBiZCk7Ci0gIHByaW50ZigibG9jYWwgaW5mbGF0ZV9odWZ0IGZpeGVkX3RsW10gPSB7Iik7Ci0gIG1ha2V0cmVlKGJsLCB0bCk7Ci0gIHB1dHMoIiAgfTsiKTsKLSAgcHJpbnRmKCJsb2NhbCBpbmZsYXRlX2h1ZnQgZml4ZWRfdGRbXSA9IHsiKTsKLSAgbWFrZXRyZWUoYmQsIHRkKTsKLSAgcHV0cygiICB9OyIpOwotfQpkaWZmIC0tZ2l0IGEvTWFrZV92bXMuY29tIGIvb2xkL01ha2Vfdm1zLmNvbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZV92bXMuY29tCnJlbmFtZSB0byBvbGQvTWFrZV92bXMuY29tCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5yaXNjb3MgYi9vbGQvTWFrZWZpbGUucmlzY29zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBNYWtlZmlsZS5yaXNjb3MKcmVuYW1lIHRvIG9sZC9NYWtlZmlsZS5yaXNjb3MKZGlmZiAtLWdpdCBhL29sZC9SRUFETUUgYi9vbGQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOWNkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9vbGQvUkVBRE1FCkBAIC0wLDAgKzEsMyBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZmlsZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHVwZGF0ZWQgZm9yIHpsaWIgMS4yLjAuCisKKyhWb2x1bnRlZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGhlbHAgY2xlYW4gdGhpcyB1cC4gIFRoYW5rcy4pCmRpZmYgLS1naXQgYS9hbWlnYS9NYWtlZmlsZS5wdXAgYi9vbGQvYW1pZ2EvTWFrZWZpbGUucHVwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhbWlnYS9NYWtlZmlsZS5wdXAKcmVuYW1lIHRvIG9sZC9hbWlnYS9NYWtlZmlsZS5wdXAKZGlmZiAtLWdpdCBhL2FtaWdhL01ha2VmaWxlLnNhcyBiL29sZC9hbWlnYS9NYWtlZmlsZS5zYXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFtaWdhL01ha2VmaWxlLnNhcwpyZW5hbWUgdG8gb2xkL2FtaWdhL01ha2VmaWxlLnNhcwpkaWZmIC0tZ2l0IGEvZGVzY3JpcC5tbXMgYi9vbGQvZGVzY3JpcC5tbXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRlc2NyaXAubW1zCnJlbmFtZSB0byBvbGQvZGVzY3JpcC5tbXMKZGlmZiAtLWdpdCBhL21zZG9zL01ha2VmaWxlLmIzMiBiL29sZC9tc2Rvcy9NYWtlZmlsZS5iMzIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1zZG9zL01ha2VmaWxlLmIzMgpyZW5hbWUgdG8gb2xkL21zZG9zL01ha2VmaWxlLmIzMgpkaWZmIC0tZ2l0IGEvbXNkb3MvTWFrZWZpbGUuYm9yIGIvb2xkL21zZG9zL01ha2VmaWxlLmJvcgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbXNkb3MvTWFrZWZpbGUuYm9yCnJlbmFtZSB0byBvbGQvbXNkb3MvTWFrZWZpbGUuYm9yCmRpZmYgLS1naXQgYS9tc2Rvcy9NYWtlZmlsZS5kajIgYi9vbGQvbXNkb3MvTWFrZWZpbGUuZGoyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtc2Rvcy9NYWtlZmlsZS5kajIKcmVuYW1lIHRvIG9sZC9tc2Rvcy9NYWtlZmlsZS5kajIKZGlmZiAtLWdpdCBhL21zZG9zL01ha2VmaWxlLmVteCBiL29sZC9tc2Rvcy9NYWtlZmlsZS5lbXgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1zZG9zL01ha2VmaWxlLmVteApyZW5hbWUgdG8gb2xkL21zZG9zL01ha2VmaWxlLmVteApkaWZmIC0tZ2l0IGEvbXNkb3MvTWFrZWZpbGUubXNjIGIvb2xkL21zZG9zL01ha2VmaWxlLm1zYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbXNkb3MvTWFrZWZpbGUubXNjCnJlbmFtZSB0byBvbGQvbXNkb3MvTWFrZWZpbGUubXNjCmRpZmYgLS1naXQgYS9tc2Rvcy9NYWtlZmlsZS50YyBiL29sZC9tc2Rvcy9NYWtlZmlsZS50YwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbXNkb3MvTWFrZWZpbGUudGMKcmVuYW1lIHRvIG9sZC9tc2Rvcy9NYWtlZmlsZS50YwpkaWZmIC0tZ2l0IGEvbXNkb3MvTWFrZWZpbGUudzMyIGIvb2xkL21zZG9zL01ha2VmaWxlLnczMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbXNkb3MvTWFrZWZpbGUudzMyCnJlbmFtZSB0byBvbGQvbXNkb3MvTWFrZWZpbGUudzMyCmRpZmYgLS1naXQgYS9tc2Rvcy9NYWtlZmlsZS53YXQgYi9vbGQvbXNkb3MvTWFrZWZpbGUud2F0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtc2Rvcy9NYWtlZmlsZS53YXQKcmVuYW1lIHRvIG9sZC9tc2Rvcy9NYWtlZmlsZS53YXQKZGlmZiAtLWdpdCBhL21zZG9zL3psaWIuZGVmIGIvb2xkL21zZG9zL3psaWIuZGVmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtc2Rvcy96bGliLmRlZgpyZW5hbWUgdG8gb2xkL21zZG9zL3psaWIuZGVmCmRpZmYgLS1naXQgYS9tc2Rvcy96bGliLnJjIGIvb2xkL21zZG9zL3psaWIucmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1zZG9zL3psaWIucmMKcmVuYW1lIHRvIG9sZC9tc2Rvcy96bGliLnJjCmRpZmYgLS1naXQgYS9udC9NYWtlZmlsZS5lbXggYi9vbGQvbnQvTWFrZWZpbGUuZW14CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBudC9NYWtlZmlsZS5lbXgKcmVuYW1lIHRvIG9sZC9udC9NYWtlZmlsZS5lbXgKZGlmZiAtLWdpdCBhL250L01ha2VmaWxlLmdjYyBiL29sZC9udC9NYWtlZmlsZS5nY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG50L01ha2VmaWxlLmdjYwpyZW5hbWUgdG8gb2xkL250L01ha2VmaWxlLmdjYwpkaWZmIC0tZ2l0IGEvbnQvTWFrZWZpbGUubnQgYi9vbGQvbnQvTWFrZWZpbGUubnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG50L01ha2VmaWxlLm50CnJlbmFtZSB0byBvbGQvbnQvTWFrZWZpbGUubnQKZGlmZiAtLWdpdCBhL250L3psaWIuZG50IGIvb2xkL250L3psaWIuZG50CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBudC96bGliLmRudApyZW5hbWUgdG8gb2xkL250L3psaWIuZG50CmRpZmYgLS1naXQgYS9vczIvTWFrZWZpbGUub3MyIGIvb2xkL29zMi9NYWtlZmlsZS5vczIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9zMi9NYWtlZmlsZS5vczIKcmVuYW1lIHRvIG9sZC9vczIvTWFrZWZpbGUub3MyCmRpZmYgLS1naXQgYS9vczIvemxpYi5kZWYgYi9vbGQvb3MyL3psaWIuZGVmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBvczIvemxpYi5kZWYKcmVuYW1lIHRvIG9sZC9vczIvemxpYi5kZWYKZGlmZiAtLWdpdCBhL3psaWIuMyBiL29sZC96bGliLjMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHpsaWIuMwpyZW5hbWUgdG8gb2xkL3psaWIuMwpkaWZmIC0tZ2l0IGEvemxpYi5odG1sIGIvb2xkL3psaWIuaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gemxpYi5odG1sCnJlbmFtZSB0byBvbGQvemxpYi5odG1sCmRpZmYgLS1naXQgYS90cmVlcy5jIGIvdHJlZXMuYwppbmRleCAwYTk4NDA1Li5mN2Y0YTg0IDEwMDY0NAotLS0gYS90cmVlcy5jCisrKyBiL3RyZWVzLmMKQEAgLTEsNSArMSw1IEBACiAvKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5CiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAogICovCiAKQEAgLTIzMCw3ICsyMzAsNiBAQAogI2VuZGlmIC8qIERFQlVHICovCiAKIAotI2RlZmluZSBNQVgoYSxiKSAoYSA+PSBiID8gYSA6IGIpCiAvKiB0aGUgYXJndW1lbnRzIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzICovCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNjc1LDcgKzY3NCw4IEBACiAKICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi8KICAgICAgICAgdHJlZVtub2RlXS5GcmVxID0gdHJlZVtuXS5GcmVxICsgdHJlZVttXS5GcmVxOwotICAgICAgICBzLT5kZXB0aFtub2RlXSA9ICh1Y2gpIChNQVgocy0+ZGVwdGhbbl0sIHMtPmRlcHRoW21dKSArIDEpOworICAgICAgICBzLT5kZXB0aFtub2RlXSA9ICh1Y2gpKChzLT5kZXB0aFtuXSA+PSBzLT5kZXB0aFttXSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlcHRoW25dIDogcy0+ZGVwdGhbbV0pICsgMSk7CiAgICAgICAgIHRyZWVbbl0uRGFkID0gdHJlZVttXS5EYWQgPSAodXNoKW5vZGU7CiAjaWZkZWYgRFVNUF9CTF9UUkVFCiAgICAgICAgIGlmICh0cmVlID09IHMtPmJsX3RyZWUpIHsKQEAgLTk1MCw3ICs5NTAsNyBAQAogCSAqLwogCW1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTsKIAotCS8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSBmaXJzdCB0aGUgYmxvY2sgbGVuZ3RoIGluIGJ5dGVzKi8KKyAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqLwogCW9wdF9sZW5iID0gKHMtPm9wdF9sZW4rMys3KT4+MzsKIAlzdGF0aWNfbGVuYiA9IChzLT5zdGF0aWNfbGVuKzMrNyk+PjM7CiAKZGlmZiAtLWdpdCBhL3VuY29tcHIuYyBiL3VuY29tcHIuYwppbmRleCBhMjg3NzE0Li5lNGU1MmNlIDEwMDY0NAotLS0gYS91bmNvbXByLmMKKysrIGIvdW5jb21wci5jCkBAIC0xLDUgKzEsNSBAQAogLyogdW5jb21wci5jIC0tIGRlY29tcHJlc3MgYSBtZW1vcnkgYnVmZmVyCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCiAgKi8KIApAQCAtNDksNyArNDksOSBAQAogICAgIGVyciA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOwogICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgIGluZmxhdGVFbmQoJnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBlcnIgPT0gWl9PSyA/IFpfQlVGX0VSUk9SIDogZXJyOworICAgICAgICBpZiAoZXJyID09IFpfTkVFRF9ESUNUIHx8IChlcnIgPT0gWl9CVUZfRVJST1IgJiYgc3RyZWFtLmF2YWlsX2luID09IDApKQorICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAgICAgKmRlc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OwogCmRpZmYgLS1naXQgYS96Y29uZi5oIGIvemNvbmYuaAppbmRleCBlYjBhZTJlLi44ZWY4NDVlIDEwMDY0NAotLS0gYS96Y29uZi5oCisrKyBiL3pjb25mLmgKQEAgLTEsNiArMSw2IEBACiAvKiB6Y29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKIC8qIEAoIykgJElkJCAqLwpAQCAtMTMsMzkgKzEzLDQyIEBACiAgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KICAqLwogI2lmZGVmIFpfUFJFRklYCi0jICBkZWZpbmUgZGVmbGF0ZUluaXRfCXpfZGVmbGF0ZUluaXRfCi0jICBkZWZpbmUgZGVmbGF0ZQl6X2RlZmxhdGUKLSMgIGRlZmluZSBkZWZsYXRlRW5kCXpfZGVmbGF0ZUVuZAotIyAgZGVmaW5lIGluZmxhdGVJbml0XyAJel9pbmZsYXRlSW5pdF8KLSMgIGRlZmluZSBpbmZsYXRlCXpfaW5mbGF0ZQotIyAgZGVmaW5lIGluZmxhdGVFbmQJel9pbmZsYXRlRW5kCi0jICBkZWZpbmUgZGVmbGF0ZUluaXQyXwl6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gIHpfZGVmbGF0ZUluaXRfCisjICBkZWZpbmUgZGVmbGF0ZSAgICAgICB6X2RlZmxhdGUKKyMgIGRlZmluZSBkZWZsYXRlRW5kICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgel9pbmZsYXRlSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlICAgICAgIHpfaW5mbGF0ZQorIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgZGVmbGF0ZUluaXQyXyB6X2RlZmxhdGVJbml0Ml8KICMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5Ci0jICBkZWZpbmUgZGVmbGF0ZUNvcHkJel9kZWZsYXRlQ29weQotIyAgZGVmaW5lIGRlZmxhdGVSZXNldAl6X2RlZmxhdGVSZXNldAotIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMJel9kZWZsYXRlUGFyYW1zCi0jICBkZWZpbmUgaW5mbGF0ZUluaXQyXwl6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlQ29weSAgIHpfZGVmbGF0ZUNvcHkKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgIHpfZGVmbGF0ZVJlc2V0CisjICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyB6X2RlZmxhdGVQYXJhbXMKKyMgIGRlZmluZSBkZWZsYXRlQm91bmQgIHpfZGVmbGF0ZUJvdW5kCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyB6X2luZmxhdGVJbml0Ml8KICMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSB6X2luZmxhdGVTZXREaWN0aW9uYXJ5Ci0jICBkZWZpbmUgaW5mbGF0ZVN5bmMJel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgel9pbmZsYXRlU3luYwogIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgel9pbmZsYXRlU3luY1BvaW50Ci0jICBkZWZpbmUgaW5mbGF0ZVJlc2V0CXpfaW5mbGF0ZVJlc2V0Ci0jICBkZWZpbmUgY29tcHJlc3MJel9jb21wcmVzcwotIyAgZGVmaW5lIGNvbXByZXNzMgl6X2NvbXByZXNzMgotIyAgZGVmaW5lIHVuY29tcHJlc3MJel91bmNvbXByZXNzCi0jICBkZWZpbmUgYWRsZXIzMgl6X2FkbGVyMzIKLSMgIGRlZmluZSBjcmMzMgkJel9jcmMzMgorIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgel9pbmZsYXRlUmVzZXQKKyMgIGRlZmluZSBjb21wcmVzcyAgICAgIHpfY29tcHJlc3MKKyMgIGRlZmluZSBjb21wcmVzczIgICAgIHpfY29tcHJlc3MyCisjICBkZWZpbmUgY29tcHJlc3NCb3VuZCB6X2NvbXByZXNzQm91bmQKKyMgIGRlZmluZSB1bmNvbXByZXNzICAgIHpfdW5jb21wcmVzcworIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgY3JjMzIgICAgICAgICB6X2NyYzMyCiAjICBkZWZpbmUgZ2V0X2NyY190YWJsZSB6X2dldF9jcmNfdGFibGUKIAotIyAgZGVmaW5lIEJ5dGUJCXpfQnl0ZQotIyAgZGVmaW5lIHVJbnQJCXpfdUludAotIyAgZGVmaW5lIHVMb25nCQl6X3VMb25nCi0jICBkZWZpbmUgQnl0ZWYJICAgICAgICB6X0J5dGVmCi0jICBkZWZpbmUgY2hhcmYJCXpfY2hhcmYKLSMgIGRlZmluZSBpbnRmCQl6X2ludGYKLSMgIGRlZmluZSB1SW50ZgkJel91SW50ZgotIyAgZGVmaW5lIHVMb25nZgl6X3VMb25nZgotIyAgZGVmaW5lIHZvaWRwZgl6X3ZvaWRwZgotIyAgZGVmaW5lIHZvaWRwCQl6X3ZvaWRwCisjICBkZWZpbmUgQnl0ZSAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSB1SW50ICAgICAgICAgIHpfdUludAorIyAgZGVmaW5lIHVMb25nICAgICAgICAgel91TG9uZworIyAgZGVmaW5lIEJ5dGVmICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGNoYXJmICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGludGYgICAgICAgICAgel9pbnRmCisjICBkZWZpbmUgdUludGYgICAgICAgICB6X3VJbnRmCisjICBkZWZpbmUgdUxvbmdmICAgICAgICB6X3VMb25nZgorIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgel92b2lkcGYKKyMgIGRlZmluZSB2b2lkcCAgICAgICAgIHpfdm9pZHAKICNlbmRpZgogCiAjaWYgKGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpICYmICFkZWZpbmVkKFdJTjMyKQpAQCAtODAsOSArODMsMTUgQEAKICMgIGVuZGlmCiAjZW5kaWYKIAorI2lmIGRlZmluZWQgX19IT1NfQUlYX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorI2VuZGlmCisKICNpZm5kZWYgU1REQwogIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLwotIyAgICBkZWZpbmUgY29uc3QKKyMgICAgZGVmaW5lIGNvbnN0CS8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCiAjICBlbmRpZgogI2VuZGlmCiAKQEAgLTIxMCw3ICsyMTksNyBAQAogIyAgIGRlZmluZSBGQVIKICNlbmRpZgogCi0jaWYgIWRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKFRBUkdFVF9PU19NQUMpCisjaWYgIWRlZmluZWQoX19NQUNUWVBFU19fKQogdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCiAjZW5kaWYKIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwpAQCAtMjI4LDE0ICsyMzcsMTYgQEAKIHR5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKIAogI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOwogICAgdHlwZWRlZiB2b2lkIEZBUiAqdm9pZHBmOwogICAgdHlwZWRlZiB2b2lkICAgICAqdm9pZHA7CiAjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CiAgICB0eXBlZGVmIEJ5dGUgRkFSICp2b2lkcGY7CiAgICB0eXBlZGVmIEJ5dGUgICAgICp2b2lkcDsKICNlbmRpZgogCi0jaWZkZWYgSEFWRV9VTklTVERfSAorI2lmIDAJLyogSEFWRV9VTklTVERfSCAtLSB0aGlzIGxpbmUgaXMgdXBkYXRlZCBieSAuL2NvbmZpZ3VyZSAqLwogIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLwogIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgIC8qIGZvciBTRUVLXyogYW5kIG9mZl90ICovCiAjICBkZWZpbmUgel9vZmZfdCAgb2ZmX3QKQEAgLTI1NCwyNiArMjY1LDE2IEBACiAjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQogIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQogIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCiAjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQogIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQogIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQogIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQogIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX2Jsb2NrcywiSU5CTCIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX2Jsb2Nrc19uZXcsIklOQkxORSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX2Jsb2Nrc19mcmVlLCJJTkJMRlIiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9ibG9ja3NfcmVzZXQsIklOQkxSRSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvZGVzX2ZyZWUsIklOQ09GUiIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvZGVzLCJJTkNPIikKKyMgICBwcmFnbWEgbWFwKGNvbXByZXNzQm91bmQsIkNNQk5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCiAjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mbHVzaCwiSU5GTFUiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9tYXNrLCJJTk1BIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVfc2V0X2RpY3Rpb25hcnksIklOU0VESTIiKQogIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2JpdHMsIklOVFJCSSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2R5bmFtaWMsIklOVFJEWSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2ZpeGVkLCJJTlRSRkkiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90cmVlc19mcmVlLCJJTlRSRlIiKQogI2VuZGlmCiAKICNlbmRpZiAvKiBfWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvemNvbmYuaW4uaCBiL3pjb25mLmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmODQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3pjb25mLmluLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaWZuZGVmIF9aQ09ORl9ICisjZGVmaW5lIF9aQ09ORl9ICisKKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqLworI2lmZGVmIFpfUFJFRklYCisjICBkZWZpbmUgZGVmbGF0ZUluaXRfICB6X2RlZmxhdGVJbml0XworIyAgZGVmaW5lIGRlZmxhdGUgICAgICAgel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICB6X2RlZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gIHpfaW5mbGF0ZUluaXRfCisjICBkZWZpbmUgaW5mbGF0ZSAgICAgICB6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgIHpfaW5mbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgel9kZWZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zIHpfZGVmbGF0ZVBhcmFtcworIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgel9kZWZsYXRlQm91bmQKKyMgIGRlZmluZSBpbmZsYXRlSW5pdDJfIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5IHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBpbmZsYXRlU3luYyAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50IHpfaW5mbGF0ZVN5bmNQb2ludAorIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgel9pbmZsYXRlUmVzZXQKKyMgIGRlZmluZSBjb21wcmVzcyAgICAgIHpfY29tcHJlc3MKKyMgIGRlZmluZSBjb21wcmVzczIgICAgIHpfY29tcHJlc3MyCisjICBkZWZpbmUgY29tcHJlc3NCb3VuZCB6X2NvbXByZXNzQm91bmQKKyMgIGRlZmluZSB1bmNvbXByZXNzICAgIHpfdW5jb21wcmVzcworIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgY3JjMzIgICAgICAgICB6X2NyYzMyCisjICBkZWZpbmUgZ2V0X2NyY190YWJsZSB6X2dldF9jcmNfdGFibGUKKworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgel9CeXRlCisjICBkZWZpbmUgdUludCAgICAgICAgICB6X3VJbnQKKyMgIGRlZmluZSB1TG9uZyAgICAgICAgIHpfdUxvbmcKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgIHpfY2hhcmYKKyMgIGRlZmluZSBpbnRmICAgICAgICAgIHpfaW50ZgorIyAgZGVmaW5lIHVJbnRmICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nZiAgICAgICAgel91TG9uZ2YKKyMgIGRlZmluZSB2b2lkcGYgICAgICAgIHpfdm9pZHBmCisjICBkZWZpbmUgdm9pZHAgICAgICAgICB6X3ZvaWRwCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pKSAmJiAhZGVmaW5lZChXSU4zMikKKyMgIGRlZmluZSBXSU4zMgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfXzM4Nl9fKSB8fCBkZWZpbmVkKGkzODYpCisjICBpZm5kZWYgX18zMkJJVF9fCisjICAgIGRlZmluZSBfXzMyQklUX18KKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCisjICBkZWZpbmUgTVNET1MKKyNlbmRpZgorCisvKgorICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKKyAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KKyAqLworI2lmIGRlZmluZWQoTVNET1MpICYmICFkZWZpbmVkKF9fMzJCSVRfXykKKyMgIGRlZmluZSBNQVhTRUdfNjRLCisjZW5kaWYKKyNpZmRlZiBNU0RPUworIyAgZGVmaW5lIFVOQUxJR05FRF9PSworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChfV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpICAmJiAhZGVmaW5lZChTVERDKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19PUzJfXykKKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fSE9TX0FJWF9fCisjICBpZm5kZWYgU1REQworIyAgICBkZWZpbmUgU1REQworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0CS8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSB8fCBkZWZpbmVkKGFwcGxlYykgfHxkZWZpbmVkKFRISU5LX0MpIHx8ZGVmaW5lZChfX1NDX18pCisjICBkZWZpbmUgTk9fRFVNTVlfREVDTAorI2VuZGlmCisKKy8qIE9sZCBCb3JsYW5kIEMgaW5jb3JyZWN0bHkgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcmV0dXJuczogKi8KKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTAwKQorIyAgZGVmaW5lIE5FRURfRFVNTVlfUkVUVVJOCisjZW5kaWYKKworCisvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KKyNpZm5kZWYgTUFYX01FTV9MRVZFTAorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA4CisjICBlbHNlCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3Igd2luZG93Qml0cyBpbiBkZWZsYXRlSW5pdDIgYW5kIGluZmxhdGVJbml0Mi4KKyAqIFdBUk5JTkc6IHJlZHVjaW5nIE1BWF9XQklUUyBtYWtlcyBtaW5pZ3ppcCB1bmFibGUgdG8gZXh0cmFjdCAuZ3ogZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZ3ppcC4gKEZpbGVzIGNyZWF0ZWQgYnkgbWluaWd6aXAgY2FuIHN0aWxsIGJlIGV4dHJhY3RlZCBieQorICogZ3ppcC4pCisgKi8KKyNpZm5kZWYgTUFYX1dCSVRTCisjICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCisjZW5kaWYKKworLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CisgICAgICAgICAgICAoMSA8PCAod2luZG93Qml0cysyKSkgKyAgKDEgPDwgKG1lbUxldmVsKzkpKQorIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHM9MTUgICsgIDEyOEsgZm9yIG1lbUxldmVsID0gOCAgKGRlZmF1bHQgdmFsdWVzKQorIHBsdXMgYSBmZXcga2lsb2J5dGVzIGZvciBzbWFsbCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVkdWNlCisgdGhlIGRlZmF1bHQgbWVtb3J5IHJlcXVpcmVtZW50cyBmcm9tIDI1NksgdG8gMTI4SywgY29tcGlsZSB3aXRoCisgICAgIG1ha2UgQ0ZMQUdTPSItTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NyIKKyBPZiBjb3Vyc2UgdGhpcyB3aWxsIGdlbmVyYWxseSBkZWdyYWRlIGNvbXByZXNzaW9uICh0aGVyZSdzIG5vIGZyZWUgbHVuY2gpLgorCisgICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5mbGF0ZSBhcmUgKGluIGJ5dGVzKSAxIDw8IHdpbmRvd0JpdHMKKyB0aGF0IGlzLCAzMksgZm9yIHdpbmRvd0JpdHM9MTUgKGRlZmF1bHQgdmFsdWUpIHBsdXMgYSBmZXcga2lsb2J5dGVzCisgZm9yIHNtYWxsIG9iamVjdHMuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE9GIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyMgIGlmZGVmIFNUREMKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBPRihhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKKyAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKKyAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKKyAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KKyAqLworI2lmIChkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkpICYmICFkZWZpbmVkKF9fMzJCSVRfXykKKyAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgIGlmZGVmIF9NU0NfVkVSCisjICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgZWxzZQorIyAgICBkZWZpbmUgRkFSIGZhcgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisjICBpZm5kZWYgX18zMkJJVF9fCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgZGVmaW5lIEZBUiBfZmFyCisjICBlbmRpZgorI2VuZGlmCisKKy8qIENvbXBpbGUgd2l0aCAtRFpMSUJfRExMIGZvciBXaW5kb3dzIERMTCBzdXBwb3J0ICovCisjaWYgZGVmaW5lZChaTElCX0RMTCkKKyMgIGlmIGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoV0lORE9XUykKKyMgICAgaWZkZWYgRkFSCisjICAgICAgdW5kZWYgRkFSCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgICAgZGVmaW5lIFpFWFBPUlQgIFdJTkFQSQorIyAgICBpZmRlZiBXSU4zMgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgIEZBUiBfY2RlY2wgX2V4cG9ydAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICAgaWYgKF9fQk9STEFORENfXyA+PSAweDA1MDApICYmIGRlZmluZWQgKFdJTjMyKQorIyAgICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgICAgICBkZWZpbmUgWkVYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgV0lOQVBJCisjICAgICAgZGVmaW5lIFpFWFBPUlRSVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGlmIGRlZmluZWQgKF9XaW5kb3dzKSAmJiBkZWZpbmVkIChfX0RMTF9fKQorIyAgICAgICAgZGVmaW5lIFpFWFBPUlQgX2V4cG9ydAorIyAgICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfZXhwb3J0CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgaWYgZGVmaW5lZCAoWkxJQl9ETEwpCisjICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFpFWFBPUlQKKyMgIGRlZmluZSBaRVhQT1JUCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVFZBCisjICBkZWZpbmUgWkVYUE9SVFZBCisjZW5kaWYKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyMgICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICp2b2lkcDsKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgY29uc3QgKnZvaWRwYzsKKyAgIHR5cGVkZWYgQnl0ZSBGQVIgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgKnZvaWRwOworI2VuZGlmCisKKyNpZiAwCS8qIEhBVkVfVU5JU1REX0ggLS0gdGhpcyBsaW5lIGlzIHVwZGF0ZWQgYnkgLi9jb25maWd1cmUgKi8KKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBmb3Igb2ZmX3QgKi8KKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLworIyAgZGVmaW5lIHpfb2ZmX3QgIG9mZl90CisjZW5kaWYKKyNpZm5kZWYgU0VFS19TRVQKKyMgIGRlZmluZSBTRUVLX1NFVCAgICAgICAgMCAgICAgICAvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworIyAgZGVmaW5lIFNFRUtfQ1VSICAgICAgICAxICAgICAgIC8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgIGRlZmluZSBTRUVLX0VORCAgICAgICAgMiAgICAgICAvKiBTZXQgZmlsZSBwb2ludGVyIHRvIEVPRiBwbHVzICJvZmZzZXQiICovCisjZW5kaWYKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lICB6X29mZl90IGxvbmcKKyNlbmRpZgorCisvKiBNVlMgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgbmFtZXMgbGFyZ2VyIHRoYW4gOCBieXRlcyAqLworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0XywiREVJTiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlRW5kLCJERUVORCIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlQm91bmQsIkRFQk5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdDJfLCJJTklOMiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlRW5kLCJJTkVORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU2V0RGljdGlvbmFyeSwiSU5TRURJIikKKyMgICBwcmFnbWEgbWFwKGNvbXByZXNzQm91bmQsIkNNQk5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCisjZW5kaWYKKworI2VuZGlmIC8qIF9aQ09ORl9IICovCmRpZmYgLS1naXQgYS96bGliLmggYi96bGliLmgKaW5kZXggNTJjYjUyOS4uYzUxNDI1NiAxMDA2NDQKLS0tIGEvemxpYi5oCisrKyBiL3psaWIuaApAQCAtMSw3ICsxLDcgQEAKIC8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQotICB2ZXJzaW9uIDEuMS40LCBNYXJjaCAxMXRoLCAyMDAyCisgIHZlcnNpb24gMS4yLjAsIE1hcmNoIDl0aCwgMjAwMwogCi0gIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKyAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgogCiAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiAgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKQEAgLTI0LDcgKzI0LDcgQEAKIAogCiAgIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCi0gIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIGZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MC50eHQKKyAgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQKICAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KS4KICovCiAKQEAgLTM3LDcgKzM3LDcgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjEuNCIKKyNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuMCIKIAogLyogCiAgICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCkBAIC01Miw4ICs1MiwyMyBAQAogICBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CiAgIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCiAKKyAgICAgVGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcyB0aGUgemxpYgorICBmb3JtYXQsIHdoaWNoIGlzIGEgemxpYiB3cmFwcGVyIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTAsIHdyYXBwZWQgYXJvdW5kIGEKKyAgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGl0c2VsZiBkb2N1bWVudGVkIGluIFJGQyAxOTUxLgorCiAgICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAotICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8uCisgIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpbyB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQKKyAgd2l0aCAiZ3oiLiAgVGhlIGd6aXAgZm9ybWF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSB6bGliIGZvcm1hdC4gIGd6aXAgaXMgYQorICBnemlwIHdyYXBwZXIsIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTIsIHdyYXBwZWQgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0uCisKKyAgICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5CisgIGFuZCBvbiBjb21tdW5pY2F0aW9ucyBjaGFubmVscy4gIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgZm9yIHNpbmdsZS0KKyAgZmlsZSBjb21wcmVzc2lvbiBvbiBmaWxlIHN5c3RlbXMsIGhhcyBhIGxhcmdlciBoZWFkZXIgdGhhbiB6bGliIHRvIG1haW50YWluCisgIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiwgYW5kIHVzZXMgYSBkaWZmZXJlbnQsIHNsb3dlciBjaGVjayBtZXRob2QgdGhhbiB6bGliLgorCisgICAgIFRoaXMgbGlicmFyeSBkb2VzIG5vdCBwcm92aWRlIGFueSBmdW5jdGlvbnMgdG8gd3JpdGUgZ3ppcCBmaWxlcyBpbiBtZW1vcnkuCisgIEhvd2V2ZXIgc3VjaCBmdW5jdGlvbnMgY291bGQgYmUgZWFzaWx5IHdyaXR0ZW4gdXNpbmcgemxpYidzIGRlZmxhdGUgZnVuY3Rpb24sCisgIHRoZSBkb2N1bWVudGF0aW9uIGluIHRoZSBnemlwIFJGQywgYW5kIHRoZSBleGFtcGxlcyBpbiBnemlvLmMuCiAKICAgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcwogICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyCkBAIC0yNDQsNyArMjU5LDkgQEAKICAgICBJZiBkZWZsYXRlIHJldHVybnMgd2l0aCBhdmFpbF9vdXQgPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgogICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCiAgIGF2YWlsX291dCksIHVudGlsIHRoZSBmbHVzaCBpcyBjb21wbGV0ZSAoZGVmbGF0ZSByZXR1cm5zIHdpdGggbm9uLXplcm8KLSAgYXZhaWxfb3V0KS4KKyAgYXZhaWxfb3V0KS4gSW4gdGhlIGNhc2Ugb2YgYSBaX0ZVTExfRkxVU0ggb3IgWl9TWU5DX0ZMVVNILCBtYWtlIHN1cmUgdGhhdAorICBhdmFpbF9vdXQgaXMgZ3JlYXRlciB0aGFuIHNpeCB0byBhdm9pZCByZXBlYXRlZCBmbHVzaCBtYXJrZXJzIGR1ZSB0bworICBhdmFpbF9vdXQgPT0gMCBvbiByZXR1cm4uCiAKICAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsCiAgIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgYW5kIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBpZiB0aGVyZQpAQCAtMjU2LDcgKzI3Myw3IEBACiAgIAogICAgIFpfRklOSVNIIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0IGlmIGFsbCB0aGUgY29tcHJlc3Npb24KICAgaXMgdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwLiBJbiB0aGlzIGNhc2UsIGF2YWlsX291dCBtdXN0IGJlIGF0IGxlYXN0Ci0gIDAuMSUgbGFyZ2VyIHRoYW4gYXZhaWxfaW4gcGx1cyAxMiBieXRlcy4gIElmIGRlZmxhdGUgZG9lcyBub3QgcmV0dXJuCisgIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZsYXRlQm91bmQgKHNlZSBiZWxvdykuIElmIGRlZmxhdGUgZG9lcyBub3QgcmV0dXJuCiAgIFpfU1RSRUFNX0VORCwgdGhlbiBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhcyBkZXNjcmliZWQgYWJvdmUuCiAKICAgICBkZWZsYXRlKCkgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgaW5wdXQgcmVhZApAQCAtMjcyLDcgKzI4OSw5IEBACiAgIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkIChvbmx5IHdoZW4gZmx1c2ggaXMgc2V0IHRvCiAgIFpfRklOSVNIKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQogICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKLSAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuCisgIChmb3IgZXhhbXBsZSBhdmFpbF9pbiBvciBhdmFpbF9vdXQgd2FzIHplcm8pLiBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90CisgIGZhdGFsLCBhbmQgZGVmbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dAorICBzcGFjZSB0byBjb250aW51ZSBjb21wcmVzc2luZy4KICovCiAKIApAQCAtMzQwLDExICszNTksOSBAQAogICBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlCiAgIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCiAKLSAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX1NZTkNfRkxVU0gsIGluZmxhdGUgZmx1c2hlcyBhcyBtdWNoCi0gIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGZsdXNoaW5nIGJlaGF2aW9yIG9mIGluZmxhdGUgaXMKLSAgbm90IHNwZWNpZmllZCBmb3IgdmFsdWVzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgb3RoZXIgdGhhbiBaX1NZTkNfRkxVU0gKLSAgYW5kIFpfRklOSVNILCBidXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYWN0dWFsbHkgZmx1c2hlcyBhcyBtdWNoIG91dHB1dAotICBhcyBwb3NzaWJsZSBhbnl3YXkuCisgICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwgb3IKKyAgWl9GSU5JU0guIFpfU1lOQ19GTFVTSCByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBmbHVzaCBhcyBtdWNoIG91dHB1dCBhcworICBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KIAogICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCiAgIGVycm9yLiBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwCkBAIC0zNTQsMjkgKzM3MSw0MyBAQAogICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCiAgIGJ5IHRoZSBjb21wcmVzc29yIGZvciB0aGlzIHB1cnBvc2UuKSBUaGUgbmV4dCBvcGVyYXRpb24gb24gdGhpcyBzdHJlYW0gbXVzdAogICBiZSBpbmZsYXRlRW5kIHRvIGRlYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gc3RhdGUuIFRoZSB1c2Ugb2YgWl9GSU5JU0gKLSAgaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUgdXNlZCB0byBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIHJvdXRpbmUKKyAgaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUgdXNlZCB0byBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoCiAgIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKSBjYWxsLgogCi0gICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeQotICBiZWxvdyksIGluZmxhdGUgc2V0cyBzdHJtLWFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIHRoZQotICBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX05FRURfRElDVDsgb3RoZXJ3aXNlIAotICBpdCBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQKLSAgc28gZmFyICh0aGF0IGlzLCB0b3RhbF9vdXQgYnl0ZXMpIGFuZCByZXR1cm5zIFpfT0ssIFpfU1RSRUFNX0VORCBvcgotICBhbiBlcnJvciBjb2RlIGFzIGRlc2NyaWJlZCBiZWxvdy4gQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBpbmZsYXRlKCkKLSAgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIGFkbGVyMzIgY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUKLSAgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KKyAgICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgaW5mbGF0ZSgpIGFsd2F5cyBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0IGFzCisgIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgYWx3YXlzIHVzZXMgdGhlIGZhc3RlciBhcHByb2FjaCBvbiB0aGUKKyAgZmlyc3QgY2FsbC4gU28gdGhlIG9ubHkgZWZmZWN0IG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgorICBpcyBvbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGluZmxhdGUoKSwgYXMgbm90ZWQgYmVsb3cuCisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsIChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS1hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiB0aGUgZGljdGlvbmFyeQorICBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSBpdCBzZXRzCisgIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQgc28gZmFyICh0aGF0IGlzLAorICB0b3RhbF9vdXQgYnl0ZXMpIGFuZCByZXR1cm5zIFpfT0ssIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvciBjb2RlIGFzIGRlc2NyaWJlZAorICBiZWxvdy4gQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBpbmZsYXRlKCkgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIGFkbGVyMzIKKyAgY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX1NUUkVBTV9FTkQKKyAgb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KKworICAgIGluZmxhdGUoKSB3aWxsIGRlY29tcHJlc3MgYW5kIGNoZWNrIGVpdGhlciB6bGliLXdyYXBwZWQgb3IgZ3ppcC13cmFwcGVkCisgIGRlZmxhdGUgZGF0YS4gIFRoZSBoZWFkZXIgdHlwZSBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LiAgQW55IGluZm9ybWF0aW9uCisgIGNvbnRhaW5lZCBpbiB0aGUgZ3ppcCBoZWFkZXIgaXMgbm90IHJldGFpbmVkLCBzbyBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRoYXQKKyAgaW5mb3JtYXRpb24gc2hvdWxkIGluc3RlYWQgdXNlIHJhdyBpbmZsYXRlLCBzZWUgaW5mbGF0ZUluaXQyKCkgYmVsb3csIG9yCisgIGluZmxhdGVCYWNrKCkgYW5kIHBlcmZvcm0gdGhlaXIgb3duIHByb2Nlc3Npbmcgb2YgdGhlIGd6aXAgaGVhZGVyIGFuZAorICB0cmFpbGVyLgogCiAgICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCiAgIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKICAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQogICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcwotICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0Ci0gIGFkbGVyMzIgY2hlY2tzdW0pLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50Ci0gIChmb3IgZXhhbXBsZSBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90Ci0gIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gSW4gdGhlIFpfREFUQV9FUlJPUgotICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4gY2FsbCBpbmZsYXRlU3luYyB0byBsb29rIGZvciBhIGdvb2QKLSAgY29tcHJlc3Npb24gYmxvY2suCisgIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QgY2hlY2sKKyAgdmFsdWUpLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAorICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQorICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCisgIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgdG8KKyAgY29udGludWUgZGVjb21wcmVzc2luZy4gSWYgWl9EQVRBX0VSUk9SIGlzIHJldHVybmVkLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4KKyAgY2FsbCBpbmZsYXRlU3luYygpIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jayBpZiBhIHBhcnRpYWwgcmVjb3ZlcnkKKyAgb2YgdGhlIGRhdGEgaXMgZGVzaXJlZC4KICovCiAKIApAQCAtNDE4LDYgKzQ0OSwxMCBAQAogICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgogICAgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgogCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGRlZmxhdGUuICBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCisgICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gZGVmbGF0ZSgpIHdpbGwgdGhlbiBnZW5lcmF0ZSByYXcgZGVmbGF0ZSBkYXRhCisgICB3aXRoIG5vIHpsaWIgaGVhZGVyIG9yIHRyYWlsZXIsIGFuZCB3aWxsIG5vdCBjb21wdXRlIGFuIGFkbGVyMzIgY2hlY2sgdmFsdWUuCisKICAgICAgVGhlIG1lbUxldmVsIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQKICAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQKICAgIGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87IG1lbUxldmVsPTkgdXNlcyBtYXhpbXVtIG1lbW9yeQpAQCAtNDY0LDExICs0OTksMTIgQEAKICAgIGRlZmxhdGUgb3IgZGVmbGF0ZTIuIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZnVsIHNob3VsZCBiZQogICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuCiAKLSAgICAgVXBvbiByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbiwgc3RybS0+YWRsZXIgaXMgc2V0IHRvIHRoZSBBZGxlcjMyIHZhbHVlCisgICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgYWRsZXIzMiB2YWx1ZQogICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQotICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIEFkbGVyMzIgdmFsdWUKKyAgIHdoaWNoIGRpY3Rpb25hcnkgaGFzIGJlZW4gdXNlZCBieSB0aGUgY29tcHJlc3Nvci4gKFRoZSBhZGxlcjMyIHZhbHVlCiAgICBhcHBsaWVzIHRvIHRoZSB3aG9sZSBkaWN0aW9uYXJ5IGV2ZW4gaWYgb25seSBhIHN1YnNldCBvZiB0aGUgZGljdGlvbmFyeSBpcwotICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pCisgICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLikgSWYgYSByYXcgZGVmbGF0ZSB3YXMgcmVxdWVzdGVkLCB0aGVuIHRoZQorICAgYWRsZXIzMiB2YWx1ZSBpcyBub3QgY29tcHV0ZWQgYW5kIHN0cm0tPmFkbGVyIGlzIG5vdCBzZXQuCiAKICAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIGEKICAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcwpAQCAtNTA3LDggKzU0Myw4IEBACiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQYXJhbXMgT0YoKHpfc3RyZWFtcCBzdHJtLAotCQkJCSAgICAgIGludCBsZXZlbCwKLQkJCQkgICAgICBpbnQgc3RyYXRlZ3kpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3kpKTsKIC8qCiAgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LiAgVGhlCiAgICBpbnRlcnByZXRhdGlvbiBvZiBsZXZlbCBhbmQgc3RyYXRlZ3kgaXMgYXMgaW4gZGVmbGF0ZUluaXQyLiAgVGhpcyBjYW4gYmUKQEAgLTUyNyw2ICs1NjMsMTUgQEAKICAgIGlmIHN0cm0tPmF2YWlsX291dCB3YXMgemVyby4KICovCiAKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBkZWZsYXRlQm91bmQgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBkZWZsYXRlQm91bmQoKSByZXR1cm5zIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUgYWZ0ZXIKKyAgIGRlZmxhdGlvbiBvZiBzb3VyY2VMZW4gYnl0ZXMuICBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpCisgICBvciBkZWZsYXRlSW5pdDIoKS4gIFRoaXMgd291bGQgYmUgdXNlZCB0byBhbGxvY2F0ZSBhbiBvdXRwdXQgYnVmZmVyCisgICBmb3IgZGVmbGF0aW9uIGluIGEgc2luZ2xlIHBhc3MsIGFuZCBzbyB3b3VsZCBiZSBjYWxsZWQgYmVmb3JlIGRlZmxhdGUoKS4KKyovCisKIC8qICAgCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzKSk7CkBAIC01NDIsNyArNTg3LDE4IEBACiAgICBpbnB1dCwgaW5mbGF0ZSgpIHdpbGwgcmV0dXJuIHdpdGggdGhlIGVycm9yIGNvZGUgWl9EQVRBX0VSUk9SIGluc3RlYWQgb2YKICAgIHRyeWluZyB0byBhbGxvY2F0ZSBhIGxhcmdlciB3aW5kb3cuCiAKLSAgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgaW5mbGF0ZS4gIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiAgaW5mbGF0ZSgpIHdpbGwgdGhlbiBwcm9jZXNzIHJhdyBkZWZsYXRlIGRhdGEsCisgICBub3QgbG9va2luZyBmb3IgYSB6bGliIG9yIGd6aXAgaGVhZGVyLCBub3QgZ2VuZXJhdGluZyBhIGNoZWNrIHZhbHVlLCBhbmQgbm90CisgICBsb29raW5nIGZvciBhbnkgY2hlY2sgdmFsdWVzIGZvciBjb21wYXJpc29uIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIFRoaXMKKyAgIGlzIGZvciB1c2Ugd2l0aCBvdGhlciBmb3JtYXRzIHRoYXQgdXNlIHRoZSBkZWZsYXRlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQKKyAgIHN1Y2ggYXMgemlwLiAgVGhvc2UgZm9ybWF0cyBwcm92aWRlIHRoZWlyIG93biBjaGVjayB2YWx1ZXMuICBJZiBhIGN1c3RvbQorICAgZm9ybWF0IGlzIGRldmVsb3BlZCB1c2luZyB0aGUgcmF3IGRlZmxhdGUgZm9ybWF0IGZvciBjb21wcmVzc2VkIGRhdGEsIGl0IGlzCisgICByZWNvbW1lbmRlZCB0aGF0IGEgY2hlY2sgdmFsdWUgc3VjaCBhcyBhbiBhZGxlcjMyIG9yIGEgY3JjMzIgYmUgYXBwbGllZCB0bworICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFzIGlzIGRvbmUgaW4gdGhlIHpsaWIsIGd6aXAsIGFuZCB6aXAgZm9ybWF0cy4gIEZvcgorICAgbW9zdCBhcHBsaWNhdGlvbnMsIHRoZSB6bGliIGZvcm1hdCBzaG91bGQgYmUgdXNlZCBhcyBpcy4KKworICAgICBpbmZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCiAgICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYSBuZWdhdGl2ZQogICAgbWVtTGV2ZWwpLiBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGluZmxhdGVJbml0MgogICAgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmCkBAIC01NTcsMTQgKzYxMywxNCBAQAogICAgICBJbml0aWFsaXplcyB0aGUgZGVjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIHVuY29tcHJlc3NlZCBieXRlCiAgICBzZXF1ZW5jZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZQogICAgaWYgdGhpcyBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKLSAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIEFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBjYWxsIG9mCisgICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgY2FsbCBvZgogICAgaW5mbGF0ZS4gVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCiAgICBkaWN0aW9uYXJ5IChzZWUgZGVmbGF0ZVNldERpY3Rpb25hcnkpLgogCiAgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhCiAgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKICAgIGluY29uc2lzdGVudCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBnaXZlbiBkaWN0aW9uYXJ5IGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICBleHBlY3RlZCBvbmUgKGluY29ycmVjdCBBZGxlcjMyIHZhbHVlKS4gaW5mbGF0ZVNldERpY3Rpb25hcnkgZG9lcyBub3QKKyAgIGV4cGVjdGVkIG9uZSAoaW5jb3JyZWN0IGFkbGVyMzIgdmFsdWUpLiBpbmZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAogICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgogICAgaW5mbGF0ZSgpLgogKi8KQEAgLTU4NCw2ICs2NDAsMjIgQEAKICAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCiAqLwogCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfc3RyZWFtcCBzb3VyY2UpKTsKKy8qCisgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCisKKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gcmFuZG9tbHkgYWNjZXNzaW5nIGEgbGFyZ2Ugc3RyZWFtLiAgVGhlCisgICBmaXJzdCBwYXNzIHRocm91Z2ggdGhlIHN0cmVhbSBjYW4gcGVyaW9kaWNhbGx5IHJlY29yZCB0aGUgaW5mbGF0ZSBzdGF0ZSwKKyAgIGFsbG93aW5nIHJlc3RhcnRpbmcgaW5mbGF0ZSBhdCB0aG9zZSBwb2ludHMgd2hlbiByYW5kb21seSBhY2Nlc3NpbmcgdGhlCisgICBzdHJlYW0uCisKKyAgICAgaW5mbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKKyAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBOVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAorICAgZGVzdGluYXRpb24uCisqLworCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKIC8qCiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBpbmZsYXRlRW5kIGZvbGxvd2VkIGJ5IGluZmxhdGVJbml0LApAQCAtNTk0LDYgKzY2NiwxMDggQEAKICAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBOVUxMKS4KICovCiAKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrSW5pdCBPRigoel9zdHJlYW0gRkFSICpzdHJtLCBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93KSk7CisKKyAgICAgSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uIHVzaW5nIGluZmxhdGVCYWNrKCkKKyAgIGNhbGxzLiAgVGhlIGZpZWxkcyB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgaW4gc3RybSBtdXN0IGJlIGluaXRpYWxpemVkCisgICBiZWZvcmUgdGhlIGNhbGwuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBaX05VTEwsIHRoZW4gdGhlIGRlZmF1bHQgbGlicmFyeS0KKyAgIGRlcml2ZWQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgYXJlIHVzZWQuICB3aW5kb3dCaXRzIGlzIHRoZSBiYXNlIHR3bworICAgbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZSwgaW4gdGhlIHJhbmdlIDguLjE1LiAgd2luZG93IGlzIGEgY2FsbGVyCisgICBzdXBwbGllZCBidWZmZXIgb2YgdGhhdCBzaXplLiAgRXhjZXB0IGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucyB3aGVyZSBpdCBpcworICAgYXNzdXJlZCB0aGF0IGRlZmxhdGUgd2FzIHVzZWQgd2l0aCBzbWFsbCB3aW5kb3cgc2l6ZXMsIHdpbmRvd0JpdHMgbXVzdCBiZSAxNQorICAgYW5kIGEgMzJLIGJ5dGUgd2luZG93IG11c3QgYmUgc3VwcGxpZWQgdG8gYmUgYWJsZSB0byBkZWNvbXByZXNzIGdlbmVyYWwKKyAgIGRlZmxhdGUgc3RyZWFtcy4KKworICAgICBTZWUgaW5mbGF0ZUJhY2soKSBmb3IgdGhlIHVzYWdlIG9mIHRoZXNlIHJvdXRpbmVzLgorCisgICAgIGluZmxhdGVCYWNrSW5pdCB3aWxsIHJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBvZgorICAgdGhlIHBhcmFtYXRlcnMgYXJlIGludmFsaWQsIFpfTUVNX0VSUk9SIGlmIHRoZSBpbnRlcm5hbCBzdGF0ZSBjb3VsZCBub3QKKyAgIGJlIGFsbG9jYXRlZCwgb3IgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRvZXMgbm90CisgICBtYXRjaCB0aGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyIGZpbGUuCisqLworCit0eXBlZGVmIHVuc2lnbmVkICgqaW5fZnVuYykgT0YoKHZvaWQgRkFSICosIHVuc2lnbmVkIGNoYXIgRkFSICogRkFSICopKTsKK3R5cGVkZWYgaW50ICgqb3V0X2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrIE9GKCh6X3N0cmVhbSBGQVIgKnN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9mdW5jIGluLCB2b2lkIEZBUiAqaW5fZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mdW5jIG91dCwgdm9pZCBGQVIgKm91dF9kZXNjKSk7CisvKgorICAgICBpbmZsYXRlQmFjaygpIGRvZXMgYSByYXcgaW5mbGF0ZSB3aXRoIGEgc2luZ2xlIGNhbGwgdXNpbmcgYSBjYWxsLWJhY2sKKyAgIGludGVyZmFjZSBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBpbmZsYXRlKCkgZm9yCisgICBmaWxlIGkvbyBhcHBsaWNhdGlvbnMgaW4gdGhhdCBpdCBhdm9pZHMgY29weWluZyBiZXR3ZWVuIHRoZSBvdXRwdXQgYW5kIHRoZQorICAgc2xpZGluZyB3aW5kb3cgYnkgc2ltcGx5IG1ha2luZyB0aGUgd2luZG93IGl0c2VsZiB0aGUgb3V0cHV0IGJ1ZmZlci4gIFRoaXMKKyAgIGZ1bmN0aW9uIHRydXN0cyB0aGUgYXBwbGljYXRpb24gdG8gbm90IGNoYW5nZSB0aGUgb3V0cHV0IGJ1ZmZlciBwYXNzZWQgYnkKKyAgIHRoZSBvdXRwdXQgZnVuY3Rpb24sIGF0IGxlYXN0IHVudGlsIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KKworICAgICBpbmZsYXRlQmFja0luaXQoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUKKyAgIGFuZCB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSB3aXRoIHRoZSB1c2VyLXByb3ZpZGVkIHdpbmRvdyBidWZmZXIuCisgICBpbmZsYXRlQmFjaygpIG1heSB0aGVuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMgdG8gaW5mbGF0ZSBhIGNvbXBsZXRlLCByYXcKKyAgIGRlZmxhdGUgc3RyZWFtIHdpdGggZWFjaCBjYWxsLiAgaW5mbGF0ZUJhY2tFbmQoKSBpcyB0aGVuIGNhbGxlZCB0byBmcmVlCisgICB0aGUgYWxsb2NhdGVkIHN0YXRlLgorCisgICAgIEEgcmF3IGRlZmxhdGUgc3RyZWFtIGlzIG9uZSB3aXRoIG5vIHpsaWIgb3IgZ3ppcCBoZWFkZXIgb3IgdHJhaWxlci4KKyAgIFRoaXMgcm91dGluZSB3b3VsZCBub3JtYWxseSBiZSB1c2VkIGluIGEgdXRpbGl0eSB0aGF0IHJlYWRzIHppcCBvciBnemlwCisgICBmaWxlcyBhbmQgd3JpdGVzIG91dCB1bmNvbXByZXNzZWQgZmlsZXMuICBUaGUgdXRpbGl0eSB3b3VsZCBkZWNvZGUgdGhlCisgICBoZWFkZXIgYW5kIHByb2Nlc3MgdGhlIHRyYWlsZXIgb24gaXRzIG93biwgaGVuY2UgdGhpcyByb3V0aW5lIGV4cGVjdHMKKyAgIG9ubHkgdGhlIHJhdyBkZWZsYXRlIHN0cmVhbSB0byBkZWNvbXByZXNzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgIG5vcm1hbCBiZWhhdmlvciBvZiBpbmZsYXRlKCksIHdoaWNoIGV4cGVjdHMgZWl0aGVyIGEgemxpYiBvciBnemlwIGhlYWRlciBhbmQKKyAgIHRyYWlsZXIgYXJvdW5kIHRoZSBkZWZsYXRlIHN0cmVhbS4KKworICAgICBpbmZsYXRlQmFjaygpIHVzZXMgdHdvIHN1YnJvdXRpbmVzIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgdGhhdCBhcmUgdGhlbgorICAgY2FsbGVkIGJ5IGluZmxhdGVCYWNrKCkgZm9yIGlucHV0IGFuZCBvdXRwdXQuICBpbmZsYXRlQmFjaygpIGNhbGxzIHRob3NlCisgICByb3V0aW5lcyB1bnRpbCBpdCByZWFkcyBhIGNvbXBsZXRlIGRlZmxhdGUgc3RyZWFtIGFuZCB3cml0ZXMgb3V0IGFsbCBvZiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhLCBvciB1bnRpbCBpdCBlbmNvdW50ZXJzIGFuIGVycm9yLiAgVGhlIGZ1bmN0aW9uJ3MKKyAgIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcyBhcmUgZGVmaW5lZCBhYm92ZSBpbiB0aGUgaW5fZnVuYyBhbmQgb3V0X2Z1bmMKKyAgIHR5cGVkZWZzLiAgaW5mbGF0ZUJhY2soKSB3aWxsIGNhbGwgaW4oaW5fZGVzYywgJmJ1Zikgd2hpY2ggc2hvdWxkIHJldHVybiB0aGUKKyAgIG51bWJlciBvZiBieXRlcyBvZiBwcm92aWRlZCBpbnB1dCwgYW5kIGEgcG9pbnRlciB0byB0aGF0IGlucHV0IGluIGJ1Zi4gIElmCisgICB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUsIGluKCkgbXVzdCByZXR1cm4gemVyby0tYnVmIGlzIGlnbm9yZWQgaW4gdGhhdAorICAgY2FzZS0tYW5kIGluZmxhdGVCYWNrKCkgd2lsbCByZXR1cm4gYSBidWZmZXIgZXJyb3IuICBpbmZsYXRlQmFjaygpIHdpbGwgY2FsbAorICAgb3V0KG91dF9kZXNjLCBidWYsIGxlbikgdG8gd3JpdGUgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGJ1ZlswLi5sZW4tMV0uICBvdXQoKQorICAgc2hvdWxkIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIG5vbi16ZXJvIG9uIGZhaWx1cmUuICBJZiBvdXQoKSByZXR1cm5zCisgICBub24temVybywgaW5mbGF0ZUJhY2soKSB3aWxsIHJldHVybiB3aXRoIGFuIGVycm9yLiAgTmVpdGhlciBpbigpIG5vciBvdXQoKQorICAgYXJlIHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSB3aW5kb3cgcHJvdmlkZWQgdG8KKyAgIGluZmxhdGVCYWNrSW5pdCgpLCB3aGljaCBpcyBhbHNvIHRoZSBidWZmZXIgdGhhdCBvdXQoKSB1c2VzIHRvIHdyaXRlIGZyb20uCisgICBUaGUgbGVuZ3RoIHdyaXR0ZW4gYnkgb3V0KCkgd2lsbCBiZSBhdCBtb3N0IHRoZSB3aW5kb3cgc2l6ZS4gIEFueSBub24temVybworICAgYW1vdW50IG9mIGlucHV0IG1heSBiZSBwcm92aWRlZCBieSBpbigpLgorCisgICAgIEZvciBjb252ZW5pZW5jZSwgaW5mbGF0ZUJhY2soKSBjYW4gYmUgcHJvdmlkZWQgaW5wdXQgb24gdGhlIGZpcnN0IGNhbGwgYnkKKyAgIHNldHRpbmcgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4uICBJZiB0aGF0IGlucHV0IGlzIGV4aGF1c3RlZCwgdGhlbgorICAgaW4oKSB3aWxsIGJlIGNhbGxlZC4gIFRoZXJlZm9yZSBzdHJtLT5uZXh0X2luIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICBjYWxsaW5nIGluZmxhdGVCYWNrKCkuICBJZiBzdHJtLT5uZXh0X2luIGlzIFpfTlVMTCwgdGhlbiBpbigpIHdpbGwgYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBmb3IgaW5wdXQuICBJZiBzdHJtLT5uZXh0X2luIGlzIG5vdCBaX05VTEwsIHRoZW4gc3RybS0+YXZhaWxfaW4KKyAgIG11c3QgYWxzbyBiZSBpbml0aWFsaXplZCwgYW5kIHRoZW4gaWYgc3RybS0+YXZhaWxfaW4gaXMgbm90IHplcm8sIGlucHV0IHdpbGwKKyAgIGluaXRpYWxseSBiZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW5bMCAuLiBzdHJtLT5hdmFpbF9pbiAtIDFdLgorCisgICAgIFRoZSBpbl9kZXNjIGFuZCBvdXRfZGVzYyBwYXJhbWV0ZXJzIG9mIGluZmxhdGVCYWNrKCkgaXMgcGFzc2VkIGFzIHRoZQorICAgZmlyc3QgcGFyYW1ldGVyIG9mIGluKCkgYW5kIG91dCgpIHJlc3BlY3RpdmVseSB3aGVuIHRoZXkgYXJlIGNhbGxlZC4gIFRoZXNlCisgICBkZXNjcmlwdG9ycyBjYW4gYmUgb3B0aW5hbGx5IHVzZWQgdG8gcGFzcyBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgY2FsbGVyLQorICAgc3VwcGxpZWQgaW4oKSBhbmQgb3V0KCkgZnVuY3Rpb25zIG5lZWQgdG8gZG8gdGhlaXIgam9iLgorCisgICAgIE9uIHJldHVybiwgaW5mbGF0ZUJhY2soKSB3aWxsIHNldCBzdHJtLT5uZXh0X2luIGFuZCBzdHJtLT5hdmFpbF9pbiB0bworICAgcGFzcyBiYWNrIGFueSB1bnVzZWQgaW5wdXQgdGhhdCB3YXMgcHJvdmlkZWQgYnkgdGhlIGxhc3QgaW4oKSBjYWxsLiAgVGhlCisgICByZXR1cm4gdmFsdWVzIG9mIGluZmxhdGVCYWNrKCkgY2FuIGJlIFpfU1RSRUFNX0VORCBvbiBzdWNjZXNzLCBaX0JVRl9FUlJPUgorICAgaWYgaW4oKSBvciBvdXQoKSByZXR1cm5lZCBhbiBlcnJvciwgWl9EQVRBX0VSUk9SIGlmIHRoZXJlIHdhcyBhIGZvcm1hdAorICAgZXJyb3IgaW4gdGhlIGRlZmxhdGUgc3RyZWFtIChpbiB3aGljaCBjYXNlIHN0cm0tPm1zZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhlCisgICBuYXR1cmUgb2YgdGhlIGVycm9yKSwgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSB3YXMgbm90IHByb3Blcmx5CisgICBpbml0aWFsaXplZC4gIEluIHRoZSBjYXNlIG9mIFpfQlVGX0VSUk9SLCBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgY2FuIGJlCisgICBkaXN0aW5ndWlzaGVkIHVzaW5nIHN0cm0tPm5leHRfaW4gd2hpY2ggd2lsbCBiZSBaX05VTEwgb25seSBpZiBpbigpIHJldHVybmVkCisgICBhbiBlcnJvci4gIElmIHN0cm0tPm5leHQgaXMgbm90IFpfTlVMTCwgdGhlbiB0aGUgWl9CVUZfRVJST1Igd2FzIGR1ZSB0bworICAgb3V0KCkgcmV0dXJuaW5nIG5vbi16ZXJvLiAgKGluKCkgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBvdXQoKSwgc28KKyAgIHN0cm0tPm5leHRfaW4gaXMgYXNzdXJlZCB0byBiZSBkZWZpbmVkIGlmIG91dCgpIHJldHVybnMgbm9uLXplcm8uKSAgTm90ZQorICAgdGhhdCBpbmZsYXRlQmFjaygpIGNhbm5vdCByZXR1cm4gWl9PSy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tFbmQoel9zdHJlYW0gRkFSICpzdHJtKTsKKy8qCisgICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgorCisgICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KKyAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHV0aWxpdHkgZnVuY3Rpb25zICovCiAKQEAgLTYxMCw4ICs3ODQsOCBAQAogLyoKICAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKICAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKLSAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuCi0gICBzb3VyY2VMZW4gcGx1cyAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgIGJ5IGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKICAgIGNvbXByZXNzZWQgYnVmZmVyLgogICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQogICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgpAQCAtNjI3LDE0ICs4MDEsMjIgQEAKICAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIFRoZSBsZXZlbAogICAgcGFyYW1ldGVyIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGRlZmxhdGVJbml0LiAgc291cmNlTGVuIGlzIHRoZSBieXRlCiAgICBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0gICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbiBzb3VyY2VMZW4gcGx1cwotICAgMTIgYnl0ZXMuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgY29tcHJlc3NlZCBidWZmZXIuCiAKICAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAogICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAogICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgogKi8KIAorWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgorICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZQorICAgYSBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyovCisKIFpFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKIC8qCkBAIC02NTAsNyArODMyLDcgQEAKIAogICAgICB1bmNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CiAgICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKLSAgIGJ1ZmZlciwgb3IgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQuCisgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkIG9yIGluY29tcGxldGUuCiAqLwogCiAKQEAgLTcwMiw3ICs4ODQsNyBAQAogICAgZW5kIG9mIGZpbGUsIC0xIGZvciBlcnJvcikuICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3p3cml0ZSBPRigoZ3pGaWxlIGZpbGUsIAotCQkJCSAgIGNvbnN0IHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwYyBidWYsIHVuc2lnbmVkIGxlbikpOwogLyoKICAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KICAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCkBAIC03MTMsNyArODk1LDEwIEBACiAvKgogICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCiAgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuICBUaGUgbnVtYmVyIG9mCisgICB1bmNvbXByZXNzZWQgYnl0ZXMgd3JpdHRlbiBpcyBsaW1pdGVkIHRvIDQwOTUuICBUaGUgY2FsbGVyIHNob3VsZCBhc3N1cmUKKyAgIHRoYXQgdGhpcyBsaW1pdCBpcyBub3QgZXhjZWVkZWQsIHNpbmNlIG90aGVyd2lzZSBhIGJ1ZmZlciBvdmVyZmxvdyBtYXkKKyAgIHJlc3VsdC4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOwpAQCAtNzU1LDcgKzk0MCw3IEBACiAqLwogCiBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCAgICBnenNlZWsgT0YoKGd6RmlsZSBmaWxlLAotCQkJCSAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7CiAvKiAKICAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKICAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQpAQCAtODY3LDYgKzEwNTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9zaXplKSk7CiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfIE9GKCh6X3N0cmVhbSBGQVIgKnN0cm0sIGludCB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKICNkZWZpbmUgZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIFwKICAgICAgICAgZGVmbGF0ZUluaXRfKChzdHJtKSwgKGxldmVsKSwgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQogI2RlZmluZSBpbmZsYXRlSW5pdChzdHJtKSBcCkBAIC04NzYsNiArMTA2NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5KSwgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKICNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKICAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlQmFja0luaXQoc3RybSwgd2luZG93Qml0cywgd2luZG93KSBcCisgICAgICAgIGluZmxhdGVCYWNrSW5pdF8oKHN0cm0pLCAod2luZG93Qml0cyksICh3aW5kb3cpLCBcCisgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKIAogCiAjaWYgIWRlZmluZWQoX1pfVVRJTF9IKSAmJiAhZGVmaW5lZChOT19EVU1NWV9ERUNMKQpkaWZmIC0tZ2l0IGEvenV0aWwuYyBiL3p1dGlsLmMKaW5kZXggZGZjMzhlYy4uNGE4MTE4ZCAxMDA2NDQKLS0tIGEvenV0aWwuYworKysgYi96dXRpbC5jCkBAIC0xLDUgKzEsNSBAQAogLyogenV0aWwuYyAtLSB0YXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseS4KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAogICovCiAKQEAgLTEzLDcgKzEzLDcgQEAKIGV4dGVybiB2b2lkIGV4aXQgT0YoKGludCkpOwogI2VuZGlmCiAKLWNvbnN0IGNoYXIgKnpfZXJybXNnWzEwXSA9IHsKK2NvbnN0IGNoYXIgKiBjb25zdCB6X2Vycm1zZ1sxMF0gPSB7CiAibmVlZCBkaWN0aW9uYXJ5IiwgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovCiAic3RyZWFtIGVuZCIsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovCiAiIiwgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovCkBAIC05NSw2ICs5NSw3IEBACiAKICNpZmRlZiBfX1RVUkJPQ19fCiAjaWYgKGRlZmluZWQoIF9fQk9STEFORENfXykgfHwgIWRlZmluZWQoU01BTExfTUVESVVNKSkgJiYgIWRlZmluZWQoX18zMkJJVF9fKQorI2lmICFkZWZpbmVkKF9fbGludXgpCiAvKiBTbWFsbCBhbmQgbWVkaXVtIG1vZGVsIGluIFR1cmJvIEMgYXJlIGZvciBub3cgbGltaXRlZCB0byBuZWFyIGFsbG9jYXRpb24KICAqIHdpdGggcmVkdWNlZCBNQVhfV0JJVFMgYW5kIE1BWF9NRU1fTEVWRUwKICAqLwpAQCAtMTcwLDYgKzE3MSw3IEBACiAgICAgQXNzZXJ0KDAsICJ6Y2ZyZWU6IHB0ciBub3QgZm91bmQiKTsKIH0KICNlbmRpZgorI2VuZGlmCiAjZW5kaWYgLyogX19UVVJCT0NfXyAqLwogCiAKQEAgLTIwMSw2ICsyMDMsNyBAQAogI2lmbmRlZiBNWV9aQ0FMTE9DIC8qIEFueSBzeXN0ZW0gd2l0aG91dCBhIHNwZWNpYWwgYWxsb2MgZnVuY3Rpb24gKi8KIAogI2lmbmRlZiBTVERDCitleHRlcm4gdm9pZHAgIG1hbGxvYyBPRigodUludCBzaXplKSk7CiBleHRlcm4gdm9pZHAgIGNhbGxvYyBPRigodUludCBpdGVtcywgdUludCBzaXplKSk7CiBleHRlcm4gdm9pZCAgIGZyZWUgICBPRigodm9pZHBmIHB0cikpOwogI2VuZGlmCkBAIC0yMTEsNyArMjE0LDggQEAKICAgICB1bnNpZ25lZCBzaXplOwogewogICAgIGlmIChvcGFxdWUpIGl0ZW1zICs9IHNpemUgLSBzaXplOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgcmV0dXJuICh2b2lkcGYpY2FsbG9jKGl0ZW1zLCBzaXplKTsKKyAgICByZXR1cm4gc2l6ZW9mKHVJbnQpID4gMiA/ICh2b2lkcGYpbWFsbG9jKGl0ZW1zICogc2l6ZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWRwZiljYWxsb2MoaXRlbXMsIHNpemUpOwogfQogCiB2b2lkICB6Y2ZyZWUgKG9wYXF1ZSwgcHRyKQpkaWZmIC0tZ2l0IGEvenV0aWwuaCBiL3p1dGlsLmgKaW5kZXggNzE4ZWJjMS4uZDljMzZhYiAxMDA2NDQKLS0tIGEvenV0aWwuaAorKysgYi96dXRpbC5oCkBAIC0xLDUgKzEsNSBAQAogLyogenV0aWwuaCAtLSBpbnRlcm5hbCBpbnRlcmZhY2UgYW5kIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTM3LDcgKzM3LDcgQEAKIHR5cGVkZWYgdXNoIEZBUiB1c2hmOwogdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1bGc7CiAKLWV4dGVybiBjb25zdCBjaGFyICp6X2Vycm1zZ1sxMF07IC8qIGluZGV4ZWQgYnkgMi16bGliX2Vycm9yICovCitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IHpfZXJybXNnWzEwXTsgLyogaW5kZXhlZCBieSAyLXpsaWJfZXJyb3IgKi8KIC8qIChzaXplIGdpdmVuIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIHdpdGggVmlzdWFsIEMrKykgKi8KIAogI2RlZmluZSBFUlJfTVNHKGVycikgel9lcnJtc2dbWl9ORUVEX0RJQ1QtKGVycildCkBAIC0yMDcsOCArMjA3LDYgQEAKICNlbmRpZgogCiAKLXR5cGVkZWYgdUxvbmcgKFpFWFBPUlQgKmNoZWNrX2Z1bmMpIE9GKCh1TG9uZyBjaGVjaywgY29uc3QgQnl0ZWYgKmJ1ZiwKLQkJCQkgICAgICAgdUludCBsZW4pKTsKIHZvaWRwZiB6Y2FsbG9jIE9GKCh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkpOwogdm9pZCAgIHpjZnJlZSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpKTsKIAo=