LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICoKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCiAqIGNvcGllcy4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAogKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCiAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgovKgogKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCiAqLwoKCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgogICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFQgTCAuIEMKCiAgT1ZFUlZJRVc6CgogIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gVHJhbnNwb3J0IExheWVyLgoKICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgb3RoZXIKICBXTEFOIG1vZHVsZXMgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBUcmFuc3BvcnQgTGF5ZXIgaW5pdGlhbGx5LgoKICBERVBFTkRFTkNJRVM6CgogIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQoKCiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCiAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KCgogICAkSGVhZGVyJCREYXRlVGltZSQkQXV0aG9yJAoKCiAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5Ci0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjIwMTMtMDgtMTkgICAgcmFqZWt1bWEgQWRkZWQgUk1DIHN1cHBvcnQKMjAxMC0wNy0xMyAgICBjX3NoaW5kZSBGaXhlZCBhbiBpc3N1ZSB3aGVyZSBXQVBJIHJla2V5aW5nIHdhcyBmYWlsaW5nIGJlY2F1c2UgCiAgICAgICAgICAgICAgICAgICAgICBXQUkgZnJhbWUgc2VudCBvdXQgZHVyaW5nIHJla2V5aW5nIGhhZCB0aGUgcHJvdGVjdGVkIGJpdAogICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDEuCjIwMTAtMDUtMDYgICAgcm5haXIgICBDaGFuZ2VkIG5hbWUgb2YgdmFyaWFibGUgZnJvbSB1c0xsY1R5cGUgdG8gdXNFdGhlclR5cGUKICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgZnVuY3Rpb24gbmFtZSBmcm9tIEdldExMQ1R5cGUgdG8gR2V0RXRoZXJUeXBlCiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCA4MDIuMyB0byA4MDIuMTEgZnJhbWUgdHJhbnNsYXRpb24gaXNzdWUgd2hlcmUgdHdvIAogICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIExMQyBoZWFkZXIgd2FzIGdldHRpbmcgb3ZlcndyaXR0ZW4gaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICBub24tUW9zIHBhdGgKMjAxMC0wNS0wNiAgICBybmFpciAgIFJ4QXV0aCBwYXRoIGZpeCBmb3IgbW9kaWZ5aW5nIHRoZSBoZWFkZXIgYmVmb3JlIGV0aGVyCiAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHJldHJlaXZlZCAoRGV0ZWN0ZWQgd2hpbGUgdGVzdGluZyByZWtleWluZwogICAgICAgICAgICAgICAgICAgICAgaW4gV0FQSSBWb2xhbnMpCjIwMTAtMDItMTkgICAgYmFkICAgICBGaXhlZCA4MDIuMTEgdG8gODAyLjMgZnQgaXNzdWVzIHdpdGggV0FQSQoyMDEwLTAyLTE5ICAgIHJuYWlyICAgV0FQSTogSWYgZnJhbWUgaXMgYSBXQUkgZnJhbWUgaW4gVHhDb25uIGFuZCBUeEF1dGgsIFRMIAogICAgICAgICAgICAgICAgICAgICAgZG9lcyBmcmFtZSB0cmFuc2xhdGlvbi4gCjIwMTAtMDItMDEgICAgcm5haXIgICBXQVBJOiBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgdmFsdWUgb2YgdWNJc1dhcGlTdGEgd2FzIG5vdCAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNldCBpbiB0aGUgVEwgY29udHJvbCBibG9jayBpbiB0aGUgUmVnaXN0ZXJTVEEgZnVuYy4gCjIwMTAtMDEtMDggICAgbHRpICAgICBBZGRlZCBUTCBEYXRhIENhY2hpbmcgCjIwMDktMTEtMDQgICAgcm5haXIgICBXQVBJOiBNb3ZpbmcgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdG8gYSBzZXBlcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIFdMQU5UTF9HZXRMTENUeXBlCjIwMDktMTAtMTUgICAgcm5haXIgICBXQVBJOiBGZWF0dXJpemluZyBXQVBJIGNvZGUKMjAwOS0xMC0wOSAgICBybmFpciAgIFdBUEk6IE1vZGlmaWNhdGlvbnMgdG8gYXV0aGVudGljYXRlZCBzdGF0ZSBoYW5kbGluZyBvZiBSeCBkYXRhCjIwMDktMTAtMDYgICAgcm5haXIgICBBZGRpbmcgc3VwcG9ydCBmb3IgV0FQSSAKMjAwOS0wOS0yMiAgICBsdGkgICAgIEFkZCBkZXJlZ2lzdHJhdGlvbiBBUEkgZm9yIG1hbmFnZW1lbnQgY2xpZW50CjIwMDktMDctMTYgICAgcm5haXIgICBUZW1wb3JhcnkgZml4IHRvIGxldCBUTCBmZXRjaCBwYWNrZXRzIHdoZW4gbXVsdGlwbGUgCiAgICAgICAgICAgICAgICAgICAgICBwZWVycyBleGlzdCBpbiBhbiBJQlNTCjIwMDktMDYtMTAgICAgbHRpICAgICBGaXggZm9yIGNoZWNraW5nIFRJRCB2YWx1ZSBvZiBtZXRhIGluZm8gb24gVFggLSBwcmV2ZW50CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgb3ZlcndyaXRlIAogICAgICAgICAgICAgICAgICAgICAgRml4IGZvciBwcm9wZXJseSBjaGVja2luZyB0aGUgc3RhIGlkIGZvciByZXN1bWluZyB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBnZW5lcmF0aW9uCjIwMDktMDUtMTQgICAgbHRpICAgICBGaXggZm9yIHNlbmRpbmcgb3V0IHRyaWdnZXIgZnJhbWVzCjIwMDktMDUtMTUgICAgbHRpICAgICBBZGRyMyBmaWx0ZXJpbmcgCjIwMDktMDQtMTMgICAgbHRpICAgICBBc3NlcnQgaWYgcGFja2V0IGxhcmdlciB0aGVuIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgIERyb3AgcGFja2V0IHRoYXQgZmFpbHMgZmxhdHRlbgoyMDA5LTA0LTAyICAgIGx0aSAgICAgUGVyZm9ybWFuY2UgZml4ZXMgZm9yIFRMIAoyMDA5LTAyLTE5ICAgIGx0aSAgICAgQWRkZWQgZml4IGZvciBMTEMgbWFuYWdlbWVudCBvbiBSeCBDb25uZWN0IAoyMDA5LTAxLTE2ICAgIGx0aSAgICAgUmVwbGFjZWQgcGVlayBkYXRhIHdpdGggZXh0cmFjdCBkYXRhIGZvciBub24gQkQgb3BlcnRpb25zCiAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0ZWQgZnJhbWUgY29udHJvbCBpbiBUbCBhbmQgcGFzcyB0byBIQUwgZm9yIGZyYW1lIAogICAgICAgICAgICAgICAgICAgICAgdHlwZSBldmFsdWF0aW9uCjIwMDktMDItMDIgICAgc2NoICAgICBBZGQgaGFuZG9mZiBzdXBwb3J0CjIwMDgtMTItMDkgICAgbHRpICAgICBGaXhlcyBmb3IgQU1TUyBjb21waWxhdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgYXNzZXJ0IG9uIHJlY2VpdmUgd2hlbiB0aGVyZSBpcyBubyBzdGF0aW9uCjIwMDgtMTItMDIgICAgbHRpICAgICBGaXggZm8gdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uIAoyMDA4LTEwLTMxICAgIGx0aSAgICAgRml4IGZvIFRMIHR4IHN1c3BlbmQKMjAwOC0xMC0wMSAgICBsdGkgICAgIE1lcmdlZCBpbiBmaXhlcyBmcm9tIHJlb3JkZXJpbmcKICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkIHBhcnQgb2YgVUFQU0QgZnVuY3Rpb25hbGl0eSBpbiBUTAogICAgICAgICAgICAgICAgICAgICAgKHdpbGwgYmUgcmUtZW5hYmxlZCBvbmNlIFVBUFNEIGlzIHRlc3RlZCkKICAgICAgICAgICAgICAgICAgICAgIEZpeCBmb3IgVUFQU0QgbXVsdGlwbGUgZW5hYmxlCjIwMDgtMDgtMTAgICAgbHRpICAgICBGaXhlcyBmb2xsb3dpbmcgVUFQU0QgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgaW5maW5pdGUgbG9vcCBvbiBtYXNrIGNvbXB1dGF0aW9uIHdoZW4gU1RBIG5vIHJlZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgRml4ZXMgYWZ0ZXIgUU9TIHVuaXQgdGVzdGluZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgQWRkZWQgUU9TIHN1cHBvcnQKMjAwOC0wNy0yMyAgICBsdGkgICAgIEZpeCBmb3Igdm9zIHBhY2tldCBkcmFpbmluZwoyMDA4LTA3LTE3ICAgIGx0aSAgICAgRml4IGZvciBkYXRhIHR5cGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZyYW1lIHRyYW5zbGF0aW9uIGNvZGUgaW4gVEwKICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJldHVybmluZyBmYWlsdXJlIHRvIFBFIGluIGNhc2UgcHJldmlvdXMgZnJhbWUgaXMKICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIHBlbmRpbmc7IGZhaWwgcHJldmlvdXMgYW5kIGNhY2hlIG5ldyBvbmUgZm9yIHR4CiAgICAgICAgICAgICAgICAgICAgICBHZXQgZnJhbWVzIHJldHVybmluZyBib29sZWFuIHRydWUgaWYgbW9yZSBmcmFtZXMgYXJlIHBlbmRpbmcKMjAwOC0wNy0wMyAgICBsdGkgICAgIEZpeGVzIGZvbGxvd2luZyBwcmUtaW50ZWdyYXRpb24gdGVzdGluZwoyMDA4LTA2LTI2ICAgIGx0aSAgICAgRml4ZXMgZm9sbG93aW5nIHVuaXQgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYWxsb2MgYW5kIGZyZWUgZm9yIFRMIGNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIGF0b21pYyBzZXQgdTggaW5zdGVhZCBvZiB1MzIKMjAwOC0wNS0xNiAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEluY2x1ZGUgRmlsZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaV9iYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsX2hvc3VwcG9ydC5oIgojaW5jbHVkZSAidm9zX3R5cGVzLmgiCiNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKI2luY2x1ZGUgIndsYW5fcWN0X3RsX3RyYWNlLmgiCiNpbmNsdWRlICJ0bERlYnVnLmgiCiNpbmNsdWRlICJjZmdBcGkuaCIKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCi8qSW5jbHVkZWQgdG8gYWNjZXNzIFdESV9SeEJkVHlwZSAqLwojaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2JkLmgiCiNlbmRpZgovKkVuYWJsZXMgZGVidWdnaW5nIGJlaGF2aW9yIGluIFRMKi8KI2RlZmluZSBUTF9ERUJVRwovKkVuYWJsZXMgZGVidWdnaW5nIEZDIGNvbnRyb2wgZnJhbWUgaW4gVEwqLwovLyNkZWZpbmUgVExfREVCVUdfRkMKLy8jZGVmaW5lIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCi8vI2RlZmluZSBCVEFNUF9URVNUCiNpZmRlZiBUTF9ERUJVR19GQwojaW5jbHVkZSA8d2xhbl9xY3RfcGFsX3N0YXR1cy5oPgojaW5jbHVkZSA8d2xhbl9xY3RfcGFsX2RldmljZS5oPiAvLyB3cGFsUmVhZFJlZ2lzdGVyCiNlbmRpZgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKkxMQyBoZWFkZXIgdmFsdWUqLwpzdGF0aWMgdl9VOF90IFdMQU5UTF9MTENfSEVBREVSW10gPSAgezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCi8qQWlyb25ldCBTTkFQIGhlYWRlciB2YWx1ZSovCnN0YXRpYyB2X1U4X3QgV0xBTlRMX0FJUk9ORVRfU05BUF9IRUFERVJbXSA9ICB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCB9OwojZW5kaWYgLy9GRUFUVVJFX1dMQU5fRVNFCgovKkJULUFNUCBwYWNrZXQgTExDIE9VSSB2YWx1ZSovCmNvbnN0IHZfVThfdCBXTEFOVExfQlRfQU1QX09VSVtdID0gIHsweDAwLCAweDE5LCAweDU4IH07CgojaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKZXh0ZXJuIGNvbnN0IHZfVThfdCAgV0xBTlRMX1RJRF8yX0FDW1dMQU5fTUFYX1RJRF07CgojZW5kaWYKCiNkZWZpbmUgV0xBTlRMX01BWF9TTlJfREFUQV9TQU1QTEVTIDIwCgojaWZkZWYgVk9MQU5TX1BFUkYKI2RlZmluZSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9FTkFCTEVfVEhSRVNIT0xEICAxMjAKI2RlZmluZSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9HRVRfVEhSRVNIT0xEICAxMjAKCi8qIFRMIEJEL1BEVSB0aHJlc2hvbGQgdG8gZW5hYmxlIGludGVycnVwdCAqLwppbnQgYmRQZHVJbnRlcnJ1cHRFbmFibGVUaHJlc2hvbGQgPSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9FTkFCTEVfVEhSRVNIT0xEOwppbnQgYmRQZHVJbnRlcnJ1cHRHZXRUaHJlc2hvbGQgPSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9HRVRfVEhSRVNIT0xEOwojZW5kaWYgLyogVk9MQU5TX1BFUkYgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCiB8ICAgVHlwZSgyYikgICB8ICAgICBTdWItdHlwZSg0YikgICB8CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojZGVmaW5lIFdMQU5UTF9JU19EQVRBX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkKCiNkZWZpbmUgV0xBTlRMX0lTX1FPU19EQVRBX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCggV0xBTlRMX0RBVEFfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKSAmJiAgICAgXAogICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHhGICkpKSAKCiNkZWZpbmUgV0xBTlRMX0lTX01HTVRfRlJBTUUoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX01HTVRfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKQoKI2RlZmluZSBXTEFOVExfSVNfTUdNVF9BQ1RJT05fRlJBTUUoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgKCggV0xBTlRMX01HTVRfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKSAmJiAgICBcCiAgICAgKCAoIFdMQU5UTF84MDIxMV9NR01UX0FDVElPTl9TVUJUWVBFID09ICggKF90eXBlX3N1YikgJiAweEYgKSkgfHwgXAogICAgICAgKCBXTEFOVExfODAyMTFfTUdNVF9BQ1RJT05fTk9fQUNLX1NVQlRZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4RiApKSkpCgojZGVmaW5lIFdMQU5UTF9JU19QUk9CRV9SRVEoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX01HTVRfUFJPQkVfUkVRX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4M0YgKSkKCiNkZWZpbmUgV0xBTlRMX0lTX0NUUkxfRlJBTUUoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX0NUUkxfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiNkZWZpbmUgV0xBTlRMX0lTX1RETFNfRlJBTUUoX2V0aF90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX0xMQ19URExTX1RZUEUgPT0gKCBfZXRoX3R5cGUpKQojZW5kaWYKCi8qTUFYIEFsbG93ZWQgbGVuIHByb2Nlc3NlZCBieSBUTCAtIE1BeCBNVFUgKyA4MDIuMyBoZWFkZXIgKyBCRCtEWEUrWFRMKi8KI2RlZmluZSBXTEFOVExfTUFYX0FMTE9XRURfTEVOICAgICgxNTE0ICsgMTAwKQoKI2RlZmluZSBXTEFOVExfREFUQV9GTE9XX01BU0sgMHgwRgoKLy9zb21lIGZsb3dfY29udHJvbCBkZWZpbmUKLy9MV00gbW9kZSB3aWxsIGJlIGVuYWJsZWQgZm9yIHRoaXMgc3RhdGlvbiBpZiB0aGUgZWdyZXNzL2luZ3Jlc3MgZmFsbHMgYmVsb3cgdGhpcyByYXRpbwojZGVmaW5lIFdMQU5UTF9MV01fRUdSRVNTX0lOR1JFU1NfVEhSRVNIT0xEICgwLjc1KQoKLy9HZXQgZW5vdWdoIHNhbXBsZSB0byBkbyB0aGUgTFdNIHJlbGF0ZWQgY2FsY3VsYXRpb24KI2RlZmluZSBXTEFOVExfTFdNX0lOR1JFU1NfU0FNUExFX1RIUkVTSE9MRCAoNjQpCgovL01heGltYWwgb24tZmx5IHBhY2tldCBwZXIgc3RhdGlvbiBpbiBMV00gbW9kZQojZGVmaW5lIFdMQU5UTF9TVEFfQk1VX1RIUkVTSE9MRF9NQVggKDI1NikKCiNkZWZpbmUgV0xBTlRMX0FDX01BU0sgKDB4NykKI2RlZmluZSBXTEFOVExfU1RBSURfT0ZGU0VUICgweDYpCgovKiBVSU5UMzIgdHlwZSBlbmRpYW4gc3dhcCAqLwojZGVmaW5lIFNXQVBfRU5ESUFOX1VJTlQzMihhKSAgICAgICAgICAoKGEpID0gKChhKSA+PiAweDE4ICkgfCgoKGEpICYgMHhGRjAwMDApID4+IDB4MDgpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGEpICYgMHhGRjAwKSA8PCAweDA4KSAgfCAoKChhKSAmIDB4RkYpIDw8IDB4MTgpKQoKLyogTWF4aW11bSB2YWx1ZSBvZiBTTlIgdGhhdCBjYW4gYmUgY2FsY3VsYXRlZCBieSB0aGUgSFcgKi8KI2RlZmluZSBXTEFOVExfTUFYX0hXX1NOUiAzNQoKI2RlZmluZSBESVNBQkxFX0FSUF9UT0dHTEUgMAojZGVmaW5lIEVOQUJMRV9BUlBfVE9HR0xFICAxCiNkZWZpbmUgU0VORF9BUlBfT05fV1E1ICAgIDIKCiNkZWZpbmUgV0xBTlRMX1JBVEVfUkFUSU9fVEhSRVNIT0xEIDIKI2RlZmluZSBXTEFOVExfUEVSX1RIUkVTSE9MRCA1CiNkZWZpbmUgV0xBTlRMX1FVRVVFX1RIUkVTSE9MRCA2MAojZGVmaW5lIFdMQU5UTF9HT09EX1NUQV9XRUlHSFQgMQojZGVmaW5lIFdMQU5UTF9XRUlHSFRfVEhSRVNIT0xEIDUwCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogVHlwZSBEZWNsYXJhdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNkZWZpbmUgVExfTElUVExFX0JJVF9FTkRJQU4KCnR5cGVkZWYgc3RydWN0CnsKCgogICB2X1U4X3QgcHJvdFZlciA6MjsKICAgdl9VOF90IHR5cGUgOjI7CiAgIHZfVThfdCBzdWJUeXBlIDo0OwoKICAgdl9VOF90IHRvRFMgOjE7CiAgIHZfVThfdCBmcm9tRFMgOjE7CiAgIHZfVThfdCBtb3JlRnJhZyA6MTsKICAgdl9VOF90IHJldHJ5IDoxOwogICB2X1U4X3QgcG93ZXJNZ210IDoxOwogICB2X1U4X3QgbW9yZURhdGEgOjE7CiAgIHZfVThfdCB3ZXAgOjE7CiAgIHZfVThfdCBvcmRlciA6MTsKCgp9IFdMQU5UTF9NQUNGQ1R5cGU7CgovKiA4MDIuMTEgaGVhZGVyICovCnR5cGVkZWYgc3RydWN0CnsKIC8qIEZyYW1lIGNvbnRyb2wgZmllbGQgKi8KIFdMQU5UTF9NQUNGQ1R5cGUgIHdGcm1DdHJsOwoKIC8qIER1cmF0aW9uIElEICovCiB2X1UxNl90ICB1c0R1cmF0aW9uSWQ7CgogLyogQWRkcmVzcyAxIGZpZWxkICAqLwogdl9VOF90ICAgdkExW1ZPU19NQUNfQUREUl9TSVpFXTsKCiAvKiBBZGRyZXNzIDIgZmllbGQgKi8KIHZfVThfdCAgIHZBMltWT1NfTUFDX0FERFJfU0laRV07CgogLyogQWRkcmVzcyAzIGZpZWxkICovCiB2X1U4X3QgICB2QTNbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIFNlcXVlbmNlIGNvbnRyb2wgZmllbGQgKi8KIHZfVTE2X3QgIHVzU2VxQ3RybDsKCiAvLyBGaW5kIHRoZSBzaXplIG9mIHRoZSBtYW5kYXRvcnkgaGVhZGVyIHNpemUuCiNkZWZpbmUgV0xBTjgwMjExX01BTkRBVE9SWV9IRUFERVJfU0laRSBcCiAgICAoc2l6ZW9mKFdMQU5UTF9NQUNGQ1R5cGUpICsgc2l6ZW9mKHZfVTE2X3QpICsgXAogICAgKDMgKiAoc2l6ZW9mKHZfVThfdCkgKiBWT1NfTUFDX0FERFJfU0laRSkpICArIFwKICAgIHNpemVvZih2X1UxNl90KSkKCiAvKiBPcHRpb25hbCBBNCBhZGRyZXNzICovCiB2X1U4X3QgICBvcHR2QTRbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIE9wdGlvbmFsIFFPUyBjb250cm9sIGZpZWxkICovCiB2X1UxNl90ICB1c1Fvc0N0cmw7Cn1XTEFOVExfODAyMTFIZWFkZXJUeXBlOwoKLyogODAyLjMgaGVhZGVyICovCnR5cGVkZWYgc3RydWN0CnsKIC8qIERlc3RpbmF0aW9uIGFkZHJlc3MgZmllbGQgKi8KIHZfVThfdCAgIHZEQVtWT1NfTUFDX0FERFJfU0laRV07CgogLyogU291cmNlIGFkZHJlc3MgZmllbGQgKi8KIHZfVThfdCAgIHZTQVtWT1NfTUFDX0FERFJfU0laRV07CgogLyogTGVuZ3RoIGZpZWxkICovCiB2X1UxNl90ICB1c0xlblR5cGU7Cn1XTEFOVExfODAyM0hlYWRlclR5cGU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNkZWZpbmUgV0xBTl9UTF9JTlZBTElEX1VfU0lHIDI1NQojZGVmaW5lIFdMQU5fVExfSU5WQUxJRF9CX1NJRyAyNTUKI2RlZmluZSBFTlRFUigpIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJFbnRlcjolcyIsIF9fZnVuY19fKQoKI2RlZmluZSBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggX3BTVEEsIF91Y0FDTWFzaywgaSApIFwKICBkb1wKICB7XAogICAgX3VjQUNNYXNrID0gMDsgXAogICAgZm9yICggaSA9IDA7IGkgPCBXTEFOVExfTlVNX1RYX1FVRVVFUzsgaSsrICkgXAogICAgeyBcCiAgICAgIGlmICggMCAhPSAoX3BTVEEpLT5hdWNBQ01hc2tbaV0gKSBcCiAgICAgIHsgXAogICAgICAgIF91Y0FDTWFzayB8PSAoIDEgPDwgaSApOyBcCiAgICAgIH0gXAogICAgfSBcCiAgfSB3aGlsZSAoMCk7CgoKLyogRm9sbG93aW5nIGlzIHRoZSBjb3B5IG9mIGcxMWJSYXRlSW5mbyB0byB1bmRlcnN0YW5kIHJhdGUgaW5kZXggYXQgVEwgKi8KI2RlZmluZSBXTEFOVExfTUFYX1JBVEVfTlVNICAgICAgICAgICAgICAgMTM3CnR5cGVkZWYgc3RydWN0CnsKICAgdWludDMyIHBoeVJhdGU7ICAgLy91bml0IGluIE1lZ2EgYml0cyBwZXIgc2VjIFggMTAKICAgdWludDMyIHRwdXRSYXRlOyAgLy91bml0IGluIE1lZ2EgYml0cyBwZXIgc2VjIFggMTAKICAgdWludDMyIHRwdXRCcG1zOyAgLy91bml0IGluIEJ5dGVzIHBlciBtc2VjID0gKHRwdXRSYXRlWDEwMjR4MTAyNCkvKDh4MTBYMTAwMCkgfj0gKHRwdXRSYXRlKjEzKQogICB1aW50MzIgdHB1dEJwdXM7ICAvL3VuaXQgaW4gQnl0ZXMgcGVyIHVzZWM6IHJvdW5kIG9mZiB0byBpbnRlZ3JhbCB2YWx1ZQp9V0xBTlRMX1JhdGVJbmZvOwoKV0xBTlRMX1JhdGVJbmZvIGdUTFJhdGVJbmZvW1dMQU5UTF9NQVhfUkFURV9OVU1dICA9IHsKICAgIC8vMTFiIHJhdGVzCiAgICB7ICAxMCwgIDksICAxMTcsIDB9LCAvL2luZGV4IDAKICAgIHsgIDIwLCAgMTcsIDIyMSwgMH0sIC8vaW5kZXggMQogICAgeyAgNTUsICA0MSwgNTMzLCAwfSwgLy9pbmRleCAyCiAgICB7IDExMCwgIDY4LCA4ODQsIDB9LCAvL2luZGV4IDMKCiAgICAvLzExYiBzaG9ydCBwcmVhbWJsZQogICAgeyAgMTAsICAxMCwgIDEzMCwgMH0sIC8vaW5kZXggNAogICAgeyAgMjAsICAxOCwgIDIzNCwgMH0sIC8vaW5kZXggNQogICAgeyAgNTUsICA0NCwgIDU3MiwgMH0sIC8vaW5kZXggNgogICAgeyAxMTAsICA3NywgMTAwMSwgMH0sIC8vaW5kZXggNwoKICAgIC8vMTFhZwogICAgeyAgNjAsICA1MCwgIDY1MCwgMX0sIC8vaW5kZXggOAogICAgeyAgOTAsICA3MCwgIDkxMCwgMX0sIC8vaW5kZXggOQogICAgeyAxMjAsIDEwMCwgMTMwMCwgMX0sIC8vaW5kZXggMTAKICAgIHsgMTgwLCAxNTAsIDE5NTAsIDJ9LCAvL2luZGV4IDExCiAgICB7IDI0MCwgMTkwLCAyNDcwLCAyfSwgLy9pbmRleCAxMgogICAgeyAzNjAsIDI4MCwgMzY0MCwgNH0sIC8vaW5kZXggMTMKICAgIHsgNDgwLCAzNTAsIDQ1NTAsIDV9LCAvL2luZGV4IDE0CiAgICB7IDU0MCwgMzgwLCA0OTQwLCA2fSwgLy9pbmRleCAxNQoKICAgIC8vMTFuIFNJTU8KICAgIHsgIDY1LCAgNTQsICA3MDIsIDF9LCAvL2luZGV4IDE2CiAgICB7IDEzMCwgMTA4LCAxNDA0LCAxfSwgLy9pbmRleCAxNwogICAgeyAxOTUsIDE2MSwgMjA5MywgMn0sIC8vaW5kZXggMTgKICAgIHsgMjYwLCAyMTcsIDI4MjEsIDN9LCAvL2luZGV4IDE5CiAgICB7IDM5MCwgMzI2LCA0MjM4LCA0fSwgLy9pbmRleCAyMAogICAgeyA1MjAsIDQzNSwgNTY1NSwgNn0sIC8vaW5kZXggMjEKICAgIHsgNTg1LCA0OTIsIDYzOTYsIDZ9LCAvL2luZGV4IDIyCiAgICB7IDY1MCwgNTQ4LCA3MTI0LCA3fSwgLy9pbmRleCAyMwoKICAgIC8vMTFuIFNJTU8gU0dJCiAgICB7ICA3MiwgIDU5LCAgNzY3LCAxfSwgLy9pbmRleCAyNAogICAgeyAxNDQsIDExOCwgMTUzNCwgMn0sIC8vaW5kZXggMjUKICAgIHsgMjE3LCAxODAsIDIzNDAsIDJ9LCAvL2luZGV4IDI2CiAgICB7IDI4OSwgMjQzLCAzMTU5LCAzfSwgLy9pbmRleCAyNwogICAgeyA0MzQsIDM2MywgNDcxOSwgNX0sIC8vaW5kZXggMjgKICAgIHsgNTc4LCA0ODYsIDYzMTgsIDZ9LCAvL2luZGV4IDI5CiAgICB7IDY1MCwgNTQ4LCA3MTI0LCA3fSwgLy9pbmRleCAzMAogICAgeyA3MjIsIDYwNiwgNzg3OCwgOH0sIC8vaW5kZXggMzEKCiAgICAvLzExbiBHRiBTSU1PCiAgICB7ICA2NSwgIDU0LCAgNzAyLCAxfSwgLy9pbmRleCAzMgogICAgeyAxMzAsIDEwOCwgMTQwNCwgMX0sIC8vaW5kZXggMzMKICAgIHsgMTk1LCAxNjEsIDIwOTMsIDJ9LCAvL2luZGV4IDM0CiAgICB7IDI2MCwgMjE3LCAyODIxLCAzfSwgLy9pbmRleCAzNQogICAgeyAzOTAsIDMyNiwgNDIzOCwgNH0sIC8vaW5kZXggMzYKICAgIHsgNTIwLCA0MzUsIDU2NTUsIDZ9LCAvL2luZGV4IDM3CiAgICB7IDU4NSwgNDkyLCA2Mzk2LCA2fSwgLy9pbmRleCAzOAogICAgeyA2NTAsIDU0OCwgNzEyNCwgN30sIC8vaW5kZXggMzkKCiAgICAvLzExbiBTSU1PIENCIE1DUyAwIC0gNwogICAgeyAxMzUsICAgMTEwLCAgMTQzMCwgIDF9LCAvL2luZGV4IDQwCiAgICB7IDI3MCwgICAyMjMsICAyODk5LCAgM30sIC8vaW5kZXggNDEKICAgIHsgNDA1LCAgIDMzNywgIDQzODEsICA0fSwgLy9pbmRleCA0MgogICAgeyA1NDAsICAgNDU0LCAgNTkwMiwgIDZ9LCAvL2luZGV4IDQzCiAgICB7IDgxMCwgICA2NzksICA4ODI3LCAgOX0sIC8vaW5kZXggNDQKICAgIHsgMTA4MCwgIDkwOSwgMTE4MTcsIDEyfSwgLy9pbmRleCA0NQogICAgeyAxMjE1LCAxMDIyLCAxMzI4NiwgMTN9LCAvL2luZGV4IDQ2CiAgICB7IDEzNTAsIDExMzcsIDE0NzgxLCAxNX0sIC8vaW5kZXggNDcKCiAgICAvLzExbiBTSU1PIENCIFNHSSBNQ1MgMCAtIDcKICAgIHsgMTUwLCAgIDEyMSwgIDE1NzMsICAyfSwgLy9pbmRleCA0OAogICAgeyAzMDAsICAgMjQ5LCAgMzIzNywgIDN9LCAvL2luZGV4IDQ5CiAgICB7IDQ1MCwgICAzNzgsICA0OTE0LCAgNX0sIC8vaW5kZXggNTAKICAgIHsgNjAwLCAgIDUwMywgIDY1MzksICA3fSwgLy9pbmRleCA1MQogICAgeyA5MDAsICAgNzU4LCAgOTg1NCwgIDEwfSwgLy9pbmRleCA1MgogICAgeyAxMjAwLCAxMDEwLCAxMzEzMCwgMTN9LCAvL2luZGV4IDUzCiAgICB7IDEzNTAsIDExMzcsIDE0NzgxLCAxNX0sIC8vaW5kZXggNTQKICAgIHsgMTUwMCwgMTI2MiwgMTY0MDYsIDE2fSwgLy9pbmRleCA1NQoKICAgIC8vMTFuIFNJTU8gR0YgQ0IgTUNTIDAgLSA3CiAgICB7IDEzNSwgICAxMTAsICAgMTQzMCwgIDF9LCAvL2luZGV4IDU2CiAgICB7IDI3MCwgICAyMjMsICAgMjg5OSwgIDN9LCAvL2luZGV4IDU3CiAgICB7IDQwNSwgICAzMzcsICAgNDM4MSwgIDR9LCAvL2luZGV4IDU4CiAgICB7IDU0MCwgICA0NTQsICAgNTkwMiwgIDZ9LCAvL2luZGV4IDU5CiAgICB7IDgxMCwgICA2NzksICAgODgyNywgIDl9LCAvL2luZGV4IDYwCiAgICB7IDEwODAsICA5MDksICAxMTgxNywgMTJ9LCAvL2luZGV4IDYxCiAgICB7IDEyMTUsIDEwMjIsICAxMzI4NiwgMTN9LCAvL2luZGV4IDYyCiAgICB7IDEzNTAsIDExMzcsICAxNDc4MSwgMTV9LCAvL2luZGV4IDYzCgogICAgLy8xMUFDCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgNjQKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9yZXNlcnZlZCA2NQogICAgeyAgIDY1LCAgIDQ1LCAgIDU4NSwgIDF9LCAvL2luZGV4IDY2CiAgICB7ICAxMzAsICAgOTEsICAxMTgzLCAgMX0sIC8vaW5kZXggNjcKICAgIHsgIDE5NSwgIDEzNiwgIDE3NjgsICAyfSwgLy9pbmRleCA2OAogICAgeyAgMjYwLCAgMTgyLCAgMjM2NiwgIDJ9LCAvL2luZGV4IDY5CiAgICB7ICAzOTAsICAyNzMsICAzNTQ5LCAgNH0sIC8vaW5kZXggNzAKICAgIHsgIDUyMCwgIDM2NCwgIDQ3MzIsICA1fSwgLy9pbmRleCA3MQogICAgeyAgNTg1LCAgNDA5LCAgNTMxNywgIDV9LCAvL2luZGV4IDcyCiAgICB7ICA2NTAsICA0NTUsICA1OTE1LCAgNn0sIC8vaW5kZXggNzMKICAgIHsgIDc4MCwgIDU0NiwgIDcwOTgsICA3fSwgLy9pbmRleCA3NAogICAgeyAxMzUwLCAgNjc1LCAgODc3NSwgIDl9LCAvL3Jlc2VydmVkIDc1CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgNzYKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9yZXNlcnZlZCA3NwogICAgeyAxMzUwLCAgNjc1LCAgODc3NSwgIDl9LCAvL2luZGV4IDc4CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggNzkKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9pbmRleCA4MAogICAgeyAxMzUwLCAgNjc1LCAgODc3NSwgIDl9LCAvL2luZGV4IDgxCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggODIKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9pbmRleCA4MwogICAgeyAgNjU1LCAgNDU4LCAgNTk1NCwgIDZ9LCAvL2luZGV4IDg0CiAgICB7ICA3MjIsICA1MDUsICA2NTY1LCAgN30sIC8vaW5kZXggODUKICAgIHsgIDg2NiwgIDYwNiwgIDc4NzgsICA4fSwgLy9pbmRleCA4NgogICAgeyAxMzUwLCAgNjc1LCAgODc3NSwgIDl9LCAvL3Jlc2VydmVkIDg3CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgODgKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9yZXNlcnZlZCA4OQogICAgeyAgMTM1LCAgIDk0LCAgMTIyMiwgIDF9LCAvL2luZGV4IDkwCiAgICB7ICAyNzAsICAxODksICAyNDU3LCAgMn0sIC8vaW5kZXggOTEKICAgIHsgIDQwNSwgIDI4MywgIDM2NzksICA0fSwgLy9pbmRleCA5MgogICAgeyAgNTQwLCAgMzc4LCAgNDkxNCwgIDV9LCAvL2luZGV4IDkzCiAgICB7ICA4MTAsICA1NjcsICA3MzcxLCAgN30sIC8vaW5kZXggOTQKICAgIHsgMTA4MCwgIDc1NiwgIDk4MjgsIDEwfSwgLy9pbmRleCA5NQogICAgeyAxMjE1LCAgODUwLCAxMTA1MCwgMTF9LCAvL2luZGV4IDk2CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggOTcKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9pbmRleCA5OAogICAgeyAxNjIwLCAgODEwLCAxMDUzMCwgMTF9LCAvL2luZGV4IDk5CiAgICB7IDE4MDAsICA5MDAsIDExNzAwLCAxMn0sIC8vaW5kZXggMTAwCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgMTAxCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTAyCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTAzCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTA0CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTA1CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTA2CiAgICB7IDEyMDAsICA4NDAsIDEwOTIwLCAxMX0sIC8vaW5kZXggMTA3CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTA4CiAgICB7IDE1MDAsICA3NTAsICA5NzUwLCAxMH0sIC8vaW5kZXggMTA5CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTEwCiAgICB7IDE4MDAsICA5MDAsIDExNzAwLCAxMn0sIC8vaW5kZXggMTExCiAgICB7IDIwMDAsIDEwMDAsIDEzMDAwLCAxM30sIC8vaW5kZXggMTEyCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTEzCiAgICB7ICAyOTIsICAyMDQsICAyNjUyLCAgM30sIC8vaW5kZXggMTE0CiAgICB7ICA1ODUsICA0MDksICA1MzE3LCAgNX0sIC8vaW5kZXggMTE1CiAgICB7ICA4NzcsICA2MTMsICA3OTY5LCAgOH0sIC8vaW5kZXggMTE2CiAgICB7IDExNzAsICA4MTksIDEwNjQ3LCAxMX0sIC8vaW5kZXggMTE3CiAgICB7IDE3NTUsICA4NzcsIDExNDAxLCAxMX0sIC8vaW5kZXggMTE4CiAgICB7IDIzNDAsIDExNzAsIDE1MjEwLCAxNX0sIC8vaW5kZXggMTE5CiAgICB7IDI2MzIsIDEzMTYsIDE3MTA4LCAxN30sIC8vaW5kZXggMTIwCiAgICB7IDI5MjUsIDE0NjIsIDE5MDA2LCAxOX0sIC8vaW5kZXggMTIxCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTIyCiAgICB7IDM1MTAsIDE3NTUsIDIyODE1LCAyM30sIC8vaW5kZXggMTIzCiAgICB7IDM5MDAsIDE5NTAsIDI1MzUwLCAyNX0sIC8vaW5kZXggMTI0CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgMTI1CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTI2CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTI3CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTI4CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTI5CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTMwCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTMxCiAgICB7IDI5MjUsIDE0NjIsIDE5MDA2LCAxOX0sIC8vaW5kZXggMTMyCiAgICB7IDMyNTAsIDE2MjUsIDIxMTI1LCAyMX0sIC8vaW5kZXggMTMzCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTM0CiAgICB7IDM5MDAsIDE5NTAsIDI1MzUwLCAyNX0sIC8vaW5kZXggMTM1CiAgICB7IDQzMzMsIDIxNjYsIDI4MTU4LCAyOH0gIC8vaW5kZXggMTM2CiB9OwoKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogU3RhdGljIFZhcmlhYmxlIERlZmluaXRpb25zCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFN0YXRpYyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERlZmluaXRpb25zCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKc3RhdGljIFZPU19TVEFUVVMgCldMQU5UTF9HZXRFdGhlclR5cGUKKAogIHZfVThfdCAgICAgICAgICAgICAgICogYXVjQkRIZWFkZXIsCiAgdm9zX3BrdF90ICAgICAgICAgICAgKiB2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgdl9VMTZfdCAgICAgICAgICAgICAgKiB1c0V0aGVyVHlwZQopOwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBFeHRlcm5hbGl6ZWQgRnVuY3Rpb24gRGVmaW5pdGlvbnMKKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgICAgIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5CgogIERFU0NSSVBUSU9OCiAgSXQgZnJlZXMgdXAgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYWxsIHRoZSBTVEEgY2xpZW50cyBpbiBUTENCIGJsb2NrCiAgQ2FuIGJlIGNhbGxlZCBpbnNpZGUgQ2xvc2UsIFN0b3Agb3Igd2hlbiBzb21lIEZBVUxUIG9jY3VycwoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICBJTgogIHBDbGllbnRTVEE6ICAgIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjbGllbnQgcG9pbnRlciBhcnJheQoKICBSRVRVUk4gVkFMVUUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfRnJlZUNsaWVudE1lbW9yeQooV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEFbV0xBTl9NQVhfU1RBX0NPVU5UXSkKewogICAgdl9VMzJfdCBpID0gMDsKICAgIGZvcihpID0wOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICB7CiAgICAgICAgaWYoIE5VTEwgIT0gcENsaWVudFNUQVtpXSApCiAgICAgICAgewogICAgICAgICAgIHZvc19tZW1fZnJlZShwQ2xpZW50U1RBW2ldKTsKICAgICAgICB9CiAgICAgICAgcENsaWVudFNUQVtpXSA9IE5VTEw7CiAgICB9CiAgICByZXR1cm47Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX09wZW4KCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIREQgYXQgZHJpdmVyIGluaXRpYWxpemF0aW9uLiBUTCB3aWxsIGluaXRpYWxpemUgYWxsIGl0cwogICAgaW50ZXJuYWwgcmVzb3VyY2VzIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjYWxsIHRvIHN0YXJ0IHRvIHJlZ2lzdGVyCiAgICB3aXRoIHRoZSBvdGhlciBtb2R1bGVzLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHBUTENvbmZpZzogICAgICBUTCBDb25maWd1cmF0aW9uCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX09wZW4KKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9Db25maWdJbmZvVHlwZSogIHBUTENvbmZpZwopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOyAKICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCiAgdEhhbEhhbmRsZSAgICAgIHNtZUNvbnRleHQ7CiAgdl9VMzJfdCBpID0gMDsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICBWT1NfU1RBVFVTICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwojZW5kaWYKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICB2b3NfYWxsb2NfY29udGV4dCggcHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIAogICAgICAgICAgICAgICAgICAgICh2b2lkKikmcFRMQ2IsIHNpemVvZihXTEFOVExfQ2JUeXBlKSk7CgogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8ICggTlVMTCA9PSBwVExDb25maWcgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAiV0xBTiBUTDogSW52YWxpZCBpbnB1dCBwb2ludGVyIG9uIFdMQU5UTF9PcGVuIFRMICVwSyBDb25maWcgJXBLIiwgcFRMQ2IsIHBUTENvbmZpZyApKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKiBTZXQgdGhlIGRlZmF1bHQgbG9nIGxldmVsIHRvIFZPU19UUkFDRV9MRVZFTF9FUlJPUiAqLwogIHZvc190cmFjZV9zZXRMZXZlbChWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IpOwoKICBzbWVDb250ZXh0ID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHNtZUNvbnRleHQgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBzbWVDb250ZXh0IiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKiBaZXJvIG91dCB0aGUgbWVtb3J5IHNvIHdlIGFyZSBPSywgd2hlbiBDbGVhbkNCIGlzIGNhbGxlZC4qLwogIHZvc19tZW1femVybygodl9WT0lEX3QgKilwVExDYiwgc2l6ZW9mKFdMQU5UTF9DYlR5cGUpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFuIHVwIFRMIGNvbnRyb2wgYmxvY2ssIGluaXRpYWxpemUgYWxsIHZhbHVlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfT3BlbiIpKTsKCiAgZm9yICggaSA9MDsgaTxXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKyApCiAgewogICAgICBpZiAoIGkgPCBXTEFOX05PTjMyX1NUQV9DT1VOVCApCiAgICAgIHsKICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW2ldID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdMQU5UTF9TVEFDbGllbnRUeXBlKSk7CiAgICAgICAgICAvKiBBbGxvY2F0aW5nIG1lbW9yeSBmb3IgTEVHQUNZIFNUQSBDT1VOVCBzbyBhcyB0byBhdm9pZCByZWdyZXNzaW9uIGlzc3Vlcy4gICovCiAgICAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSApCiAgICAgICAgIHsKICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTiBUTDogU3RhQ2xpZW50IGFsbG9jYXRpb24gZmFpbGVkIikpOwogICAgICAgICAgICAgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkocFRMQ2ItPmF0bFNUQUNsaWVudHMpOwogICAgICAgICAgICAgdm9zX2ZyZWVfY29udGV4dChwdm9zR0N0eCwgVk9TX01PRFVMRV9JRF9UTCwgcFRMQ2IpOwogICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgICAgICAgfQogICAgICAgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopIHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLCBzaXplb2YoV0xBTlRMX1NUQUNsaWVudFR5cGUpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW2ldID0gTlVMTDsKICAgICAgfQogIH0KCiAgcFRMQ2ItPnJlb3JkZXJCdWZmZXJQb29sID0gdm9zX21lbV92bWFsbG9jKHNpemVvZihXTEFOVExfUkVPUkRFUl9CVUZGRVJfVCkgKiBXTEFOVExfTUFYX0JBX1NFU1NJT04pOwogIGlmIChOVUxMID09IHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6IFJlb3JkZXIgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkIikpOwogICAgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkocFRMQ2ItPmF0bFNUQUNsaWVudHMpOwogICAgdm9zX2ZyZWVfY29udGV4dChwdm9zR0N0eCwgVk9TX01PRFVMRV9JRF9UTCwgcFRMQ2IpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHZvc19tZW1femVybygodl9WT0lEX3QgKilwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wsIHNpemVvZihXTEFOVExfUkVPUkRFUl9CVUZGRVJfVCkgKiBXTEFOVExfTUFYX0JBX1NFU1NJT04pOwoKICBXTEFOVExfQ2xlYW5DQihwVExDYiwgMCAvKmRvIG5vdCBlbXB0eSovKTsKCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOVExfTlVNX1RYX1FVRVVFUyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjSW5kZXhdID0gcFRMQ29uZmlnLT51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjUmVvcmRlckFnaW5nVGltZVt1Y0luZGV4XSA9IHBUTENvbmZpZy0+dWNSZW9yZGVyQWdpbmdUaW1lW3VjSW5kZXhdOwogIH0KCiAgLy8gc2NoZWR1bGluZyBpbml0IHRvIGJlIHRoZSBsYXN0IG9uZSBvZiBwcmV2aW91cyByb3VuZAogIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfVk87CiAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbcFRMQ2ItPnVDdXJTZXJ2ZWRBQ107CiAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IFdMQU5fTUFYX1NUQV9DT1VOVC0xOwoKICB2b3NfdGltZXJfaW5pdCgmcFRMQ2ItPnR4X2ZyYW1lc190aW1lciwgVk9TX1RJTUVSX1RZUEVfU1csCiAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfU2FtcGxlVHgsICh2b2lkICopcFRMQ2IpOwojaWYgMAogIC8vZmxvdyBjb250cm9sIGZpZWxkIGluaXQKICB2b3NfbWVtX3plcm8oJnBUTENiLT50bEZDSW5mbywgc2l6ZW9mKHRGY1R4UGFyYW1zX3R5cGUpKTsKICAvL2JpdCAwOiBzZXQgKEJkL3BkdSBjb3VudCkgYml0IDE6IHNldCAocmVxdWVzdCBzdGF0aW9uIFBTIGNoYW5nZSBub3RpZmljYXRpb24pCiAgcFRMQ2ItPnRsRkNJbmZvLmZjQ29uZmlnID0gMHgxOwojZW5kaWYKCiAgcFRMQ2ItPnZvc1R4RkNCdWYgPSBOVUxMOwogIHBUTENiLT50bENvbmZpZ0luZm8udU1pbkZyYW1lc1Byb2NUaHJlcyA9CiAgICAgICAgICAgICAgICBwVExDb25maWctPnVNaW5GcmFtZXNQcm9jVGhyZXM7CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBwVExDYi0+dWNUZGxzUGVlckNvdW50ID0gMDsKI2VuZGlmCgogIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50ID0KICAgICAgICAgICAgICAgIHBUTENvbmZpZy0+dURlbGF5ZWRUcmlnZ2VyRnJtSW50OwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWxsb2NhdGUgaW50ZXJuYWwgcmVzb3VyY2VzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF9nZXRfcGFja2V0KCZwVExDYi0+dm9zRHVtbXlCdWYsIFZPU19QS1RfVFlQRV9SWF9SQVcsIDEsIDEsCiAgICAgICAgICAgICAgICAgICAgIDEvKnRydWUqLyxOVUxMLCBOVUxMKTsKCiAgV0xBTlRMX0luaXRCQVJlb3JkZXJCdWZmZXIocHZvc0dDdHgpOwojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAvKiBJbml0aWFsaXplIEhhbmRvZmYgc3VwcG9ydCBtb2R1ZQogICAgKiBSU1NJIG1lYXN1cmUgYW5kIFRyYWZmaWMgc3RhdGUgbW9uaXRvcmluZyAqLwogIHN0YXR1cyA9IFdMQU5UTF9IU0luaXQocHZvc0dDdHgpOwogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSBpbml0IGZhaWwiKSk7CiAgICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeShwVExDYi0+YXRsU1RBQ2xpZW50cyk7CiAgICB2b3NfbWVtX3ZmcmVlKHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCk7CiAgICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CiAgICByZXR1cm4gc3RhdHVzOwogIH0KI2VuZGlmCgojaWZkZWYgV0xBTl9GRUFUVVJFX1JNQwogICBzdGF0dXMgPSBXTEFOVExfUm1jSW5pdChwdm9zR0N0eCk7CiAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCiAgIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJSTUMgbW9kdWxlIGluaXQgZmFpbCIpKTsKICAgIHJldHVybiBzdGF0dXM7CiAgfQojZW5kaWYKCiAgcFRMQ2ItPmlzQk1QUyA9IFZPU19GQUxTRTsKICBwbWNSZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKCBzbWVDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9Qb3dlclN0YXRlQ2hhbmdlZENCLCBwdm9zR0N0eCApOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX09wZW4gKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1N0YXJ0CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgc3RhcnQgcHJvY2VkdXJlLiBUTCB3aWxsIHVzZSB0aGlzCiAgICBjYWxsIHRvIHJlZ2lzdGVyIHdpdGggQkFMIGFzIGEgdHJhbnNwb3J0IGxheWVyIGVudGl0eS4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgY29kZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgQkFMIGZhaWx1cmU7IHNlZSBCQUwgQVBJCiAgICBmb3IgbW9yZSBpbmZvCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1N0YXJ0CigKICB2X1BWT0lEX3QgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgICAgICA9IE5VTEw7CiAgdl9VMzJfdCAgICAgICAgICAgICB1UmVzQ291bnQgPSBXREFfVExJX01JTl9SRVNfREFUQTsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3RhcnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlZ2lzdGVyIHdpdGggV0RBIGFzIHRyYW5zcG9ydCBsYXllciBjbGllbnQKICAgIFJlcXVlc3QgcmVzb3VyY2VzIGZvciB0eCBmcm9tIGJ1cwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU4gVEw6V0xBTlRMX1N0YXJ0IikpOwoKICB0bFRyYWNlSW5pdCgpOwogIHZvc1N0YXR1cyA9IFdEQV9EU19SZWdpc3RlciggcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9UeENvbXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9SeEZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfR2V0RnJhbWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUmVzb3VyY2VDQiwKICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfVExJX01JTl9SRVNfREFUQSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICZ1UmVzQ291bnQgKTsgCgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggQkFML1dEQSwgRXJyOiAlZCIsCiAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIEVuYWJsZSB0cmFuc21pc3Npb24gKi8KICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAwKTsKICBwVExDYi0+dVJlc0NvdW50ID0gdVJlc0NvdW50OwoKICB2b3NfdGltZXJfc3RhcnQoJnBUTENiLT50eF9mcmFtZXNfdGltZXIsIFdMQU5UTF9TQU1QTEVfSU5URVJWQUwpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1N0YXJ0ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TdG9wCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIHRvIHN0b3Agb3BlcmF0aW9uIGluIFRMLCBiZWZvcmUgY2xvc2UuIFRMIHdpbGwgc3VzcGVuZCBhbGwKICAgIGZyYW1lIHRyYW5zZmVyIG9wZXJhdGlvbiBhbmQgd2lsbCB3YWl0IGZvciB0aGUgY2xvc2UgcmVxdWVzdCB0byBjbGVhbiB1cAogICAgaXRzIHJlc291cmNlcy4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1N0b3AKKAogIHZfUFZPSURfdCAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB2X1U4X3QgICAgICB1Y0luZGV4OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBFTlRFUigpOwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RvcCBUTCBhbmQgZW1wdHkgU3RhdGlvbiBsaXN0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9TdG9wIikpOwoKICAvKiBEaXNhYmxlIHRyYW5zbWlzc2lvbiAqLwogIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPnVjVHhTdXNwZW5kZWQsIDEpOwoKICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CiAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiA9IE5VTEw7CiAgfQoKICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiA9IE5VTEw7CiAgfQoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0xBTlRMX0hTU3RvcChwdm9zR0N0eCkpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICJIYW5kb2ZmIFN1cHBvcnQgbW9kdWxlIHN0b3AgZmFpbCIpKTsKICB9CiNlbmRpZgoKICAgaWYgKFZPU19USU1FUl9TVEFURV9TVE9QUEVEICE9CiAgICAgICAgICAgICAgICAgIHZvc190aW1lcl9nZXRDdXJyZW50U3RhdGUoJnBUTENiLT50eF9mcmFtZXNfdGltZXIpKQogICAgICB2b3NfdGltZXJfc3RvcCgmcFRMQ2ItPnR4X2ZyYW1lc190aW1lcik7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYW4gY2xpZW50IHN0YXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfU1RBX0NPVU5UOyB1Y0luZGV4KyspCiAgewogICAgaWYgKCBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdICkKICAgIHsKICAgICAgICBXTEFOVExfQ2xlYW5TVEEocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0sIDEgLyplbXB0eSBhbGwgcXVldWVzKi8pOwogICAgfQogIH0KCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU3RvcCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xvc2UKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIREQgZHVyaW5nIGdlbmVyYWwgZHJpdmVyIGNsb3NlIHByb2NlZHVyZS4gVEwgd2lsbCBjbGVhbiB1cAogICAgYWxsIHRoZSBpbnRlcm5hbCByZXNvdXJjZXMuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbG9zZQooCiAgdl9QVk9JRF90ICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHRIYWxIYW5kbGUgc21lQ29udGV4dDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRGVyZWdpc3RlciBmcm9tIFBNQwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHNtZUNvbnRleHQgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9TTUUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gc21lQ29udGV4dCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHNtZUNvbnRleHQiLCBfX2Z1bmNfXykpOwogICAgLy8gY29udGludWUgc28gdGhhdCB3ZSBjYW4gY2xlYW51cCBhcyBtdWNoIGFzIHBvc3NpYmxlCiAgfQogIGVsc2UKICB7CiAgICBwbWNEZXJlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQoIHNtZUNvbnRleHQsIFdMQU5UTF9Qb3dlclN0YXRlQ2hhbmdlZENCICk7CiAgfQoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0xBTlRMX0hTRGVJbml0KHB2b3NHQ3R4KSkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgIkhhbmRvZmYgU3VwcG9ydCBtb2R1bGUgRGVJbml0IGZhaWwiKSk7CiAgfQojZW5kaWYKCiNpZmRlZiBXTEFOX0ZFQVRVUkVfUk1DCiAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IFdMQU5UTF9SbWNEZUluaXQocHZvc0dDdHgpKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAiUk1DIG1vZHVsZSBEZUluaXQgZmFpbCIpKTsKICB9CiNlbmRpZgoKICAgaWYgKFZPU19USU1FUl9TVEFURV9SVU5OSU5HID09CiAgICAgICAgICAgICAgICAgICAgICAgdm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSgmcFRMQ2ItPnR4X2ZyYW1lc190aW1lcikpIHsKICAgICAgICAgdm9zX3RpbWVyX3N0b3AoJnBUTENiLT50eF9mcmFtZXNfdGltZXIpOwogICB9CiAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc190aW1lcl9kZXN0cm95KCZwVExDYi0+dHhfZnJhbWVzX3RpbWVyKSkpIHsKICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIiVzOiBDYW5ub3QgZGVhbGxvY2F0ZSBUWCBmcmFtZXMgc2FtcGxlIHRpbWVyIiwgX19mdW5jX18pKTsKICAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYW51cCBUTCBjb250cm9sIGJsb2NrLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDogV0xBTlRMX0Nsb3NlIikpOwogIFdMQU5UTF9DbGVhbkNCKHBUTENiLCAxIC8qIGVtcHR5IHF1ZXVlcy9saXN0cy9wa3RzIGlmIGFueSovKTsKCiAgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkocFRMQ2ItPmF0bFNUQUNsaWVudHMpOwoKICB2b3NfbWVtX3ZmcmVlKHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGcmVlIFRMIGNvbnRleHQgZnJvbSBWT1NTIGdsb2JhbAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0Nsb3NlICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggSERECiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsCgogIERFU0NSSVBUSU9OCiAgICAgRnVuY3Rpb24gdG8gZGlzYWJsZS9lbmFibGUgZnJhbWUgdHJhbnNsYXRpb24gZm9yIGFsbCBhc3NvY2lhdGlvbiBzdGF0aW9ucy4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgSU4KICAgIHB2b3NHQ3R4OiBWT1MgY29udGV4dCAKICAgIEVuYWJsZUZyYW1lWGxhdGlvbiBUUlVFIG1lYW5zIGVuYWJsZSBTVyB0cmFuc2xhdGlvbiBmb3IgYWxsIHN0YXRpb25zLgogICAgLgoKICBSRVRVUk4gVkFMVUUKCiAgIHZvaWQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZApXTEFOVExfQ29uZmlndXJlU3dGcmFtZVRYWGxhdGlvbkZvckFsbAooCiAgdl9QVk9JRF90IHB2b3NHQ3R4LCAKICB2X0JPT0xfdCBlbmFibGVGcmFtZVhsYXRpb24KKQp7CiAgdl9VOF90IHVjSW5kZXg7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uICIKICAgICAgICAgICAiV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGwiKSk7CiAgICByZXR1cm47CiAgfQoKICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAiV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGw6IENvbmZpZ3VyZSBTVyBmcmFtZVhsYXRpb24gJWQiLCAKICAgICAgZW5hYmxlRnJhbWVYbGF0aW9uKSk7CgogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfVElEOyB1Y0luZGV4KyspIAogIHsKICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XTsKICAgIGlmICggTlVMTCAhPSBwQ2xpZW50U1RBICYmIDAgIT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogICAgewojaWZkZWYgV0xBTl9TT0ZUQVBfVlNUQV9GRUFUVVJFCiAgICAgIC8vIGlmIHRoaXMgc3RhdGlvbiB3YXMgbm90IGFsbG9jYXRlZCByZXNvdXJjZXMgdG8gcGVyZm9ybSBIVy1iYXNlZAogICAgICAvLyBUWCBmcmFtZSB0cmFuc2xhdGlvbiB0aGVuIGZvcmNlIFNXLWJhc2VkIFRYIGZyYW1lIHRyYW5zbGF0aW9uCiAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIGZyYW1lIHRyYW5zbGF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQKICAgICAgaWYgKCFXREFfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUocHZvc0dDdHgsIHVjSW5kZXgpKQogICAgICB7CiAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gMTsKICAgICAgfQogICAgICBlbHNlCiNlbmRpZgogICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IGVuYWJsZUZyYW1lWGxhdGlvbjsKICAgIH0KICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TdGFydEZvcndhcmRpbmcKCiAgREVTQ1JJUFRJT04KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXNrIHNlcmlhbGl6YXRpb24gdGhyb3VnaCBUWCB0aHJlYWQgb2YgdGhlICAgCiAgICBjYWNoZWQgZnJhbWUgZm9yd2FyZGluZyAoaWYgc3RhdGF0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW4gd2hpbGUpIAogICAgb3IgZmx1c2hpbmcgKGlmIHN0YXRpb24gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlIHRpbWUpCgogICAgSW4gY2FzZSBvZiBmb3J3YXJkaW5nLCB1cHBlciBsYXllciBpcyBvbmx5IHJlcXVpcmVkIHRvIGNhbGwgV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50KCkKICAgIGFuZCBkb2Vzbid0IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkuIFRMIHdpbGwgaGFuZGxlIHRoaXMgaW5zaWRlIAogICAgV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50KCkuIAogICAgCiAgICBJbiBjYXNlIG9mIGZsdXNoaW5nLCB1cHBlciBsYXllciBpcyByZXF1aXJlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZXhwbGljaXRseQogICAgCiAgREVQRU5ERU5DSUVTCgogICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogICAKICBQQVJBTUVURVJTCgogICB1Y1NUQUlkOiAgIHN0YXRpb24gaWQgCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCiAgICBQbGVhc2UgY2hlY2sgcmV0dXJuIHZhbHVlcyBvZiB2b3NfdHhfbXFfc2VyaWFsaXplLgoKICBTSURFIEVGRkVDVFMKICAgIElmIFRMIHdhcyBhc2tlZCB0byBwZXJmb3JtIFdMQU5UTF9DYWNoZVNUQUZyYW1lKCkgaW4gV0xBTlRMX1J4RnJhbWVzKCksIAogICAgZWl0aGVyIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCgpIG9yIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgCiAgICB3aXRoaW4gcmVhc29uYWJsZSB0aW1lLiBPdGhlcndpc2UsIFRMIHdpbGwga2VlcCBjYWNoZWQgdm9zIGJ1ZmZlciB1bnRpbAogICAgb25lIG9mIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQgbWF5IGVuZCB1cCB3aXRoIHN5c3RlbSBidWZmZXIgZXhoYXN1dGlvbi4gCgogICAgSXQncyBhbiB1cHBlciBsYXllcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBjYXNlIG9mCiAgICBmbHVzaGluZwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTIApXTEFOVExfU3RhcnRGb3J3YXJkaW5nCigKICB2X1U4X3QgdWNTVEFJZCwKICB2X1U4X3QgdWNVY2FzdFNpZywgCiAgdl9VOF90IHVjQmNhc3RTaWcgCikKewogIHZvc19tc2dfdCAgICAgIHNNZXNzYWdlOwogIHZfVTMyX3QgICAgICAgIHVEYXRhOyAgICAgICAgICAgICAKIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCgogIC8qIFNpZ25hbCB0aGUgT1MgdG8gc2VyaWFsaXplIG91ciBldmVudCAqLwogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAiU2VyaWFsaXppbmcgVEwgU3RhcnQgRm9yd2FyZGluZyBDYWNoZWQgZm9yIGNvbnRyb2wgU1RBICVkIiwgCiAgICAgICAgICAgICAgdWNTVEFJZCApOwoKICB2b3NfbWVtX3plcm8oICZzTWVzc2FnZSwgc2l6ZW9mKHZvc19tc2dfdCkgKTsKCiAgdURhdGEgPSB1Y1NUQUlkIHwgKHVjVWNhc3RTaWcgPDwgOCApIHwgKHVjQmNhc3RTaWcgPDwgMTYpOyAKICBzTWVzc2FnZS5ib2R5dmFsID0gdURhdGE7CiAgc01lc3NhZ2UudHlwZSAgICA9IFdMQU5UTF9SWF9GV0RfQ0FDSEVEOwoKICByZXR1cm4gdm9zX3J4X21xX3NlcmlhbGl6ZShWT1NfTVFfSURfVEwsICZzTWVzc2FnZSk7Cgp9IC8qIFdMQU5UTF9TdGFydEZvcndhcmRpbmcoKSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0VuYWJsZUNhY2hpbmcKCiAgREVTQ1JJUFRJT04KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIGNhY2hpbmcgb25seSB3aGVuIGFzc29jL3JlYXNzb2MgcmVxIGlzIHNlbmQuCiAgICB0aGF0IGlzIGNhY2hlIHBhY2tldHMgb25seSBmb3Igc3VjaCBTVEEgSUQuCgoKICBERVBFTkRFTkNJRVMKCiAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCgogIFBBUkFNRVRFUlMKCiAgIHN0YUlkOiAgIHN0YXRpb24gaWQKCiAgUkVUVVJOIFZBTFVFCgogICBub25lCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfRW5hYmxlQ2FjaGluZyh2X1U4X3Qgc3RhSWQpCnsKICB2X1BWT0lEX3QgcHZvc0dDdHg9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCxOVUxMKTsKICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uICIKICAgICAgICAgICAiV0xBTlRMX0VuYWJsZUNhY2hpbmciKSk7CiAgICByZXR1cm47CiAgfQogIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXS0+ZW5hYmxlQ2FjaGluZyA9IDE7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Bc3NvY0ZhaWxlZAoKICBERVNDUklQVElPTgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBQRSB0byBub3RpZnkgVEwgdGhhdCBjYWNoZSBuZWVkcyB0byBmbHVzaGVkJyAKICAgIHdoZW4gYXNzb2NpYXRpb24gaXMgbm90IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgCgogICAgSW50ZXJuYWxseSwgVEwgcG9zdCBhIG1lc3NhZ2UgdG8gVFhfVGhyZWFkIHRvIHNlcmlhbGl6ZSB0aGUgcmVxdWVzdCB0byAKICAgIGtlZXAgbG9jay1mcmVlIG1lY2hhbmlzbS4KCiAgIAogIERFUEVOREVOQ0lFUwoKICAgIFRMIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICAgCiAgUEFSQU1FVEVSUwoKICAgdWNTVEFJZDogICBzdGF0aW9uIGlkIAoKICBSRVRVUk4gVkFMVUUKCiAgIG5vbmUKICAgCiAgU0lERSBFRkZFQ1RTCiAgIFRoZXJlIG1heSBiZSByYWNlIGNvbmRpdGlvbiB0aGF0IFBFIGNhbGwgdGhpcyBBUEkgYW5kIHNlbmQgYW5vdGhlciBhc3NvY2lhdGlvbgogICByZXF1ZXN0IGltbWVkaWF0ZWx5IHdpdGggc2FtZSBzdGFJZCBiZWZvcmUgVFhfdGhyZWFkIGNhbiBwcm9jZXNzIHRoZSBtZXNzYWdlLgoKICAgVG8gYXZvaWQgdGhpcywgd2UgbWlnaHQgbmVlZCBQRSB0byB3YWl0IGZvciBUWF90aHJlYWQgcHJvY2VzcyB0aGUgbWVzc2FnZSwKICAgYnV0IHRoaXMgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gCiAgIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfQXNzb2NGYWlsZWQodl9VOF90IHN0YUlkKQp7CiAgLy8gZmx1c2hpbmcgZnJhbWVzIGFuZCBmb3J3YXJkaW5nIGZyYW1lcyB1c2VzIHRoZSBzYW1lIG1lc3NhZ2UKICAvLyB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBtZXNzYWdlIGlzIHByb2Nlc3NlZAogIC8vIGlmIHRoZSBTVEEgZXhpc3QsIHRoZSBmcmFtZXMgd2lsbCBiZSBmb3J3YXJkZWQKICAvLyBhbmQgaWYgaXQgZG9lc24ndCBleGlzdCwgdGhlIGZyYW1lcyB3aWxsIGJlIGZsdXNoZWQKICAvLyBpbiB0aGlzIGNhc2Ugd2Uga25vdyBpdCB3b24ndCBleGlzdCBzbyB0aGUgRFBVIGluZGV4IHNpZ25hdHVyZSB2YWx1ZXMgZG9uJ3QgbWF0dGVyCiAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX0FTU09DX0ZBSUxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhSWQsIDApKTsKCiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhXTEFOVExfU3RhcnRGb3J3YXJkaW5nKHN0YUlkLDAsMCkpKQogIHsKICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiICVzIGZhaWxzIHRvIHN0YXJ0IGZvcndhcmRpbmcgKHN0YUlkICVkKSIsIF9fZnVuY19fLCBzdGFJZCk7CiAgfQp9CgogIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICBXTEFOVExfRmluaXNoX1VMQQoKICBERVNDUklQVElPTgogICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBIREQgdG8gbm90aWZ5IFRMIHRvIGZpbmlzaCBVcHBlciBsYXllciBhdXRoZW50aWNhdGlvbgogICAgIGluY2FzZSB0aGUgbGFzdCBFQVBPTCBwYWNrZXQgaXMgcGVuZGluZyBpbiB0aGUgVEwgcXVldWUuIAogICAgIFRvIGF2b2lkIHRoZSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHNtZSBzZXQga2V5IGFuZCB0aGUgbGFzdCBFQVBPTCBwYWNrZXQgCiAgICAgdGhlIEhERCBtb2R1bGUgY2FsbHMgdGhpcyBmdW5jdGlvbiBqdXN0IGJlZm9yZSBjYWxsaW5nIHRoZSBzbWVfUm9hbVNldEtleS4KCiAgREVQRU5ERU5DSUVTCgogICAgIFRMIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBjYWxsYmFja1JvdXRpbmU6ICAgSEREIENhbGxiYWNrIGZ1bmN0aW9uLgogICBjYWxsYmFja0NvbnRleHQgOiBIREQgdXNlcmRhdGEgY29udGV4dC4KCiAgIFJFVFVSTiBWQUxVRQoKICAgVk9TX1NUQVRVU19TVUNDRVNTL1ZPU19TVEFUVVNfRkFJTFVSRQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUyBXTEFOVExfRmluaXNoX1VMQSggdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dCkKewogICByZXR1cm4gV0RBX0RTX0ZpbmlzaFVMQSggY2FsbGJhY2tSb3V0aW5lLCBjYWxsYmFja0NvbnRleHQpOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50CgogIERFU0NSSVBUSU9OCgogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IEhERCB0byByZWdpc3RlciBhcyBhIGNsaWVudCBmb3IgZGF0YSBzZXJ2aWNlcwogICAgd2l0aCBUTC4gSEREIHdpbGwgY2FsbCB0aGlzIEFQSSBmb3IgZWFjaCBuZXcgc3RhdGlvbiB0aGF0IGl0IGFkZHMsCiAgICB0aHVzIGhhdmluZyB0aGUgZmxleGliaWxpdHkgb2YgcmVnaXN0ZXJpbmcgZGlmZmVyZW50IGNhbGxiYWNrIGZvciBlYWNoCiAgICBTVEEgaXQgc2VydmljZXMuCgogIERFUEVOREVOQ0lFUwoKICAgIFRMIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICAgIFJlc3RyaWN0aW9uOgogICAgICBNYWluIHRocmVhZCB3aWxsIGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYXQgVHggYW5kIFJ4IHRocmVhZHMgdGh1cwogICAgICBndWFyYW50ZWVpbmcgdGhhdCBhIHN0YXRpb24gd2lsbCBiZSBhZGRlZCBiZWZvcmUgYW55IGRhdGEgY2FuIGJlCiAgICAgIHJlY2VpdmVkIGZvciBpdC4gKFRoaXMgZW5hYmxlcyBUTCB0byBiZSBsb2NrIGZyZWUpCgogIFBBUkFNRVRFUlMKCiAgIHB2b3NHQ3R4OiAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgcGZuU3RBUng6ICAgICAgICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHBhY2tldCBoYW5kbGVyIGZyb20gSERECiAgIHBmblNUQVR4Q29tcDogICAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgY29tcGxldGUgY29uZmlybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgaGFuZGxlciBmcm9tIEhERAogICBwZm5TVEFGZXRjaFBrdDogIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHBhY2tldCByZXRyaWV2YWwgcm91dGluZSBpbiBIREQKICAgd1NUQURlc2NUeXBlOiAgICBTVEEgRGVzY3JpcHRvciwgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICBuZXcgYWRkZWQgU1RBCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6IFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9TVEFSeENCVHlwZSAgICAgICAgcGZuU1RBUngsCiAgV0xBTlRMX1R4Q29tcENCVHlwZSAgICAgICBwZm5TVEFUeENvbXAsCiAgV0xBTlRMX1NUQUZldGNoUGt0Q0JUeXBlICBwZm5TVEFGZXRjaFBrdCwKICBXTEFOX1NUQURlc2NUeXBlKiAgICAgICAgIHB3U1RBRGVzY1R5cGUsCiAgdl9TN190ICAgICAgICAgICAgICAgICAgICByc3NpCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIHZfVThfdCAgICB1Y1RpZCA9IDA7LypMb2NhbCB2YXJpYWJsZSB0byBjbGVhciBwcmV2aW91cyByZXBsYXkgY291bnRlcnMgb2YgU1RBIG9uIGFsbCBUSURzKi8KICB2X1UzMl90ICAgaXN0b2dnbGVBcnBFbmIgPSAwOwogIHRwQW5pU2lyR2xvYmFsIHBNYWM7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBFTlRFUigpOwogIGlmICgoIE5VTEwgPT0gcHdTVEFEZXNjVHlwZSApIHx8ICggTlVMTCA9PSBwZm5TVEFSeCApIHx8CiAgICAgICggTlVMTCA9PSBwZm5TVEFGZXRjaFBrdCApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8vQ29kZSBmb3IgY2hlY2tpbmcgYW5kIGFsbG9jYXRpbmcgbWVtb3J5IGZvciBuZXcgU1RBCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdICl7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdMQU5UTF9TVEFDbGllbnRUeXBlKSk7CiAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSApewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6IFNUQSBDbGllbnQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGluIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgfQogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgIldMQU4gVEw6IFNUQSBDbGllbnQgbWVtb3J5IGFsbG9jYXRpb24gaW4gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogIH0KCiAgLy9Bc3NpZ25pbmcgdGhlIHBvaW50ZXIgdG8gbG9jYWwgdmFyaWFibGUgZm9yIGVhc3kgYWNjZXNzIGluIGZ1dHVyZQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXTsKICBpZiAoIDAgIT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIHBDbGllbnRTVEEtPnVjRXhpc3RzKys7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfUkVHSVNURVJfU1RBX0NMSUVOVCwKICAgICAgICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsICh1bnNpZ25lZCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKHB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzLmJ5dGVzKzIpPDwyNCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzLmJ5dGVzKzMpPDwxNiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzLmJ5dGVzKzQpPDw4IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHdTVEFEZXNjVHlwZS0+dlNUQU1BQ0FkZHJlc3MuYnl0ZXMrNSkpKSk7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBTVEEgQ2xpZW50IElEOiAlZCIsIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQgKSk7CgogIHBDbGllbnRTVEEtPnBmblNUQVJ4ICAgICAgID0gcGZuU1RBUng7CiAgcENsaWVudFNUQS0+cGZuU1RBRmV0Y2hQa3QgPSBwZm5TVEFGZXRjaFBrdDsKCiAgLyogT25seSByZWdpc3RlciBpZiBkaWZmZXJlbnQgZnJvbSBOVUxMIC0gVEwgZGVmYXVsdCBUeCBDb21wIENiIHdpbGwKICAgIHJlbGVhc2UgdGhlIHZvcyBwYWNrZXQgKi8KICBpZiAoIE5VTEwgIT0gcGZuU1RBVHhDb21wICkKICB7CiAgICBwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAgICA9IHBmblNUQVR4Q29tcDsKICB9CgogIHBDbGllbnRTVEEtPnRsU3RhdGUgID0gV0xBTlRMX1NUQV9JTklUOwogIHBDbGllbnRTVEEtPnRsUHJpICAgID0gV0xBTlRMX1NUQV9QUklfTk9STUFMOwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU1RBSWQgID0gcHdTVEFEZXNjVHlwZS0+dWNTVEFJZDsKICBwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQgPSAwOwogIHBDbGllbnRTVEEtPmRpc2Fzc29jX3Byb2dyZXNzID0gVk9TX0ZBTFNFOwoKICBwTWFjID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgIT0gcE1hYyApCiAgewogICAgd2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19UT0dHTEVfQVJQX0JEUkFURVMsICZpc3RvZ2dsZUFycEVuYik7CiAgfQogIHBDbGllbnRTVEEtPmFycFJhdGUgPSBpc3RvZ2dsZUFycEVuYiA/IEVOQUJMRV9BUlBfVE9HR0xFIDogRElTQUJMRV9BUlBfVE9HR0xFOwogIHBDbGllbnRTVEEtPmFycE9uV1E1ID0gaXN0b2dnbGVBcnBFbmIgPT0gU0VORF9BUlBfT05fV1E1OwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAiV0xBTiBUTDpSZWdpc3RlcmluZyBTVEEgQ2xpZW50IElEOiAlZCB3aXRoIFVDICVkIGFuZCBCQyAlZCB0b2dnbGVBcnAgOiVoaHUiLAogICAgcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCwgcHdTVEFEZXNjVHlwZS0+dWNVY2FzdFNpZywKICAgIHB3U1RBRGVzY1R5cGUtPnVjQmNhc3RTaWcsIHBDbGllbnRTVEEtPmFycFJhdGUpKTsKCiAgcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgPSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZTsKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkID0gcHdTVEFEZXNjVHlwZS0+dWNRb3NFbmFibGVkOwoKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0FkZFJtdkxMQyA9IHB3U1RBRGVzY1R5cGUtPnVjQWRkUm12TExDOwoKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Byb3RlY3RlZEZyYW1lID0gcHdTVEFEZXNjVHlwZS0+dWNQcm90ZWN0ZWRGcmFtZTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNJc0VzZVN0YSA9IHB3U1RBRGVzY1R5cGUtPnVjSXNFc2VTdGE7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBTVEEgQ2xpZW50IElEOiAlZCBRb1MgJWQgQWRkIExMQyAlZCBQcm90RnJhbWUgJWQgRXNlU3RhICVkIiwKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsIAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNRb3NFbmFibGVkLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNBZGRSbXZMTEMsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1Byb3RlY3RlZEZyYW1lLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNJc0VzZVN0YSkpOwojZWxzZQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgUW9TICVkIEFkZCBMTEMgJWQgUHJvdEZyYW1lICVkIiwgCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZCwKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjQWRkUm12TExDLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNQcm90ZWN0ZWRGcmFtZSkpOwoKI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0VTRQojaWZkZWYgV0xBTl9TT0ZUQVBfVlNUQV9GRUFUVVJFCiAgLy8gaWYgdGhpcyBzdGF0aW9uIHdhcyBub3QgYWxsb2NhdGVkIHJlc291cmNlcyB0byBwZXJmb3JtIEhXLWJhc2VkCiAgLy8gVFggZnJhbWUgdHJhbnNsYXRpb24gdGhlbiBmb3JjZSBTVy1iYXNlZCBUWCBmcmFtZSB0cmFuc2xhdGlvbgogIC8vIG90aGVyd2lzZSB1c2UgdGhlIGZyYW1lIHRyYW5zbGF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQKCiAgaWYgKCFXREFfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUocHZvc0dDdHgsIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQpCiAgICAgIHx8ICggV0xBTl9TVEFfQlRfQU1QID09IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlKSkKICB7CiAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVRYWGxhdGlvbiA9IDE7CiAgfQojZW5kaWYKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gcHdTVEFEZXNjVHlwZS0+dWNTd0ZyYW1lVFhYbGF0aW9uOwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbiA9IHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVJYWGxhdGlvbjsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNXYXBpU3RhID0gcHdTVEFEZXNjVHlwZS0+dWNJc1dhcGlTdGE7CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICB2b3NfY29weV9tYWNhZGRyKCAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MsICZwd1NUQURlc2NUeXBlLT52U1RBTUFDQWRkcmVzcyk7CgogIHZvc19jb3B5X21hY2FkZHIoICZwQ2xpZW50U1RBLT53U1RBRGVzYy52QlNTSURmb3JJQlNTLCAmcHdTVEFEZXNjVHlwZS0+dkJTU0lEZm9ySUJTUyk7CgogIHZvc19jb3B5X21hY2FkZHIoICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MsICZwd1NUQURlc2NUeXBlLT52U2VsZk1BQ0FkZHJlc3MpOwoKICAvKiBJbiB2b2xhbnMgcmVsZWFzZSBMIHJlcGxheSBjaGVjayBpcyBkb25lIGF0IFRMICovCiAgcENsaWVudFNUQS0+dWNJc1JlcGxheUNoZWNrVmFsaWQgPSBwd1NUQURlc2NUeXBlLT51Y0lzUmVwbGF5Q2hlY2tWYWxpZDsKICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkID0gIDA7Ci8qQ2xlYXIgcmVwbGF5IGNvdW50ZXJzIG9mIHRoZSBTVEEgb24gYWxsIFRJRHMqLwogIGZvcih1Y1RpZCA9IDA7IHVjVGlkIDwgV0xBTlRMX01BWF9USUQgOyB1Y1RpZCsrKQogIHsKICAgIHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdID0gIDA7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFNldCB0aGUgQUMgZm9yIHRoZSByZWdpc3RlcmVkIHN0YXRpb24gdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgQUMKICAgICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgICBtYWRlIGluIHRoZSBtYWluIFRMIGxvb3AgYWZ0ZXIgdGhlIHN1cHBvcnRlZCBtYXNrIGlzIHByb3Blcmx5CiAgICAgIHVwZGF0ZWQgaW4gdGhlIHBlbmRpbmcgcGFja2V0cyBjYWxsCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dWNDdXJyZW50QUMgICAgID0gV0xBTlRMX0FDX0hJR0hfUFJJTzsKICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRXZWlnaHQgPSAwOwogIHBDbGllbnRTVEEtPnVjU2VydmljZWRBQyAgICA9IFdMQU5UTF9BQ19CSzsKICBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZyA9IDA7CgogIHZvc19tZW1femVybyggcENsaWVudFNUQS0+YXVjQUNNYXNrLCBzaXplb2YocENsaWVudFNUQS0+YXVjQUNNYXNrKSk7CgogIHZvc19tZW1femVybyggJnBDbGllbnRTVEEtPndVQVBTREluZm8sIHNpemVvZihwQ2xpZW50U1RBLT53VUFQU0RJbmZvKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlb3JkZXJpbmcgaW5mbyBhbmQgQU1TRFUgZGUtYWdncmVnYXRpb24KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm8sCiAgICAgc2l6ZW9mKHBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm9bMF0pKgogICAgIFdMQU5fTUFYX1RJRCk7CgogIHZvc19tZW1femVybyggcENsaWVudFNUQS0+YXVjTVBEVUhlYWRlciwKICAgICAgICAgICAgICAgIFdMQU5UTF9NUERVX0hFQURFUl9MRU4pOwoKICBwQ2xpZW50U1RBLT51Y01QRFVIZWFkZXJMZW4gICA9IDA7CiAgcENsaWVudFNUQS0+dm9zQU1TRFVDaGFpbiAgICAgPSBOVUxMOwogIHBDbGllbnRTVEEtPnZvc0FNU0RVQ2hhaW5Sb290ID0gTlVMTDsKCgogIC8qIFJlb3JkZXIgTE9DSwogICAqIER1cmluZyBoYW5kbGUgbm9ybWFsIFJYIGZyYW1lIHdpdGhpbiBSWCB0aHJlYWQsCiAgICogaWYgTUMgdGhyZWFkIHRyeSB0byBwcmVlbXB0LCBBRERCQSwgREVMQkEsIFRJTUVSCiAgICogQ29udGV4dCBzaG91bGQgYmUgcHJvdGVjdGVkIGZyb20gcmFjZSAqLwogIGZvciAodWNUaWQgPSAwOyB1Y1RpZCA8IFdMQU5fTUFYX1RJRCA7IHVjVGlkKyspCiAgewogICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoCiAgICAgICAgdm9zX2xvY2tfaW5pdCgmcENsaWVudFNUQS0+YXRsQkFSZW9yZGVySW5mb1t1Y1RpZF0ucmVvcmRlckxvY2spKSkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJMb2NrIEluaXQgRmFpbCIpKTsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RhdHMgaW5mbwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19tZW1femVybyggcENsaWVudFNUQS0+YXVSeENvdW50LAogICAgICBzaXplb2YocENsaWVudFNUQS0+YXVSeENvdW50WzBdKSoKICAgICAgV0xBTl9NQVhfVElEKTsKCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdVR4Q291bnQsCiAgICAgIHNpemVvZihwQ2xpZW50U1RBLT5hdVJ4Q291bnRbMF0pKgogICAgICBXTEFOX01BWF9USUQpOwogIC8qIEluaXRpYWwgUlNTSSBpcyBhbHdheXMgcmVwb3J0ZWQgYXMgemVybyBiZWNhdXNlIFRMIGRvZXNudCBoYXZlIGVub3VnaAogICAgIGRhdGEgdG8gY2FsY3VsYXRlIFJTU0kuIFNvIHRvIGF2b2lkIHJlcG9ydGluZyB6ZXJvLCB3ZSBhcmUgaW5pdGlhbGl6aW5nCiAgICAgUlNTSSB3aXRoIFJTU0kgc2F2ZWQgaW4gQnNzRGVzY3JpcHRpb24gZHVyaW5nIHNjYW5uaW5nLiAqLwogIHBDbGllbnRTVEEtPnJzc2lBdmcgPSByc3NpOwogIHBDbGllbnRTVEEtPnJzc2lBdmdCbXBzID0gcnNzaTsKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgaWYoV0xBTl9TVEFfVERMUyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICB7CiAgICAvKiBJZiBjbGllbnQgaXMgVERMUywgdXNlIFRETFMgc3BlY2lmaWMgYWxwaGEgKi8KICAgIHBDbGllbnRTVEEtPnJzc2lBbHBoYSA9IFdMQU5UTF9IT19URExTX0FMUEhBOwogIH0KICBlbHNlCiAgewogICAgcENsaWVudFNUQS0+cnNzaUFscGhhID0gV0xBTlRMX0hPX0RFRkFVTFRfQUxQSEE7CiAgfQojZWxzZQogICAgcENsaWVudFNUQS0+cnNzaUFscGhhID0gV0xBTlRMX0hPX0RFRkFVTFRfQUxQSEE7CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fVERMUyAqLwojaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKICBwQ2xpZW50U1RBLT5yc3NpRGF0YUFscGhhID0gV0xBTlRMX0hPX0RFRkFVTFRfQUxQSEE7CiAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1swXS5hYyA9IFdMQU5UTF9BQ19CSzsKICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzFdLmFjID0gV0xBTlRMX0FDX0JFOwogIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMl0uYWMgPSBXTEFOVExfQUNfVkk7CiAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1szXS5hYyA9IFdMQU5UTF9BQ19WTzsKI2VuZGlmCgogIC8qVHggbm90IHN1c3BlbmRlZCBhbmQgc3RhdGlvbiBmdWxseSByZWdpc3RlcmVkKi8KICB2b3NfYXRvbWljX3NldF9VOCgKICAgICAgICAmcENsaWVudFNUQS0+dWNUeFN1c3BlbmRlZCwgMCk7CgogIC8qIFVzZWQgdW50aWwgbXVsdGlwbGUgc3RhdGlvbiBzdXBwb3J0IHdpbGwgYmUgYWRkZWQqLwogIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCA9IHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQ7CgogIC8qIFNhdmUgdGhlIEJBUCBzdGF0aW9uIElEIGZvciBmdXR1cmUgdXNhZ2UgKi8KICBpZiAoIFdMQU5fU1RBX0JUX0FNUCA9PSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZSApCiAgewogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjQkFQU1RBSWQgPSBwd1NUQURlc2NUeXBlLT51Y1NUQUlkOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0YXRpc3RpY3MgaW5mbyAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBtZW1zZXQoJnBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLAogICAgICAgICAwLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RhcnQgd2l0aCB0aGUgc3RhdGUgc3VnZ2VzdGVkIGJ5IGNsaWVudCBjYWxsZXIKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT50bFN0YXRlID0gcHdTVEFEZXNjVHlwZS0+dWNJbml0U3RhdGU7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWZ0ZXIgYWxsIHRoZSBpbml0IGlzIGNvbXBsZXRlIHdlIGNhbiBtYXJrIHRoZSBleGlzdGFuY2UgZmxhZyAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnVjRXhpc3RzKys7CgogIC8vZmxvdyBjb250cm9sIGZpZWxkcyBpbml0CiAgcENsaWVudFNUQS0+dWNMd21Nb2RlRW5hYmxlZCA9IEZBTFNFOwogIHBDbGllbnRTVEEtPnVjTHdtRXZlbnRSZXBvcnRlZCA9IEZBTFNFOwogIHBDbGllbnRTVEEtPmJtdU1lbUNvbnN1bWVkID0gMDsKICBwQ2xpZW50U1RBLT51SW5ncmVzc19sZW5ndGggPSAwOwogIHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID0gV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWDsKCiAgcENsaWVudFNUQS0+dUx3bVRocmVzaG9sZCA9IFdMQU5UTF9TVEFfQk1VX1RIUkVTSE9MRF9NQVggLyAzOwoKICAvL0BAQCBIRERTT0ZUQVAgZG9lcyBub3QgcXVldWUgdW5yZWdpc3RlcmVkIHBhY2tldCBmb3Igbm93CiAgaWYgKCBXTEFOX1NUQV9TT0ZUQVAgIT0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGUgKQogIHsgCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBGb3J3YXJkIHJlY2VpdmVkIGZyYW1lcyB3aGlsZSBTVEEgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZCAKICAgIC0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhXTEFOVExfU3RhcnRGb3J3YXJkaW5nKCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNVY2FzdFNpZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjQmNhc3RTaWcpKSkKICAgIHsKICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIiAlcyBmYWlscyB0byBzdGFydCBmb3J3YXJkaW5nIiwgX19mdW5jX18pOwogICAgfQojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAgIGlmKCBXTEFOX1NUQV9URExTID09IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlICkKICAgICAgICBwVExDYi0+dWNUZGxzUGVlckNvdW50Kys7CiNlbmRpZgogIH0KI2lmZGVmIFdMQU5fRkVBVFVSRV9STUMKICB2b3NfbG9ja19pbml0KCZwQ2xpZW50U1RBLT5tY0xvY2spOwojZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JNQyAqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xlYXJTVEFDbGllbnQKCiAgREVTQ1JJUFRJT04KCiAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHdoZW4gaXQgbm8gbG9uZ2VyIG5lZWRzIGRhdGEgc2VydmljZXMgZm9yIHRoZQogICAgcGFydGljdWxhciBzdGF0aW9uLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNsZWFyIHJlZ2lzdHJhdGlvbiBpcwogICAgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSB0byBiZSBjbGVhcmVkCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NsZWFyU1RBQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7IAogIHZfVThfdCAgdWNJbmRleDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgRU5URVIoKTsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NsZWFyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2xlYXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9DbGVhclNUQUNsaWVudCIpKTsKICAgIC8qIENsZWFuIHBhY2tldHMgY2FjaGVkIGZvciB0aGUgU1RBICovCiAgICBXTEFOVExfU3RhcnRGb3J3YXJkaW5nKHVjU1RBSWQsMCwwKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyogRGVsZXRlIEJBIHNlc3Npb25zIG9uIGFsbCBUSUQncyAqLwogIGZvciAodWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9USUQgOyB1Y0luZGV4KyspCiAgewogICAgIFdMQU5UTF9CYVNlc3Npb25EZWwocHZvc0dDdHgsIHVjU1RBSWQsIHVjSW5kZXgpOwogICAgIHZvc19sb2NrX2Rlc3Ryb3koJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLnJlb3JkZXJMb2NrKTsKICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAvKiBkZWNyZW1lbnQgdWNUZGxzUGVlckNvdW50IG9ubHkgaWYgaXQgaXMgbm9uLXplcm8gKi8gIAogIGlmKFdMQU5fU1RBX1RETFMgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLndTVEFUeXBlCiAgICAgICYmIHBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiAgICAgIHBUTENiLT51Y1RkbHNQZWVyQ291bnQtLTsKI2VuZGlmCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhciBzdGF0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkNsZWFyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIiwgdWNTVEFJZCApKTsKICBXTEFOVExfQ2xlYW5TVEEocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0sIDEgLyplbXB0eSBwYWNrZXRzKi8pOwoKI2lmZGVmIFdMQU5fRkVBVFVSRV9STUMKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBEZWxldGUgbXVsdGljYXN0IGVudHJpZXMgZm9yIGR1cGxpY2F0ZSBkZXRlY3Rpb24KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBXTEFOVExfTWNhc3REZWxldGVBbGxFbnRyaWVzKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdKTsKCiAgdm9zX2xvY2tfZGVzdHJveSgmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPm1jTG9jayk7CiNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk1DICovCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpDbGVhcmluZyBTVEEgUmVzZXQgSGlzdG9yeSBSU1NJIGFuZCBSZWdpb24gbnVtYmVyIikpOwogIHBUTENiLT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUuaGlzdG9yeVJTU0kgPSAwOwogIHBUTENiLT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUucmVnaW9uTnVtYmVyID0gMDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9DbGVhclNUQUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NoYW5nZVNUQVN0YXRlCgogIERFU0NSSVBUSU9OCgogICAgSEREIHdpbGwgbWFrZSB0aGlzIG5vdGlmaWNhdGlvbiB3aGVuZXZlciBhIGNoYW5nZSBvY2N1cnMgaW4gdGhlCiAgICBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjaGFuZ2Ugc3RhdGUgY2FuIGJlCiAgICBjYWxsZWQuCgogICAgUkVTVFJJQ1RJT046IEEgc3RhdGlvbiBpcyBiZWluZyBub3RpZmllZCBhcyBhdXRoZW50aWNhdGVkIGJlZm9yZSB0aGUKICAgICAgICAgICAgICAgICBrZXlzIGFyZSBpbnN0YWxsZWQgaW4gSFcuIFRoaXMgd2F5IGlmIGEgZnJhbWUgaXMgcmVjZWl2ZWQKICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGtleXMgYXJlIGluc3RhbGxlZCBEUFUgd2lsbCBkcm9wIHRoYXQgZnJhbWUuCgogICAgTWFpbiB0aHJlYWQgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGF0IFR4IGFuZCBSeCB0aHJlYWRzIHRodXMgZ3VhcmFudGVlaW5nCiAgICB0aGUgZm9sbG93aW5nOgogICAgICAgIC0gYSBzdGF0aW9uIHdpbGwgYmUgaW4gYXNzb2Mgc3RhdGUgaW4gVEwgYmVmb3JlIFRMIHJlY2VpdmVzIGFueSBkYXRhCiAgICAgICAgICBmb3IgaXQKCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbgogICB0bFNUQVN0YXRlOiAgICAgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gc3RhdGlvbgoKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DaGFuZ2VTVEFTdGF0ZQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9TVEFTdGF0ZVR5cGUgICB0bFNUQVN0YXRlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIHRsU1RBU3RhdGUgPj0gV0xBTlRMX1NUQV9NQVhfU1RBVEUgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGFuZ2UgU1RBIHN0YXRlCiAgICBObyBuZWVkIHRvIGxvY2sgdGhpcyBvcGVyYXRpb24sIHNlZSByZXN0cmljdGlvbnMgYWJvdmUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6Q2hhbmdpbmcgc3RhdGUgZm9yIFNUQSBDbGllbnQgSUQ6ICVkIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgdWNTVEFJZCwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnRsU3RhdGUsIHRsU1RBU3RhdGUpKTsKCiAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLAogICAgICAgICAgICAgICAgICAgVFJBQ0VfQ09ERV9UTF9TVEFfU1RBVEUsIHVjU1RBSWQsdGxTVEFTdGF0ZSApKTsKCiAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnRsU3RhdGUgPSB0bFNUQVN0YXRlOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0NoYW5nZVNUQVN0YXRlICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVXBkYXRlVGRsc1NUQUNsaWVudAoKICBERVNDUklQVElPTgoKICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBFTkFCTEVfTElOSyBoYXBwZW5zIGFuZCAgSEREIHdhbnQgdG8KICAgIHJlZ2lzdGVyIFFvUyBvciBvdGhlciBwYXJhbXMgZm9yIFRETFMgcGVlcnMuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgV01NL1FPUyByZWdpc3RyYXRpb24gaXMKICAgIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB3U1RBRGVzY1R5cGU6ICAgIFNUQSBEZXNjcmlwdG9yLCBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZQogICAgICAgICAgICAgICAgICAgIG5ldyBhZGRlZCBTVEEKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6IFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMKV0xBTlRMX1VwZGF0ZVRkbHNTVEFDbGllbnQKKAogdl9QVk9JRF90ICAgICAgICAgICAgICAgICBwdm9zR0N0eCwKIFdMQU5fU1RBRGVzY1R5cGUqICAgICAgICAgcHdTVEFEZXNjVHlwZQopCnsKICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiB8fCAoIFdMQU5fTUFYX1NUQV9DT1VOVCA8PSBwd1NUQURlc2NUeXBlLT51Y1NUQUlkKSkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfVXBkYXRlVGRsc1NUQUNsaWVudCIpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXTsKICBpZiAoKE5VTEwgPT0gcENsaWVudFNUQSkgfHwgMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTdGF0aW9uIG5vdCBleGlzdHMiKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCA9IHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZDsKCiAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICJXTEFOIFRMOiAlczogdWNRb3NFbmFibGVkIG9mIHB3U1RBRGVzY1R5cGU6ICVkIgogICAgICAgICAgInBDbGllbnRTVEEtPndTVEFEZXNjOiAlZCIsCiAgICAgICAgICBfX2Z1bmNfXywgcHdTVEFEZXNjVHlwZS0+dWNRb3NFbmFibGVkLAogICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkKSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cgp9CgpWT1NfU1RBVFVTIFdMQU5UTF9TZXRNb25SeENiayh2X1BWT0lEX3QgcHZvc0dDdHgsIFdMQU5UTF9Nb25SeENCVHlwZSBwZm5Nb25SeCkKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEwgOwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBUTENiLT5wZm5Nb25SeCA9IHBmbk1vblJ4OwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCnZvaWQgV0xBTlRMX1NldElzQ29udmVyc2lvblJlcSh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfQk9PTF90IGlzQ29udmVyc2lvblJlcSkKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEwgOwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgIHJldHVybjsKICB9CiAgcFRMQ2ItPmlzQ29udmVyc2lvblJlcSA9IGlzQ29udmVyc2lvblJlcTsKICByZXR1cm47Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU1RBUHRrSW5zdGFsbGVkCgogIERFU0NSSVBUSU9OCgogICAgSEREIHdpbGwgbWFrZSB0aGlzIG5vdGlmaWNhdGlvbiB3aGVuZXZlciBQVEsgaXMgaW5zdGFsbGVkIGZvciB0aGUgU1RBCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2hhbmdlIHN0YXRlIGNhbiBiZQogICAgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSBmb3Igd2hpY2ggUGFpcndpc2Uga2V5IGlzCiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUHRrSW5zdGFsbGVkCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICBGTCgiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIpKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIEZMKCJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQiKSkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgRkwoIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCIpKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5wdGtJbnN0YWxsZWQgPSAxOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVB0a0luc3RhbGxlZCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFNUQVN0YXRlCgogIERFU0NSSVBUSU9OCgogICAgUmV0dXJucyBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIGl0cyBzdGF0ZSBjYW4gYmUgcmV0cmlldmVkLgoKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCgogICAgT1VUCiAgICBwdGxTVEFTdGF0ZTogICAgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIHN0YXRpb24KCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0U1RBU3RhdGUKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfU1RBU3RhdGVUeXBlICAgKnB0bFNUQVN0YXRlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHRsU1RBU3RhdGUgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldFNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBHZXQgU1RBIHN0YXRlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgKnB0bFNUQVN0YXRlID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnRsU3RhdGU7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0U1RBU3RhdGUgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9VcGRhdGVTVEFCc3NJZGZvcklCU1MKCiAgREVTQ1JJUFRJT04KICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgdG8gdXBkYXRlIHRoZSBCU1NJRCBmb3IgdGhpcyBTdGF0aW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBIREQgU2hvdWxkIHJlZ2lzdGVyZWQgdGhlIHN0YUlEIHdpdGggVEwgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgUG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIElOCiAgICB1Y1NUQUlkICAgICAgIFRoZSBTdGF0aW9uIElEIGZvciBCc3NpZCB0byBiZSB1cGRhdGVkCiAgICBJTgogICAgcEJzc2lkICAgICAgICAgIEJTU0lEIHRvIGJlIHVwZGF0ZWQKCiAgUkVUVVJOIFZBTFVFCiAgICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgU0lERSBFRkZFQ1RTCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKClZPU19TVEFUVVMKV0xBTlRMX1VwZGF0ZVNUQUJzc0lkZm9ySUJTUwooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgICAgICAgICpwQnNzaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4ICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVXBkYXRlIHRoZSBJQlNTIEJTU0lECiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX21lbV9jb3B5KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLnZCU1NJRGZvcklCU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzaWQsIHNpemVvZih2X01BQ0FERFJfdCkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU1RBUGt0UGVuZGluZwoKICBERVNDUklQVElPTgoKICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBhIHBhY2tldCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbiBpbiBpdHMKICAgIHF1ZXVlcy4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBwYWNrZXQgcGVuZGluZwogICAgbm90aWZpY2F0aW9uIGNhbiBiZSBzZW50LgoKICAgIFJFU1RSSUNUSU9OOiBUTCB3aWxsIG5vdCBjb3VudCBwYWNrZXRzIGZvciBwZW5kaW5nIG5vdGlmaWNhdGlvbi4KICAgICAgICAgICAgICAgICBIREQgaXMgZXhwZWN0ZWQgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9uIG9ubHkgd2hlbgogICAgICAgICAgICAgICAgIG5vbi1lbXB0eSBldmVudCBnZXRzIHRyaWdnZXJlZC4gV29yc3QgY2FzZSBzY2VuYXJpbwogICAgICAgICAgICAgICAgIGlzIHRoYXQgVEwgbWlnaHQgZW5kIHVwIG1ha2luZyBhIGNhbGwgd2hlbiBIZGRzCiAgICAgICAgICAgICAgICAgcXVldWVzIGFyZSBhY3R1YWxseSBlbXB0eS4KCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4OiAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVBrdFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgICAgdWNBYwopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgIldMQU4gVEw6UGFja2V0IHBlbmRpbmcgaW5kaWNhdGlvbiBmb3IgU1RBOiAlZCBBQzogJWQiLCB1Y1NUQUlkLCB1Y0FjKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9TVEFQa3RQZW5kaW5nIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVBrdFBlbmRpbmciKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9TVEFQa3RQZW5kaW5nIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVGVtcG9yYXJ5IGZpeCB0byBlbmFibGUgVEwgdG8gZmV0Y2ggcGFja2V0cyB3aGVuIG11bHRpcGxlIHBlZXJzIGpvaW4KICAgIGFuIElCU1MuIFRvIGZpeCBDUjE3NzMwMS4gTmVlZHMgdG8gZ28gYXdheSB3aGVuIHRoZSBhY3R1YWwgZml4IG9mCiAgICBnb2luZyB0aHJvdWdoIGFsbCBTVEEncyBpbiByb3VuZCByb2JpbiBmYXNoaW9uIGdldHMgbWVyZ2VkIGluIGZyb20KICAgIEJUIEFNUCBicmFuY2guCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2ItPnVjUmVnaXN0ZXJlZFN0YUlkID0gdWNTVEFJZDsKCiAgaWYoIFdMQU5UTF9TVEFfQ09OTkVDVEVEID09IHBDbGllbnRTVEEtPnRsU3RhdGUgKQogIHsgLyogRUFQT0xfSElfUFJJT1JJVFkgOiBuZWVkIHRvIGZpbmQgb3V0IHdoZXRoZXIgRUFQT0wgaXMgcGVuZGluZyBiZWZvcmUKICAgICAgIFdMQU5UTF9GZXRjaFBhY2tldCgpL1dMQU5UTF9UeENvbm4oKSBpcyBjYWxsZWQuCiAgICAgICBjaGFuZ2UgU1RBX0FVVEhFTlRJQ0FURUQgIT0gdGxTdGF0ZSB0byBDT05ORUNURUQgPT0gdGxTdGF0ZQogICAgICAgdG8gbWFrZSBzdXJlIFRMIGlzIGluZGVlZCB3YWl0aW5nIGZvciBFQVBPTC4KICAgICAgIEp1c3QgaW4gdGhlIGNhc2Ugd2hlbiBTVEEgZ290IGRpc2Nvbm5lY3RlZCBzaG9ydGx5IGFmdGVyIGNvbm5lY3RlY3Rpb24gKi8KICAgIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nID0gMTsKCiAgICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsCiAgICAgICAgICAgVFJBQ0VfQ09ERV9UTF9FQVBPTF9QS1RfUEVORElORywgdWNTVEFJZCwgdWNBYykpOwoKICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgIldMQU4gVEw6UGFja2V0IHBlbmRpbmcgaW5kaWNhdGlvbiBmb3IgU1RBOiAlZCBBQzogJWQgU3RhdGU6ICVkIiwgCiAgICAgICAgICAgICAgIHVjU1RBSWQsIHVjQWMsIHBDbGllbnRTVEEtPnRsU3RhdGUpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRW5hYmxlIHRoaXMgQUMgaW4gdGhlIEFDIG1hc2sgaW4gb3JkZXIgZm9yIFRMIHRvIHN0YXJ0IHNlcnZpY2luZyBpdAogICAgU2V0IHBhY2tldCBwZW5kaW5nIGZsYWcgCiAgICBUbyBhdm9pZCByYWNlIGNvbmRpdGlvbiwgc2VyaWFsaXplIHRoZSB1cGRhdGlvbiBvZiBBQyBhbmQgQUMgbWFzayAKICAgIHRocm91Z2ggV0xBTlRMX1RYX1NUQUlEX0FDX0lORCBtZXNzYWdlLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1t1Y0FjXSA9IDE7CgogICAgICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjUGt0UGVuZGluZywgMSk7CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENoZWNrIGlmIHRoZXJlIGFyZSBlbm91Z2ggcmVzb3VyY2VzIGZvciB0cmFuc21pc3Npb24gYW5kIHR4IGlzIG5vdAogICAgICAgIHN1c3BlbmRlZC4KICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgaWYgKCggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX0RBVEEgKSAmJgogICAgICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCiAgICAgIHsKCiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiSXNzdWluZyBYbWl0IHN0YXJ0IHJlcXVlc3QgdG8gQkFMIikpOwogICAgICAgICAgIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBObyBlcnJvciBjb2RlIGlzIHNlbnQgYmVjYXVzZSBUTCB3aWxsIHJlc3VtZSB0eCBhdXRvbm9tb3VzbHkgaWYKICAgICAgICAgIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlIG9yIHR4IGdldHMgcmVzdW1lZAogICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6UmVxdWVzdCB0byBzZW5kIGJ1dCBjb25kaXRpb24gbm90IG1ldC4gUmVzOiAlZCxTdXNwZW5kOiAlZCIsCiAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKTsKICAgICAgfQogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBUGt0UGVuZGluZyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU2V0U1RBUHJpb3JpdHkKCiAgREVTQ1JJUFRJT04KCiAgICBUTCBleHBvc2VzIHRoaXMgQVBJIHRvIGFsbG93IHVwcGVyIGxheWVycyBhIHJvdWdoIGNvbnRyb2wgb3ZlciB0aGUKICAgIHByaW9yaXR5IG9mIHRyYW5zbWlzc2lvbiBmb3IgYSBnaXZlbiBzdGF0aW9uIHdoZW4gc3VwcG9ydGluZyBtdWx0aXBsZQogICAgY29ubmVjdGlvbnMuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2hhbmdlIGluIHByaW9yaXR5IGNhbiBiZQogICAgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSB0aGF0IGhhcyB0byBjaGFuZ2UgcHJpb3JpdHkKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TZXRTVEFQcmlvcml0eQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfU1RBUHJpb3JpdHlUeXBlICAgdGxTVEFQcmkKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX1NldFNUQVByaW9yaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TZXRTVEFQcmlvcml0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1NldFNUQVByaW9yaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmUtYW5hbGl6ZSBpZiBsb2NrIGlzIG5lZWRlZCB3aGVuIGFkZGluZyBtdWx0aXBsZSBzdGF0aW9ucwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpDaGFuZ2luZyBzdGF0ZSBmb3IgU1RBIFByaSBJRDogJWQgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bFByaSwgdGxTVEFQcmkpKTsKICBwQ2xpZW50U1RBLT50bFByaSA9IHRsU1RBUHJpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NldFNUQVByaW9yaXR5ICovCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIEJBUAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgU01FIHRvIHJlZ2lzdGVyIGl0c2VsZiBhcyBjbGllbnQgZm9yIG5vbi1kYXRhIEJULUFNUCBwYWNrZXRzLgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHBmblRsQkFQUnhGcm06ICBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHByb2Nlc3Npbmcgcm91dGluZSBmb3Igbm9uLWRhdGEKICAgICAgICAgICAgICAgICAgICBCVC1BTVAgcGFja2V0cwogICAgcGZuRmx1c2hPcENvbXBsZXRlQ2I6CiAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY2FsbCBiYWNrIGZ1bmN0aW9uLCBmb3IgdGhlIEZsdXNoIG9wZXJhdGlvbgogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24uCgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBCQUwgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZWdpc3RlckJBUENsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfQkFQUnhDQlR5cGUgICAgIHBmblRsQkFQUnhGcm0sCiAgV0xBTlRMX0ZsdXNoT3BDb21wQ0JUeXBlICBwZm5GbHVzaE9wQ29tcGxldGVDYgopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBmblRsQkFQUnhGcm0gKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIE5VTEwgPT0gcGZuRmx1c2hPcENvbXBsZXRlQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIkludmFsaWQgRmx1c2ggQ29tcGxldGUgQ2IgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNYWtlIHN1cmUgdGhpcyBpcyB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGF0dGVtcHQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzICkKICB7CiAgICBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMrKzsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpCQVAgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgQkFQIENsaWVudCIgKSk7CgogIHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cysrOwoKICBpZiAoIE5VTEwgIT0gcGZuVGxCQVBSeEZybSApIAogIHsKICAgIHBUTENiLT50bEJBUENsaWVudC5wZm5UbEJBUFJ4ICAgICAgICAgICAgID0gcGZuVGxCQVBSeEZybTsKICB9CgogIHBUTENiLT50bEJBUENsaWVudC5wZm5GbHVzaE9wQ29tcGxldGVDYiAgID0gcGZuRmx1c2hPcENvbXBsZXRlQ2I7CgogIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgICAgID0gTlVMTDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudCAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4QkFQRnJtCgogIERFU0NSSVBUSU9OCiAgICBCQVAgY2FsbHMgdGhpcyB3aGVuIGl0IHdhbnRzIHRvIHNlbmQgYSBmcmFtZSB0byB0aGUgbW9kdWxlCgogIERFUEVOREVOQ0lFUwogICAgQkFQIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogICAgUkVTVFJJQ1RJT046IEJBUCBDQU5OT1QgcHVzaCBhbnkgcGFja2V0cyB0byBUTCB1bnRpbCBpdCBkaWQgbm90IHJlY2VpdmUKICAgICAgICAgICAgICAgICBhIHR4IGNvbXBsZXRlIGZyb20gdGhlIHByZXZpb3VzIHBhY2tldCwgdGhhdCBtZWFucyBCQVAKICAgICAgICAgICAgICAgICBzZW5kcyBvbmUgcGFja2V0LCB3YWl0IGZvciB0eCBjb21wbGV0ZSBhbmQgdGhlbgogICAgICAgICAgICAgICAgIHNlbmRzIGFub3RoZXIgb25lCgogICAgICAgICAgICAgICAgIElmIEJBUCBzZW5kcyBhbm90aGVyIHBhY2tldCBiZWZvcmUgVEwgbWFuYWdlcyB0byBwcm9jZXNzIHRoZQogICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2VudCBwYWNrZXQgY2FsbCB3aWxsIGVuZCBpbiBmYWlsdXJlCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBUCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB2T1NTIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwYWNrZXQgdG8gYmUKICAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlZAogICAgcE1ldGFJbmZvOiAgICAgIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2tldAogICAgcGZuVGxCQVBUeENvbXA6IHBvaW50ZXIgdG8gYSB0cmFuc21pdCBjb21wbGV0ZSByb3V0aW5lIGZvciBub3RpZnlpbmcKICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gb3ZlciB0aGUgYnVzCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogQkFMIGNsaWVudCB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX0VfQlVTWTogICBUaGUgcHJldmlvdXMgQlQtQU1QIHBhY2tldCB3YXMgbm90IHlldCB0cmFuc21pdHRlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgZmFpbHVyZSBtZXNzYWdlcyBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgQkQgaGVhZGVyIGhhbmRsaW5nCiAgICByb3V0aW5lcywgcGxlYXNlIGNoZWNrIGFwcm9wcmlhdGUgQVBJIGZvciBtb3JlIGluZm8uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4QkFQRnJtCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKICBXTEFOVExfTWV0YUluZm9UeXBlKiAgICBwTWV0YUluZm8sCiAgV0xBTlRMX1R4Q29tcENCVHlwZSAgICAgcGZuVGxCQVBUeENvbXAKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiICAgICAgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIHZfTUFDQUREUl90ICAgICB2RGVzdE1hY0FkZHI7CiAgdl9VMTZfdCAgICAgICAgIHVzUGt0TGVuOwogIHZfVThfdCAgICAgICAgICB1Y1N0YUlkID0gMDsKICB2X1U4X3QgICAgICAgICAgZXh0cmFIZWFkU3BhY2UgPSAwOwogIHZfVThfdCAgICAgICAgICB1Y1dEU0VuYWJsZWQgPSAwOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfVHhCQVBGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVuc3VyZSB0aGF0IEJBUCBjbGllbnQgd2FzIHJlZ2lzdGVyZWQgcHJldmlvdXNseQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIDAgPT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzICkgfHwKICAgICAgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQocFRMQ2ItPnRsQkFQQ2xpZW50LnVjQkFQU1RBSWQpICkpCiAgewogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzKys7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkJBUCBjbGllbnQgbm90IHJlZ2lzdGVyIG9uIFdMQU5UTF9UeEJBUEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQ2hlY2sgaWYgYW55IEJULUFNUCBGcm0gaXMgcGVuZGluZwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMICE9IHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpCVC1BTVAgRnJhbWUgYWxyZWFkeSBwZW5kaW5nIHR4IGluIFRMIG9uIFdMQU5UTF9UeEJBUEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfQlVTWTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIGJ1ZmZlciBhbmQgbm90aWZ5IEJBTDsgbm8gbG9jayBpcyBuZWVkZWQgaWYgdGhlIGFib3ZlIHJlc3RyaWN0aW9uCiAgICBpcyBtZXQKICAgIFNhdmUgdGhlIHR4IGNvbXBsZXRlIGZuY3QgcG9pbnRlciBhcyB0bCBzcGVjaWZpYyBkYXRhIGluIHRoZSB2b3MgYnVmZmVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNTdGFJZCA9IHBUTENiLT50bEJBUENsaWVudC51Y0JBUFNUQUlkOwogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXSApCiAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KICBpZiAoKCAwID09IHBNZXRhSW5mby0+dWNEaXNhYmxlRnJtWHRsICkgJiYgCiAgICAgICggMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uICkpCiAgewogICAgdm9zU3RhdHVzID0gIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwgJnVjU3RhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YUluZm8sICZ1Y1dEU0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFIZWFkU3BhY2UpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkVycm9yIHdoZW4gdHJhbnNsYXRpbmcgaGVhZGVyIFdMQU5UTF9UeEJBUEZybSIpKTsKCiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CgogICAgcE1ldGFJbmZvLT51Y0Rpc2FibGVGcm1YdGwgPSAxOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgLyogQWRkaW5nIFR5cGUsIFN1YlR5cGUgd2hpY2ggd2FzIG1pc3NpbmcgZm9yIEVBUE9MIGZyb20gQkFQICovCiAgcE1ldGFJbmZvLT51Y1R5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1RZUEUgPDwgNCk7CiAgcE1ldGFJbmZvLT51Y1R5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFKTsKCiAgdm9zU3RhdHVzID0gV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAKICAgICAgICAgICAgICAgICAgICAmdkRlc3RNYWNBZGRyLCBwTWV0YUluZm8tPnVjRGlzYWJsZUZybVh0bCwgCiAgICAgICAgICAgICAgICAgICAgJnVzUGt0TGVuLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS0+d1NUQURlc2MudWNRb3NFbmFibGVkLAogICAgICAgICAgICAgICAgICAgIHVjV0RTRW5hYmxlZCwgZXh0cmFIZWFkU3BhY2UsIHBNZXRhSW5mby0+dWNUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgcE1ldGFJbmZvLT51Y1RJRCwgMCAvKiBObyBBQ0sgKi8sIHBNZXRhSW5mby0+dXNUaW1lU3RhbXAsCiAgICAgICAgICAgICAgICAgICAgcE1ldGFJbmZvLT51Y0lzRWFwb2wgfHwgcE1ldGFJbmZvLT51Y0lzV2FpLCBwTWV0YUluZm8tPnVjSXNBcnAsCiAgICAgICAgICAgICAgICAgICAgcE1ldGFJbmZvLT51Y1VQLCBwTWV0YUluZm8tPnVjVHhCZFRva2VuKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBidWlsZGluZyBUWCBoZWFkZXIgJWQiLCB2b3NTdGF0dXMpKTsKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICBpZiAoIE5VTEwgIT0gcGZuVGxCQVBUeENvbXAgKQogIHsKICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcGZuVGxCQVBUeENvbXApOwogIH0KICBlbHNlCiAgewogICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKCiAgfQoKICB2b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KXZvc0RhdGFCdWZmKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIHRocmUgYXJlIGVub3VnaCByZXNvdXJjZXMgZm9yIHRyYW5zbWlzc2lvbiBhbmQgdHggaXMgbm90CiAgICBzdXNwZW5kZWQuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX0JBUCApICYmCiAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApKQogIHsKICAgIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogIH0KICBlbHNlCiAgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgTm8gZXJyb3IgY29kZSBpcyBzZW50IGJlY2F1c2UgVEwgd2lsbCByZXN1bWUgdHggYXV0b25vbW91c2x5IGlmCiAgICAgIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlIG9yIHR4IGdldHMgcmVzdW1lZAogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgIldMQU4gVEw6UmVxdWVzdCB0byBzZW5kIGZyb20gQkFQIGJ1dCBjb25kaXRpb24gbm90IG1ldC5SZXM6ICVkLCIKICAgICAgICAgICAgICAgICAiU3VzcGVuZDogJWQiLCBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dWNUeFN1c3BlbmRlZCApKTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfVHhCQVBGcm0gKi8KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggU01FCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0UnNzaQoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBleHRyYWN0IHRoZSBSU1NJIGluZm9ybWF0aW9uIGZyb20gZXZlcnkgZGF0YSBwYWNrZXQgZnJvbSB0aGUKICAgIG9uZ29pbmcgdHJhZmZpYyBhbmQgd2lsbCBzdG9yZSBpdC4gSXQgd2lsbCBwcm92aWRlIHRoZSByZXN1bHQgdG8gU01FCiAgICB1cG9uIHJlcXVlc3QuCgogIERFUEVOREVOQ0lFUwoKICAgIFdBUk5JTkc6IHRoZSByZWFkIGFuZCB3cml0ZSBvZiB0aGlzIHZhbHVlIHdpbGwgbm90IGJlIHByb3RlY3RlZAogICAgICAgICAgICAgYnkgbG9ja3MsIHRoZXJlZm9yZSB0aGUgaW5mb3JtYXRpb24gb2J0YWluZWQgYWZ0ZXIgYSByZWFkCiAgICAgICAgICAgICBtaWdodCBub3QgYWx3YXlzIGJlIGNvbnNpc3RlbnQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlCgogICAgT1VUCiAgICBwdVJzc2k6ICAgICAgICAgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIFJTU0kKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU1RBIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRSc3NpCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgdWNTVEFJZCwKICB2X1M3X3QqICAgICAgICAgIHBSc3NpCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBSc3NpICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFJzc2kiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldFJzc2kiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFJzc2kiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDb3B5IHdpbGwgbm90IGJlIGxvY2tlZDsgcGxlYXNlIHJlYWQgcmVzdHJpY3Rpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZihwVExDYi0+aXNCTVBTIHx8IElTX0FDVElWRU1PREVfT0ZGTE9BRF9GRUFUVVJFX0VOQUJMRSkKICB7CiAgICAqcFJzc2kgPSBwQ2xpZW50U1RBLT5yc3NpQXZnQm1wczsKICAgIC8qIENoZWNrIElmIFJTU0kgaXMgemVybyBiZWNhdXNlIHdlIGFyZSByZWFkaW5nIHJzc0F2Z0JtcHMgdXBkYXRlZCBieSBIQUwgaW4gCiAgICBwcmV2aW91cyBHZXRTdGF0c1JlcXVlc3QuIEl0IG1heSBiZSB1cGRhdGVkIGFzIHplcm8gYnkgSGFsIGJlY2F1c2UgRW50ZXJCbXBzIAogICAgbWlnaHQgbm90IGhhdmUgaGFwcGVuZCBieSB0aGF0IHRpbWUuIEhlbmNlIHJlYWRpbmcgdGhlIG1vc3QgcmVjZW50IFJzc2kgCiAgICBjYWxjbHVhdGVkIGJ5IFRMKi8KICAgIGlmKDAgPT0gKnBSc3NpKQogICAgewogICAgICAqcFJzc2kgPSBwQ2xpZW50U1RBLT5yc3NpQXZnOwogICAgfQogIH0KICBlbHNlCiAgewogICAgKnBSc3NpID0gcENsaWVudFNUQS0+cnNzaUF2ZzsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0dldFJzc2kgZm9yIFNUQTogJWQgUlNTSTogJWQlcyIsCiAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgKnBSc3NpLAogICAgICAgICAgICAgICAgICAgIHBUTENiLT5pc0JNUFMgPyAiIGluIEJNUFMiIDogIiIpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRSc3NpICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRTbnIKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgZXh0cmFjdCB0aGUgU05SIGluZm9ybWF0aW9uIGZyb20gZXZlcnkgZGF0YSBwYWNrZXQgZnJvbSB0aGUKICAgIG9uZ29pbmcgdHJhZmZpYyBhbmQgd2lsbCBzdG9yZSBpdC4gSXQgd2lsbCBwcm92aWRlIHRoZSByZXN1bHQgdG8gU01FCiAgICB1cG9uIHJlcXVlc3QuCgogIERFUEVOREVOQ0lFUwoKICAgIFdBUk5JTkc6IHRoZSByZWFkIGFuZCB3cml0ZSBvZiB0aGlzIHZhbHVlIHdpbGwgbm90IGJlIHByb3RlY3RlZAogICAgICAgICAgICAgYnkgbG9ja3MsIHRoZXJlZm9yZSB0aGUgaW5mb3JtYXRpb24gb2J0YWluZWQgYWZ0ZXIgYSByZWFkCiAgICAgICAgICAgICBtaWdodCBub3QgYWx3YXlzIGJlIGNvbnNpc3RlbnQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlCgogICAgT1VUCiAgICBwU25yOiAgICAgICAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBTTlIKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU1RBIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRTbnIKKAogIHRBTklfVTggICAgICAgICAgIHVjU1RBSWQsCiAgdEFOSV9TOCogICAgICAgICAgcFNucgopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHBTbnIpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCwgTlVMTCkpOwogIGlmIChOVUxMID09IHBUTENiKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoTlVMTCA9PSBwQ2xpZW50U1RBKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENvcHkgd2lsbCBub3QgYmUgbG9ja2VkOyBwbGVhc2UgcmVhZCByZXN0cmljdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChwVExDYi0+aXNCTVBTKQogIHsKICAgICpwU25yID0gcENsaWVudFNUQS0+c25yQXZnQm1wczsKICB9CiAgZWxzZQogIHsKICAgIC8qIFNOUiBpcyBhdmVyYWdlZCBvdmVyIFdMQU5UTF9NQVhfU05SX0RBVEFfU0FNUExFUywgaWYgdGhlcmUgYXJlIG5vdCBlbm91Z2gKICAgICAqIGRhdGEgc2FtcGxlcyAoc25yaWR4KSB0byBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgdGhlbiByZXR1cm4gdGhlCiAgICAgKiBhdmVyYWdlIGZvciB0aGUgd2luZG93IG9mIHByZXZvaXVzIDIwIHBhY2tldHMuIEFuZCBpZiB0aGVyZSBhcmVuJ3QKICAgICAqIGVub3VnaCBzYW1wbGVzIGFuZCB0aGUgYXZlcmFnZSBmb3IgcHJldmlvdXMgd2luZG93IG9mIDIwIHBhY2tldHMgaXMKICAgICAqIG5vdCBhdmFpbGFibGUgdGhlbiByZXR1cm4gYSBwcmVkZWZpbmVkIHZhbHVlCiAgICAgKgogICAgICogTk9URTogdGhlIFNOUl9IQUNLX0JNUFMgdmFsdWUgaXMgZGVmaW5lZCB0byAxMjcsIGRvY3VtZW50cyBmcm9tIEhXCiAgICAgKiB0ZWFtIHJldmVhbCB0aGF0IHRoZSBTTlIgdmFsdWUgaGFzIGEgY2VpbGluZyB3ZWxsIGJlbG93IDEyNyBkQm0sCiAgICAgKiBzbyBpZiBTTlIgaGFzIHZhbHVlIG9mIDEyNyB0aGUgdXNlcnNwYWNlIGFwcGxpY2F0aW9ucyBjYW4ga25vdyB0aGF0CiAgICAgKiB0aGUgU05SIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQgYmVjYXVzZSBlbm91Z2ggZGF0YSB3YXMgbm90CiAgICAgKiBhdmFpbGFibGUgZm9yIFNOUiBjYWxjdWxhdGlvbgogICAgICovCiAgICBpZiAocENsaWVudFNUQS0+c25ySWR4ID4gKFdMQU5UTF9NQVhfU05SX0RBVEFfU0FNUExFUy8yKQogICAgICAgIHx8ICEocENsaWVudFNUQS0+cHJldlNuckF2ZykpCiAgICB7CiAgICAgICAqcFNuciA9IHBDbGllbnRTVEEtPnNuclN1bSAvIHBDbGllbnRTVEEtPnNucklkeDsKICAgIH0KICAgIGVsc2UgaWYgKHBDbGllbnRTVEEtPnByZXZTbnJBdmcpCiAgICB7CiAgICAgICAqcFNuciA9IHBDbGllbnRTVEEtPnByZXZTbnJBdmc7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAqcFNuciA9IFNOUl9IQUNLX0JNUFM7CiAgICB9CiAgfQoKICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0dldFNuciBmb3IgU1RBOiAlZCBTTlI6ICVkJXMiLAogICAgICAgICAgICB1Y1NUQUlkLCAqcFNuciwKICAgICAgICAgICAgcFRMQ2ItPmlzQk1QUyA/ICIgaW4gQk1QUyIgOiAiIik7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0U25yICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldExpbmtRdWFsaXR5CgogIERFU0NSSVBUSU9OCiAgICBUTCB3aWxsIGV4dHJhY3QgdGhlIFNOUiBpbmZvcm1hdGlvbiBmcm9tIGV2ZXJ5IGRhdGEgcGFja2V0IGZyb20gdGhlCiAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRQogICAgdXBvbiByZXF1ZXN0LgoKICBERVBFTkRFTkNJRVMKCiAgICBXQVJOSU5HOiB0aGUgcmVhZCBhbmQgd3JpdGUgb2YgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcm90ZWN0ZWQKICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZAogICAgICAgICAgICAgbWlnaHQgbm90IGFsd2F5cyBiZSBjb25zaXN0ZW50LgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQoKICAgIE9VVAogICAgcHVMaW5rUXVhbGl0eTogICAgICAgICB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgU05SCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0TGlua1F1YWxpdHkKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICB2X1UzMl90KiAgICAgICAgICAgICAgcHVMaW5rUXVhbGl0eQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdUxpbmtRdWFsaXR5ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldExpbmtRdWFsaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0TGlua1F1YWxpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiSW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldExpbmtRdWFsaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldExpbmtRdWFsaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ29weSB3aWxsIG5vdCBiZSBsb2NrZWQ7IHBsZWFzZSByZWFkIHJlc3RyaWN0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgKnB1TGlua1F1YWxpdHkgPSBwQ2xpZW50U1RBLT51TGlua1F1YWxpdHlBdmc7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOVExfR2V0TGlua1F1YWxpdHkgZm9yIFNUQTogJWQgTGlua1F1YWxpdHk6ICVkIiwgdWNTVEFJZCwgKnB1TGlua1F1YWxpdHkpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfRmx1c2hTdGFUSUQKCiAgREVTQ1JJUFRJT04KICAgIFRMIHByb3ZpZGVzIHRoaXMgQVBJIGFzIGFuIGludGVyZmFjZSB0byBTTUUgKEJBUCkgbGF5ZXIuIFRMIGludHVybiBwb3N0cyBhCiAgICBtZXNzYWdlIHRvIEhBTC4gVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IHRoZSBTTUUgaW5vcmRlciB0byBwZXJmb3JtIGEgZmx1c2gKICAgIG9wZXJhdGlvbi4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlCiAgICB1Y1RpZDogICAgICAgICAgVHNwZWMgSUQgZm9yIHRoZSBuZXcgQkEgc2Vzc2lvbgoKICAgIE9VVAogICAgVGhlIHJlc3BvbnNlIGZvciB0aGlzIHBvc3QgaXMgcmVjZWl2ZWQgaW4gdGhlIG1haW4gdGhyZWFkLCB2aWEgYSByZXNwb25zZQogICAgbWVzc2FnZSBmcm9tIEhBTCB0byBUTC4KCiAgUkVUVVJOIFZBTFVFCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9GbHVzaFN0YVRJRAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1RpZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHRwRmx1c2hBQ1JlcSBGbHVzaEFDUmVxUHRyID0gTlVMTDsKICB2b3NfbXNnX3Qgdm9zTWVzc2FnZTsKCgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfRmx1c2hTdGFUSUQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiSW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0ZsdXNoU3RhVElEIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9GbHVzaFN0YVRJRCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBXZSBuZWVkIHRvIHBvc3QgYSBtZXNzYWdlIHdpdGggdGhlIFNUQSwgVElEIHZhbHVlIHRvIEhBTC4gSEFMIHBlcmZvcm1zIHRoZSBmbHVzaAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRmx1c2hBQ1JlcVB0ciA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0Rmx1c2hBQ1JlcSkpOwoKICBpZiAoIE5VTEwgPT0gRmx1c2hBQ1JlcVB0ciApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOiBmYXRhbCBmYWlsdXJlLCBjYW5ub3QgYWxsb2NhdGUgRmx1c2ggUmVxIHN0cnVjdHVyZSIpKTsKICAgIFZPU19BU1NFUlQoMCk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOwogIH0KCiAgLy8gU3RhcnQgY29uc3RydWN0aW5nIHRoZSBtZXNzYWdlIGZvciBIQUwKICBGbHVzaEFDUmVxUHRyLT5tZXNnVHlwZSAgICA9IFNJUl9UTF9IQUxfRkxVU0hfQUNfUkVROwogIEZsdXNoQUNSZXFQdHItPm1lc2dMZW4gICAgID0gc2l6ZW9mKHRGbHVzaEFDUmVxKTsKICBGbHVzaEFDUmVxUHRyLT5tZXNnTGVuICAgICA9IHNpemVvZih0Rmx1c2hBQ1JlcSk7CiAgRmx1c2hBQ1JlcVB0ci0+dWNTVEFJZCA9IHVjU1RBSWQ7CiAgRmx1c2hBQ1JlcVB0ci0+dWNUaWQgPSB1Y1RpZDsKCiAgdm9zTWVzc2FnZS50eXBlICAgICAgICAgICAgPSBXREFfVExfRkxVU0hfQUNfUkVROwogIHZvc01lc3NhZ2UuYm9keXB0ciA9ICh2b2lkICopRmx1c2hBQ1JlcVB0cjsKCiAgdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfV0RBLCAmdm9zTWVzc2FnZSk7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSU5URVJBQ1RJT04gV0lUSCBQRQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfdXBkYXRlU3Bvb2ZNYWNBZGRyCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIHRvIHVwZGF0ZSBtYWNhZGRyCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgVEwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgc3Bvb2ZNYWNBZGRyOiAgICAgc3Bvb2ZlZCBtYWMgYWRkZXJlc3MKICAgIHNlbGZNYWNBZGRyOiAgICAgICAgc2VsZiBNYWMgQWRkcmVzcwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF91cGRhdGVTcG9vZk1hY0FkZHIKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfTUFDQUREUl90KiAgICAgICAgICAgIHNwb29mTWFjQWRkciwKICB2X01BQ0FERFJfdCogICAgICAgICAgICBzZWxmTWFjQWRkcgopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIik7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgdm9zX21lbV9jb3B5KHBUTENiLT5zcG9vZk1hY0FkZHIuc2VsZk1hYy5ieXRlcywgc2VsZk1hY0FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NQUNfQUREUkVTU19MRU4pOwogIHZvc19tZW1fY29weShwVExDYi0+c3Bvb2ZNYWNBZGRyLnNwb29mTWFjLmJ5dGVzLCBzcG9vZk1hY0FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NQUNfQUREUkVTU19MRU4pOwoKICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICJUTDogU2VsZlNUQSBtYWMgQWRkciBmb3IgY3VycmVudCBTY2FuICJNQUNfQUREUkVTU19TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgIE1BQ19BRERSX0FSUkFZKHBUTENiLT5zcG9vZk1hY0FkZHIuc2VsZk1hYy5ieXRlcykpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX3VwZGF0ZVNwb29mTWFjQWRkciAqLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBQRSB0byByZWdpc3RlciBhcyBhIGNsaWVudCBmb3IgbWFuYWdlbWVudCBmcmFtZXMgZGVsaXZlcnkuCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgVEwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgcGZuVGxNZ210RnJtUng6ICAgICBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHByb2Nlc3Npbmcgcm91dGluZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlbWVudCBmcmFtZXMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBNZ210IEZyYW1lIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfTWdtdEZybVJ4Q0JUeXBlICBwZm5UbE1nbXRGcm1SeAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBmblRsTWdtdEZybVJ4ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNYWtlIHN1cmUgdGhpcyBpcyB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGF0dGVtcHQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCiAgewogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgZnJhbWUgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBNYW5hZ2VtZW50IEZyYW1lIENsaWVudCIgKSk7CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMrKzsKCiAgaWYgKCBOVUxMICE9IHBmblRsTWdtdEZybVJ4ICkKICB7CiAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4ID0gcGZuVGxNZ210RnJtUng7CiAgfQoKICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiA9IE5VTEw7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9EZVJlZ2lzdGVyTWdtdEZybUNsaWVudAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFBFIHRvIGRlcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzIGRlbGl2ZXJ5LgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgQVBJIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IE1nbXQgRnJhbWUgY2xpZW50IHdhcyBuZXZlciByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRGVSZWdpc3Rlck1nbXRGcm1DbGllbnQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNYWtlIHN1cmUgdGhpcyBpcyB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGF0dGVtcHQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgPT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgZnJhbWUgY2xpZW50IHdhcyBuZXZlciByZWdpc3RlcmVkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYXIgcmVnaXN0cmF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpEZXJlZ2lzdGVyaW5nIE1hbmFnZW1lbnQgRnJhbWUgQ2xpZW50IiApKTsKCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCA9IFdMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2I7CiAgaWYgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgY2FjaGUgYnVmZmVyIG5vdCBlbXB0eSBvbiBkZXJlZ2lzdGVyaW5nIgogICAgICAgICAgICAgICAiIC0gZHJvcHBpbmcgcGFja2V0IiApKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CgogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOyAKICB9CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgPSAwOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhNZ210RnJtCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgUEUgd2hlbiBpdCB3YW50IHRvIHNlbmQgb3V0IGEgbWFuYWdlbWVudCBmcmFtZS4KICAgIEhBTCB3aWxsIGFsc28gdXNlIHRoaXMgQVBJIGZvciB0aGUgZmV3IGZyYW1lcyBpdCBzZW5kcyBvdXQsIHRoZXkgYXJlIG5vdAogICAgbWFuYWdlbWVudCBmcmFtZXMgaG93ZXZlcmUgaXQgaXMgYWNjZXB0ZWQgdGhhdCBhbiBleGNlcHRpb24gd2lsbCBiZQogICAgYWxsb3dlZCBPTkxZIGZvciB0aGUgdXNhZ2Ugb2YgSEFMLgogICAgR2VuZXJpYyBkYXRhIGZyYW1lcyBTSE9VTEQgTk9UIHRyYXZlbCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KCiAgICBSRVNUUklDVElPTjogSWYgUEUgc2VuZHMgYW5vdGhlciBwYWNrZXQgYmVmb3JlIFRMIG1hbmFnZXMgdG8gcHJvY2VzcyB0aGUKICAgICAgICAgICAgICAgICBwcmV2aW91c2x5IHNlbnQgcGFja2V0IGNhbGwgd2lsbCBlbmQgaW4gZmFpbHVyZQoKICAgICAgICAgICAgICAgICBGcmFtZXMgY29tbWluZyB0aHJvdWdoIGhlcmUgbXVzdCBiZSA4MDIuMTEgZnJhbWVzLCBmcmFtZQogICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uIGluIFVNQSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDthIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHZvc0ZybUJ1ZjogICAgICBwb2ludGVyIHRvIGEgdk9TUyBidWZmZXIgY29udGFpbmluZyB0aGUgbWFuYWdlbWVudAogICAgICAgICAgICAgICAgICAgIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkCiAgICB1c0ZybUxlbjogICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQ7IGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgdk9TUyBidWZmZXIKICAgIHdGcm1UeXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgZnJhbWUgYmVpbmcgdHJhbnNtaXR0ZWQKICAgIHRpZDogICAgICAgICAgICB0aWQgdXNlZCB0byB0cmFuc21pdCB0aGlzIGZyYW1lCiAgICBwZm5Db21wVHhGdW5jOiAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgY29tcGxldGUgcm91dGluZQogICAgcHZCREhlYWRlcjogICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlciwgaWYgTlVMTCBpdCBtZWFucyBpdCB3YXMgbm90CiAgICAgICAgICAgICAgICAgICAgeWV0IGNvbnN0cnVjdGVkIGFuZCBpdCBsaWVzIHdpdGhpbiBUTCdzIHJlc3BvbnNpYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgdG8gZG8gc287IGlmIG5vdCBOVUxMIGl0IGlzIGV4cGVjdGVkIHRoYXQgaXQgd2FzCiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBwYWNrZWQgaW5zaWRlIHRoZSB2b3MgcGFja2V0CiAgICB1Y0Fja1Jlc3BvbnNlOiAgZmxhZyBub3RpZnlpbmcgaXQgYW4gaW50ZXJydXB0IGlzIG5lZWRlZCBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgYWNrbm93bGVkZ2VtZW50IHJlY2VpdmVkIHdoZW4gdGhlIGZyYW1lIGlzIHNlbnQgb3V0CiAgICAgICAgICAgICAgICAgICAgdGhlIGFpciBhbmQgOyB0aGUgaW50ZXJydXB0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IEhBTCwKICAgICAgICAgICAgICAgICAgICBvbmx5IG9uZSBzdWNoIGZyYW1lIGNhbiBiZSBwZW5kaW5nIGluIHRoZSBzeXN0ZW0gYXQKICAgICAgICAgICAgICAgICAgICBvbmUgdGltZS4KCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogTWdtdCBGcmFtZSBjbGllbnQgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19FX0JVU1k6ICAgVGhlIHByZXZpb3VzIE1nbXQgcGFja2V0IHdhcyBub3QgeWV0IHRyYW5zbWl0dGVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgICBPdGhlciBmYWlsdXJlIG1lc3NhZ2VzIG1heSBiZSByZXR1cm5lZCBmcm9tIHRoZSBCRCBoZWFkZXIgaGFuZGxpbmcKICAgIHJvdXRpbmVzLCBwbGVhc2UgY2hlY2sgYXByb3ByaWF0ZSBBUEkgZm9yIG1vcmUgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhNZ210RnJtCigKICB2X1BWT0lEX3QgICAgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NGcm1CdWYsCiAgdl9VMTZfdCAgICAgICAgICAgICAgdXNGcm1MZW4sCiAgdl9VOF90ICAgICAgICAgICAgICAgd0ZybVR5cGUsCiAgdl9VOF90ICAgICAgICAgICAgICAgdWNUaWQsCiAgV0xBTlRMX1R4Q29tcENCVHlwZSAgcGZuQ29tcFR4RnVuYywKICB2X1BWT0lEX3QgICAgICAgICAgICBwdkJESGVhZGVyLAogIHZfVTMyX3QgICAgICAgICAgICAgIHVjQWNrUmVzcG9uc2UsCiAgdl9VMzJfdCAgICAgICAgICAgICAgIHVjVHhCZFRva2VuCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgdl9NQUNBRERSX3QgICAgIHZEZXN0TWFjQWRkcjsKICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIHZfVTE2X3QgICAgICAgICB1c1BrdExlbjsKICB2X1UzMl90ICAgICAgICAgdXNUaW1lU3RhbXAgPSAwOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHZvc0ZybUJ1ZiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9UeE1nbXRGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1R4TWdtdEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRW5zdXJlIHRoYXQgbWFuYWdlbWVudCBmcmFtZSBjbGllbnQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCA9PSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzICkKICB7CiAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzKys7CiAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IEZyYW1lIGNsaWVudCBub3QgcmVnaXN0ZXIgb24gV0xBTlRMX1R4TWdtdEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBhbnkgTWdtdCBGcm0gaXMgcGVuZGluZwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIC8vdm9zVGVtcEJ1ZmYgPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZjsKICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKQogIHsKCiAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6TWFuYWdlbWVudCBGcmFtZSBhbHJlYWR5IHBlbmRpbmcgdHggaW4gVEw6IGZhaWxpbmcgb2xkIG9uZSIpKTsKCgogICAgLypGYWlsaW5nIHRoZSB0eCBmb3IgdGhlIHByZXZpb3VzIHBhY2tldCBlbnF1ZWQgYnkgUEUqLwogICAgLy92b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgLy8gICAgICAgICAgICAgICAgICAgICh1aW50cHRyX3QpTlVMTCk7CgogICAgLy92b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCB2b3NUZW1wQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnBmblR4Q29tcCk7CgogICAgLyppdCBzaG91bGQgbmV2ZXIgYmUgTlVMTCAtIGRlZmF1bHQgaGFuZGxlciBzaG91bGQgYmUgcmVnaXN0ZXJlZCBpZiBub25lKi8KICAgIC8vaWYgKCBOVUxMID09IHBmblR4Q29tcCApCiAgICAvL3sKICAgIC8vICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgIC8vICAgICAgICAgICAgIk5VTEwgcG9pbnRlciB0byBUeCBDb21wbGV0ZSBvbiBXTEFOVExfVHhNZ210RnJtIik7CiAgICAvLyAgVk9TX0FTU0VSVCgwKTsKICAgIC8vICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgLy99CgogICAgLy9wZm5UeENvbXAoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZiwgVk9TX1NUQVRVU19FX1JFU09VUkNFUyApOwogICAgLy9yZXR1cm4gVk9TX1NUQVRVU19FX0JVU1k7CgoKICAgIC8vcGZuQ29tcFR4RnVuYyggcHZvc0dDdHgsIHZvc0ZybUJ1ZiwgVk9TX1NUQVRVU19FX1JFU09VUkNFUyk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX1JFU09VUkNFUzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgQkQgaGVhZGVyIHdhcyBidWlsZCwgaWYgbm90IGNvbnN0cnVjdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdkJESGVhZGVyICkKICB7CiAgICAgdl9NQUNBRERSX3QqICAgICBwdkFkZHIyTWFjQWRkcjsKICAgICB2X1U4X3QgICB1UW9zSGRyID0gVk9TX0ZBTFNFOwoKICAgICAvKiBHZXQgYWRkcmVzcyAyIG9mIE1hbmdlbWVudCBGcmFtZSB0byBnaXZlIHRvIFdMQU5IQUxfRmlsbFR4QmQgKi8KICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSggdm9zRnJtQnVmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BQ19BRERSX0FMSUdOKDEpICsgVk9TX01BQ19BRERSX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2QWRkcjJNYWNBZGRyLCBWT1NfTUFDX0FERFJfU0laRSk7CgogICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICAgewogICAgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZ2V0IGFkZHIyICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgIH0KCiAgICAvKiBFU0UgSUFQUC9URExTIEZyYW1lIHdoaWNoIGFyZSBkYXRhIGZyYW1lcyBidXQgdGVjaG5pY2FsbHkgdXNlZAogICAgICogZm9yIG1hbmFnZW1lbnQgZnVuY3Rpb25hbGl0eSBjb21lcyB0aHJvdWdoIHJvdXRlLgogICAgICovCiAgICBpZiAoV0xBTlRMX0lTX1FPU19EQVRBX0ZSQU1FKHdGcm1UeXBlKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHsKICAgICAgICB1UW9zSGRyID0gVk9TX1RSVUU7CiAgICB9CgogICAgaWYgKFdMQU5UTF9JU19QUk9CRV9SRVEod0ZybVR5cGUpKQogICAgewogICAgICAgIGlmIChWT1NfVFJVRSA9PSB2b3NfbWVtX2NvbXBhcmUoKHZfVk9JRF90KikgcHZBZGRyMk1hY0FkZHIsCiAgICAgICAgICAgICh2X1ZPSURfdCopICZwVExDYi0+c3Bvb2ZNYWNBZGRyLnNwb29mTWFjLCBWT1NfTUFDX0FERFJFU1NfTEVOKSkKICAgICAgICB7CiAgICAgICAgICAgIHB2QWRkcjJNYWNBZGRyID0gKHZfUFZPSURfdClwVExDYi0+c3Bvb2ZNYWNBZGRyLnNlbGZNYWMuYnl0ZXM7CiAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAiVEw6IHVzaW5nIHNlbGYgc3RhIGFkZHIgdG8gZ2V0IHN0YWlkeCBmb3Igc3Bvb2ZlZCBwcm9iZSByZXEgIgogICAgICAgICAgICAgICAgICAgIE1BQ19BRERSRVNTX1NUUiwgTUFDX0FERFJfQVJSQVkocHZBZGRyMk1hY0FkZHItPmJ5dGVzKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDYWxsIFdEQSB0byBidWlsZCBUWCBoZWFkZXIKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZvc1N0YXR1cyA9IFdEQV9EU19CdWlsZFR4UGFja2V0SW5mbyggcHZvc0dDdHgsIHZvc0ZybUJ1ZiAsICZ2RGVzdE1hY0FkZHIsIAogICAgICAgICAgICAgICAgICAgMSAvKiBhbHdheXMgODAyLjExIGZyYW1lcyovLCAmdXNQa3RMZW4sIHVRb3NIZHIgLypxb3Mgbm90IGVuYWJsZWQgISEhKi8sIAogICAgICAgICAgICAgICAgICAgMCAvKiBXRFMgb2ZmICovLCAwLCB3RnJtVHlwZSwgcHZBZGRyMk1hY0FkZHIsIHVjVGlkLAogICAgICAgICAgICAgICAgICAgdWNBY2tSZXNwb25zZSwgdXNUaW1lU3RhbXAsIDAsIDAsIDAsIHVjVHhCZFRva2VuKTsKCgogICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQogICAgewogICAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBidWlsZCBUWCBoZWFkZXIgJWQiLCB2b3NTdGF0dXMpKTsKICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KICAgfS8qIGlmIEJEIGhlYWRlciBub3QgcHJlc2VudCAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSBidWZmZXIgYW5kIG5vdGlmeSBCQUw7IG5vIGxvY2sgaXMgbmVlZGVkIGlmIHRoZSBhYm92ZSByZXN0cmljdGlvbgogICAgaXMgbWV0CiAgICBTYXZlIHRoZSB0eCBjb21wbGV0ZSBmbmN0IHBvaW50ZXIgYXMgdGwgc3BlY2lmaWMgZGF0YSBpbiB0aGUgdm9zIGJ1ZmZlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCAhPSBwZm5Db21wVHhGdW5jICkKICB7CiAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NGcm1CdWYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwZm5Db21wVHhGdW5jKTsKICB9CiAgZWxzZQogIHsKICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0ZybUJ1ZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KVdMQU5UTF9UeENvbXBEZWZhdWx0Q2IpOwoKICB9CiAgdm9zX2F0b21pY19zZXQoICh1aW50cHRyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICh1aW50cHRyX3Qpdm9zRnJtQnVmKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIHRocmUgYXJlIGVub3VnaCByZXNvdXJjZXMgZm9yIHRyYW5zbWlzc2lvbiBhbmQgdHggaXMgbm90CiAgICBzdXNwZW5kZWQuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfTUYgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6SXNzdWluZyBYbWl0IHN0YXJ0IHJlcXVlc3QgdG8gQkFMIGZvciBNR01UIikpOwogICAgdm9zU3RhdHVzID0gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKQogICAgewogICAgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICJXTEFOIFRMOldEQV9EU19TdGFydFhtaXQgZmFpbHMuIHZvc1N0YXR1cyAlZCIsIHZvc1N0YXR1cykpOwogICAgICAgdm9zX2F0b21pY19zZXQoICh1aW50cHRyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwwKTsKICAgIH0KICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAKICB9CiAgZWxzZQogIHsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIE5vIGVycm9yIGNvZGUgaXMgc2VudCBiZWNhdXNlIFRMIHdpbGwgcmVzdW1lIHR4IGF1dG9ub21vdXNseSBpZgogICAgICByZXNvdXJjZXMgYmVjb21lIGF2YWlsYWJsZSBvciB0eCBnZXRzIHJlc3VtZWQKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAiV0xBTiBUTDpSZXF1ZXN0IHRvIHNlbmQgZm9yIE1nbXQgRnJtIGJ1dCBjb25kaXRpb24gbm90IG1ldC4gUmVzOiAlZCIsCiAgICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQpKTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfVHhNZ210RnJtICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggSEFMCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUmVzZXROb3RpZmljYXRpb24KCiAgREVTQ1JJUFRJT04KICAgIEhBTCBub3RpZmllcyBUTCB3aGVuIHRoZSBtb2R1bGUgaXMgYmVpbmcgcmVzZXQuCiAgICBDdXJyZW50bHkgbm90IHVzZWQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVzZXROb3RpZmljYXRpb24KKAogIHZfUFZPSURfdCAgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1Jlc2V0Tm90aWZpY2F0aW9uIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIFdMQU5UTF9DbGVhbkNCKHBUTENiLCAxIC8qZW1wdHkgYWxsIHF1ZXVlcyBhbmQgcGVuZGluZyBwYWNrZXRzKi8pOwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVzZXROb3RpZmljYXRpb24gKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1N1c3BlbmREYXRhVHgKCiAgREVTQ1JJUFRJT04KICAgIEhBTCBjYWxscyB0aGlzIEFQSSB3aGVuIGl0IHdpc2hlcyB0byBzdXNwZW5kIHRyYW5zbWlzc2lvbiBmb3IgYQogICAgcGFydGljdWxhciBTVEEuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZSBtdXN0IGJlIGZpcnN0IHJlZ2lzdGVyZWQgd2l0aAogICAgVEwgYnkgSERELgoKICAgIFJFU1RSSUNUSU9OOiAgSW4gY2FzZSBvZiBhIHN1c3BlbmQsIHRoZSBmbGFnIHdyaXRlIGFuZCByZWFkIHdpbGwgbm90IGJlCiAgICAgICAgICAgICAgICAgIGxvY2tlZDogd29yc3QgY2FzZSBzY2VuYXJpbyBvbmUgbW9yZSBwYWNrZXQgY2FuIGdldAogICAgICAgICAgICAgICAgICB0aHJvdWdoIGJlZm9yZSB0aGUgZmxhZyBnZXRzIHVwZGF0ZWQgKHdlIGNhbiBtYWtlIHRoaXMKICAgICAgICAgICAgICAgICAgd3JpdGUgYXRvbWljIGFzIHdlbGwgdG8gZ3VhcmFudGVlIGNvbnNpc3RlbmN5KQoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgcHVjU1RBSWQ6ICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGU7CiAgICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiBOVUxMIGFzc3VtZXMgc3VzcGVuZCBvbiBhbGwgYWN0aXZlIHN0YXRpb24KICAgIHBmblN1c3BlbmRUeENCOiBwb2ludGVyIHRvIHRoZSBzdXNwZW5kIHJlc3VsdCBub3RpZmljYXRpb24gaW4gY2FzZSB0aGUKICAgICAgICAgICAgICAgICAgICBjYWxsIGlzIGFzeW5jaHJvbm91cwoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUwpXTEFOVExfU3VzcGVuZERhdGFUeAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICAgICAgICAgIHB1Y1NUQUlkLAogIFdMQU5UTF9TdXNwZW5kQ0JUeXBlICAgcGZuU3VzcGVuZFR4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgdm9zX21zZ190ICAgICAgIHZvc01zZzsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3VzcGVuZERhdGFUeCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgdGhlIHR5cGUgb2YgcmVxdWVzdDogZ2VuZXJpYyBzdXNwZW5kLCBvciBwZXIgc3RhdGlvbiBzdXNwZW5kCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKE5VTEwgPT0gcHVjU1RBSWQpCiAgewogICAgLyogR2VuZXJhbCBTdXNwZW5kIFJlcXVlc3QgcmVjZWl2ZWQgKi8KICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6R2VuZXJhbCBzdXNwZW5kIHJlcXVlc3RlZCIpKTsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPnVjVHhTdXNwZW5kZWQsIDEpOwogICAgdm9zTXNnLnJlc2VydmVkID0gV0xBTl9NQVhfU1RBX0NPVU5UOwogIH0KICBlbHNlCiAgewogICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoICpwdWNTVEFJZCApICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkIHJlcXVlc3RlZCBvbiBXTEFOVExfU3VzcGVuZERhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBUTENiLT5hdGxTVEFDbGllbnRzIHBvaW50ZXIgZm9yIFNUQSBJZCA6JWQgb24gIgogICAgICAgICAgICAiV0xBTlRMX1N1c3BlbmREYXRhVHgiLCAqcHVjU1RBSWQpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNFeGlzdHMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpTdGF0aW9uICVkIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICJXTEFOIFRMOlN1c3BlbmQgcmVxdWVzdCBmb3Igc3RhdGlvbjogJWQiLCAqcHVjU1RBSWQpKTsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNUeFN1c3BlbmRlZCwgMSk7CiAgICB2b3NNc2cucmVzZXJ2ZWQgPSAqcHVjU1RBSWQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2VyaWFsaXplIHJlcXVlc3QgdGhyb3VnaCBUWCB0aHJlYWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfU0lHX1NVU1BFTkQ7CiAgdm9zTXNnLmJvZHlwdHIgICAgID0gKHZfUFZPSURfdClwZm5TdXNwZW5kVHg7CgogIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9TVVNQRU5EX0RBVEFfVFgsCiAgICAgICAgICAgICAgICAgICAgdm9zTXNnLnJlc2VydmVkICwgMCApKTsKCiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSURfVEwsICZ2b3NNc2cpKSkKICB7CiAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIiAlcyBmYWlscyB0byBwb3N0IG1lc3NhZ2UiLCBfX2Z1bmNfXyk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1N1c3BlbmREYXRhVHggKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1Jlc3VtZURhdGFUeAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IEhBTCB0byByZXN1bWUgZGF0YSB0cmFuc21pc3Npb24gZm9yIGEgZ2l2ZW4gU1RBLgoKICAgIFdBUk5JTkc6IElmIGEgc3RhdGlvbiB3YXMgaW5kaXZpZHVhbGx5IHN1c3BlbmRlZCBhIGdsb2JhbCByZXN1bWUgd2lsbAogICAgICAgICAgICAgbm90IHJlc3VtZSB0aGF0IHN0YXRpb24KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwdWNTVEFJZDogICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiB3aGljaCBpcyBiZWluZyByZXN1bWVkOyBOVUxMCiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlcyBpbnRvIGdsb2JhbCByZXN1bWUKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUwpXTEFOVExfUmVzdW1lRGF0YVR4CigKICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICBwdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZXN1bWVEYXRhVHgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIHRvIHNlZSB0aGUgdHlwZSBvZiByZXN1bWUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVjU1RBSWQgKQogIHsKICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9SRVNVTUVfREFUQV9UWCwKICAgICAgICAgICAgICAgICAgICAgIDQxICwgMCApKTsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJXTEFOIFRMOkdlbmVyYWwgcmVzdW1lIHJlcXVlc3RlZCIpKTsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPnVjVHhTdXNwZW5kZWQsIDApOwogIH0KICBlbHNlCiAgewogICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX1JFU1VNRV9EQVRBX1RYLAogICAgICAgICAgICAgICAgICAgICAgKnB1Y1NUQUlkICwgMCApKTsKCiAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggKnB1Y1NUQUlkICkpCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkIHJlcXVlc3RlZCBvbiBXTEFOVExfUmVzdW1lRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0gKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcFRMQ2ItPmF0bFNUQUNsaWVudHMgcG9pbnRlciBmb3IgU1RBIElkIDolZCBvbiAiCiAgICAgICAgICAgICJXTEFOVExfUmVzdW1lRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjRXhpc3RzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6U3RhdGlvbiAlZCB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfUmVzdW1lRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICJXTEFOIFRMOlJlc3VtZSByZXF1ZXN0IGZvciBzdGF0aW9uOiAlZCIsICpwdWNTVEFJZCkpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y1R4U3VzcGVuZGVkLCAwKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXN1bWluZyB0cmFuc21pc3Npb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfTUYgKSAmJgogICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpSZXN1bWluZyB0cmFuc21pc3Npb24iKSk7CiAgICByZXR1cm4gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1Jlc3VtZURhdGFUeCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TdXNwZW5kQ0IKCiAgREVTQ1JJUFRJT04KICAgIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBzZXJpYWxpemluZyBTdXNwZW5kIHNpZ25hbCB0aHJvdWdoIFR4IHRocmVhZAoKICBERVBFTkRFTkNJRVMKICAgIEp1c3Qgbm90aWZ5IEhBTCB0aGF0IHN1c3BlbmQgaW4gVEwgaXMgY29tcGxldGUuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHBVc2VyRGF0YTogICAgICB1c2VyIGRhdGEgc2VudCB3aXRoIHRoZSBjYWxsYmFjawoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU3VzcGVuZENCCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgV0xBTlRMX1N1c3BlbmRDQlR5cGUgIHBmblN1c3BlbmRDQiwKICB2X1UxNl90ICAgICAgICAgICAgICAgdXNSZXNlcnZlZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgICA9IE5VTEw7CiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQgPSAodl9VOF90KXVzUmVzZXJ2ZWQ7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcGZuU3VzcGVuZENCICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vIENhbGwgYmFjayBwcm9jZXNzaW5nIHJlcXVlc3RlZCBXTEFOVExfU3VzcGVuZENCIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3VzcGVuZENCIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIHBmblN1c3BlbmRDQihwdm9zR0N0eCwgTlVMTCwgVk9TX1NUQVRVU19TVUNDRVNTKTsKICB9CiAgZWxzZQogIHsKICAgIHBmblN1c3BlbmRDQihwdm9zR0N0eCwgJnVjU1RBSWQsIFZPU19TVEFUVVNfU1VDQ0VTUyk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfU3VzcGVuZENCKi8KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENMSUVOVCBJTkRFUEVOREVOVCBJTlRFUkZBQ0UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRUeFBrdENvdW50CgogIERFU0NSSVBUSU9OCiAgICBUTCB3aWxsIHByb3ZpZGUgdGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBwYWNrZXRzIGNvdW50ZWQgcGVyCiAgICBTVEEgcGVyIFRJRC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbgogICAgdWNUaWQ6ICAgICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHRzcGVjCgogICAgT1VUCiAgICBwdVR4UGt0Q291bnQ6ICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIHR4IHBhY2tldCBmb3IgdGhpcyBTVEEgYW5kIFRJRAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRUeFBrdENvdW50CigKICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgIHVjVGlkLAogIHZfVTMyX3QqICAgICAgIHB1VHhQa3RDb3VudAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB1VHhQa3RDb3VudCApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRUeFBrdENvdW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgfHwgV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgJWQvdGlkICVkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCIsCiAgICAgICAgICAgIHVjU1RBSWQsIHVjVGlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgaWYgc3RhdGlvbiBleGlzdHMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRUeFBrdENvdW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCAlZCIsCiAgICAgdWNTVEFJZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmV0dXJuIGRhdGEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvL1ZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELAogICAgLy8gICAgICAgICAiV0xBTiBUTDpSZXF1ZXN0ZWQgdHggcGFja2V0IGNvdW50IGZvciBTVEE6ICVkLCBUSUQ6ICVkIiwgCiAgICAgIC8vICAgICAgICAgdWNTVEFJZCwgdWNUaWQpOwoKICAqcHVUeFBrdENvdW50ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPmF1VHhDb3VudFt1Y1RpZF07CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0VHhQa3RDb3VudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0UnhQa3RDb3VudAoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBwcm92aWRlIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyBjb3VudGVkIHBlcgogICAgU1RBIHBlciBUSUQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24KICAgIHVjVGlkOiAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSB0c3BlYwoKICAgT1VUCiAgICBwdVR4UGt0Q291bnQ6ICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIHJ4IHBhY2tldCBmb3IgdGhpcyBTVEEgYW5kIFRJRAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRSeFBrdENvdW50CigKICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgIHVjVGlkLAogIHZfVTMyX3QqICAgICAgIHB1UnhQa3RDb3VudAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdVJ4UGt0Q291bnQgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0UnhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApIHx8IFdMQU5UTF9USURfSU5WQUxJRCggdWNUaWQpICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgJWQvdGlkICVkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0UnhQa3RDb3VudCIsCiAgICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0UnhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfR2V0UnhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJldHVybiBkYXRhCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0czKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELAogICAgICAgICAgICAiV0xBTiBUTDpSZXF1ZXN0ZWQgcnggcGFja2V0IGNvdW50IGZvciBTVEE6ICVkLCBUSUQ6ICVkIiwKICAgICAgICAgICAgIHVjU1RBSWQsIHVjVGlkKSk7CgogICpwdVJ4UGt0Q291bnQgPSBwQ2xpZW50U1RBLT5hdVJ4Q291bnRbdWNUaWRdOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFJ4UGt0Q291bnQgKi8KClZPU19TVEFUVVMKV0xBTlRMX1R4RkNGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4Cik7CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Jc0VBUE9MUGVuZGluZwoKICBERVNDUklQVElPTgoKICAgIEhERCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gaGRkX3R4X3RpbWVvdXQgb2NjdXJzLiBUaGlzIGNoZWNrcyB3aGV0aGVyCiAgICBFQVBPTCBpcyBwZW5kaW5nLgoKICBERVBFTkRFTkNJRVMKCiAgICBIREQgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCBsZWFzdCBvbmUgU1RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uCiAgICBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBTdWNjZXNzIDogSW5kaWNhdGVzIEVBUE9MIGZyYW1lIGlzIHBlbmRpbmcgYW5kIHN0YSBpcyBpbiBjb25uZWN0ZWQgc3RhdGUKCiAgICBGYWlsdXJlIDogRUFQT0wgZnJhbWUgaXMgbm90IHBlbmRpbmcKCiAgU0lERSBFRkZFQ1RTCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9Jc0VBUE9MUGVuZGluZwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewogICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiID0gTlVMTDsKICAgdl9VMzJfdCAgICAgICAgICAgICBpID0gMDsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgICBpZiAoTlVMTCA9PSBwVExDYikKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmb3IgcHZvc0dDdHgiKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbnkgRUFQT0wgcGFja2V0IGlzIHBlbmRpbmcKICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgZm9yICggaSA9IDA7IGkgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKykKICAgIHsKICAgICAgIGlmICgoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSkgJiYKICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjRXhpc3RzKSAmJgogICAgICAgICAgICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y1R4U3VzcGVuZGVkKSAmJgogICAgICAgICAgIChXTEFOVExfU1RBX0NPTk5FQ1RFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dGxTdGF0ZSkgJiYKICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjUGt0UGVuZGluZykKICAgICAgICAgICApCiAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICBUTCBJTlRFUk5BTCBBUEkgREVGSU5JVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldEZyYW1lcwoKICBERVNDUklQVElPTgoKICAgIEJBTCBjYWxscyB0aGlzIGZ1bmN0aW9uIGF0IHRoZSByZXF1ZXN0IG9mIHRoZSBsb3dlciBidXMgaW50ZXJmYWNlLgogICAgV2hlbiB0aGlzIHJlcXVlc3QgaXMgYmVpbmcgcmVjZWl2ZWQgVEwgd2lsbCByZXRyaWV2ZSBwYWNrZXRzIGZyb20gSERECiAgICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHByaW9yaXR5IHJ1bGVzIGFuZCB0aGUgY291bnQgc3VwcGxpZWQgYnkgQkFMLgoKICBERVBFTkRFTkNJRVMKCiAgICBIREQgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCBsZWFzdCBvbmUgU1RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uCiAgICBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBCQUwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdVNpemU6ICAgICAgICAgIG1heGltdW0gc2l6ZSBhY2NlcHRlZCBieSB0aGUgbG93ZXIgbGF5ZXIKICAgIHVGbG93TWFzayAgICAgICBUWCBmbG93IGNvbnRyb2wgbWFzayBmb3IgUHJpbWEuIEVhY2ggYml0IGlzIGRlZmluZWQgYXMgCiAgICAgICAgICAgICAgICAgICAgV0RBX1RYRmxvd0VudW1UeXBlCgogICAgT1VUCiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBidWZmZXIgc3VwcGxpZWQKICAgICAgICAgICAgICAgICAgICBieSBUTCwgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWNrZXQgc3VwcGxpZWQsIFRMCiAgICAgICAgICAgICAgICAgICAgd2lsbCBjaGFpbiB0aGVtIHRocm91Z2ggdk9TUyBidWZmZXJzCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgMSBvciBtb3JlOiBudW1iZXIgb2YgcmVxdWlyZWQgcmVzb3VyY2VzIGlmIHRoZXJlIGFyZSBzdGlsbCBmcmFtZXMgdG8gZmV0Y2gKICAgIDAgOiBlcnJvciBvciBIREQgcXVldWVzIGFyZSBkcmFpbmVkCgogIFNJREUgRUZGRUNUUwoKICBOT1RFCiAgICAKICAgIEZlYXR1cml6ZWQgdUZsb3dNYXNrLiBJZiB3ZSB3YW50IHRvIHJlbW92ZSBmZWF0dXJpemF0aW9uLCB3ZSBuZWVkIHRvIGNoYW5nZQogICAgQkFMIG9uIFZvbGFucy4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X1UzMl90CldMQU5UTF9HZXRGcmFtZXMKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QgICAgICoqcHBGcmFtZURhdGFCdWZmLAogIHZfVTMyX3QgICAgICAgICB1U2l6ZSwKICB2X1U4X3QgICAgICAgICAgdUZsb3dNYXNrLAogIHZfQk9PTF90KiAgICAgICBwYlVyZ2VudAopCnsKICAgdm9zX3BrdF90KiogICAgICAgICBwdm9zRGF0YUJ1ZmYgPSAodm9zX3BrdF90KiopcHBGcmFtZURhdGFCdWZmOwogICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICB2X1UzMl90ICAgICAgICAgICAgIHVSZW1haW5pbmcgPSB1U2l6ZTsKICAgdm9zX3BrdF90KiAgICAgICAgICB2b3NSb290OwogICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1RlbXBCdWY7CiAgIFdMQU5UTF9TVEFGdW5jVHlwZSAgcGZuU1RBRnNtOwogICB2X1UxNl90ICAgICAgICAgICAgIHVzUGt0TGVuOwogICB2X1UzMl90ICAgICAgICAgICAgIHVSZXNMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgdWNTVEFJZDsKICAgdl9VOF90ICAgICAgICAgICAgICB1Y0FDOwogICB2b3NfcGt0X3QqICAgICAgICAgIHZvc0RhdGFCdWZmOwogICB2X1UzMl90ICAgICAgICAgICAgIHVUb3RhbFBrdExlbjsKICAgdl9VMzJfdCAgICAgICAgICAgICBpPTA7CiAgIHZfVTMyX3QgICAgICAgICAgICAgaj0wOwogICB2X1UzMl90ICAgICAgICAgICAgIHVjUmVzdWx0ID0gMDsKICAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgIFdMQU5UTF9TVEFFdmVudFR5cGUgICB3U1RBRXZlbnQ7CiAgIHRCc3NTeXN0ZW1Sb2xlICAgICAgIHN5c3RlbVJvbGU7CiAgIHRwQW5pU2lyR2xvYmFsIHBNYWM7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8ICggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiB1Y1Jlc3VsdDsKICB9CgogIHBNYWMgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9QRSwgcHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwTWFjICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcE1hYyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gdWNSZXN1bHQ7CiAgfQoKICB2b3NEYXRhQnVmZiA9IHBUTENiLT52b3NEdW1teUJ1ZjsgLyogSnVzdCB0byBhdm9pZCBjaGVja2luZyBmb3IgTlVMTCBhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggaXRlcmF0aW9uICovCgogIHBUTENiLT51UmVzQ291bnQgPSB1U2l6ZTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgcm9vdCBhcyB3ZSB3aWxsIHdhbGsgdGhpcyBjaGFpbiBhcyB3ZSBmaWxsIGl0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NSb290ID0gdm9zRGF0YUJ1ZmY7CiAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUaGVyZSBpcyBzdGlsbCBkYXRhIC0gdW50aWwgRlNNIGZ1bmN0aW9uIHNheXMgb3RoZXJ3aXNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYi0+YlVyZ2VudCAgICAgID0gRkFMU0U7CgogIHdoaWxlICgoIHBUTENiLT50bENvbmZpZ0luZm8udU1pbkZyYW1lc1Byb2NUaHJlcyA8IHBUTENiLT51UmVzQ291bnQgKSAmJgogICAgICAgICAoIDAgPCB1UmVtYWluaW5nICkpCiAgewogICAgc3lzdGVtUm9sZSA9IHdkYUdldEdsb2JhbFN5c3RlbVJvbGUocE1hYyk7CiNpZmRlZiBXTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTgovKiBGSVhNRTogVGhlIGNvZGUgaGFzIGJlZW4gZGlzYWJsZWQgc2luY2UgaXQgaXMgY3JlYXRpbmcgaXNzdWVzIGluIHBvd2VyIHNhdmUgKi8KICAgIGlmIChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkKICAgIHsKICAgICAgIGlmIChwVExDYi0+ZG9uZV9vbmNlID09IDAgJiYgTlVMTCA9PSBwVExDYi0+dm9zVHhGQ0J1ZikKICAgICAgIHsKICAgICAgICAgIFdMQU5UTF9UeEZDRnJhbWUgKHB2b3NHQ3R4KTsKICAgICAgICAgIHBUTENiLT5kb25lX29uY2UgKys7CiAgICAgICB9CiAgICB9IAogICAgaWYgKCBOVUxMICE9IHBUTENiLT52b3NUeEZDQnVmICkKICAgIHsKICAgICAgIC8vdGhlcmUgaXMgZmxvdyBjb250cm9sIHBhY2tldCB3YWl0aW5nIHRvIGJlIHNlbnQKICAgICAgIFdEQV9UTElfUFJPQ0VTU19GUkFNRV9MRU4oIHBUTENiLT52b3NUeEZDQnVmLCB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKICAgIAogICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICkgJiYKICAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkgJiYKICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19GQyApICkgKQogICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIEZDIGZyYW1lIGZpcnN0IG9uIEdldEZyYW1lIikpOwoKICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwgcFRMQ2ItPnZvc1R4RkNCdWYsIDEgLyp0cnVlKi8gKTsKCiAgICAgICAgICB2b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT52b3NUeEZDQnVmLCAodWludHB0cl90KSBOVUxMKTsKCiAgICAgICAgICAvKkZDIGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCiAgICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgICB1UmVtYWluaW5nICAgICAgICAtPSAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAtPSB1UmVzTGVuOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpzZW5kIGZjIG91dCBvZiBzb3VyY2UgJXMiLCBfX2Z1bmNfXykpOwogICAgICAgICAgdWNSZXN1bHQgPSAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICk/Vk9TX1RSVUU6Vk9TX0ZBTFNFOwogICAgICAgICAgYnJlYWs7IC8qIE91dCBvZiByZXNvdXJjZXMgb3IgcmVhY2hlZCBtYXggbGVuICovCiAgICAgICB9CiAgIH0KICAgZWxzZSAKI2VuZGlmIC8vV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KCiAgICBpZiAoKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkgJiYKICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApICkKICAgIHsKICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CgogICAgICBpZiAodXNQa3RMZW4gPiBXTEFOVExfTUFYX0FMTE9XRURfTEVOKQogICAgICB7CiAgICAgICAgICB1c1BrdExlbiA9IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU47CiAgICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgICB9CgogICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+IHVSZXNMZW4gKSAmJgogICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApICYmCiAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19NR01UICkgKSApCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgbWFuYWdlbWVudCBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKCiAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKnRydWUqLyApOwoKICAgICAgICB2b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT50bE1nbXRGcm1DbGllbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NQZW5kaW5nRGF0YUJ1ZmYsICh1aW50cHRyX3QpTlVMTCk7CgogICAgICAgIC8qbWFuYWdlbWVudCBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogICAgICAgIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOwoKICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgdVJlbWFpbmluZyAgICAgICAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgIC8qVXBkYXRlIHJlc291cmNlIGNvdW50ICovCiAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAtPSB1UmVzTGVuOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHVjUmVzdWx0ID0gKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApP1ZPU19UUlVFOlZPU19GQUxTRTsKICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoKCBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkgJiYKICAgICAgICAgICAgICggV0RBX1RMSV9NSU5fUkVTX0JBUCA8PSBwVExDYi0+dVJlc0NvdW50ICkgJiYKICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICAgICAgICAgICkKICAgIHsKICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKCiAgICAgIGlmICh1c1BrdExlbiA+IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4pCiAgICAgIHsKICAgICAgICAgIHVzUGt0TGVuID0gV0xBTlRMX01BWF9BTExPV0VEX0xFTjsKICAgICAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIH0KCiAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID4gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfTUYgKSApICYmCiAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkpCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgQlQtQU1QIGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyp0cnVlKi8gKTsKCiAgICAgICAgLypCQVAgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgdm9zX2F0b21pY19zZXQoICh1aW50cHRyX3QqKSZwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KSBOVUxMKTsKCiAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICBwVExDYi0+dVJlc0NvdW50ICAtPSB1UmVzTGVuOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHVjUmVzdWx0ID0gdVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19NRjsKICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KICAgICAgfQogICAgfQogICAgLyogbm90ZTogdGhpcyBmZWF0dXJlIGltcGxlbWVudGVkIG9ubHkgYWZ0ZXIgV0xBTl9JTkdFVFJBVEVEX1NPQyAqLwogICAgLyogc2VhcmNoICdFQVBPTF9ISV9QUklPUklUWScgd2lsbCBzaG93IEVBUE9MIEhJX1BSSU9SSVRZIGNoYW5nZSBpbiBUTCBhbmQgV0RJCiAgICAgICBieSBkZWZhdWx0LCBFQVBPTCB3aWxsIGJlIHRyZWF0ZWQgYXMgaGlnaGVyIHByaW9yaXR5LCB3aGljaCBtZWFucwogICAgICAgdXNlIG1nbXRfcG9vbCBhbmQgRFhFX1RYX0hJIHByb3JpdHkgY2hhbm5lbC4KICAgICAgIHRoaXMgaXMgaW50cm9kdWNlZCB0byBhZGRyZXNzIEVBUE9MIGZhaWx1cmUgdW5kZXIgaGlnaCBiYWNrZ3JvdW5kIHRyYWZmaWMKICAgICAgIHdpdGggbXVsdGktY2hhbm5lbCBjb25jdXJyZW50IG1vZGUuIEJ1dCB0aGlzIGNoYW5nZSB3b3JrcyBpbiBTQ0Mgb3Igc3RhbmRhbG9uZSwgdG9vLgogICAgICAgc2VlIENSIzM4NzAwOSBhbmQgV0NOU09TLTgKICAgICAqLwogICAgZWxzZSBpZiAoKCBXREFfVExJX01JTl9SRVNfTUYgPD0gcFRMQ2ItPnVSZXNDb3VudCApJiYKICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICYmCiAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApCiAgICAgICAgICAgICkKICAgIHsKICAgICAgICB2b3NUZW1wQnVmID0gTlVMTDsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBDaGVjayB0byBzZWUgaWYgdGhlcmUgd2FzIGFueSBFQVBPTCBwYWNrZXQgaXMgcGVuZGluZwogICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGZvciAoIGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICAgICAgewogICAgICAgICAgIGlmICgoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSkgJiYKICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y0V4aXN0cykgJiYKICAgICAgICAgICAgICAgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjVHhTdXNwZW5kZWQpICYmCiAgICAgICAgICAgICAgIChXTEFOVExfU1RBX0NPTk5FQ1RFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dGxTdGF0ZSkgJiYKICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y1BrdFBlbmRpbmcpCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA+PSBXTEFOX01BWF9TVEFfQ09VTlQpCiAgICAgICAgewogICAgICAgICAgIC8qIE5vIE1vcmUgdG8gU2VydmUgRXhpdCBHZXQgRnJhbWVzICovCiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIFNlcnZlIEVBUE9MIGZyYW1lIHdpdGggSElfRkxPV19NQVNLICovCiAgICAgICAgdWNTVEFJZCA9IGk7CgogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgICAgICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLAogICAgICAgICAgICAgICBUUkFDRV9DT0RFX1RMX0dFVF9GUkFNRVNfRUFQT0wsIHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsU3RhdGUpKTsKCiAgICAgICAgaWYgKHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlID09IFdMQU5fU1RBX0lORlJBKQogICAgICAgIHsKICAgICAgICAgICAgaWYoMCAhPSBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbV0xBTlRMX0FDX0hJR0hfUFJJT10pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQyA9IFdMQU5UTF9BQ19ISUdIX1BSSU87CiAgICAgICAgICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQyA9IFdMQU5UTF9BQ19ISUdIX1BSSU87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaiA9IFdMQU5UTF9NQVhfQUMgOyBqID4gMDsgai0tKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKDAgIT0gcENsaWVudFNUQS0+YXVjQUNNYXNrW2otMV0pCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWNDdXJyZW50QUMgPSBqLTE7CiAgICAgICAgICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDID0gai0xOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB3U1RBRXZlbnQgPSBXTEFOVExfVFhfRVZFTlQ7CgogICAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BDbGllbnRTVEEtPnRsU3RhdGVdLgogICAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKCiAgICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCiAgICAgICAgewogICAgICAgICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMDsKICAgICAgICAgIHZvc1N0YXR1cyAgPSBwZm5TVEFGc20oIHB2b3NHQ3R4LCB1Y1NUQUlkLCAmdm9zVGVtcEJ1ZiwgVk9TX0ZBTFNFKTsKCiAgICAgICAgICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgJiYKICAgICAgICAgICAgICAoIE5VTEwgIT0gdm9zVGVtcEJ1ZiApKQogICAgICAgICAgewogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmLCB2b3NTdGF0dXMgKTsKICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiA9IE5VTEw7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfS8qIHN0YXR1cyBzdWNjZXNzKi8KICAgICAgICB9CgogICAgICAgIGlmIChOVUxMICE9IHZvc1RlbXBCdWYpCiAgICAgICAgewogICAgICAgICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCB2b3NUZW1wQnVmLCB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKCiAgICAgICAgICAgIGlmICh1c1BrdExlbiA+IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVzUGt0TGVuID0gV0xBTlRMX01BWF9BTExPV0VEX0xFTjsKICAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlJlc291cmNlcyBuZWVkZWQgYnkgZnJhbWU6ICVkIiwgdVJlc0xlbikpOwoKICAgICAgICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPj0gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfTUYgKSApICYmCiAgICAgICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIGRhdGEgZnJhbWUgb24gR2V0RnJhbWUiKSk7CgogICAgICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwgdm9zVGVtcEJ1ZiwgMSAvKnRydWUqLyApOwoKICAgICAgICAgICAgICAvKkVBUE9MIGZyYW1lIGNhbm5vdCBiZSBkZWxheWVkKi8KICAgICAgICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiA9ICBOVUxMOwoKICAgICAgICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgICAgICAgdVJlbWFpbmluZyAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQgIC09IHVSZXNMZW47CgogICAgICAgICAgICAgIC8vZm93IGNvbnRyb2wgdXBkYXRlCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dUluZ3Jlc3NfbGVuZ3RoICs9IHVSZXNMZW47CiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggPSAocENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggPj0gdVJlc0xlbikgPwogICAgICAgICAgICAgICAgKHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4IC0gdVJlc0xlbikgOiAwOwogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nID0gMDsKICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpHZXRGcmFtZXMgU1RBOiAlZCBFQVBPTFBrdFBlbmRpbmcgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dWNFYXBvbFBrdFBlbmRpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7ICAvLyBubyBFQVBPTCBmcmFtZXMgZXhpdCBHZXQgZnJhbWVzCiAgICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkdldEZyYW1lcyBTVEE6ICVkLCBubyBFQVBPTCBmcmFtZSwgY29udGludWUuIiwKICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgIH0KCiAgICBlbHNlIGlmICgoIFdEQV9UTElfTUlOX1JFU19EQVRBIDw9IHBUTENiLT51UmVzQ291bnQgKSAmJgogICAgICAgICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgJiYKICAgICAgICAgICAgICggdUZsb3dNYXNrICYgV0xBTlRMX0RBVEFfRkxPV19NQVNLKSkKICAgIHsKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBDaGVjayB0byBzZWUgaWYgdGhlcmUgd2FzIGFueSBwYWNrZXQgbGVmdCBiZWhpbmQgcHJldmlvdXNseSBkdWUgdG8KICAgICAgICBzaXplIGNvbnN0cmFpbnRzCiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB2b3NUZW1wQnVmID0gTlVMTDsKCiAgICAgIGlmICggTlVMTCAhPSBwVExDYi0+dm9zVGVtcEJ1ZiApIAogICAgICB7CiAgICAgICAgdm9zVGVtcEJ1ZiAgICAgICAgICA9IHBUTENiLT52b3NUZW1wQnVmOwogICAgICAgIHBUTENiLT52b3NUZW1wQnVmICAgPSBOVUxMOwogICAgICAgIHVjU1RBSWQgICAgICAgICAgICAgPSBwVExDYi0+dWNDYWNoZWRTVEFJZDsgCiAgICAgICAgdWNBQyAgICAgICAgICAgICAgICA9IHBUTENiLT51Y0NhY2hlZEFDOwoKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjTm9Nb3JlRGF0YSA9IDA7CiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgY2FjaGVkIGRhdGEgZnJhbWUgb24gR2V0RnJhbWUiKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgV0xBTl9UTEdldE5leHRUeElkcyggcHZvc0dDdHgsICZ1Y1NUQUlkKTsKICAgICAgICBpZiAodWNTVEFJZCA+PSBXTEFOX01BWF9TVEFfQ09VTlQpCiAgICAgICAgewogICAgICAgICAvKiBQYWNrZXRzIHN0YXJ0IGNvbWluZyBpbiBldmVuIGFmdGVyIGluc21vZCBXaXRob3V0ICoKICAgICAgICAgICAgc3RhcnRpbmcgSG9zdGFwZCBvciBJbnRlcmZhY2UgYmVpbmcgdXAgICAgICAgICAgICAqCiAgICAgICAgICAgIER1cmluZyB3aGljaCBjYXNlcyBTVEFJRCBpcyBpbnZhbGVkIGFuZCBoZW5jZSAKICAgICAgICAgICAgdGhlIGNoZWNrLiBIYWxNc2dfU2NuYUNvbXBsZXRlIFRyaWdnZXJzICovCgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogdWNDdXJyZW50QUMgc2hvdWxkIGhhdmUgY29ycmVjdCBBQyB0byBiZSBzZXJ2ZWQgYnkgY2FsbGluZwogICAgICAgICAgIFdMQU5fVExHZXROZXh0VHhJZHMgKi8KICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICAgICAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgdWNBQyA9IHBDbGllbnRTVEEtPnVjQ3VycmVudEFDOwoKICAgICAgICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAxOwogICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiAlcyBnZXQgb25lIGRhdGEgZnJhbWUsIHN0YXRpb24gSUQgJWQgIiwgX19mdW5jX18sIHVjU1RBSWQpKTsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBDaGVjayB0byBzZWUgdGhhdCBTVEEgaXMgdmFsaWQgYW5kIHR4IGlzIG5vdCBzdXNwZW5kZWQKICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKCAoICEgV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKSAmJgogICAgICAgICAgICggMCA9PSBwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkICkgJiYKICAgICAgICAgICAoIDAgPT0gcENsaWVudFNUQS0+ZmNTdGFUeERpc2FibGVkKSApCiAgICAgICAgewogICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6ICVzIHN0YSBpZCB2YWxpZCBhbmQgbm90IHN1c3BlbmRlZCAiLF9fZnVuY19fKSk7CiAgICAgICAgICB3U1RBRXZlbnQgPSBXTEFOVExfVFhfRVZFTlQ7CgogICAgICAgICAgcGZuU1RBRnNtID0gdGxTVEFGc21bcENsaWVudFNUQS0+dGxTdGF0ZV0uCiAgICAgICAgICAgICAgICAgICAgICAgIHBmblNUQVRibFt3U1RBRXZlbnRdOwoKICAgICAgICAgIGlmICggTlVMTCAhPSBwZm5TVEFGc20gKQogICAgICAgICAgewogICAgICAgICAgICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAwOwogICAgICAgICAgICB2b3NTdGF0dXMgID0gcGZuU1RBRnNtKCBwdm9zR0N0eCwgdWNTVEFJZCwgJnZvc1RlbXBCdWYsIFZPU19GQUxTRSk7CgogICAgICAgICAgICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgJiYKICAgICAgICAgICAgICAgICggTlVMTCAhPSB2b3NUZW1wQnVmICkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAoIHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyApOwogICAgICAgICAgICAgICAgIHZvc1RlbXBCdWYgPSBOVUxMOwogICAgICAgICAgICB9Lyogc3RhdHVzIHN1Y2Nlc3MqLwogICAgICAgICAgfS8qTlVMTCBmdW5jdGlvbiBzdGF0ZSovCiAgICAgICAgfS8qIHZhbGlkIFNUQSBpZCBhbmQgISBzdXNwZW5kZWQqLwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgaWYgKCAhIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkgCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDpOb3QgZmV0Y2hpbmcgZnJhbWUgYmVjYXVzZSBzdXNwZW5kZWQgZm9yIHN0YSBJRCAlZCIsIAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpOwogICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0vKiBkYXRhICovCgogICAgICBpZiAoIE5VTEwgIT0gdm9zVGVtcEJ1ZiApCiAgICAgIHsKICAgICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCB2b3NUZW1wQnVmLCB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKCiAgICAgICAgaWYgKHVzUGt0TGVuID4gV0xBTlRMX01BWF9BTExPV0VEX0xFTikKICAgICAgICB7CiAgICAgICAgICAgIHVzUGt0TGVuID0gV0xBTlRMX01BWF9BTExPV0VEX0xFTjsKICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgICB9CgogICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6UmVzb3VyY2VzIG5lZWRlZCBieSBmcmFtZTogJWQiLCB1UmVzTGVuKSk7CgogICAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID49ICh1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX0JBUCApICkgJiYKICAgICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApICYmCiAgICAgICAgICAgICAoIHVGbG93TWFzayAmIFdMQU5UTF9EQVRBX0ZMT1dfTUFTSyApICkKICAgICAgICB7CiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIGRhdGEgZnJhbWUgb24gR2V0RnJhbWUiKSk7CgogICAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLCB2b3NUZW1wQnVmLCAxIC8qdHJ1ZSovICk7CiAgICAgICAgICB2b3NUZW1wQnVmID0gIE5VTEw7CgogICAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgICAgdVJlbWFpbmluZyAgICAgICAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgICAgIC8qVXBkYXRlIHJlc291cmNlIGNvdW50ICovCiAgICAgICAgICBwVExDYi0+dVJlc0NvdW50ICAtPSB1UmVzTGVuOwoKICAgICAgICAgIC8vZm93IGNvbnRyb2wgdXBkYXRlCiAgICAgICAgICBwQ2xpZW50U1RBLT51SW5ncmVzc19sZW5ndGggKz0gdVJlc0xlbjsKICAgICAgICAgIHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID0gKHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID49IHVSZXNMZW4pID8KICAgICAgICAgICAgKHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4IC0gdVJlc0xlbikgOiAwOwoKICAgICAgICAgIHBDbGllbnRTVEEtPnR4X2ZyYW1lcyArKzsKCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAvKiBTdG9yZSB0aGlzIGZvciBsYXRlciB0eCAtIGFscmVhZHkgZmV0Y2hlZCBmcm9tIEhERCAqLwogICAgICAgICAgcFRMQ2ItPnZvc1RlbXBCdWYgPSB2b3NUZW1wQnVmOwogICAgICAgICAgcFRMQ2ItPnVjQ2FjaGVkU1RBSWQgPSB1Y1NUQUlkOwogICAgICAgICAgcFRMQ2ItPnVjQ2FjaGVkQUMgICAgPSB1Y0FDOwogICAgICAgICAgdWNSZXN1bHQgPSB1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX0JBUDsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJtaW4gJWQgcmVzIHJlcXVpcmVkIGJ5IFRMLiIsIHVjUmVzdWx0ICkpOwogICAgICAgICAgYnJlYWs7IC8qIE91dCBvZiByZXNvdXJjZXMgb3IgcmVhY2hlZCBtYXggbGVuICovCiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldICYmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNFeGlzdHMpICYmCiAgICAgICAgICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNQa3RQZW5kaW5nKSAmJgogICAgICAgICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPmRpc2Fzc29jX3Byb2dyZXNzID09IFZPU19GQUxTRSkpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAvKiBUaGVyZSBpcyBzdGF0aW9uIHRvIGJlIFNlcnZlZCAqLwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGlmIChpID49IFdMQU5fTUFYX1NUQV9DT1VOVCkKICAgICAgICAgICB7CiAgICAgICAgICAgICAgLyogTm8gTW9yZSB0byBTZXJ2ZSBFeGl0IEdldCBGcmFtZXMgKi8KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKICAgICAgICAgICAgICAvKiBNb3JlIHRvIGJlIFNlcnZlZCAqLwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KICAgICAgICB9IAogICAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZXR1cm5pbmcgZnJvbSBHZXRGcmFtZTogcmVzb3VyY2VzID0gJWQgc3VzcGVuZGVkID0gJWQiLAogICAgICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHBUTENiLT51Y1R4U3VzcGVuZGVkKSk7CiAgICAgIC8qIFRMIGlzIHN0YXJ2aW5nIGV2ZW4gd2hlbiBEWEUgaXMgbm90IGluIGxvdyByZXNvdXJjZSBjb25kaXRpb24gCiAgICAgICAgIFJldHVybiBtaW4gcmVzb3VyY2UgbnVtYmVyIHJlcXVpcmVkIGFuZCBMZXQgRFhFIGRlY2VpZGUgd2hhdCB0byBkbyAqLwogICAgICBpZigoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAmJiAKICAgICAgICAgKCB1Rmxvd01hc2sgJiBXTEFOVExfREFUQV9GTE9XX01BU0sgKSApCiAgICAgIHsKICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICJXTEFOIFRMOlJldHVybmluZyBmcm9tIEdldEZyYW1lOiByZXNvdXJjZXMgPSAlZCIsCiAgICAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCkpOwogICAgICAgICB1Y1Jlc3VsdCA9IFdEQV9UTElfTUlOX1JFU19EQVRBOwogICAgICB9CiAgICAgICBicmVhazsgLypvdXQgb2YgbWluIGRhdGEgcmVzb3VyY2VzKi8KICAgIH0KCiAgICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50Kys7CiAgICAvKiBNb3ZlIGRhdGEgYnVmZmVyIHVwIG9uZSBwYWNrZXQgKi8KICAgIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLCAmdm9zRGF0YUJ1ZmYsIDAvKmZhbHNlKi8gKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUGFja2V0IGNoYWluIHN0YXJ0cyBhdCByb290ICsgMQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NSb290LCAmdm9zRGF0YUJ1ZmYsIDEvKnRydWUqLyApOwoKICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgaWYgKHBiVXJnZW50KQogIHsKICAgICAgKnBiVXJnZW50ICAgICA9IHBUTENiLT5iVXJnZW50OwogIH0KICBlbHNlCiAgewogICAgICBWT1NfQVNTRVJUKCBwYlVyZ2VudCApOwogIH0KICByZXR1cm4gdWNSZXN1bHQ7Cn0vKiBXTEFOVExfR2V0RnJhbWVzICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhDb21wCgogIERFU0NSSVBUSU9OCiAgICBJdCBpcyBiZWluZyBjYWxsZWQgYnkgQkFMIHVwb24gYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiBvZiB0aGUgcGFja2V0CiAgICBvciBwYWNrZXRzICBiZWluZyBzZW50IG92ZXIgdGhlIGJ1cy4KCiAgREVQRU5ERU5DSUVTCiAgICBUeCBjb21wbGV0ZSBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgYSBwcmV2aW91cyB0cmFuc21pdC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciBmb3Igd2hpY2gKICAgICAgICAgICAgICAgICAgICB0aGUgQkFMIHJlcG9ydCBpcyBiZWluZyBtYWRlLCBpZiB0aGVyZSBpcyBtb3JlIHRoZW4gb25lCiAgICAgICAgICAgICAgICAgICAgcGFja2V0IHRoZXkgd2lsbCBiZSBjaGFpbmVkIHVzaW5nIHZPU1MgYnVmZmVycy4KICAgIHdUeFN0YXR1czogICAgICB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQsIHNlZSBhYm92ZSBjaGFwdGVyCiAgICAgICAgICAgICAgICAgICAgb24gSEREIGludGVyYWN0aW9uIGZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4Q29tcAooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCAgICAgICpwRnJhbWVEYXRhQnVmZiwKICBWT1NfU1RBVFVTICAgICAgd1R4U3RhdHVzCikKewogIHZvc19wa3RfdCogICAgICAgICAgIHZvc0RhdGFCdWZmID0gKHZvc19wa3RfdCopcEZyYW1lRGF0YUJ1ZmY7CiAgV0xBTlRMX0NiVHlwZSogICAgICAgcFRMQ2IgICAgID0gTlVMTDsKICBXTEFOVExfVHhDb21wQ0JUeXBlICBwZm5UeENvbXAgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NUZW1wVHggPSBOVUxMOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSB2b3NEYXRhQnVmZiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpFeHRyYW5lb3VzIE5VTEwgZGF0YSBwb2ludGVyIG9uIFdMQU5UTF9UeENvbXAiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfVHhDb21wIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHdoaWxlICgoMCA8IHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQpICYmCiAgICAgICAgICggVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cyApICYmCiAgICAgICAgICggTlVMTCAhPSAgdm9zRGF0YUJ1ZmYpKQogIHsKICAgIHZvc19wa3RfZ2V0X3VzZXJfZGF0YV9wdHIoICB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwZm5UeENvbXApOwoKICAgIC8qaXQgc2hvdWxkIG5ldmVyIGJlIE5VTEwgLSBkZWZhdWx0IGhhbmRsZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgaWYgbm9uZSovCiAgICBpZiAoIE5VTEwgPT0gcGZuVHhDb21wICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6TlVMTCBwb2ludGVyIHRvIFR4IENvbXBsZXRlIG9uIFdMQU5UTF9UeENvbXAiKSk7CiAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6Q2FsbGluZyBUeCBjb21wbGV0ZSBmb3IgcGt0ICVwSyBpbiBmdW5jdGlvbiAlcEsiLAogICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwgcGZuVHhDb21wKSk7CgogICAgdm9zVGVtcFR4ID0gdm9zRGF0YUJ1ZmY7CiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NEYXRhQnVmZiwgMS8qdHJ1ZSovKTsKCiAgICBwZm5UeENvbXAoIHB2b3NHQ3R4LCB2b3NUZW1wVHgsIHdUeFN0YXR1cyApOwoKICAgIHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQtLTsKICB9CgogCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6IGN1cnJlbnQgVEwgdmFsdWVzIGFyZTogcmVzb3VyY2VzID0gJWQgIgogICAgICAgICAgICAicFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCA9ICVkIiwKICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50KSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfVHhDb21wICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DYWNoZVNUQUZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBmb3IgY2FjaGluZyBpbmNvbWluZyBkYXRhIGZyYW1lcyB0aGF0IGRvIAogICAgbm90IGhhdmUgYSByZWdpc3RlcmVkIHN0YXRpb24geWV0LiAKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIEluIG9yZGVyIHRvIGJlbmVmaXQgZnJvbSB0aHNpIGNhY2hpbmcsIHRoZSBjb21wb25lbnRzIG11c3QgZW5zdXJlIHRoYXQKICAgIHRoZXkgd2lsbCBvbmx5IHJlZ2lzdGVyIHdpdGggVEwgYXQgdGhlIG1vbWVudCB3aGVuIHRoZXkgYXJlIGZ1bGx5IHNldHVwCiAgICBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBpbmNvbWluZyBkYXRhIAogICAKICBQQVJBTUVURVJTCgogICAgSU4KICAgIAogICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICAgdWNTVEFJZDogICAgICAgICAgICAgICAgc3RhdGlvbiBpZAogICAgdm9zVGVtcEJ1ZmY6ICAgICAgICAgICAgdGhlIGRhdGEgcGFja2V0CiAgICB1RFBVU2lnOiAgICAgICAgICAgICAgICBEUFUgc2lnbmF0dXJlIG9mIHRoZSBpbmNvbWluZyBwYWNrZXQKICAgIGJCY2FzdDogICAgICAgICAgICAgICAgIHRydWUgaWYgcGFja2V0IGhhZCB0aGUgTUMvQkMgYml0IHNldCAKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgb3IgU1RBIElkIGludmFsaWQgOyBhY2Nlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kc3RhdGljIFZPU19TVEFUVVMKV0xBTlRMX0NhY2hlU1RBRnJhbWUKKAogIFdMQU5UTF9DYlR5cGUqICAgIHBUTENiLAogIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgdl9VMzJfdCAgICAgICAgICAgdURQVVNpZywKICB2X1U4X3QgICAgICAgICAgICBiQmNhc3QsCiAgdl9VOF90ICAgICAgICAgICAgdWNGcm1UeXBlCikKewogIHZfVThfdCAgICB1Y1VjYXN0U2lnOwogIHZfVThfdCAgICB1Y0JjYXN0U2lnOwogIHZfQk9PTF90ICBiT2xkU1RBUGt0OwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogICAgIFNhbml0eSBjaGVjayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCAoIE5VTEwgPT0gdm9zVGVtcEJ1ZmYgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDogSW52YWxpZCBpbnB1dCBwb2ludGVyIG9uIFdMQU5UTF9DYWNoZVNUQUZyYW1lIFRMICVwSyIKICAgICAgICAgICAgICAgIiBQYWNrZXQgJXBLIiwgcFRMQ2IsIHZvc1RlbXBCdWZmICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ2FjaGVTVEFGcmFtZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpBdHRlbXB0aW5nIHRvIGNhY2hlIHBrdCBmb3IgU1RBICVkLCBCRCBEUFUgU2lnOiAlZCB3aXRoIHNpZyBVQzogJWQsIEJDOiAlZCIsIAogICAgICAgICAgICAgdWNTVEFJZCwgdURQVVNpZywKICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcsCiAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnKSk7CgogIGlmKFdMQU5UTF9JU19DVFJMX0ZSQU1FKHVjRnJtVHlwZSkpCiAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyBuZWVkIHRvIGNhY2hlIENUUkwgZnJhbWUuIERyb3BwaW5nIikpOwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhlIHBhY2tldCB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gY2FjaGUgYmVsb25ncyB0byB0aGUgb2xkCiAgICByZWdpc3RlcmVkIHN0YXRpb24gKGlmIGFueSkgb3IgdGhlIG5ldyAocG90ZW50aWFsbHkpdXBjb21pbmcgc3RhdGlvbgogICAgCiAgICAtIElmIHRoZSBTVEEgd2l0aCB0aGlzIElkIHdhcyBuZXZlciByZWdpc3RlcmVkIHdpdGggVEwgLSB0aGUgc2lnbmF0dXJlCiAgICB3aWxsIGJlIGludmFsaWQ7CiAgICAtIElmIHRoZSBTVEEgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBUTCB3aWxsIGhhdmUgY2FjaGVkIHRoZSBmb3JtZXIKICAgIHNldCBvZiBEUFUgc2lnbmF0dXJlcwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggYkJjYXN0ICkKICB7CiAgICB1Y0JjYXN0U2lnID0gKHZfVThfdCl1RFBVU2lnOwogICAgYk9sZFNUQVBrdCA9ICgoIFdMQU5fVExfSU5WQUxJRF9CX1NJRyAhPSAKICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZyApICYmCiAgICAgICggdWNCY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICkpOwogIH0KICBlbHNlCiAgewogICAgdWNVY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgIGJPbGRTVEFQa3QgPSAoKCBXTEFOX1RMX0lOVkFMSURfVV9TSUcgIT0gCiAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyApICYmCiAgICAgICAgKCB1Y1VjYXN0U2lnID09IHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcgKSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSWYgdGhlIHZhbHVlIG9mIHRoZSBEUFUgU0lHIG1hdGNoZXMgdGhlIG9sZCwgdGhpcyBwYWNrZXQgd2lsbCBub3QKICAgIGJlIGNhY2hlZCBhcyBpdCBiZWxvbmdlZCB0byB0aGUgZm9ybWVyIGFzc29jaWF0aW9uCiAgICBJbiBjYXNlIHRoZSBTSUcgZG9lcyBub3QgbWF0Y2ggLSB0aGlzIGlzIGEgcGFja2V0IGZvciBhIHBvdGVudGlhbGx5IG5ldwogICAgYXNzb2NpYXRlZCBzdGF0aW9uIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggYk9sZFNUQVBrdCB8fCBiQmNhc3QgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkRhdGEgcGFja2V0IG1hdGNoZXMgb2xkIHNpZyBmb3Igc2lnIERQVTogJWQgVUM6ICVkLCAiCiAgICAgICAgICAgICAgICJCQzogJWQgLSBkcm9wcGluZyIsIAogICAgICAgICAgICAgICB1RFBVU2lnLCAKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZywKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgfQogIGVsc2UKICB7CiAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgKQogICAgewogICAgICAvKnRoaXMgaXMgdGhlIGZpcnN0IGZyYW1lIHRoYXQgd2UgYXJlIGNhY2hpbmcgKi8KICAgICAgcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgPSB2b3NUZW1wQnVmZjsKCiAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlSW5pdFRpbWUgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCk7CiAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlRG9uZVRpbWUgPQogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlSW5pdFRpbWU7CiAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSA9IDE7CgogICAgICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfQ0FDSEVfRlJBTUUsCiAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplKSk7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAvKnRoaXMgaXMgYSBzdWJzZXF1ZW50IGZyYW1lIHRoYXQgd2UgYXJlIGNhY2hpbmc6IGNoYWluIHRvIHRoZSBlbmQgKi8KICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQocENsaWVudFNUQS0+dm9zRW5kQ2FjaGVkRnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLCBWT1NfVFJVRSk7CgogICAgICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZURvbmVUaW1lID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOwogICAgICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUgKys7CgogICAgICBpZiAocENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplICUgV0xBTlRMX0NBQ0hFX1RSQUNFX1dBVEVSTUFSSyA9PSAwKQogICAgICB7CiAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIiVzOiBDYWNoZSBIaWdoIHdhdGVybWFyayBmb3Igc3RhaWQ6JWQgKCVkKSIsCiAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSk7CiAgICAgICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX0NBQ0hFX0ZSQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplKSk7CiAgICAgIH0KICAgIH0KICAgIHBDbGllbnRTVEEtPnZvc0VuZENhY2hlZEZyYW1lID0gdm9zVGVtcEJ1ZmY7CiAgfS8qZWxzZSBuZXcgcGFja2V0Ki8KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgCn0vKldMQU5UTF9DYWNoZVNUQUZyYW1lKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgVEwgdG8gZmx1c2ggdGhlIHN0YXRpb24gY2FjaGUKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIAogIFBBUkFNRVRFUlMKCiAgICBJTgoKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNhY2hlZCBidWZmZXIKICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCiAgTk9URQogICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlLWluaXRpYWxpemUgdm9zRGF0YUJ1ZmYgdG8gTlVMTC4gSXQncyBjYWxsZXIncyAKICAgIHJlc3BvbnNpYmlsaXR5IHRvIGRvIHNvLCBpZiByZXF1aXJlZCwgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjYWxsLgogICAgQmVjYXVzZSBvZiB0aGlzIHJlc3RyaWN0aW9uLCB3ZSBkZWNpZGUgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIHRvIHN0YXRpYwogICAgc28gdGhhdCB1cHBlciBsYXllciBkb2Vzbid0IG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhpcyByZXN0cmljdGlvbi4gCiAgICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTCldMQU5UTF9GbHVzaENhY2hlZEZyYW1lcwooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmCikKewogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmV0dXJuIHRoZSBlbnRpcmUgY2hhaW4gdG8gdm9zIGlmIHRoZXJlIGFyZSBpbmRlZWQgY2FjaGUgZnJhbWVzIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCAhPSB2b3NEYXRhQnVmZiApCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7ICAKfS8qV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGVpdGhlciBmb3J3YXJkaW5nIGNhY2hlZCBkYXRhIHRvIHRoZSBzdGF0aW9uIGFmdGVyCiAgICB0aGUgc3RhdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkLCBvciBmbHVzaGluZyBjYWNoZWQgZGF0YSBpZiB0aGUgc3RhdGlvbiBoYXMgbm90IAogICAgYmVlbiByZWdpc3RlcmVkLiAKICAgICAKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHBUTENiOiAgICAgICAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU1RBSWQ6ICAgICAgICAgICAgICAgIHN0YXRpb24gaWQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmUtaW5pdGlhbGl6ZSB2b3NEYXRhQnVmZiB0byBOVUxMLiBJdCdzIGNhbGxlcidzIAogICAgcmVzcG9uc2liaWxpdHkgdG8gZG8gc28sIGlmIHJlcXVpcmVkLCBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwuCiAgICBCZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIHdlIGRlY2lkZSB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdG8gc3RhdGljCiAgICBzbyB0aGF0IHVwcGVyIGxheWVyIGRvZXNuJ3QgbmVlZCB0byBiZSBhd2FyZSBvZiB0aGlzIHJlc3RyaWN0aW9uLiAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUwpXTEFOVExfRm9yd2FyZFNUQUZyYW1lcwooCiAgdm9pZCogICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICAgICB1Y1VjYXN0U2lnLAogIHZfVThfdCAgICAgICAgICAgIHVjQmNhc3RTaWcKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogICAgIFNhbml0eSBjaGVjayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6IEludmFsaWQgaW5wdXQgcG9pbnRlciBvbiBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcyBUTCAlcEsiLAogICAgICAgICBwVExDYiApKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLy9XTEFOX1RMX0xPQ0tfU1RBX0NBQ0hFKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdKTsgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgQ2hlY2sgaWYgc3RhdGlvbiBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCBpbiB0aGUgbWVhbiB3aGlsZQogICAgIGlmIG5vdCByZWdpc3RlcmVkLCBmbHVzaCBjYWNoZWQgZnJhbWVzLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAiV0xBTiBUTDpTdGF0aW9uIGhhcyBiZWVuIGRlbGV0ZWQgZm9yIFNUQSAlZCAtIGZsdXNoaW5nIGNhY2hlIiwgdWNTVEFJZCkpOwogICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX0ZMVVNIX0NBQ0hFRF9GUkFNRVMsCiAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSkpOwogICAgV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzKHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lKTsKICAgIGdvdG8gZG9uZTsgCiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRm9yd2FyZGluZyBjYWNoZSBmcmFtZXMgcmVjZWl2ZWQgd2hpbGUgdGhlIHN0YXRpb24gd2FzIGluIHRoZSBwcm9jZXNzICAgCiAgICBvZiBiZWluZyByZWdpc3RlcmVkIHdpdGggdGhlIHJlc3Qgb2YgdGhlIFNXIGNvbXBvbmVudHMgICAKCiAgICBBY2Nlc3MgdG8gdGhlIGNhY2hlIG11c3QgYmUgbG9ja2VkOyBzaW1pbGFybHkgdXBkYXRpbmcgdGhlIHNpZ25hdHVyZSBhbmQgICAKICAgIHRoZSBleGlzdGVuY2UgZmxhZyBtdXN0IGJlIHN5bmNocm9uaXplZCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBhcmUgY2hlY2tlZCAgIAogICAgZHVyaW5nIGNhY2hlZCAgCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgIldMQU4gVEw6UHJlcGFyaW5nIHRvIGZ3ZCBwYWNrZXRzIGZvciBTVEEgJWQiLCB1Y1NUQUlkKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgdGhlIG5ldyBzaWduYXR1cmUgdmFsdWVzCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICA9IHVjVWNhc3RTaWc7CiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZyAgPSB1Y0JjYXN0U2lnOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgIldMQU4gVEw6RndkLWluZyBwYWNrZXRzIGZvciBTVEEgJWQgVUMgJWQgQkMgJWQiLAogICAgICAgdWNTVEFJZCwgdWNVY2FzdFNpZywgdWNCY2FzdFNpZykpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogICAgIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFueSBjYWNoZWQgZGF0YSB0byBmb3J3YXJkIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgaWYgKCBOVUxMICE9IHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDogRndkLWluZyBDYWNoZWQgcGFja2V0cyBmb3Igc3RhdGlvbiAlZCIsIHVjU1RBSWQgKSk7CgogICAgV0xBTlRMX1J4Q2FjaGVkRnJhbWVzKCBwVExDYiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSk7CiAgfQogIGVsc2UKICB7CiAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6IE5PIGNhY2hlZCBwYWNrZXRzIGZvciBzdGF0aW9uICVkIiwgdWNTVEFJZCApKTsKICB9Cgpkb25lOgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCiAgIENsZWFyIHRoZSBzdGF0aW9uIGNhY2hlIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSA9IE5VTEw7CiAgcENsaWVudFNUQS0+dm9zRW5kQ2FjaGVkRnJhbWUgPSBOVUxMOwogIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSA9IDA7CiAgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVDbGVhclRpbWUgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWZ0ZXIgYWxsIHRoZSBpbml0IGlzIGNvbXBsZXRlIHdlIGNhbiBtYXJrIHRoZSBleGlzdGFuY2UgZmxhZyAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPmVuYWJsZUNhY2hpbmcgPSAwOwoKICAvL1dMQU5fVExfVU5MT0NLX1NUQV9DQUNIRShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSk7IAogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7IAoKfS8qV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMqLwoKCiNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0lzSUFQUEZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlY3RpbmcgaW5jb21pbmcgRVNFIElBUFAgZnJhbWVzCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIAogICAgcHZCREhlYWRlcjogICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCiAgICB2b3NUZW1wQnVmZjogICAgICAgICAgICB0aGUgZGF0YSBwYWNrZXQKCiAgICBJTi9PVVQKICAgIHBGaXJzdERhdGFQa3RBcnJpdmVkOiAgIHN0YXRpYyBmcm9tIGNhbGxlciBmdW5jdGlvbjsgdXNlZCBmb3IgcnNzaSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGF0aW9uCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19UUlVFOiAgIEl0IGlzIGEgSUFQUCBmcmFtZQogICAgVk9TX0ZBTFNFOiAgSXQgaXMgTk9UIElBUFAgZnJhbWUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9CT09MX3QKV0xBTlRMX0lzSUFQUEZyYW1lCigKICB2X1BWT0lEX3QgICAgICAgICBwdkJESGVhZGVyLAogIHZvc19wa3RfdCogICAgICAgIHZvc1RlbXBCdWZmCikKewogIHZfVTE2X3QgICAgICAgICAgICAgdXNNUERVRE9mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjT2Zmc2V0OwogIHZfVThfdCAgICAgICAgICAgICAgdWNTbmFwSGRyW1dMQU5UTF9MTENfU05BUF9TSVpFXTsKICB2X1NJWkVfdCAgICAgICAgICAgIHVzU25hcEhkclNpemUgPSBXTEFOVExfTExDX1NOQVBfU0laRTsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBPVUkgZmllbGQgaXMgcHJlc2VudC4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFZPU19GQUxTRSA9PSBXREFfSVNfUlhfTExDX1BSRVNFTlQocHZCREhlYWRlcikgKQogIHsKICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkxMQyBoZWFkZXIgcmVtb3ZlZCwgY2Fubm90IGRldGVybWluZSBCVC1BTVAgdHlwZSAtIgogICAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICByZXR1cm4gVk9TX1RSVUU7CiAgfQogIHVzTVBEVURPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChwdkJESGVhZGVyKTsKICB1Y09mZnNldCAgICAgID0gKHZfVThfdCl1c01QRFVET2Zmc2V0ICsgV0xBTlRMX0xMQ19TTkFQX09GRlNFVDsKCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc1RlbXBCdWZmLCB1Y09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXVjU25hcEhkciwgJnVzU25hcEhkclNpemUpOwoKICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSkgCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGV4dHJhY3QgU25hcCBIZHIgb2YgZGF0YSAgcGFja2V0IC0iCiAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgcmV0dXJuIFZPU19GQUxTRTsKICB9CgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIHRoaXMgaXMgSUFQUCBmcmFtZSBieSBtYXRjaGluZyBBaXJvbmV0IFNuYXAgaGRyLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIC8vIENvbXBhcmUgcmV0dXJucyAxIGlmIHZhbHVlcyBhcmUgc2FtZSBhbmQgMAogIC8vIGlmIG5vdCB0aGUgc2FtZS4KICBpZiAoKCBXTEFOVExfTExDX1NOQVBfU0laRSAhPSB1c1NuYXBIZHJTaXplICkgfHwKICAgICAoIDAgPT0gdm9zX21lbV9jb21wYXJlKHVjU25hcEhkciwgKHZfUFZPSURfdClXTEFOVExfQUlST05FVF9TTkFQX0hFQURFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfU05BUF9TSVpFICkgKSkKICB7CiAgICByZXR1cm4gVk9TX0ZBTFNFOwogIH0KCiAgcmV0dXJuIFZPU19UUlVFOwoKfQojZW5kaWYgLy9GRUFUVVJFX1dMQU5fRVNFCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Qcm9jZXNzQkFQRnJhbWUKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHByb2Nlc3NpbmcgaW5jb21pbmcgQlQtQU1QIGZyYW1lcwoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgQm90aGUgdGhlIEJULUFNUCBzdGF0aW9uIGFuZCB0aGUgQkFQIEN0cmwgcGF0aCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IAogICAgcmVnaXN0ZXJlZCB3aXRoIFRMLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIAogICAgcHZCREhlYWRlcjogICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCiAgICB2b3NUZW1wQnVmZjogICAgICAgICAgICB0aGUgZGF0YSBwYWNrZXQKICAgIHBUTENiOiAgICAgICAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU1RBSWQ6ICAgICAgICAgICAgICAgIHN0YXRpb24gaWQKCiAgICBJTi9PVVQKICAgIHBGaXJzdERhdGFQa3RBcnJpdmVkOiAgIHN0YXRpYyBmcm9tIGNhbGxlciBmdW5jdGlvbjsgdXNlZCBmb3IgcnNzaSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGF0aW9uCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Qcm9jZXNzQkFQRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICAgIHB2QkRIZWFkZXIsCiAgdm9zX3BrdF90KiAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgV0xBTlRMX0NiVHlwZSogICAgcFRMQ2IsCiAgdl9VOF90KiAgICAgICAgICAgcEZpcnN0RGF0YVBrdEFycml2ZWQsCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZAopCnsKICB2X1UxNl90ICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjT1VJW1dMQU5UTF9MTENfT1VJX1NJWkVdOwogIHZfU0laRV90ICAgICAgICAgICAgdXNPVUlTaXplID0gV0xBTlRMX0xMQ19PVUlfU0laRTsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB2X1UxNl90ICAgICAgICAgICAgIHVzVHlwZTsKICB2X1NJWkVfdCAgICAgICAgICAgIHVzVHlwZUxlbiA9IHNpemVvZih1c1R5cGUpOwogIHZfVThfdCAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjTVBEVUhMZW4gPSAwOwogIHZfVTE2X3QgICAgICAgICAgICAgdXNBY3R1YWxITGVuID0gMDsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IE9VSSBhbmQgdHlwZSBmcm9tIExMQyBhbmQgdmFsaWRhdGU7IGlmIG5vbi1kYXRhIHNlbmQgdG8gQkFQCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKHB2QkRIZWFkZXIpICkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICJXTEFOIFRMOkxMQyBoZWFkZXIgcmVtb3ZlZCwgY2Fubm90IGRldGVybWluZSBCVC1BTVAgdHlwZSAtIgogICAgICAgICAgICAgICJkcm9wcGluZyBwa3QiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgIHJldHVybiBWT1NfVFJVRTsgCiAgfQoKICB1c01QRFVET2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQocHZCREhlYWRlcik7CiAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQocHZCREhlYWRlcik7CiAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocHZCREhlYWRlcik7CiAgdWNPZmZzZXQgICAgICA9ICh2X1U4X3QpdXNNUERVRE9mZnNldCArIFdMQU5UTF9MTENfT1VJX09GRlNFVDsKCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc1RlbXBCdWZmLCB1Y09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXVjT1VJLCAmdXNPVUlTaXplKTsKCiNpZiAwCiAgLy8gQ29tcGFyZSByZXR1cm5zIDEgaWYgdmFsdWVzIGFyZSBzYW1lIGFuZCAwCiAgLy8gaWYgbm90IHRoZSBzYW1lLgogIGlmICgoIFdMQU5UTF9MTENfT1VJX1NJWkUgIT0gdXNPVUlTaXplICkgfHwKICAgICAoIDAgPT0gdm9zX21lbV9jb21wYXJlKHVjT1VJLCAodl9QVk9JRF90KVdMQU5UTF9CVF9BTVBfT1VJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0xMQ19PVUlfU0laRSApICkpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiTExDIGhlYWRlciBwb2ludHMgdG8gZGlmZiBPVUkgaW4gQlQtQU1QIHN0YXRpb24gLSIKICAgICAgICAgICAgICAgICJkcm9wcGluZyBwa3QiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgIHJldHVybiBWT1NfVFJVRTsKICB9CiNlbmRpZgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IExMQyBPVUkgYW5kIGVuc3VyZSB0aGF0IHRoaXMgaXMgaW5kZWVkIGEgQlQtQU1QIGZyYW1lCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y09mZnNldCArIFdMQU5UTF9MTENfT1VJX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmdXNUeXBlLCAmdXNUeXBlTGVuKTsKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgfHwKICAgICAgKCBzaXplb2YodXNUeXBlKSAhPSB1c1R5cGVMZW4gKSkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZXh0cmFjdCB0eXBlIG9uIGluY29taW5nIEJBUCBwYWNrZXQgLSIKICAgICAgICAgICAgICAgICJkcm9wcGluZyBwa3QiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgIHJldHVybiBWT1NfVFJVRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aGlzIGlzIEJULUFNUCBkYXRhIG9yIGN0cmwgcGFja2V0KFJTTiwgTGlua1N2aXNpb24sIEFjdGl2aXR5UikKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1c1R5cGUgPSB2b3NfYmUxNl90b19jcHUodXNUeXBlKTsKCiAgaWYgKFdMQU5UTF9CQVBfSVNfTk9OX0RBVEFfUEtUX1RZUEUodXNUeXBlKSkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDpOb24tZGF0YSBwYWNrZXQgcmVjZWl2ZWQgb3ZlciBCVC1BTVAgbGluazogJWQsID0+IEJBUCIsCiAgICAgICAgICAgICAgIHVzVHlwZSkpOwoKICAgIC8qRmxhdHRlbiBwYWNrZXQgYXMgQkFQIGV4cGVjdHMgdG8gYmUgYWJsZSB0byBwZWVrKi8KICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19wa3RfZmxhdHRlbl9yeF9wa3QoJnZvc1RlbXBCdWZmKSkKICAgIHsKICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGZsYXR0ZW4gQlQtQU1QIHBhY2tldCAtIGRyb3BwaW5nIikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICByZXR1cm4gVk9TX1RSVUU7CiAgICB9CgogICAgLyogU2VuZCBwYWNrZXQgdG8gQkFQIGNsaWVudCovCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfVHJpbVJ4UGFja2V0SW5mbyggdm9zVGVtcEJ1ZmYgKSApCiAgICB7CiAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBjb3JydXB0ZWQgLSBkcm9wcGluZyBwYWNrZXQiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHJldHVybiBWT1NfVFJVRTsKICAgIH0KCiAgICBpZiAoIDAgPT0gV0RBX0dFVF9SWF9GVF9ET05FKHB2QkRIZWFkZXIpICkKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICJOb24tZGF0YSBwYWNrZXQgcmVjZWl2ZWQgb3ZlciBCVC1BTVAgbGluazogU2VuZGluZyBpdCBmb3IgIgogICAgICAgICAgImZyYW1lIFRyYW5zbGF0aW9uIikpOwoKICAgICAgaWYgKHVzTVBEVURPZmZzZXQgPiB1Y01QRFVIT2Zmc2V0KQogICAgICB7CiAgICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICAgIH0KCiAgICAgIC8qIHNvZnR3YXJlIGZyYW1lIHRyYW5zbGF0aW9uIGZvciBCVEFNUCBXRFMuKi8KICAgICAgV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKCB2b3NUZW1wQnVmZiwgJnZvc1N0YXR1cywgdXNBY3R1YWxITGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sIHBUTENiLHVjU1RBSWQsIFZPU19GQUxTRSk7CiAgICAgIAogICAgfQogICAgaWYgKHBUTENiLT50bEJBUENsaWVudC5wZm5UbEJBUFJ4KQogICAgICAgIHBUTENiLT50bEJBUENsaWVudC5wZm5UbEJBUFJ4KCB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5UTF9CQVBGcmFtZUVudW1UeXBlKXVzVHlwZSApOwogICAgZWxzZQogICAgewogICAgICAgIFZPU19BU1NFUlQoMCk7CiAgICB9CgogICAgcmV0dXJuIFZPU19UUlVFOwogIH0KICBlbHNlCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgIldMQU4gVEw6IEJBUCBEQVRBIHBhY2tldCByZWNlaXZlZCBvdmVyIEJULUFNUCBsaW5rOiAlZCwgPT4gQkFQIiwKICAgICAgICAgICAgICAgdXNUeXBlKSk7CiAgIC8qISEhRklYIE1FISEqLwogI2lmIDAKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBGb3IgZGF0YSBwYWNrZXQgY29sbGVjdCBwaHkgc3RhdHMgUlNTSSBhbmQgTGluayBRdWFsaXR5CiAgICAgQ2FsY3VsYXRlIHRoZSBSU1NJIGF2ZXJhZ2UgYW5kIHNhdmUgaXQuIENvbnRpbnVvdXMgYXZlcmFnZSBpcyBkb25lLgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCAqcEZpcnN0RGF0YVBrdEFycml2ZWQgPT0gMCkKICAgIHsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucnNzaUF2ZyA9CiAgICAgICAgIFdMQU5IQUxfR0VUX1JTU0lfQVZFUkFHRSggcHZCREhlYWRlciApOwogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51TGlua1F1YWxpdHlBdmcgPSAKICAgICAgICBXTEFOSEFMX1JYX0JEX0dFVF9TTlIoIHB2QkRIZWFkZXIgKTsKCiAgICAgIC8vIFJjdmQgMXN0IHBrdCwgc3RhcnQgYXZlcmFnZSBmcm9tIG5leHQgdGltZQogICAgICAqcEZpcnN0RGF0YVBrdEFycml2ZWQgPSAxOwogICAgfQogICAgZWxzZQogICAgewogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5yc3NpQXZnID0KICAgICAgICAgIChXTEFOSEFMX0dFVF9SU1NJX0FWRVJBR0UoIHB2QkRIZWFkZXIgKSArIAogICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnJzc2lBdmcpLzI7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMaW5rUXVhbGl0eUF2ZyA9CiAgICAgICAgICAoV0xBTkhBTF9SWF9CRF9HRVRfU05SKCBwdkJESGVhZGVyICkgKyAgCiAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUxpbmtRdWFsaXR5QXZnKS8yOwogICAgfS8qRWxzZSwgZmlyc3QgZGF0YSBwYWNrZXQqLwogI2VuZGlmCiAgfS8qQlQtQU1QIGRhdGEgcGFja2V0Ki8KCiAgcmV0dXJuIFZPU19GQUxTRTsgCn0vKldMQU5UTF9Qcm9jZXNzQkFQRnJhbWUqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1Byb2Nlc3NGQ0ZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGluY29taW5nIEZsb3cgQ29udHJvbCBmcmFtZXMuIEVuYWJsZQogICAgb3IgZGlzYWJsZSBMV00gbW9kZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24uCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBGVyBzZW5kcyB1cCBzcGVjaWFsIGZsb3cgY29udHJvbCBmcmFtZS4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eCAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dAogICAgcHZCREhlYWRlcjogICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCiAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICBwdkJESGVhZGVyICAgICAgICAgICAgICBwb2ludGVyIHRvIEJEIGhlYWRlci4KCiAgICBJTi9PVVQKICAgIHBGaXJzdERhdGFQa3RBcnJpdmVkOiAgIHN0YXRpYyBmcm9tIGNhbGxlciBmdW5jdGlvbjsgdXNlZCBmb3IgcnNzaSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGF0aW9uCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBmcmFtZSBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKICAgIFRoZSBpbmdyZXNzIGFuZCBlZ3Jlc3Mgb2YgZWFjaCBzdGF0aW9uIHdpbGwgYmUgdXBkYXRlZC4gSWYgbmVlZGVkLCBMV00gbW9kZSB3aWxsCiAgICBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGJhc2VkIG9uIHRoZSBmbG93IGNvbnRyb2wgYWxnb3JpdGhtLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Qcm9jZXNzRkNGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICAgICAgcHZvc0RhdGFCdWZmLAogIHZfUFZPSURfdCAgICAgICAgIHB2QkRIZWFkZXIKKQp7CiNpZiAxIC8vZW5hYmxlIHByb2Nlc3Npbmcgb2Ygb25seSBmY1N0YVR4RGlzYWJsZWQgYml0bWFwIGZvciBub3cuIHRoZSBlbHNlIHBhcnQgaXMgb2xkIGJldHRlciBxb3MgY29kZS4KICAgICAgLy8gbmVlZCB0byByZXZpc2l0IHRoZSBvbGQgY29kZSBmb3IgZnVsbCBpbXBsZW1lbnRhdGlvbi4KICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkOwogIHZfVTE2X3QgICAgICAgICAgIHVjU3RhVmFsaWRCaXRtYXA7CiAgdl9VMTZfdCAgICAgICAgICAgdWNTdGFUeERpc2FibGVkQml0bWFwOwogIFdMQU5UTF9DYlR5cGUqICAgIHBUTENiID0gTlVMTDsKICAjaWZkZWYgVExfREVCVUdfRkMKICB2X1UzMl90ICAgICAgICAgICByeFRpbWVTdGFtcDsKICB2X1UzMl90ICAgICAgICAgICBjdXJUaWNrOwogICNlbmRpZgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgdWNTdGFWYWxpZEJpdG1hcCA9IFdEQV9HRVRfUlhfRkNfVkFMSURfU1RBX01BU0socHZCREhlYWRlcik7CiAgdWNTdGFUeERpc2FibGVkQml0bWFwID0gV0RBX0dFVF9SWF9GQ19TVEFfVFhfRElTQUJMRURfQklUTUFQKHB2QkRIZWFkZXIpOwojaWZkZWYgVExfREVCVUdfRkMKICByeFRpbWVTdGFtcCA9IFdEQV9HRVRfUlhfVElNRVNUQU1QKHB2QkRIZWFkZXIpOwogIC8qIGhhcmQgY29kZSBvZiBNVFVfR0xPQkFMX1RJTUVSX0FERFIgdG8gY2FsY3VsYXRlIHRoZSB0aW1lIGJldHdlZW4gZ2VuZXJhdGVkIGFuZCBwcm9jZXNzZWQgKi8KICB3cGFsUmVhZFJlZ2lzdGVyKDB4MDMwODE0MDArMHgxRDQsICZjdXJUaWNrKTsKCiAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIiVsZCAoJWxkLSVsZCk6IERpc2FibGVkICV4IFZhbGlkICV4IiwgY3VyVGljayA+IHJ4VGltZVN0YW1wID8gY3VyVGljayAtIHJ4VGltZVN0YW1wIDogcnhUaW1lU3RhbXAgLSAoMHhGRkZGRkZGRiAtIGN1clRpY2spLAogICAgY3VyVGljaywgcnhUaW1lU3RhbXAsICB1Y1N0YVR4RGlzYWJsZWRCaXRtYXAsIHVjU3RhVmFsaWRCaXRtYXApKTsKI2VuZGlmCiAgZm9yKHVjU1RBSWQgPSAwOyB1Y1N0YVZhbGlkQml0bWFwICE9IDA7IHVjU3RhVmFsaWRCaXRtYXAgPj49MSwgdWNTdGFUeERpc2FibGVkQml0bWFwID4+PSAxLCB1Y1NUQUlkICsrKQogIHsKICAgIGlmICggKDAgPT0gKHVjU3RhVmFsaWRCaXRtYXAgJiAweDEpKSB8fCAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gJiYgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzKSkgKQogICAgICAgIGNvbnRpbnVlOwoKICAgIGlmICh1Y1N0YVR4RGlzYWJsZWRCaXRtYXAgJiAweDEpCiAgICB7CiAgICAgIFdMQU5UTF9TdXNwZW5kRGF0YVR4KHB2b3NHQ3R4LCAmdWNTVEFJZCwgTlVMTCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIFdMQU5UTF9SZXN1bWVEYXRhVHgocHZvc0dDdHgsICZ1Y1NUQUlkKTsKICAgIH0KICB9CgojZWxzZQogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHRwSGFsRmNSeEJkICAgICAgICAgcHZGY1J4QmQgPSBOVUxMOwogIHZfVThfdCAgICAgICAgICAgICAgdWNCaXRDaGVjayA9IDB4MTsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU3RhVmFsaWQgPSAwOwogIHZfVThfdCAgICAgICAgICAgICAgdWNTVEFJZCA9IDA7CgogICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgICJSZWNlaXZlZCBGQyBSZXNwb25zZSIpOwogIGlmICggKE5VTEwgPT0gcFRMQ2IpIHx8IChOVUxMID09IHB2b3NEYXRhQnVmZikpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgcG9pbnRlciBpbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSggcHZvc0RhdGFCdWZmLCAwLCAodl9QVk9JRF90KSZwdkZjUnhCZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodEhhbEZjUnhCZCkpOwoKICBpZiAoIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSB8fCAoTlVMTCA9PSBwdkZjUnhCZCkgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOndyb25nIEZDIFJ4IHBhY2tldCIpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgCiAgLy8gbmVlZCB0byBzd2FwIGJ5dGVzIGluIHRoZSBGQyBjb250ZW50cy4gIAogIFdMQU5IQUxfU3dhcEZjUnhCZCgmcHZGY1J4QmQtPmZjU1RBVHhRTGVuWzBdKTsKCiAgLy9sb2dpYyB0byBlbmFibGUvZGlzYWJsZSBMV00gbW9kZSBmb3IgZWFjaCBzdGF0aW9uCiAgZm9yKCB1Y1N0YVZhbGlkID0gKHZfVThfdClwdkZjUnhCZC0+ZmNTVEFWYWxpZE1hc2s7IHVjU3RhVmFsaWQ7IHVjU3RhVmFsaWQgPj49IDEsIHVjQml0Q2hlY2sgPDw9IDEsIHVjU1RBSWQgKyspCiAgewogICAgaWYgKCAoMCA9PSAodWNTdGFWYWxpZCAmIDB4MSkpIHx8ICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjRXhpc3RzKSApCiAgICB7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmICggcHZGY1J4QmQtPmZjU1RBVGhyZXNoSW5kTWFzayAmIHVjQml0Q2hlY2sgKQogICAgewogICAgICAvL0xXTSBldmVudCBpcyByZXBvcnRlZCBieSBGVy4gQWJsZSB0byBmZXRjaCBtb3JlIHBhY2tldAogICAgICBpZiggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCApCiAgICAgIHsKICAgICAgICAvL05vdyBtZW1vcnkgdXNhZ2UgaXMgYmVsb3cgTFdNLiBTdGF0aW9uIGNhbiBzZW5kIG1vcmUgcGFja2V0cy4KICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bUV2ZW50UmVwb3J0ZWQgPSBUUlVFOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRlcgcmVwb3J0IExXTSBldmVudCBidXQgdGhlIHN0YXRpb24gJWQgaXMgbm90IGluIExXTSBtb2RlIiwgdWNTVEFJZCkpOwogICAgICB9CiAgICB9CgogICAgLy9jYWxjdWxhdGUgdUVncmVzc19sZW5ndGgvdUluZ3Jlc3NfbGVuZ3RoIG9ubHkgYWZ0ZXIgcmVjZWl2aW5nIGVub3VnaCBwYWNrZXRzCiAgICBpZiAoV0xBTlRMX0xXTV9JTkdSRVNTX1NBTVBMRV9USFJFU0hPTEQgPD0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoKQogICAgewogICAgICAvL2NoZWNrIG1lbW9yeSB1c2FnZSBpbmZvIHRvIHNlZSB3aGV0aGVyIExXTSBtb2RlIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGUgc3RhdGlvbgogICAgICB2X1UzMl90IHVFZ3Jlc3NfbGVuZ3RoID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoICsgCiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYm11TWVtQ29uc3VtZWQgLSBwdkZjUnhCZC0+ZmNTVEFUeFFMZW5bdWNTVEFJZF07CgogICAgICAvL2lmICgoZmxvYXQpdUVncmVzc19sZW5ndGgvKGZsb2F0KXBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCAKICAgICAgLy8gICAgICA8PSBXTEFOVExfTFdNX0VHUkVTU19JTkdSRVNTX1RIUkVTSE9MRCkKICAgICAgaWYgKCAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoID4gdUVncmVzc19sZW5ndGgpICYmCiAgICAgICAgICAgKChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggLSB1RWdyZXNzX2xlbmd0aCApID49IAogICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoID4+IDIpKQogICAgICAgICApCiAgICAgIHsgICAKICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpFbmFibGUgTFdNIG1vZGUgZm9yIHN0YXRpb24gJWQiLCB1Y1NUQUlkKSk7CiAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQgPSBUUlVFOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGlmKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkICkKICAgICAgICB7CiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkRpc2FibGUgTFdNIG1vZGUgZm9yIHN0YXRpb24gJWQiLCB1Y1NUQUlkKSk7CiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkID0gRkFMU0U7CiAgICAgICAgfQoKICAgICAgfQoKICAgICAgLy9yZW1lbWJlciBtZW1vcnkgdXNhZ2UgaW4gRlcgc3RhcnRpbmcgZnJvbSB0aGlzIHJvdW5kCiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkID0gcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOwogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggPSAwOwogICAgfSAvLyhXTEFOVExfTFdNX0lOR1JFU1NfU0FNUExFX1RIUkVTSE9MRCA8PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGgpCgogICAgaWYoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQgKQogICAgewogICAgICAvL2Fsd2F5cyB1cGRhdGUgY3VycmVudCBtYXhpbXVtIGFsbG93ZWQgbWVtZW9yeSB1c2FnZQogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51QnVmZlRocmVzaG9sZE1heCA9ICBXTEFOVExfU1RBX0JNVV9USFJFU0hPTERfTUFYIC0KICAgICAgICBwdkZjUnhCZC0+ZmNTVEFUeFFMZW5bdWNTVEFJZF07CiAgICB9CgogIH0KI2VuZGlmCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8qKgogKiBXTEFOVExfRmxvd0NvbnRyb2woKSAtIFRYIEZsb3cgY29udHJvbAogKiBAcFRMQ2I6IFRMIGNvbnRleHQgcG9pbnRlcgogKiBAcHZvc0RhdGFCdWZmOiBGaXJtd2FyZSBpbmRpY2F0aW9uIGRhdGEgYnVmZmVyCiAqCiAqIFRoaXMgZnVuY3Rpb24gaW1wbGVuZXRzIHRoZSBhbGdvcml0aG0gdG8gZmxvdyBjb250cm9sIFRYIHRyYWZmaWMgaW4gIGNhc2UKICogb2YgU0FQIGFuZCBTQVAgKyBTVEEgY29uY3VycmVuY3kuCiAqCiAqIEFsZ29yaXRobSBnb2FsIGlzIHRvIGZldGNoIG1vcmUgcGFja2V0cyBmcm9tIGdvb2QgcGVlciB0aGFuIGJhZCBwZWVyIGJ5CiAqIGludHJvZHVjaW5nIHdlaWdodHMgZm9yIGVhY2ggc3RhdGlvbiBjb25uZWN0ZWQuIFdlaWdodCBvZiBlYWNoIHN0YXRpb24gaXMKICogY2FsY3V0YXRlZCBieSB0YWtpbmcgcmF0aW8gb2YgbWF4IFJBIHJhdGUgb2YgdGhlIHBlZXJzIHRvIGl0cyByYXRlLiBJZiB0aGUKICogcmF0aW8gaXMgbGVzcyB0aGFuIHR3byBiYXNlZCBvbiBudW1iZXIgb2YgcXVldWVkIGZyYW1lcyBpbiB0aGUgc3RhdGlvbiBCVFFNCiAqIHdlaWdodCBpcyBtb2RpZmllZC4gSWYgdGhlIHF1ZXVlZCBmcmFtZXMgcmVhY2hlcyB0aGUgZGVmaW5lZCB0aHJlc2hvbGQgd2VpZ2h0CiAqIGlzIGFzc2lnbmVkIGFzIGZvdXIuIEhlcmUgd2VpZ2h0IGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZgogKiBwYWNrZXRzIGZldGNoLgogKgogKiBSZXR1cm4gdHJ1ZSBpZiBmbG93IGNvbnRyb2xsZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLgogKi8Kc3RhdGljIGJvb2wgV0xBTlRMX0Zsb3dDb250cm9sKFdMQU5UTF9DYlR5cGUqIHBUTENiLCB2b3NfcGt0X3QqIHB2b3NEYXRhQnVmZikKewogICBXTEFOVExfRmxvd0NvbnRyb2xJbmZvICpmY19kYXRhID0gTlVMTDsKICAgV0xBTlRMX1BlclN0YUZsb3dDb250cm9sUGFyYW0gKnN0YV9mY19wYXJhbXMgPSBOVUxMOwogICB1aW50OF90IG51bV9zdGFzOwogICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKICAgdWludDE2X3QgZGF0YV9sZW47CiAgIHVpbnQ4X3QgKnN0YWlkOwogICB1aW50MTZfdCBtYXhfcmF0ZSA9IDA7CiAgIHVpbnQ4X3QgaTsKCiAgIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgocHZvc0RhdGFCdWZmLCAmZGF0YV9sZW4pOwogICBpZiAoIWRhdGFfbGVuKSB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiJXM6IE51bGwgZncgaW5kaWNhdGlvbiBkYXRhIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICB9CgogICB2b3NfcGt0X2dldF9vc19wYWNrZXQocHZvc0RhdGFCdWZmLCAodl9WT0lEX3QgKiopJnNrYiwgMCk7CiAgIGZjX2RhdGEgPSAoV0xBTlRMX0Zsb3dDb250cm9sSW5mbyAqKXNrYi0+ZGF0YTsKICAgbnVtX3N0YXMgPSBmY19kYXRhLT5udW1fc3RhczsKICAgaWYgKCFudW1fc3RhcykgewogICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgIiVzOiBObyBjb25uZWN0ZWQgc3RhdGlvbnMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgfQoKICAgLyogU2tpcCBmbG93IGNvbnRyb2wgZm9yIG9uZSBjb25uZWN0ZWQgc3RhdGlvbiAqLwogICBpZiAoMSA9PSBudW1fc3RhcykKICAgICAgcmV0dXJuIHRydWU7CgogICBzdGFpZCA9ICh1aW50OF90ICopdm9zX21lbV9tYWxsb2MoV0xBTl9NQVhfU1RBX0NPVU5UKTsKICAgaWYgKCFzdGFpZCkgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIiVzOiBtZW0gYWxsb2NhdGlvbiBmYWlsdXJlIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHZvc19tZW1fc2V0KCh1aW50OF90ICopc3RhaWQsIFdMQU5fTUFYX1NUQV9DT1VOVCwgMCk7CgogICBzdGFfZmNfcGFyYW1zID0gKFdMQU5UTF9QZXJTdGFGbG93Q29udHJvbFBhcmFtICopKCZmY19kYXRhLT5udW1fc3RhcyArIDEpOwoKICAgZm9yKGkgPSAwOyBpIDwgbnVtX3N0YXM7IGkgKyssIHN0YV9mY19wYXJhbXMgKyspIHsKICAgICAgc3RhaWRbaV0gPSBzdGFfZmNfcGFyYW1zLT5zdGFfaWQ7CgogICAgICBpZiAoIXBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXSkKICAgICAgICAgY29udGludWU7CgogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnBlciA9IHN0YV9mY19wYXJhbXMtPmF2Z19wZXI7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+cXVldWUgPSBzdGFfZmNfcGFyYW1zLT5xdWV1ZV9sZW47CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+dHJhdGUgPSBzdGFfZmNfcGFyYW1zLT5yYXRlOwogICAgICBtYXhfcmF0ZSA9IG1heF9yYXRlID4gcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT50cmF0ZSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcmF0ZSA6IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+dHJhdGU7CgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgIiVzOiBzdGFfaWQ6JWQgaW46JWQgcXVldWU6JWQgYXZnX3BlcjolZCByYXRlOiVkIiwgX19mdW5jX18sCiAgICAgICAgICBzdGFpZFtpXSwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT50eF9zYW1wbGVzX3N1bSwKICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+cXVldWUsCiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnBlciwKICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+dHJhdGUpKTsKICAgfQoKICAgZm9yIChpID0gMDsgaSA8IG51bV9zdGFzOyBpKyspIHsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT53ZWlnaHQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9yYXRlL3BUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+dHJhdGU7CiAgICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPndlaWdodCA+PQogICAgICAgICAgV0xBTlRMX1JBVEVfUkFUSU9fVEhSRVNIT0xEKSB7CiAgICAgICAgIGlmICghcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT5zZXRfZmxhZykgewogICAgICAgICAgICB2b3Nfc2V0X2hkZF9iYWRfc3RhKHN0YWlkW2ldKTsKICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT5zZXRfZmxhZyA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgLyoqCiAgICAgICAgICAqIElmIHN0YXRpb24ncyBsaW5rIGJlY29tZXMgdmVyeSBiYWQgcnNzaSBiZWxvdyAtOTBkYm0gdGhlbiBiZWNhdXNlCiAgICAgICAgICAqIG9mIGhpZ2ggUEVSIHJhdGUgaGlnaCBudW1iZXIgb2YgcGFja2V0cyBhcmUgc3R1Y2sgaW4gQlRRTSB3aGljaCBpcwogICAgICAgICAgKiBhZmZlY3RpbmcgdGhlIGdvb2QgcGVlcnMgdGhyb3VnaHB1dC4gU28gdGhyb3R0bGUgZnVydGhlciB0aGUgYmFkCiAgICAgICAgICAqIGxpbmsgdHJhZmZpYy4KICAgICAgICAgICovCiAgICAgICAgIGlmICgocFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT53ZWlnaHQgPgogICAgICAgICAgICAgIFdMQU5UTF9XRUlHSFRfVEhSRVNIT0xEKSAmJgogICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+cXVldWUgPgogICAgICAgICAgICAgIFdMQU5UTF9RVUVVRV9USFJFU0hPTEQpKQogICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPndlaWdodCAqPSAyOwogICAgICB9CiAgICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPndlaWdodCA8CiAgICAgICAgICBXTEFOVExfUkFURV9SQVRJT19USFJFU0hPTEQpIHsKICAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+cGVyID49IFdMQU5UTF9QRVJfVEhSRVNIT0xEICYmCiAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnF1ZXVlID4gV0xBTlRMX1FVRVVFX1RIUkVTSE9MRAogICAgICAgICAgICAgJiYgIXBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+c2V0X2ZsYWcpIHsKICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT53ZWlnaHQgKj0gMjsKICAgICAgICAgICAgdm9zX3NldF9oZGRfYmFkX3N0YShzdGFpZFtpXSk7CiAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+c2V0X2ZsYWcgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+c2V0X2ZsYWcpIHsKICAgICAgICAgICAgdm9zX3Jlc2V0X2hkZF9iYWRfc3RhKHN0YWlkW2ldKTsKICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT5zZXRfZmxhZyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgIH0KICAgfQogICB2b3NfbWVtX2ZyZWUoc3RhaWQpOwogICByZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFdMQU5UTF9DYWNoZUVhcG9sKCkgLSBjYWNoZSBlYXBvbCBmcmFtZXMKICogQHBUTENiIDogcG9pbnRlciB0byBUTCBjb250ZXh0CiAqIEB2b3NUZW1wQnVmZjogcG9pbnRlciB0byB2b3MgcGFja2V0IGJ1ZmYKICoKICogUmV0dXJuOiBOb25lCiAqCiAqLwpzdGF0aWMgdm9pZCBXTEFOVExfQ2FjaGVFYXBvbChXTEFOVExfQ2JUeXBlKiBwVExDYiwgdm9zX3BrdF90KiB2b3NUZW1wQnVmZikKewogICBpZiAoKE5VTEwgPT0gcFRMQ2IpIHx8IChOVUxMID09IHZvc1RlbXBCdWZmKSkKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICIlczogSW52YWxpZCBpbnB1dCBwb2ludGVyIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuOwogICB9CgogICBpZiAoTlVMTCA9PSBwVExDYi0+dm9zRWFwb2xDYWNoZWRGcmFtZSkgewogICAgICBUTExPRzEoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIiVzOiBDYWNoZSBFYXBvbCBmcmFtZSIsIF9fZnVuY19fKSk7CiAgICAgIHBUTENiLT52b3NFYXBvbENhY2hlZEZyYW1lID0gdm9zVGVtcEJ1ZmY7CiAgIH0KICAgZWxzZSB7CiAgICAgIFRMTE9HMShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiJXM6IERyb3AgZHVwbGljYXRlIEVBUE9MIGZyYW1lIiwgX19mdW5jX18pKTsKICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgfQp9CgovKioKICogV0xBTlRMX1NhbXBsZVJ4UlNTSSgpIC0gQ29sbGVjdCBSWCByc3NpIHNhbXBsZXMKICogQHBUTENiOiBUTCBjb250ZXh0IHBvaW50ZXIKICogQHBCREhlYWRlcjogUlggTWV0YSBkYXRhIHBvaW50ZXIKICogQHN0YV9pZDogU3RhdGlvbiBJRAogKgogKiBUaGlzIGZ1bmN0aW9uIHJlY29yZHMgdGhlIGxhc3QgdHdlbnR5IFJYIFJTU0kgc2FtcGxlcwogKgogKiBSZXR1cm46IHZvaWQKICovCnN0YXRpYyB2b2lkIFdMQU5UTF9TYW1wbGVSeFJTU0koV0xBTlRMX0NiVHlwZSogcFRMQ2IsIHZvaWQgKiBwQkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGFfaWQpCnsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUgKnBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFfaWRdOwogICB1aW50OF90IGNvdW50ID0gcENsaWVudFNUQS0+cnNzaV9zYW1wbGVfY250OwogICB1aW50OF90IG9sZF9pZHggPSBwQ2xpZW50U1RBLT5yc3NpX3N0YWxlX2lkeDsKICAgczggY3Vycl9SU1NJLCBjdXJyX1JTU0kwLCBjdXJyX1JTU0kxOwoKICAgY3Vycl9SU1NJMCA9IFdMQU5UTF9HRVRSU1NJMChwQkRIZWFkZXIpOwogICBjdXJyX1JTU0kxID0gV0xBTlRMX0dFVFJTU0kxKHBCREhlYWRlcik7CgogICBjdXJyX1JTU0kgID0gKGN1cnJfUlNTSTAgPiBjdXJyX1JTU0kxKSA/IGN1cnJfUlNTSTAgOiBjdXJyX1JTU0kxOwoKICAgaWYgKGNvdW50ID49IFdMQU5UTF9SU1NJX1NBTVBMRV9DTlQpIHsKICAgICAgcENsaWVudFNUQS0+cnNzaV9zYW1wbGVfc3VtIC09IHBDbGllbnRTVEEtPnJzc2lfc2FtcGxlW29sZF9pZHhdOwogICAgICBwQ2xpZW50U1RBLT5yc3NpX3NhbXBsZVtvbGRfaWR4XSA9IGN1cnJfUlNTSTsKICAgICAgcENsaWVudFNUQS0+cnNzaV9zYW1wbGVfc3VtICs9IHBDbGllbnRTVEEtPnJzc2lfc2FtcGxlW29sZF9pZHhdOwogICAgICBvbGRfaWR4ID49IFdMQU5UTF9SU1NJX1NBTVBMRV9DTlQgPyBvbGRfaWR4ID0gMCA6IG9sZF9pZHgrKzsKICAgICAgcENsaWVudFNUQS0+cnNzaV9zdGFsZV9pZHggPSBvbGRfaWR4OwogICB9IGVsc2UgewogICAgICBwQ2xpZW50U1RBLT5yc3NpX3NhbXBsZVtjb3VudF0gPSBjdXJyX1JTU0k7CiAgICAgIHBDbGllbnRTVEEtPnJzc2lfc2FtcGxlX3N1bSArPSBwQ2xpZW50U1RBLT5yc3NpX3NhbXBsZVtjb3VudF07CiAgICAgIHBDbGllbnRTVEEtPnJzc2lfc2FtcGxlX2NudCsrOwogICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1J4RnJhbWVzCgogIERFU0NSSVBUSU9OCiAgICBDYWxsYmFjayByZWdpc3RlcmVkIGJ5IFRMIGFuZCBjYWxsZWQgYnkgQkFMIHdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQKICAgIG92ZXIgdGhlIGJ1cy4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uIFRMIHdpbGwgbWFrZSB0aGUgbmVjZXNzYXJ5CiAgICBkZWNpc2lvbiB3aXRoIHJlZ2FyZHMgdG8gdGhlIGZvcndhcmRpbmcgb3IgcXVldWluZyBvZiB0aGlzIHBhY2tldCBhbmQKICAgIHRoZSBsYXllciBpdCBuZWVkcyB0byBiZSBkZWxpdmVyZWQgdG8uCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBJZiB0aGUgZnJhbWUgY2FycmllZCBpcyBhIGRhdGEgZnJhbWUgdGhlbiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggaXQgaXMKICAgIGRlc3RpbmVkIHRvIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIFRMLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBCQUwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciByZWNlaXZlZCwKICAgICAgICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBtb3JlIHRoZW4gb25lIHBhY2tldCB0aGV5IHdpbGwgYmUgY2hhaW5lZAogICAgICAgICAgICAgICAgICAgIHVzaW5nIHZPU1MgYnVmZmVycy4KCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1J4RnJhbWVzCigKICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QgICAgICpwRnJhbWVEYXRhQnVmZgopCnsKICB2b3NfcGt0X3QqICAgICAgICAgIHZvc0RhdGFCdWZmID0gKHZvc19wa3RfdCopcEZyYW1lRGF0YUJ1ZmY7CiAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIFdMQU5UTF9TVEFGdW5jVHlwZSAgcGZuU1RBRnNtOwogIHZvc19wa3RfdCogICAgICAgICAgdm9zVGVtcEJ1ZmY7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHZfVThfdCAgICAgICAgICAgICAgdWNGcm1UeXBlOwogIHZfUFZPSURfdCAgICAgICAgICAgcHZCREhlYWRlciA9IE5VTEw7CiAgV0xBTlRMX1NUQUV2ZW50VHlwZSB3U1RBRXZlbnQgID0gV0xBTlRMX1JYX0VWRU5UOwogIHZfVThfdCAgICAgICAgICAgICAgdWNUaWQgICAgICA9IDA7CiAgdl9CT09MX3QgICAgICAgICAgICBicm9hZGNhc3QgID0gVk9TX0ZBTFNFOwogIHZfQk9PTF90ICAgICAgICAgICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfRkFMU0U7CiAgc3RhdGljIHZfVThfdCAgICAgICBmaXJzdF9kYXRhX3BrdF9hcnJpdmVkOwogIHZfVTMyX3QgICAgICAgICAgICAgdURQVVNpZzsgCiAgdl9VMTZfdCAgICAgICAgICAgICB1c1BrdExlbjsKICB2X0JPT0xfdCAgICAgICAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMgPSBWT1NfRkFMU0U7CiNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUwogIHZfUzdfdCAgICAgICAgICAgICAgY3VycmVudEF2Z1JTU0kgPSAwOwogIHZfVThfdCAgICAgICAgICAgICAgYWM7CiNlbmRpZgogIHVpbnQ4X3QgICAgICAgICAgICB1Y01QRFVITGVuOwogIHVpbnQxNl90ICAgICAgICAgICBzZXFfbm87CiAgdWludDE2X3QgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpUTCBSZWNlaXZlIEZyYW1lcyBjYWxsZWQiKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHZvc0RhdGFCdWZmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1J4RnJhbWVzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgUG9wb2xhdXRlIHRpbWVzdGFtcCBhcyB0aGUgdGltZSB3aGVuIHBhY2tldCBhcnJpdmVzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgdm9zRGF0YUJ1ZmYtPnRpbWVzdGFtcCA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgaW5pdGlhbCBidWZmZXIgLSB0aGlzIGlzIHRoZSBmaXJzdCByZWNlaXZlZCBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwoKICB3aGlsZSAoTlVMTCAhPSB2b3NEYXRhQnVmZikKICB7CiAgICBicm9hZGNhc3QgPSBWT1NfRkFMU0U7CiAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsgCgogICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NEYXRhQnVmZiwgMS8qdHJ1ZSovICk7CgogICAgaWYoIHZvc19nZXRfY29ucGFyYW0oKSA9PSBWT1NfTU9OSVRPUl9NT0RFICkKICAgICAgewogICAgICAgICBpZiggcFRMQ2ItPmlzQ29udmVyc2lvblJlcSApCiAgICAgICAgICAgIFdMQU5UTF9Nb25UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlcih2b3NUZW1wQnVmZiwgcFRMQ2IpOwoKICAgICAgICAgcFRMQ2ItPnBmbk1vblJ4KHB2b3NHQ3R4LCB2b3NUZW1wQnVmZiwgcFRMQ2ItPmlzQ29udmVyc2lvblJlcSk7CiAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgUGVlayBhdCBCRCBoZWFkZXIgLSBkbyBub3QgcmVtb3ZlCiAgICAgICEhISBPcHRpbWl6ZSBtZTogb25seSBwYXJ0IG9mIGhlYWRlciBpcyBuZWVkZWQ7IG5vdCBlbnRpcmUgb25lCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKCB2b3NUZW1wQnVmZiwgKHZfUFZPSURfdCkmcHZCREhlYWRlciwgMS8qU3dhcCBCRCovICk7CgogICAgaWYgKCBOVUxMID09IHB2QkRIZWFkZXIgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGV4dHJhY3QgQkQgaGVhZGVyIikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDaGVjayBpZiBGQyBmcmFtZSByZXBvcnRlZCBmcm9tIEZXCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYoV0RBX0lTX1JYX0ZDKHB2QkRIZWFkZXIpKQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOnJlY2VpdmUgb25lIEZDIGZyYW1lIikpOwoKICAgICAgV0xBTlRMX0Zsb3dDb250cm9sKHBUTENiLCB2b3NUZW1wQnVmZik7CgogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICAvKiBBTVNEVSBIVyBidWcgZml4CiAgICAgKiBBZnRlciAybmQgQU1TRFUgc3ViZnJhbWUgSFcgY291bGQgbm90IGhhbmRsZSBCRCBjb3JyZWN0bHkKICAgICAqIEhBTCB3b3JrYXJvdW5kIGlzIG5lZWRlZCAqLwogICAgaWYoV0RBX0dFVF9SWF9BU0YocHZCREhlYWRlcikpCiAgICB7CiAgICAgIFdEQV9EU19SeEFtc2R1QmRGaXgocHZvc0dDdHgsIHB2QkRIZWFkZXIpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIEV4dHJhY3QgZnJhbWUgY29udHJvbCBmaWVsZCBmcm9tIDgwMi4xMSBoZWFkZXIgaWYgcHJlc2VudCAKICAgICAgKGZyYW1lIHRyYW5zbGF0aW9uIG5vdCBkb25lKSAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgdm9zU3RhdHVzID0gV0RBX0RTX0dldEZyYW1lVHlwZVN1YlR5cGUoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsICZ1Y0ZybVR5cGUgKTsKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEZyYW1lIENvbnRyb2wgRmllbGQiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgodm9zVGVtcEJ1ZmYsICZ1c1BrdExlbik7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgbWFuYWdlbWVudCBhbmQgc2VuZCB0byBQRQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoIFdMQU5UTF9JU19NR01UX0ZSQU1FKHVjRnJtVHlwZSkpCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6U2VuZGluZyBwYWNrZXQgdG8gbWFuYWdlbWVudCBjbGllbnQiKSk7CiAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19wa3RfZmxhdHRlbl9yeF9wa3QoJnZvc1RlbXBCdWZmKSkKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBmbGF0dGVuIHBhY2tldCAtIGRyb3BwaW5nIikpOwogICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHVjU1RBSWQgPSAodl9VOF90KVdEQV9HRVRfUlhfU1RBSUQoIHB2QkRIZWFkZXIgKTsKICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KICAgICAgaWYoIVdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkKICAgICAgewojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAgICAgIC8qIFJlYWQgUlNTSSBhbmQgdXBkYXRlICovCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0hTSGFuZGxlUlhGcmFtZShwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NR01UX0ZSQU1FX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwojZWxzZQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkUlNTSShwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCk7CiNlbmRpZgogICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhbmRsZSBSWCBNYW5hZ2VtZW50IEZyYW1lIGZhaWwgd2l0aGluIEhhbmRvZmYgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCBtb2R1bGUiKSk7CiAgICAgICAgICAvKiBEbyBOb3QgRHJvcCBwYWNrZXQgYXQgaGVyZQogICAgICAgICAgICogUmV2aXNpdCB3aHkgSE8gbW9kdWxlIHJldHVybiBmYWlsCiAgICAgICAgICAgKiAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgKiAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgKiAgIGNvbnRpbnVlOwogICAgICAgICAgICovCiAgICAgICAgfQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkU05SKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKCiAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIkZhaWxlZCB0byBSZWFkIFNOUiIpKSk7CiAgICAgICAgfQojaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICAgICAgaWYgKCBOVUxMICE9IHBDbGllbnRTVEEpCiAgICAgICAgewogICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5tZ210UngrKzsKICAgICAgICB9CiNlbmRpZgoKICAgICAgICBXTEFOVExfU2FtcGxlUnhSU1NJKHBUTENiLCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKCiAgICAgIH0KCiAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUngoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZik7IAogICAgfQogICAgZWxzZSAvKiBEYXRhIEZyYW1lICovCiAgICB7CiAgICAgIHVjU1RBSWQgPSAodl9VOF90KVdEQV9HRVRfUlhfU1RBSUQoIHB2QkRIZWFkZXIgKTsKICAgICAgdWNUaWQgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoIHB2QkRIZWFkZXIgKTsKICAgICAgdURQVVNpZyA9IFdEQV9HRVRfUlhfRFBVU0lHKHB2QkRIZWFkZXIpOwogICAgICB1Y01QRFVITGVuID0gKHVpbnQ4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocHZCREhlYWRlcik7CiAgICAgIHNlcV9ubyA9ICh1aW50MTZfdClXREFfR0VUX1JYX1JFT1JERVJfQ1VSX1BLVF9TRVFfTk8ocHZCREhlYWRlcik7CgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkRhdGEgcGFja2V0IHJlY2VpdmVkIGZvciBTVEEgJWQiLCB1Y1NUQUlkKSk7CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIFRoaXMgc2hvdWxkIGJlIGNvcnJlY3RlZCB3aGVuIG11bHRpcGUgc3RhIHN1cHBvcnQgaXMgYWRkZWQgISEhCiAgICAgICAgZm9yIG5vdyBiY2FzdCBmcmFtZXMgd2lsbCBiZSBzZW50IHRvIHRoZSBsYXN0IHJlZ2lzdGVyZWQgU1RBCiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBpZiAoIFdEQV9JU19SWF9CQ0FTVChwdkJESGVhZGVyKSkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6VEwgcnggQmNhc3QgZnJhbWUgLSBzZW5kaW5nIHRvIGxhc3QgcmVnaXN0ZXJlZCBzdGF0aW9uIikpOwogICAgICAgIGJyb2FkY2FzdCA9IFZPU19UUlVFOwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgSWYgQWRkcjEgaXMgYi9tY2FzdCwgYnV0IEFkZHIzIGlzIG91ciBvd24gc2VsZiBNQUMsIGl0IGlzIGEgYi9tY2FzdAogICAgICAgICAgcGt0IHdlIHNlbnQgIGxvb3BpbmcgYmFjayB0byB1cy4gVG8gYmUgZHJvcHBlZCBpZiB3ZSBhcmUgbm9uIEJUQU1QICAKICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogICAgICAgIGlmKCBXTEFOSEFMX1JYX0JEX0FERFIzX1NFTEZfSURYID09IAogICAgICAgICAgICAodl9VOF90KVdEQV9HRVRfUlhfQUREUjNfSURYKCBwdkJESGVhZGVyICkpIAogICAgICAgIHsKICAgICAgICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX1RSVUU7IAogICAgICAgIH0KICAgICAgfS8qaWYgYmNhc3QqLwoKICAgICAgLyogUHJlIGFzc29jIGNhY2hlIGVhcG9sICovCiAgICAgIGlmIChwVExDYi0+cHJlYXNzb2NfY2FjaGluZykKICAgICAgewogICAgICAgICBXTEFOVExfR2V0RXRoZXJUeXBlKHB2QkRIZWFkZXIsdm9zVGVtcEJ1ZmYsIHVjTVBEVUhMZW4sICZ1c0V0aGVyVHlwZSk7CiAgICAgICAgIGlmIChXTEFOVExfTExDXzgwMjFYX1RZUEUgIT0gdXNFdGhlclR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBSWCBGcmFtZSBub3QgRUFQT0wgRXRoZXJUeXBlICVkIiwKICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB1c0V0aGVyVHlwZSk7CiAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgIFdMQU5UTF9DYWNoZUVhcG9sKHBUTENiLCB2b3NUZW1wQnVmZik7CiAgICAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgcHJlYXNzb2NfY2FjaGluZyBpcyBlbmFibGVkIHNlcSBObzogJWQiLCBzZXFfbm8pKTsKICAgICAgICAgfQoKICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGlmIChXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNTVEFJZCkpCiAgICAgIHsKICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlNUQUlkICVkLiBJbnZhbGlkIFNUQSBJRCBkcm9wcGluZyBwa3QiLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpOwogICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBpZiAoV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkpIHsKICAgICAgICAgLyogVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBBUCB1c2VzIHdyb25nIFRJRC4gSW4gdGhhdCBjYXNlIHRvIGF2b2lkCiAgICAgICAgICAgIGRyb3BwaW5nIEVBUE9MIHBhY2tldCBpbiB0aGUgZHJpdmVyIHVzZSBUSUQgdG8gemVyby4qLwogICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUaWQ6ICVkIEZyYW1lIHR5cGU6ICVkIiwgdWNUaWQsIHVjRnJtVHlwZSk7CiAgICAgICAgIFdEQV9HRVRfUlhfVElEKCBwdkJESGVhZGVyICkgPSAwOwogICAgICAgICB1Y1RpZCA9IDA7CiAgICAgIH0KCiNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUwogICAgICBhYyA9IFdMQU5UTF9USURfMl9BQ1t1Y1RpZF07CiNlbmRpZgoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgTm8gbmVlZCB0byBsb2NrIGNhY2hlIGFjY2VzcyBiZWNhdXNlIGNhY2hlIG1hbmlwdWxhdGlvbiBvbmx5IGhhcHBlbnMKICAgICAgICBpbiB0aGUgdHJhbnNwb3J0IHRocmVhZC90YXNrIGNvbnRleHQKICAgICAgICAtIFRoZXNlIGZyYW1lcyBhcmUgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBzdGF0aW9uIHVwb24gcmVnaXN0cmF0aW9uCiAgICAgICAgICB3aGljaCBoYXBwZW5zIGluIHRoZSBtYWluIHRocmVhZCBjb250ZXh0CiAgICAgICAgICBUaGUgY2FjaGluZyBoZXJlIGNhbiBoYXBwZW4gaW4gZWl0aGVyIFR4IG9yIFJ4IHRocmVhZCBkZXBlbmRpbmcKICAgICAgICAgIG9uIHRoZSBjdXJyZW50IFNTQyBzY2hlZHVsaW5nCiAgICAgICAgLSBhbHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZyYW1lcyBpbiB0aGUgY2FjaGUgYXJlIGZ3ZC1lZCB0bwogICAgICAgICAgdGhlIHN0YXRpb24gYmVmb3JlIHRoZSBuZXcgaW5jb21pbmcgb25lcyAKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICAgIGlmIChOVUxMID09IHBDbGllbnRTVEEpCiAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6U1RBIG5vdCBhbGxvY2F0ZWQgbWVtb3J5LiBEcm9wcGluZyBwYWNrZXQiKSk7CiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAgICAgaWYgKCggcENsaWVudFNUQS0+dWNFeGlzdHMgKSAmJgogICAgICAgICAgIChXTEFOX1NUQV9URExTID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAgICAgIChwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkKSkKICAgICAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNUeFN1c3BlbmRlZCwgMCApOwogICAgICBlbHNlIGlmICggIWJyb2FkY2FzdCAmJiAocENsaWVudFNUQS0+dWNFeGlzdHMgPT0gMCApICkKICAgICAgewogICAgICAgICAgdHBTaXJNYWNNZ210SGRyIHBNYWNIZWFkZXIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIoIHB2QkRIZWFkZXIgKTsKCiAgICAgICAgICAvKiBmcm9tIHRoZSBkaXJlY3QgcGVlciB3aGlsZSBpdCBpcyBub3QgcmVnaXN0ZXJlZCB0byBUTCB5ZXQgKi8KICAgICAgICAgIGlmICggKHBNYWNIZWFkZXItPmZjLmZyb21EUyA9PSAwKSAmJgogICAgICAgICAgICAgICAocE1hY0hlYWRlci0+ZmMudG9EUyA9PSAwKSApCiAgICAgICAgICB7CiAgICAgICAgICAgICAgdl9VOF90IHVjQWRkcjNTVEFJZDsKCiAgICAgICAgICAgICAgdWNBZGRyM1NUQUlkID0gV0RBX0dFVF9SWF9BRERSM19JRFgocHZCREhlYWRlcik7CgogICAgICAgICAgICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjQWRkcjNTVEFJZCkgKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTVEEgSUQgJWQgaW52YWxpZCAtIGRyb3BwaW5nIHBrdCIsIHVjQWRkcjNTVEFJZCkpOwogICAgICAgICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAoIShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdICYmIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPnVjRXhpc3RzICYmCiAgICAgICAgICAgICAgICAgIChXTEFOX1NUQV9JTkZSQSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdLT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgICAgICAgICAgICAgKFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdLT50bFN0YXRlKSkpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzdGFJZCAlZCBhZGRyM0lkICVkIHRsU3RhdGUgJWQuIFVua293biBSZWNlaXZlci9UcmFuc21pdHRlciBEcm9wcGluZyBwYWNrZXQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBZGRyM1NUQUlkLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdLT50bFN0YXRlKSk7CiAgICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzdGFJZCAlZCBkb2Vzbid0IGV4aXN0LCBidXQgbWFwcGVkIHRvIEFQIHN0YUlkICVkIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHVjQWRkcjNTVEFJZCkpOwogICAgICAgICAgICAgICAgICB1Y1NUQUlkID0gdWNBZGRyM1NUQUlkOwogICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNBZGRyM1NUQUlkXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KI2VuZGlmCgogICAgICBpZiAoKCBwQ2xpZW50U1RBLT5lbmFibGVDYWNoaW5nID09IDEgKSAmJgogICAgICAgICAgICAvKkRvbnQgYnVmZmVyIEJyb2FkY2FzdC9NdWx0aWNhc3QgZnJhbWVzLiBJZiBBUCB0cmFuc21pdHMgYnVyc3RzIG9mIEJyb2FkY2FzdC9NdWx0aWNhc3QgZGF0YSBmcmFtZXMsIAogICAgICAgICAgICAgKiBsaWJyYSBidWZmZXJzIGFsbCBCcm9hZGNhc3QvTXVsdGljYXN0IHBhY2tldHMgYWZ0ZXIgYXV0aGVudGljYXRpb24gd2l0aCBBUCwgCiAgICAgICAgICAgICAqIFNvIGl0IHdpbGwgbGVhZCB0byBsb3cgcmVzb3VyY2UgY29uZGl0aW9uIGluIFJ4IERhdGEgUGF0aC4qLwogICAgICAgICAgKCBXREFfSVNfUlhfQkNBU1QocHZCREhlYWRlcikgPT0gMCApKQogICAgICB7CiAgICAgICAgaWYoIFdEQV9Jc1NlbGZTVEEocHZvc0dDdHgsdWNTVEFJZCkpCiAgICAgICAgewogICAgICAgICAgIC8vZHJvcCBwYWNrZXQgZm9yIFNlbGYgU1RBIGluZGV4CiAgICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICIlczogUGFja2V0IGRyb3BwZWQgZm9yIFNlbGYgU1RBIHdpdGggc3RhSWQgJWQgIiwgX19mdW5jX18sIHVjU1RBSWQgKSk7CgogICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgLyogU3RhdGlvbiBoYXMgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCBUTCAtIGNhY2hlIHRoZSBmcmFtZSAqLwogICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICIlczogc3RhSWQgJWQgZXhpc3QgJWQgdGxTdGF0ZSAlZCBjYWNoZSByeCBmcmFtZSIsIF9fZnVuY19fLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjRXhpc3RzLCBwQ2xpZW50U1RBLT50bFN0YXRlKSk7CiAgICAgICAgV0xBTlRMX0NhY2hlU1RBRnJhbWUoIHBUTENiLCB1Y1NUQUlkLCB2b3NUZW1wQnVmZiwgdURQVVNpZywgYnJvYWRjYXN0LCB1Y0ZybVR5cGUpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAogICAgICBpZiAoKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNFc2VTdGEpfHwgYnJvYWRjYXN0KQogICAgICB7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgRmlsdGVyIHRoZSBJQVBQIGZyYW1lcyBmb3IgRVNFIGNvbm5lY3Rpb247CiAgICAgICAgICBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdAogICAgICAgICAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgcmVndWxhciBkYXRhIHBhdGgKICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKCBXTEFOVExfSXNJQVBQRnJhbWUocHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZikpCiAgICAgICAgewogICAgICAgICAgICBiRm9yd2FyZElBUFB3aXRoTExDID0gVk9TX1RSVUU7CiAgICAgICAgfQogICAgICB9CiNlbmRpZgoKI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgIWRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCiAgICAgIGlmICgocENsaWVudFNUQS0+d1NUQURlc2MudWNJc0VzZVN0YSl8fCBicm9hZGNhc3QpCiAgICAgIHsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBGaWx0ZXIgdGhlIElBUFAgZnJhbWVzIGZvciBFU0UgY29ubmVjdGlvbjsKICAgICAgICAgIGlmIGRhdGEgaXQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIGl0IAogICAgICAgICAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgcmVndWxhciBkYXRhIHBhdGgKICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKCBXTEFOVExfSXNJQVBQRnJhbWUocHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZikpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfcGt0X2ZsYXR0ZW5fcnhfcGt0KCZ2b3NUZW1wQnVmZikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZmxhdHRlbiBwYWNrZXQgLSBkcm9wcGluZyIpKTsKICAgICAgICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUmVjZWl2ZWQgRVNFIElBUFAgRnJhbWUiKSk7CgogICAgICAgICAgICAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4KCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYpOyAKICAgICAgICAgICAgfQogICAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KI2VuZGlmICAvKiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmICFkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKSAqLwoKICAgICAgaWYgKCBXTEFOX1NUQV9CVF9BTVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogICAgICB7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgUHJvY2VzcyB0aGUgY3RybCBCQVAgZnJhbWU7IGlmIGRhdGEgaXQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIGl0IAogICAgICAgICAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgcmVndWxhciBkYXRhIHBhdGgKICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKCBXTEFOVExfUHJvY2Vzc0JBUEZyYW1lKCBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2RhdGFfcGt0X2Fycml2ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkKSkKICAgICAgICB7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9LyppZiBCVC1BTVAgc3RhdGlvbiovCiAgICAgIGVsc2UgaWYoc2VsZkJjYXN0TG9vcGJhY2sgPT0gVk9TX1RSVUUpCiAgICAgIHsgCiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8gCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsgCiAgICAgICAgY29udGludWU7IAogICAgICB9IAogICAgICAKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBEYXRhIHBhY2tldCByZWNlaXZlZCwgc2VuZCB0byBzdGF0ZSBtYWNoaW5lCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHdTVEFFdmVudCA9IFdMQU5UTF9SWF9FVkVOVDsKCiAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BDbGllbnRTVEEtPnRsU3RhdGVdLgogICAgICAgICAgICAgICAgICAgICAgcGZuU1RBVGJsW3dTVEFFdmVudF07CgogICAgICBpZiAoIE5VTEwgIT0gcGZuU1RBRnNtICkKICAgICAgewojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAgICAgIC8qIFJlYWQgUlNTSSBhbmQgdXBkYXRlICovCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0hTSGFuZGxlUlhGcmFtZShwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmKTsKICAgICAgICBicm9hZGNhc3QgPSBWT1NfRkFMU0U7CiNlbHNlCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRSU1NJKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKI2VuZGlmCiAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgIkhhbmRsZSBSWCBEYXRhIEZyYW1lIGZhaWwgd2l0aGluIEhhbmRvZmYgc3VwcG9ydCBtb2R1bGUiKSk7CiAgICAgICAgICAvKiBEbyBOb3QgRHJvcCBwYWNrZXQgYXQgaGVyZSAKICAgICAgICAgICAqIFJldmlzaXQgd2h5IEhPIG1vZHVsZSByZXR1cm4gZmFpbAogICAgICAgICAgICogdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAqIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgKiBjb250aW51ZTsKICAgICAgICAgICAqLwogICAgICAgIH0KI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwogICAgICAgIGlmICggTlVMTCAhPSBwQ2xpZW50U1RBKQogICAgICAgIHsKICAgICAgICAgICAgdHBTaXJNYWNNZ210SGRyIHBNYWNIZWFkZXIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIoIHB2QkRIZWFkZXIgKTsKICAgICAgICAgICAgaWYgKCFJU19CUk9BRENBU1RfQUREKHBNYWNIZWFkZXItPmRhKSAmJiBJU19NVUxUSUNBU1RfQUREKHBNYWNIZWFkZXItPmRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1thY10ucnhNY2FzdCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBXTEFOVExfSFNHZXREYXRhUlNTSShwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAmY3VycmVudEF2Z1JTU0kpOwogICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5yc3NpRGF0YSA9IGN1cnJlbnRBdmdSU1NJOwoKICAgICAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1thY10ucnhNcGR1Kys7CiAgICAgICAgICAgIGlmIChXREFfSVNfUlhfQU5fQU1QRFUgKHB2QkRIZWFkZXIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzW2FjXS5yeEFtcGR1Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKI2VuZGlmCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRTTlIocHZvc0dDdHgsIHB2QkRIZWFkZXIsIHVjU1RBSWQpOwoKICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJGYWlsZWQgdG8gUmVhZCBTTlIiKSkpOwogICAgICAgIH0KCiAgICAgICAgV0xBTlRMX1NhbXBsZVJ4UlNTSShwVExDYiwgcHZCREhlYWRlciwgdWNTVEFJZCk7CgogICAgICAgIHBmblNUQUZzbSggcHZvc0dDdHgsIHVjU1RBSWQsICZ2b3NUZW1wQnVmZiwgYkZvcndhcmRJQVBQd2l0aExMQyk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAiV0xBTiBUTDpOVUxMIHN0YXRlIGZ1bmN0aW9uLCBTVEE6JWQsIFN0YXRlOiAlZC0gZHJvcHBpbmcgcGFja2V0IiwKICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsU3RhdGUpKTsKICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgIH0vKiBlbHNlIGRhdGEgZnJhbWUqLwoKICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgfS8qd2hpbGUgY2hhaW4qLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1J4RnJhbWVzICovCgojaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ29sbGVjdEludGVyZmFjZVN0YXRzCgogIERFU0NSSVBUSU9OCiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgVEwgdG8gc2VuZCB0aGUgc3RhdGl0aWNzCgogIERFUEVOREVOQ0lFUwoKCiAgUEFSQU1FVEVSUwoKICAgIElOCgogICAgdWNTVEFJZDogICAgc3RhdGlvbiBmb3Igd2hpY2ggdGhlIHN0YXRpc3RpY3MgbmVlZCB0byBjb2xsZWN0ZWQKCiAgICB2b3NEYXRhQnVmZjogaXQgd2lsbCBjb250YWluIHRoZSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NvbGxlY3RJbnRlcmZhY2VTdGF0cwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9JbnRlcmZhY2VTdGF0c1R5cGUgICAgKnZvc0RhdGFCdWZmCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9Db2xsZWN0U3RhdHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9Db2xsZWN0U3RhdHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6IGNvbGxlY3QgV0lGSV9TVEFUU19JRkFDRSByZXN1bHRzIikpOwoKICB2b3NfbWVtX2NvcHkodm9zRGF0YUJ1ZmYsICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+aW50ZXJmYWNlU3RhdHMsCiAgICAgICAgICBzaXplb2YoV0xBTlRMX0ludGVyZmFjZVN0YXRzVHlwZSkpOwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFySW50ZXJmYWNlU3RhdHMKCiAgREVTQ1JJUFRJT04KICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBUTCB0byBjbGVhciB0aGUgc3RhdGl0aWNzCgogIERFUEVOREVOQ0lFUwoKCiAgUEFSQU1FVEVSUwoKICAgIElOCgogICAgdWNTVEFJZDogICAgc3RhdGlvbiBmb3Igd2hpY2ggdGhlIHN0YXRpc3RpY3MgbmVlZCB0byBjb2xsZWN0ZWQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NsZWFySW50ZXJmYWNlU3RhdHMKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICAgc3RhdHNDbGVhclJlcU1hc2sKKQp7CiAgICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgU2FuaXR5IGNoZWNrCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NvbGxlY3RTdGF0cyIpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICAgaWYgKCBOVUxMID09IHBUTENiICkKICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ29sbGVjdFN0YXRzIikpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwogICAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIGlmICgoc3RhdHNDbGVhclJlcU1hc2sgJiBXSUZJX1NUQVRTX0lGQUNFX0FDKSB8fAogICAgICAgICAgICAoc3RhdHNDbGVhclJlcU1hc2sgJiBXSUZJX1NUQVRTX0lGQUNFKSkgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Y2xlYXJlZCBXSUZJX1NUQVRTX0lGQUNFX0FDIHJlc3VsdHMiKSk7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1swXS5yeE1jYXN0ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzFdLnJ4TWNhc3QgPSAwOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMl0ucnhNY2FzdCA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1szXS5yeE1jYXN0ID0gMDsKCiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1swXS5yeE1wZHUgPSAwOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMV0ucnhNcGR1ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzJdLnJ4TXBkdSA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1szXS5yeE1wZHUgPSAwOwoKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzBdLnJ4QW1wZHUgPSAwOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMV0ucnhBbXBkdSA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1syXS5yeEFtcGR1ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzNdLnJ4QW1wZHUgPSAwOwogICAgfQoKICAgIGlmIChzdGF0c0NsZWFyUmVxTWFzayAmIFdJRklfU1RBVFNfSUZBQ0UpIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOmNsZWFyZWQgV0lGSV9TVEFUU19JRkFDRSByZXN1bHRzIikpOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLm1nbXRSeCA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMucnNzaURhdGEgPSAwOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICB9CgogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SeENhY2hlZEZyYW1lcwoKICBERVNDUklQVElPTgogICAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IFRMIHRvIGZvcndhcmQgdGhlIGNhY2hlZCBmcmFtZXMgdG8gYSBwYXJ0aWN1bGFyCiAgICBzdGF0aW9uOyAKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIElmIHRoZSBmcmFtZSBjYXJyaWVkIGlzIGEgZGF0YSBmcmFtZSB0aGVuIHRoZSBzdGF0aW9uIGZvciB3aGljaCBpdCBpcwogICAgZGVzdGluZWQgdG8gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggVEwuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcFRMQ2I6ICAgcG9pbnRlciB0byBUTCBoYW5kbGUgCiAgIAogICAgdWNTVEFJZDogICAgc3RhdGlvbiBmb3Igd2hpY2ggd2UgbmVlZCB0byBmb3J3YXJkIHRoZSBwYWNrZXRzCgogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2FjaGVkIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQsIGlmIHRoZXJlIGlzIG1vcmUgdGhlbiBvbmUgcGFja2V0IHRoZXkgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgY2hhaW5lZCB1c2luZyB2T1NTIGJ1ZmZlcnMuCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SeENhY2hlZEZyYW1lcwooCiAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZgopCnsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgV0xBTlRMX1NUQUZ1bmNUeXBlICBwZm5TVEFGc207CiAgdm9zX3BrdF90KiAgICAgICAgICB2b3NUZW1wQnVmZjsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB2X1BWT0lEX3QgICAgICAgICAgIHB2QkRIZWFkZXIgPSBOVUxMOwogIFdMQU5UTF9TVEFFdmVudFR5cGUgd1NUQUV2ZW50ICA9IFdMQU5UTF9SWF9FVkVOVDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjVGlkICAgICAgPSAwOwogIHZfQk9PTF90ICAgICAgICAgICAgYnJvYWRjYXN0ICA9IFZPU19GQUxTRTsKICB2X0JPT0xfdCAgICAgICAgICAgIGJTaWdNYXRjaCAgPSBWT1NfRkFMU0U7IAogIHZfQk9PTF90ICAgICAgICAgICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfRkFMU0U7CiAgc3RhdGljIHZfVThfdCAgICAgICBmaXJzdF9kYXRhX3BrdF9hcnJpdmVkOwogIHZfVTMyX3QgICAgICAgICAgICAgdURQVVNpZzsgCiAgdl9VOF90ICAgICAgICAgICAgICB1Y1VjYXN0U2lnOyAKICB2X1U4X3QgICAgICAgICAgICAgIHVjQmNhc3RTaWc7IAogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6VEwgUmVjZWl2ZSBDYWNoZWQgRnJhbWVzIGNhbGxlZCIpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUnhGcmFtZXMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX0ZPUldBUkRfQ0FDSEVEX0ZSQU1FUywKICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIDE8PDE2IHwgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIHRoZSBpbml0aWFsIGJ1ZmZlciAtIHRoaXMgaXMgdGhlIGZpcnN0IHJlY2VpdmVkIGJ1ZmZlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CgogIHdoaWxlICggTlVMTCAhPSB2b3NUZW1wQnVmZiApCiAgewogICAgYnJvYWRjYXN0ID0gVk9TX0ZBTFNFOwogICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfRkFMU0U7IAoKICAgIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLCAmdm9zRGF0YUJ1ZmYsIDEvKnRydWUqLyApOwoKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOlNlbmRpbmcgbmV3IGNhY2hlZCBwYWNrZXQgdG8gc3RhdGlvbiAlZCIsIHVjU1RBSWQpKTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFBlZWsgYXQgQkQgaGVhZGVyIC0gZG8gbm90IHJlbW92ZQogICAgICAhISEgT3B0aW1pemUgbWU6IG9ubHkgcGFydCBvZiBoZWFkZXIgaXMgbmVlZGVkOyBub3QgZW50aXJlIG9uZQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zVGVtcEJ1ZmYsICh2X1BWT0lEX3QpJnB2QkRIZWFkZXIsIDAgKTsKCiAgICBpZiAoIE5VTEwgPT0gcHZCREhlYWRlciApCiAgICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZXh0cmFjdCBCRCBoZWFkZXIiKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgdURQVVNpZyA9IFdEQV9HRVRfUlhfRFBVU0lHKCBwdkJESGVhZGVyICk7CgogICAgLyogQU1TRFUgSFcgYnVnIGZpeAogICAgICogQWZ0ZXIgMm5kIEFNU0RVIHN1YmZyYW1lIEhXIGNvdWxkIG5vdCBoYW5kbGUgQkQgY29ycmVjdGx5CiAgICAgKiBIQUwgd29ya2Fyb3VuZCBpcyBuZWVkZWQgKi8KICAgIGlmKFdEQV9HRVRfUlhfQVNGKHB2QkRIZWFkZXIpKQogICAgewogICAgICBXREFfRFNfUnhBbXNkdUJkRml4KHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCxwVExDYiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyKTsKICAgIH0KCiAgICB1Y1RpZCAgID0gKHZfVThfdClXREFfR0VUX1JYX1RJRCggcHZCREhlYWRlciApOwoKICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RGF0YSBwYWNrZXQgY2FjaGVkIGZvciBTVEEgJWQiLCB1Y1NUQUlkKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBUaGlzIHNob3VsZCBiZSBjb3JyZWN0ZWQgd2hlbiBtdWx0aXBlIHN0YSBzdXBwb3J0IGlzIGFkZGVkICEhIQogICAgICBmb3Igbm93IGJjYXN0IGZyYW1lcyB3aWxsIGJlIHNlbnQgdG8gdGhlIGxhc3QgcmVnaXN0ZXJlZCBTVEEKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCBXREFfSVNfUlhfQkNBU1QocHZCREhlYWRlcikpCiAgICB7CiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOlRMIHJ4IEJjYXN0IGZyYW1lICIpKTsKICAgICAgYnJvYWRjYXN0ID0gVk9TX1RSVUU7CgogICAgICAvKiBJZiBBZGRyMSBpcyBiL21jYXN0LCBidXQgQWRkcjMgaXMgb3VyIG93biBzZWxmIE1BQywgaXQgaXMgYSBiL21jYXN0IAogICAgICAgKiBwa3Qgd2Ugc2VudCBsb29waW5nIGJhY2sgdG8gdXMuIFRvIGJlIGRyb3BwZWQgaWYgd2UgYXJlIG5vbiBCVEFNUCAgCiAgICAgICAqLyAKICAgICAgaWYoIFdMQU5IQUxfUlhfQkRfQUREUjNfU0VMRl9JRFggPT0gCiAgICAgICAgICAodl9VOF90KVdEQV9HRVRfUlhfQUREUjNfSURYKCBwdkJESGVhZGVyICkpIAogICAgICB7CiAgICAgICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfVFJVRTsgCiAgICAgIH0KICAgIH0vKmlmIGJjYXN0Ki8KCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIENoZWNrIGlmIHRoZSBwYWNrZXQgdGhhdCB3ZSBjYWNoZWQgbWF0Y2hlcyB0aGUgRFBVIHNpZ25hdHVyZSBvZiB0aGUKICAgICAgbmV3bHkgYWRkZWQgc3RhdGlvbiAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICAgIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KCiAgICBpZiAoIGJyb2FkY2FzdCApCiAgICB7CiAgICAgIHVjQmNhc3RTaWcgPSAodl9VOF90KXVEUFVTaWc7CiAgICAgIGJTaWdNYXRjaCA9ICgoIFdMQU5fVExfSU5WQUxJRF9CX1NJRyAhPSAKICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICkgJiYKICAgICAgICAoIHVjQmNhc3RTaWcgPT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZyApKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgdWNVY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgICAgYlNpZ01hdGNoID0gKCggV0xBTl9UTF9JTlZBTElEX1VfU0lHICE9IAogICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyApICYmCiAgICAgICAgICAoIHVjVWNhc3RTaWcgPT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyApKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgSWYgdGhlIHBhY2tldCBkb2Vzbid0IG1hdGNoIC0gZHJvcCBpdCAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCAhYlNpZ01hdGNoICkKICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELAogICAgICAgICJXTEFOIFRMOiBDYWNoZWQgcGFja2V0IGRvZXMgbm90IG1hdGNoIERQVSBTaWcgb2YgdGhlIG5ldyBTVEEgLSBkcm9wICIKICAgICAgICAiIERQVSBTaWcgJWQgIFVDICVkIEJDICVkIEIgJWQiLAogICAgICAgIHVEUFVTaWcsCiAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZywKICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnLAogICAgICAgIGJyb2FkY2FzdCkpOwoKICAgICAgLyogRHJvcCBwYWNrZXQgKi8gCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAogICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOyAKICAgICAgY29udGludWU7IAoKICAgIH0vKmlmIHNpZ25hdHVyZSBtaXNtYXRjaCovCgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgQlQtQU1QIGZyYW1lOgogICAgICAtIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBuZWVkZWQgaW4gdGhpcyBjYXNlIHRvIHNlcGFyYXRlIEJULUFNUCBkYXRlCiAgICAgICAgZnJvbSBCVC1BTVAgQ3RybCBwYXRoIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggV0xBTl9TVEFfQlRfQU1QID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlICkKICAgIHsKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIFByb2Nlc3MgdGhlIGN0cmwgQkFQIGZyYW1lOyBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdCAKICAgICAgICB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIGRhdGEgcGF0aAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIGlmICggV0xBTlRMX1Byb2Nlc3NCQVBGcmFtZSggcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdF9kYXRhX3BrdF9hcnJpdmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKQogICAgICB7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9LyppZiBCVC1BTVAgc3RhdGlvbiovCiAgICAgIGVsc2UgaWYoc2VsZkJjYXN0TG9vcGJhY2sgPT0gVk9TX1RSVUUpCiAgICAgIHsgCiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8gCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsgCiAgICAgICAgY29udGludWU7IAogICAgICB9IAogICAgICAKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBEYXRhIHBhY2tldCByZWNlaXZlZCwgc2VuZCB0byBzdGF0ZSBtYWNoaW5lCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHdTVEFFdmVudCA9IFdMQU5UTF9SWF9FVkVOVDsKCiAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BDbGllbnRTVEEtPnRsU3RhdGVdLgogICAgICAgICAgICAgICAgICAgICAgcGZuU1RBVGJsW3dTVEFFdmVudF07CgogICAgICBpZiAoIE5VTEwgIT0gcGZuU1RBRnNtICkKICAgICAgewojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAgICAgIC8qIFJlYWQgUlNTSSBhbmQgdXBkYXRlICovCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0hTSGFuZGxlUlhGcmFtZSh2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0RBVEFfRlJBTUVfVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYpOwogICAgICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKI2Vsc2UKICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVhZFJTU0kodm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwgcHZCREhlYWRlciwgdWNTVEFJZCk7CiNlbmRpZgogICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIkhhbmRsZSBSWCBEYXRhIEZyYW1lIGZhaWwgd2l0aGluIEhhbmRvZmYgc3VwcG9ydCBtb2R1bGUiKSk7CiAgICAgICAgICAvKiBEbyBOb3QgRHJvcCBwYWNrZXQgYXQgaGVyZSAKICAgICAgICAgICAqIFJldmlzaXQgd2h5IEhPIG1vZHVsZSByZXR1cm4gZmFpbAogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBwZm5TVEFGc20oIHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCxwVExDYiksIHVjU1RBSWQsIAogICAgICAgICAgICAgICAgICZ2b3NUZW1wQnVmZiwgVk9TX0ZBTFNFKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOk5VTEwgc3RhdGUgZnVuY3Rpb24sIFNUQTolZCwgU3RhdGU6ICVkLSBkcm9wcGluZyBwYWNrZXQiLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxTdGF0ZSkpOwogICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICB9Lyp3aGlsZSBjaGFpbiovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUnhDYWNoZWRGcmFtZXMgKi8KCi8qKgogKiBXTEFOVExfRm9yd2FyZFBrdHMoKSAtIGZvcndhcmQgY2FjaGVkIGVhcG9sIGZyYW1lcwogKiBAcHZvc0dDdHg6IHBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0CiAqIEBkYXRhOiB2YWx1ZSB0byBpbmRpY2F0ZSBlaXRoZXIgZm9yd2FyZCBvciBmbHVzaAogKgogKiBSZXR1cm46IE5vbmUKICoKICovCnN0YXRpYyBWT1NfU1RBVFVTIFdMQU5UTF9Gb3J3YXJkUGt0cyh2b2lkKiBwdm9zR0N0eCwgdWludDMyX3QgZGF0YSkKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwoKICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgaWYgKE5VTEwgPT0gcFRMQ2IpIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiJXM6IEludmFsaWQgaW5wdXQgcG9pbnRlciIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgIH0KCiAgIGlmICghZGF0YSkgewogICAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiJXM6IFByZSBhc3NvYyBmYWlsIGZsdXNoIGNhY2hlIiwgX19mdW5jX18pKTsKICAgICAgV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzKHBUTENiLT52b3NFYXBvbENhY2hlZEZyYW1lKTsKICAgICAgZ290byBkb25lOwogICB9CgogICAvKiBmb3J3YXJkIHBhY2tldHMgdG8gSEREICovCiAgIGlmIChOVUxMICE9IHBUTENiLT52b3NFYXBvbENhY2hlZEZyYW1lKSB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiJXM6IGZvcndhcmQgcHJlIGFzc29jIGNhY2hlZCBmcmFtZXMiLCBfX2Z1bmNfXykpOwogICAgICBXTEFOVExfTW9uVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIocFRMQ2ItPnZvc0VhcG9sQ2FjaGVkRnJhbWUsIHBUTENiKTsKICAgICAgcFRMQ2ItPnBmbkVhcG9sRndkKHB2b3NHQ3R4LCBwVExDYi0+dm9zRWFwb2xDYWNoZWRGcmFtZSk7CiAgIH0KCmRvbmU6CiAgcFRMQ2ItPnZvc0VhcG9sQ2FjaGVkRnJhbWUgPSBOVUxMOwogIHBUTENiLT5wcmVhc3NvY19jYWNoaW5nID0gZmFsc2U7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfUnhQcm9jZXNzTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB3aGVuIGEgbWVzc2FnZSB3YXMgc2VyaWFsaXplZCBmb3IgVEwgdGhyb3VnaCB0aGUKICAgIHJ4IHRocmVhZC90YXNrLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgT3RoZXIgdmFsdWVzIGNhbiBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIHBsZWFzZSBjaGVjawogIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUnhQcm9jZXNzTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgdl9VMzJfdCAgICAgICAgIHVEYXRhOwogICB2X1U4X3QgICAgICAgICAgdWNTVEFJZDsKICAgdl9VOF90ICAgICAgICAgIHVjVWNhc3RTaWc7CiAgIHZfVThfdCAgICAgICAgICB1Y0JjYXN0U2lnOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUnhQcm9jZXNzTWVzc2FnZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUHJvY2VzcyBtZXNzYWdlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG1lc3NhZ2U6ICVkIHRocm91Z2ggcnggZmxvdyIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CgogIGNhc2UgV0xBTlRMX1JYX0ZXRF9DQUNIRUQ6CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIFRoZSBkYXRhIHNlbnQgd2l0aCB0aGUgbWVzc2FnZSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CiAgICAgICB8IDAwIHwgdWNCY2FzdFNpZ25hdHVyZSB8IHVjVWNhc3RTaWduYXR1cmUgfCB1Y1NUQUlEIHwKICAgICAgIGVhY2ggZmllbGQgYWJvdmUgaXMgb25lIGJ5dGUKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB1RGF0YSAgICAgICA9IG1lc3NhZ2UtPmJvZHl2YWw7CiAgICB1Y1NUQUlkICAgICA9ICggdURhdGEgJiAweDAwMDAwMEZGKTsKICAgIHVjVWNhc3RTaWcgID0gKCB1RGF0YSAmIDB4MDAwMEZGMDApPj44OwogICAgdWNCY2FzdFNpZyAgPSAodl9VOF90KSgoIHVEYXRhICYgMHgwMEZGMDAwMCk+PjE2KTsKICAgIHZvc1N0YXR1cyAgID0gV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMoIHB2b3NHQ3R4LCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNVY2FzdFNpZywgdWNCY2FzdFNpZyk7CiAgICBicmVhazsKCiAgY2FzZSBXTEFOVExfUlhfRldEX1BSRV9BU1NPQ19DQUNIRUQ6CiAgICB1RGF0YSA9IG1lc3NhZ2UtPmJvZHl2YWw7CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfRm9yd2FyZFBrdHMocHZvc0dDdHgsIHVEYXRhKTsKICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgLypubyBwcm9jZXNzaW5nIGZvciBub3cqLwogICAgYnJlYWs7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9SZXNvdXJjZUNCCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgdGhlIFRMIHdoZW4gaXQgaGFzIHBhY2tldHMgYXZhaWxhYmxlIGZvciB0cmFuc21pc3Npb24uCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIEJBTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBCQUwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZXNvdXJjZUNCCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgsCiAgdl9VMzJfdCAgICAgICAgIHVDb3VudAopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcFRMQ2ItPnVSZXNDb3VudCA9IHVDb3VudDsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlc3VtZSBUeCBpZiBlbm91Z2ggcmVzIGFuZCBub3Qgc3VzcGVuZGVkCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfTUYgKSAmJgogICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwgZm9yIGF2YWlsIHJlcyBBU1lOQyIpKTsKICAgIHJldHVybiBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVzb3VyY2VDQiAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9Jc1R4WG1pdFBlbmRpbmcKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSB0aGUgV0RBIHdoZW4gaXQgd2FudHMgdG8ga25vdyB3aGV0aGVyIFdEQV9EU19UWF9TVEFSVF9YTUlUIG1zZwogICAgaXMgcGVuZGluZyBpbiBUTCBtc2cgcXVldWUgCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFdEQSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBXREEncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgMDogICBObyBXREFfRFNfVFhfU1RBUlRfWE1JVCBtc2cgcGVuZGluZyAKICAgIDE6ICAgTXNnIFdEQV9EU19UWF9TVEFSVF9YTUlUIGFscmVhZHkgcGVuZGluZyBpbiBUTCBtc2cgcXVldWUgCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Jc1R4WG1pdFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopCnsKCiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggaW4gV0xBTlRMX0lzVHhYbWl0UGVuZGluZyAiKSk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICByZXR1cm4gcFRMQ2ItPmlzVHhUcmFubWl0TXNnUGVuZGluZzsKCn0vKldMQU5UTF9Jc1R4WG1pdFBlbmRpbmcgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9TZXRUeFhtaXRQZW5kaW5nCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgdGhlIFdEQSB3aGVuIGl0IHdhbnRzIHRvIGluZGljYXRlIHRoYXQgV0RBX0RTX1RYX1NUQVJUX1hNSVQgbXNnCiAgICBpcyBwZW5kaW5nIGluIFRMIG1zZyBxdWV1ZSAKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggV0RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZfVk9JRF90CldMQU5UTF9TZXRUeFhtaXRQZW5kaW5nCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgKKQp7CgogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IGluIFdMQU5UTF9TZXRUeFhtaXRQZW5kaW5nIikpOwogICAgcmV0dXJuOwogIH0KCiAgcFRMQ2ItPmlzVHhUcmFubWl0TXNnUGVuZGluZyA9IDE7CiAgcmV0dXJuOwoKfS8qV0xBTlRMX1NldFR4WG1pdFBlbmRpbmcgICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgdGhlIFdEQSB3aGVuIGl0IHdhbnRzIHRvIGluZGljYXRlIHRoYXQgbm8gV0RBX0RTX1RYX1NUQVJUX1hNSVQgbXNnCiAgICBpcyBwZW5kaW5nIGluIFRMIG1zZyBxdWV1ZSAKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggV0RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdl9WT0lEX3QKV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewoKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBpbiBXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nICIpKTsKICAgIHJldHVybjsKICB9CgogIHBUTENiLT5pc1R4VHJhbm1pdE1zZ1BlbmRpbmcgPSAwOwogIHJldHVybjsKfS8qV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX1R4VGhyZWFkRGVidWdIYW5kbGVyCgogIERFU0NSSVBUSU9OCiAgICBQcmludGluZyBUTCBTbmFwc2hvdCBkdW1wLCBwcm9jZXNzZWQgdW5kZXIgVHhUaHJlYWQgY29udGV4dCwgY3VycmVudGx5CiAgICBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGdsb2JhbCBUbENiIHN0cnV0dXJlLiBEdW1wcyBpbmZvcm1hdGlvbiByZWxhdGVkCiAgICB0byBwZXIgYWN0aXZlIFNUQSBjb25uZWN0aW9uIGN1cnJlbnRseSBpbiB1c2UgYnkgVEwuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZfVk9JRF90CldMQU5UTF9UeFRocmVhZERlYnVnSGFuZGxlcgooCiB2X1BWT0lEX3QgKnBWb3NDb250ZXh0CikKewogICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAgaW50IGkgPSAwOwogICB2X1U4X3QgdUZsb3dNYXNrOyAvLyBUWCBGbG93TWFzayBmcm9tIFdEQQoKICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOiAlcyBFbnRlciAiLCBfX2Z1bmNfXykpOwoKICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHBWb3NDb250ZXh0KTsKCiAgIGlmICggTlVMTCA9PSBwVm9zQ29udGV4dCB8fCBOVUxMID09IHBUTENiICkKICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiR2xvYmFsIFZvUyBDb250ZXh0IG9yIFRMIENvbnRleHQgYXJlIE5VTEwiKSk7CiAgICAgICAgcmV0dXJuOwogICB9CgogICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTID09IFdEQV9EU19HZXRUeEZsb3dNYXNrKHBWb3NDb250ZXh0LCAmdUZsb3dNYXNrKSkKICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXREEgdVR4Rmxvd01hc2s6IDB4JXgiLCB1Rmxvd01hc2spKTsKICAgfQoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqVEwgRFVNUCBJTkZPUk1BVElPTioqKioqKioqKioqKioqIikpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAidURlbGF5ZWRUcmlnZ2VyRnJtSW50OiVkXHR1TWluRnJhbWVzUHJvY1RocmVzOiVkIiwKICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50LAogICAgICAgICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51TWluRnJhbWVzUHJvY1RocmVzKSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJNYW5hZ2VtZW50IEZyYW1lIENsaWVudCBleGlzdHM6ICVkIiwKICAgICAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMpKTsKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAidXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50OiAlZFx0dWNUeFN1c3BlbmRlZDogJWQiLAogICAgICAgICAgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCwKICAgICAgICAgIHBUTENiLT51Y1R4U3VzcGVuZGVkKSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJ1UmVzQ291bnQ6ICVkIiwgcFRMQ2ItPnVSZXNDb3VudCkpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAidWNSZWdpc3RlcmVkU3RhSWQ6ICVkXHR1Y0N1cnJlbnRTVEE6ICVkIiwKICAgICAgICAgIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCwgcFRMQ2ItPnVjQ3VycmVudFNUQSkpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiVXJnZW50RnJhbWVQcm9jZXNzaW5nOiAlc1x0dUZyYW1lc1Byb2NUaHJlczogJWQiLAogICAgICAgICAgKHBUTENiLT5iVXJnZW50PyJUcnVlIjoiRmFsc2UiKSwgcFRMQ2ItPnVGcmFtZXNQcm9jVGhyZXMpKTsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgImlzVHhUcmFubWl0TXNnUGVuZGluZzogJWRcdCBpc0JNUFM6ICVzIiwKICAgICAgICAgIHBUTENiLT5pc1R4VHJhbm1pdE1zZ1BlbmRpbmcsIHBUTENiLT5pc0JNUFM/IlRydWUiOiJGYWxzZSIpKTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJURExTIFBlZXIgQ291bnQ6ICVkIiwgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCkpOwojZW5kaWYKCiAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAiKysrKysrKysrKysrKysrKysrKytSZWdpc3RlcmQgQ2xpZW50IEluZm9ybWF0aW9uKysrKysrKysrKyIpKTsKCiAgIGZvciAoIGkgPTA7IGk8V0xBTl9NQVhfU1RBX0NPVU5UOyBpKysgKQogICB7CiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldOwogICAgICAgIGlmKCBOVUxMID09IHBDbGllbnRTVEEgfHwgMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyNTVEEgSW5kZXg6ICVkICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiLGkpKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiV0xBTl9TVEFEZXNjVHlwZToiKSk7CiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAiU1RBSWQ6ICVkXHQgU1RBIE1BQyBBZGRyZXNzOiAlcE0iLCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1NUQUlkLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzKSk7CiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAiU1RBIFR5cGU6ICVkXHRQcm90ZWN0ZWRGcmFtZTogJWQiLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlLCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Byb3RlY3RlZEZyYW1lKSk7CiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIlFvUzogJWRcdFJ4RnJhbWVUcmFuczogJWRcdFR4RnJhbWVUcmFuczogJWQiLAogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQsIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbiwKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uKSk7CiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAidWNVY2FzdFNpZzogJWRcdHVjQmNhc3RTaWc6ICVkIiwgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZywKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnKSk7CgogICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgIkNsaWVudEluZGV4OiAlZFx0IEV4aXN0czogJWQiLCBpLCBwQ2xpZW50U1RBLT51Y0V4aXN0cykpOwogICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgIlRMIFN0YXRlOiAlZFx0IFRMIFByaW9yaXR5OiAlZCIsIHBDbGllbnRTVEEtPnRsU3RhdGUsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dGxQcmkpKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJ1Y1R4U3VzcGVuZGVkOiAlZFx0dWNQa3RQZW5kaW5nOiAlZCIsIHBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nKSk7CiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAidWNFQVBPTFBrdFBlbmRpbmc6ICVkXHR1Y05vTW9yZURhdGE6ICVkIiwKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZywgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhKSk7CiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgImVuYWJsZUNhY2hpbmc6ICVkXHQgZmNTdGFUeERpc2FibGVkOiAlZCIsIHBDbGllbnRTVEEtPmVuYWJsZUNhY2hpbmcsCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPmZjU3RhVHhEaXNhYmxlZCkpOwogICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJ1Y0N1cnJlbnRBQzogJWRcdHVjU2VydmljZWRBQzogJWQiLCBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQywKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWNTZXJ2aWNlZEFDKSk7CiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAiVElEOiAlZFx0YXV0VHhDb3VudFswXTogJWRcdGF1UnhDb3VudFswXTogJWQiLDAsIHBDbGllbnRTVEEtPmF1VHhDb3VudFswXSwKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5hdVJ4Q291bnRbMF0pKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJhdWNBY01hc2tbMF06ICVkXHRhdWNBY01hc2tbMV06ICVkXHRhdWNBY01hc2tbMl06ICVkXHRhdWNBY01hc2tbM106ICVkXHQiLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1swXSwgcENsaWVudFNUQS0+YXVjQUNNYXNrWzFdLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1syXSwgcENsaWVudFNUQS0+YXVjQUNNYXNrWzNdKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCgogICAgICAgICAgICAgICAidWNDdXJyZW50V2VpZ2h0OiAlZCIsIHBDbGllbnRTVEEtPnVjQ3VycmVudFdlaWdodCkpOwoKICAgICAgICBpZiggV0xBTl9TVEFfU09GVEFQID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAgIlRyYWZmaWNTdGF0aXN0aWNzIGZvciBTT0ZUQVAgU3RhdGlvbjoiKSk7CiAgICAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgICJSVUY9JWRcdFJNRj0lZFx0UkJGPSVkIiwgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MucnhVQ0ZjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MucnhNQ0ZjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MucnhCQ0ZjbnQpKTsKICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAgIlJVQj0lZFx0Uk1CPSVkXHRSQkI9JWQiLCBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy5yeFVDQmNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy5yeE1DQmNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy5yeEJDQmNudCkpOwogICAgICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgICAiVFVGPSVkXHRUTUY9JWRcdFRCRj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4TUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4QkNGY250KSk7CiAgICAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgICJUVUI9JWRcdFRNQj0lZFx0VEJCPSVkIiwgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0JjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhNQ0JjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhCQ0JjbnQpKTsKICAgICAgICB9CgogICAgfQogICByZXR1cm47Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9GYXRhbEVycm9ySGFuZGxlcgoKICBERVNDUklQVElPTgogICAgSGFuZGxlIEZhdGFsIGVycm9ycyBkZXRlY3RlZCBvbiB0aGUgVFggcGF0aC4KICAgIEN1cnJlbnRseSBpc3N1ZXMgU1NSIHRvIHJlY292ZXIgZnJvbSB0aGUgZXJyb3IuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9WT0lEX3QKV0xBTlRMX0ZhdGFsRXJyb3JIYW5kbGVyCigKIHZfUFZPSURfdCAqcFZvc0NvbnRleHQKKQp7CgogICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6ICVzIEVudGVyICIsIF9fZnVuY19fKSk7CgogICBpZiAoIE5VTEwgPT0gcFZvc0NvbnRleHQgKQogICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICIlczogR2xvYmFsIFZvUyBDb250ZXh0IG9yIFRMIENvbnRleHQgYXJlIE5VTEwiLAogICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybjsKICAgfQoKICAgLyoKICAgICogSXNzdWUgU1NSLiB2b3Nfd2xhblJlc3RhcnQgaGFzIHRpZ2h0IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdAogICAgKiB3ZSBkbyBub3Qgc2VuZCBhbiBGSVEgaWYgcHJldmlvdXMgRklRIGlzIG5vdCBwcm9jZXNzZWQKICAgICovCiAgIHZvc193bGFuUmVzdGFydCgpOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfVExEZWJ1Z01lc3NhZ2UKCiAgREVTQ1JJUFRJT04KICAgIFBvc3QgYSBUTCBTbmFwc2hvdCByZXF1ZXN0LCBwb3N0cyBtZXNzYWdlIGluIFR4VGhyZWFkLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIGRpc3BsYXlTbmFwc2hvdCBCb29sZWFuIHNob3dpbmcgd2hldGhlciB0byBkdW1wIHRoZSBzbmFwc2hvdCBvciBub3QuCgogIFJFVFVSTiBWQUxVRSAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZfVk9JRF90CldMQU5UTF9UTERlYnVnTWVzc2FnZQooCiB2X1UzMl90IGRlYnVnRmxhZ3MKKQp7CiAgIHZvc19tc2dfdCB2b3NNc2c7CiAgIFZPU19TVEFUVVMgc3RhdHVzOwoKICAgaWYoZGVidWdGbGFncyAmIFdMQU5UTF9ERUJVR19UWF9TTkFQU0hPVCkKICAgewogICAgICAgIHZvc01zZy5yZXNlcnZlZCA9IDA7CiAgICAgICAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKICAgICAgICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfU05BUFNIT1Q7CgogICAgICAgIHN0YXR1cyA9IHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NT0RVTEVfSURfVEwsICZ2b3NNc2cpOwogICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIlRYIE1zZyBQb3N0aW5nIEZhaWxlZCB3aXRoIHN0YXR1czogJWQiLHN0YXR1cykpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICB9CiAgIGlmIChkZWJ1Z0ZsYWdzICYgV0xBTlRMX0RFQlVHX0ZXX0NMRUFOVVApCiAgIHsKICAgICAgICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogICAgICAgIHZvc01zZy5ib2R5cHRyICA9IE5VTEw7CiAgICAgICAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX0ZXX0RFQlVHOwoKICAgICAgICBzdGF0dXMgPSB2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTU9EVUxFX0lEX1RMLCAmdm9zTXNnKTsKICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJUWCBNc2cgUG9zdGluZyBGYWlsZWQgd2l0aCBzdGF0dXM6ICVkIixzdGF0dXMpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgfQogICBpZihkZWJ1Z0ZsYWdzICYgV0xBTlRMX0RFQlVHX0tJQ0tEWEUpCiAgIHsKICAgICAgICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogICAgICAgIHZvc01zZy5ib2R5cHRyICA9IE5VTEw7CiAgICAgICAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX0tJQ0tEWEU7CgogICAgICAgIHN0YXR1cyA9IHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NT0RVTEVfSURfVEwsICZ2b3NNc2cpOwogICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIlRYIE1zZyBQb3N0aW5nIEZhaWxlZCB3aXRoIHN0YXR1czogJWQiLHN0YXR1cykpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICB9CiAgIHJldHVybjsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX0ZhdGFsRXJyb3IKCiAgREVTQ1JJUFRJT04KICAgIEZhdGFsIGVycm9yIHJlcG9ydGVkIGluIFRYIHBhdGgsIHBvc3QgYW4gZXZlbnQgdG8gVFggVGhyZWFkIGZvciBmdXJ0aGVyCiAgICBoYW5kbGluZwoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgVk9JRAoKICBSRVRVUk4gVkFMVUUgICAgICBOb25lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2X1ZPSURfdApXTEFOVExfRmF0YWxFcnJvcgooCiB2X1ZPSURfdAopCnsKICAgdm9zX21zZ190IHZvc01zZzsKICAgVk9TX1NUQVRVUyBzdGF0dXM7CgogICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogICB2b3NNc2cuYm9keXB0ciAgPSBOVUxMOwogICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfRkFUQUxfRVJST1I7CgogICBzdGF0dXMgPSB2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTU9EVUxFX0lEX1RMLCAmdm9zTXNnKTsKICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICIlczogVFggTXNnIFBvc3RpbmcgRmFpbGVkIHdpdGggc3RhdHVzOiAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHN0YXR1cykpOwogICB9CiAgIHJldHVybjsKfQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVEwgU1RBVEUgTUFDSElORQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhDb25uCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBjb25uZWN0ZWQgc3RhdGUgLSBvbmx5IEVBUE9MIGFuZCBXQUkgcGFja2V0cyBhbGxvd2VkCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdHggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgT3RoZXIgcmV0dXJuIHZhbHVlcyBhcmUgcG9zc2libGUgY29taW5nIGZyb20gdGhlIGNhbGxlZCBmdW5jdGlvbnMuCiAgIFBsZWFzZSBjaGVjayBBUEkgZm9yIGFkZGl0aW9uYWwgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBVHhDb25uCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgIHZfVTE2X3QgICAgICAgICAgICAgIHVzUGt0TGVuOwogICBWT1NfU1RBVFVTICAgICAgICAgICB2b3NTdGF0dXM7CiAgIHZfTUFDQUREUl90ICAgICAgICAgIHZEZXN0TWFjQWRkcjsKICAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICBXTEFOVExfQ2JUeXBlKiAgICAgICBwVExDYiAgICAgICA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAgV0xBTlRMX01ldGFJbmZvVHlwZSAgdGxNZXRhSW5mbzsKICAgdl9VOF90ICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjVGlkOwogICB2X1U4X3QgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjV0RTRW5hYmxlZCA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjQUMsIHVjQUNNYXNrLCBpOyAKICAgdl9VMzJfdCAgICAgICAgICAgICAgdHhGbGFnID0gSEFMX1RYX05PX0VOQ1JZUFRJT05fTUFTSzsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBVHhDb25uIik7CiAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIERpc2FibGUgQUMgdGVtcG9yYXJ5IC0gaWYgc3VjY2Vzc2Z1bGwgcmV0cmlldmUgcmUtZW5hYmxlCiAgICAgIFRoZSBvcmRlciBpcyBqdXN0aWZpZWQgYmVjYXVzZSBvZiB0aGUgcG9zc2libGUgc2NlbmFyaW8KICAgICAgIC0gVEwgdHJ5ZXMgdG8gZmV0Y2ggcGFja2V0IGZvciBBQyBhbmQgaXQgcmV0dXJucyBOVUxMCiAgICAgICAtIFRMIGFuYWx5emVzIHRoZSBkYXRhIGl0IGhhcyByZWNlaXZlZCB0byBzZWUgaWYgdGhlcmUgYXJlCiAgICAgICBhbnkgbW9yZSBwa3RzIGF2YWlsYWJsZSBmb3IgQUMgLT4gaWYgbm90IFRMIHdpbGwgZGlzYWJsZSBBQwogICAgICAgLSBob3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2hpbGUgYW5hbHl6aW5nIHJlc3VsdHMgVEwgZ290CiAgICAgICBwcmVlbXB0ZWQgYnkgYSBwZW5kaW5nIGluZGljYXRpb24gd2hlcmUgdGhlIG1hc2sgd2FzIGFnYWluIHNldAogICAgICAgVEwgd2lsbCBub3QgY2hlY2sgYWdhaW4gYW5kIGFzIGEgcmVzdWx0IHdoZW4gaXQgcmVzdW1lcwogICAgICAgZXhlY3V0aW9uIGl0IHdpbGwgZGlzYWJsZSBBQwogICAgICAgVG8gcHJldmVudCB0aGlzIHRoZSBBQyB3aWxsIGJlIGRpc2FibGVkIGhlcmUgYW5kIGlmIHJldHJpZXZlCiAgICAgICBpcyBzdWNjZXNzZnVsbCBpdCB3aWxsIGJlIHJlLWVuYWJsZWQKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogIC8vTFRJOnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLgogIC8vTFRJOiAgIGF1Y0FDTWFza1twVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0N1cnJlbnRBQ10gPSAwOyAKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgISh2b3NfY29uY3VycmVudF9vcGVuX3Nlc3Npb25zX3J1bm5pbmcoKSkgJiYKICAgICAgIXBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiAgewojZWxzZQogIGlmICgoV0xBTl9TVEFfU09GVEFQICE9IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAhKHZvc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSkKICB7CiNlbmRpZgogICAgICB1Y0FDID0gcENsaWVudFNUQS0+dWNDdXJyZW50QUM7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBEaXNhYmxlIEFDIHRlbXBvcmFyeSAtIGlmIHN1Y2Nlc3NmdWxsIHJldHJpZXZlIHJlLWVuYWJsZQogICAgICBUaGUgb3JkZXIgaXMganVzdGlmaWVkIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmxlIHNjZW5hcmlvCiAgICAgICAtIFRMIHRyeWVzIHRvIGZldGNoIHBhY2tldCBmb3IgQUMgYW5kIGl0IHJldHVybnMgTlVMTAogICAgICAgLSBUTCBhbmFseXplcyB0aGUgZGF0YSBpdCBoYXMgcmVjZWl2ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZQogICAgICAgYW55IG1vcmUgcGt0cyBhdmFpbGFibGUgZm9yIEFDIC0+IGlmIG5vdCBUTCB3aWxsIGRpc2FibGUgQUMKICAgICAgIC0gaG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoaWxlIGFuYWx5emluZyByZXN1bHRzIFRMIGdvdAogICAgICAgcHJlZW1wdGVkIGJ5IGEgcGVuZGluZyBpbmRpY2F0aW9uIHdoZXJlIHRoZSBtYXNrIHdhcyBhZ2FpbiBzZXQKICAgICAgIFRMIHdpbGwgbm90IGNoZWNrIGFnYWluIGFuZCBhcyBhIHJlc3VsdCB3aGVuIGl0IHJlc3VtZXMKICAgICAgIGV4ZWN1dGlvbiBpdCB3aWxsIGRpc2FibGUgQUMKICAgICAgIFRvIHByZXZlbnQgdGhpcyB0aGUgQUMgd2lsbCBiZSBkaXNhYmxlZCBoZXJlIGFuZCBpZiByZXRyaWV2ZQogICAgICAgaXMgc3VjY2Vzc2Z1bGwgaXQgd2lsbCBiZSByZS1lbmFibGVkCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1t1Y0FDXSA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAgIC8vc29mdGFwIGNhc2UKICAgICAgdWNBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CiAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1t1Y0FDXSA9IDA7CiAgfQoKICAgIC8qWW91IG1ha2UgYW4gaW5pdGlhbCBhc3N1bXB0aW9uIHRoYXQgSEREIGhhcyBubyBtb3JlIGRhdGEgYW5kIGlmIHRoZQogICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQKICAgICBmb3IgcGFja2V0cyBhbmQgc2V0dGluZyB0aGUgZmxhZ3MgdG8gZmFsc2UqLwogIC8vTFRJOiB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjUGt0UGVuZGluZywgMCk7CiAgLy9MVEk6IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTm9Nb3JlRGF0YSA9IDE7CiAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDApOwogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwQ2xpZW50U1RBLCB1Y0FDTWFzaywgaSk7CiAgICAvKllvdSBtYWtlIGFuIGluaXRpYWwgYXNzdW1wdGlvbiB0aGF0IEhERCBoYXMgbm8gbW9yZSBkYXRhIGFuZCBpZiB0aGUKICAgICAgICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgICAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQKICAgICAgICAgICBmb3IgcGFja2V0cyBhbmQgc2V0dGluZyB0aGUgZmxhZ3MgdG8gZmFsc2UqLwogIGlmICggMCA9PSB1Y0FDTWFzayApCiAgewogICAgICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAxOwogIH0KICBlbHNlCiAgewogICAgICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjUGt0UGVuZGluZywgMSk7CiAgfQoKCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9TVEFUeENvbm4gZmV0Y2hpbmcgcGFja2V0IGZyb20gSEREIGZvciBBQzogJWQgQUMgTWFzazogJWQgUGt0IFBlbmRpbmc6ICVkIiwgCiAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzaywgcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHR4IHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICB2b3NTdGF0dXMgPSBwQ2xpZW50U1RBLT5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zRGF0YUJ1ZmYsICZ0bE1ldGFJbmZvICk7CgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSB8fCAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKSkKICB7CiAgICBUTExPRzEoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6Tm8gbW9yZSBkYXRhIGF0IEhERCBzdGF0dXMgJWQiLCB2b3NTdGF0dXMpKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlc2V0IEFDIGZvciB0aGUgc2VydmljZWQgc3RhdGlvbiB0byB0aGUgaGlnaGVzdCBwcmlvcml0eSBBQwogICAgLT4gZHVlIHRvIG5vIG1vcmUgZGF0YSBhdCB0aGUgc3RhdGlvbgogICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgbWFkZSBpbiB0aGUgbWFpbiBUTCBsb29wCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfSElHSF9QUklPOwogICAgcENsaWVudFNUQS0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJXTEFOIFRMOiBXTEFOVExfU1RBVHhDb25uIG5vIG1vcmUgcGFja2V0cyBpbiBIREQgZm9yIEFDOiAlZCBBQyBNYXNrOiAlZCIsIAogICAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzayk7CgogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qVGhlcmUgYXJlIHN0aWxsIHBhY2tldHMgaW4gSEREIC0gc2V0IGJhY2sgdGhlIHBlbmRpbmcgcGFja2V0cyBhbmQgCiAgIHRoZSBubyBtb3JlIGRhdGEgYXNzdW1wdGlvbiovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDEpOwogIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDA7CiAgcENsaWVudFNUQS0+YXVjQUNNYXNrW3VjQUNdID0gMTsKCiNpZmRlZiBXTEFOX1BFUkYgCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkwKTsKCiNlbmRpZiAvKldMQU5fUEVSRiovCgoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJZiB0aGUgcGFja2V0IGlzIG5laXRoZXIgYW4gRWFwb2wgcGFja2V0IG5vciBhIFdBSSBwYWNrZXQgdGhlbiBkcm9wIGl0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjSXNFYXBvbCAmJiAwID09IHRsTWV0YUluZm8udWNJc1dhaSApCiAgIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICJXTEFOIFRMOk9ubHkgRUFQT0wgb3IgV0FJIHBhY2tldHMgYWxsb3dlZCBiZWZvcmUgYXV0aGVudGljYXRpb24iKSk7CgogICAgIC8qIEZhaWwgdHggZm9yIHBhY2tldCAqLwogICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHKTsKICAgICB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiNlbHNlCiAgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjSXNFYXBvbCApCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBub24gRUFQT0wgcGFja2V0IGJlZm9yZSBhdXRoZW50aWNhdGlvbiIpKTsKCiAgICAvKiBGYWlsIHR4IGZvciBwYWNrZXQgKi8KICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHKTsKICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQ2hlY2sgVElECiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNUaWQgICAgID0gdGxNZXRhSW5mby51Y1RJRDsKCiAgLypNYWtlIHN1cmUgVElEIGlzIHZhbGlkKi8KICBpZiAoIFdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkpIAogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRJRCBzZW50IGluIG1ldGEgaW5mbyAlZCAtIGRlZmF1bHRpbmcgdG8gMCAoQkUpIiwgCiAgICAgICAgICAgICB1Y1RpZCkpOwogICAgIHVjVGlkID0gMDsgCiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6QXR0YWNoaW5nIEJEIGhlYWRlciB0byBwa3Qgb24gV0xBTlRMX1NUQVR4Q29ubiIpKTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExIGlmIEZyYW1lIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQgb3IgaWYgCiAgICBmcmFtZSBpcyBhIFdBSSBmcmFtZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoICggMSA9PSB0bE1ldGFJbmZvLnVjSXNXYWkgKSB8fAogICAgICAgKCAwID09IHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsICkgKQojZWxzZQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExIGlmIEZyYW1lIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAoIDAgPT0gdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgKSAmJgogICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uKSApCiNlbmRpZiAvLyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIHsKICAgIHZvc1N0YXR1cyA9ICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsICZ1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRsTWV0YUluZm8sICZ1Y1dEU0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFIZWFkU3BhY2UpOwogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3Igd2hlbiB0cmFuc2xhdGluZyBoZWFkZXIgV0xBTlRMX1NUQVR4Q29ubiIpKTsKCiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CgogICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgPSAxOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwoKICBpZiAoIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApCiAgewogICAgdWNUeXBlU3VidHlwZSB8PSAoV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEUpOwogIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIC8qIFRMIFN0YXRlIGRvZXMgbm90IHRyYW5zaXRpb24gdG8gQVVUSEVOVElDQVRFRCB0aWxsIEdUSyBpcyBpbnN0YWxsZWQsIFNvIGluCiAgICogY2FzZSBvZiBXUEEgd2hlcmUgR1RLIGhhbmRzaGFrZSBpcyBkb25lIGFmdGVyIHRoZSA0IHdheSBoYW5kc2hha2UsIHRoZQogICAqIHVuaWNhc3QgMi8yIEVBUE9MIHBhY2tldCBmcm9tIHRoZSBTVEEtPkFQIGhhcyB0byBiZSBlbmNyeXB0ZWQgZXZlbiBiZWZvcmUKICAgKiB0aGUgVEwgaXMgaW4gYXV0aGVudGljYXRlZCBzdGF0ZS4gU2luY2UgdGhlIFBUSyBoYXMgYmVlbiBpbnN0YWxsZWQKICAgKiBhbHJlYWR5IChhZnRlciB0aGUgNCB3YXkgaGFuZHNoYWtlKSB3ZSBtYWtlIHN1cmUgdGhhdCBhbGwgdHJhZmZpYwogICAqIGlzIGVuY3J5cHRlZCBoZW5jZWZvcnRoLihOb3RlOiBUTCBpcyBzdGlsbCBub3QgaW4gQVVUSEVOVElDQVRFRCBzdGF0ZSBzbwogICAqIHdlIHdpbGwgb25seSBhbGxvdyBFQVBPTCBkYXRhIG9yIFdBSSBpbiBjYXNlIG9mIFdBUEkpCiAgICovCiAgaWYgKHRsTWV0YUluZm8udWNJc0VhcG9sICYmIHBDbGllbnRTVEEtPnB0a0luc3RhbGxlZCkKICB7CiAgICB0eEZsYWcgPSAwOwogIH0KI2Vsc2UKICBpZiAocENsaWVudFNUQS0+cHRrSW5zdGFsbGVkKQogIHsKICAgIHR4RmxhZyA9IDA7CiAgfQojZW5kaWYKCiAgdm9zU3RhdHVzID0gKFZPU19TVEFUVVMpV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAmdkRlc3RNYWNBZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsLCAmdXNQa3RMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkLCB1Y1dEU0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFIZWFkU3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSwgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1RpZCwgdHhGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udXNUaW1lU3RhbXAsIHRsTWV0YUluZm8udWNJc0VhcG9sIHx8IHRsTWV0YUluZm8udWNJc1dhaSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0bE1ldGFJbmZvLnVjSXNBcnAsIHRsTWV0YUluZm8udWNVUCwgdGxNZXRhSW5mby51Y1R4QmRUb2tlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZpbGwgQkQgJWQiLCB2b3NTdGF0dXMpKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFVwZGF0ZSB0eCBjb3VudGVyIGZvciBCQSBzZXNzaW9uIHF1ZXJ5IGZvciB0eCBzaWRlCiAgICAhMSAtIHNob3VsZCB0aGlzIGJlIGRvbmUgZm9yIEVBUE9MIGZyYW1lcz8KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT5hdVR4Q291bnRbdWNUaWRdKys7CgogIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgKHZfUFZPSURfdClwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAgKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgZGF0YSB0byBpbnB1dCBwb2ludGVyIGZvciBUTCBjb3JlCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgLypzZWN1cml0eSBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOwoKICAvKiBUWCBTdGF0aXN0aWNzICovCiAgaWYgKCEodGxNZXRhSW5mby51Y0JjYXN0IHx8IHRsTWV0YUluZm8udWNNY2FzdCkpCiAgewogICAgLyogVGhpcyBpcyBUWCBVQyBmcmFtZSAqLwogICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0ZjbnQrKzsKICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNCY250ICs9IHVzUGt0TGVuOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFUeENvbm4gKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVR4QXV0aAoKICBERVNDUklQVElPTgogICAgVHJhbnNtaXQgaW4gYXV0aGVudGljYXRlZCBzdGF0ZSAtIGFsbCBkYXRhIGFsbG93ZWQKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB0eCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICBPdGhlciByZXR1cm4gdmFsdWVzIGFyZSBwb3NzaWJsZSBjb21pbmcgZnJvbSB0aGUgY2FsbGVkIGZ1bmN0aW9ucy4KICAgUGxlYXNlIGNoZWNrIEFQSSBmb3IgYWRkaXRpb25hbCBpbmZvLgoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFUeEF1dGgKKAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmLAogIHZfQk9PTF90ICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICAgdl9VMTZfdCAgICAgICAgICAgICAgIHVzUGt0TGVuOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgdm9zU3RhdHVzOwogICB2X01BQ0FERFJfdCAgICAgICAgICAgdkRlc3RNYWNBZGRyOwogICB2b3NfcGt0X3QqICAgICAgICAgICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgcFRMQ2IgICAgICAgPSBOVUxMOwogICBXTEFOVExfTWV0YUluZm9UeXBlICAgdGxNZXRhSW5mbzsKICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjVHlwZVN1YnR5cGUgPSAwOwogICBXTEFOVExfQUNFbnVtVHlwZSAgICAgdWNBQzsKICAgV0xBTlRMX0FDRW51bVR5cGUgICAgIHVjTmV4dEFDOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUaWQ7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1N3RnJtWHRsID0gMDsKICAgdl9VOF90ICAgICAgICAgICAgICAgIGV4dHJhSGVhZFNwYWNlID0gMDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUgKnBTdGFDbGllbnQgPSBOVUxMOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNXRFNFbmFibGVkID0gMDsKICAgdl9VMzJfdCAgICAgICAgICAgICAgIHVjVHhGbGFnICAgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNBQ01hc2ssIGk7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHB2b3NEYXRhQnVmZiApKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9TVEFUeEF1dGggVEwgJXBLIERCICVwSyIsCiAgICAgICAgICAgICBwVExDYiwgcHZvc0RhdGFCdWZmKSk7CiAgICBpZiAoTlVMTCAhPSBwdm9zRGF0YUJ1ZmYpCiAgICB7CiAgICAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICB9CiAgICBpZihOVUxMICE9IHBUTENiKQogICAgewogICAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgICAgIH0KICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNOb01vcmVEYXRhID0gMTsKICAgIH0KICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBTdGFDbGllbnQgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBTdGFDbGllbnQgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIHZvc19tZW1femVybygmdGxNZXRhSW5mbywgc2l6ZW9mKHRsTWV0YUluZm8pKTsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRmV0Y2ggcGFja2V0IGZyb20gSERECiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmICgoV0xBTl9TVEFfU09GVEFQICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAoIXZvc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSAmJgogICAgICAhcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCkKICB7CiNlbHNlCiAgaWYgKChXTEFOX1NUQV9TT0ZUQVAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICghdm9zX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkpKQogIHsKI2VuZGlmCiAgdWNBQyA9IHBTdGFDbGllbnQtPnVjQ3VycmVudEFDOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRGlzYWJsZSBBQyB0ZW1wb3JhcnkgLSBpZiBzdWNjZXNzZnVsbCByZXRyaWV2ZSByZS1lbmFibGUKICAgICAgVGhlIG9yZGVyIGlzIGp1c3RpZmllZCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBzY2VuYXJpbwogICAgICAgLSBUTCB0cnllcyB0byBmZXRjaCBwYWNrZXQgZm9yIEFDIGFuZCBpdCByZXR1cm5zIE5VTEwKICAgICAgIC0gVEwgYW5hbHl6ZXMgdGhlIGRhdGEgaXQgaGFzIHJlY2VpdmVkIHRvIHNlZSBpZiB0aGVyZSBhcmUKICAgICAgIGFueSBtb3JlIHBrdHMgYXZhaWxhYmxlIGZvciBBQyAtPiBpZiBub3QgVEwgd2lsbCBkaXNhYmxlIEFDCiAgICAgICAtIGhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCB3aGlsZSBhbmFseXppbmcgcmVzdWx0cyBUTCBnb3QKICAgICAgIHByZWVtcHRlZCBieSBhIHBlbmRpbmcgaW5kaWNhdGlvbiB3aGVyZSB0aGUgbWFzayB3YXMgYWdhaW4gc2V0CiAgICAgICBUTCB3aWxsIG5vdCBjaGVjayBhZ2FpbiBhbmQgYXMgYSByZXN1bHQgd2hlbiBpdCByZXN1bWVzCiAgICAgICBleGVjdXRpb24gaXQgd2lsbCBkaXNhYmxlIEFDCiAgICAgICBUbyBwcmV2ZW50IHRoaXMgdGhlIEFDIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSBhbmQgaWYgcmV0cmlldmUKICAgICAgIGlzIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgYmUgcmUtZW5hYmxlZAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBTdGFDbGllbnQtPmF1Y0FDTWFza1twU3RhQ2xpZW50LT51Y0N1cnJlbnRBQ10gPSAwOyAKCiAgLy8gZG9uJ3QgcmVzZXQgaXQsIGFzIG90aGVyIEFDIHF1ZXVlcyBpbiBIREQgbWF5IGhhdmUgcGFja2V0cwogIC8vdm9zX2F0b21pY19zZXRfVTgoICZwU3RhQ2xpZW50LT51Y1BrdFBlbmRpbmcsIDApOwogIH0KICBlbHNlCiAgewogICAgLy9zb2Z0YXAgY2FzZQogICAgdWNBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CiAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbdWNBQ10gPSAwOyAKCiAgICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICB9CgogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwU3RhQ2xpZW50LCB1Y0FDTWFzaywgaSk7IAogICAgLypZb3UgbWFrZSBhbiBpbml0aWFsIGFzc3VtcHRpb24gdGhhdCBIREQgaGFzIG5vIG1vcmUgZGF0YSBhbmQgaWYgdGhlIAogICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQgCiAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KICBpZiAoIDAgPT0gdWNBQ01hc2sgKQogIHsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICAgIHBTdGFDbGllbnQtPnVjTm9Nb3JlRGF0YSA9IDE7CiAgfQoKICB2b3NTdGF0dXMgPSBwU3RhQ2xpZW50LT5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0FDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAmdGxNZXRhSW5mbyApOwoKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8ICggTlVMTCA9PSB2b3NEYXRhQnVmZiApKQogIHsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmZXRjaCBwa3QgZnJvbSBIREQgUUlkOiVkIHN0YXR1czolZCIsCiAgICAgICAgICAgICAgIHVjQUMsIHZvc1N0YXR1cyk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgUmVzZXQgQUMgZm9yIHRoZSBzZXJ2aWNlZCBzdGF0aW9uIHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IEFDCiAgICAgIC0+IGR1ZSB0byBubyBtb3JlIGRhdGEgYXQgdGhlIHN0YXRpb24KICAgICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgICBtYWRlIGluIHRoZSBtYWluIFRMIGxvb3AKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19ISUdIX1BSSU87CiAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSAwOwoKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICBXTEFOVExfU3RhdEhhbmRsZVRYRnJhbWUocHZvc0dDdHgsIHVjU1RBSWQsIHZvc0RhdGFCdWZmLCBOVUxMLCAmdGxNZXRhSW5mbyk7CgogIC8qVGhlcmUgYXJlIHN0aWxsIHBhY2tldHMgaW4gSEREIC0gc2V0IGJhY2sgdGhlIHBlbmRpbmcgcGFja2V0cyBhbmQgCiAgIHRoZSBubyBtb3JlIGRhdGEgYXNzdW1wdGlvbiovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwU3RhQ2xpZW50LT51Y1BrdFBlbmRpbmcsIDEpOwogIHBTdGFDbGllbnQtPnVjTm9Nb3JlRGF0YSA9IDA7CgogIGlmIChXTEFOX1NUQV9TT0ZUQVAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpCiAgewogIC8vIGRvbid0IG5lZWQgdG8gc2V0IGl0LCBhcyB3ZSBkb24ndCByZXNldCBpdCBpbiB0aGlzIGZ1bmN0aW9uLgogIC8vdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcsIDEpOwogIH0KCiNpZmRlZiBXTEFOX1BFUkYgCiAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9CQUwsIAogICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpMCk7CiNlbmRpZiAvKldMQU5fUEVSRiovCgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIFRJRAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgdWNUaWQgICAgID0gdGxNZXRhSW5mby51Y1RJRDsKCiAgLypNYWtlIHN1cmUgVElEIGlzIHZhbGlkKi8KICBpZiAoIFdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkpIAogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRJRCBzZW50IGluIG1ldGEgaW5mbyAlZCAtIGRlZmF1bHRpbmcgdG8gMCAoQkUpIiwgCiAgICAgICAgICAgICB1Y1RpZCkpOwogICAgIHVjVGlkID0gMDsgCiAgfQoKICAvKlNhdmUgZm9yIFVBUFNEIHRpbWVyIGNvbnNpZGVyYXRpb24qLwogIHBTdGFDbGllbnQtPnVjU2VydmljZWRBQyA9IHVjQUM7IAoKICBpZiAoIHVjQUMgPT0gcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgKSAKICB7CiAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbcFN0YUNsaWVudC0+dWNDdXJyZW50QUNdID0gMTsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodC0tOwogIH0KICBlbHNlCiAgewogICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgICAgID0gdWNBQzsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNBQ10gLSAxOwoKICAgIHBTdGFDbGllbnQtPmF1Y0FDTWFza1twU3RhQ2xpZW50LT51Y0N1cnJlbnRBQ10gPSAxOwoKICB9CgogIGlmIChXTEFOX1NUQV9TT0ZUQVAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpCiAgewogIGlmICggMCA9PSBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgKSAKICB7CiAgICBXTEFOVExfQUNFbnVtVHlwZSB0ZW1wQUMgPSB1Y0FDOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgQ2hvb3NlIG5leHQgQUMgLSAhISEgb3B0aW1pemUgbWUKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHdoaWxlICggMCAhPSB1Y0FDTWFzayApIAogICAgewogICAgICBpZih0ZW1wQUMgPT0gV0xBTlRMX0FDX0JLKQogICAgICAgICB1Y05leHRBQyA9IFdMQU5UTF9BQ19ISUdIX1BSSU87CiAgICAgIGVsc2UKICAgICAgICAgdWNOZXh0QUMgPSAodGVtcEFDIC0gMSk7CgogICAgICBpZiAoIDAgIT0gcFN0YUNsaWVudC0+YXVjQUNNYXNrW3VjTmV4dEFDXSApCiAgICAgIHsKICAgICAgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgICAgID0gdWNOZXh0QUM7CiAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNOZXh0QUNdOwoKICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQ2hhbmdpbmcgc2VydmljZWQgQUMgdG86ICVkIHdpdGggV2VpZ2h0OiAlZCIsCiAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgLCAKICAgICAgICAgICAgICAgICAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQpKTsKICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGVtcEFDID0gdWNOZXh0QUM7CiAgICB9CiAgfQogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkF0dGFjaGluZyBCRCBoZWFkZXIgdG8gcGt0IG9uIFdMQU5UTF9TVEFUeEF1dGgiKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwID09IHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsICkKICB7CiAgICAgLyogTmVlZHMgZnJhbWUgdHJhbnNsYXRpb24gKi8KICAgICAvLyBpZiB0aGUgY2xpZW50IGhhcyBub3QgZW5hYmxlZCBTVy1vbmx5IGZyYW1lIHRyYW5zbGF0aW9uCiAgICAgLy8gYW5kIGlmIHRoZSBmcmFtZSBpcyBhIHVuaWNhc3QgZnJhbWUKICAgICAvLyAgIChIVyBmcmFtZSB0cmFuc2xhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGJyb2FkY2FzdCBkb21haW5zCiAgICAgLy8gICAgc28gd2UgdXNlIFNXIGZyYW1lIHRyYW5zbGF0aW9uIGZvciBicm9hZGNhc3QvbXVsdGljYXN0IGZyYW1lcykKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgICAgLy8gYW5kIGlmIHRoZSBmcmFtZSBpcyBub3QgYSBXQVBJIGZyYW1lCiNlbmRpZgogICAgIC8vIHRoZW4gdXNlIEhXX2Jhc2VkIGZyYW1lIHRyYW5zbGF0aW9uCgogICAgIGlmICggKCAwID09IHBTdGFDbGllbnQtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiApICYmCiAgICAgICAgICAoIDAgPT0gdGxNZXRhSW5mby51Y0JjYXN0ICkgJiYKICAgICAgICAgICggMCA9PSB0bE1ldGFJbmZvLnVjTWNhc3QgKQojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgICAgICAgICYmICggdGxNZXRhSW5mby51Y0lzV2FpICE9IDEgKQojZW5kaWYKICAgICAgICApCiAgICAgewojaWZkZWYgV0xBTl9QRVJGIAogICAgICAgIHZfVTMyX3QgdUZhc3RGd2RPSyA9IDA7CgogICAgICAgIC8qIEhXIGJhc2VkIHRyYW5zbGF0aW9uLiBTZWUgaWYgdGhlIGZyYW1lIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkICovCiAgICAgICAgV0RBX1RMSV9GYXN0SHdGd2REYXRhRnJhbWUoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiAsICZ2b3NTdGF0dXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1RmFzdEZ3ZE9LLCAmdGxNZXRhSW5mbywgJnBTdGFDbGllbnQtPndTVEFEZXNjKTsKCiAgICAgICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMgKQogICAgICAgIHsKICAgICAgICAgICAgaWYodUZhc3RGd2RPSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogUGFja2V0IGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkIG5vdyAqLwogICAgICAgICAgICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcFN0YUNsaWVudC0+cGZuU1RBVHhDb21wICk7CgogICAgICAgICAgICAgICAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOwoKICAgICAgICAgICAgICAgIC8qIFRPRE86IERvIHdlIHJlYWxseSBuZWVkIHRvIHVwZGF0ZSBXTEFOVExfSFNIYW5kbGVUWEZyYW1lKCkgCiAgICAgICAgICAgICAgICAgICBzdGF0cyBmb3IgZXZlcnkgcGt0PyAqLwogICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+YXVUeENvdW50W3RsTWV0YUluZm8udWNUSURdKys7CiAgICAgICAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogY2FuJ3QgYmUgZmFzdCBmb3J3YXJkZWQsIGZhbGwgdGhyb3VnaCBub3JtYWwgKHNsb3cpIHBhdGguICovCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CgogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmFzdEZ3ZCBCRCAlZCIsIHZvc1N0YXR1cykpOwogICAgICAgICAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgICB9CiNlbmRpZiAvKldMQU5fUEVSRiovCiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgLyogU1cgYmFzZWQgdHJhbnNsYXRpb24gKi8KCiAgICAgICB2b3NTdGF0dXMgPSAgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLCAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bE1ldGFJbmZvLCAmdWNXRFNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhSGVhZFNwYWNlKTsKICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3Igd2hlbiB0cmFuc2xhdGluZyBoZWFkZXIgV0xBTlRMX1NUQVR4QXV0aCIpKTsKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICB9CgogICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMIHNvZnR3YXJlIHRyYW5zbGF0aW9uIHN1Y2Nlc3MiKSk7CiAgICAgICB1Y1N3RnJtWHRsID0gMTsKICAgICAgIHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsID0gMTsKICAgIH0KICB9CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgLypJbiBjYXNlIG9mIFRETFMsIGlmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgdG8gVERMUyBTVEEgdWNTVEFJZCBtYXkKICAgICAgY2hhbmdlLiBzbyB1cGRhdGUgdGhlIHBTdGFDbGllbnQgYWNjb3JkaW5nbHkgKi8KICAgIHBTdGFDbGllbnQgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgICBpZiAoIE5VTEwgPT0gcFN0YUNsaWVudCApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJwU3RhQ2xpZW50IGlzIE5VTEwgJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KI2VuZGlmCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwoKICBpZiAoIHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApIAogIHsKICAgIHVjVHlwZVN1YnR5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFKTsKICB9CgogIC8qIHVjQUMgbm93IHBvaW50cyB0byBUTCBRIElEIHdpdGggYSBuZXcgcXVldWUgYWRkZWQgaW4gVEwsCiAgICogaGVuY2UgbG9vayBmb3IgdGhlIHVhcHNkIGluZm8gZm9yIHRoZSBjb3JyZWN0IEFDIHRoYXQKICAgKiB0aGlzIHBhY2tldCBiZWxvbmdzIHRvLgogICAqLwogIHVjVHhGbGFnICA9ICgwICE9IHBTdGFDbGllbnQtPndVQVBTREluZm9bdGxNZXRhSW5mby5hY10udWNTZXQpPwogICAgICAgICAgICAgIEhBTF9UUklHR0VSX0VOQUJMRURfQUNfTUFTSzowOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y0lzV2FwaVN0YSA9PSAxICkKICB7CiNpZmRlZiBMSUJSQV9XQVBJX1NVUFBPUlQKICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfV0FQSV9TVEFfTUFTSzsKI2VuZGlmIC8vTElCUkFfV0FQSV9TVVBQT1JUCiAgICBpZiAoIHRsTWV0YUluZm8udWNJc1dhaSA9PSAxICkgCiAgICB7CiAgICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfVFhfTk9fRU5DUllQVElPTl9NQVNLOwogICAgfQogIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmICggcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUgPT0gV0xBTl9TVEFfVERMUyApCiAgewogICAgdWNUeEZsYWcgPSB1Y1R4RmxhZyB8IEhBTF9URExTX1BFRVJfU1RBX01BU0s7CiAgfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KICBpZiggdGxNZXRhSW5mby51Y0lzQXJwICkKICB7CiAgICBpZiAocFRMQ2ItPnRyYWNrX2FycCkKICAgIHsKICAgICAgIGlmICh2b3NfY2hlY2tfYXJwX3RhcmdldF9pcCh2b3NEYXRhQnVmZikpCiAgICAgICB7CiAgICAgICAgICB1Y1R4RmxhZyB8PSBIQUxfVVNFX0ZXX0lOX1RYX1BBVEg7CiAgICAgICAgICB1Y1R4RmxhZyB8PSBIQUxfVFhDT01QX1JFUVVFU1RFRF9NQVNLOwogICAgICAgICAgdGxNZXRhSW5mby51Y1R4QmRUb2tlbiA9ICsrIHBUTENiLT50eGJkX3Rva2VuOwogICAgICAgfQogICAgfQoKICAgIGlmIChwU3RhQ2xpZW50LT5hcnBPbldRNSkKICAgIHsKICAgICAgICB1Y1R4RmxhZyB8PSBIQUxfVVNFX0ZXX0lOX1RYX1BBVEg7CiAgICB9CiAgICBpZiAocFN0YUNsaWVudC0+YXJwUmF0ZSA9PSAwKQogICAgewogICAgICAgIHVjVHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURV8xX01BU0s7CiAgICB9CiAgICBlbHNlIGlmIChwU3RhQ2xpZW50LT5hcnBSYXRlID09IDEgfHwgcFN0YUNsaWVudC0+YXJwUmF0ZSA9PSAzKQogICAgewogICAgICAgIHBTdGFDbGllbnQtPmFycFJhdGUgXj0gMHgyOwogICAgICAgIHVjVHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURV8xX01BU0s8PChwU3RhQ2xpZW50LT5hcnBSYXRlLTEpOwogICAgfQogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgImFycCBwa3Qgc2VuZGluZyBvbiBCRCByYXRlOiAlaGh1IiwgcFN0YUNsaWVudC0+YXJwUmF0ZSkpOwogIH0KCiAgdm9zU3RhdHVzID0gKFZPU19TVEFUVVMpV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgCiAgICAgICAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmICwgJnZEZXN0TWFjQWRkciwKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwsICZ1c1BrdExlbiwKICAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+d1NUQURlc2MudWNRb3NFbmFibGVkLCB1Y1dEU0VuYWJsZWQsIAogICAgICAgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSwgJnBTdGFDbGllbnQtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgdWNUaWQsIHVjVHhGbGFnLCB0bE1ldGFJbmZvLnVzVGltZVN0YW1wLCAKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0lzRWFwb2wsIHRsTWV0YUluZm8udWNJc0FycCwgdGxNZXRhSW5mby51Y1VQLAogICAgICAgICAgICAgICAgICAgICB0bE1ldGFJbmZvLnVjVHhCZFRva2VuKTsKCiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJGaWxsIFRYIEJEIEVycm9yIHN0YXR1cyAlZCIsIHZvc1N0YXR1cykpOwoKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICAvKiBUWCBTdGF0aXN0aWNzICovCiAgaWYgKCEodGxNZXRhSW5mby51Y0JjYXN0IHx8IHRsTWV0YUluZm8udWNNY2FzdCkpCiAgewogICAgLyogVGhpcyBpcyBUWCBVQyBmcmFtZSAqLwogICAgcFN0YUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0ZjbnQrKzsKICAgIHBTdGFDbGllbnQtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNCY250ICs9IHVzUGt0TGVuOwogIH0KCiNpZm5kZWYgRkVBVFVSRV9XTEFOX1RETFMKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBVcGRhdGUgdHggY291bnRlciBmb3IgQkEgc2Vzc2lvbiBxdWVyeSBmb3IgdHggc2lkZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBTdGFDbGllbnQtPmF1VHhDb3VudFt1Y1RpZF0rKzsKI2Vsc2UKICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+YXVUeENvdW50W3VjVGlkXSsrOwojZW5kaWYKCiAgLyogVGhpcyBjb2RlIGlzIHRvIHNlbmQgdHJhZmZpYyB3aXRoIGxvd2VyIHByaW9yaXR5IEFDIHdoZW4gd2UgZG9lcyBub3QgCiAgICAgZ2V0IGFkbWl0dGVkIHRvIHNlbmQgaXQuIFRvZGF5IEhBTCBkb2VzIG5vdCBkb3duZ3JhZGUgQUMgc28gdGhpcyBjb2RlIAogICAgIGRvZXMgbm90IGdldCBleGVjdXRlZC4oSW4gb3RoZXIgd29yZHMsIEhBTCBkb2VzbpJ0IGNoYW5nZSB0aWQuIFRoZSBpZiAKICAgICBzdGF0ZW1lbnQgaXMgYWx3YXlzIGZhbHNlLikKICAgICBOT1RFOiBJbiB0aGUgY2FzZSBvZiBMQSBkb3duZ3JhZGUgb2NjdXJzIGluIEhERCAodGhhdCB3YXMgdGhlIGNoYW5nZSAKICAgICBQaGFuaSBtYWRlIGR1cmluZyBXTU0tQUMgcGx1Z2Zlc3QpLiBJZiBXTSAmIEJNUCBhbHNvIHRvb2sgdGhpcyBhcHByb2FjaCwgCiAgICAgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIG5lZWQgZm9yIGFueSBBQyBkb3duZ3JhZGUgbG9naWMgaW4gVEwvV0RJLiAgICovCiNpZiAwCiAgaWYgKCggdWNUaWQgIT0gdGxNZXRhSW5mby51Y1RJRCApICYmCiAgICAgICggMCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgKSAmJiAKICAgICAgKCAwICE9IHVjU3dGcm1YdGwgKSkKICB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAhISBGSVggbWU6IE9uY2UgZG93bmdyYWRpbmcgaXMgY2xlYXIgcHV0IGluIHRoZSBwcm9wZXIgY2hhbmdlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdWNRQ09mZnNldCA9IFdMQU5IQUxfVFhfQkRfSEVBREVSX1NJWkUgKyBXTEFOVExfODAyXzExX0hFQURFUl9MRU47CgogICAgLy8hISFGaXggdGhpcyByZXBsYWNlIHBlZWsgd2l0aCBleHRyYWN0IAogICAgdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0RhdGFCdWZmLCB1Y1FDT2Zmc2V0LCh2X1BWT0lEX3QpJnB1Y1Fvc0N0cmwsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwdWNRb3NDdHJsKSk7CiAgICAqcHVjUW9zQ3RybCA9IHVjVGlkOyAvLz8gcHJvcGVyIGJ5dGUgb3JkZXIKICB9CiNlbmRpZgoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmlsbCBCRCAlZCIsIHZvc1N0YXR1cykpOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwU3RhQ2xpZW50LT5wZm5TVEFUeENvbXAgKTsKCiAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOwoKICAvKkJFICYgQksgY2FuIGJlIGRlbGF5ZWQsIFZPIGFuZCBWSSBub3QgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KICBpZiAoIHBTdGFDbGllbnQtPnVjU2VydmljZWRBQyA+IFdMQU5UTF9BQ19CRSApIAogIHsKICAgIHBUTENiLT5iVXJnZW50PSBUUlVFOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFUeEF1dGggKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhEaXNjCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgLSBubyBkYXRhIGFsbG93ZWQKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB0eCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVR4RGlzYwooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgcFRMQ2IgICAgICAgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBVHhBdXRoIikpOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVycm9yCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICJXTEFOIFRMOlBhY2tldCBzaG91bGQgbm90IGJlIHRyYW5zbWl0dGVkIGluIHN0YXRlIGRpc2Nvbm5lY3RlZCBpZ25vcmluZyIKICAgICAgICAgICAgIiByZXF1ZXN0IikpOwoKICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMTsKICAgCiAgIC8vU2hvdWxkIG5vdCBiZSBhbnl0aGluZyBwZW5kaW5nIGluIGRpc2Nvbm5lY3Qgc3RhdGUKICAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDApOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVR4RGlzYyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeENvbm4KCiAgREVTQ1JJUFRJT04KICAgIFJlY2VpdmUgaW4gY29ubmVjdGVkIHN0YXRlIC0gb25seSBFQVBPTAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4L3J4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUnhDb25uCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICAgICBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICBwQ2xpZW50U1RBID0gTlVMTDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzUGt0TGVuOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNBY3R1YWxITGVuID0gMDsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZjsKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgIGF1Y0JESGVhZGVyOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNUaWQ7CiAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgICB3UnhNZXRhSW5mbzsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfU1RBUnhDb25uIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwLypTd2FwIEJEKi8gKTsKCiAgaWYgKCBOVUxMID09IGF1Y0JESGVhZGVyICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgIFZPU19BU1NFUlQoIDAgKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKCiAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQoYXVjQkRIZWFkZXIpOwogIHVzTVBEVURPZmZzZXQgPSAodl9VMTZfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQoYXVjQkRIZWFkZXIpOwogIHVzTVBEVUxlbiAgICAgPSAodl9VMTZfdClXREFfR0VUX1JYX01QRFVfTEVOKGF1Y0JESGVhZGVyKTsKICB1Y01QRFVITGVuICAgID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihhdWNCREhlYWRlcik7CiAgdWNUaWQgICAgICAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoYXVjQkRIZWFkZXIpOwoKICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBwcm9jZXNzaW5nIGRhdGE6IEhPICVkIERPICVkIExlbiAlZCBITGVuICVkIiwKICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQsIHVzTVBEVURPZmZzZXQsIHVzTVBEVUxlbiwgdWNNUERVSExlbikpOwoKICAgIC8qSXQgd2lsbCBjdXQgb3V0IHRoZSA4MDIuMTEgaGVhZGVyIGlmIG5vdCB1c2VkKi8KICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfVHJpbVJ4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYgKSApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRFdGhlclR5cGUoYXVjQkRIZWFkZXIsdm9zRGF0YUJ1ZmYsdWNNUERVSExlbiwmdXNFdGhlclR5cGUpOwogIAogIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCiAgewojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgIC8qIElmIGZyYW1lIGlzIG5laXRoZXIgYW4gRUFQT0wgZnJhbWUgbm9yIGEgV0FJIGZyYW1lIHRoZW4gd2UgZHJvcCB0aGUgZnJhbWUqLwogICAgLyogVE9ETzogRG8gd2UgbmVlZCBhIGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gV0FQSSBtb2RlPyBJZiBub3QgaXMgaXQgcG9zc2libGUgKi8KICAgIC8qIHRoYXQgd2UgZ2V0IGFuIEVBUE9MIHBhY2tldCBpbiBXQVBJIG1vZGUgb3IgdmljZSB2ZXJzYT8gKi8KICAgIGlmICggV0xBTlRMX0xMQ184MDIxWF9UWVBFICAhPSB1c0V0aGVyVHlwZSAmJiBXTEFOVExfTExDX1dBSV9UWVBFICAhPSB1c0V0aGVyVHlwZSApCiAgICB7CiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6UlggRnJhbWUgbm90IEVBUE9MIG9yIFdBSSBFdGhlclR5cGUgJWQgLSBkcm9wcGluZyIsIHVzRXRoZXJUeXBlICk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICB9CiNlbHNlCiAgICBpZiAoIFdMQU5UTF9MTENfODAyMVhfVFlQRSAgIT0gdXNFdGhlclR5cGUgKQogICAgewogICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSWCBGcmFtZSBub3QgRUFQT0wgRXRoZXJUeXBlICVkIC0gZHJvcHBpbmciLCB1c0V0aGVyVHlwZSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwogICAgZWxzZSAvKiBGcmFtZSBpcyBhbiBFQVBPTCBmcmFtZSBvciBhIFdBSSBmcmFtZSovICAKICAgIHsKICAgICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLAogICAgICAgICAgICAgICAgICAgVFJBQ0VfQ09ERV9UTF9SWF9DT05OX0VBUE9MLCB1Y1NUQUlkLCB1c0V0aGVyVHlwZSApKTsKCiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6UlggRnJhbWUgIEVBUE9MIEV0aGVyVHlwZSAlZCAtIHByb2Nlc3NpbmciLCB1c0V0aGVyVHlwZSk7CgogICAgICBpZiAoKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikgKSAmJgogICAgICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSkKICAgICAgewogICAgICBpZiAodXNNUERVRE9mZnNldCA+IHVjTVBEVUhPZmZzZXQpCiAgICAgIHsKICAgICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICAgIH0KCiAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsIHVzQWN0dWFsSExlbiwgCiAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYiwgdWNTVEFJZCwgYkZvcndhcmRJQVBQd2l0aExMQyk7CgogICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAogICAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gdHJhbnNsYXRlIGZyb20gODAyLjExIHRvIDgwMi4zIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBJbmNyZW1lbnQgcmVjZWl2ZSBjb3VudGVyCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBpZiAoICFXTEFOVExfVElEX0lOVkFMSUQoIHVjVGlkKSApIAogICAgICB7CiAgICAgICAgcENsaWVudFNUQS0+YXVSeENvdW50W3VjVGlkXSsrOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCB0aWQgICVkIChTdGF0aW9uIElEICVkKSBvbiAlcyIsCiAgICAgICAgICAgICAgIHVjVGlkLCB1Y1NUQUlkLCBfX2Z1bmNfXykpOwogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgICB9CgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIEVBUG9MIGZyYW1lIHRvIHN0YXRpb24gJWQgQUMgJWQiLCB1Y1NUQUlkLCB1Y1RpZCkpOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICEhIUFzc3VtaW5nIFRJRCA9IFVQIG1hcHBpbmcgCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB3UnhNZXRhSW5mby51Y1VQID0gdWNUaWQ7CgogICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICJXTEFOIFRMICVzOlNlbmRpbmcgZGF0YSBjaGFpbiB0byBzdGF0aW9uIiwgX19mdW5jX18pKTsKICAgICAgaWYgKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogICAgICB7CiAgICAgICAgd1J4TWV0YUluZm8udWNEZXNTVEFJZCA9IFdMQU5fUlhfU0FQX1NFTEZfU1RBX0lEOwogICAgICAgIHBDbGllbnRTVEEtPnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogICAgfS8qRUFQT0wgZnJhbWUgb3IgV0FJIGZyYW1lKi8KICB9Lyp2b3Mgc3RhdHVzIHN1Y2Nlc3MqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4Q29ubiAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9Gd2RQa3RUb0hERAoKICBERVNDUklQVElPTgogICAgRGV0ZXJtaW5lIHRoZSBEZXN0YXRpb24gU3RhdGlvbiBJRCBhbmQgcm91dGUgdGhlIEZyYW1lIHRvIFVwcGVyIExheWVyCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUwpXTEFOVExfRndkUGt0VG9IREQKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICBwdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQKKQp7CiAgIHZfTUFDQUREUl90ICAgICAgICAgICAgICBEZXN0TWFjQWRkcmVzczsKICAgdl9NQUNBRERSX3QgICAgICAgICAgICAgICpwRGVzdE1hY0FkZHJlc3MgPSAmRGVzdE1hY0FkZHJlc3M7CiAgIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c01hY0FkZFNpemUgPSBWT1NfTUFDX0FERFJfU0laRTsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgIHBDbGllbnRTVEEgPSBOVUxMOwogICB2b3NfcGt0X3QqICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYgOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2X1UzMl90KiAgICAgICAgICAgICAgICAgU1RBTWV0YUluZm9QdHI7CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NOZXh0RGF0YUJ1ZmYgOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNEZXNTVEFJZDsKICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSB8fCAoIE5VTEwgPT0gKCB2b3NEYXRhQnVmZiA9IHB2b3NEYXRhQnVmZiApKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfRndkUGt0VG9IZGQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0Z3ZFBrdFRvSGRkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmKFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsInVjU1RBSWQgJWQgaXMgbm90IHZhbGlkIiwKICAgICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogICAvKiBUaGlzIHRoZSBjaGFuZ2UgcmVxdWlyZWQgZm9yIFNvZnRBcCB0byBoYW5kbGUgUmVvcmRlcmVkIEJ1ZmZlci4gU2luY2UgYSBTVEEKICAgICAgbWF5IGhhdmUgcGFja2V0cyBkZXN0aW5lZCB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMgd2UgaGF2ZSB0byBwcm9jZXNzIGVhY2ggcGFja2V0CiAgICAgIGF0IGEgdGltZSBhbmQgZGV0ZXJtaW5lIGl0cyBEZXN0aW5hdGlvbi4gU28gdGhlIFZvc2NoYWluIHByb3ZpZGVkIGJ5IFJlb3JkZXIgY29kZQogICAgICBpcyB1bmNoYWluIGFuZCBmb3J3YXJkZWQgdG8gVXBwZXIgTGF5ZXIgYWZ0ZXIgRGV0ZXJtaW5pbmcgdGhlIERlc3RpbmF0aW9uICovCgogICB2b3NEYXRhQnVmZiA9IHB2b3NEYXRhQnVmZjsKICAgd2hpbGUgKHZvc0RhdGFCdWZmICE9IE5VTEwpCiAgIHsKICAgICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NOZXh0RGF0YUJ1ZmYsIDEvKnRydWUqLyApOwogICAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QgKikmU1RBTWV0YUluZm9QdHIgKTsKICAgICAgd1J4TWV0YUluZm8udWNVUCA9ICh2X1U4X3QpKCh1aW50cHRyX3QpU1RBTWV0YUluZm9QdHIgJiBXTEFOVExfQUNfTUFTSyk7CiAgICAgIHVjRGVzU1RBSWQgPSAodl9VOF90KSgoKHVpbnRwdHJfdClTVEFNZXRhSW5mb1B0cikgPj4gV0xBTlRMX1NUQUlEX09GRlNFVCk7CiAgICAgICAKICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCAwLCAodl9WT0lEX3QgKilwRGVzdE1hY0FkZHJlc3MsICZ1c01hY0FkZFNpemUpOwogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICB7CiAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiByZWN2IGNvcnJ1cHRlZCBkYXRhIHBhY2tldCIpKTsKICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgfQoKICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICAgICAic3RhdGlvbiBtYWMgIk1BQ19BRERSRVNTX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkocERlc3RNYWNBZGRyZXNzLT5ieXRlcykpKTsKCiAgICAgIGlmICh2b3NfaXNfbWFjYWRkcl9icm9hZGNhc3QoIHBEZXN0TWFjQWRkcmVzcyApIHx8IHZvc19pc19tYWNhZGRyX2dyb3VwKHBEZXN0TWFjQWRkcmVzcykpCiAgICAgIHsKICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGlzIG1jL2JjIHN0YXRpb24KICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX0JDTUNfU1RBX0lEOwogICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgIiVzOiBCQy9NQyBwYWNrZXQsIGlkICVkIiwgX19mdW5jX18sIFdMQU5fUlhfQkNNQ19TVEFfSUQpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgaWYgKHZvc19pc19tYWNhZGRyX2VxdWFsKHBEZXN0TWFjQWRkcmVzcywgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcykpCiAgICAgICAgIHsKICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gaXMgQVAgaXRzZWxmCiAgICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRDsKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgICIlczogcGFja2V0IHRvIEFQIGl0c2VsZiwgaWQgJWQiLCBfX2Z1bmNfXywgV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICgoIFdMQU5fTUFYX1NUQV9DT1VOVCA8PSB1Y0Rlc1NUQUlkICkgfHwgKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNEZXNTVEFJZF0gJiYgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNEZXNTVEFJZF0tPnVjRXhpc3RzID09IDApKQogICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHN0YXRpb24gaXMgc29tZXRoaW5nIGVsc2UKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgIiVzOiBnZXQgYW4gc3RhdGlvbiBpbmRleCBsYXJnZXIgdGhhbiBXTEFOX01BWF9TVEFfQ09VTlQgJWQiLCBfX2Z1bmNfXywgdWNEZXNTVEFJZCkpOwogICAgICAgICAgICB1Y0Rlc1NUQUlkID0gV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQ7CiAgICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAvL2xvb3BiYWNrIHVuaWNhc3Qgc3RhdGlvbiBjb21lcyBoZXJlCiAgICAgIH0KCiAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSAodl9VOF90KSgodWludHB0cl90KVNUQU1ldGFJbmZvUHRyICYgV0xBTlRMX0FDX01BU0spOwogICAgICB3UnhNZXRhSW5mby51Y0Rlc1NUQUlkID0gdWNEZXNTVEFJZDsKICAgICAKICAgICAgdm9zU3RhdHVzID0gcENsaWVudFNUQS0+cGZuU1RBUngoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiwgdWNEZXNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd1J4TWV0YUluZm8gKTsKICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IGZhaWxlZCB0byBzZW5kIHBrdCB0byBIREQiKSk7CiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwoKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgIH0KICAgICAgdm9zRGF0YUJ1ZmYgPSB2b3NOZXh0RGF0YUJ1ZmY7CiAgIH0KICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX1NDQU5fT0ZGTE9BRAp2b2lkIFdMQU5UTF9TdG9wUnhSYXRlTW9uaXRvcih2X1BWT0lEX3QgcHZvc0dDdHgpCnsKICAgV0xBTlRMX0NiVHlwZSAqcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgaWYgKCFwVExDYikKICAgICByZXR1cm47CiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5ydW5uaW5nID0gZVdMQU5fUEFMX0ZBTFNFOwp9Cgp2b2lkIFdMQU5UTF9TdGFydFJ4UmF0ZU1vbml0b3Iodl9QVk9JRF90IHB2b3NHQ3R4LCB2X1U4X3Qgc3RhSWQsCiAgICAgICAgICAgICAgICAgIHZfVTE2X3QgbWluUmF0ZSwKICAgICAgICAgICAgICAgICAgdl9VMTZfdCBtYXhSYXRlLCB2X1U4X3QgbWluUGVyY2VudGFnZSwKICAgICAgICAgICAgICAgICAgdl9VMTZfdCBtaW5Qa3RSZXF1aXJlZCwgdm9pZCAqaEhhbCwKICAgICAgICAgICAgICAgICAgdl9VNjRfdCB0aW1lVG9XYWl0LAogICAgICAgICAgICAgICAgICB2b2lkICgqdHJpZ2dlclJvYW1TY2FuZm4pICh2b2lkICosIHZfVThfdCkpCnsKCiAgIFdMQU5UTF9DYlR5cGUgKnBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgIGlmICghcFRMQ2IpCiAgICAgcmV0dXJuOwoKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnJ1bm5pbmcgPSBlV0xBTl9QQUxfVFJVRTsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4ID0gMDsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmxhc3RUcmlnZ2VyVGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyk7CiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5tYXhSYXRlID0gbWF4UmF0ZTsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLm1pblJhdGUgPSBtaW5SYXRlOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuc3RhSWQgPSBzdGFJZDsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLm1pblBlcmNlbnRhZ2UgPSBtaW5QZXJjZW50YWdlOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudGltZVRvV2FpdCA9IHRpbWVUb1dhaXQgKiAxMDAwOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW50aWFsUGt0VG9TdGFydCA9IDA7CiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5taW5Qa3RSZXF1aXJlZCA9IG1pblBrdFJlcXVpcmVkOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudHJpZ2dlclJvYW1TY2FuZm4gPSB0cmlnZ2VyUm9hbVNjYW5mbjsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmhIYWwgPSBoSGFsOwogICB2b3NfbWVtX3plcm8ocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnJ4Um9hbVN0YXRzLCBST0FNX01BWF9JTkRFWF9OVU0gKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXTEFOVExfUm9hbVRyYWZmaWNTdGF0c1R5cGUpKTsKICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RJLCBWT1NfVFJBQ0VfTEVWRUxfREVCVUcsCiAgICAgICAic3RhSWQ9JWQsIG1pblJhdGU9JWQgbWF4UmF0ZT0lZCBtaW5QZXJjZW50YWdlPSVkIG1pblBrdFJlcXVpcmVkPSVkIiwKICAgICAgIHN0YUlkLCBtaW5SYXRlLCBtYXhSYXRlLCBtaW5QZXJjZW50YWdlLCBtaW5Qa3RSZXF1aXJlZCk7Cn0KCnZvaWQgc3RhdGljIFdMQU5UTF9DbGVhckFsbFJvYW1TdGF0cyhXTEFOVExfQ2JUeXBlICpwVExDYikKewogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXggPSAwOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QgPSAwOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMubG93UmF0ZVBrdCA9IDA7CiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5pbnRpYWxQa3RUb1N0YXJ0ID0gMDsKICAgdm9zX21lbV96ZXJvKHBUTENiLT5nRHNSeFJvYW1TdGF0cy5yeFJvYW1TdGF0cywgUk9BTV9NQVhfSU5ERVhfTlVNICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0xBTlRMX1JvYW1UcmFmZmljU3RhdHNUeXBlKSk7Cn0KCi8qCiAqIFdMQU5UTF9DbGVhclJvYW1TdGF0c1RpbGxJbmRleCA6IFRoaXMgQVBJIHdpbGwgY2xlYXIgb2xkZXIgZGF0YQogKiBhdCB0aGUgaW5kZXhlcy4KICoKICogU2luY2UgaXRzIGEgY2lyY3VsYXIgYnVmZmVyIHdlIGRvbid0IGtub3cgaWYgd2UgYXJlIGZpbGxpbmcKICogZGF0YSBmaXJzdCB0aW1lIG9yIHNvbWUgb2xkZXIgZGF0YSB3YXMgYWxyZWFkeSBwcmVzZW50IGF0CiAqIHRoZSBpbmRleC4gSW4gdGhhdCBjYXNlIHdlIHNob3VsZCBjbGVhciB0aGUgb2xkZXIgZGF0YSBmcm9tCiAqIGN1cnJlbnQgaW5kZXggdG8gbmV3IGluZGV4IGFuZCBzdWJ0cmFjdCB0aGlzIGRhdGEgZnJvbQogKiBnbG9iYWwgY291bnQgYXMgd2VsbCBiZWZvcmUgZmlsbGluZyBuZXcgb25lLgogKi8Kc3RhdGljIGlubGluZSB2b2lkIFdMQU5UTF9DbGVhclJvYW1TdGF0c1RpbGxJbmRleChXTEFOVExfQ2JUeXBlICpwVExDYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBuZXdJbmRleCkKewogICB3aGlsZSAocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4IDwgbmV3SW5kZXgpCiAgIHsKICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXgrKzsKICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QgLT0KICAgICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLgogICAgICAgICAgICAgcnhSb2FtU3RhdHNbcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4XS50b3RhbFBrdFJjdmQ7CiAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmxvd1JhdGVQa3QgLT0KICAgICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLgogICAgICAgICAgICAgcnhSb2FtU3RhdHNbcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4XS5sb3dSYXRlUnhQYWNrZXRzUmN2ZDsKICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuCiAgICAgICAgIHJ4Um9hbVN0YXRzW3BUTENiLT5nRHNSeFJvYW1TdGF0cy5pbmRleF0udG90YWxQa3RSY3ZkID0gMDsKICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuCiAgICAgICAgIHJ4Um9hbVN0YXRzW3BUTENiLT5nRHNSeFJvYW1TdGF0cy5pbmRleF0ubG93UmF0ZVJ4UGFja2V0c1JjdmQgPSAwOwogICB9Cn0KCgpzdGF0aWMgdm9pZCBXTEFOVExfQ2xlYXJPbGRQRVJTdGF0cyhXTEFOVExfQ2JUeXBlICpwVExDYiwgdl9VOF90IGluY3JlbWVudENudCkKewogICB2X1U4X3QgbmV3SW5kZXg7CgogICBuZXdJbmRleCA9IChwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXggKyBpbmNyZW1lbnRDbnQpICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9BTV9NQVhfSU5ERVhfTlVNOwoKICAgLyogV2UgaGF2ZSBjcm9zc2VkIHRoZSBtYXggbGltaXQgb2YgYnVmZmVyLCBjbGVhciB0aGUgc3RhdHMKICAgICogdGlsbCBST0FNX01BWF9JTkRFWF9OVU0gYW5kIHNldCBpbmRleCBhcyAwICovCiAgIGlmICgocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4ICsgaW5jcmVtZW50Q250KSA+PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0FNX01BWF9JTkRFWF9OVU0pCiAgIHsKICAgICAgIFdMQU5UTF9DbGVhclJvYW1TdGF0c1RpbGxJbmRleChwVExDYiwgUk9BTV9NQVhfSU5ERVhfTlVNIC0gMSk7CiAgICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXggPSAtMTsKICAgfQogICAvKiBDbGVhciB0aGUgc3RhdHMgZnJvbSBjdXJyZW50IGluZGV4IHRpbGwgbmV3IGluZGV4ICovCiAgIFdMQU5UTF9DbGVhclJvYW1TdGF0c1RpbGxJbmRleChwVExDYiwgbmV3SW5kZXgpOwp9CgovKgogKiBUaGlzIEFQSSBpbXBsZW1lbnRzIGEgY2lyY3VsYXIgYnVmZmVyIHRvIHN0b3JlIHJhdGUgc3RhdHMgZm9yIGEgc3RhdGlvbiB0bwogKiB0cmlnZ2VyIFBFUiBiYXNlZCByb2FtIHNjYW4uCiAqIEFQSSB3aWxsIHN0YXJ0IG1vbml0b3Jpbmcgb25seSBpZiBEVVQgZ2V0cyBjb250aW51ZXMgcGFja2V0cyB3aGljaCBhcmUgYmVsb3cKICogY29uZmlndXJlZCByYXRlLiBJbiB0aGUgdXBwZXIgcmF0ZXMsIHRoaXMgc2hvdWxkIGhhdmUgbWluaW1hbCBlZmZlY3Qgb24gZGF0YQogKiB0aHJvdWdocHV0LgogKgogKiBUaGlzIEFQSSB3aWxsIHN0b3JlIHN0YXRzIGluIGEgY2lyY3VsYXIgYnVmZmVyIG9mIHNpemUgUk9BTV9NQVhfSU5ERVhfTlVNCiAqIHdoZXJlIGVhY2ggaW5kZXggd2lsbCBoYXZlIHRpbWUgZHVyYXRpb24gb2YgUk9BTV9QRVJfSU5ERVhfVElNRS4KICogVXNpbmcgYSBidWZmZXIgaW5zdGVhZCBvZiBjb3VudGVyIHdpbGwgaGVscCB0byBtYWludGFpbiBzdGF0cyBvZiB0aW1lCiAqIGR1cmF0aW9uIFJPQU1fUEVSX0lOREVYX1RJTUUgKiBST0FNX01BWF9JTkRFWF9OVU0uIFdoZW5ldmVyIGhvc3QgZ2V0cyBhIG5ldwogKiBwYWNrZXQsIGl0IHdpbGwgcmVtb3ZlIGxhc3QgUk9BTV9QRVJfSU5ERVhfVElNRSBkdXJhdGlvbiBvZiBwYWNrZXRzIGZyb20KICogZ2xvYmFsIGVudHJ5IGFuZCBpbmRleCBlbnRyeSBhbmQgZmlsbCBuZXcgZGF0YS4KICoKICogR2xvYmFsIHN0YXRzIG9mIGRhdGEgYWxzbyBiZSBtYWludGFpbmVkIHNvIHRoYXQgaG9zdCBuZWVkIG5vdCB0byBwYXJzZSB3aG9sZQogKiBidWZmZXIgd2hpbGUgY2hlY2tpbmcgdGhlIHRyaWdnZXIgY29uZGl0aW9uCiAqIEVhY2ggb2YgdGhlIGluZGV4IHdpbGwgYmUgaGF2aW5nIHRoZSBwYWNrZXRzIHN0YXRzIGF0IGR1cmF0aW9uIG9mCiAqIFJPQU1fUEVSX0lOREVYX1RJTUUgZnJvbSB0aGUgZmlyc3QgcGFja2V0IHdoaWNoIGFycml2ZWQgaW4gdGhhdC4KICogR2xvYmFsIGluZGV4IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgbmV3IGluZGV4IHBvc2l0aW9uIHRvIGZpbGwgb25jZSBob3N0CiAqIGdldHMgYSBwYWNrZXQuCiAqLwpzdGF0aWMgdm9pZCBXTEFOVExfdXBkYXRlUEVSU3RhdHMoV0xBTlRMX0NiVHlwZSAqcFRMQ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgcmF0ZUluZGV4KQp7CiAgIHZfVThfdCBpbmNyZW1lbnRDbnQgPSAwOwogICB2X1U2NF90IGN1cnJlbnRUaW1lLCB0aW1lRGlmZmVyZW5jZTsKCiAgIC8qCiAgICAqIEhvc3Qgd2lsbCBzdGFydCBtb25pdG9yaW5nIFJ4IHJhdGVzIG9ubHkgaWYgaXQgZ2V0cwogICAgKiBNSU5fUEtUU19UT19TVEFSVF9NT05USU9SIG51bWJlciBvZiBwa3RzIGNvbnRpbnVvdXNseSBiZWxvdyBtaW4gcmF0ZQogICAgKiBUaGlzIHdpbGwgbWFrZSBzdXJlIHdlIG5ldmVyIGRvIHRoaXMgbXVjaCBwcm9jZXNzaW5nIGluIGhpZ2gKICAgICogcmF0ZXMvdGhyb3VnaHB1dCBjYXNlcwogICAgKi8KCiAgIGlmKHBUTENiLT5nRHNSeFJvYW1TdGF0cy5pbnRpYWxQa3RUb1N0YXJ0IDwgTUlOX1BLVFNfVE9fU1RBUlRfTU9OVElPUikKICAgewogICAgICAgaWYgKGdUTFJhdGVJbmZvW3JhdGVJbmRleF0ucGh5UmF0ZSA8IHBUTENiLT5nRHNSeFJvYW1TdGF0cy5taW5SYXRlKQogICAgICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmludGlhbFBrdFRvU3RhcnQrKzsKICAgICAgIGVsc2UKICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5pbnRpYWxQa3RUb1N0YXJ0ID0gMDsKICAgICAgIHJldHVybjsKICAgfQoKICAgY3VycmVudFRpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOwogICAvKgogICAgKiBzY2FuIHdhcyB0cmlnZ2VyZWQgaW4gbGFzdCB0aW1lVG9XYWl0IHRpbWUgZHVyYXRpb24KICAgICogV2FpdCBmb3IgdGltZVRvV2FpdCBiZWZvcmUgbW9uaXRvcmluZyBhZ2Fpbi4KICAgICovCiAgIGlmKChjdXJyZW50VGltZSAtIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5sYXN0VHJpZ2dlclRpbWUpIDwKICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy50aW1lVG9XYWl0KQogICAgICAgcmV0dXJuOwoKICAgLyogcGFrZXQgYWJvdmUgbWF4IHJhdGUsIGNsZWFyIGN1cnJlbnQgc3RhdHMgYW5kIG1vbnRpb3IgYWdhaW4gKi8KICAgaWYgKGdUTFJhdGVJbmZvW3JhdGVJbmRleF0ucGh5UmF0ZSA+PQogICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5tYXhSYXRlKQogICB7CiAgICAgICBXTEFOVExfQ2xlYXJBbGxSb2FtU3RhdHMocFRMQ2IpOwogICAgICAgLyogU3RvcCBhbnkgUEVSIGJhc2VkIHNjYW4gaWYgZ29pbmcgb24gKi8KICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy4KICAgICAgICAgICAgICAgICAgdHJpZ2dlclJvYW1TY2FuZm4ocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmhIYWwsIDApOwogICAgICAgcmV0dXJuOwogICB9CgogICB0aW1lRGlmZmVyZW5jZSA9IGN1cnJlbnRUaW1lIC0KICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5yeFJvYW1TdGF0c1twVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXhdLnRpbWU7CgogICBpZiAodGltZURpZmZlcmVuY2UpCiAgICAgICBpbmNyZW1lbnRDbnQgPSBkb19kaXYodGltZURpZmZlcmVuY2UsIFJPQU1fUEVSX0lOREVYX1RJTUUpOwoKICAgLyogTW9yZSB0aGF0IFJPQU1fUEVSX0lOREVYX1RJTUUgaGFzIGVzY2xhcHNlZCwKICAgICogZmlsbCBkYXRhIGF0IG5ldyBpbmRleCAqLwogICBpZiAoaW5jcmVtZW50Q250KQogICB7CiAgICAgICBpZiAoaW5jcmVtZW50Q250ID4gUk9BTV9NQVhfSU5ERVhfTlVNKQogICAgICAgewogICAgICAgICAgIC8qCiAgICAgICAgICAgICogQ2xlYXIgYWxsIHN0YXRzLCB0aGVzZSBhcmUgb2xkZXIgdGhhbgogICAgICAgICAgICAqIFJPQU1fTUFYX0lOREVYX05VTSAqIFJPQU1fUEVSX0lOREVYX1RJTUUgKE1heCBidWZmZXIgdGltZSkKICAgICAgICAgICAgKi8KICAgICAgICAgICBXTEFOVExfQ2xlYXJBbGxSb2FtU3RhdHMocFRMQ2IpOwogICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5pbmRleCA9IDA7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICAgICAgV0xBTlRMX0NsZWFyT2xkUEVSU3RhdHMocFRMQ2IsIGluY3JlbWVudENudCk7CgogICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnJ4Um9hbVN0YXRzCiAgICAgICAgICAgICAgICAgICAgW3BUTENiLT5nRHNSeFJvYW1TdGF0cy5pbmRleF0udGltZSA9IGN1cnJlbnRUaW1lOwogICB9CgogICAvKiBJZiBwa3QgcmF0ZSBiZWxvdyBtaW5SYXRlLCBpbmNyZW1lbnQgbG93IHBrdHMgY291bnRzICovCiAgIGlmIChnVExSYXRlSW5mb1tyYXRlSW5kZXhdLnBoeVJhdGUgPAogICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5taW5SYXRlKQogICB7CiAgICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuCiAgICAgICAgICAgcnhSb2FtU3RhdHNbcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4XS4KICAgICAgICAgICAgICAgbG93UmF0ZVJ4UGFja2V0c1JjdmQrKzsKICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5sb3dSYXRlUGt0Kys7CiAgIH0KICAgLyogSW5jcmVtZW50IHRvdGFsIHBrdHMgY291bnRzICovCiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy4KICAgICAgICAgICByeFJvYW1TdGF0c1twVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXhdLnRvdGFsUGt0UmN2ZCsrOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QrKzsKCiAgIC8qIENoZWNrIGlmIHdlIGhhdmUgcmVhY2hlZCB0aHJlc2hvbGQgdmFsdWUgdG8gdHJpZ2dlciBhIHJvYW0gc2NhbiAqLwogICBpZiAoKHBUTENiLT5nRHNSeFJvYW1TdGF0cy50b3RhbFBrdCAhPSAwKSAmJgogICAgICAgKHBUTENiLT5nRHNSeFJvYW1TdGF0cy50b3RhbFBrdCA+CiAgICAgICAgICAgICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMubWluUGt0UmVxdWlyZWQpJiYKICAgICAgICgocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmxvd1JhdGVQa3QgKiAxMDApID4KICAgICAgICAgICAgICAgIChwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QgKgogICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLm1pblBlcmNlbnRhZ2UpKSkKICAgewogICAgICAgLyogY2FsbGJhY2sgaGFuZGxlciB0byB0cmlnZ2VyIGEgcm9hbSBzY2FuICovCiAgICAgICBpZiAocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnRyaWdnZXJSb2FtU2NhbmZuKQogICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy4KICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSb2FtU2NhbmZuKHBUTENiLT5nRHNSeFJvYW1TdGF0cy5oSGFsLCAxKTsKCiAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0RFQlVHLAogICAgICAgICAgICJQRVIgUm9hbTogdHJpZ2dlcnJpbmcgcm9hbSBzY2FuIHRvdGFsUGt0ID0lbHUgbG93UmF0ZVBrdCAlbHUgbWluUGt0UmVxdWlyZWQgJXUgbWluUGVyY2VudGFnZSAlZCIsCiAgICAgICAgICAgKGxvbmcgdW5zaWduZWQgaW50KSBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QsCiAgICAgICAgICAgKGxvbmcgdW5zaWduZWQgaW50KSBwVExDYi0+Z0RzUnhSb2FtU3RhdHMubG93UmF0ZVBrdCwKICAgICAgICAgICAodW5zaWduZWQgaW50KSBwVExDYi0+Z0RzUnhSb2FtU3RhdHMubWluUGt0UmVxdWlyZWQsCiAgICAgICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLm1pblBlcmNlbnRhZ2UpOwoKICAgICAgIFdMQU5UTF9DbGVhckFsbFJvYW1TdGF0cyhwVExDYik7CiAgICAgICAvKiAgc2F2ZSBjdXJyZW50IHRpbWUgYXMgbGFzdCB0cmlnZ2VyIHRpbWUgKi8KICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5sYXN0VHJpZ2dlclRpbWUgPSBjdXJyZW50VGltZTsKICAgfQp9CiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeEF1dGgKCiAgREVTQ1JJUFRJT04KICAgIFJlY2VpdmUgaW4gYXV0aGVudGljYXRlZCBzdGF0ZSAtIGFsbCBkYXRhIGFsbG93ZWQKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSByeCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVJ4QXV0aAooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgICAgcFRMQ2IgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogICAgcENsaWVudFNUQSA9IE5VTEw7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y0FzZjsgLyogQU1TRFUgc3ViIGZyYW1lICovCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVET2Zmc2V0OwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVUxlbjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW47CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0FjdHVhbEhMZW4gPSAwOyAgIAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNUaWQ7CiNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9TQ0FOX09GRkxPQUQKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHJ4UmF0ZTsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHR5cGU7CiNlbmRpZgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKICAgdFNpck1hY01nbXRIZHIgICAgICAgICAgICpoZHI7CiNlbmRpZgogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNQa3RMZW47CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZiA7CiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICBhdWNCREhlYWRlcjsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1czsKICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOwogICBzdGF0aWMgdl9VOF90ICAgICAgICAgICAgdWNQTVBEVUhMZW47CiAgIHZfVTMyX3QqICAgICAgICAgICAgICAgICBTVEFNZXRhSW5mb1B0cjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjRXNmPTA7IC8qIGZpcnN0IHN1YmZyYW1lIG9mIEFNU0RVIGZsYWcgKi8KICAgdl9VNjRfdCAgICAgICAgICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyPTA7IC8qY3VycmVudCByZXBsYXkgY291bnRlciovCiAgIHZfVTY0X3QgICAgICAgICAgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXI9MDsgLypwcmV2aW91cyByZXBsYXkgY291bnRlciovCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1Y1VuaWNhc3RCcm9hZGNhc3RUeXBlPTA7IC8qSXQgZGVub3RlcyB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lIGlzIFVDIG9yIEJDKi8KICAgc3RydWN0IF9CQVJGcm1TdHJ1Y3QgICAgICpwQmFyRnJhbWUgPSBOVUxMOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeEF1dGgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVJ4QXV0aCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwICk7CgogIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVET2Zmc2V0ID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVMZW4gICAgID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0xFTihhdWNCREhlYWRlcik7CiAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4oYXVjQkRIZWFkZXIpOwogIHVjVGlkICAgICAgICAgPSAodl9VOF90KVdEQV9HRVRfUlhfVElEKGF1Y0JESGVhZGVyKTsKI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX1NDQU5fT0ZGTE9BRAogIHJ4UmF0ZSAgICAgICAgPSAodl9VOF90KVdEQV9HRVRfUlhfTUFDX1JBVEVfSURYKGF1Y0JESGVhZGVyKTsKICB0eXBlICAgICAgICAgID0gKHZfVThfdClXREFfR0VUX1JYX1RZUEUoYXVjQkRIZWFkZXIpOwojZW5kaWYKCiAgLyogRml4IGZvciBhIGhhcmR3YXJlIGJ1Zy4gCiAgICogSC9XIGRvZXMgbm90IHVwZGF0ZSB0aGUgdGlkIGZpZWxkIGluIEJEIGhlYWRlciBmb3IgQkFSIGZyYW1lcy4KICAgKiBGaXggaXMgdG8gcmVhZCB0aGUgdGlkIGZpZWxkIGZyb20gTUFDIGhlYWRlciBvZiBCQVIgZnJhbWUgKi8KICBpZiggKFdEQV9HRVRfUlhfVFlQRShhdWNCREhlYWRlcikgPT0gU0lSX01BQ19DVFJMX0ZSQU1FKSAmJgogICAgICAoV0RBX0dFVF9SWF9TVUJUWVBFKGF1Y0JESGVhZGVyKSA9PSBTSVJfTUFDX0NUUkxfQkFSKSkKICB7CiAgICAgIHBCYXJGcmFtZSA9IChzdHJ1Y3QgX0JBUkZybVN0cnVjdCAqKShXREFfR0VUX1JYX01BQ19IRUFERVIoYXVjQkRIZWFkZXIpKTsKICAgICAgdWNUaWQgPSBwQmFyRnJhbWUtPmJhckNvbnRyb2wubnVtVElEOwogIH0KCiAgLypIb3N0IGJhc2VkIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgZm9yIHVuaWNhc3QgZGF0YSBmcmFtZXMqLwogIHVjVW5pY2FzdEJyb2FkY2FzdFR5cGUgID0gKHZfVTE2X3QpV0RBX0lTX1JYX0JDQVNUKGF1Y0JESGVhZGVyKTsKICBpZigwICE9IHVjTVBEVUhMZW4pCiAgewogICAgdWNQTVBEVUhMZW4gPSB1Y01QRFVITGVuOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBwcm9jZXNzaW5nIGRhdGE6IEhPICVkIERPICVkIExlbiAlZCBITGVuICVkIgogICAgICAgICAgICAgIiBUaWQgJWQgQkQgJWQiLAogICAgICAgICAgICAgdWNNUERVSE9mZnNldCwgdXNNUERVRE9mZnNldCwgdXNNUERVTGVuLCB1Y01QRFVITGVuLCB1Y1RpZCwKICAgICAgICAgICAgIFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUpKTsKCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsICZ1c1BrdExlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19UcmltUnhQYWNrZXRJbmZvKCB2b3NEYXRhQnVmZiApICkKICB7CiAgICBpZigoV0RBX0dFVF9SWF9BU0YoYXVjQkRIZWFkZXIpICYmICFXREFfR0VUX1JYX0VTRihhdWNCREhlYWRlcikpKQogIHsKICAgIC8qIEFNU0RVIGNhc2UsIHVjTVBEVUhPZmZzZXQgPSAwCiAgICAgKiBpdCBzaG91bGQgYmUgaGFuY2RsZWQgc2VwZXJhdGx5ICovCiAgICBpZigoIHVzTVBEVURPZmZzZXQgPiAgdWNNUERVSE9mZnNldCApICYmCiAgICAgICAoIHVzTVBEVUxlbiAgICAgPj0gdWNNUERVSExlbiApICYmICggdXNQa3RMZW4gPj0gdXNNUERVTGVuICkgJiYKICAgICAgICggIVdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkgKSkKICAgIHsKICAgICAgICB1Y01QRFVIT2Zmc2V0ID0gdXNNUERVRE9mZnNldCAtIFdMQU5UTF9NUERVX0hFQURFUl9MRU47IAogICAgfQogICAgZWxzZQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiAgfQoKI2lmZGVmIFdMQU5fRkVBVFVSRV9STUMKICBpZiAocFRMQ2ItPm11bHRpY2FzdER1cGxpY2F0ZURldGVjdGlvbkVuYWJsZWQgJiYKICAgICAgKFdMQU5fU1RBX0lCU1MgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICBXTEFOVExfSVNfREFUQV9GUkFNRShXREFfR0VUX1JYX1RZUEVfU1VCVFlQRShhdWNCREhlYWRlcikpKQogIHsKICAgIC8qCiAgICAgKiBNdWx0aWNhc3QgZHVwbGljYXRlIGRldGVjdGlvbiBpcyBvbmx5IGZvciBmcmFtZXMgcmVjZWl2ZWQgaW4KICAgICAqIElCU1MgbW9kZS4KICAgICAqLwogICAgaWYgKFZPU19UUlVFID09IFdMQU5UTF9Jc0R1cGxpY2F0ZU1jYXN0RnJtKHBDbGllbnRTVEEsIHZvc0RhdGFCdWZmKSkKICAgIHsKICAgICAgICAgcFRMQ2ItPm1jYXN0RHVwQ250Kys7CiAgICAgICAgIC8qIER1cGxpY2F0ZSBtdWx0aWNhc3QgZGF0YSBwYWNrZXQsIGRyb3AgdGhlIHBhY2tldCAqLwogICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgfQogIH0KI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9STUMgKi8KCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIGlmICggcENsaWVudFNUQS0+d1NUQURlc2MudWNJc1dhcGlTdGEgKQogIHsKICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRFdGhlclR5cGUoYXVjQkRIZWFkZXIsIHZvc0RhdGFCdWZmLCB1Y01QRFVITGVuLCAmdXNFdGhlclR5cGUpOwogICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKICAgIHsKICAgICAgaWYgKCBXTEFOVExfTExDX1dBSV9UWVBFICA9PSB1c0V0aGVyVHlwZSApCiAgICAgIHsKICAgICAgICBoZHIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIoYXVjQkRIZWFkZXIpOwogICAgICAgIGlmICggaGRyLT5mYy53ZXAgKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6V0FJIGZyYW1lIHdhcyByZWNlaXZlZCBlbmNyeXB0ZWQgLSBkcm9wcGluZyIpKTsKICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgICAvKlRlbXBvcmFyeSBmaXggYWRkZWQgdG8gZml4IHdhcGkgcmVrZXkgaXNzdWUqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7IC8vcmV0dXJuaW5nIHN1Y2Nlc3MKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgaWYgKCAgV0xBTkhBTF9SWF9JU19VTlBST1RFQ1RFRF9XUElfRlJBTUUoYXVjQkRIZWFkZXIpICkgCiAgICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpOb24tV0FJIGZyYW1lIHdhcyByZWNlaXZlZCB1bmVuY3J5cHRlZCAtIGRyb3BwaW5nIikpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7IAogICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsgLy9yZXR1cm5pbmcgc3VjY2VzcwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZSAvL2NvdWxkIG5vdCBleHRyYWN0IEV0aGVyVHlwZSAtIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkNvdWxkIG5vdCBleHRyYWN0IEV0aGVyVHlwZSIpKTsKICAgICAgLy9QYWNrZXQgaXMgYWxyZWFkeSBmcmVlZAogICAgICByZXR1cm4gdm9zU3RhdHVzOyAvL3JldHVybmluZyBmYWlsdXJlCiAgICB9CiAgfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJbmNyZW1lbnQgcmVjZWl2ZSBjb3VudGVyCiAgICAhISBub3Qgc3VyZSB0aGlzIGlzIHRoZSBiZXN0IHBsYWNlIHRvIGluY3JlYXNlIHRoaXMgLSBwa3QgbWlnaHQgYmUKICAgIGRyb3BwZWQgYmVsb3cgb3IgZGVsYXllZCBpbiBUTCdzIHF1ZXVlcwogICAgLSB3aWxsIGxlYXZlIGl0IGhlcmUgZm9yIG5vdwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggIVdMQU5UTF9USURfSU5WQUxJRCggdWNUaWQpICkgCiAgewogICAgcENsaWVudFNUQS0+YXVSeENvdW50W3VjVGlkXSsrOwogIH0KICBlbHNlCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgdGlkICAlZCAoU3RhdGlvbiBJRCAlZCkgb24gJXMiLAogICAgICAgICAgIHVjVGlkLCB1Y1NUQUlkLCBfX2Z1bmNfXykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgojaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fU0NBTl9PRkZMT0FECiAgaWYgKHBUTENiLT5nRHNSeFJvYW1TdGF0cy5ydW5uaW5nICYmCiAgICAgKHVjU1RBSWQgPT0gcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnN0YUlkKSAmJgogICAgIChyeFJhdGUgPCBXTEFOVExfTUFYX1JBVEVfTlVNKSAmJiAodHlwZSA9PSBTSVJfTUFDX0RBVEFfRlJBTUUpKQogIHsKICAgICAgV0xBTlRMX3VwZGF0ZVBFUlN0YXRzKHBUTENiLCByeFJhdGUpOwogIH0KI2VuZGlmCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIEFNU0RVIGFuZCBzZW5kIGZvciBwcm9jZXNzaW5nIGlmIHNvCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNBc2YgPSAodl9VOF90KVdEQV9HRVRfUlhfQVNGKGF1Y0JESGVhZGVyKTsKCiAgaWYgKCAwICE9IHVjQXNmICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpQYWNrZXQgaXMgQU1TRFUgc3ViIGZyYW1lIC0gc2VuZGluZyBmb3IgY29tcGxldGlvbiIpKTsKICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9BTVNEVVByb2Nlc3MoIHB2b3NHQ3R4LCAmdm9zRGF0YUJ1ZmYsIGF1Y0JESGVhZGVyLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwgdXNNUERVTGVuICk7CiAgICBpZihOVUxMID09IHZvc0RhdGFCdWZmKQogICAgewogICAgICAgLy9QYWNrZXQgaXMgYWxyZWFkeSBmcmVlZAogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KICB9CiAgLyogQWZ0ZXIgQU1TRFUgaGVhZGVyIGhhbmRsZWQKICAgKiBBTVNEVSBmcmFtZSBqdXN0IHNhbWUgd2l0aCBub3JtYWwgZnJhbWVzICovCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgVHJhbnNsYXRpbmcgaGVhZGVyIGlmIG5lY2VzYXJ5CiAgICAgICAhISBGaXggbWU6IHJtdiBjb21tZW50cyBiZWxvdwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggMCA9PSBXREFfR0VUX1JYX0ZUX0RPTkUoYXVjQkRIZWFkZXIpICkgJiYKICAgICAgKCAwICE9IHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbikgJiYKICAgICAgKCBXTEFOVExfSVNfREFUQV9GUkFNRShXREFfR0VUX1JYX1RZUEVfU1VCVFlQRShhdWNCREhlYWRlcikpICkpCiAgewogICAgaWYoMCA9PSB1Y01QRFVITGVuKQogICAgewogICAgICB1Y01QRFVITGVuID0gdWNQTVBEVUhMZW47CiAgICB9CiAgICBpZiAodXNNUERVRE9mZnNldCA+IHVjTVBEVUhPZmZzZXQpCiAgICB7CiAgICAgIHVzQWN0dWFsSExlbiA9IHVzTVBEVURPZmZzZXQgLSB1Y01QRFVIT2Zmc2V0OwogICAgfQogICAgdm9zU3RhdHVzID0gV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywgdXNBY3R1YWxITGVuLCAKICAgICAgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwgcFRMQ2IsIHVjU1RBSWQsIGJGb3J3YXJkSUFQUHdpdGhMTEMpOwoKICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gdHJhbnNsYXRlIGZyb20gODAyLjExIHRvIDgwMi4zIC0gZHJvcHBpbmciKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgIH0KICAgIH0KICAgIC8qIFNvZnRhcCByZXF1aXJlcyBhZGRpdGlvbmFsIEluZm8gc3VjaCBhcyBEZXN0aW5hdGlvbiBTVEFJRCBhbmQgQWNjZXNzCiAgICAgICBDYXRlZ29yeS4gVm9zY2hhaW4gb3IgQnVmZmVyIHJldHVybmVkIGJ5IEJBIHdvdWxkIGJlIHVuY2hhaW4gYW5kIHRoaXMKICAgICAgIE1ldGEgRGF0YSB3b3VsZCBoZWxwIGluIHJvdXRpbmcgdGhlIHBhY2tldHMgdG8gYXBwcm9wcmlhdGUgRGVzdGluYXRpb24gKi8KICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICB7CiAgICAgICBTVEFNZXRhSW5mb1B0ciA9ICh2X1UzMl90ICopKHVpbnRwdHJfdCkodWNUaWQgfCAoV0RBX0dFVF9SWF9BRERSM19JRFgoYXVjQkRIZWFkZXIpIDw8IFdMQU5UTF9TVEFJRF9PRkZTRVQpKTsKICAgICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClTVEFNZXRhSW5mb1B0cik7CiAgICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayB0byBzZWUgaWYgcmUtb3JkZXJpbmcgc2Vzc2lvbiBpcyBpbiBwbGFjZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCAhPSBwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXS51Y0V4aXN0cyApCiAgewogICAgV0xBTlRMX01TRFVSZW9yZGVyKCBwVExDYiwgJnZvc0RhdGFCdWZmLCBhdWNCREhlYWRlciwgdWNTVEFJZCwgdWNUaWQgKTsKICB9CgppZigwID09IHVjVW5pY2FzdEJyb2FkY2FzdFR5cGUKI2lmZGVmIEZFQVRVUkVfT05fQ0hJUF9SRU9SREVSSU5HCiAgICYmIChXTEFOSEFMX0lzT25DaGlwUmVvcmRlcmluZ0VuYWJsZWRGb3JUSUQocHZvc0dDdHgsIHVjU1RBSWQsIHVjVGlkKSAhPSBUUlVFKQojZW5kaWYKKQp7CiAgLyogcmVwbGF5IGNoZWNrIGNvZGUgOiBjaGVjayB3aGV0aGVyIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgb3Igbm90ICovCiAgaWYoVk9TX1RSVUUgPT0gcENsaWVudFNUQS0+dWNJc1JlcGxheUNoZWNrVmFsaWQpCiAgewogICAgICAvKiByZXBsYXkgY2hlY2sgaXMgbmVlZGVkIGZvciB0aGUgc3RhdGlvbiAqLwoKICAgICAgLyogY2hlY2sgd2hldGhlciBmcmFtZSBpcyBBTVNEVSBmcmFtZSAqLwogICAgICBpZiAoIDAgIT0gdWNBc2YgKQogICAgICB7CiAgICAgICAgICAvKiBTaW5jZSB2aXJnbyBjYW4ndCBzZW5kIEFNU0RVIGZyYW1lcyB0aGlzIGxlZyBvZiB0aGUgY29kZSAKICAgICAgICAgICAgIHdhcyBub3QgdGVzdGVkIHByb3Blcmx5LCBpdCBuZWVkcyB0byBiZSB0ZXN0ZWQgcHJvcGVybHkqLwogICAgICAgICAgLyogRnJhbWUgaXMgQU1TRFUgZnJhbWUuIEFzIHBlciA4MDIuMTFuIG9ubHkgZmlyc3QKICAgICAgICAgICAgIHN1YmZyYW1lIHdpbGwgaGF2ZSByZXBsYXkgY291bnRlciAqLwogICAgICAgICAgdWNFc2YgPSAgV0RBX0dFVF9SWF9FU0YoIGF1Y0JESGVhZGVyICk7CiAgICAgICAgICBpZiggMCAhPSB1Y0VzZiApCiAgICAgICAgICB7CiAgICAgICAgICAgICAgdl9CT09MX3Qgc3RhdHVzOwogICAgICAgICAgICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCiAgICAgICAgICAgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXREFfRFNfR2V0UmVwbGF5Q291bnRlcihhdWNCREhlYWRlcik7CiAKICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgY3VycmVudFJlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCBwcmV2aW91cyByZXBsYXkgY291bnRlciBmcm9tIFRMIGNvbnRyb2wgIGJsb2NrICovCiAgICAgICAgICAgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyID0gcENsaWVudFNUQS0+dWxsUmVwbGF5Q291bnRlclt1Y1RpZF07CgogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBBTVNEVSBwcmV2aW91c1JlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgIC8qIEl0IGlzIGZpcnN0IHN1YmZyYW1lIG9mIEFNU0RVIHRodXMgaXQKICAgICAgICAgICAgICAgICBjb25hdGFpbnMgcmVwbGF5IGNvdW50ZXIgcGVyZm9ybSB0aGUKICAgICAgICAgICAgICAgICByZXBsYXkgY2hlY2sgZm9yIHRoaXMgZmlyc3Qgc3ViZnJhbWUqLwogICAgICAgICAgICAgIHN0YXR1cyA9ICBXTEFOVExfSXNSZXBsYXlQYWNrZXQoIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLCB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwogICAgICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgLyogTm90IGEgcmVwbGF5IHBha2V0LCB1cGRhdGUgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgaW4gVEwgQ0IgKi8gICAgCiAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEFNU0RVIERyb3AgdGhlIHJlcGxheSBwYWNrZXQgd2l0aCBQTiA6IFsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CiAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgdG90YWwgZHJvcHBlZCByZXBsYXkgcGFja2V0cyBvbiBTVEEgSUQgJVggaXMgWzB4JVhdIiwKICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgIHBDbGllbnRTVEEtPnVsVG90YWxSZXBsYXlQYWNrZXRzRGV0ZWN0ZWQpOwoKICAgICAgICAgICAgICAgICAgLyogRHJvcCB0aGUgcGFja2V0ICovCiAgICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgIHZfQk9PTF90IHN0YXR1czsKCiAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgZnJvbSB0aGUgUlggQkQgKi8KICAgICAgICAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IFdEQV9EU19HZXRSZXBsYXlDb3VudGVyKGF1Y0JESGVhZGVyKTsKCiAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICJXTEFOIFRMOiBOb24tQU1TRFUgY3VycmVudFJlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgZnJvbSBUTCBjb250cm9sICBibG9jayAqLwogICAgICAgICAgIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlciA9IHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdOwoKICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIHByZXZpb3VzUmVwbGF5Q291bnRlciBbMHglbGxYXSIsdWxscHJldmlvdXNSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgLyogSXQgaXMgbm90IEFNU0RVIGZyYW1lIHNvIHBlcmZvcm0gCiAgICAgICAgICAgICAgcmVhcGx5IGNoZWNrIGZvciBlYWNoIHBhY2tldCwgYXMKICAgICAgICAgICAgICBlYWNoIHBhY2tldCBjb250YWlucyB2YWxpZCByZXBsYXkgY291bnRlciovIAogICAgICAgICAgIHN0YXR1cyA9ICBXTEFOVExfSXNSZXBsYXlQYWNrZXQoIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLCB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwogICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogTm90IGEgcmVwbGF5IHBha2V0LCB1cGRhdGUgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgaW4gVEwgQ0IgKi8gICAgCiAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIERyb3AgdGhlIHJlcGxheSBwYWNrZXQgd2l0aCBQTiA6IFsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CiAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vbi1BTVNEVSB0b3RhbCBkcm9wcGVkIHJlcGxheSBwYWNrZXRzIG9uIFNUQSBJRCAlWCBpcyBbMHglWF0iLAogICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCk7CgogICAgICAgICAgICAgICAvKiBSZXBhbHkgcGFja2V0LCBkcm9wIHRoZSBwYWNrZXQgKi8KICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgICAgICB9CiAgICAgIH0KICB9Cn0KLypJdCBpcyBhIGJyb2FkYXN0IHBhY2tldCBEUFUgaGFzIGFscmVhZHkgZG9uZSByZXBsYXkgY2hlY2sgZm9yIAogIGJyb2FkY2FzdCBwYWNrZXRzIG5vIG5lZWQgdG8gZG8gcmVwbGF5IGNoZWNrIG9mIHRoZXNlIHBhY2tldHMqLwoKICBpZiAoIE5VTEwgIT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICB7CiAgICAgIFdMQU5UTF9Gd2RQa3RUb0hERCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkICk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSB1Y1RpZDsKICAgICAgd1J4TWV0YUluZm8ucnNzaUF2ZyA9IHBDbGllbnRTVEEtPnJzc2lBdmc7CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgICBpZiAoV0xBTl9TVEFfVERMUyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgICAgewogICAgICAgICAgd1J4TWV0YUluZm8uaXNTdGFUZGxzID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIHdSeE1ldGFJbmZvLmlzU3RhVGRscyA9IEZBTFNFOwogICAgICB9CiNlbmRpZgogICAgICBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogICAgfQogIH0vKiBpZiBub3QgTlVMTCAqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4QXV0aCAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBUnhEaXNjCgogIERFU0NSSVBUSU9OCiAgICBSZWNlaXZlIGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSAtIG5vIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHJ4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUnhEaXNjCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBOVUxMID09IHB2b3NEYXRhQnVmZiApIHx8ICggTlVMTCA9PSAgKnB2b3NEYXRhQnVmZiApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeERpc2MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVycm9yIC0gZHJvcCBwYWNrZXQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpQYWNrZXQgc2hvdWxkIG5vdCBiZSByZWNlaXZlZCBpbiBzdGF0ZSBkaXNjb25uZWN0ZWQiCiAgICAgICAgICAgICAiIC0gZHJvcHBpbmciKSk7CiAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCpwdm9zRGF0YUJ1ZmYpOwogICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4RGlzYyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBQcm9jZXNzaW5nIG1haW4gbG9vcHMgZm9yIE1BSU4gYW5kIFRYIHRocmVhZHMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX01jUHJvY2Vzc01zZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFZPU1Mgd2hlbiBhIG1lc3NhZ2Ugd2FzIHNlcmlhbGl6ZWQgZm9yIFRMIHRocm91Z2ggdGhlCiAgICBtYWluIHRocmVhZC90YXNrLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfTWNQcm9jZXNzTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdEFkZEJBSW5kKiAgICAgIHB0QWRkQmFJbmQgPSBOVUxMOwogICB0RGVsQkFJbmQqICAgICAgcHREZWxCYUluZCA9IE5VTEw7CiAgIHRBZGRCQVJzcCogICAgICBwdEFkZEJhUnNwID0gTlVMTDsKICAgdm9zX21zZ190ICAgICAgIHZvc01lc3NhZ2U7CiAgIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXM7CiAgIHRwRmx1c2hBQ1JzcCBGbHVzaEFDUnNwUHRyOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUHJvY2Vzc01haW5NZXNzYWdlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIG1haW4gZmxvdyIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CiAgY2FzZSBXREFfVExfRkxVU0hfQUNfUlNQOgogICAgLy8gRXh0cmFjdCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBtZXNzYWdlIGJvZHkKICAgIEZsdXNoQUNSc3BQdHIgPSAodHBGbHVzaEFDUnNwKShtZXNzYWdlLT5ib2R5cHRyKTsKICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2FsbCBiYWNrIGZ1bmN0aW9uIGlzIG5vdCBudWxsLgogICAgaWYgKCBOVUxMID09IHBUTENiLT50bEJBUENsaWVudC5wZm5GbHVzaE9wQ29tcGxldGVDYiApCiAgICB7CiAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBwZm5GbHVzaE9wQ29tcGxldGVDYiIpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJSZWNlaXZlZCBtZXNzYWdlOiAgRmx1c2ggY29tcGxldGUgcmVjZWl2ZWQgYnkgVEwiKSk7CgogICAgLy8gU2luY2Ugd2UgaGF2ZSB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIEhBTCwganVzdCBjYWxsIHRoZSBCQVAgY2xpZW50CiAgICAvLyByZWdpc3RlcmVkIGNhbGwgYmFjayBmcm9tIFRMLiBUaGVyZSBpcyBvbmx5IDEgcG9zc2libGUKICAgIC8vIEJBUCBjbGllbnQuIFNvIGRpcmVjdGx5IHJlZmVyZW5jZSB0bEJBUENsaWVudAogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmbkZsdXNoT3BDb21wbGV0ZUNiKCBwdm9zR0N0eCwKICAgICAgICAgICAgRmx1c2hBQ1JzcFB0ci0+dWNTVEFJZCwKICAgICAgICAgICAgRmx1c2hBQ1JzcFB0ci0+dWNUaWQsIEZsdXNoQUNSc3BQdHItPnN0YXR1cyApOwoKICAgIC8vIEZyZWUgdGhlIFBBTCBtZW1vcnksIHdlIGFyZSBkb25lIHdpdGggaXQuCiAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIkZsdXNoIGNvbXBsZXRlIHJlY2VpdmVkIGJ5IFRMOiBGcmVlaW5nICVwSyIsIEZsdXNoQUNSc3BQdHIpKTsKICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QgKilGbHVzaEFDUnNwUHRyKTsKICAgIGJyZWFrOwoKICBjYXNlIFdEQV9IRERfQUREQkFfUkVROgogICBwdEFkZEJhSW5kID0gKHRBZGRCQUluZCopKG1lc3NhZ2UtPmJvZHlwdHIpOwogICAgdm9zU3RhdHVzID0gV0xBTlRMX0JhU2Vzc2lvbkFkZCggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYVNlc3Npb25JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5TVEFJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYVRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVTMyX3QpcHRBZGRCYUluZC0+YmFTZXNzaW9uLmJhQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLndpblNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5TU04pOwogICAgcHRBZGRCYVJzcCA9IHZvc19tZW1fbWFsbG9jKHNpemVvZigqcHRBZGRCYVJzcCkpOwoKICAgIGlmICggTlVMTCA9PSBwdEFkZEJhUnNwICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IGZhdGFsIGZhaWx1cmUsIGNhbm5vdCBhbGxvY2F0ZSBCQSBSc3Agc3RydWN0dXJlIikpOwogICAgICBWT1NfQVNTRVJUKDApOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOwogICAgfQoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogU2VuZGluZyBzdWNjZXNzIGluZGljYXRpb24gdG8gSEFMIGZvciBBREQgQkEiKSk7CiAgICAgIC8qU2VuZCBzdWNjZXNzKi8KICAgICAgcHRBZGRCYVJzcC0+bWVzZ1R5cGUgICAgPSBXREFfSEREX0FEREJBX1JTUDsKICAgICAgdm9zTWVzc2FnZS50eXBlICAgICAgICAgPSBXREFfSEREX0FEREJBX1JTUDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogU2VuZGluZyBmYWlsdXJlIGluZGljYXRpb24gdG8gSEFMIGZvciBBREQgQkEiKSk7CgogICAgICAvKlNlbmQgZmFpbHVyZSovCiAgICAgIHB0QWRkQmFSc3AtPm1lc2dUeXBlICAgID0gV0RBX0JBX0ZBSUxfSU5EOwogICAgICB2b3NNZXNzYWdlLnR5cGUgICAgICAgICA9IFdEQV9CQV9GQUlMX0lORDsKICAgIH0KCiAgICBwdEFkZEJhUnNwLT5tZXNnTGVuICAgICA9IHNpemVvZih0QWRkQkFSc3ApOwogICAgcHRBZGRCYVJzcC0+YmFTZXNzaW9uSUQgPSBwdEFkZEJhSW5kLT5iYVNlc3Npb24uYmFTZXNzaW9uSUQ7CiAgICAgIC8qIFRoaXMgaXMgZGVmYXVsdCwgcmVwbHkgd2luIHNpemUgaGFzIHRvIGJlIGhhbmRsZWQgQkEgbW9kdWxlLCBGSVggVEhJUyAqLwogICAgICBwdEFkZEJhUnNwLT5yZXBseVdpblNpemUgPSBXTEFOVExfTUFYX1dJTlNJWkU7CiAgICB2b3NNZXNzYWdlLmJvZHlwdHIgPSBwdEFkZEJhUnNwOwoKICAgIHZvc19tcV9wb3N0X21lc3NhZ2UoIFZPU19NUV9JRF9XREEsICZ2b3NNZXNzYWdlICk7CiAgICBXTEFOVExfTWNGcmVlTXNnIChwdm9zR0N0eCwgbWVzc2FnZSk7CiAgYnJlYWs7CiAgY2FzZSBXREFfREVMRVRFQkFfSU5EOgogICAgcHREZWxCYUluZCA9ICh0RGVsQkFJbmQqKShtZXNzYWdlLT5ib2R5cHRyKTsKICAgIHZvc1N0YXR1cyAgPSBXTEFOVExfQmFTZXNzaW9uRGVsKHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdERlbEJhSW5kLT5zdGFJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPmJhVElEKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byBkZWwgQkEgc2Vzc2lvbiBTVEE6JWQgVElEOiVkIFN0YXR1cyA6JWQiLAogICAgICAgICAgICAgICBwdERlbEJhSW5kLT5zdGFJZHgsCiAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPmJhVElELAogICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgIH0KICAgIFdMQU5UTF9NY0ZyZWVNc2cgKHB2b3NHQ3R4LCBtZXNzYWdlKTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICAvKm5vIHByb2Nlc3NpbmcgZm9yIG5vdyovCiAgICBicmVhazsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUHJvY2Vzc01haW5NZXNzYWdlICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX01jRnJlZU1zZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFZPU1MgdG8gZnJlZSBhIGdpdmVuIFRMIG1lc3NhZ2Ugb24gdGhlIE1haW4gdGhyZWFkIHdoZW4gdGhlcmUKICAgIGFyZSBtZXNzYWdlcyBwZW5kaW5nIGluIHRoZSBxdWV1ZSB3aGVuIHRoZSB3aG9sZSBzeXN0ZW0gaXMgYmVlbiByZXNldC4KICAgIEZvciBub3csIFRMIGRvZXMgbm90IGFsbG9jYXRlIGFueSBib2R5IHNvIHRoaXMgZnVuY3Rpb24gc2hvdXQgdHJhbnNsYXRlCiAgICBpbnRvIGEgTk9PUAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfTWNGcmVlTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBtZXNzYWdlICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX01jRnJlZU1zZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfTWNGcmVlTXNnIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6UmVjZWl2ZWQgbWVzc2FnZTogJWQgdGhyb3VnaCBtYWluIGZyZWUiLCBtZXNzYWdlLT50eXBlKSk7CgogIHN3aXRjaCggbWVzc2FnZS0+dHlwZSApCiAgewogIGNhc2UgV0RBX0hERF9BRERCQV9SRVE6CiAgY2FzZSBXREFfREVMRVRFQkFfSU5EOgogICAgLyp2b3MgZnJlZSBib2R5IHBvaW50ZXIqLwogICAgdm9zX21lbV9mcmVlKG1lc3NhZ2UtPmJvZHlwdHIpOwogICAgbWVzc2FnZS0+Ym9keXB0ciA9IE5VTEw7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgLypubyBwcm9jZXNzaW5nIGZvciBub3cqLwogICAgYnJlYWs7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfTWNGcmVlTXNnKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfVHhQcm9jZXNzTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB3aGVuIGEgbWVzc2FnZSB3YXMgc2VyaWFsaXplZCBmb3IgVEwgdGhyb3VnaCB0aGUKICAgIHR4IHRocmVhZC90YXNrLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgT3RoZXIgdmFsdWVzIGNhbiBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIHBsZWFzZSBjaGVjawogIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhQcm9jZXNzTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCk7CiAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBtZXNzYWdlICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1Byb2Nlc3NUeE1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFByb2Nlc3MgbWVzc2FnZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIHR4IGZsb3ciLCBtZXNzYWdlLT50eXBlKSk7CgogIHN3aXRjaCggbWVzc2FnZS0+dHlwZSApCiAgewogIGNhc2UgV0xBTlRMX1RYX1NJR19TVVNQRU5EOgogICAgdm9zU3RhdHVzID0gV0xBTlRMX1N1c3BlbmRDQiggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfU3VzcGVuZENCVHlwZSltZXNzYWdlLT5ib2R5cHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5yZXNlcnZlZCk7CiAgICBicmVhazsKICBjYXNlIFdMQU5UTF9UWF9SRVNfTkVFREVEOgogICAgdm9zU3RhdHVzID0gV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IoIHB2b3NHQ3R4ICk7CiAgICAgYnJlYWs7CgogIGNhc2UgV0RBX0RTX1RYX1NUQVJUX1hNSVQ6CiAgICAgIFdMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcocHZvc0dDdHgpOwogICAgICB2b3NTdGF0dXMgPSBXREFfRFNfVHhGcmFtZXMoIHB2b3NHQ3R4ICk7CiAgICAgIGJyZWFrOwoKICBjYXNlIFdEQV9EU19GSU5JU0hfVUxBOgogICAgY2FsbGJhY2tDb250ZXh0ID0gbWVzc2FnZS0+Ym9keXB0cjsKICAgIGNhbGxiYWNrUm91dGluZSA9IG1lc3NhZ2UtPmNhbGxiYWNrOwogICAgaWYgKCBOVUxMICE9IGNhbGxiYWNrUm91dGluZSApCiAgICB7CiAgICAgIGNhbGxiYWNrUm91dGluZShjYWxsYmFja0NvbnRleHQpOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgV0xBTlRMX1RYX1NOQVBTSE9UOgogICAgLypEdW1waW5nIFRMIFN0YXRlIGFuZCB0aGVuIGNvbnRpbnVpbmcgdG8gcHJpbnQKICAgICAgdGhlIERYRSBEdW1wKi8KICAgIFdMQU5UTF9UeFRocmVhZERlYnVnSGFuZGxlcihwdm9zR0N0eCk7CiAgICBXREFfVHJhbnNwb3J0Q2hhbm5lbERlYnVnKE5VTEwsIFZPU19UUlVFLCBWT1NfRkFMU0UpOwogICAgYnJlYWs7CgogIGNhc2UgV0xBTlRMX1RYX0ZBVEFMX0VSUk9SOgogICAgV0xBTlRMX0ZhdGFsRXJyb3JIYW5kbGVyKHB2b3NHQ3R4KTsKICAgIGJyZWFrOwoKICBjYXNlIFdMQU5UTF9UWF9GV19ERUJVRzoKICAgIHZvc19md0R1bXBSZXEoMjc0LCAwLCAwLCAwLCAwLCAxKTsgLy9Bc3luYyBldmVudAogICAgYnJlYWs7CgogIGNhc2UgV0xBTlRMX1RYX0tJQ0tEWEU6CiAgICBXREFfVHJhbnNwb3J0S2lja0R4ZSgpOwogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAvKm5vIHByb2Nlc3NpbmcgZm9yIG5vdyovCiAgICBicmVhazsKICB9CgogIHJldHVybiB2b3NTdGF0dXM7Cn0vKiBXTEFOVExfVHhQcm9jZXNzTXNnICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX01jRnJlZU1zZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFZPU1MgdG8gZnJlZSBhIGdpdmVuIFRMIG1lc3NhZ2Ugb24gdGhlIE1haW4gdGhyZWFkIHdoZW4gdGhlcmUKICAgIGFyZSBtZXNzYWdlcyBwZW5kaW5nIGluIHRoZSBxdWV1ZSB3aGVuIHRoZSB3aG9sZSBzeXN0ZW0gaXMgYmVlbiByZXNldC4KICAgIEZvciBub3csIFRMIGRvZXMgbm90IGFsbG9jYXRlIGFueSBib2R5IHNvIHRoaXMgZnVuY3Rpb24gc2hvdXQgdHJhbnNsYXRlCiAgICBpbnRvIGEgTk9PUAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhGcmVlTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLypOb3RoaW5nIHRvIGRvIGZvciBub3chISEqLwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9UeEZyZWVNc2cqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhGQ0ZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIHRvIHNlbmQgRkMgZnJhbWUuIEVuYWJsZQogICAgb3IgZGlzYWJsZSBMV00gbW9kZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24uCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBGVyBzZW5kcyB1cCBzcGVjaWFsIGZsb3cgY29udHJvbCBmcmFtZS4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwb2ludGVycyBhcmUgTlVMTC4KICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTb21ldGhpbmcgaXMgd3JvbmcuCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kLgoKICBTSURFIEVGRkVDVFMKICAgIE5ld2x5IGZvcm1lZCBGQyBmcmFtZSBpcyBnZW5lcmF0ZWQgYW5kIHdhaXRzIHRvIGJlIHRyYW5zbWl0dGVkLiBQcmV2aW91c2x5IHVuc2VudCBmcmFtZSB3aWxsCiAgICBiZSByZWxlYXNlZC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeEZDRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopCnsKI2lmIDAKICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB0cEhhbEZjVHhCZCAgICAgICAgIHB2RmNUeEJkID0gTlVMTDsKICB2b3NfcGt0X3QgKiAgICAgICAgIHBQYWNrZXQgPSBOVUxMOwogIHZfVThfdCAgICAgICAgICAgICAgdWNTVEFJZCA9IDA7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y0JpdENoZWNrID0gMTsKCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6IFNlbmQgRkMgZnJhbWUgJXMiLCBfX2Z1bmNfXyk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB2b3NHQ3R4ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoKICBpZiAoTlVMTCA9PSBwVExDYikKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwb2ludGVyIGluICVzIFxuIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQogIAogIC8vR2V0IG9uZSB2b3NzIHBhY2tldAogIHZvc1N0YXR1cyA9IHZvc19wa3RfZ2V0X3BhY2tldCggJnBQYWNrZXQsIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCwgc2l6ZW9mKHRIYWxGY1R4QmQpLCAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX0ZBTFNFLCBOVUxMLCBOVUxMICk7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHZvc1N0YXR1cyA9IHZvc19wa3RfcmVzZXJ2ZV9oZWFkKCBwUGFja2V0LCAodm9pZCAqKSZwdkZjVHhCZCwgc2l6ZW9mKHRIYWxGY1R4QmQpKTsKCiAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiJXM6IGZhaWxlZCB0byByZXNlcnZlIEZDIFRYIEJEICVkXG4iLF9fZnVuY19fLCBzaXplb2YodEhhbEZjVHhCZCkpKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8vR2VuZXJhdGUgbW9zdCByZWNlbnQgdGxGQ0luZm8uIE1vc3QgZmllbGRzIGFyZSBjb3JyZWN0LgogIHBUTENiLT50bEZDSW5mby5mY1NUQVRocmVzaEVuYWJsZWRNYXNrID0gMDsKICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUeE1vcmVEYXRhTWFzayA9IDA7CiAgZm9yKCB1Y1NUQUlkID0gMCwgdWNCaXRDaGVjayA9IDEgOyB1Y1NUQUlkIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyB1Y0JpdENoZWNrIDw8PSAxLCB1Y1NUQUlkICsrKQogIHsKICAgIGlmICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjRXhpc3RzKQogICAgewogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNQa3RQZW5kaW5nKQogICAgewogICAgICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUeE1vcmVEYXRhTWFzayB8PSB1Y0JpdENoZWNrOwogICAgfQoKICAgIGlmICggKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQpICYmCiAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5ibXVNZW1Db25zdW1lZCA+IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMd21UaHJlc2hvbGQpKQogICAgewogICAgICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUaHJlc2hFbmFibGVkTWFzayB8PSB1Y0JpdENoZWNrOwoKICAgICAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVGhyZXNoW3VjU1RBSWRdID0gKHRBTklfVTgpcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUx3bVRocmVzaG9sZDsKCiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtRXZlbnRSZXBvcnRlZCA9IEZBTFNFOwogICAgfQoKICB9CiAgCiAgLy9yZXF1ZXN0IGltbWVkaWF0ZSBmZWVkYmFjawogIHBUTENiLT50bEZDSW5mby5mY0NvbmZpZyB8PSAweDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAvL2ZpbGwgaW4gQkQgdG8gc2VudAogIHZvc1N0YXR1cyA9IFdMQU5IQUxfRmlsbEZjVHhCZChwdm9zR0N0eCwgJnBUTENiLT50bEZDSW5mbywgKHZvaWQgKilwdkZjVHhCZCk7CgogIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIiVzOiBGaWxsIEZDIFRYIEJEIHVuc3VjY2Vzc2Z1bFxuIiwgX19mdW5jX18pKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmIChOVUxMICE9IHBUTENiLT52b3NUeEZDQnVmKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIiVzOiBQcmV2aW91cyBGQyBUWCBCRCBub3Qgc2VudFxuIiwgX19mdW5jX18pKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dm9zVHhGQ0J1Zik7CiAgfQoKICBwVExDYi0+dm9zVHhGQ0J1ZiA9IHBQYWNrZXQ7CgogIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHBQYWNrZXQsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKICB2b3NTdGF0dXMgPSBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6IHNlbmQgRkMgZnJhbWUgbGVhdmUgJXMiLCBfX2Z1bmNfXykpOwojZW5kaWYKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRUeFJlc291cmNlc0NCCgogIERFU0NSSVBUSU9OCiAgICBQcm9jZXNzaW5nIGZ1bmN0aW9uIGZvciBSZXNvdXJjZSBuZWVkZWQgc2lnbmFsLiBBIHJlcXVlc3Qgd2lsbCBiZSBpc3N1ZWQKICAgIHRvIEJBTCB0byBnZXQgbW9yZSB0eCByZXNvdXJjZXMuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIE90aGVyIHZhbHVlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCBwbGVhc2UgY2hlY2sKICBjb3JyZXNwb25kaW5nIEFQSSBmb3IgbW9yZSBpbmZvLgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiICAgICAgPSBOVUxMOwogIHZfVTMyX3QgICAgICAgICB1UmVzQ291bnQgID0gV0RBX1RMSV9NSU5fUkVTX0RBVEE7CiAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdl9VOF90ICAgICAgICAgIHVjTWdtdCAgICAgPSAwOwogIHZfVThfdCAgICAgICAgICB1Y0JBUCAgICAgID0gMDsKICB2X1U4X3QgICAgICAgICAgdWNEYXRhICAgICA9IDA7CiNpZmRlZiBXTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTgogIHRCc3NTeXN0ZW1Sb2xlIHN5c3RlbVJvbGU7CiAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKI2VuZGlmCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIgogICAgICAgICAgICAgICAiIFdMQU5UTF9Qcm9jZXNzVHhNZXNzYWdlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBHZXQgdHggcmVzb3VyY2VzIGZyb20gQkFMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zU3RhdHVzID0gV0RBX0RTX0dldFR4UmVzb3VyY2VzKCBwdm9zR0N0eCwgJnVSZXNDb3VudCApOwoKICBpZiAoIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSAmJiAoVk9TX1NUQVRVU19FX1JFU09VUkNFUyAhPSB2b3NTdGF0dXMpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgZmFpbGVkIHRvIGdldCByZXNvdXJjZXMgZnJvbSBCQUwsIEVycjogJWQiLAogICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICAvKiBDdXJyZW50bHkgb25seSBMaW51eCBCQUwgcmV0dXJucyB0aGUgRV9SRVNPVVJDRVMgZXJyb3IgY29kZSB3aGVuIGl0IGlzIHJ1bm5pbmcgCiAgICAgb3V0IG9mIEJEL1BEVXMuIFRvIG1ha2UgdXNlIG9mIHRoaXMgaW50ZXJydXB0IGZvciB0aHJvdWdocHV0IGVuaGFuY2VtZW50LCBzaW1pbGFyCiAgICAgY2hhbmdlcyBzaG91bGQgYmUgZG9uZSBpbiBCQUwgY29kZSBvZiBBTVNTIGFuZCBXTSAqLwogIGlmIChWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTID09IHZvc1N0YXR1cykKICB7CiNpZmRlZiBWT0xBTlNfUEVSRgogICAgIFdMQU5IQUxfRW5hYmxlSWRsZUJkUGR1SW50ZXJydXB0KHB2b3NHQ3R4LCAodEFOSV9VOCliZFBkdUludGVycnVwdEdldFRocmVzaG9sZCk7CiAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDogRW5hYmxpbmcgSWRsZSBCRC9QRFUgaW50ZXJydXB0LCBDdXJyZW50IHJlc291cmNlcyA9ICVkIiwgdVJlc0NvdW50KTsKI2Vsc2UKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKI2VuZGlmCiAgfQoKICBwVExDYi0+dVJlc0NvdW50ID0gdVJlc0NvdW50OwogIAoKI2lmZGVmIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCiAgLyogRklYTUU6IGRpc2FibGVkIHNpbmNlIGNyZWF0aW5nIGlzc3VlcyBpbiBwb3dlci1zYXZlLCBuZWVkcyB0byBiZSBhZGRyZXNzZWQgKi8gCiAgcFRMQ2ItPnNlbmRGQ0ZyYW1lICsrOwogIHBNYWMgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIHB2b3NHQ3R4KTsKICBzeXN0ZW1Sb2xlID0gd2RhR2V0R2xvYmFsU3lzdGVtUm9sZShwTWFjKTsKICBpZiAoZVNZU1RFTV9BUF9ST0xFID09IHN5c3RlbVJvbGUpCiAgewogICAgIGlmIChwVExDYi0+c2VuZEZDRnJhbWUgJSAxNiA9PSAwKQogICAgIHsKICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICJUcmFuc21pdCBGQyIpKTsKICAgICAgICAgV0xBTlRMX1R4RkNGcmFtZSAocHZvc0dDdHgpOwogICAgIH0gCiAgfQojZW5kaWYgLy9XTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTiAKCiAgdWNEYXRhID0gKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfREFUQSApOwogIHVjQkFQICA9ICggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX0JBUCApICYmCiAgICAgICAgICAgKCBOVUxMICE9IHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKTsKICB1Y01nbXQgPSAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApICYmCiAgICAgICAgICAgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICk7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDogRXZhbCBSZXN1bWUgdHggUmVzOiAlZCBEQVRBOiAlZCBCQVA6ICVkIE1HTVQ6ICVkIiwKICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHVjRGF0YSwgdWNCQVAsIHVjTWdtdCkpOwoKICBpZiAoKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgJiYKICAgICAgKCggMCAhPSB1Y0RhdGEgKSB8fCAoIDAgIT0gdWNNZ210ICkgfHwgKCAwICE9IHVjQkFQICkgKSApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiSXNzdWluZyBYbWl0IHN0YXJ0IHJlcXVlc3QgdG8gQkFMIGZvciBhdmFpbCByZXMgU1lOQyIpKTsKICAgIHZvc1N0YXR1cyA9V0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgfQogIHJldHVybiB2b3NTdGF0dXM7Cn0vKldMQU5UTF9HZXRUeFJlc291cmNlc0NCKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgVXRpbGl0eSBmdW5jdGlvbnMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyCgogIERFU0NSSVBUSU9OCiAgICBJbmxpbmUgZnVuY3Rpb24gZm9yIHRyYW5zbGF0aW5nIGFuZCA4MDIuMTEgaGVhZGVyIGludG8gYW4gODAyLjMgaGVhZGVyLgoKICBERVBFTkRFTkNJRVMKCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgICBwVExDYjogICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgIElOL09VVCAKICAgIHVjU3RhSWQ6ICAgICAgICAgIHN0YXRpb24gSUQuIEluY2FzZSBvZiBURExTLCB0aGlzIHJldHVybnMgYWN0dWFsIFRETFMKICAgICAgICAgICAgICAgICAgICAgIHN0YXRpb24gSUQgdXNlZAoKICAgSU4vT1VUCiAgICB2b3NEYXRhQnVmZjogICAgICB2b3MgZGF0YSBidWZmZXIsIHdpbGwgY29udGFpbiB0aGUgbmV3IGhlYWRlciBvbiBvdXRwdXQKCiAgIE9VVAogICAgcHZvc1N0YXR1czogICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgZXJyb3IgY29kZXMgbWlnaHQgYmUgcmV0dXJuZWQgZnJvbSB0aGUgdm9zIGFwaSB1c2VkIGluIHRoZSBmdW5jdGlvbgogICAgcGxlYXNlIGNoZWNrIHRob3NlIHJldHVybiB2YWx1ZXMuCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyCigKICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYsCiAgVk9TX1NUQVRVUyogICAgIHB2b3NTdGF0dXMsCiAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAogIHZfVThfdCAgICAgICAgICAqcHVjU3RhSWQsCiAgV0xBTlRMX01ldGFJbmZvVHlwZSAqdGxNZXRhSW5mbywKICB2X1U4X3QgICAgICAgICAgKnVjV0RTRW5hYmxlZCwKICB2X1U4X3QgICAgICAgICAgKmV4dHJhSGVhZFNwYWNlCikKewogIFdMQU5UTF84MDIzSGVhZGVyVHlwZSAgdzgwMjNIZWFkZXI7CiAgV0xBTlRMXzgwMjExSGVhZGVyVHlwZSAqcHc4MDIxMUhlYWRlcjsgLy8gQWxsb2NhdGUgYW4gYWxpZ25lZCBCRCBhbmQgdGhlbiBmaWxsIGl0LiAKICBWT1NfU1RBVFVTICAgICAgICAgICAgIHZvc1N0YXR1czsKICB2X1U4X3QgICAgICAgICAgICAgICAgIE1hbmRhdG9yeXVjSGVhZGVyU2l6ZSA9IFdMQU44MDIxMV9NQU5EQVRPUllfSEVBREVSX1NJWkU7CiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y0hlYWRlclNpemUgPSAwOwogIHZfVk9JRF90ICAgICAgICAgICAgICAgKnBwdkJESGVhZGVyID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogIHBDbGllbnRTVEEgPSBOVUxMOwogIHZfVThfdCAgICAgICAgICAgICAgICAgdWNRb1NPZmZzZXQgPSBXTEFOODAyMTFfTUFOREFUT1JZX0hFQURFUl9TSVpFOwogIHZfVThfdCAgICAgICAgICAgICAgICAgdWNTdGFJZDsKI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECiAgdl9CT09MX3QgICAgICAgICAgICAgICBiSUFQUFR4d2l0aExMQyA9IFZPU19GQUxTRTsKICB2X1NJWkVfdCAgICAgICAgICAgICAgIHdJQVBQU25hcFNpemUgPSBXTEFOVExfTExDX0hFQURFUl9MRU47CiAgdl9VOF90ICAgICAgICAgICAgICAgICB3SUFQUFNuYXBbV0xBTlRMX0xMQ19IRUFERVJfTEVOXSA9IHswfTsKI2VuZGlmCiAgKnVjV0RTRW5hYmxlZCA9IDA7IC8vIGRlZmF1bHQgV0RTIG9mZi4KICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgJnc4MDIzSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih3ODAyM0hlYWRlcikpOwoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6IFBhY2tldCBwb3AgaGVhZGVyIGZhaWxzIG9uIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgaWYoIE5VTEwgPT0gcHVjU3RhSWQgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6IEludmFsaWQgcG9pbnRlciBmb3IgU3RhSWQiKSk7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgdWNTdGFJZCA9ICpwdWNTdGFJZDsKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCgogIGlmICggV0xBTl9TVEFfSU5GUkEgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0tPndTVEFEZXNjLndTVEFUeXBlCiAgICAgICYmIHBUTENiLT51Y1RkbHNQZWVyQ291bnQgKQogIHsKICAgIHZfVThfdCB1Y0luZGV4ID0gMDsKICAgIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfU1RBX0NPVU5UIDsgdWNJbmRleCsrKQogICAgewogICAgICBpZiAoIHVjSW5kZXggIT0gdWNTdGFJZCAmJiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSAmJiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS0+dWNFeGlzdHMgJiYKICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS0+dGxTdGF0ZSA9PSBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQpICYmCiAgICAgICAgICAoIXBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLT51Y1R4U3VzcGVuZGVkKSAmJgogICAgICAgICAgdm9zX21lbV9jb21wYXJlKCAodm9pZCopcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0tPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzLAogICAgICAgICAgICAodm9pZCopdzgwMjNIZWFkZXIudkRBLCA2KSApCiAgICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgIldMQU4gVEw6IEdvdCBhIFRETFMgc3RhdGlvbi4gVXNpbmcgdGhhdCBpbmRleCIpKTsKICAgICAgICB1Y1N0YUlkID0gdWNJbmRleDsKICAgICAgICAqcHVjU3RhSWQgPSB1Y1N0YUlkOwogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXTsKICAgICAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KI2VuZGlmCgojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKaWYgKCgwID09IHc4MDIzSGVhZGVyLnVzTGVuVHlwZSkgJiYgKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNFc2VTdGEpKQp7CiAgICB2b3NfcGt0X2V4dHJhY3RfZGF0YSh2b3NEYXRhQnVmZiwwLCZ3SUFQUFNuYXBbMF0sJndJQVBQU25hcFNpemUpOwogICAgaWYgKHZvc19tZW1fY29tcGFyZSh3SUFQUFNuYXAsV0xBTlRMX0FJUk9ORVRfU05BUF9IRUFERVIsV0xBTlRMX0xMQ19IRUFERVJfTEVOKSkKICAgIHsKICAgICAgICAvKlRoZSBTTkFQIGFuZCB0aGUgcHJvdG9jb2wgdHlwZSBhcmUgYWxyZWFkeSBpbiB0aGUgZGF0YSBidWZmZXIuCiAgICAgICAgIFRoZXkgYXJlIGZpbGxlZCBieSB0aGUgYXBwbGljYXRpb24gKHdwYV9zdXBwbGljYW50KS4gU28sIFNraXAgQWRkaW5nIExMQyBiZWxvdy4qLwogICAgICAgICBiSUFQUFR4d2l0aExMQyA9IFZPU19UUlVFOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJJQVBQVHh3aXRoTExDID0gVk9TX0ZBTFNFOwogICAgfQp9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLwoKICBpZiAoKDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNBZGRSbXZMTEMpCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAogICAgICAmJiAoIWJJQVBQVHh3aXRoTExDKQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KICAgICApCiAgewogICAgLyogUHVzaCB0aGUgbGVuZ3RoICovCiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3B1c2hfaGVhZCh2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAmdzgwMjNIZWFkZXIudXNMZW5UeXBlLCBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKSk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFBhY2tldCBwdXNoIGV0aGVyIHR5cGUgZmFpbHMgb24iCiAgICAgICAgICAgICAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOwogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiNpZmRlZiBCVEFNUF9URVNUCiAgICAvLyBUaGUgU1RBIHNpZGUgd2lsbCBleGVjdXRlIHRoaXMsIGEgaGFjayB0byB0ZXN0IEJUQU1QIGJ5IHVzaW5nIHRoZQogICAgLy8gaW5mcmEgc2V0dXAuIE9uIHJlYWwgQlRBTVAgdGhpcyB3aWxsIGNvbWUgZnJvbSBCQVAgaXRzZWxmLgogICAgewogICAgc3RhdGljIHZfVThfdCBXTEFOVExfQlRfQU1QX0xMQ19IRUFERVJbXSA9ICB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgxOSwgMHg1OCB9OwogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsIFdMQU5UTF9CVF9BTVBfTExDX0hFQURFUiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0xBTlRMX0JUX0FNUF9MTENfSEVBREVSKSk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUGFja2V0IHB1c2ggTExDIGhlYWRlciBmYWlscyBvbiIKICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQogICAgfQojZWxzZQogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsIFdMQU5UTF9MTENfSEVBREVSLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXTEFOVExfTExDX0hFQURFUikpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFBhY2tldCBwdXNoIExMQyBoZWFkZXIgZmFpbHMgb24iCiAgICAgICAgICAgICAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOwogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KI2VuZGlmCiAgfS8qSWYgYWRkIExMQyBpcyBlbmFibGVkKi8KICBlbHNlCiAgewojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKICAgICAgYklBUFBUeHdpdGhMTEMgPSBWT1NfRkFMU0U7IC8qUmVzZXQgdGhlIEZsYWcgaGVyZSB0byBzdGFydCBhZnJlc2ggd2l0aCB0aGUgbmV4dCBUWCBwa3QqLwojZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFNUQSBDbGllbnQgcmVnaXN0ZXJlZCB0byBub3QgcmVtb3ZlIExMQyIKICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgfQoKI2lmZGVmIEJUQU1QX1RFU1QKICBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSA9IFdMQU5fU1RBX0JUX0FNUDsKI2VuZGlmCgogIC8vIEZpbmQgdGhlIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgODAyLjExIGhlYWRlciBmb3JtYXQKICAvLyBiYXNlZCBvbiB0aGUgZnJhbWUgY29udHJvbCBmaWVsZHMuCiAgdWNIZWFkZXJTaXplID0gTWFuZGF0b3J5dWNIZWFkZXJTaXplOwogIGlmIChwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQpCiAgeyAgCiAgICB1Y0hlYWRlclNpemUgKz0gc2l6ZW9mKHB3ODAyMTFIZWFkZXItPnVzUW9zQ3RybCk7CiAgfQogIGlmIChwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSA9PSBXTEFOX1NUQV9CVF9BTVApCiAgeyAgCiAgICB1Y0hlYWRlclNpemUgKz0gc2l6ZW9mKHB3ODAyMTFIZWFkZXItPm9wdHZBNCk7CiAgICB1Y1FvU09mZnNldCArPSBzaXplb2YocHc4MDIxMUhlYWRlci0+b3B0dkE0KTsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIDogSGVhZGVyIHNpemUgPSAlZCAiLCB1Y0hlYWRlclNpemUpKTsKCiAgdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHZvc0RhdGFCdWZmLCAmcHB2QkRIZWFkZXIsIHVjSGVhZGVyU2l6ZSApOwogIGlmICggTlVMTCA9PSBwcHZCREhlYWRlciApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Vk9TUyBwYWNrZXQgY29ycnVwdGVkICIpKTsKICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgcmV0dXJuICpwdm9zU3RhdHVzOwogIH0KCgogIC8vIE9LIG5vdyB3ZSBoYXZlIHRoZSBzcGFjZS4gRmlsbCB0aGUgODAyMTEgaGVhZGVyCiAgLyogRmlsbCBBMiAqLwogIHB3ODAyMTFIZWFkZXIgPSAoV0xBTlRMXzgwMjExSGVhZGVyVHlwZSAqKShwcHZCREhlYWRlcik7CiAgLy8gb25seSBjbGVhciB0aGUgcmVxdWlyZWQgc3BhY2UuCiAgdm9zX21lbV9zZXQoIHB3ODAyMTFIZWFkZXIsIHVjSGVhZGVyU2l6ZSwgMCApOwogIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEyLCB3ODAyM0hlYWRlci52U0EsICBWT1NfTUFDX0FERFJfU0laRSk7CgoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCggV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBDbGllbnRTVEEtPnRsU3RhdGUgfHwKICAgICAgICBwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQgKSAmJiAodGxNZXRhSW5mby0+dWNJc1dhaSAhPSAxKSkKI2Vsc2UKICBpZiAoIFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCA9PSBwQ2xpZW50U1RBLT50bFN0YXRlIHx8CiAgICAgICBwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQgKQojZW5kaWYKICB7CiAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC53ZXAgPQogICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUHJvdGVjdGVkRnJhbWU7CiAgfQoKICBwdzgwMjExSGVhZGVyLT51c0R1cmF0aW9uSWQgPSAwOwogIHB3ODAyMTFIZWFkZXItPnVzU2VxQ3RybCAgICA9IDA7CgogIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnR5cGUgICAgID0gV0xBTlRMXzgwMjExX0RBVEFfVFlQRTsKCgoKICBpZihwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQpCiAgewogICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5zdWJUeXBlICA9IFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFOwoKICAgICAgKigodl9VMTZfdCAqKSgodl9VOF90ICopcHB2QkRIZWFkZXIgKyB1Y1FvU09mZnNldCkpID0gdGxNZXRhSW5mby0+dWNVUDsKCiAgfQogIGVsc2UKICB7CiAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnN1YlR5cGUgID0gMDsKICAgICAgdGxNZXRhSW5mby0+dWNVUCA9IDA7CiAgICAgIHRsTWV0YUluZm8tPnVjVElEID0gMDsKCiAgLy8gTk8gTk8gTk8gLSB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgdG8gd3JpdGUgdGhlIFFPUyBjdHJsICAKICAvLyBmaWVsZCwgaXQgd2lsbCBvdmVyd3JpdGUgdGhlIGZpcnN0IDIgYnl0ZXMgb2YgdGhlIGRhdGEgcGFja2V0KExMQyBoZWFkZXIpCiAgLy8gcHc4MDIxMUhlYWRlci0+dXNRb3NDdHJsICAgICAgICAgPSAwOwogIH0KCgogIHN3aXRjaCggcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogIHsKICAgICBjYXNlIFdMQU5fU1RBX0lCU1M6CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDA7CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuZnJvbURTICAgICAgICA9IDA7CgogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9NQUNBRERSX3QqKSZ3ODAyM0hlYWRlci52REEpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEzLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52QlNTSURmb3JJQlNTICwKICAgICAgICAgICAgICBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgICAgYnJlYWs7CgogICAgIGNhc2UgV0xBTl9TVEFfQlRfQU1QOgogICAgICAgICp1Y1dEU0VuYWJsZWQgPSAxOyAvLyBXRFMgb24uCiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDE7CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuZnJvbURTICAgICAgICA9IDE7CiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkExLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyk7CiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTIsCiAgICAgICAgICAgICAgdzgwMjNIZWFkZXIudlNBLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkEzLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyk7CiAgICAgICAgLyogZmlsbCB0aGUgb3B0aW9uYWwgQTQgaGVhZGVyICovCiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT5vcHR2QTQsCiAgICAgICAgICAgICAgdzgwMjNIZWFkZXIudlNBLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiQlRBTVAgQ0FTRSBOT1cgLS0tLS0tLS0tc3RhaWQ9JWQiLAogICAgICAgICAgICAgICAgIHVjU3RhSWQpKTsKICAgICAgICBicmVhazsKCiAgICAgY2FzZSBXTEFOX1NUQV9TT0ZUQVA6CiAgICAgICAgKnVjV0RTRW5hYmxlZCA9IDA7IC8vIFdEUyBvZmYuCiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDA7CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuZnJvbURTICAgICAgICA9IDE7CiAgICAgICAgLypDb3B5IHRoZSBEQSB0byBBMSovCiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTEsIHc4MDIzSGVhZGVyLnZEQSAsIFZPU19NQUNfQUREUl9TSVpFKTsgICAKICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTIsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcyk7CiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTMsCiAgICAgICAgICAgICAgdzgwMjNIZWFkZXIudlNBLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAic3cgODAyIHRvIDgwMjExIHNvZnRhcCBjYXNlICAtLS0tLS0tLS1zdGFpZD0lZCIsCiAgICAgICAgICAgICAgICAgdWNTdGFJZCkpOwogICAgICAgIGJyZWFrOwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAgICBjYXNlIFdMQU5fU1RBX1RETFM6CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDA7CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuZnJvbURTICAgICAgICA9IDA7CiAgICAgICAgLypGaXggbWUqLwogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEzLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52QlNTSURmb3JJQlNTICwKICAgICAgICAgICAgICBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICgiVEw6VERMUyBDQVNFIE5PVyAtLS0tLS0tLS1zdGFpZD0lZCIpLCB1Y1N0YUlkKTsKICAgICAgICBicmVhazsKI2VuZGlmCiAgICAgY2FzZSBXTEFOX1NUQV9JTkZSQToKICAgICBkZWZhdWx0OgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAxOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAwOwogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEzLCB3ODAyM0hlYWRlci52REEgLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiUkVHVUxBUiBJTkZSQSBMSU5LIENBU0UtLS0tLS0tLS1zdGFpZD0lZCIsCiAgICAgICAgICAgICAgICAgdWNTdGFJZCkpOwogICAgICAgIGJyZWFrOwogIH0KICAvLyBPSyBub3cgd2UgaGF2ZSB0aGUgc3BhY2UuIEZpbGwgdGhlIDgwMjExIGhlYWRlcgogIC8qIEZpbGwgQTIgKi8KICBwdzgwMjExSGVhZGVyID0gKFdMQU5UTF84MDIxMUhlYWRlclR5cGUgKikocHB2QkRIZWFkZXIpOwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBCRUdJTiBMT0cgRlVOQ1RJT04gICAgISEhIFJlbW92ZSBtZSBvciBjbGVhbiBtZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiNpZiAwIC8vZGVmIFdMQU5UTF9ERUJVRwoKI2RlZmluZSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSAgICAxNgojZGVmaW5lIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFICAgIDQKCnN0YXRpYyB2X1ZPSURfdCBXTEFOVExfRGVidWdGcmFtZQooCiAgIHZfUFZPSURfdCAgIGRhdGFQb2ludGVyLAogICB2X1UzMl90ICAgICBkYXRhU2l6ZQopCnsKICAgdl9VOF90ICAgbGluZUJ1ZmZlcltXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORV07CiAgIHZfVTMyX3QgIG51bUxpbmVzOwogICB2X1UzMl90ICBudW1CeXRlczsKICAgdl9VMzJfdCAgaWR4OwogICB2X1U4X3QgICAqbGluZVBvaW50ZXI7CgogICBudW1MaW5lcyA9IGRhdGFTaXplIC8gV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkU7CiAgIG51bUJ5dGVzID0gZGF0YVNpemUgJSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORTsKICAgbGluZVBvaW50ZXIgPSAodl9VOF90ICopZGF0YVBvaW50ZXI7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU0FMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOIFRMOkZyYW1lIERlYnVnIEZyYW1lIFNpemUgJWQsIFBvaW50ZXIgMHglcEsiLCBkYXRhU2l6ZSwgZGF0YVBvaW50ZXIpKTsKICAgZm9yKGlkeCA9IDA7IGlkeCA8IG51bUxpbmVzOyBpZHgrKykKICAgewogICAgICBtZW1zZXQobGluZUJ1ZmZlciwgMCwgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUpOwogICAgICBtZW1jcHkobGluZUJ1ZmZlciwgbGluZVBvaW50ZXIsIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FKTsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6MHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMngiLAogICAgICAgICAgICAgICAgIGxpbmVCdWZmZXJbMF0sIGxpbmVCdWZmZXJbMV0sIGxpbmVCdWZmZXJbMl0sIGxpbmVCdWZmZXJbM10sIGxpbmVCdWZmZXJbNF0sIGxpbmVCdWZmZXJbNV0sIGxpbmVCdWZmZXJbNl0sIGxpbmVCdWZmZXJbN10sCiAgICAgICAgICAgICAgICAgbGluZUJ1ZmZlcls4XSwgbGluZUJ1ZmZlcls5XSwgbGluZUJ1ZmZlclsxMF0sIGxpbmVCdWZmZXJbMTFdLCBsaW5lQnVmZmVyWzEyXSwgbGluZUJ1ZmZlclsxM10sIGxpbmVCdWZmZXJbMTRdLCBsaW5lQnVmZmVyWzE1XSkpOwogICAgICBsaW5lUG9pbnRlciArPSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORTsKICAgfQoKICAgaWYoMCA9PSBudW1CeXRlcykKICAgICAgcmV0dXJuOwoKICAgbWVtc2V0KGxpbmVCdWZmZXIsIDAsIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FKTsKICAgbWVtY3B5KGxpbmVCdWZmZXIsIGxpbmVQb2ludGVyLCBudW1CeXRlcyk7CiAgIGZvcihpZHggPSAwOyBpZHggPCBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSAvIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFOyBpZHgrKykKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU0FMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOIFRMOjB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IiwKICAgICAgICAgICAgICAgIGxpbmVCdWZmZXJbaWR4ICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEVdLCBsaW5lQnVmZmVyWzEgKyBpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0sCiAgICAgICAgICAgICAgICBsaW5lQnVmZmVyWzIgKyBpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0sIGxpbmVCdWZmZXJbMyArIGlkeCAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFXSkpOwogICAgICBpZigoKGlkeCArIDEpICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEUpID49IG51bUJ5dGVzKQogICAgICAgICBicmVhazsKICAgfQoKICAgcmV0dXJuOwp9CiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBFTkQgTE9HIEZVTkNUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIKCiAgREVTQ1JJUFRJT04KICAgIElubGluZSBmdW5jdGlvbiBmb3IgdHJhbnNsYXRpbmcgYW5kIDgwMi4xMSBoZWFkZXIgaW50byBhbiA4MDIuMyBoZWFkZXIuCgogIERFUEVOREVOQ0lFUwoKCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgIHBUTENiOiAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU3RhSWQ6ICAgICAgICAgIHN0YXRpb24gSUQKICAgIHVjSGVhZGVyTGVuOiAgICAgIExlbmd0aCBvZiB0aGUgaGVhZGVyIGZyb20gQkQKICAgIHVjQWN0dWFsSExlbjogICAgIExlbmd0aCBvZiBoZWFkZXIgaW5jbHVkaW5nIHBhZGRpbmcgb3IgYW55IG90aGVyIHRyYWlsZXJzCgogICBJTi9PVVQKICAgIHZvc0RhdGFCdWZmOiAgICAgIHZvcyBkYXRhIGJ1ZmZlciwgd2lsbCBjb250YWluIHRoZSBuZXcgaGVhZGVyIG9uIG91dHB1dAoKICAgT1VUCiAgICBwdm9zU3RhdHVzOiAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgoKICAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlcgooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAogIFZPU19TVEFUVVMqICAgICBwdm9zU3RhdHVzLAogIHZfVTE2X3QgICAgICAgICB1c0FjdHVhbEhMZW4sCiAgdl9VOF90ICAgICAgICAgIHVjSGVhZGVyTGVuLAogIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKICB2X1U4X3QgICAgICAgICAgdWNTVEFJZCwKICB2X0JPT0xfdCAgICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICBXTEFOVExfODAyM0hlYWRlclR5cGUgIHc4MDIzSGVhZGVyOwogIFdMQU5UTF84MDIxMUhlYWRlclR5cGUgdzgwMjExSGVhZGVyOwogIHZfVThfdCAgICAgICAgICAgICAgICAgYXVjTExDSGVhZGVyW1dMQU5UTF9MTENfSEVBREVSX0xFTl07CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VMTZfdCAgICAgICAgICAgICAgICB1c0RhdGFTdGFydE9mZnNldCA9IDA7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIGlmICggc2l6ZW9mKHc4MDIxMUhlYWRlcikgPCB1Y0hlYWRlckxlbiApCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAiV2FybmluZyAhOiBDaGVjayB0aGUgaGVhZGVyIHNpemUgZm9yIHRoZSBSeCBmcmFtZSBzdHJ1Y3R1cmU9JWQgcmVjZWl2ZWQ9JWRuIiwKICAgICAgIHNpemVvZih3ODAyMTFIZWFkZXIpLCB1Y0hlYWRlckxlbikpOwogICAgIHVjSGVhZGVyTGVuID0gc2l6ZW9mKHc4MDIxMUhlYWRlcik7CiAgfQoKICAvLyBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIGhlYWRlcnMgb2YgYWxsIHNpemVzLCAzIGFkZHJlc3MsIDMgYWRkciBRT1MsCiAgLy8gV0RTIG5vbi1RT1MgYW5kIFdEUyBRb1MgZXRjLiBXZSBoYXZlIHNwYWNlIGZvciBhbGwgaW4gdGhlIDgwMi4xMSBoZWFkZXIgc3RydWN0dXJlLgogIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCAmdzgwMjExSGVhZGVyLCB1Y0hlYWRlckxlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gcG9wIDgwMjExIGhlYWRlciBmcm9tIHBhY2tldCAlZCIsCiAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIHN3aXRjaCAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC5mcm9tRFMgKQogIHsKICBjYXNlIDA6CiAgICBpZiAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC50b0RTICkKICAgIHsKICAgICAgLy9Tb2Z0QVAgQVAgbW9kZQogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMywgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAiV0xBTiBUTCBTb2Z0QVA6IDgwMiAzIERBICUwOHggU0EgJTA4eCIsCiAgICAgICAgICAgICAgICAgIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjNIZWFkZXIudlNBKSk7CiAgICB9CiAgICBlbHNlIAogICAgewogICAgICAvKiBJQlNTICovCiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEyLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICB9CiAgICBicmVhazsKICBjYXNlIDE6CiAgICBpZiAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC50b0RTICkKICAgIHsKICAgICAgLyogQlQtQU1QIGNhc2UgKi8KICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgIH0KICAgIGVsc2UKICAgIHsgLyogSW5mcmEgKi8KICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTMsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgIH0KICAgIGJyZWFrOwogIH0KCiAgaWYoIHVzQWN0dWFsSExlbiA+IHVjSGVhZGVyTGVuICkKICB7CiAgICAgdXNEYXRhU3RhcnRPZmZzZXQgPSB1c0FjdHVhbEhMZW4gLSB1Y0hlYWRlckxlbjsKICB9CgogIGlmICggMCA8IHVzRGF0YVN0YXJ0T2Zmc2V0ICkKICB7CiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3RyaW1faGVhZCggdm9zRGF0YUJ1ZmYsIHVzRGF0YVN0YXJ0T2Zmc2V0ICk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHRyaW0gaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1NUQURlc2MudWNBZGRSbXZMTEMKI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECiAgICAmJiAoIWJGb3J3YXJkSUFQUHdpdGhMTEMpCiNlbmRpZiAvKiAgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KICAgICApCiAgewogICAgLy8gRXh0cmFjdCB0aGUgTExDIGhlYWRlcgogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wb3BfaGVhZCggdm9zRGF0YUJ1ZmYsIGF1Y0xMQ0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfSEVBREVSX0xFTik7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHBvcCBMTEMgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CgogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiAgICAvL0V4dHJhY3QgdGhlIGxlbmd0aAogICAgdm9zX21lbV9jb3B5KCZ3ODAyM0hlYWRlci51c0xlblR5cGUsCiAgICAgICZhdWNMTENIZWFkZXJbV0xBTlRMX0xMQ19IRUFERVJfTEVOIC0gc2l6ZW9mKHc4MDIzSGVhZGVyLnVzTGVuVHlwZSldLAogICAgICBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKSApOwogIH0KICBlbHNlCiAgewogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ODAyM0hlYWRlci51c0xlblR5cGUpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gZ2V0IHBhY2tldCBsZW5ndGggJWQiLAogICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6IEJUQU1QIGxlbiAoZXRoZXJ0eXBlKSBmbGQgPSAlZCIsCiAgICAgICAgdzgwMjNIZWFkZXIudXNMZW5UeXBlKSk7CiAgICB3ODAyM0hlYWRlci51c0xlblR5cGUgPSB2b3NfY3B1X3RvX2JlMTYodzgwMjNIZWFkZXIudXNMZW5UeXBlKTsKICB9CgogIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCAmdzgwMjNIZWFkZXIsIHNpemVvZih3ODAyM0hlYWRlcikpOwoKI2lmZGVmIEJUQU1QX1RFU1QKICB7CiAgLy8gQVAgc2lkZSB3aWxsIGV4ZWN1dGUgdGhpcy4KICB2X1U4X3QgKnRlbXBfdzgwMjNIZWFkZXIgPSBOVUxMOwogIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgMCwKICAgICZ0ZW1wX3c4MDIzSGVhZGVyLCBzaXplb2YodzgwMjNIZWFkZXIpICk7CiAgfQojZW5kaWYKI2lmIDAgLypUTF9ERUJVRyovCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NEYXRhQnVmZiwgJnVzTGVuKTsKICB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgYXVjRGF0YSwgdXNMZW4pOwoKICBXTEFOVExfRGVidWdGcmFtZShhdWNEYXRhLCB1c0xlbik7CgogIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCBhdWNEYXRhLCB1c0xlbik7CgojZW5kaWYKCiAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciovCgpWT1NfU1RBVFVTCldMQU5UTF9Nb25UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlcgooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAogIFdMQU5UTF9DYlR5cGUqICBwVExDYgopCnsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0OwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbjsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzQWN0dWFsSExlbiA9IDA7CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0RhdGFTdGFydE9mZnNldCA9IDA7CiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICBhdWNCREhlYWRlcjsKICAgV0xBTlRMXzgwMjNIZWFkZXJUeXBlICAgIHc4MDIzSGVhZGVyOwogICBXTEFOVExfODAyMTFIZWFkZXJUeXBlICAgdzgwMjExSGVhZGVyOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgYXVjTExDSGVhZGVyW1dMQU5UTF9MTENfSEVBREVSX0xFTl07CgogICBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwICk7CiAgIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICAgdXNNUERVRE9mZnNldCA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChhdWNCREhlYWRlcik7CiAgIHVjTVBEVUhMZW4gICAgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfTEVOKGF1Y0JESGVhZGVyKTsKICAgaWYgKHVzTVBEVURPZmZzZXQgPiB1Y01QRFVIT2Zmc2V0KQogICB7CiAgICAgIHVzQWN0dWFsSExlbiA9IHVzTVBEVURPZmZzZXQgLSB1Y01QRFVIT2Zmc2V0OwogICB9CgogIGlmICggc2l6ZW9mKHc4MDIxMUhlYWRlcikgPCB1Y01QRFVITGVuICkKICB7CiAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXYXJuaW5nICE6IENoZWNrIHRoZSBoZWFkZXIgc2l6ZSBmb3IgdGhlIFJ4IGZyYW1lIHN0cnVjdHVyZT0lZCByZWNlaXZlZD0lZG4iLAogICAgICAgc2l6ZW9mKHc4MDIxMUhlYWRlciksIHVjTVBEVUhMZW4pKTsKICAgICB1Y01QRFVITGVuID0gc2l6ZW9mKHc4MDIxMUhlYWRlcik7CiAgfQoKICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgJnc4MDIxMUhlYWRlciwgdWNNUERVSExlbik7CiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byBwb3AgODAyMTEgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwoKICAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KICBzd2l0Y2ggKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwuZnJvbURTICkKICB7CiAgY2FzZSAwOgogICAgaWYgKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwudG9EUyApCiAgICB7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkEzLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEyLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMIFNvZnRBUDogODAyIDMgREEgJTA4eCBTQSAlMDh4IiwKICAgICAgICAgICAgICAgICAgdzgwMjNIZWFkZXIudkRBLCB3ODAyM0hlYWRlci52U0EpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgMToKICAgIGlmICggdzgwMjExSGVhZGVyLndGcm1DdHJsLnRvRFMgKQogICAgewogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMywgVk9TX01BQ19BRERSX1NJWkUpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGlmKCB1c0FjdHVhbEhMZW4gPiB1Y01QRFVITGVuICkKICB7CiAgICAgdXNEYXRhU3RhcnRPZmZzZXQgPSB1c0FjdHVhbEhMZW4gLSB1Y01QRFVITGVuOwogIH0KCiAgaWYgKCAwIDwgdXNEYXRhU3RhcnRPZmZzZXQgKQogIHsKICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfdHJpbV9oZWFkKCB2b3NEYXRhQnVmZiwgdXNEYXRhU3RhcnRPZmZzZXQgKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gdHJpbSBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAogICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KICB9CiAgIC8vIEV4dHJhY3QgdGhlIExMQyBoZWFkZXIKICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wb3BfaGVhZCggdm9zRGF0YUJ1ZmYsIGF1Y0xMQ0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0xMQ19IRUFERVJfTEVOKTsKCiAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byBwb3AgTExDIGhlYWRlciBmcm9tIHBhY2tldCAlZCIsCiAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CgogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICB9CgogICAvL0V4dHJhY3QgdGhlIGxlbmd0aAogICB2b3NfbWVtX2NvcHkoJnc4MDIzSGVhZGVyLnVzTGVuVHlwZSwKICAgICAmYXVjTExDSGVhZGVyW1dMQU5UTF9MTENfSEVBREVSX0xFTiAtIHNpemVvZih3ODAyM0hlYWRlci51c0xlblR5cGUpXSwKICAgICBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKSApOwoKICAgdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsICZ3ODAyM0hlYWRlciwgc2l6ZW9mKHc4MDIzSGVhZGVyKSk7CiAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYwoKICBERVNDUklQVElPTgogICAgVXRpbGl0eSBmdW5jdGlvbiB0byBmaW5kIHdoZXRoZXIgcmVjZWl2ZWQgZnJhbWUgaXMgYnJvYWRjYXN0LCBtdWx0aWNhc3QKICAgIG9yIHVuaWNhc3QuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwVExDYjogICAgICAgICAgcG9pbnRlciB0byB0aGUgVEwncyBjb250cm9sIGJsb2NrCiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICAgcG9pbnRlciB0byB0aGUgdm9zIGJ1ZmZlcgoKICAgSU4vT1VUCiAgICBwdWNCY01jVWM6ICAgICAgIHBvaW50ZXIgdG8gYnVmZmVyLCB3aWxsIGNvbnRhaW4gZnJhbWUgdHlwZSBvbiByZXR1cm4KCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9CQURNU0c6ICBmYWlsZWQgdG8gZXh0cmFjdCBpbmZvIGZyb20gZGF0YSBidWZmZXIKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBzdWNjZXNzCgogIFNJREUgRUZGRUNUUwogICAgTm9uZS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMKKAogIFdMQU5UTF9DYlR5cGUgKnBUTENiLAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QgICAgICp2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICpwdWNCY01jVWMKKQp7CiAgIFZPU19TVEFUVVMgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2X1BWT0lEX3QgICAgIGF1Y0JESGVhZGVyOwogICB2X1BWT0lEX3QgICAgIHB2UGVla0RhdGE7CiAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBTYW5pdHkgY2hlY2sKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGlmICgoTlVMTCA9PSBwVExDYikgfHwgCiAgICAgICAoTlVMTCA9PSB2b3NEYXRhQnVmZikgfHwgCiAgICAgICAoTlVMTCA9PSBwdWNCY01jVWMpKQogICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgaW4gV0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMiKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgIH0KCiAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgfQoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKHZvc0RhdGFCdWZmLCAodl9QVk9JRF90KSZhdWNCREhlYWRlciwgMC8qU3dhcCBCRCovICk7CgogICBpZiAoTlVMTCA9PSBhdWNCREhlYWRlcikKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gQ2Fubm90IGV4dHJhY3QgQkQgaGVhZGVyIikpOwogICAgICBWT1NfQVNTRVJUKDApOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0JBRE1TRzsKICAgfQoKICAgaWYgKCgwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikpICYmCiAgICAgICAoMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSkKICAgewogICAgICAvKiBJdHMgYW4gODAyLjExIGZyYW1lLCBleHRyYWN0IE1BQyBhZGRyZXNzIDEgKi8KICAgICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMgLSA4MDIuMTEgZnJhbWUsIHBlZWtpbmcgQWRkcjEiKSk7CiAgICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKHZvc0RhdGFCdWZmLCBXTEFOVExfTUFDX0FERFJfQUxJR04oMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwdlBlZWtEYXRhLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgIH0KICAgZWxzZQogICB7CiAgICAgIC8qIEl0cyBhbiA4MDIuMyBmcmFtZSwgZXh0cmFjdCBEZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLwogICAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIDgwMi4zIGZyYW1lLCBwZWVraW5nIERBIikpOwogICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSh2b3NEYXRhQnVmZiwgV0xBTlRMX01BQ19BRERSX0FMSUdOKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwdlBlZWtEYXRhLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgIH0KCiAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSAKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gRmFpbGVkIHRvIHBlZWsgTUFDIGFkZHJlc3MiKSk7CiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgIH0KCiAgIGlmICgoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSA9PSAweGZmKQogICB7CiAgICAgICpwdWNCY01jVWMgPSBXTEFOVExfRlJBTUVfVFlQRV9CQ0FTVDsKICAgfQogICBlbHNlCiAgIHsKICAgICAgaWYgKCgoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSAmIDB4MDEpID09IDB4MDEpCiAgICAgICAgICpwdWNCY01jVWMgPSBXTEFOVExfRlJBTUVfVFlQRV9NQ0FTVDsKICAgICAgZWxzZQogICAgICAgICAqcHVjQmNNY1VjID0gV0xBTlRMX0ZSQU1FX1RZUEVfVUNBU1Q7CiAgIH0KCiAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gQWRkcjFCeXRlMSBpczogJXgiLCAKICAgICAgICAgICgodEFOSV9VOCAqKXB2UGVla0RhdGEpWzBdKSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCiNpZiAwCiNpZmRlZiBXTEFOX1BFUkYgCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfRmFzdEh3RndkRGF0YUZyYW1lCgogIERFU0NSSVBUSU9OIAogICAgRmFzdCBwYXRoIGZ1bmN0aW9uIHRvIHF1aWNrbHkgZm9yd2FyZCBhIGRhdGEgZnJhbWUgaWYgSEFMIGRldGVybWluZXMgQkQgCiAgICBzaWduYXR1cmUgY29tcHV0ZWQgaGVyZSBtYXRjaGVzIHRoZSBzaWduYXR1cmUgaW5zaWRlIGN1cnJlbnQgVk9TUyBwYWNrZXQuIAogICAgSWYgdGhlcmUgaXMgYSBtYXRjaCwgSEFMIGFuZCBUTCBmaWxscyBpbiB0aGUgc3dhcHBlZCBwYWNrZXQgbGVuZ3RoIGludG8gCiAgICBCRCBoZWFkZXIgYW5kIER4RSBoZWFkZXIsIHJlc3BlY3RpdmVseS4gT3RoZXJ3aXNlLCBwYWNrZXQgZ29lcyBiYWNrIHRvIAogICAgbm9ybWFsIChzbG93KSBwYXRoIGFuZCBhIG5ldyBCRCBzaWduYXR1cmUgd291bGQgYmUgdGFnZ2VkIGludG8gQkQgaW4gdGhpcwogICAgVk9TUyBwYWNrZXQgbGF0ZXIgYnkgdGhlIFdMQU5IQUxfRmlsbFR4QmQoKSBmdW5jdGlvbi4KCiAgREVQRU5ERU5DSUVTIAogICAgIAogIFBBUkFNRVRFUlMgCgogICBJTgogICAgICAgIHB2b3NHQ3R4ICAgIFZPUyBjb250ZXh0CiAgICAgICAgdm9zRGF0YUJ1ZmYgUHRyIHRvIFZPU1MgcGFja2V0CiAgICAgICAgcE1ldGFJbmZvICAgRm9yIGdldHRpbmcgZnJhbWUncyBUSUQKICAgICAgICBwU3RhSW5mbyAgICBGb3IgY2hlY2tpbmcgU1RBIHR5cGUKICAgIAogICBPVVQKICAgICAgICBwdm9zU3RhdHVzICByZXR1cm5lZCBzdGF0dXMKICAgICAgICBwdUZhc3RGd2RPSyBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgZnJhbWUgY291bGQgYmUgZmFzdCBmb3J3YXJkZWQKICAgCiAgUkVUVVJOIFZBTFVFCiAgICBObyByZXR1cm4uICAgCgogIFNJREUgRUZGRUNUUyAKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyB2b2lkCldMQU5UTF9GYXN0SHdGd2REYXRhRnJhbWUKKCAKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgdm9zRGF0YUJ1ZmYsCiAgVk9TX1NUQVRVUyogICBwdm9zU3RhdHVzLAogIHZfVTMyX3QqICAgICAgIHB1RmFzdEZ3ZE9LLAogIFdMQU5UTF9NZXRhSW5mb1R5cGUqICBwTWV0YUluZm8sCiAgV0xBTl9TVEFEZXNjVHlwZSogIHBTdGFJbmZvCiAKKQp7CiAgICB2X1BWT0lEX3QgICBwdlBlZWtEYXRhOwogICAgdl9VOF90ICAgICAgdWNEeEVCRFdMQU5IZWFkZXJMZW4gPSBXTEFOVExfQkRfSEVBREVSX0xFTigwKSArIHNpemVvZihXTEFOQkFMX3NEWEVIZWFkZXJUeXBlKTsgCiAgICB2X1U4X3QgICAgICB1Y0lzVW5pY2FzdDsKICAgIFdMQU5CQUxfc0RYRUhlYWRlclR5cGUgICpwRHhFSGVhZGVyOwogICAgdl9QVk9JRF90ICAgcHZCREhlYWRlcjsKICAgIHZfUFZPSURfdCAgIHB1Y0J1ZmZQdHI7CiAgICB2X1UxNl90ICAgICAgdXNQa3RMZW47CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IHBhY2tldCBsZW5ndGgKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgTUFDIGFkZHJlc3MKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICpwdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0RhdGFCdWZmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BQ19BRERSX0FMSUdOKDApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NQUNfQUREUl9TSVpFICk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gKnB2b3NTdGF0dXMgKSAKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBNQUMgQWRkciAlZCIsIAogICAgICAgICAgICAgICAgICAqcHZvc1N0YXR1cykpOwogICAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICAgICByZXR1cm47CiAgICB9CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXNlcnZlIGhlYWQgcm9vbSBmb3IgRHhFIGhlYWRlciwgQkQsIGFuZCBXTEFOIGhlYWRlcgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIHZvc19wa3RfcmVzZXJ2ZV9oZWFkKCB2b3NEYXRhQnVmZiwgJnB1Y0J1ZmZQdHIsIAogICAgICAgICAgICAgICAgICAgICAgICB1Y0R4RUJEV0xBTkhlYWRlckxlbiApOwogICAgaWYgKCBOVUxMID09IHB1Y0J1ZmZQdHIgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpObyBlbm91Z2ggc3BhY2UgaW4gVk9TUyBwYWNrZXQgJXBLIGZvciBEeEUvQkQvV0xBTiBoZWFkZXIiLCB2b3NEYXRhQnVmZikpOwogICAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcER4RUhlYWRlciA9IChXTEFOQkFMX3NEWEVIZWFkZXJUeXBlICAqKXB1Y0J1ZmZQdHI7CiAgICBwdkJESGVhZGVyID0gKHZfUFZPSURfdCkgJnBEeEVIZWFkZXJbMV07CgogICAgLyogVU1BIFR4IGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkLiAKICAgICAqIFVNQSB3b3VsZCBoZWxwIGNvbnZlcnQgZnJhbWVzIHRvIDgwMi4xMSwgZmlsbCBwYXJ0aWFsIEJEIGZpZWxkcyBhbmQgCiAgICAgKiBjb25zdHJ1Y3QgTExDIGhlYWRlci4gVG8gZnVydGhlciBhY2NlbGVyYXRlIHRoaXMga2luZCBvZiBmcmFtZXMsCiAgICAgKiBIQUwgd291bGQgYXR0ZW1wdCB0byByZXVzZSB0aGUgQkQgZGVzY3JpcHRvciBpZiB0aGUgQkQgc2lnbmF0dXJlIAogICAgICogbWF0Y2hlcyB0byB0aGUgc2F2ZWQgQkQgZGVzY3JpcHRvci4KICAgICAqLwogICAgIGlmKHBTdGFJbmZvLT53U1RBVHlwZSA9PSBXTEFOX1NUQV9JQlNTKQogICAgICAgIHVjSXNVbmljYXN0ID0gISgoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSAmIDB4MDEpOwogICAgIGVsc2UKICAgICAgICB1Y0lzVW5pY2FzdCA9IDE7CiAKICAgICAqcHVGYXN0RndkT0sgPSAodl9VMzJfdCkgV0xBTkhBTF9UeEJkRmFzdEZ3ZChwdm9zR0N0eCwgcHZQZWVrRGF0YSwgcE1ldGFJbmZvLT51Y1RJRCwgdWNJc1VuaWNhc3QsIHB2QkRIZWFkZXIsIHVzUGt0TGVuICk7CiAgICAKICAgICAgLyogQ2FuJ3QgYmUgZmFzdCBmb3J3YXJkZWQuIFRyaW0gdGhlIFZPUyBoZWFkIGJhY2sgdG8gb3JpZ2luYWwgbG9jYXRpb24uICovCiAgICAgIGlmKCEgKnB1RmFzdEZ3ZE9LKXsKICAgICAgICAgIHZvc19wa3RfdHJpbV9oZWFkKHZvc0RhdGFCdWZmLCB1Y0R4RUJEV0xBTkhlYWRlckxlbik7CiAgICAgIH1lbHNlewogICAgICAgIC8qIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkLiBOb3cgbm90aWZ5IEJBTCBEeEUgaGVhZGVyIGZpbGxpbmcgY291bGQgYmUgY29tcGxldGVseSBza2lwcGVkCiAgICAgICAgICovCiAgICAgICAgdl9VMzJfdCB1UGFja2V0U2l6ZSA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKDApICsgdXNQa3RMZW47CiAgICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCiAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1UGFja2V0U2l6ZSk7CiAgICAgICAgcER4RUhlYWRlci0+c2l6ZSAgPSBTV0FQX0VORElBTl9VSU5UMzIodVBhY2tldFNpemUpOwogICAgICB9CiAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgIHJldHVybjsKfQojZW5kaWYgLypXTEFOX1BFUkYqLwojZW5kaWYKCiNpZiAwCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgRlVOQ1RJT04gICAgV0xBTlRMX1ByZXBhcmVCREhlYWRlcgoKICBERVNDUklQVElPTgogICAgSW5saW5lIGZ1bmN0aW9uIGZvciBwcmVwYXJpbmcgQkQgaGVhZGVyIGJlZm9yZSBIQUwgcHJvY2Vzc2luZy4KCiAgREVQRU5ERU5DSUVTCiAgICBKdXN0IG5vdGlmeSBIQUwgdGhhdCBzdXNwZW5kIGluIFRMIGlzIGNvbXBsZXRlLgoKICBQQVJBTUVURVJTCgogICBJTgogICAgdm9zRGF0YUJ1ZmY6ICAgICAgdm9zIGRhdGEgYnVmZmVyCiAgICB1Y0Rpc2FibGVGcm1YdGw6ICBpcyBmcmFtZSB4dGwgZGlzYWJsZWQKCiAgIE9VVAogICAgcHB2QkRIZWFkZXI6ICAgICAgaXQgd2lsbCBjb250YWluIHRoZSBCRCBoZWFkZXIKICAgIHB2RGVzdE1hY0FkZGRyOiAgIGl0IHdpbGwgY29udGFpbiB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKICAgIHB2b3NTdGF0dXM6ICAgICAgIHN0YXR1cyBvZiB0aGUgY29tYmluZWQgcHJvY2Vzc2luZwogICAgcHVzUGt0TGVuOiAgICAgICAgcGFja2V0IGxlbi4KCiAgUkVUVVJOIFZBTFVFCiAgICBObyByZXR1cm4uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQKV0xBTlRMX1ByZXBhcmVCREhlYWRlcgooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAogIHZfUFZPSURfdCogICAgICBwcHZCREhlYWRlciwKICB2X01BQ0FERFJfdCogICAgcHZEZXN0TWFjQWRkZHIsCiAgdl9VOF90ICAgICAgICAgIHVjRGlzYWJsZUZybVh0bCwKICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKICB2X1UxNl90KiAgICAgICAgcHVzUGt0TGVuLAogIHZfVThfdCAgICAgICAgICB1Y1Fvc0VuYWJsZWQsCiAgdl9VOF90ICAgICAgICAgIHVjV0RTRW5hYmxlZCwKICB2X1U4X3QgICAgICAgICAgZXh0cmFIZWFkU3BhY2UKKQp7CiAgdl9VOF90ICAgICAgdWNIZWFkZXJPZmZzZXQ7CiAgdl9VOF90ICAgICAgdWNIZWFkZXJMZW47CiAgdl9VOF90ICAgICAgdWNCREhlYWRlckxlbiA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCk7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgR2V0IGhlYWRlciBwb2ludGVyIGZyb20gVk9TUwogICAgISEhIG1ha2Ugc3VyZSByZXNlcnZlIGhlYWQgemVyb3Mgb3V0IHRoZSBtZW1vcnkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsIHB1c1BrdExlbik7CgogIGlmICggV0xBTlRMX01BQ19IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCkgPiAqcHVzUGt0TGVuICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBMZW5ndGggb2YgdGhlIHBhY2tldCBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQgbmV0d29yayIKICAgICAgICAgICAgICAgIiBoZWFkZXIgJWQiLCAqcHVzUGt0TGVuICkpOwoKICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgcmV0dXJuOwogIH0KCiAgdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHZvc0RhdGFCdWZmLCBwcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgdWNCREhlYWRlckxlbiApOwogIGlmICggTlVMTCA9PSAqcHB2QkRIZWFkZXIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOlZPU1MgcGFja2V0IGNvcnJ1cHRlZCBvbiBBdHRhY2ggQkQgaGVhZGVyIikpOwogICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICByZXR1cm47CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IE1BQyBhZGRyZXNzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB7CiAgIHZfU0laRV90IHVzTWFjQWRkclNpemUgPSBWT1NfTUFDX0FERFJfU0laRTsKICAgKnB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0JESGVhZGVyTGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTih1Y0Rpc2FibGVGcm1YdGwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwdkRlc3RNYWNBZGRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c01hY0FkZHJTaXplICk7CiAgfQogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9ICpwdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBNQUMgQWRkciAlZCIsCiAgICAgICAgICAgICAgICAqcHZvc1N0YXR1cykpOwogIH0KICBlbHNlCiAgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBGaWxsIE1QRFUgaW5mbyBmaWVsZHM6CiAgICAgICAgICAtIE1QRFUgZGF0YSBzdGFydCBvZmZzZXQKICAgICAgICAgIC0gTVBEVSBoZWFkZXIgc3RhcnQgb2Zmc2V0CiAgICAgICAgICAtIE1QRFUgaGVhZGVyIGxlbmd0aAogICAgICAgICAgLSBNUERVIGxlbmd0aCAtIHRoaXMgaXMgYSAxNmIgZmllbGQgLSBuZWVkcyBzd2FwcGluZwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdWNIZWFkZXJPZmZzZXQgPSB1Y0JESGVhZGVyTGVuOwogICAgdWNIZWFkZXJMZW4gICAgPSBXTEFOVExfTUFDX0hFQURFUl9MRU4odWNEaXNhYmxlRnJtWHRsKTsKCiAgICBpZiAoIDAgIT0gdWNEaXNhYmxlRnJtWHRsICkKICAgIHsKICAgICAgaWYgKCAwICE9IHVjUW9zRW5hYmxlZCApCiAgICAgIHsKICAgICAgICB1Y0hlYWRlckxlbiArPSBXTEFOVExfODAyXzExX0hFQURFUl9RT1NfQ1RMOwogICAgICB9CgogICAgICAvLyBTaW1pbGFyIHRvIFFvcyB3ZSBuZWVkIHNvbWV0aGluZyBmb3IgV0RTIGZvcm1hdCAhCiAgICAgIGlmICggdWNXRFNFbmFibGVkICE9IDAgKQogICAgICB7CiAgICAgICAgLy8gSWYgd2UgaGF2ZSBmcmFtZSB0cmFuc2xhdGlvbiBlbmFibGVkCiAgICAgICAgdWNIZWFkZXJMZW4gICAgKz0gV0xBTlRMXzgwMl8xMV9IRUFERVJfQUREUjRfTEVOOwogICAgICB9CiAgICAgIGlmICggZXh0cmFIZWFkU3BhY2UgIT0gMCApCiAgICAgIHsKICAgICAgICAvLyBEZWNyZWFzZSB0aGUgcGFja2V0IGxlbmd0aCB3aXRoIHRoZSBleHRyYSBwYWRkaW5nIGFmdGVyIHRoZSBoZWFkZXIKICAgICAgICAqcHVzUGt0TGVuID0gKnB1c1BrdExlbiAtIGV4dHJhSGVhZFNwYWNlOwogICAgICB9CiAgICB9CgogICAgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfTEVOKCAqcHB2QkRIZWFkZXIsIHVjSGVhZGVyTGVuKTsKICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfSEVBREVSX09GRlNFVCggKnBwdkJESGVhZGVyLCB1Y0hlYWRlck9mZnNldCk7CiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0RBVEFfT0ZGU0VUKCAqcHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjSGVhZGVyT2Zmc2V0ICsgdWNIZWFkZXJMZW4gKyBleHRyYUhlYWRTcGFjZSk7CiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0xFTiggKnBwdkJESGVhZGVyLCAqcHVzUGt0TGVuKTsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6IFZBTFVFUyBBUkUgSExlbj0leCBIb2ZmPSV4IGRvZmY9JXggbGVuPSV4IGV4PSVkIiwKICAgICAgICAgICAgICAgIHVjSGVhZGVyTGVuLCB1Y0hlYWRlck9mZnNldCwgCiAgICAgICAgICAgICAgICAodWNIZWFkZXJPZmZzZXQgKyB1Y0hlYWRlckxlbiArIGV4dHJhSGVhZFNwYWNlKSwgCiAgICAgICAgICAgICAgICAqcHVzUGt0TGVuLCBleHRyYUhlYWRTcGFjZSkpOwogIH0vKiBpZiBwZWVrIE1BQyBzdWNjZXNzKi8KCn0vKiBXTEFOVExfUHJlcGFyZUJESGVhZGVyICovCiNlbmRpZgoKLy9USElTIElTIEEgSEFDSyBBTkQgTkVFRFMgVE8gQkUgRklYRUQgRk9SIENPTkNVUlJFTkNZCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOX1RMR2V0TmV4dFR4SWRzCgogIERFU0NSSVBUSU9OCiAgICBHZXRzIHRoZSBuZXh0IHN0YXRpb24gYW5kIG5leHQgQUMgaW4gdGhlIGxpc3QgdGhhdCBzaG91bGQgYmUgc2VydmVkIGJ5IHRoZSBUTC4KCiAgICBNdWx0aXBsZSBTdGF0aW9uIFNjaGVkdWxpbmcgYW5kIFRMIHF1ZXVlIG1hbmFnZW1lbnQuIAoKICAgIDQgSEREIEJDL01DIGRhdGEgcGFja2V0IHF1ZXVlIHN0YXR1cyBpcyBzcGVjaWZpZWQgYXMgU3RhdGlvbiAwJ3Mgc3RhdHVzLiBXZWlnaHRzIHVzZWQKICAgIGluIFdGUSBhbGdvcml0aCBhcmUgaW5pdGlhbGl6ZWQgaW4gV0xBTlRMX09QRU4gYW5kIGNvbnRhaW5lZCBpbiB0bENvbmZpZ0luZm8gZmllbGQuCiAgICBFYWNoIHN0YXRpb24gaGFzIGZpZWxkcyBvZiB1Y1BrdFBlbmRpbmcgYW5kIEFDIG1hc2sgdG8gdGVsbCB3aGV0aGVyIGEgQUMgaGFzIHRyYWZmaWMKICAgIG9yIG5vdC4KICAgICAgCiAgICBTdGF0aW9ucyBhcmUgc2VydmVkIGluIGEgcm91bmQtcm9iaW4gZmFzaGlvbiBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgdG8gbG93ZXN0IHByaW9yaXR5LgogICAgVGhlIG51bWJlciBvZiByb3VuZC1yb2JpbiB0aW1lcyBvZiBlYWNoIHByaW9pcnR5IGVxdWFscyB0byB0aGUgV0ZRIHdlaWdodHMgYW5kIGRpZmZlcmV0aWF0ZXMKICAgIHRoZSB0cmFmZmljIG9mIGRpZmZlcmVudCBwcmlvaXJ0eS4gQXMgc3VjaCwgc3RhdGlvbnMgY2FuIG5vdCBwcm92aWRlIGxvdyBwcmlvcml0eSBwYWNrZXRzIGlmCiAgICBoaWdoIHByaW9yaXR5IHBhY2tldHMgYXJlIGFsbCBzZXJ2ZWQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICBPVVQKICAgcHVjU1RBSWQ6ICAgIFN0YXRpb24gSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QKCiAgU0lERSBFRkZFQ1RTCiAgIAogICBUTCBjb250ZXh0IGNvbnRhaW5zIGN1cnJlbnRseSBzZXJ2ZWQgc3RhdGlvbiBJRCBpbiB1Y0N1cnJlbnRTVEEgZmllbGQsIGN1cnJlbnRseSBzZXJ2ZWQgQUMKICAgaW4gdUN1clNlcnZlZEFDIGZpZWxkLCBhbmQgdW5zZXJ2ZWQgd2VpZ2h0cyBvZiBjdXJyZW50IEFDIGluIHVDdXJMZWZ0V2VpZ2h0LgogICBXaGVuIGV4aXN0aW5nIGZyb20gdGhlIGZ1bmN0aW9uLCB0aGVzZSB0aHJlZSBmaWVsZHMgYXJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOX1RMQVBHZXROZXh0VHhJZHMKKAogIHZfUFZPSURfdCAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgcHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiOwogIHZfVThfdCAgICAgICAgICB1Y0FDRmlsdGVyID0gMTsKICB2X1U4X3QgICAgICAgICAgdWNOZXh0U1RBLCB1Y1RlbXBTVEE7CiAgdl9CT09MX3QgICAgICAgIGlzU2VydmVkID0gVFJVRTsgIC8vY3VycmVudCByb3VuZCBoYXMgZmluZCBhIHBhY2tldCBvciBub3QKICB2X1U4X3QgICAgICAgICAgdWNBQ0xvb3BOdW0gPSBXTEFOVExfQUNfSElHSF9QUklPICsgMTsgLy9udW1iZXIgb2YgbG9vcCB0byBnbwogIHZfVThfdCAgICAgICAgICB1Rmxvd01hc2s7IC8vIFRYIEZsb3dNYXNrIGZyb20gV0RBCiAgdWludDggICAgICAgICAgIHVjQUNNYXNrOyAKICB1aW50OCAgICAgICAgICAgaSA9IDA7CiAgdWludDggICAgICAgICAgIGo7CiAgdWludDggICAgICAgICAgIG1pbldlaWdodFN0YTsKICB1aW50MzJfdCAgICAgICAgc3RhX2JpdG1hc2sgPSAwOwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIC8vRU5URVIoKTsKCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTl9UTEFQR2V0TmV4dFR4SWRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19HZXRUeEZsb3dNYXNrKCBwdm9zR0N0eCwgJnVGbG93TWFzayApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkZhaWxlZCB0byByZXRyaWV2ZSBGbG93IGNvbnRyb2wgbWFzayBmcm9tIFdEQSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKiBUaGUgZmxvdyBtYXNrIGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBkaWZmZXJlbnQgQUNzL1FzCiAgICogc2luY2Ugd2UgdXNlIGEgc2luZ2xlIGR4ZSBjaGFubmVsIGZvciBhbGwgQUNzL1FzLCBoZW5jZSBpdCBpcwogICAqIGVub3VnaCB0byBjaGVjayB0aGF0IHRoZXJlIGFyZSBkeGUgcmVzb3VyY2VzIG9uIGRhdGEgY2hhbm5lbAogICAqLwogIHVGbG93TWFzayAmPSBXTEFOVExfREFUQV9GTE9XX01BU0s7CgogIGlmICgwID09IHVGbG93TWFzaykKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6IE5vIHJlc291cmNlcyB0byBzZW5kIHBhY2tldHMiKSk7CgogICAgLy8gU2V0dGluZyBTVEEgSWQgdG8gaW52YWxpZCBpZiBtYXNrIGlzIDAKICAgICpwdWNTVEFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICB1Y05leHRTVEEgPSBwVExDYi0+dWNDdXJyZW50U1RBOwoKICArK3VjTmV4dFNUQTsKCiAgaWYgKCBXTEFOX01BWF9TVEFfQ09VTlQgPD0gdWNOZXh0U1RBICkKICAgIHVjTmV4dFNUQSA9IDA7CgogICAgaXNTZXJ2ZWQgPSBGQUxTRTsKICAgIGlmICggMCA9PSBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ICkKICAgIHsKICAgICAgLy9jdXJyZW50IHByaW9pcnR5IGlzIGRvbmUKICAgICAgaWYgKCBXTEFOVExfQUNfQksgPT0gKFdMQU5UTF9BQ0VudW1UeXBlKXBUTENiLT51Q3VyU2VydmVkQUMgKQogICAgICB7CiAgICAgICAgLy9lbmQgb2YgY3VycmVudCBWTywgVkksIEJFLCBCSyBsb29wLiBSZXNldCBwcmlvcml0eS4KICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDID0gV0xBTlRMX0FDX0hJR0hfUFJJTzsKICAgICAgfQogICAgICBlbHNlIAogICAgICB7CiAgICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQyAtLTsKICAgICAgfQoKICAgICAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9ICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3BUTENiLT51Q3VyU2VydmVkQUNdOwogCiAgICB9IC8vICgwID09IHBUTENiLT51Y0N1ckxlZnRXZWlnaHQpCgogIHVjVGVtcFNUQSA9IHVjTmV4dFNUQTsKICBtaW5XZWlnaHRTdGEgPSB1Y05leHRTVEE7CgogIC8vZGVjaWRlIGhvdyBtYW55IGxvb3BzIHRvIGdvLiBpZiBjdXJyZW50IGxvb3AgaXMgcGFydGlhbCwgZG8gb25lIGV4dHJhIHRvIG1ha2Ugc3VyZQogIC8vd2UgY292ZXIgZXZlcnkgc3RhdGlvbgogIGlmICgoMSA9PSBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0KSAmJiAodWNOZXh0U1RBICE9IDApKQogIHsKICAgIHVjQUNMb29wTnVtICsrOyAvLyBub3cgaXMgNSBsb29wcwogIH0KCiAgLyogU3RhcnQgd2l0aCBoaWdoZXN0IHByaW9yaXR5LiB1Y05leHRTVEEsIHBUTENiLT51Q3VyU2VydmVkQUMsIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQKICAgICBhbGwgaGF2ZSBwcmV2aW91cyB2YWx1ZXMuKi8KICBmb3IgKDsgdWNBQ0xvb3BOdW0gPiAwOyAgdWNBQ0xvb3BOdW0tLSkKICB7CgogICAgdWNBQ0ZpbHRlciA9IDEgPDwgcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKCiAgICAvLyBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0IGtlZXBzIHByZXZpb3VzIHJlc3VsdHMuCiAgICBmb3IgKDsgKHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgPiAwKSA7IHBUTENiLT51Y0N1ckxlZnRXZWlnaHQtLSApCiAgICB7CgogICAgICBmb3IgKCA7IHVjTmV4dFNUQSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgdWNOZXh0U1RBICsrICkKICAgICAgewogICAgICAgIGlmKE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXSkKICAgICAgICB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXSwgdWNBQ01hc2ssIGkpOwoKICAgICAgICBpZiAoICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVjRXhpc3RzKSB8fAogICAgICAgICAgICAgKCgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVjUGt0UGVuZGluZykgJiYgISh1Y0FDTWFzaykpIHx8CiAgICAgICAgICAgICAoMCA9PSAodWNBQ01hc2sgJiB1Y0FDRmlsdGVyKSkgKQoKICAgICAgICB7CiAgICAgICAgICAvL2N1cnJlbnQgc3RhdGlvbiBkb2VzIG5vdCBleGlzdCBvciBoYXZlIGFueSBwYWNrZXQgdG8gc2VydmUuCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmICgoV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnRsU3RhdGUpCiAgICAgICAgICAgfHwgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPmRpc2Fzc29jX3Byb2dyZXNzID09IFZPU19UUlVFICkpCiAgICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiJXMgU3RhICVkIG5vdCBpbiBhdXRoIHN0YXRlIHNvIHNraXBwaW5nIGl0LiIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIHVjTmV4dFNUQSkpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvL2dvIHRvIG5leHQgc3RhdGlvbiBpZiBjdXJyZW50IHN0YXRpb24gY2FuJ3Qgc2VuZCBkdWUgdG8gZmxvdyBjb250cm9sCiAgICAgICAgLy9TdGF0aW9uIGlzIGFsbG93ZWQgdG8gc2VuZCB3aGVuIGl0IGlzIG5vdCBpbiBMV00gbW9kZS4gV2hlbiBzdGF0aW9uIGlzIGluIExXTSBtb2RlLAogICAgICAgIC8vc3RhdGlvbiBpcyBhbGxvd2VkIHRvIHNlbmQgb25seSBhZnRlciBGVyByZXBvcnRzIEZXIG1lbW9yeSBpcyBiZWxvdyB0aHJlc2hvbGQgYW5kIG9uLWZseQogICAgICAgIC8vcGFja2V0cyBhcmUgbGVzcyB0aGVuIGFsbG93ZWQgdmFsdWUKICAgICAgICBpZiAoIChUUlVFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVjTHdtTW9kZUVuYWJsZWQpICYmCiAgICAgICAgICAgICAoKEZBTFNFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVjTHdtRXZlbnRSZXBvcnRlZCkgfHwKICAgICAgICAgICAgICAgICAoMCA8IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVCdWZmVGhyZXNob2xkTWF4KSkKICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIEluaXRpYWwgd2VpZ2h0IGlzIDAgaXMgZm9yIGFsbCB0aGUgc3RhdGlvbnMuIEFzIHBhcnQgb2YgRlcgVFggc3RhdHMKICAgICAgICAgKiBpbmRpY2F0aW9uIHRvIGhvc3QsIGdvb2QgcGVlciB3ZWlnaHQgaXMgdXBkYXRlZCB0byBvbmUgYW5kIHRoZQogICAgICAgICAqIHJlbWFpbmluZyBwZWVycyB3ZWlnaHQgaXMgdXBkYXRlZCBiYXNlZCBvbiB0aGVpciBSQSByYXRlcyBhbmQgQlRRTQogICAgICAgICAqIHF1ZXVlZCBmcmFtZXMgbGVuZ3RoLiBUTCBza2lwcyBmZXRjaGluZyB0aGUgcGFja2V0IHVudGlsIHRoZSBzdGF0aW9uCiAgICAgICAgICogaGFzIGdvdCBjaGFuY2VzIGVxdWFsIHRvIGl0cyB3ZWlnaHQuCiAgICAgICAgICovCiAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPndlaWdodCA+IFdMQU5UTF9HT09EX1NUQV9XRUlHSFQpIHsKICAgICAgICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0X2NvdW50IDw9CiAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPndlaWdodCkKICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW21pbldlaWdodFN0YV0tPndlaWdodCA8PSAxKQogICAgICAgICAgICAgICAgICBtaW5XZWlnaHRTdGEgPSB1Y05leHRTVEE7CiAgICAgICAgICAgICAgZWxzZSBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0IDwKICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbbWluV2VpZ2h0U3RhXS0+d2VpZ2h0KSB7CiAgICAgICAgICAgICAgICAgbWluV2VpZ2h0U3RhID0gdWNOZXh0U1RBOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGFfYml0bWFzayB8PSAoMSA8PCB1Y05leHRTVEEpOwogICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPndlaWdodF9jb3VudCsrOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0X2NvdW50ID0gMDsKICAgICAgICB9CgogICAgICAgIC8vIEZpbmQgYSBzdGF0aW9uLiBXZWlnaHQgaXMgdXBkYXRlZCBhbHJlYWR5LgogICAgICAgICpwdWNTVEFJZCA9IHVjTmV4dFNUQTsKICAgICAgICBwVExDYi0+dWNDdXJyZW50U1RBID0gdWNOZXh0U1RBOwogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDID0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKICAKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAiIFRMIHNlcnZlIG9uZSBzdGF0aW9uIEFDOiAlZCAgVzogJWQgU3RhSWQ6ICVkIiwKICAgICAgICAgICAgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMsIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQsIHBUTENiLT51Y0N1cnJlbnRTVEEgKSk7CiAgICAgIAogICAgICAgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQtLTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgICB9IC8vU1RBIGxvb3AKCiAgICAgIGZvciAoaiA9IDA7IGogPCB1Y1RlbXBTVEE7IGorKykgewogICAgICAgICBpZiAoTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyAocFRMQ2ItPmF0bFNUQUNsaWVudHNbal0sIHVjQUNNYXNrLCBpKTsKCiAgICAgICAgIGlmICgoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+dWNFeGlzdHMpIHx8CiAgICAgICAgICAgICAoKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbal0tPnVjUGt0UGVuZGluZykgJiYgISh1Y0FDTWFzaykpIHx8CiAgICAgICAgICAgICAoMCA9PSAodWNBQ01hc2sgJiB1Y0FDRmlsdGVyKSkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgaWYgKChXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbal0tPnRsU3RhdGUpIHx8CiAgICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbal0tPmRpc2Fzc29jX3Byb2dyZXNzID09IFZPU19UUlVFKSkgewogICAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAiJXMgU3RhICVkIG5vdCBpbiBhdXRoIHN0YXRlIHNvIHNraXBwaW5nIGl0LiIsCiAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB1Y05leHRTVEEpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KCiAgICAgICAgIGlmICgoVFJVRSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+dWNMd21Nb2RlRW5hYmxlZCkgJiYKICAgICAgICAgICAgKChGQUxTRSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+dWNMd21FdmVudFJlcG9ydGVkKSB8fAogICAgICAgICAgICAgKDAgPCBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+dUJ1ZmZUaHJlc2hvbGRNYXgpKSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbal0tPndlaWdodCA+IFdMQU5UTF9HT09EX1NUQV9XRUlHSFQpIHsKICAgICAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW2pdLT53ZWlnaHRfY291bnQgPD0KICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW2pdLT53ZWlnaHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW21pbldlaWdodFN0YV0tPndlaWdodCA8PSAxKQogICAgICAgICAgICAgICAgICBtaW5XZWlnaHRTdGEgPSBqOwogICAgICAgICAgICAgICBlbHNlIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+d2VpZ2h0IDwKICAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW21pbldlaWdodFN0YV0tPndlaWdodCkgewogICAgICAgICAgICAgICAgICBtaW5XZWlnaHRTdGEgPSBqOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHN0YV9iaXRtYXNrIHw9ICgxIDw8IGopOwogICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+d2VpZ2h0X2NvdW50Kys7CiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbal0tPndlaWdodF9jb3VudCA9IDA7CiAgICAgICAgIH0KCiAgICAgICAgICpwdWNTVEFJZCA9IGo7CiAgICAgICAgIHBUTENiLT51Y0N1cnJlbnRTVEEgPSBqOwogICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CgogICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgIiBUTCBzZXJ2ZSBvbmUgc3RhdGlvbiBBQzogJWQgIFc6ICVkIFN0YUlkOiAlZCIsCiAgICAgICAgICAgICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDLCBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0LCBwVExDYi0+dWNDdXJyZW50U1RBICkpOwogICAgICAgICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0LS07CiAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgIH0KCiAgICAgIC8qIEZlY3RoIHBhY2tldCBmcm9tIHRoZSBzdGF0aW9ucyB3aXRoIG1pbmltdW0gd2VpZ2h0IGFtb25nIHRoZW0gKi8KICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW21pbldlaWdodFN0YV0gJiYKICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW21pbldlaWdodFN0YV0tPnVjUGt0UGVuZGluZykKICAgICAgewogICAgICAgICAqcHVjU1RBSWQgPSBtaW5XZWlnaHRTdGE7CiAgICAgICAgIHBUTENiLT51Y0N1cnJlbnRTVEEgPSBtaW5XZWlnaHRTdGE7CiAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDID0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKCiAgICAgICAgIGZvciAoaiA9IDA7IHN0YV9iaXRtYXNrICE9IDA7IHN0YV9iaXRtYXNrID4+PSAxLCBqKyspCiAgICAgICAgIHsKICAgICAgICAgICAgaWYgKDAgPT0gKHN0YV9iaXRtYXNrICYgMHgxKSkKICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobWluV2VpZ2h0U3RhID09IGopCiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAvKiBUbyBlbnN1cmUgZmFpcm5lc3MgYmV0d2VlbiBzdGF0aW9ucyAqLwogICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+d2VpZ2h0X2NvdW50ICs9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbbWluV2VpZ2h0U3RhXS0+d2VpZ2h0IC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1ttaW5XZWlnaHRTdGFdLT53ZWlnaHRfY291bnQ7CiAgICAgICAgIH0KICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbbWluV2VpZ2h0U3RhXS0+d2VpZ2h0X2NvdW50ID0gMDsKCiAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICAiIFRMIHNlcnZlIG9uZSBzdGF0aW9uIEFDOiAlZCAgVzogJWQgU3RhSWQ6ICVkIiwKICAgICAgICAgICAgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMsIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQsIHBUTENiLT51Y0N1cnJlbnRTVEEgKSk7CiAgICAgICAgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQtLTsKICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgfQoKICAgICAgdWNOZXh0U1RBID0gMDsKICAgICAgaWYgKCBGQUxTRSA9PSBpc1NlcnZlZCApCiAgICAgIHsKICAgICAgICAvL2N1cnJlbnQgbG9vcCBmaW5kcyBubyBwYWNrZXQubm8gbmVlZCB0byByZXBlYXQgZm9yIHRoZSBzYW1lIHByaW9yaXR5CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLy9jdXJyZW50IGxvb3AgaXMgcGFydGlhbCBsb29wLiBnbyBmb3Igb25lIG1vcmUgbG9vcC4KICAgICAgaXNTZXJ2ZWQgPSBGQUxTRTsKCiAgICB9IC8vV2VpZ2h0IGxvb3AKCiAgICBpZiAoV0xBTlRMX0FDX0JLID09IHBUTENiLT51Q3VyU2VydmVkQUMpCiAgICB7CiAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfSElHSF9QUklPOwogICAgfQogICAgZWxzZQogICAgewogICAgICBwVExDYi0+dUN1clNlcnZlZEFDLS07CiAgICB9CiAgICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbcFRMQ2ItPnVDdXJTZXJ2ZWRBQ107CgogIH0vLyBBQyBsb29wCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiIFRMIGNhbid0IGZpbmQgb25lIHN0YXRpb24gdG8gc2VydmUiICkpOwoKICBwVExDYi0+dUN1clNlcnZlZEFDID0gV0xBTlRMX0FDX0JLOwogIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgPSAxOwogIC8vaW52YWxpZCBudW1iZXIgd2lsbCBiZSBjYXB0dXJlZCBieSBjYWxsZXIKICBwVExDYi0+dWNDdXJyZW50U1RBID0gV0xBTl9NQVhfU1RBX0NPVU5UOyAKCiAgKnB1Y1NUQUlkID0gcFRMQ2ItPnVjQ3VycmVudFNUQTsKICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5fVExHZXROZXh0VHhJZHMKCiAgREVTQ1JJUFRJT04KICAgIEdldHMgdGhlIG5leHQgc3RhdGlvbiBhbmQgbmV4dCBBQyBpbiB0aGUgbGlzdAoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICAgT1VUCiAgIHB1Y1NUQUlkOiAgICBTdGF0aW9uIElECgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5fVExHZXROZXh0VHhJZHMKKAogIHZfUFZPSURfdCAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgcHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiOwogIHZfVThfdCAgICAgICAgICB1Y05leHRBQzsKICB2X1U4X3QgICAgICAgICAgdWNOZXh0U1RBOyAKICB2X1U4X3QgICAgICAgICAgdWNDb3VudDsgCiAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzazsgLy8gVFggRmxvd01hc2sgZnJvbSBXREEKICB2X1U4X3QgICAgICAgICAgdWNBQ01hc2sgPSAwOwogIHZfVThfdCAgICAgICAgICBpID0gMDsgCgogIHRCc3NTeXN0ZW1Sb2xlIHN5c3RlbVJvbGU7IC8vUkcgSEFDSyB0byBiZSByZW1vdmVkCiAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKCiAgcE1hYyA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1BFLCBwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBNYWMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwTWFjIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBzeXN0ZW1Sb2xlID0gd2RhR2V0R2xvYmFsU3lzdGVtUm9sZShwTWFjKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTl9UTEdldE5leHRUeElkcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgaWYgKChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkgfHwKICAgICAgKGVTWVNURU1fU1RBX0lOX0lCU1NfUk9MRSA9PSBzeXN0ZW1Sb2xlKSB8fAogICAgICAodm9zX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkpIHx8IHBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiNlbHNlCiAgaWYgKChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkgfHwKICAgICAgKGVTWVNURU1fU1RBX0lOX0lCU1NfUk9MRSA9PSBzeXN0ZW1Sb2xlKSB8fAogICAgICAodm9zX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkpKQojZW5kaWYKICB7CiAgICByZXR1cm4gV0xBTl9UTEFQR2V0TmV4dFR4SWRzKHB2b3NHQ3R4LHB1Y1NUQUlkKTsKICB9CgoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfR2V0VHhGbG93TWFzayggcHZvc0dDdHgsICZ1Rmxvd01hc2sgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gcmV0cmlldmUgRmxvdyBjb250cm9sIG1hc2sgZnJvbSBXREEiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyogVGhlIGZsb3cgbWFzayBkb2VzIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gZGlmZmVyZW50IEFDcy9RcwogICAqIHNpbmNlIHdlIHVzZSBhIHNpbmdsZSBkeGUgY2hhbm5lbCBmb3IgYWxsIEFDcy9RcywgaGVuY2UgaXQgaXMKICAgKiBlbm91Z2ggdG8gY2hlY2sgdGhhdCB0aGVyZSBhcmUgZHhlIHJlc291cmNlcyBvbiBkYXRhIGNoYW5uZWwKICAgKi8KICB1Rmxvd01hc2sgJj0gV0xBTlRMX0RBVEFfRkxPV19NQVNLOwoKICBpZiAoMCA9PSB1Rmxvd01hc2spCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDogTm8gcmVzb3VyY2VzIHRvIHNlbmQgcGFja2V0cyIpKTsKCiAgICAvLyBTZXR0aW5nIFNUQSBpZCB0byBpbnZhbGlkIGlmIG1hc2sgaXMgMAogICAgKnB1Y1NUQUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qU1RBIGlkIC0gbm8gcHJpb3JpdHkgeWV0IGltcGxlbWVudGVkICovCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hvb3NlIHRoZSBuZXh0IFNUQSBmb3IgdHggLSBmb3Igbm93IGdvIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbgogICAgdGhyb3VnaCBhbGwgdGhlIHN0YXRpb25zIHRoYXQgaGF2ZSBwZW5kaW5nIHBhY2tldHMgICAgIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVjTmV4dFNUQSA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CiAgCiAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IFdMQU5fTUFYX1NUQV9DT1VOVDsgCiAgZm9yICggdWNDb3VudCA9IDA7IAogICAgICAgIHVjQ291bnQgPCBXTEFOX01BWF9TVEFfQ09VTlQ7CiAgICAgICAgdWNDb3VudCsrICkKICB7CiAgICB1Y05leHRTVEEgPSAoICh1Y05leHRTVEErMSkgPj0gV0xBTl9NQVhfU1RBX0NPVU5UICk/MDoodWNOZXh0U1RBKzEpOwogICAgaWYoTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdKQogICAgewogICAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmICgocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0ID4gV0xBTlRMX0dPT0RfU1RBX1dFSUdIVCkgJiYKICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNQa3RQZW5kaW5nKSkgewogICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPndlaWdodF9jb3VudCA8PQogICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPndlaWdodCkgewogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0X2NvdW50Kys7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPndlaWdodF9jb3VudCA9IDA7CiAgICB9CgogICAgaWYgKCggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNFeGlzdHMgKSAmJgogICAgICAgICggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNQa3RQZW5kaW5nICkpCiAgICB7CiAgICAgIGlmIChXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dGxTdGF0ZSkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJTVEEgSUQ6ICVkIG9uIFdMQU5fVExHZXROZXh0VHhJZHMiLCAqcHVjU1RBSWQpKTsKICAgICAgICBwVExDYi0+dWNDdXJyZW50U1RBID0gdWNOZXh0U1RBOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICIlcyBTdGEgJWQgaXMgbm90IGluIGF1dGggc3RhdGUsIHNraXBwaW5nIHRoaXMgc3RhLiIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCB1Y05leHRTVEEpKTsKICAgICAgfQogICAgfQogIH0KCiAgKnB1Y1NUQUlkID0gcFRMQ2ItPnVjQ3VycmVudFNUQTsKCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoICpwdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDpObyBzdGF0aW9uIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCB0aGlzIHBvaW50IikpOwoKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CgogIH0KCiAgLypDb252ZXJ0IHRoZSBhcnJheSB0byBhIG1hc2sgZm9yIGVhc2llciBvcGVyYXRpb24qLwogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLCB1Y0FDTWFzaywgaSk7CiAgCiAgaWYgKCAwID09IHVjQUNNYXNrICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOiBNYXNrIDAgIgogICAgICAiU1RBIElEOiAlZCBvbiBXTEFOX1RMR2V0TmV4dFR4SWRzIiwgKnB1Y1NUQUlkKSk7CgogICAgIC8qc2V0dGluZyBTVEEgaWQgdG8gaW52YWxpZCBpZiBtYXNrIGlzIDAqLwogICAgICpwdWNTVEFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKCiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFDIGlzIHVwZGF0ZWQgd2hlbmV2ZXIgYSBwYWNrZXQgaXMgZmV0Y2hlZCBmcm9tIEhERCAtPiB0aGUgY3VycmVudAogICAgd2VpZ2h0IG9mIHN1Y2ggYW4gQUMgY2Fubm90IGJlIDAgLT4gaW4gdGhpcyBjYXNlIFRMIGlzIGV4cGVjdGVkIHRvCiAgICBleGl0IHRoaXMgZnVuY3Rpb24gYXQgdGhpcyBwb2ludCBkdXJpbmcgdGhlIG1haW4gVHggbG9vcAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgPCBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQgICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogTWFpbnRhaW5pbmcgc2VydmljZWQgQUMgdG86ICVkIGZvciBXZWlnaHQ6ICVkIiwKICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgLAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgQ2hvb3NlIGhpZ2hlc3QgcHJpb3JpdHkgQUMgLSAhISEgb3B0aW1pemUgbWUKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNOZXh0QUMgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQzsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiTmV4dCBBQzogJWQiLCB1Y05leHRBQykpOwoKICB3aGlsZSAoIDAgIT0gdWNBQ01hc2sgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiIEFDIE1hc2s6ICVkIE5leHQ6ICVkIFJlcyA6ICVkIiwKICAgICAgICAgICAgICAgdWNBQ01hc2ssICggMSA8PCB1Y05leHRBQyApLCAoIHVjQUNNYXNrICYgKCAxIDw8IHVjTmV4dEFDICkpKSk7CgogICAgaWYgKCAwICE9ICggdWNBQ01hc2sgJiAoIDEgPDwgdWNOZXh0QUMgKSkpCiAgICB7CiAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQyAgICAgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfQUNFbnVtVHlwZSl1Y05leHRBQzsKICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCA9CiAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y05leHRBQ107CgogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTd2l0Y2hpbmcgc2VydmljZWQgQUMgdG86ICVkIHdpdGggV2VpZ2h0OiAlZCIsCiAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDICwKICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50V2VpZ2h0KSk7CiAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAodWNOZXh0QUMgPT0gV0xBTlRMX0FDX0JLKQogICAgICAgIHVjTmV4dEFDID0gV0xBTlRMX0FDX0hJR0hfUFJJTzsKICAgIGVsc2UKICAgICAgICB1Y05leHRBQy0tOwoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJOZXh0IEFDICVkIiwgdWNOZXh0QUMpKTsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiIEMgQUM6ICVkIEMgVzogJWQiLAogICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMsCiAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5fVExHZXROZXh0VHhJZHMgKi8KCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBERUZBVUxUIEhBTkRMRVJTOiBSZWdpc3RlcmVkIGF0IGluaXRpYWxpemF0aW9uIHdpdGggVEwKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IKCiAgREVTQ1JJUFRJT04KICAgIERlZmF1bHQgTWdtdCBGcm0gcnggY2FsbGJhY2s6IGFzc2VydHMgYWxsIHRoZSB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMKICAgIGNhbGxlZCAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCByeCBjYiBwb2ludGVyIGZvciBNZ210IEZybS4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiBBbHdheXMgRkFJTFVSRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IKKAogIHZfUFZPSURfdCAgcHZvc0dDdHgsCiAgdl9QVk9JRF90ICB2b3NCdWZmCikKewogIGlmICggTlVMTCAhPSB2b3NCdWZmICkKICB7CiAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAiV0xBTiBUTDpGYXRhbCBmYWlsdXJlOiBObyByZWdpc3RlcmVkIE1nbXQgRnJtIGNsaWVudCBvbiBwa3QgUlgiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCh2b3NfcGt0X3QgKil2b3NCdWZmKTsKICB9CgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyByZWdpc3RlcmVkIE1nbXQgRnJtIGNsaWVudCBvbiBwa3QgUlguIExvYWQvVW5sb2FkIGluIHByb2dyZXNzLCBJZ25vcmUiKSk7CgogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKfS8qV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgV0xBTlRMX0JBUFJ4RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IEJBUCByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIEJBUC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiBBbHdheXMgRkFJTFVSRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9CQVBSeERlZmF1bHRDYgooCiAgdl9QVk9JRF90ICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgIHZvc0RhdGFCdWZmLAogIFdMQU5UTF9CQVBGcmFtZUVudW1UeXBlIGZyYW1lVHlwZQopCnsKICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAiV0xBTiBUTDpGYXRhbCBmYWlsdXJlOiBObyByZWdpc3RlcmVkIEJBUCBjbGllbnQgb24gQkFQIHBrdCBSWCIpKTsKI2lmbmRlZiBCVEFNUF9URVNUCiAgVk9TX0FTU0VSVCgwKTsKI2VuZGlmCiAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IFNUQSByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIHN0YXRpb24uCiAgICAoTWVtIGNvcnJ1cHRpb24gbW9zdCBsaWtlbHksIGl0IHNob3VsZCBuZXZlciBoYXBwZW4pCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgICBOb3QgdXNlZC4KCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVJ4RGVmYXVsdENiCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSogIHBSeE1ldGFJbmZvCikKewogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICJXTEFOIFRMOiBObyByZWdpc3RlcmVkIFNUQSBjbGllbnQgcnggY2IgZm9yIFNUQUlEOiAlZCBkcm9wcGluZyBwa3QiLAogICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFGZXRjaFBrdERlZmF1bHRDYgoKICBERVNDUklQVElPTgogICAgRGVmYXVsdCBmZXRjaCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIGZldGNoIGNiIHBvaW50ZXIgZm9yIHN0YXRpb24uCiAgICAoTWVtIGNvcnJ1cHRpb24gbW9zdCBsaWtlbHksIGl0IHNob3VsZCBuZXZlciBoYXBwZW4pCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgICBOb3QgdXNlZC4KCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICAgcHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgICAgICB1Y0FDLAogIHZvc19wa3RfdCoqICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCiAgV0xBTlRMX01ldGFJbmZvVHlwZSogICB0bE1ldGFJbmZvCikKewogIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICJXTEFOIFRMOkZhdGFsIGZhaWx1cmU6IE5vIHJlZ2lzdGVyZWQgU1RBIGNsaWVudCBvbiBkYXRhIHBrdCBSWCIpKTsKICBWT1NfQVNTRVJUKDApOwogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKfS8qV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeENvbXBEZWZhdWx0Q2IKCiAgREVTQ1JJUFRJT04KICAgIERlZmF1bHQgdHggY29tcGxldGUgaGFuZGxlci4gSXQgd2lsbCByZWxlYXNlIHRoZSBjb21wbGV0ZWQgcGt0IHRvCiAgICBwcmV2ZW50IG1lbW9yeSBsZWFrcy4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0bwogICAgICAgICAgICAgICAgICAgIFRML0hBTC9QRS9CQVAvSEREIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tCiAgICAgICAgICAgICAgICAgICAgaXRzIGNvbnRleHQKICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgdHJhbnNtaXR0ZWQKICAgIHdUeFNUQXR1czogICAgICBzdGF0dXMgb2YgdGhlIHRyYW5zbWlzc2lvbgoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbjsgcGxlYXNlCiAgICBjaGVjayB2b3NfcGt0X3JldHVybl9wYWNrZXQgZm9yIHBvc3NpYmxlIGVycm9yIGNvZGVzLgoKICAgIFBsZWFzZSBjaGVjayAgdm9zX3BrdF9yZXR1cm5fcGFja2V0IEFQSSBmb3IgcG9zc2libGUgcmV0dXJuIHZhbHVlcy4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeENvbXBEZWZhdWx0Q2IKKAogdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiB2b3NfcGt0X3QqICAgICB2b3NEYXRhQnVmZiwKIFZPU19TVEFUVVMgICAgIHdUeFNUQXR1cwopCnsKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpUWENvbXAgbm90IHJlZ2lzdGVyZWQsIHJlbGVhc2luZyBwa3QgdG8gcHJldmVudCBtZW0gbGVhayIpKTsKICByZXR1cm4gdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKfS8qV0xBTlRMX1R4Q29tcERlZmF1bHRDYiovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBDbGVhbnVwIGZ1bmN0aW9ucwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFuQ0IKCiAgREVTQ1JJUFRJT04KICAgIENsZWFucyBUTCBjb250cm9sIGJsb2NrCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHBUTENiOiAgICAgICBwb2ludGVyIHRvIFRMJ3MgY29udHJvbCBibG9jawogICAgdWNFbXB0eTogICAgIHNldCBpZiBUTCBoYXMgdG8gY2xlYW4gdXAgdGhlIHF1ZXVlcyBhbmQgcmVsZWFzZSBwZWRuaW5nIHBrdHMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbGVhbkNCCigKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgdWNFbXB0eQopCnsKICB2X1U4X3QgdWNJbmRleDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0NsZWFuQ0IiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyogbnVtYmVyIG9mIHBhY2tldHMgc2VudCB0byBCQUwgd2FpdGluZyBmb3IgdHggY29tcGxldGUgY29uZmlybWF0aW9uICovCiAgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCA9IDA7CgogIC8qIGdsb2JhbCBzdXNwZW5kIGZsYWcgKi8KICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMSk7CgogIC8qIHJlc291cmNlIGZsYWcgKi8KICBwVExDYi0+dVJlc0NvdW50ID0gMDsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xpZW50IHN0YXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfU1RBX0NPVU5UIDsgdWNJbmRleCsrKQogIHsKICAgIGlmKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0pCiAgICB7CiAgICAgICAgV0xBTlRMX0NsZWFuU1RBKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSwgdWNFbXB0eSk7CiAgICB9CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1hbmFnZW1lbnQgRnJhbWUgY2xpZW50CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgPSAwOwoKICBpZiAoICggMCAhPSB1Y0VtcHR5KSAmJgogICAgICAgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkpCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICB9CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICA9IE5VTEw7CgogIC8qIHNldCB0byBhIGRlZmF1bHQgY2IgaW4gb3JkZXIgdG8gcHJldmVudCBjb25zdGFudCBjaGVja2luZyBmb3IgTlVMTCAqLwogIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUnggPSBXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEJUIEFNUCBjbGllbnQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzID0gMDsKCiAgaWYgKCggMCAhPSB1Y0VtcHR5KSAmJgogICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICB9CiAgCiAgaWYgKCggMCAhPSB1Y0VtcHR5KSAmJgogICAgICAoIE5VTEwgIT0gcFRMQ2ItPnZvc0R1bW15QnVmICkpCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT52b3NEdW1teUJ1Zik7CiAgfQoKICBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICA9IE5VTEw7CgogIHBUTENiLT52b3NEdW1teUJ1ZiA9IE5VTEw7CiAgcFRMQ2ItPnZvc1RlbXBCdWYgID0gTlVMTDsKICBwVExDYi0+dWNDYWNoZWRTVEFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKCiAgLyogc2V0IHRvIGEgZGVmYXVsdCBjYiBpbiBvcmRlciB0byBwcmV2ZW50IGNvbnN0YW50IGNoZWNraW5nIGZvciBOVUxMICovCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUnggPSBXTEFOVExfQkFQUnhEZWZhdWx0Q2I7CgogIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKCn0vKiBXTEFOVExfQ2xlYW5DQiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DbGVhblNUQQoKICBERVNDUklQVElPTgogICAgQ2xlYW5zIGEgc3RhdGlvbiBjb250cm9sIGJsb2NrLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjRW1wdHk6ICAgICAgICBpZiBzZXQgdGhlIHF1ZXVlcyBhbmQgcGVuZGluZyBwa3RzIHdpbGwgYmUgZW1wdHllZAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbGVhblNUQQooCiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICBwdGxTVEFDbGllbnQsCiAgdl9VOF90ICAgICAgICAgICAgIHVjRW1wdHkKKQp7CiAgdl9VOF90ICB1Y0luZGV4OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHRsU1RBQ2xpZW50ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0NsZWFuU1RBIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhciBzdGF0aW9uIGZyb20gVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6IENsZWFyaW5nIFNUQSBDbGllbnQgSUQ6ICVkLCBFbXB0eSBmbGFnOiAlZCIsCiAgICAgICAgICAgICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU1RBSWQsIHVjRW1wdHkgKSk7CgogIHB0bFNUQUNsaWVudC0+cGZuU1RBUnggICAgICAgICAgPSBXTEFOVExfU1RBUnhEZWZhdWx0Q2I7CiAgcHRsU1RBQ2xpZW50LT5wZm5TVEFUeENvbXAgICAgICA9IFdMQU5UTF9UeENvbXBEZWZhdWx0Q2I7CiAgcHRsU1RBQ2xpZW50LT5wZm5TVEFGZXRjaFBrdCAgICA9IFdMQU5UTF9TVEFGZXRjaFBrdERlZmF1bHRDYjsKCiAgcHRsU1RBQ2xpZW50LT50bFN0YXRlICAgICAgICAgICA9IFdMQU5UTF9TVEFfSU5JVDsKICBwdGxTVEFDbGllbnQtPnRsUHJpICAgICAgICAgICAgID0gV0xBTlRMX1NUQV9QUklfTk9STUFMOwoKICB2b3NfemVyb19tYWNhZGRyKCAmcHRsU1RBQ2xpZW50LT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyApOwogIHZvc196ZXJvX21hY2FkZHIoICZwdGxTVEFDbGllbnQtPndTVEFEZXNjLnZCU1NJRGZvcklCU1MgKTsKICB2b3NfemVyb19tYWNhZGRyKCAmcHRsU1RBQ2xpZW50LT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MgKTsKCiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1NUQUlkICA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSA9IFdMQU5fU1RBX01BWDsKCiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgICAgID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjQWRkUm12TExDICAgICAgPSAwOwogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbiA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1Byb3RlY3RlZEZyYW1lID0gMDsKICBwdGxTVEFDbGllbnQtPmRpc2Fzc29jX3Byb2dyZXNzID0gVk9TX0ZBTFNFOwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQU1TRFUgaW5mb3JtYXRpb24gZm9yIHRoZSBTVEEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAoIDAgIT0gdWNFbXB0eSApICYmCiAgICAgICAoIE5VTEwgIT0gcHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluUm9vdCApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAgIldMQU4gVEw6Tm9uIE5VTEwgdm9zQU1TRFVDaGFpblJvb3Qgb24gV0xBTlRMX0NsZWFuU1RBLCAiCiAgICAgICAgICAgICAgICJzdXNwZWN0aW5nIGEgbWVtb3J5IGNvcnJ1cHRpb24iKSk7CgogIH0KCiAgcHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluICAgICA9IE5VTEw7CiAgcHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluUm9vdCA9IE5VTEw7CgogIHZvc19tZW1femVybyggKHZfUFZPSURfdClwdGxTVEFDbGllbnQtPmF1Y01QRFVIZWFkZXIsCiAgICAgICAgICAgICAgICAgV0xBTlRMX01QRFVfSEVBREVSX0xFTik7CiAgcHRsU1RBQ2xpZW50LT51Y01QRFVIZWFkZXJMZW4gICAgPSAwOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlb3JkZXJpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBTVEEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9USUQgOyB1Y0luZGV4KyspCiAgewogICAgaWYoMCA9PSBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0udWNFeGlzdHMpCiAgICB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYoTlVMTCAhPSBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlcikKICAgIHsKICAgICAgcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLnJlb3JkZXJCdWZmZXItPmlzQXZhaWxhYmxlID0gVk9TX1RSVUU7CiAgICAgIG1lbXNldCgmcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLnJlb3JkZXJCdWZmZXItPmFycmF5QnVmZmVyWzBdLCAwLCBXTEFOVExfTUFYX1dJTlNJWkUgKiBzaXplb2Yodl9QVk9JRF90KSk7CiAgICB9CiAgICB2b3NfdGltZXJfZGVzdHJveSgmcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLmFnaW5nVGltZXIpOwogICAgbWVtc2V0KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0sIDAsIHNpemVvZihXTEFOVExfQkFSZW9yZGVyVHlwZSkpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgUU9TIGluZm9ybWF0aW9uIGZvciB0aGUgU1RBCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgcHRsU1RBQ2xpZW50LT51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfSElHSF9QUklPOwogICBwdGxTVEFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IDA7CiAgIHB0bFNUQUNsaWVudC0+dWNTZXJ2aWNlZEFDICAgID0gV0xBTlRMX0FDX0JLOwoKICAgdm9zX21lbV96ZXJvKCBwdGxTVEFDbGllbnQtPmF1Y0FDTWFzaywgc2l6ZW9mKHB0bFNUQUNsaWVudC0+YXVjQUNNYXNrKSk7CiAgIHZvc19tZW1femVybyggJnB0bFNUQUNsaWVudC0+d1VBUFNESW5mbywgc2l6ZW9mKHB0bFNUQUNsaWVudC0+d1VBUFNESW5mbykpOwoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RhdHMgaW5mbwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICB2b3NfbWVtX3plcm8oIHB0bFNUQUNsaWVudC0+YXVSeENvdW50LAogICAgICAgICAgICAgICAgIHNpemVvZihwdGxTVEFDbGllbnQtPmF1UnhDb3VudFswXSkqIFdMQU5fTUFYX1RJRCk7CiAgIHZvc19tZW1femVybyggcHRsU1RBQ2xpZW50LT5hdVR4Q291bnQsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0bFNUQUNsaWVudC0+YXVUeENvdW50WzBdKSogV0xBTl9NQVhfVElEKTsKICAgcHRsU1RBQ2xpZW50LT5yc3NpQXZnID0gMDsKCiAgIC8qVHggbm90IHN1c3BlbmRlZCBhbmQgc3RhdGlvbiBmdWxseSByZWdpc3RlcmVkKi8KICAgdm9zX2F0b21pY19zZXRfVTgoICZwdGxTVEFDbGllbnQtPnVjVHhTdXNwZW5kZWQsIDApOwogICB2b3NfYXRvbWljX3NldF9VOCggJnB0bFNUQUNsaWVudC0+dWNOb01vcmVEYXRhLCAxKTsKCiAgaWYgKCAwID09IHVjRW1wdHkgKQogIHsKICAgIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNVY2FzdFNpZyAgICAgICA9IFdMQU5fVExfSU5WQUxJRF9VX1NJRzsKICAgIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNCY2FzdFNpZyAgICAgICA9IFdMQU5fVExfSU5WQUxJRF9CX1NJRzsKICB9CgogIHB0bFNUQUNsaWVudC0+dWNFeGlzdHMgICAgICAgPSAwOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGF0aXN0aWNzIGluZm8gCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgbWVtc2V0KCZwdGxTVEFDbGllbnQtPnRyYWZmaWNTdGF0aXN0aWNzLAogICAgICAgICAwLAogICAgICAgICBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgogIC8qZml4IG1lISE6IGFkZCBuZXcgdmFsdWVzIGZyb20gdGhlIFRMIENiIGZvciBjbGVhbnVwICovCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9DbGVhblNUQSAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfRW5hYmxlVUFQU0RGb3JBQwoKICBERVNDUklQVElPTgogICBDYWxsZWQgYnkgSEREIHRvIGVuYWJsZSBVQVBTRC4gVEwgaW4gdHVybiBjYWxscyBXREEgQVBJIHRvIGVuYWJsZSB0aGUKICAgbG9naWMgaW4gRlcvU0xNIHRvIHN0YXJ0IHNlbmRpbmcgdHJpZ2dlciBmcmFtZXMuIFByZXZpb3VzbHkgVEwgaGFkIHRoZQogICB0cmlnZ2VyIGZyYW1lIGxvZ2ljIHdoaWNoIGxhdGVyIG1vdmVkIGRvd24gdG8gRlcuIEhlbmNlCiAgIEhERCAtPiBUTCAtPiBXREEgLT4gRlcgY2FsbCBmbG93LgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBJZAogICAgdWNBQzogICAgICAgICAgIEFDIGZvciB3aGljaCBVLUFQU0QgaXMgYmVpbmcgZW5hYmxlZAogICAgdWNUaWQ6ICAgICAgICAgIFRJRCBmb3Igd2hpY2ggVS1BUFNEIGlzIHNldHVwCiAgICB1Y1VQOiAgICAgICAgICAgdXNlZCB0byBwbGFjZSBpbiB0aGUgdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uCiAgICB1Y1NlcnZpY2VJbnQ6ICAgc2VydmljZSBpbnRlcnZhbCB1c2VkIGJ5IFRMIHRvIHNlbmQgdHJpZ2dlciBmcmFtZXMKICAgIHVjU3VzcGVuZEludDogICBzdXNwZW5kIGludGVydmFsIHVzZWQgYnkgVEwgdG8gZGV0ZXJtaW5lIHRoYXQgYW4KICAgICAgICAgICAgICAgICAgICBhcHAgaXMgaWRsZSBhbmQgc2hvdWxkIHN0YXJ0IHNlbmRpbmcgdHJpZ2cgZnJtcyBsZXNzIG9mdGVuCiAgICB3VFNEaXI6ICAgICAgICAgZGlyZWN0aW9uIG9mIFRTcGVjCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMKKAogIHZfUFZPSURfdCAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfQUNFbnVtVHlwZSAgdWNBQywKICB2X1U4X3QgICAgICAgICAgICAgdWNUaWQsCiAgdl9VOF90ICAgICAgICAgICAgIHVjVVAsCiAgdl9VMzJfdCAgICAgICAgICAgIHVTZXJ2aWNlSW50LAogIHZfVTMyX3QgICAgICAgICAgICB1U3VzcGVuZEludCwKICBXTEFOVExfVFNEaXJUeXBlICAgd1RTRGlyCikKewoKICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiICAgICAgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzICAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdFVhcHNkSW5mbyAgICAgICAgICBoYWxVQVBTREluZm87IAogLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8IFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApCiAgICAgIHx8ICAgV0xBTlRMX0FDX0lOVkFMSUQodWNBQykpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIGlucHV0IHBhcmFtcyBvbiBXTEFOVExfRW5hYmxlVUFQU0RGb3JBQyIKICAgICAgICAgICAgICAgIiBUTDogJXBLICBTVEE6ICVkICBBQzogJWQiLAogICAgICAgICAgICAgICBwVExDYiwgdWNTVEFJZCwgdWNBQykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLypTZXQgdGhpcyBmbGFnIGluIG9yZGVyIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBpcyBhIHRyaWdnZXIgZW5hYmxlZCBBQyovCiAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndVQVBTREluZm9bdWNBQ10udWNTZXQgPSAxOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgaWYocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLndTVEFUeXBlICE9IFdMQU5fU1RBX1RETFMpCiNlbmRpZgogIHsKICAgIGlmKCAwID09IHVTZXJ2aWNlSW50ICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnB1dCBwYXJhbXMgb24gV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMiCiAgICAgICAgICAgICAgICIgU0k6ICVkIiwgdVNlcnZpY2VJbnQgKSk7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RW5hYmxpbmcgVS1BUFNEIGluIEZXIGZvciBTVEE6ICVkIEFDOiAlZCBTSTogJWQgU1BJOiAlZCAiCiAgICAgICAgICAgICAgICJESTogJWQiLAogICAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FDLCB1U2VydmljZUludCwgdVN1c3BlbmRJbnQsCiAgICAgICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50KSk7CgogICAgLypTYXZlIGFsbCBpbmZvIGZvciBIQUwqLwogICAgaGFsVUFQU0RJbmZvLnN0YWlkeCAgICAgICAgID0gdWNTVEFJZDsKICAgIGhhbFVBUFNESW5mby5hYyAgICAgICAgICAgICA9IHVjQUM7CiAgICBoYWxVQVBTREluZm8udXAgICAgICAgICAgICAgPSB1Y1VQOwogICAgaGFsVUFQU0RJbmZvLnNydkludGVydmFsICAgID0gdVNlcnZpY2VJbnQ7CiAgICBoYWxVQVBTREluZm8uc3VzSW50ZXJ2YWwgICAgPSB1U3VzcGVuZEludDsKICAgIGhhbFVBUFNESW5mby5kZWxheUludGVydmFsICA9IHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50OwoKICAgIC8qTm90aWZ5IEhBTCovCiAgICB2b3NTdGF0dXMgPSBXREFfRW5hYmxlVWFwc2RBY1BhcmFtcyhwdm9zR0N0eCwgdWNTVEFJZCwgJmhhbFVBUFNESW5mbyk7CiAgfQogIHJldHVybiB2b3NTdGF0dXM7Cgp9LypXTEFOVExfRW5hYmxlVUFQU0RGb3JBQyovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQwoKICBERVNDUklQVElPTgogICBDYWxsZWQgYnkgSEREIHRvIGRpc2FibGUgVUFQU0QuIFRMIGluIHR1cm4gY2FsbHMgV0RBIEFQSSB0byBkaXNhYmxlIHRoZQogICBsb2dpYyBpbiBGVy9TTE0gdG8gc3RvcCBzZW5kaW5nIHRyaWdnZXIgZnJhbWVzLiBQcmV2aW91c2x5IFRMIGhhZCB0aGUKICAgdHJpZ2dlciBmcmFtZSBsb2dpYyB3aGljaCBsYXRlciBtb3ZlZCBkb3duIHRvIEZXLiBIZW5jZQogICBIREQgLT4gVEwgLT4gV0RBIC0+IEZXIGNhbGwgZmxvdy4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gSWQKICAgIHVjQUM6ICAgICAgICAgQUMgZm9yIHdoaWNoIFUtQVBTRCBpcyBiZWluZyBlbmFibGVkCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQwooCiAgdl9QVk9JRF90ICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9BQ0VudW1UeXBlICB1Y0FDCikKewogIFdMQU5UTF9DYlR5cGUqIHBUTENiOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKQogICAgICB8fCAgIFdMQU5UTF9BQ19JTlZBTElEKHVjQUMpICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQyIKICAgICAgICAgICAgICAgIiBUTDogJXBLICBTVEE6ICVkICBBQzogJWQiLCBwVExDYiwgdWNTVEFJZCwgdWNBQyApKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qUmVzZXQgdGhpcyBmbGFnIGFzIHRoaXMgaXMgbm8gbG9uZ2VyIGEgdHJpZ2dlciBlbmFibGVkIEFDKi8KICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1VBUFNESW5mb1t1Y0FDXS51Y1NldCA9IDE7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpEaXNhYmxpbmcgVS1BUFNEIGluIEZXIGZvciBTVEE6ICVkIEFDOiAlZCAiLAogICAgICAgICAgICAgdWNTVEFJZCwgdWNBQykpOwoKICAvKk5vdGlmeSBIQUwqLwogIFdEQV9EaXNhYmxlVWFwc2RBY1BhcmFtcyhwdm9zR0N0eCwgdWNTVEFJZCwgdWNBQyk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfRGlzYWJsZVVBUFNERm9yQUMgKi8KCiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IKCiAgREVTQ1JJUFRJT04gIFJlZ2lzdHJhdGlvbiBmdW5jdGlvbiB0byBnZXQgbm90aWZpY2F0aW9uIGlmIFJTU0kgY3Jvc3MKICAgICAgICAgICAgICAgdGhyZXNob2xkLgogICAgICAgICAgICAgICBDbGllbnQgc2hvdWxkIHJlZ2lzdGVyIHRocmVzaG9sZCwgZGlyZWN0aW9uLCBhbmQgbm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKCiAgREVQRU5ERU5DSUVTIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgaW4gcnNzaVZhbHVlIC0gUlNTSSB0aHJlc2hvbGQgdmFsdWUKICAgICAgICAgICAgICAgaW4gdHJpZ2dlckV2ZW50IC0gQ3Jvc3MgZGlyZWN0aW9uIHNob3VsZCBiZSBub3RpZmllZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUCwgRE9XTiwgYW5kIENST1NTCiAgICAgICAgICAgICAgIGluIGNyb3NzQ0JGdW5jdGlvbiAtIE5vdGlmaWNhdGlvbiBDQiBGdW5jdGlvbgogICAgICAgICAgICAgICBpbiB1c3JDdHh0IC0gdXNlciBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWdSU1NJSW5kaWNhdGlvbkNCCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgdl9TN190ICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAogICBXTEFOVExfUlNTSUNyb3NzVGhyZXNob2xkQ0JUeXBlIGNyb3NzQ0JGdW5jdGlvbiwKICAgVk9TX01PRFVMRV9JRCAgICAgICAgICAgICAgICAgICBtb2R1bGVJRCwKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0CikKewogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwoKICAgc3RhdHVzID0gV0xBTlRMX0hTUmVnUlNTSUluZGljYXRpb25DQihwQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzQ0JGdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0KTsKCiAgIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgV0xBTlRMX0RlcmVnUlNTSUluZGljYXRpb25DQgoKICBERVNDUklQVElPTiAgUmVtb3ZlIHNwZWNpZmljIHRocmVzaG9sZCBmcm9tIGxpc3QKCiAgREVQRU5ERU5DSUVTIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgaW4gcnNzaVZhbHVlIC0gUlNTSSB0aHJlc2hvbGQgdmFsdWUKICAgICAgICAgICAgICAgaW4gdHJpZ2dlckV2ZW50IC0gQ3Jvc3MgZGlyZWN0aW9uIHNob3VsZCBiZSBub3RpZmllZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUCwgRE9XTiwgYW5kIENST1NTCiAgIAogIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9EZXJlZ1JTU0lJbmRpY2F0aW9uQ0IKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1M3X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgIFdMQU5UTF9SU1NJQ3Jvc3NUaHJlc2hvbGRDQlR5cGUgY3Jvc3NDQkZ1bmN0aW9uLAogICBWT1NfTU9EVUxFX0lEICAgICAgICAgICAgICAgICAgIG1vZHVsZUlECikKewogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwoKICAgc3RhdHVzID0gV0xBTlRMX0hTRGVyZWdSU1NJSW5kaWNhdGlvbkNCKHBBZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NDQkZ1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQpOwogICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgIFdMQU5UTF9TZXRBbHBoYQoKICBERVNDUklQVElPTiAgQUxQTEEgaXMgd2VpZ2h0IHZhbHVlIHRvIGNhbGN1bGF0ZSBBVkcgUlNTSQogICAgICAgICAgICAgICBhdmdSU1NJID0gKEFMUEhBICogaGlzdG9yeVJTU0kpICsgKCgxMCAtIEFMUEhBKSAqIG5ld1JTU0kpCiAgICAgICAgICAgICAgIGF2Z1JTU0kgaGFzIChBTFBIQSAqIDEwKSUgb2YgaGlzdG9yeSBSU1NJIHdlaWdodCBhbmQKICAgICAgICAgICAgICAgKDEwIC0gQUxQSEEpJSBvZiBuZXdSU1NJIHdlaWdodAogICAgICAgICAgICAgICBUaGlzIHBvcnRpb24gaXMgZHluYW1pY2FsbHkgY29uZmlndXJhYmxlLgogICAgICAgICAgICAgICBEZWZhdWx0IGlzID8KCiAgREVQRU5ERU5DSUVTIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgaW4gdmFsdWVBbHBhaCAtIEFMUEhBCiAgIAogIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9TZXRBbHBoYQooCiAgIHZfUFZPSURfdCBwQWRhcHRlciwKICAgdl9VOF90ICAgIHZhbHVlQWxwaGEKKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNTZXRBbHBoYShwQWRhcHRlciwgdmFsdWVBbHBoYSk7CiAgIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIEZVTkNUSU9OCgogICBERVNDUklQVElPTiAKICAgIAogICBQQVJBTUVURVJTIAoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfQk1QU1JTU0lSZWdpb25DaGFuZ2VkTm90aWZpY2F0aW9uCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgIHBBZGFwdGVyLAogICB0cFNpclJTU0lOb3RpZmljYXRpb24gcFJTU0lOb3RpZmljYXRpb24KKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNCTVBTUlNTSVJlZ2lvbkNoYW5nZWROb3RpZmljYXRpb24ocEFkYXB0ZXIsIHBSU1NJTm90aWZpY2F0aW9uKTsKICAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICBXTEFOVExfUmVnR2V0VHJhZmZpY1N0YXR1cwoKICBERVNDUklQVElPTiAgUmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0cmFmZmljIHN0YXR1cyBtb25pdG9yaW5nCiAgICAgICAgICAgICAgIER1cmluZyBtZWFzdXJlIHBlcmlvZCBjb3VudCBkYXRhIGZyYW1lcy4KICAgICAgICAgICAgICAgSWYgZnJhbWUgY291bnQgaXMgbGFyZ2VyIHRoZW4gSURMRSB0aHJlc2hvbGQgc2V0IGFzIHRyYWZmaWMgT04KICAgICAgICAgICAgICAgb3IgT0ZGLgogICAgICAgICAgICAgICBBbmQgdHJhZmZpYyBzdGF0dXMgaXMgY2hhbmdlZCBzZW5kIHJlcG9ydCB0byBjbGllbnQgd2l0aAogICAgICAgICAgICAgICByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uCgogIERFUEVOREVOQ0lFUyBOT05FCiAgICAKICBQQVJBTUVURVJTICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgIGluIGlkbGVUaHJlc2hvbGQgLSBUcmFmZmljIG9uIG9yIG9mZiB0aHJlc2hvbGQKICAgICAgICAgICAgICAgaW4gbWVhc3VyZVBlcmlvZCAtIFRyYWZmaWMgc3RhdGUgY2hlY2sgcGVyaW9kCiAgICAgICAgICAgICAgIGluIHRyZmZpY1N0YXR1c0NCIC0gdHJhZmZpYyBzdGF0dXMgY2hhbmdlZCBub3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQiBmdW5jdGlvbgogICAgICAgICAgICAgICBpbiB1c3JDdHh0IC0gdXNlciBjb250ZXh0CiAgIAogIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWdHZXRUcmFmZmljU3RhdHVzCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlVGhyZXNob2xkLAogICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVQZXJpb2QsCiAgIFdMQU5UTF9UcmFmZmljU3RhdHVzQ2hhbmdlZENCVHlwZSAgdHJmZmljU3RhdHVzQ0IsCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dAopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU1JlZ0dldFRyYWZmaWNTdGF0dXMocEFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRsZVRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlUGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZmZpY1N0YXR1c0NCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQpOwogICByZXR1cm4gc3RhdHVzOwp9CiNlbmRpZgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0U3RhdGlzdGljcwoKICBERVNDUklQVElPTiAgIEdldCB0cmFmZmljIHN0YXRpc3RpY3MgZm9yIGlkZW50aWZpZWQgc3RhdGlvbiAKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CiAgICAgICAgICAgICAgICBvdXQgc3RhdEJ1ZmZlciAtIHRyYWZmaWMgc3RhdGlzdGljcyBidWZmZXIKICAgCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfR2V0U3RhdGlzdGljcwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgICpzdGF0QnVmZmVyLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICBTVEFpZAopCnsKICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICAgcENsaWVudFNUQSA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYoMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOiAlZCBTVEEgSUQgZG9lcyBub3QgZXhpc3QiLCBTVEFpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmKE5VTEwgPT0gc3RhdEJ1ZmZlcikKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOkludmFsaWQgVEwgc3RhdGlzdGljcyBidWZmZXIgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBzdGF0aXN0aWNzID0gJnBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzOwogIHZvc19tZW1fY29weShzdGF0QnVmZmVyLCBzdGF0aXN0aWNzLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgogIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9SZXNldFN0YXRpc3RpY3MKCiAgREVTQ1JJUFRJT04gICBSZXNldCBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IgaWRlbnRpZmllZCBzdGF0aW9uIElECiAgICAgICAgICAgICAgICBSZXNldCBtZWFucyBzZXQgdmFsdWVzIGFzIDAKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CiAgIAogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1Jlc2V0U3RhdGlzdGljcwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICBTVEFpZAopCnsKICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICAgcENsaWVudFNUQSA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHBUTENiKSAKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZigwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgc3RhdGlzdGljcyA9ICZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljczsKICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopc3RhdGlzdGljcywgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwoKICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0U3BlY1N0YXRpc3RpYwoKICBERVNDUklQVElPTiAgIEdldCBzcGVjaWZpYyBmaWVsZCB3aXRoaW4gc3RhdGlzdGljcyBzdHJ1Y3R1cmUgZm9yCiAgICAgICAgICAgICAgICBpZGVudGlmaWVkIHN0YXRpb24gSUQgCgogIERFUEVOREVOQ0lFUyAgTk9ORQoKICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CiAgICAgICAgICAgICAgICBpbiBTVEFpZCAgICAtIFN0YXRpb24gSUQKICAgICAgICAgICAgICAgIG91dCBidWZmZXIgIC0gU3RhdGlzdGljIHZhbHVlCiAgIAogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0dldFNwZWNTdGF0aXN0aWMKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICBXTEFOVExfVFJBTlNGRVJfU1RBVElDX1RZUEUgIHN0YXRUeXBlLAogICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICBTVEFpZAopCnsKICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICAgcENsaWVudFNUQSA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHBUTENiKSAKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW1NUQWlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmKDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDogJWQgU1RBIElEIGRvZXMgbm90IGV4aXN0IiwgU1RBaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZihOVUxMID09IGJ1ZmZlcikKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOkludmFsaWQgVEwgc3RhdGlzdGljIGJ1ZmZlciBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHN0YXRpc3RpY3MgPSAmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3M7CiAgc3dpdGNoKHN0YXRUeXBlKQogIHsKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhVQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9NQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhNQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhCQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhVQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9NQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhNQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhCQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhVQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9NQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhNQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhCQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhVQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9NQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhNQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhCQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhCY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNOVF9DUkNfT0s6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJjbnRDUkNvazsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1JBVEU6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFJhdGU7CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICpidWZmZXIgPSAwOwogICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICAgIGJyZWFrOwogIH0KCgogIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9SZXNldFNwZWNTdGF0aXN0aWMKCiAgREVTQ1JJUFRJT04gICBSZXNldCBzcGVjaWZpYyBmaWVsZCB3aXRoaW4gc3RhdGlzdGljcyBzdHJ1Y3R1cmUgZm9yCiAgICAgICAgICAgICAgICBpZGVudGlmaWVkIHN0YXRpb24gSUQKICAgICAgICAgICAgICAgIFJlc2V0IG1lYW5zIHNldCBhcyAwCgogIERFUEVOREVOQ0lFUyAgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgIGluIHN0YXRUeXBlIC0gc3BlY2lmaWMgc3RhdGlzdGljcyBmaWVsZCB0byByZXNldAogICAgICAgICAgICAgICAgaW4gU1RBaWQgICAgLSBTdGF0aW9uIElECgogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1Jlc2V0U3BlY1N0YXRpc3RpYwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFUSUNfVFlQRSAgc3RhdFR5cGUsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgU1RBaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICpwVExDYiAgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogICAgIHBDbGllbnRTVEEgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAqc3RhdGlzdGljcyA9IE5VTEw7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoTlVMTCA9PSBwVExDYikgCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYoMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOiAlZCBTVEEgSUQgZG9lcyBub3QgZXhpc3QiLCBTVEFpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHN0YXRpc3RpY3MgPSAmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3M7CiAgc3dpdGNoKHN0YXRUeXBlKQogIHsKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT50eFVDRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9NQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT50eE1DRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT50eEJDRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT50eFVDQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9NQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT50eE1DQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT50eEJDQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeFVDRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9NQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeE1DRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeEJDRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeFVDQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9NQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeE1DQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeEJDQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeEJjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNOVF9DUkNfT0s6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QmNudENSQ29rID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1JBVEU6CiAgICAgIHN0YXRpc3RpY3MtPnJ4UmF0ZSA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gc3RhdHVzOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgRlVOQ1RJT04KCiAgIERFU0NSSVBUSU9OICAgUmVhZCBSU1NJIHZhbHVlIG91dCBvZiBhIFJYIEJECiAgICAKICAgUEFSQU1FVEVSUzogIENhbGxlciBtdXN0IHZhbGlkYXRlIGFsbCBwYXJhbWV0ZXJzIAoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVhZFJTU0kKKAogICB2X1BWT0lEX3QgICAgICAgIHBBZGFwdGVyLAogICB2X1BWT0lEX3QgICAgICAgIHBCREhlYWRlciwKICAgdl9VOF90ICAgICAgICAgICBTVEFpZAopCnsKICAgV0xBTlRMX0NiVHlwZSAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKICAgdl9TN190ICAgICAgICAgICBjdXJyZW50UlNTSSwgY3VycmVudFJTU0kwLCBjdXJyZW50UlNTSTE7CgoKICAgaWYoTlVMTCA9PSB0bEN0eHQpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBJbnZhbGlkIFRMIGhhbmRsZSIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgIH0KCiAgIGlmICggTlVMTCA9PSB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdICkKICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICB9CgogICBjdXJyZW50UlNTSTAgPSBXTEFOVExfR0VUUlNTSTAocEJESGVhZGVyKTsKICAgY3VycmVudFJTU0kxID0gV0xBTlRMX0dFVFJTU0kxKHBCREhlYWRlcik7CiAgIGN1cnJlbnRSU1NJICA9IChjdXJyZW50UlNTSTAgPiBjdXJyZW50UlNTSTEpID8gY3VycmVudFJTU0kwIDogY3VycmVudFJTU0kxOwoKICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+cnNzaUF2ZyA9IGN1cnJlbnRSU1NJOwoKICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgRlVOQ1RJT04KCiAgIERFU0NSSVBUSU9OICAgUmVhZCBTTlIgdmFsdWUgb3V0IG9mIGEgUlggQkQKCiAgIFBBUkFNRVRFUlM6ICBDYWxsZXIgbXVzdCB2YWxpZGF0ZSBhbGwgcGFyYW1ldGVycwoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVhZFNOUgooCiAgIHZfUFZPSURfdCAgICAgICAgcEFkYXB0ZXIsCiAgIHZfUFZPSURfdCAgICAgICAgcEJESGVhZGVyLAogICB2X1U4X3QgICAgICAgICAgIFNUQWlkCikKewogICBXTEFOVExfQ2JUeXBlICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICB2X1M3X3QgICAgICAgICAgIGN1cnJlbnRTTlI7CgoKICAgaWYgKE5VTEwgPT0gdGxDdHh0KQogICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICIlcyBJbnZhbGlkIFRMIGhhbmRsZSIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgIH0KCiAgIGlmIChOVUxMID09IHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0pCiAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgfQoKICAgY3VycmVudFNOUiA9IFdMQU5UTF9HRVRTTlIocEJESGVhZGVyKTsKCiAgIC8qIFNOUiByZXBvcnRlZCBpbiB0aGUgQnVmZmVyIERlc2NyaXB0b3IgaXMgc2NhbGVkIHVwIGJ5IDIoU05SKjIpLAogICAgKiBHZXQgdGhlIGNvcnJlY3QgU05SIHZhbHVlCiAgICAqLwogICBjdXJyZW50U05SID0gY3VycmVudFNOUiA+PiAxOwoKICAgLyogU05SIHJlcG9ydGVkIGJ5IEhXIGNhbm5vdCBiZSBtb3JlIHRoYW4gMzVkQiBkdWUgdG8gSFcgbGltaXRhdGlvbnMgKi8KICAgY3VycmVudFNOUiA9IChXTEFOVExfTUFYX0hXX1NOUiA+IGN1cnJlbnRTTlIgPyBjdXJyZW50U05SIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUFYX0hXX1NOUik7CgogICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAiJXM6IHNucnN1bTogJWQgc25yaWR4OiAlZCBwcmV2c25yYXZnOiAlZCIsCiAgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25yU3VtLAogICAgICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnNucklkeCwKICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5wcmV2U25yQXZnKSk7CgogICAvKiBUaGUgU05SIHJldHVybmVkIGZvciBhbGwgcHVycG9zZXMgaXMgdGhlIGF2ZXJhZ2UgU05SIG92ZXIKICAgICogV0xBTlRMX01BWF9TTlJfREFUQV9TTUFQTEVTLldoZW4gZGF0YSBzYW1wbGVzCiAgICAqID4gV0xBTlRMX01BWF9TTlJfREFUQV9TQU1QTEVTIGFyZSBvYnRhaW5lZCwKICAgICogc3RvcmUgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHNhbXBsZXMgaW4gcHJldlNuckF2ZwogICAgKiBhbmQgc3RhcnQgYSBuZXcgYXZlcmFnaW5nIHdpbmRvdy4gVGhlIHByZXZTbnJBdmcgaXMgdXNlZCB3aGVuCiAgICAqIGVub3VnaCBkYXRhIHNhbXBsZXMgYXJlIG5vdCBhdmFpbGFibGUgd2hlbiBhcHBsaWNhdGlvbnMKICAgICogYWN0dWFsbHkgcXVlcnkgZm9yIFNOUi4KICAgICoKICAgICogU0VFOiBXTEFOVExfR2V0U25yKCkKICAgICovCiAgIGlmICh0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJJZHggPj0gV0xBTlRMX01BWF9TTlJfREFUQV9TQU1QTEVTKQogICB7CiAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5wcmV2U25yQXZnID0KICAgICAgICAgICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25yU3VtIC8KICAgICAgICAgICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4OwogICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25yU3VtID0gMDsKICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnNucklkeCA9IDA7CiAgIH0KICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25yU3VtICs9IGN1cnJlbnRTTlI7CiAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnNucklkeCArPSAxOwoKICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyoKIERFU0NSSVBUSU9OIAogICAgVEwgcmV0dXJucyB0aGUgd2VpZ2h0IGN1cnJlbnRseSBtYWludGFpbmVkIGluIFRMLgogSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCgogT1VUCiAgICBwQUNXZWlnaHRzOiAgICAgQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGZpbGxpbmcgaW4gd2VpZ2h0cwoKIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUwoqLwpWT1NfU1RBVFVTICAKV0xBTlRMX0dldEFDV2VpZ2h0cyAKKCAKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90KiAgICAgICAgICAgICAgIHBBQ1dlaWdodHMKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgIHZfVThfdCAgICAgICAgICB1Y0luZGV4OyAKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwQUNXZWlnaHRzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldEFDV2VpZ2h0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5UTF9NQVhfQUMgOyB1Y0luZGV4KyspCiAgewogICAgcEFDV2VpZ2h0c1t1Y0luZGV4XSA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNJbmRleF07CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKCi8qCiBERVNDUklQVElPTiAKICAgIENoYW5nZSB0aGUgd2VpZ2h0IGN1cnJlbnRseSBtYWludGFpbmVkIGJ5IFRMLgogSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCiAgICBwQUNXZWlnaHRzOiAgICAgQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgY29udGFpbiB0aGUgd2VpZ2h0cyB0byB1c2UKCgogUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCiovClZPU19TVEFUVVMgIApXTEFOVExfU2V0QUNXZWlnaHRzIAooIAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICAgICAgICAgcEFDV2VpZ2h0cwopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdl9VOF90ICAgICAgICAgIHVjSW5kZXg7IAogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBBQ1dlaWdodHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldEFDV2VpZ2h0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjSW5kZXhdID0gcEFDV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbV0xBTlRMX0FDX0hJR0hfUFJJT10gPSBwQUNXZWlnaHRzW1dMQU5UTF9BQ19WT107CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIEZVTkNUSU9OCgogICBERVNDUklQVElPTiAKICAgIAogICBQQVJBTUVURVJTIAoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfUG93ZXJTdGF0ZUNoYW5nZWRDQgooCiAgIHZfUFZPSURfdCBwQWRhcHRlciwKICAgdFBtY1N0YXRlIG5ld1N0YXRlCikKewogICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgICAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKCiAgIGlmIChOVUxMID09IHRsQ3R4dCkKICAgewogICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFRMIENvbnRyb2wgQmxvY2siLCBfX2Z1bmNfXyApOwogICAgIHJldHVybjsKICAgfQoKICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIlBvd2VyIHN0YXRlIGNoYW5nZWQsIG5ldyBzdGF0ZSBpcyAlZCIsIG5ld1N0YXRlICk7CiAgIHN3aXRjaChuZXdTdGF0ZSkKICAgewogICAgICBjYXNlIEZVTExfUE9XRVI6CiAgICAgICAgIHRsQ3R4dC0+aXNCTVBTID0gVk9TX0ZBTFNFOwogICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQk1QUzoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgICAgICAgV0xBTlRMX1NldEZXUlNTSVRocmVzaG9sZHMocEFkYXB0ZXIpOwojZW5kaWYKCiAgICAgICAgIHRsQ3R4dC0+aXNCTVBTID0gVk9TX1RSVUU7CiAgICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBJTVBTOgogICAgICBjYXNlIExPV19QT1dFUjoKICAgICAgY2FzZSBSRVFVRVNUX0JNUFM6CiAgICAgIGNhc2UgUkVRVUVTVF9GVUxMX1BPV0VSOgogICAgICBjYXNlIFJFUVVFU1RfSU1QUzoKICAgICAgY2FzZSBTVE9QUEVEOgogICAgICBjYXNlIFJFUVVFU1RfU1RBUlRfVUFQU0Q6CiAgICAgIGNhc2UgUkVRVUVTVF9TVE9QX1VBUFNEOgogICAgICBjYXNlIFVBUFNEOgogICAgICBjYXNlIFJFUVVFU1RfU1RBTkRCWToKICAgICAgY2FzZSBTVEFOREJZOgogICAgICBjYXNlIFJFUVVFU1RfRU5URVJfV09XTDoKICAgICAgY2FzZSBSRVFVRVNUX0VYSVRfV09XTDoKICAgICAgY2FzZSBXT1dMOgogICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIk5vdCBoYW5kbGUgdGhpcyBldmVudHMgJWQiLCBuZXdTdGF0ZSApKTsKICAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJOb3QgYSB2YWxpZCBldmVudCAlZCIsIG5ld1N0YXRlICkpOwogICAgICAgICBicmVhazsKICAgfQoKICAgcmV0dXJuOwp9Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRFdGhlclR5cGUKCiAgREVTQ1JJUFRJT04gICBFeHRyYWN0IEV0aGVyIHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkQKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIGF1Y0JESGVhZGVyIC0gQkQgaGVhZGVyCiAgICAgICAgICAgICAgICBpbiB2b3NEYXRhQnVmZiAtIGRhdGEgYnVmZmVyCiAgICAgICAgICAgICAgICBpbiB1Y01QRFVITGVuICAtIE1QRFUgaGVhZGVyIGxlbmd0aAogICAgICAgICAgICAgICAgb3V0IHBVc0V0aGVyVHlwZSAtIHBvaW50ZXIgdG8gRXRoZXJ0eXBlCgogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVU19TVUNDRVNTIDogaWYgdGhlIEV0aGVyVHlwZSBpcyBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkCiAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0ZBSUxVUkUgOiBpZiB0aGUgRXRoZXJUeXBlIGV4dHJhY3Rpb24gZmFpbGVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldCB3YXMgZHJvcHBlZAoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTIFdMQU5UTF9HZXRFdGhlclR5cGUKKAogICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogICB2b3NfcGt0X3QgICAgICAgICAgICAqIHZvc0RhdGFCdWZmLAogICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgIHZfVTE2X3QgICAgICAgICAgICAgICogcFVzRXRoZXJUeXBlCikKewogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAqcFVzRXRoZXJUeXBlOwogIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c0xMQ1NpemUgPSBzaXplb2YodXNFdGhlclR5cGUpOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBMTEMgaXMgcHJlc2VudCAtIGlmIG5vdCwgVEwgaXMgdW5hYmxlIHRvIGRldGVybWluZSB0eXBlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKCBhdWNCREhlYWRlciApICkKICB7CiAgICB1Y09mZnNldCA9IFdMQU5UTF84MDJfM19IRUFERVJfTEVOIC0gc2l6ZW9mKHVzRXRoZXJUeXBlKTsgCiAgfQogIGVsc2UKICB7CiAgICB1Y09mZnNldCA9IHVjTVBEVUhMZW4gKyBXTEFOVExfTExDX1BST1RPX1RZUEVfT0ZGU0VUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgTExDIHR5cGUgCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsIHVjT2Zmc2V0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmdXNFdGhlclR5cGUsICZ1c0xMQ1NpemUpOyAKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8IAogICAgICAoIHNpemVvZih1c0V0aGVyVHlwZSkgIT0gdXNMTENTaXplICkpCiAgICAgIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3IgZXh0cmFjdGluZyBFdGhlciB0eXBlIGZyb20gZGF0YSBwYWNrZXQiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KICBlbHNlCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXRoZXIgdHlwZSByZXRyaWV2ZWQgYmVmb3JlIGVuZGlhbmVzcyBjb252OiAlZCIsIAogICAgICAgICAgICAgICB1c0V0aGVyVHlwZSkpOwoKICAgIHVzRXRoZXJUeXBlID0gdm9zX2JlMTZfdG9fY3B1KHVzRXRoZXJUeXBlKTsKICAgICpwVXNFdGhlclR5cGUgPSB1c0V0aGVyVHlwZTsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZDogJWQiLCB1c0V0aGVyVHlwZSkpOwogIH0KICAKICByZXR1cm4gdm9zU3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0U29mdEFQU3RhdGlzdGljcwoKICBERVNDUklQVElPTiAgIENvbGxlY3QgdGhlIGN1bXVsYXRpdmUgc3RhdGlzdGljcyBmb3IgYWxsIFNvZnRhcCBzdGF0aW9ucwoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcHZvc0dDdHggIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0CiAgICAgICAgICAgICAgICAgICBiUmVzZXQgICAgLSBJZiBzZXQgVEwgc3RhdGlzdGljcyB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgcmVhZGluZwogICAgICAgICAgICAgICAgb3V0IHN0YXRzU3VtIC0gcG9pbnRlciB0byBjb2xsZWN0ZWQgc3RhdGlzdGljcwoKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVNfU1VDQ0VTUyA6IGlmIHRoZSBTdGF0aXN0aWNzIGFyZSBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkCgogIFNJREUgRUZGRUNUUyAgTk9ORQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0dldFNvZnRBUFN0YXRpc3RpY3Modl9QVk9JRF90IHBBZGFwdGVyLCBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRzU3VtLCB2X0JPT0xfdCBiUmVzZXQpCnsKICAgIHZfVThfdCBpID0gMDsKICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIFdMQU5UTF9DYlR5cGUgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFIHN0YXRCdWZmZXJUZW1wOwogICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKSZzdGF0QnVmZmVyVGVtcCwgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwogICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXN0YXRzU3VtLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgoKICAgIGlmICggTlVMTCA9PSBwVExDYiApCiAgICB7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfSAKCiAgICAvLyBTdW0gdXAgYWxsIHRoZSBzdGF0aXN0aWNzIGZvciBzdGF0aW9ucyBvZiBTb2Z0IEFQIGZyb20gVEwKICAgIGZvciAoaSA9IDA7IGkgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKykKICAgIHsKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0pCiAgICAgICAgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT53U1RBRGVzYy53U1RBVHlwZSA9PSBXTEFOX1NUQV9TT0ZUQVApCiAgICAgICAgewogICAgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRTdGF0aXN0aWNzKHBBZGFwdGVyLCAmc3RhdEJ1ZmZlclRlbXAsIGkpOy8vIENhbiBpbmNsdWRlIHN0YUlkIDEgYmVjYXVzZSBzdGF0aXN0aWNzIG5vdCBjb2xsZWN0ZWQgZm9yIGl0CgogICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwoKICAgICAgICAgICAgLy8gQWRkIHRvIHRoZSBjb3VudGVycwogICAgICAgICAgIHN0YXRzU3VtLT50eFVDRmNudCArPSBzdGF0QnVmZmVyVGVtcC50eFVDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhNQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhNQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT50eFVDQmNudCArPSBzdGF0QnVmZmVyVGVtcC50eFVDQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhNQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhNQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNCY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeFVDRmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeFVDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhNQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhNQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeFVDQmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeFVDQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhNQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhNQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNCY250OwoKICAgICAgICAgICBpZiAoYlJlc2V0KQogICAgICAgICAgIHsKICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVzZXRTdGF0aXN0aWNzKHBBZGFwdGVyLCBpKTsKICAgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsgICAgICAgICAgICAgICAKICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHZvc1N0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfSXNSZXBsYXlQYWNrZXQKICAgICAKICBERVNDUklQVElPTiAgIFRoaXMgZnVuY3Rpb24gZG9lcyByZXBsYXkgY2hlY2sgZm9yIHZhbGlkIHN0YXRpb25zCiAKICBERVBFTkRFTkNJRVMgIFZhbGlkaXR5IG9mIHJlcGxheSBjaGVjayBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBmdW5jdGlvbiAKICAgICAgICAgICAgICAgIGlzIGNhbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgIAogIFBBUkFNRVRFUlMgICAgY3VycmVudFJlcGxheUNvdW50ZXIgICAgY3VycmVudCByZXBsYXkgY291bnRlciB0YWtlbiBmcm9tIFJYIEJEIAogICAgICAgICAgICAgICAgcHJldmlvdXNSZXBsYXlDb3VudGVyICAgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgdGFrZW4gZnJvbSBUTCBDQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBSRVRSVU4gICAgICAgIFZPU19UUlVFICAgIHBhY2tldCBpcyBhIHJlcGxheSBwYWNrZXQKICAgICAgICAgICAgICAgIFZPU19GQUxTRSAgIHBhY2tldCBpcyBub3QgYSByZXBsYXkgcGFja2V0CgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfSXNSZXBsYXlQYWNrZXQKKAogIHZfVTY0X3QgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIsCiAgdl9VNjRfdCAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIKKQp7CiAgIC8qIERvIHRoZSByZXBsYXkgY2hlY2sgYnkgY29tcGFyaW5nIHByZXZpb3VzIHJlY2VpdmVkIHJlcGxheSBjb3VudGVyIHdpdGgKICAgICAgY3VycmVudCByZWNlaXZlZCByZXBsYXkgY291bnRlciovCiAgICBpZih1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIgPCB1bGxjdXJyZW50UmVwbGF5Q291bnRlcikKICAgIHsKICAgICAgICAvKiBWYWxpZCBwYWNrZXQgbm90IHJlcGxheSAqLwogICAgICAgIHJldHVybiBWT1NfRkFMU0U7CiAgICB9CiAgICBlbHNlCiAgICB7CgogICAgICAgIC8qIEN1cnJlbnQgcGFja2V0IG51bWJlciBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcHJldml1b3MgcmVjZWl2ZWQgCiAgICAgICAgICAgcGFja2V0IG5vLCB0aGlzIG1lYW5zIGN1cnJlbnQgcGFja2V0IGlzIHJlcGxheSBwYWNrZXQgKi8KICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDogUmVwbGF5IHBhY2tldCBmb3VuZCB3aXRoIHJlcGxheSBjb3VudGVyIDpbMHglbGxYXSIsdWxsY3VycmVudFJlcGxheUNvdW50ZXIpOwogICAgICAgICAgIAogICAgICAgIHJldHVybiBWT1NfVFJVRTsKICAgIH0KfQoKI2lmIDAKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0UmVwbGF5Q291bnRlckZyb21SeEJECiAgICAgCiAgREVTQ1JJUFRJT04gICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIDQ4LWJpdCByZXBsYXkgcGFja2V0IG51bWJlciBmcm9tIFJYIEJEIAogCiAgREVQRU5ERU5DSUVTICBWYWxpZGl0eSBvZiByZXBsYXkgY2hlY2sgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZnVuY3Rpb24gCiAgICAgICAgICAgICAgICBpcyBjYWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAKICBQQVJBTUVURVJTICAgIHB1Y1J4SGVhZGVyIHBvaW50ZXIgdG8gUlggQkQgaGVhZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFJFVFJVTiAgICAgICAgdl9VNjRfdCAgICBQYWNrZXQgbnVtYmVyIGV4dGFyY3RlZCBmcm9tIFJYIEJECgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X1U2NF90CldMQU5UTF9HZXRSZXBsYXlDb3VudGVyRnJvbVJ4QkQKKAogICB2X1U4X3QgKnB1Y1J4QkRIZWFkZXIKKQp7Ci8qIDQ4LWJpdCByZXBsYXkgY291bnRlciBpcyBjcmVhdGVkIGFzIGZvbGxvd3MKICAgZnJvbSBSWCBCRCA2IGJ5dGUgUE1JIGNvbW1hbmQ6CiAgIEFkZHIgOiBBRVMvVEtJUAogICAweDM4IDogcG4zL3RzYzMKICAgMHgzOSA6IHBuMi90c2MyCiAgIDB4M2EgOiBwbjEvdHNjMQogICAweDNiIDogcG4wL3RzYzAKCiAgIDB4M2MgOiBwbjUvdHNjNQogICAweDNkIDogcG40L3RzYzQgKi8KCiNpZmRlZiBBTklfQklHX0JZVEVfRU5ESUFOCiAgICB2X1U2NF90IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gMDsKICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yMFRPMjMocHVjUnhCREhlYWRlcik7IAogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPDw9IDE2OwogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgfD0gKCggV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzI0VE8yNShwdWNSeEJESGVhZGVyKSAmIDB4RkZGRjAwMDApID4+IDE2KTsKICAgIHJldHVybiB1bGxjdXJyZW50UmVwbGF5Q291bnRlcjsKI2Vsc2UKICAgIHZfVTY0X3QgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAwOwogICAgLyogR2V0dGluZyA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgZnJvbSB0aGUgUlggQkQgKi8KICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gKFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yNFRPMjUocHVjUnhCREhlYWRlcikgJiAweDAwMDBGRkZGKTsgCiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA8PD0gMzI7IAogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgfD0gV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzIwVE8yMyhwdWNSeEJESGVhZGVyKTsgCiAgICByZXR1cm4gdWxsY3VycmVudFJlcGxheUNvdW50ZXI7CiNlbmRpZgp9CiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfUG9zdFJlc05lZWRlZAogICAgIAogIERFU0NSSVBUSU9OICAgVGhpcyBmdW5jdGlvbiBwb3N0cyBtZXNzYWdlIHRvIFRMIHRvIHJlc2VydmUgQkQvUERVIG1lbW9yeQogCiAgREVQRU5ERU5DSUVTICBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUEFSQU1FVEVSUyAgICBwdm9zR0N0eAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBSRVRVUk4gICAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2b2lkIFdMQU5UTF9Qb3N0UmVzTmVlZGVkKHZfUFZPSURfdCBwdm9zR0N0eCkKewogIHZvc19tc2dfdCAgICAgICAgICAgIHZvc01zZzsKCiAgdm9zTXNnLnJlc2VydmVkID0gMDsKICB2b3NNc2cuYm9keXB0ciAgPSBOVUxMOwogIHZvc01zZy50eXBlICAgICA9IFdMQU5UTF9UWF9SRVNfTkVFREVEOwogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDogQkQvUERVIGF2YWlsYWJsZSBpbnRlcnJ1cHQgcmVjZWl2ZWQsIFBvc3RpbmcgbWVzc2FnZSB0byBUTCIpOwogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX3R4X21xX3NlcmlhbGl6ZSggVk9TX01RX0lEX1RMLCAmdm9zTXNnKSkpCiAgewogICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICIgJXMgZmFpbHMgdG8gcG9zdCBtZXNzYWdlIiwgX19mdW5jX18pOwogIH0KfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICAgV0xBTlRMX1VwZGF0ZVJzc2lCbXBzCgogIERFU0NSSVBUSU9OICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgVEwncyBSU1NJIChpbiBCTVBTIG1vZGUpCgogIERFUEVOREVOQ0lFUyAgIE5vbmUKCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4ICAgICAgICAgVk9TIGNvbnRleHQgICAgICAgICAgVk9TIEdsb2JhbCBjb250ZXh0CiAgICBzdGFJZCAgICAgICAgICAgIFN0YXRpb24gSUQgICAgICAgICAgIFN0YXRpb24gSUQKICAgIHJzc2kgICAgICAgICAgICAgUlNTSSAoQk1QUyBtb2RlKSAgICAgUlNTSSBpbiBCTVBTIG1vZGUKCiAgUkVUVVJOICAgICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZvaWQgV0xBTlRMX1VwZGF0ZVJzc2lCbXBzKHZfUFZPSURfdCBwdm9zR0N0eCwgdl9VOF90IHN0YUlkLCB2X1M3X3QgcnNzaSkKewogIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CgogIGlmIChOVUxMICE9IHBUTENiICYmIE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdKQogIHsKICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXS0+cnNzaUF2Z0JtcHMgPSByc3NpOwogIH0KfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICAgV0xBTlRMX1VwZGF0ZVNuckJtcHMKCiAgREVTQ1JJUFRJT04gICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBUTCdzIFNOUiAoaW4gQk1QUyBtb2RlKQoKICBERVBFTkRFTkNJRVMgICBOb25lCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0ICAgICAgICAgIFZPUyBHbG9iYWwgY29udGV4dAogICAgc3RhSWQgICAgICAgICAgICBTdGF0aW9uIElEICAgICAgICAgICBTdGF0aW9uIElECiAgICBzbnIgICAgICAgICAgICAgU05SIChCTVBTIG1vZGUpICAgICBTTlIgaW4gQk1QUyBtb2RlCgogIFJFVFVSTiAgICAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2b2lkIFdMQU5UTF9VcGRhdGVTbnJCbXBzKHZfUFZPSURfdCBwdm9zR0N0eCwgdl9VOF90IHN0YUlkLCB2X1M3X3Qgc25yKQp7CiAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKCiAgaWYgKE5VTEwgIT0gcFRMQ2IgJiYgTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0pCiAgewogICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdLT5zbnJBdmdCbXBzID0gc25yOwogIH0KfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICAgV0xBTlRMX1VwZGF0ZUxpbmtDYXBhY2l0eQoKICBERVNDUklQVElPTiAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIFNUQSdzIExpbmsgQ2FwYWNpdHkgaW4gVEwKCiAgREVQRU5ERU5DSUVTICAgTm9uZQoKICBQQVJBTUVURVJTCgogICAgcHZvc0dDdHggICAgICAgICBWT1MgY29udGV4dCAgICAgICAgICBWT1MgR2xvYmFsIGNvbnRleHQKICAgIHN0YUlkICAgICAgICAgICAgU3RhdGlvbiBJRCAgICAgICAgICAgU3RhdGlvbiBJRAogICAgbGlua0NhcGFjaXR5ICAgICBsaW5rQ2FwYWNpdHkgICAgICAgICBMaW5rIENhcGFjaXR5CgogIFJFVFVSTiAgICAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2b2lkIFdMQU5UTF9VcGRhdGVMaW5rQ2FwYWNpdHkodl9QVk9JRF90IHB2b3NHQ3R4LCB2X1U4X3Qgc3RhSWQsIHZfVTMyX3QgbGlua0NhcGFjaXR5KQp7CiAgICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoKICAgIGlmIChOVUxMICE9IHBUTENiICYmIE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdKQogICAgewogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXS0+bGlua0NhcGFjaXR5ID0gbGlua0NhcGFjaXR5OwogICAgfQp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFNUQUxpbmtDYXBhY2l0eQoKICBERVNDUklQVElPTgoKICAgIFJldHVybnMgTGluayBDYXBhY2l0eSBvZiBhIHBhcnRpY3VsYXIgU1RBLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgaXRzIHN0YXRlIGNhbiBiZSByZXRyaWV2ZWQuCgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24KCiAgICBPVVQKICAgIHBsaW5rQ2FwYWNpdHk6ICB0aGUgY3VycmVudCBsaW5rIGNhcGFjaXR5IHRoZSBjb25uZWN0aW9uIHRvCiAgICAgICAgICAgICAgICAgICAgdGhlIGdpdmVuIHN0YXRpb24KCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0U1RBTGlua0NhcGFjaXR5CigKICAgIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogICAgdl9VMzJfdCAgICAgICAgICAgICAgICpwbGlua0NhcGFjaXR5CikKewogICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFNhbml0eSBjaGVjawogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoIE5VTEwgPT0gcGxpbmtDYXBhY2l0eSApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciIpKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgIH0KCiAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCIpKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICAgaWYgKCBOVUxMID09IHBUTENiICkKICAgIHsKICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHgiKSkpOwogICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIikpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQiKSkpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIEdldCBTVEEgc3RhdGUKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgKnBsaW5rQ2FwYWNpdHkgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+bGlua0NhcGFjaXR5OwoKICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0U1RBTGlua0NhcGFjaXR5ICovCgovKgogKiBXTEFOVExfUmVzZXRSeFNTTiAtIHJlc2V0IGxhc3Qgcnggc3NuCiAqIEBwdm9zR0N0eDogZ2xvYmFsIHZvcyBjb250ZXh0CiAqIEB1Y1NUQUlkOiBzdGF0aW9uIGlkCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBsYXN0IHNzbiBvZiBhbGwgdGlkcyBvZiB0aGUgc3RhdGlvbgogKiBmb3Igd2hvbSBCQSByZW9yZGVyIHNlc3Npb24gZXhpc3RzLgogKgogKiBSZXR1cm46IG5vbmUKICovCnZvaWQgV0xBTlRMX1Jlc2V0UnhTU04odl9QVk9JRF90IHB2b3NHQ3R4LCB1aW50OF90IHVjU1RBSWQpCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICB1aW50OF90IGk7CgogIGlmIChXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNTVEFJZCkpIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgV0xBTlRMX1Jlc2V0UnhTU04iKSk7CiAgICByZXR1cm47CiAgfQoKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmIChOVUxMID09IHBUTENiKSB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IFdMQU5UTF9SZXNldFJ4U1NOIikpOwogICAgcmV0dXJuOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBmb3IgKGkgPSAwOyBpIDwgV0xBTl9NQVhfVElEIDsgaSsrKSB7CiAgICAgaWYgKDAgPT0gcENsaWVudFNUQS0+YXRsQkFSZW9yZGVySW5mb1tpXS51Y0V4aXN0cykgewogICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICJXTEFOIFRMOiBMYXN0IFJ4U1NOIHJlc2V0IHRvIHplcm8gZm9yIHRpZCAlZCIsIGkpKTsKICAgICBwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvW2ldLkxhc3RTTiA9IDA7CiAgfQp9Cgp2b2lkIFdMQU5UTF9TZXREYXRhUGt0RmlsdGVyKHZfUFZPSURfdCBwdm9zR0N0eCwgdWludDhfdCB1Y1NUQUlkLCBib29sIGZsYWcpCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICB1aW50OF90IGk7CgogICBpZiAoV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpKSB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuOwogICB9CgogICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICBpZiAoTlVMTCA9PSBwVExDYikgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiJXM6IEludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19mdW5jX18pKTsKICAgcmV0dXJuOwogICB9CgogICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogICBmb3IgKGkgPSAwOyBpIDwgV0xBTl9NQVhfVElEIDsgaSsrKSB7CiAgICAgIGlmICgwID09IHBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm9baV0udWNFeGlzdHMpCiAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgIldMQU4gVEw6IExhc3QgUnhTU04gcmVzZXQgdG8gemVybyBmb3IgdGlkICVkIiwgaSkpOwogICAgICBwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvW2ldLnNldF9kYXRhX2ZpbHRlciA9IGZsYWc7CiAgIH0KfQoKLyoqCiAqIFdMQU5UTF9TaGlmdEFyckJ5T25lKCkgLSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHNoaWZ0IGFycmF5IGJ5IG9uZQogKiBAYXJyOiBwb2ludGVyIHRvIGFycmF5CiAqIEBsZW46IGxlbmd0aCBvZiB0aGUgYXJyYXkKICoKICogQ2FsbGVyIHJlc3BvbnNpYmlsaXR5IHRvIHByb3ZpZGUgdGhlIGNvcnJlY3QgbGVuZ3RoIG9mIHRoZSBhcnJheQogKiBvdGhlciBtYXkgbGVhZHMgdG8gYnVncy4KICoKICogUmV0dXJuOiB2b2lkCiAqLwpzdGF0aWMgdm9pZCBXTEFOVExfU2hpZnRBcnJCeU9uZSh1aW50MzJfdCAqYXJyLCB1aW50OF90IGxlbikKewogICBpbnQgaTsKICAgZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkgKyspCiAgICAgIGFycltpXSA9IGFycltpICsgMV07CiAgIGFycltpXSA9IDA7Cn0KCi8qKgogKiBXTEFOVExfU2FtcGxlVHgoKSAtIGNvbGxlY3QgdHggc2FtcGxlcwogKiBAZGF0YTogVEwgY29udGV4dCBwb2ludGVyCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmVjb3JkcyB0aGUgbGFzdCBmaXZlIHR4IGJ5dGVzIHNlbnQgc2FtcGxlcwogKiBjb2xsZWN0ZWQgYWZ0ZXIgdHhfYnl0ZXNfdGltZXIgZXhwaXJlLgogKgogKiBSZXR1cm46IHZvaWQKICovCnZvaWQgV0xBTlRMX1NhbXBsZVR4KHZvaWQgKmRhdGEpCnsKICAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSAoV0xBTlRMX0NiVHlwZSAqKWRhdGE7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAgdWludDhfdCBjb3VudCA9IHBUTENiLT5zYW1wbGVfY291bnQ7CiAgIHVpbnQ4X3QgaTsKCiAgIGZvciAoIGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspIHsKICAgICAgIGlmIChOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldICYmCiAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjRXhpc3RzKSB7CiAgICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV07CgogICAgICAgICAgaWYgKGNvdW50ID4gKFdMQU5UTF9TQU1QTEVfQ09VTlQgLSAxKSkgewogICAgICAgICAgICAgIGNvdW50ID0gV0xBTlRMX1NBTVBMRV9DT1VOVCAtIDE7CiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHhfc2FtcGxlc19zdW0gLT0gcENsaWVudFNUQS0+dHhfc2FtcGxlWzBdOwogICAgICAgICAgICAgIFdMQU5UTF9TaGlmdEFyckJ5T25lKHBDbGllbnRTVEEtPnR4X3NhbXBsZSwgV0xBTlRMX1NBTVBMRV9DT1VOVCk7CiAgICAgICAgICB9CgogICAgICAgICAgcENsaWVudFNUQS0+dHhfc2FtcGxlW2NvdW50XSA9IHBDbGllbnRTVEEtPnR4X2ZyYW1lczsKICAgICAgICAgIHBDbGllbnRTVEEtPnR4X3NhbXBsZXNfc3VtICs9IHBDbGllbnRTVEEtPnR4X3NhbXBsZVtjb3VudF07CiAgICAgICAgICBwQ2xpZW50U1RBLT50eF9mcmFtZXMgPSAwOwogICAgICAgICAgY291bnQrKzsKICAgICAgICAgIHBUTENiLT5zYW1wbGVfY291bnQgPSBjb3VudDsKICAgICAgIH0KICAgfQoKICAgdm9zX3RpbWVyX3N0YXJ0KCZwVExDYi0+dHhfZnJhbWVzX3RpbWVyLCBXTEFOVExfU0FNUExFX0lOVEVSVkFMKTsKfQoKLyoqCiAqIFdMQU5UTF9FbmFibGVQcmVBc3NvY0NhY2hpbmcoKSAtIEVuYWJsZSBjYWNoaW5nIEVBUE9MIGZyYW1lcwogKgogKiBSZXR1cm46IE5vbmUKICoKICovCnZvaWQgV0xBTlRMX0VuYWJsZVByZUFzc29jQ2FjaGluZyh2b2lkKQp7CiAgIHZfUFZPSURfdCBwdm9zR0N0eD0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLE5VTEwpOwogICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICBpZiAoTlVMTCA9PSBwVExDYiApIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICIlczogSW52YWxpZCBUTCBwb2ludGVyIGZvciBnbG9iYWwgY29udGV4dCIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybjsKICAgfQoKICAgcFRMQ2ItPnZvc0VhcG9sQ2FjaGVkRnJhbWUgPSBOVUxMOwogICBwVExDYi0+cHJlYXNzb2NfY2FjaGluZyA9IHRydWU7Cn0KCi8qKgogKiBXTEFOVExfRm9yd2FyZFByZUFzc29jKCkgLSBmb3J3YXJkIGNhY2hlZCBlYXBvbCBmcmFtZXMKICogQGZsYWc6IFZhbHVlIHRvIGZvcndhcmQgb3IgZmx1c2gKICoKICogUmV0dXJuOiB2b3Mgc3RhdHVzCiAqCiAqLwpzdGF0aWMgVk9TX1NUQVRVUyBXTEFOVExfRm9yd2FyZFByZUFzc29jKGJvb2wgZmxhZykKewogIHZvc19tc2dfdCBzTWVzc2FnZTsKCiAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIiAtLS0tIFNlcmlhbGl6aW5nIFRMIGZvciBmb3J3YXJkaW5nIHByZSBhc3NvYyBjYWNoZSBmcmFtZXMiKTsKCiAgdm9zX21lbV96ZXJvKCAmc01lc3NhZ2UsIHNpemVvZih2b3NfbXNnX3QpKTsKICBzTWVzc2FnZS50eXBlICAgID0gV0xBTlRMX1JYX0ZXRF9QUkVfQVNTT0NfQ0FDSEVEOwogIHNNZXNzYWdlLmJvZHl2YWwgPSBmbGFnOwoKICByZXR1cm4gdm9zX3J4X21xX3NlcmlhbGl6ZShWT1NfTVFfSURfVEwsICZzTWVzc2FnZSk7Cn0KCi8qKgogKiBXTEFOVExfUHJlQXNzb2NGb3J3YXJkKCkgLSBmb3J3YXJkIGNhY2hlZCBlYXBvbCBmcmFtZXMKICogQGZsYWc6IFZhbHVlIHRvIGZvcndhcmQgb3IgZmx1c2gKICoKICogUmV0dXJuOiBOb25lCiAqCiAqLwp2b2lkIFdMQU5UTF9QcmVBc3NvY0ZvcndhcmQoYm9vbCBmbGFnKQp7CiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhXTEFOVExfRm9yd2FyZFByZUFzc29jKGZsYWcpKSkKICB7CiAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIiAlcyBmYWlscyB0byBmb3J3YXJkIHBhY2tldHMiLCBfX2Z1bmNfXyk7CiAgfQp9CgovKioKICogV0xBTlRMX1JlZ2lzdGVyRndkRWFwb2woKSAtIHJlZ2lzdGVyIGNhbGwgYmFjayB0byBmb3J3YXJkIGNhY2hlZCBlYXBvbCBmcmFtZQogKiBAcHZvc0dDdHggOiBwb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dAogKiBAcGZuRndkRWFwb2w6IGNhbGwgYmFjayBmdW5jdGlvbiBwb2ludGVyCiAqCiAqIFJldHVybjogTm9uZQogKgogKi8Kdm9pZCBXTEFOVExfUmVnaXN0ZXJGd2RFYXBvbCh2X1BWT0lEX3QgcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0Z3ZEVhcG9sQ0JUeXBlIHBmbkZ3ZEVhcG9sKQp7CiAgIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gTlVMTDsKICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKCiAgIHBUTENiLT5wZm5FYXBvbEZ3ZCA9IHBmbkZ3ZEVhcG9sOwoKfQoKIC8qKgogKiBXTEFOVExfU2V0QVJQRldEYXRhcGF0aCgpIC0ga2VlcCBvciByZW1vdmUgRlcgaW4gZGF0YSBwYXRoIGZvciBBUlAKICoKICogQGZsYWc6IHZhbHVlIHRvIGtlZXAgb3IgcmVtb3ZlIEZXIGZyb20gZGF0YSBwYXRoCiAqCiAqIFJldHVybjogdm9pZAogKi8Kdm9pZCBXTEFOVExfU2V0QVJQRldEYXRhcGF0aCh2b2lkICogcHZvc0dDdHgsIGJvb2wgZmxhZykKewoKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKCiAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgIGlmIChOVUxMID09IHBUTENiKSB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICIlczogSW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm47CiAgIH0KCiAgIHBUTENiLT50cmFja19hcnAgPSBmbGFnOwoKfQoKdm9pZCBXTEFOVExfR2V0U0FQU3RhUlNTaSh2b2lkICpwdm9zR0N0eCwgdWludDhfdCB1Y1NUQUlkLCBzOCAqcnNzaSkKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICB1aW50OF90IGNvdW50OwoKICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgaWYgKE5VTEwgPT0gcFRMQ2IpIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybjsKICAgfQoKICAgY291bnQgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+cnNzaV9zYW1wbGVfY250OwogICBjb3VudCA8IFdMQU5UTF9SU1NJX1NBTVBMRV9DTlQgPyBjb3VudCsrIDogY291bnQ7CgogICAqcnNzaSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5yc3NpX3NhbXBsZV9zdW0gLyBjb3VudDsKfQoKdm9pZCBXTEFOVExfU2V0S2V5U2VxQ291bnRlcih2b2lkICpwdm9zR0N0eCwgdTY0IGNvdW50ZXIsIHVpbnQ4X3Qgc3RhaWQpCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdWludDhfdCBpOwoKICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgaWYgKE5VTEwgPT0gcFRMQ2IpIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybjsKICAgfQoKICAgaWYgKFdMQU5UTF9TVEFfSURfSU5WQUxJRChzdGFpZCkpIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFN0YSBpZCBwYXNzZWQiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm47CiAgIH0KCiAgIGlmIChOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkXSkgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiJXM6IFN0YXRpb24gY29udGV4dCBpcyBOVUxMIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuOwogICB9CgogICBmb3IoaSA9IDA7IGkgPCBXTEFOVExfTUFYX1RJRDsgaSsrKQogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZF0tPnVsbFJlcGxheUNvdW50ZXJbaV0gPSBjb3VudGVyOwp9CgojaWZkZWYgV0xBTl9GRUFUVVJFX1JNQwpWT1NfU1RBVFVTIFdMQU5UTF9SbWNJbml0CigKICAgIHZfUFZPSURfdCAgIHBBZGFwdGVyCikKewogICAgV0xBTlRMX0NiVHlwZSAgICpwVExDYiA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICAgVk9TX1NUQVRVUyAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICB0QU5JX1U4ICAgICAgICAgIGNvdW50OwoKICAgIC8qc2FuaXR5IGNoZWNrKi8KICAgIGlmIChOVUxMID09IHBUTENiKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiSW52YWxpZCBUTCBoYW5kbGUiKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgIH0KCiAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgV0xBTlRMX1JNQ19IQVNIX1RBQkxFX1NJWkU7IGNvdW50KysgKQogICAgewogICAgICAgIHBUTENiLT5ybWNTZXNzaW9uW2NvdW50XSA9IE5VTEw7CiAgICB9CgogICAgdm9zX2xvY2tfaW5pdCgmcFRMQ2ItPnJtY0xvY2spOwoKICAgIHBUTENiLT5tdWx0aWNhc3REdXBsaWNhdGVEZXRlY3Rpb25FbmFibGVkID0gMTsKICAgIHBUTENiLT5ybWNEYXRhUGF0aEVuYWJsZWQgPSAwOwoKICAgIHJldHVybiBzdGF0dXM7Cn0KCgpWT1NfU1RBVFVTIFdMQU5UTF9SbWNEZUluaXQKKAogICAgdl9QVk9JRF90ICAgcEFkYXB0ZXIKKQp7CiAgICBXTEFOVExfQ2JUeXBlICAgKnBUTENiID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgICBWT1NfU1RBVFVTICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIHRBTklfVTggICAgICAgICAgY291bnQ7CiAgICBXTEFOVExfUk1DX1NFU1NJT04gKnBOb2RlOwogICAgV0xBTlRMX1JNQ19TRVNTSU9OICpwUHJldjsKCiAgICAvKnNhbml0eSBjaGVjayovCiAgICBpZiAoTlVMTCA9PSBwVExDYikKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIkludmFsaWQgVEwgaGFuZGxlIikpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICB9CgogICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IFdMQU5UTF9STUNfSEFTSF9UQUJMRV9TSVpFOyBjb3VudCsrICkKICAgIHsKICAgICAgICBwTm9kZSA9IHBUTENiLT5ybWNTZXNzaW9uW2NvdW50XTsKICAgICAgICB3aGlsZSAocE5vZGUpCiAgICAgICAgewogICAgICAgICAgICBwUHJldiA9IHBOb2RlOwogICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5uZXh0OwogICAgICAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICogKXBQcmV2KTsKICAgICAgICB9CiAgICB9CgogICAgdm9zX2xvY2tfZGVzdHJveSgmcFRMQ2ItPnJtY0xvY2spOwoKICAgIHJldHVybiBzdGF0dXM7Cn0KCgp0QU5JX1U4IFdMQU5UTF9SbWNIYXNoUm1jU2Vzc2lvbiAoIHZfTUFDQUREUl90ICAgKnBNY2FzdEFkZHIgKQp7CiAgICB0QU5JX1UzMiBzdW07CiAgICB0QU5JX1U4ICBoYXNoOwoKICAgIHN1bSA9IChwTWNhc3RBZGRyLT5ieXRlc1swXSArIHBNY2FzdEFkZHItPmJ5dGVzWzFdICsgcE1jYXN0QWRkci0+Ynl0ZXNbMl0gKwogICAgICAgICAgIHBNY2FzdEFkZHItPmJ5dGVzWzNdICsgcE1jYXN0QWRkci0+Ynl0ZXNbNF0gKyBwTWNhc3RBZGRyLT5ieXRlc1s1XSk7CgogICAgaGFzaCA9ICh0QU5JX1U4KShzdW0gJiAoKFdMQU5UTF9STUNfSEFTSF9UQUJMRV9TSVpFIC0gMSkpKTsKCiAgICByZXR1cm4gaGFzaDsKfQoKCldMQU5UTF9STUNfU0VTU0lPTiogV0xBTlRMX1JtY0xvb2tVcFJtY1Nlc3Npb24KKAogICAgV0xBTlRMX1JNQ19TRVNTSU9OICpybWNTZXNzaW9uW10sCiAgICB2X01BQ0FERFJfdCAgICAgKnBNY2FzdEFkZHIKKQp7CiAgICBXTEFOVExfUk1DX1NFU1NJT04gKnBOb2RlOwogICAgdEFOSV9VOCAgICAgICAgICAgICAgIGluZGV4OwoKICAgIC8qc2FuaXR5IGNoZWNrKi8KICAgIGlmIChOVUxMID09IHBNY2FzdEFkZHIpCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiU2FuaXR5IGNoZWNrIGZhaWxlZCBwTWNhc3RBZGRyICVwSyIsIHBNY2FzdEFkZHIpKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpbmRleCA9IFdMQU5UTF9SbWNIYXNoUm1jU2Vzc2lvbihwTWNhc3RBZGRyKTsKICAgIHBOb2RlID0gcm1jU2Vzc2lvbltpbmRleF07CiAgICB3aGlsZSAoIHBOb2RlICkKICAgIHsKICAgICAgICBpZiAodm9zX2lzX21hY2FkZHJfZXF1YWwoICYocE5vZGUtPnJtY0FkZHIpLCBwTWNhc3RBZGRyKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBwTm9kZTsKICAgICAgICB9CiAgICAgICAgcE5vZGUgPSBwTm9kZS0+bmV4dDsKICAgIH0KCiAgICByZXR1cm4gTlVMTDsKfQoKV0xBTlRMX1JNQ19TRVNTSU9OICpXTEFOVExfUm1jQWRkUm1jU2Vzc2lvbgooCiAgV0xBTlRMX1JNQ19TRVNTSU9OICpybWNTZXNzaW9uW10sCiAgdl9NQUNBRERSX3QgICAqcE1jYXN0QWRkcgopCnsKICAgIFdMQU5UTF9STUNfU0VTU0lPTiAqcE5vZGU7CiAgICB0QU5JX1U4ICAgICAgICAgICAgICAgaW5kZXg7CgogICAgaW5kZXggPSBXTEFOVExfUm1jSGFzaFJtY1Nlc3Npb24ocE1jYXN0QWRkcik7CiAgICBwTm9kZSA9IFdMQU5UTF9SbWNMb29rVXBSbWNTZXNzaW9uKHJtY1Nlc3Npb24sIHBNY2FzdEFkZHIpOwogICAgaWYgKCBOVUxMICE9IHBOb2RlICkKICAgIHsKICAgICAgICAvKmFscmVhZHkgZXhpc3RzKi8KICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwTm9kZSA9IChXTEFOVExfUk1DX1NFU1NJT04gKil2b3NfbWVtX21hbGxvYyhzaXplb2YoKnBOb2RlKSk7CiAgICAgICAgaWYgKHBOb2RlKQogICAgICAgIHsKICAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmKHBOb2RlLT5ybWNBZGRyKSwgcE1jYXN0QWRkciwKICAgICAgICAgICAgICAgIHNpemVvZihwTm9kZS0+cm1jQWRkcikgKTsKICAgICAgICAgICAgcE5vZGUtPm5leHQgPSBybWNTZXNzaW9uW2luZGV4XTsKICAgICAgICAgICAgcm1jU2Vzc2lvbltpbmRleF0gPSBwTm9kZTsKICAgICAgICAgICAgcmV0dXJuIHBOb2RlOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICIlczogdm9zX21lbV9tYWxsb2MgZmFpbGVkIGNhbid0IGVuYWJsZSBSTUMgc2Vzc2lvbiIsCiAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KfQoKdEFOSV9VOApXTEFOVExfUm1jRGVsZXRlUm1jU2Vzc2lvbgooCiAgV0xBTlRMX1JNQ19TRVNTSU9OICpybWNTZXNzaW9uW10sCiAgdl9NQUNBRERSX3QgICAqcE1jYXN0QWRkcgopCnsKICAgIFdMQU5UTF9STUNfU0VTU0lPTiAqcEhlYWQ7CiAgICBXTEFOVExfUk1DX1NFU1NJT04gKnBOb2RlOwogICAgV0xBTlRMX1JNQ19TRVNTSU9OICpwUHJldjsKICAgIHRBTklfVTggICAgICAgICAgICAgICBpbmRleDsKCiAgICBpbmRleCA9IFdMQU5UTF9SbWNIYXNoUm1jU2Vzc2lvbihwTWNhc3RBZGRyKTsKICAgIHBIZWFkID0gcE5vZGUgPSBybWNTZXNzaW9uW2luZGV4XTsKICAgIHdoaWxlIChwTm9kZSkKICAgIHsKICAgICAgICBpZiAodm9zX2lzX21hY2FkZHJfZXF1YWwoICYocE5vZGUtPnJtY0FkZHIpLCBwTWNhc3RBZGRyKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwSGVhZCA9PSBwTm9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcm1jU2Vzc2lvbltpbmRleF0gPSBwTm9kZS0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBQcmV2LT5uZXh0ID0gcE5vZGUtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCAqIClwTm9kZSk7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBwUHJldiA9IHBOb2RlOwogICAgICAgIHBOb2RlID0gcE5vZGUtPm5leHQ7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KClZPU19TVEFUVVMKV0xBTlRMX1Byb2Nlc3NSbWNDb21tYW5kCigKICAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKICAgIHZfTUFDQUREUl90ICAgICpwTWNhc3RBZGRyLAogICAgdEFOSV9VMzIgICAgICAgIGNvbW1hbmQKKQp7CiAgICBWT1NfU1RBVFVTIHN0YXR1czsKICAgIHRBTklfVTMyIGNvdW50OwogICAgdEFOSV9VMzIgcm1jQWN0aXZlOwoKICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19sb2NrX2FjcXVpcmUoICYocFRMQ2ItPnJtY0xvY2spKSkpCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICIlcyBHZXQgTG9jayBGYWlsIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgLyphZGQgb3IgZGVsZXRlIG5vZGUgZnJvbSBhY3RpdmUgcm1jIGhhc2ggdGFibGUqLwogICAgaWYgKGNvbW1hbmQpCiAgICB7CiAgICAgICAgLyphZGQgcmVxdWVzdGVkIHJtYyBzZXNzaW9uIGluIGFjdGl2ZSBybWMgc2Vzc2lvbiBsaXN0Ki8KICAgICAgICBpZiAoV0xBTlRMX1JtY0FkZFJtY1Nlc3Npb24ocFRMQ2ItPnJtY1Nlc3Npb24sIHBNY2FzdEFkZHIpKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKCBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJSTUMgc2Vzc2lvbiAiIE1BQ19BRERSRVNTX1NUUiAiIGFkZGVkIGluIFRMIGhhc2ggdGFibGUiLAogICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkocE1jYXN0QWRkci0+Ynl0ZXMpICkgKTsKICAgICAgICAgICAgcFRMQ2ItPnJtY0RhdGFQYXRoRW5hYmxlZCA9IFRSVUU7CiAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKCBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJSTUMgc2Vzc2lvbiAiIE1BQ19BRERSRVNTX1NUUiAiIGFscmVhZHkgZXhpc3RzIGluIFRMIGhhc2giCiAgICAgICAgICAgICAgICAiIHRhYmxlIiwgTUFDX0FERFJfQVJSQVkocE1jYXN0QWRkci0+Ynl0ZXMpICkgKTsKICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qZGVsZXRlIHJlcXVlc3RlZCBybWMgc2Vzc2lvbiBmcm9tIGFjdGl2ZSBybWMgc2Vzc2lvbiBsaXN0Ki8KICAgICAgICBpZiAoV0xBTlRMX1JtY0RlbGV0ZVJtY1Nlc3Npb24ocFRMQ2ItPnJtY1Nlc3Npb24sIHBNY2FzdEFkZHIpKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKCBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgIlJNQyBzZXNzaW9uICIgTUFDX0FERFJFU1NfU1RSICIgZGVsZXRlZCBmcm9tIFRMIGhhc2ggdGFibGUiLAogICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkocE1jYXN0QWRkci0+Ynl0ZXMpKSApOwogICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgICAgIHJtY0FjdGl2ZSA9IEZBTFNFOwogICAgICAgICAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgV0xBTlRMX1JNQ19IQVNIX1RBQkxFX1NJWkU7IGNvdW50KysgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAocFRMQ2ItPnJtY1Nlc3Npb25bY291bnRdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJtY0FjdGl2ZSA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFRSVUUgPT0gcm1jQWN0aXZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwVExDYi0+cm1jRGF0YVBhdGhFbmFibGVkID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBUTENiLT5ybWNEYXRhUGF0aEVuYWJsZWQgPSBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIlJNQyBzZXNzaW9uICIgTUFDX0FERFJFU1NfU1RSICIgZG9lc24ndCBleGlzdCBpbiBUTCBoYXNoIgogICAgICAgICAgICAgICAgIiB0YWJsZSIsIE1BQ19BRERSX0FSUkFZKHBNY2FzdEFkZHItPmJ5dGVzKSApICk7CiAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfbG9ja19yZWxlYXNlKCYocFRMQ2ItPnJtY0xvY2spKSkpCiAgICB7CiAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIiVzIFJlbGVhc2UgTG9jayBGYWlsIiwgX19mdW5jX18pKTsKICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIHJldHVybiBzdGF0dXM7Cn0vKiBFbmQgb2YgV0xBTlRMX1Byb2Nlc3NSbWNDb21tYW5kICovCgpWT1NfU1RBVFVTCldMQU5UTF9FbmFibGVSTUMKKAogICAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICAgIHZfTUFDQUREUl90ICAgKnBNY2FzdFRyYW5zbWl0dGVyQWRkcgopCnsKICAgIFdMQU5UTF9DYlR5cGUqICBwVExDYjsKICAgIFZPU19TVEFUVVMgc3RhdHVzOwoKICAgIC8qc2FuaXR5IGNoZWNrKi8KICAgIGlmICggKE5VTEwgPT0gcHZvc0dDdHgpIHx8IChOVUxMID09IHBNY2FzdFRyYW5zbWl0dGVyQWRkcikgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEwgJXM6IFNhbml0eSBjaGVjayBmYWlsZWQgcHZvc0dDdHggJXBLIGFNY2FzdEFkZHIgJXBLIiwKICAgICAgICAgICAgX19mdW5jX18sIHB2b3NHQ3R4LCBwTWNhc3RUcmFuc21pdHRlckFkZHIpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgLypzYW5pdHkgY2hlY2sqLwogICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgIGlmICggTlVMTCA9PSBwVExDYiApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTCAlczogcFRMQ2IgaXMgTlVMTCIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIHN0YXR1cyA9IFdMQU5UTF9Qcm9jZXNzUm1jQ29tbWFuZChwVExDYiwgcE1jYXN0VHJhbnNtaXR0ZXJBZGRyICwgMSk7CgogICAgcmV0dXJuIHN0YXR1czsKfSAvKiBFbmQgb2YgV0xBTlRMX0VuYWJsZVJNQyAqLwoKClZPU19TVEFUVVMKV0xBTlRMX0Rpc2FibGVSTUMKKAogICAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICAgIHZfTUFDQUREUl90ICAgKnBNY2FzdFRyYW5zbWl0dGVyQWRkcgopCnsKICAgIFdMQU5UTF9DYlR5cGUqIHBUTENiOwogICAgVk9TX1NUQVRVUyBzdGF0dXM7CgogICAgLypTYW5pdHkgY2hlY2sqLwogICAgaWYgKChOVUxMID09IHB2b3NHQ3R4KSB8fCAoTlVMTCA9PSBwTWNhc3RUcmFuc21pdHRlckFkZHIpKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEwgJXM6IFNhbml0eSBjaGVjayBmYWlsZWQgcHZvc0dDdHggJXBLIGFNY2FzdEFkZHIgJXBLIiwKICAgICAgICAgICAgIF9fZnVuY19fLCBwdm9zR0N0eCwgcE1jYXN0VHJhbnNtaXR0ZXJBZGRyKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIC8qU2FuaXR5IGNoZWNrKi8KICAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgICBpZiAoTlVMTCA9PSBwVExDYikKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMICVzOiBwVExDYiBpcyBOVUxMIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgc3RhdHVzID0gV0xBTlRMX1Byb2Nlc3NSbWNDb21tYW5kKHBUTENiLCBwTWNhc3RUcmFuc21pdHRlckFkZHIsIDApOwoKICAgIHJldHVybiBzdGF0dXM7Cn0gLyogRW5kIG9mIFdMQU5UTF9EaXNhYmxlUk1DICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgIER1cGxpY2F0ZSBNdWx0aWNhc3QgRGV0ZWN0aW9uIEZ1bmN0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9Jc0R1cGxpY2F0ZU1jYXN0RnJtCgogIERFU0NSSVBUSU9OCiAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgZHVwbGljYXN0IG11bHRpY2FzdCBmcmFtZXMgYW5kIGRyb3BzIHRoZW0uCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgoKICAgcENsaWVudFNUQSAgOiBQb2ludGVyIHRvIFdMQU5UTF9TVEFDbGllbnRUeXBlCiAgIGF1Y0JESGVhZGVyIDogUG9pbnRlciB0byBCRCBoZWFkZXIKCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX0ZBTFNFOiAgVGhpcyBmcmFtZSBpcyBub3QgYSBkdXBsaWNhdGUKCiAgICBWT1NfVFJVRTogICBUaGlzIGZyYW1lIGlzIGEgZHVwbGljYXRlCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X1U4X3QKV0xBTlRMX0lzRHVwbGljYXRlTWNhc3RGcm0KKAogICAgV0xBTlRMX1NUQUNsaWVudFR5cGUgKnBDbGllbnRTVEEsCiAgICB2b3NfcGt0X3QgKnZvc0RhdGFCdWZmCikKewogICAgdl9VOF90IGR1cGxpY2F0ZSA9IFZPU19GQUxTRTsKICAgIFdMQU5UTF9STUNfU0VTU0lPTiAqcE5vZGU7CiAgICB2X1UxNl90ICAgICB1c1NlcUN0cmw7CiAgICB2X01BQ0FERFJfdCBtY2FzdEFkZHI7CiAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXM7CiAgICB2X1BWT0lEX3QgICBwdlBlZWtEYXRhOwoKICAgIC8qIEdldCBhZGRyZXNzIDEgb2YgRGF0YSBGcmFtZSAqLwogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEodm9zRGF0YUJ1ZmYsIFdMQU5UTF9NQUNfQUREUl9BTElHTigxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2UGVla0RhdGEsIFZPU19NQUNfQUREUl9TSVpFKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gZ2V0IEFkZHIgMSBvZiA4MDIxMSBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAogICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CiAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKICAgIH0KCiAgICAvKiBDb3B5IGFkZHJlc3MgMSBvZiBEYXRhIEZyYW1lICovCiAgICB2b3NfbWVtX2NvcHkoJm1jYXN0QWRkci5ieXRlcywgcHZQZWVrRGF0YSwgVk9TX01BQ19BRERSX1NJWkUpOwoKICAgIC8qCiAgICAgKiBXZSBwZXJmb3JtIGR1cGxpY2F0ZSBkZXRlY3Rpb24gZm9yIG9ubHkgbXVsdGljYXN0IGRhdGEgZnJhbWVzCiAgICAgKi8KICAgIGlmICh2b3NfaXNfbWFjYWRkcl9ncm91cCgmbWNhc3RBZGRyKSAmJgogICAgICAgICAhdm9zX2lzX21hY2FkZHJfYnJvYWRjYXN0KCZtY2FzdEFkZHIpKQogICAgewogICAgICAgIC8qIEdldCBzZXF1ZW5jZSBjb250cm9sIG9mIERhdGEgRnJhbWUgKi8KICAgICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSh2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAoV0xBTlRMX01BQ19BRERSX0FMSUdOKDEpICsgKDMgKiBWT1NfTUFDX0FERFJfU0laRSkpLAogICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgc2l6ZW9mKHZfVTE2X3QpKTsKCiAgICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIGdldCBTZXF1ZW5jZSBDb250cm9sIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgICAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKICAgICAgICB9CgogICAgICAgIC8qIENvcHkgc2VxdWVuY2UgY29udHJvbCBmcm9tIHRoZSBEYXRhIEZyYW1lICovCiAgICAgICAgdXNTZXFDdHJsID0gKih2X1UxNl90ICopcHZQZWVrRGF0YTsKCiAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX2xvY2tfYWNxdWlyZSgmKHBDbGllbnRTVEEtPm1jTG9jaykpKSkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICIlcyBHZXQgTG9jayBGYWlsIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKICAgICAgICB9CgogICAgICAgIHBOb2RlID0gV0xBTlRMX1JtY0xvb2tVcFJtY1Nlc3Npb24ocENsaWVudFNUQS0+bWNhc3RTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWNhc3RBZGRyKTsKICAgICAgICBpZiAoTlVMTCA9PSBwTm9kZSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIElmIHRoZSBzZXNzaW9uIGRvZXMgbm90IGV4aXN0LCBhZGQgaXQuICovCiAgICAgICAgICAgIHBOb2RlID0gV0xBTlRMX1JtY0FkZFJtY1Nlc3Npb24ocENsaWVudFNUQS0+bWNhc3RTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1jYXN0QWRkcik7CiAgICAgICAgICAgIC8qIElmIHdlIGNvdWxkIG5vdCBhZGQgYSBlbnRyeSwgc2tpcCBkdXBsaWNhdGUgZGV0ZWN0aW9uICovCiAgICAgICAgICAgIGlmIChOVUxMID09IHBOb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiJXMgRmFpbGVkIHRvIGFkZCBtdWx0aWNhc3Qgc2Vzc2lvbiIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUwogICAgICAgICAgICAgICAgICAgICAodm9zX2xvY2tfcmVsZWFzZSgmKHBDbGllbnRTVEEtPm1jTG9jaykpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIiVzIFJlbGVhc2UgTG9jayBGYWlsIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBWT1NfRkFMU0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgc2VxdWVuY2UgY29udHJvbCB2YWx1ZS4gKi8KICAgICAgICAgICAgcE5vZGUtPm1jU2VxQ3RsID0gdXNTZXFDdHJsOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBDaGVjayBpZiB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoaXMgZnJhbWUgbWF0Y2hlcyB0aGUgbGFzdAogICAgICAgICAgICAgKiB3ZSBoYXZlIHNlZW4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAocE5vZGUtPm1jU2VxQ3RsID09IHVzU2VxQ3RybCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcE5vZGUtPnJ4TUNEdXBjbnQrKzsKICAgICAgICAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgICAgICIlcyBSeCBNdWx0aWNhc3QgRHVwbGljYXRlICVkICIgTUFDX0FERFJFU1NfU1RSCiAgICAgICAgICAgICAgICAgICAgICIgKFNlcSAleCkiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgcE5vZGUtPnJ4TUNEdXBjbnQsIE1BQ19BRERSX0FSUkFZKG1jYXN0QWRkci5ieXRlcyksCiAgICAgICAgICAgICAgICAgICAgIHVzU2VxQ3RybCkpOwogICAgICAgICAgICAgICAgZHVwbGljYXRlID0gVk9TX1RSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGxhc3Qgc2VlbiBzZXF1ZW5jZSBudW1iZXIgKi8KICAgICAgICAgICAgICAgIHBOb2RlLT5tY1NlcUN0bCA9IHVzU2VxQ3RybDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MgKHZvc19sb2NrX3JlbGVhc2UoJihwQ2xpZW50U1RBLT5tY0xvY2spKSkpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiJXMgUmVsZWFzZSBMb2NrIEZhaWwiLCBfX2Z1bmNfXykpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZHVwbGljYXRlOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX01jYXN0RGVsZXRlQWxsRW50cmllcwoKICBERVNDUklQVElPTgogICAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCBtdWx0aWNhc3QgZW50cmllcyB1c2VkIGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgoKICAgcENsaWVudFNUQSAgOiBQb2ludGVyIHRvIFdMQU5UTF9TVEFDbGllbnRUeXBlCgogIFJFVFVSTiBWQUxVRQoKICAgIE5vbmUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQKV0xBTlRMX01jYXN0RGVsZXRlQWxsRW50cmllcyhXTEFOVExfU1RBQ2xpZW50VHlwZSAqIHBDbGllbnRTVEEpCnsKICAgIFdMQU5UTF9STUNfU0VTU0lPTiAqcE5vZGUsICoqaGVhZDsKICAgIGludCBpbmRleDsKCiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgICAgICAgICAiJXMgRGVsZXRpbmcgYWxsIG11bHRpY2FzdCBlbnRyaWVzIiwgX19mdW5jX18pKTsKCiAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfbG9ja19hY3F1aXJlKCYocENsaWVudFNUQS0+bWNMb2NrKSkpKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIiVzIEdldCBMb2NrIEZhaWwiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBXTEFOVExfUk1DX0hBU0hfVEFCTEVfU0laRTsgaW5kZXgrKykKICAgIHsKICAgICAgICBoZWFkID0gJnBDbGllbnRTVEEtPm1jYXN0U2Vzc2lvbltpbmRleF07CgogICAgICAgIHBOb2RlID0gKmhlYWQ7CgogICAgICAgIHdoaWxlIChwTm9kZSkKICAgICAgICB7CiAgICAgICAgICAgICpoZWFkID0gcE5vZGUtPm5leHQ7CiAgICAgICAgICAgIC8qIGZyZWUgdGhlIGdyb3VwIGVudHJ5ICovCiAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTm9kZSk7CiAgICAgICAgICAgIHBOb2RlID0gKmhlYWQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTICh2b3NfbG9ja19yZWxlYXNlKCYocENsaWVudFNUQS0+bWNMb2NrKSkpKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIiVzIFJlbGVhc2UgTG9jayBGYWlsIiwgX19mdW5jX18pKTsKICAgIH0KfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TZXRNY2FzdER1cGxpY2F0ZURldGVjdGlvbgoKICBERVNDUklQVElPTgogICAgVGhpcyBmdW5jdGlvbiBzZXRzIG11bHRpY2F0ZSBkdXBsaWNhdGUgZGV0ZWN0aW9uIG9wZXJhdGlvbi4KICAgIElmIGVuYWJsZSBpcyAxLCB0aGUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQsIGVsc2UgaXQgaXMgZGlzYWJsZWQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgoKICAgcHZvc0dDdHggICA6IFBvaW50ZXIgdG8gVk9TIGdsb2JhbCBjb250ZXh0CiAgIGVuYWJsZSA6IEJvb2xlYW4gdG8gZW5hYmxlIG9yIGRpc2FibGUKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTYW5pdHkgY2hlY2sgb24gaW5wdXQgZmFpbGVkCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgT3RoZXIgcmV0dXJuIHZhbHVlcyBhcmUgcG9zc2libGUgY29taW5nIGZyb20gdGhlIGNhbGxlZCBmdW5jdGlvbnMuCiAgIFBsZWFzZSBjaGVjayBBUEkgZm9yIGFkZGl0aW9uYWwgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TZXRNY2FzdER1cGxpY2F0ZURldGVjdGlvbgooCiAgICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogICAgdl9VOF90ICAgICAgICBlbmFibGUKKQp7CiAgICBXTEFOVExfQ2JUeXBlKiBwVExDYjsKCiAgICAvKlNhbml0eSBjaGVjayovCiAgICBpZiAoTlVMTCA9PSBwdm9zR0N0eCkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMICVzOiBTYW5pdHkgY2hlY2sgZmFpbGVkIHB2b3NHQ3R4ICVwSyIsCiAgICAgICAgICAgICBfX2Z1bmNfXywgcHZvc0dDdHgpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgLypTYW5pdHkgY2hlY2sqLwogICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgIGlmIChOVUxMID09IHBUTENiKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEwgJXM6IHBUTENiIGlzIE5VTEwiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KCiAgICBzd2l0Y2ggKGVuYWJsZSkKICAgIHsKICAgIGRlZmF1bHQ6CiAgICAgICAgLyoKICAgICAgICAgKiBBbnkgdmFsdWUgb3RoZXIgdGhhbiAwIG9yIDEgaXMgdXNlZCB0byBkdW1wIHRoZQogICAgICAgICAqIGR1cGxpY2F0ZSBjb3VudC4KICAgICAgICAgKi8KICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMICVzOiBNdWx0aWNhc3QgRHVwbGljYXRlIENvdW50ICVkIiwKICAgICAgICAgICAgIF9fZnVuY19fLCBwVExDYi0+bWNhc3REdXBDbnQpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgICBwVExDYi0+bXVsdGljYXN0RHVwbGljYXRlRGV0ZWN0aW9uRW5hYmxlZCA9IGVuYWJsZTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgojZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JNQyAqLwo=