Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZSAgIGRjdC5jcHAKICBcYnJpZWYgIERDVCBJbXBsZW1lbnRhdGlvbnMgICAKICBMaWJyYXJ5IGZ1bmN0aW9ucyB0byBjYWxjdWxhdGUgc3RhbmRhcmQgRENUcy4gVGhpcyB3aWxsIG1vc3QgbGlrZWx5IGJlIHJlcGxhY2VkIGJ5IGhhbmQtb3B0aW1pemVkCiAgZnVuY3Rpb25zIGZvciB0aGUgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3Nvci4KCiAgVGhyZWUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZGN0IHR5cGUgSUkgYW5kIHRoZSBkY3QgdHlwZSBJSUkgdHJhbnNmb3JtcyBhcmUgcHJvdmlkZWQuCgogIEJ5IGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIHdoaWNoIGFyZSBiYXNlZCBvbiBhIHNpbmdsZSwgc3RhbmRhcmQgY29tcGxleCBGRlQta2VybmVsIGFyZSB1c2VkIChkY3RJSV9mKCkgYW5kIGRjdElJSV9mKCkpLgogIFRoZXNlIGFyZSBzcGVjaWZpY2FsbHkgaGVscGZ1bCBpbiBjYXNlcyB3aGVyZSBvcHRpbWl6ZWQgRkZUIGxpYnJhcmllcyBhcmUgYWxyZWFkeSBhdmFpbGFibGUuIFRoZSBGRlQgdXNlZCBpbiB0aGVzZQogIGltcGxlbWVudGF0aW9uIGlzIEZGVCByYWQyIGZyb20gRkRLX3Rvb2xzLgoKICBPZiBjb3Vyc2UsIG9uZSBtaWdodCBhbHNvIHVzZSBEQ1QtbGlicmFyaWVzIHNob3VsZCB0aGV5IGJlIGF2YWlsYWJsZS4gVGhlIERDVCBhbmQgRFNUCiAgdHlwZSBJViBpbXBsZW1lbnRhdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGEgdmVyc2lvbiBiYXNlZCBvbiBhIGNvbXBsZXggRkZUIGtlcm5lbC4KKi8KCiNpbmNsdWRlICJkY3QuaCIKCgojaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgojaW5jbHVkZSAiZmZ0LmgiCgoKI2lmIGRlZmluZWQoX19hcm1fXykKI2luY2x1ZGUgImFybS9kY3RfYXJtLmNwcCIKI2VuZGlmCgoKI2lmICFkZWZpbmVkKEZVTkNUSU9OX2RjdF9JSUkpCnZvaWQgZGN0X0lJSShGSVhQX0RCTCAqcERhdCwgLyohPCBwb2ludGVyIHRvIGlucHV0L291dHB1dCAqLwogICAgICAgICAgICAgRklYUF9EQkwgKnRtcCwgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLwogICAgICAgICAgICAgaW50IEwsICAgICAgICAgIC8qITwgbGVuZ2h0IG9mIHRyYW5zZm9ybSAqLwogICAgICAgICAgICAgaW50ICpwRGF0X2UKICAgICAgICAgICAgICkKewogIEZES19BU1NFUlQoTCA9PSA2NCB8fCBMID09IDMyKTsKICBpbnQgIGk7CiAgRklYUF9EQkwgeHIsIGFjY3UxLCBhY2N1MjsKICBpbnQgaW5jOwogIGludCBNID0gTD4+MTsKICBpbnQgbGRfTTsKCiAgaWYgKEwgPT0gNjQpICBsZF9NID0gNTsKICBlbHNlICAgICAgICAgIGxkX00gPSA0OwoKICAvKiBUaGlzIGxvb3AgcGVyZm9ybXMgbXVsdGlwbGljYXRpb24gZm9yIGluZGV4IGkgKGkqaW5jKSAqLwogIGluYyA9ICg2NC8yKSA+PiBsZF9NOyAvKiA2NC9MICovCgogIEZJWFBfREJMICpwVG1wXzAgPSAmdG1wWzJdOwogIEZJWFBfREJMICpwVG1wXzEgPSAmdG1wWyhNLTEpKjJdOwoKICBmb3IoaT0xOyBpPE0+PjE7IGkrKyxwVG1wXzArPTIscFRtcF8xLT0yKSB7CgogICAgRklYUF9EQkwgYWNjdTMsYWNjdTQsYWNjdTUsYWNjdTY7CgogICAgY3BseE11bHREaXYyKCZhY2N1MiwgJmFjY3UxLCBwRGF0W0wgLSBpXSwgcERhdFtpXSwgc2luX3R3aWRkbGVfTDY0W2kqaW5jXSk7CiAgICBjcGx4TXVsdERpdjIoJmFjY3U0LCAmYWNjdTMsIHBEYXRbTStpXSwgcERhdFtNLWldLCBzaW5fdHdpZGRsZV9MNjRbKE0taSkqaW5jXSk7CiAgICBhY2N1MyA+Pj0gMTsgYWNjdTQgPj49IDE7CgogICAgLyogVGhpcyBtZXRob2QgaXMgYmV0dGVyIGZvciBBUk05MjYsIHRoYXQgdXNlcyBvcGVyYW5kMiBzaGlmdGVkIHJpZ2h0IGJ5IDEgYWx3YXlzICovCiAgICBjcGx4TXVsdERpdjIoJmFjY3U2LCAmYWNjdTUsIChhY2N1MyAtIChhY2N1MT4+MSkpLCAoKGFjY3UyPj4xKSArIGFjY3U0KSwgc2luX3R3aWRkbGVfTDY0Wyg0KmkpKmluY10pOwogICAgeHIgPSAoYWNjdTE+PjEpICsgYWNjdTM7CiAgICBwVG1wXzBbMF0gPSAoeHI+PjEpIC0gYWNjdTU7CiAgICBwVG1wXzFbMF0gPSAoeHI+PjEpICsgYWNjdTU7CgogICAgeHIgPSAoYWNjdTI+PjEpIC0gYWNjdTQ7CiAgICBwVG1wXzBbMV0gPSAgKHhyPj4xKSAtIGFjY3U2OwogICAgcFRtcF8xWzFdID0gLSgoeHI+PjEpICsgYWNjdTYpOwoKICB9CgogIHhyICAgICA9IGZNdWx0RGl2MihwRGF0W01dLCBzaW5fdHdpZGRsZV9MNjRbNjQvMl0udi5yZSApOy8qIGNvcygoUEkvKDIqTCkpKk0pOyAqLwogIHRtcFswXSA9ICgocERhdFswXT4+MSkgKyB4cik+PjE7CiAgdG1wWzFdID0gKChwRGF0WzBdPj4xKSAtIHhyKT4+MTsKCiAgY3BseE11bHREaXYyKCZhY2N1MiwgJmFjY3UxLCBwRGF0W0wgLSAoTS8yKV0sIHBEYXRbTS8yXSwgc2luX3R3aWRkbGVfTDY0WzY0LzRdKTsKICB0bXBbTV0gICA9IGFjY3UxPj4xOwogIHRtcFtNKzFdID0gYWNjdTI+PjE7CgogIC8qIGRpdF9mZnQgZXhwZWN0cyAxIGJpdCBzY2FsZWQgaW5wdXQgdmFsdWVzICovCiAgZmZ0KE0sIHRtcCwgcERhdF9lKTsKCiAgLyogQVJNOTI2OiAxMiBjeWNsZXMgcGVyIDItaXRlcmF0aW9uLCBubyBvdmVyaGVhZCBjb2RlIGJ5IGNvbXBpbGVyICovCiAgcFRtcF8xID0gJnRtcFtMXTsKICBmb3IgKGkgPSBNPj4xOyBpLS07KQogIHsKICAgIEZJWFBfREJMIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CiAgICB0bXAxID0gKnRtcCsrOwogICAgdG1wMiA9ICp0bXArKzsKICAgIHRtcDMgPSAqLS1wVG1wXzE7CiAgICB0bXA0ID0gKi0tcFRtcF8xOwogICAgKnBEYXQrKyA9IHRtcDE7CiAgICAqcERhdCsrID0gdG1wMzsKICAgICpwRGF0KysgPSB0bXAyOwogICAgKnBEYXQrKyA9IHRtcDQ7CiAgfQoKICAqcERhdF9lICs9IDI7Cn0KI2VuZGlmCgojaWYgIWRlZmluZWQoRlVOQ1RJT05fZGN0X0lJKQp2b2lkIGRjdF9JSShGSVhQX0RCTCAqcERhdCwgLyohPCBwb2ludGVyIHRvIGlucHV0L291dHB1dCAqLwogICAgICAgICAgICBGSVhQX0RCTCAqdG1wLCAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCiAgICAgICAgICAgIGludCBMLCAgICAgICAgICAvKiE8IGxlbmdodCBvZiB0cmFuc2Zvcm0gKi8KICAgICAgICAgICAgaW50ICpwRGF0X2UKICAgICAgICAgICAgKQp7CiAgICBGREtfQVNTRVJUKEwgPT0gNjQgfHwgTCA9PSAzMik7CiAgICBGSVhQX0RCTCBhY2N1MSxhY2N1MjsKICAgIEZJWFBfREJMICpwVG1wXzAsICpwVG1wXzE7CgogICAgaW50IGk7CiAgICBpbnQgaW5jOwogICAgaW50IE0gPSAgTD4+MTsKICAgIGludCBsZF9NOwoKICAgIEZES19BU1NFUlQoTCA9PSA2NCB8fCBMID09IDMyKTsKICAgIGxkX00gPSA0ICsgKEwgPj4gNik7ICAvKiBMPTY0OiA1LCAgTD0zMjogNCAqLwoKICAgIGluYyA9ICg2NC8yKSA+PiBsZF9NOyAvKiBMPTY0OiAxLCAgTD0zMjogMiAqLwoKICAgIEZJWFBfREJMICpwZGF0ICA9ICZwRGF0WzBdOwogICAgRklYUF9EQkwgYWNjdTMsIGFjY3U0OwogICAgcFRtcF8wID0gJnRtcFswXTsKICAgIHBUbXBfMSA9ICZ0bXBbTC0xXTsKICAgIGZvciAoaSA9IE0+PjE7IGktLTsgKQogICAgewogICAgICBhY2N1MSA9ICpwZGF0Kys7CiAgICAgIGFjY3UyID0gKnBkYXQrKzsKICAgICAgYWNjdTMgPSAqcGRhdCsrOwogICAgICBhY2N1NCA9ICpwZGF0Kys7CiAgICAgIGFjY3UxID4+PSAxOwogICAgICBhY2N1MiA+Pj0gMTsKICAgICAgYWNjdTMgPj49IDE7CiAgICAgIGFjY3U0ID4+PSAxOwogICAgICAqcFRtcF8wKysgPSBhY2N1MTsKICAgICAgKnBUbXBfMCsrID0gYWNjdTM7CiAgICAgICpwVG1wXzEtLSA9IGFjY3UyOwogICAgICAqcFRtcF8xLS0gPSBhY2N1NDsKICAgIH0KCgogICAgZmZ0KE0sIHRtcCwgcERhdF9lKTsKCiAgICBwVG1wXzAgPSAmdG1wWzJdOwogICAgcFRtcF8xID0gJnRtcFsoTS0xKSoyXTsKCiAgICBmb3IgKGk9MTsgaTxNPj4xOyBpKysscFRtcF8wKz0yLHBUbXBfMS09MikgewoKICAgICAgRklYUF9EQkwgYTEsYTI7CiAgICAgIEZJWFBfREJMIGFjY3UzLCBhY2N1NDsKCiAgICAgIGExID0gKChwVG1wXzBbMV0+PjEpICsgKHBUbXBfMVsxXT4+MSkpOwogICAgICBhMiA9ICgocFRtcF8xWzBdPj4xKSAtIChwVG1wXzBbMF0+PjEpKTsKCiAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYTIsIGExLCBzaW5fdHdpZGRsZV9MNjRbKDQqaSkqaW5jXSk7CiAgICAgIGFjY3UxPDw9MTsgYWNjdTI8PD0xOwoKICAgICAgYTEgPSAoKHBUbXBfMFswXT4+MSkgKyAocFRtcF8xWzBdPj4xKSk7CiAgICAgIGEyID0gKChwVG1wXzBbMV0+PjEpIC0gKHBUbXBfMVsxXT4+MSkpOwoKICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCAoYTEgKyBhY2N1MiksIC0oYWNjdTEgKyBhMiksIHNpbl90d2lkZGxlX0w2NFtpKmluY10pOwogICAgICBwRGF0W0wgLSBpXSA9IGFjY3U0OwogICAgICBwRGF0W2ldICAgICA9IGFjY3UzOwoKICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCAoYTEgLSBhY2N1MiksIC0oYWNjdTEgLSBhMiksIHNpbl90d2lkZGxlX0w2NFsoTS1pKSppbmNdKTsKICAgICAgcERhdFtNICsgaV0gPSBhY2N1NDsKICAgICAgcERhdFtNIC0gaV0gPSBhY2N1MzsKCiAgICB9CgogICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCB0bXBbTV0sIHRtcFtNKzFdLCBzaW5fdHdpZGRsZV9MNjRbKE0vMikqaW5jXSk7CiAgICBwRGF0W0wgLSAoTS8yKV0gPSBhY2N1MjsKICAgIHBEYXRbTS8yXSAgICAgICA9IGFjY3UxOwoKICAgIHBEYXRbMF0gPSAodG1wWzBdPj4xKSsodG1wWzFdPj4xKTsKICAgIHBEYXRbTV0gPSAgZk11bHQoKCh0bXBbMF0+PjEpLSh0bXBbMV0+PjEpKSwgc2luX3R3aWRkbGVfTDY0WzY0LzJdLnYucmUpOy8qIGNvcygoUEkvKDIqTCkpKk0pOyAqLwoKICAgICpwRGF0X2UgKz0gMjsKfQojZW5kaWYKCnN0YXRpYwp2b2lkIGdldFRhYmxlcyhjb25zdCBGSVhQX1dUUCAqKnR3aWRkbGUsIGNvbnN0IEZJWFBfU1RQICoqc2luX3R3aWRkbGUsIGludCAqc2luX3N0ZXAsIGludCBsZW5ndGgpCnsKICBpbnQgbGQyX2xlbmd0aDsKCiAvKiBHZXQgbGQyIG9mIGxlbmd0aCAtIDIgKyAxCiAgICAgLTI6IGJlY2F1c2UgZmlyc3QgdGFibGUgZW50cnkgaXMgd2luZG93IG9mIHNpemUgNAogICAgICsxOiBiZWNhdXNlIHdlIGFscmVhZHkgaW5jbHVkZSArMSBiZWNhdXNlIG9mIGNlaWwobG9nMihsZW5ndGgpKSAqLwogIGxkMl9sZW5ndGggPSBERlJBQ1RfQklUUy0xLWZOb3JteigoRklYUF9EQkwpbGVuZ3RoKSAtIDE7CgogIC8qIEV4dHJhY3Qgc29ydCBvZiAiZWlnZW52YWx1ZSIgKHRoZSA0IGxlZnQgbW9zdCBiaXRzKSBvZiBsZW5ndGguICovCiAgc3dpdGNoICggKGxlbmd0aCkgPj4gKGxkMl9sZW5ndGgtMSkgKSB7CiAgICBjYXNlIDB4NDogLyogcmFkaXggMiAqLwogICAgICAqc2luX3R3aWRkbGUgPSBTaW5lVGFibGU1MTI7CiAgICAgICpzaW5fc3RlcCA9IDE8PCg5IC0gbGQyX2xlbmd0aCk7CiAgICAgICp0d2lkZGxlID0gd2luZG93U2xvcGVzWzBdWzBdW2xkMl9sZW5ndGgtMV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAweDc6IC8qIDEwIG1zICovCiAgICAgICpzaW5fdHdpZGRsZSA9IFNpbmVUYWJsZTQ4MDsKICAgICAgKnNpbl9zdGVwID0gMTw8KDggLSBsZDJfbGVuZ3RoKTsKICAgICAgKnR3aWRkbGUgPSB3aW5kb3dTbG9wZXNbMF1bMV1bbGQyX2xlbmd0aF07CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgKnNpbl90d2lkZGxlID0gTlVMTDsKICAgICAgKnNpbl9zdGVwID0gMDsKICAgICAgKnR3aWRkbGUgPSBOVUxMOwogICAgICBicmVhazsKICB9CgogIEZES19BU1NFUlQoKnR3aWRkbGUgIT0gTlVMTCk7CgogIEZES19BU1NFUlQoKnNpbl9zdGVwID4gMCk7Cgp9CgojaWYgIWRlZmluZWQoRlVOQ1RJT05fZGN0X0lWKQoKdm9pZCBkY3RfSVYoRklYUF9EQkwgKnBEYXQsCiAgICAgICAgICAgIGludCBMLAogICAgICAgICAgICBpbnQgKnBEYXRfZSkKewogIGludCBzaW5fc3RlcCA9IDA7CiAgaW50IE0gPSBMID4+IDE7CgogIGNvbnN0IEZJWFBfV1RQICp0d2lkZGxlOwogIGNvbnN0IEZJWFBfU1RQICpzaW5fdHdpZGRsZTsKCiAgRkRLX0FTU0VSVChMID49IDQpOwoKICBnZXRUYWJsZXMoJnR3aWRkbGUsICZzaW5fdHdpZGRsZSwgJnNpbl9zdGVwLCBMKTsKCiNpZmRlZiBGVU5DVElPTl9kY3RfSVZfZnVuYzEKICBpZiAoTT49NCAmJiAoTSYzKSA9PSAwKSB7CiAgICAgLyogQVJNOTI2OiA0NCBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIyIGN5Y2xlcy9pdGVyYXRpb24gKi8KICAgIGRjdF9JVl9mdW5jMShNPj4yLCB0d2lkZGxlLCAgJnBEYXRbMF0sICZwRGF0W0wtMV0pOwogIH0gZWxzZQojZW5kaWYgLyogRlVOQ1RJT05fZGN0X0lWX2Z1bmMxICovCiAgewogICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMCA9ICZwRGF0WzBdOwogICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMSA9ICZwRGF0W0wgLSAyXTsKICAgIHJlZ2lzdGVyIGludCBpOwoKICAgIC8qIDI5IGN5Y2xlcyBvbiBBUk05MjYgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBNLTE7IGkrPTIscERhdF8wKz0yLHBEYXRfMS09MikKICAgIHsKICAgICAgcmVnaXN0ZXIgRklYUF9EQkwgYWNjdTEsYWNjdTIsYWNjdTMsYWNjdTQ7CgogICAgICBhY2N1MSA9IHBEYXRfMVsxXTsgYWNjdTIgPSBwRGF0XzBbMF07CiAgICAgIGFjY3UzID0gcERhdF8wWzFdOyBhY2N1NCA9IHBEYXRfMVswXTsKCiAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYWNjdTEsIGFjY3UyLCB0d2lkZGxlW2ldKTsKICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBhY2N1NCwgYWNjdTMsIHR3aWRkbGVbaSsxXSk7CgogICAgICBwRGF0XzBbMF0gPSBhY2N1MjsgcERhdF8wWzFdID0gYWNjdTE7CiAgICAgIHBEYXRfMVswXSA9IGFjY3U0OyBwRGF0XzFbMV0gPSAtYWNjdTM7CiAgICB9CiAgICBpZiAoTSYxKQogICAgewogICAgICByZWdpc3RlciBGSVhQX0RCTCBhY2N1MSxhY2N1MjsKCiAgICAgIGFjY3UxID0gcERhdF8xWzFdOyBhY2N1MiA9IHBEYXRfMFswXTsKCiAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYWNjdTEsIGFjY3UyLCB0d2lkZGxlW2ldKTsKCiAgICAgIHBEYXRfMFswXSA9IGFjY3UyOyBwRGF0XzBbMV0gPSBhY2N1MTsKICAgIH0KICB9CgogIGZmdChNLCBwRGF0LCBwRGF0X2UpOwoKI2lmZGVmIEZVTkNUSU9OX2RjdF9JVl9mdW5jMgogIGlmIChNPj00ICYmIChNJjMpID09IDApIHsKICAgICAvKiBBUk05MjY6IDQyIGN5Y2xlcyBmb3IgMiBpdGVyYXRpb25zID0gMjEgY3ljbGVzL2l0ZXJhdGlvbiAqLwogICAgZGN0X0lWX2Z1bmMyKE0+PjIsIHNpbl90d2lkZGxlLCAmcERhdFswXSwgJnBEYXRbTF0sIHNpbl9zdGVwKTsKICB9IGVsc2UKI2VuZGlmIC8qIEZVTkNUSU9OX2RjdF9JVl9mdW5jMiAqLwogIHsKICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzAgPSAmcERhdFswXTsKICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzEgPSAmcERhdFtMIC0gMl07CiAgICByZWdpc3RlciBGSVhQX0RCTCBhY2N1MSxhY2N1MixhY2N1MyxhY2N1NDsKICAgIGludCBpZHgsIGk7CgogICAgLyogU2luIGFuZCBDb3MgdmFsdWVzIGFyZSAwLjBmIGFuZCAxLjBmICovCiAgICBhY2N1MSA9IHBEYXRfMVswXTsKICAgIGFjY3UyID0gcERhdF8xWzFdOwoKICAgIHBEYXRfMVsxXSA9IC0ocERhdF8wWzFdPj4xKTsKICAgIHBEYXRfMFswXSA9IChwRGF0XzBbMF0+PjEpOwoKCiAgICAvKiAyOCBjeWNsZXMgZm9yIEFSTTkyNiAqLwogICAgZm9yIChpZHggPSBzaW5fc3RlcCxpPTE7IGk8KE0rMSk+PjE7IGkrKywgaWR4Kz1zaW5fc3RlcCkKICAgIHsKICAgICAgRklYUF9TVFAgdHdkID0gc2luX3R3aWRkbGVbaWR4XTsKICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBhY2N1MSwgYWNjdTIsIHR3ZCk7CiAgICAgIHBEYXRfMFsxXSA9ICBhY2N1MzsKICAgICAgcERhdF8xWzBdID0gIGFjY3U0OwoKICAgICAgcERhdF8wKz0yOwogICAgICBwRGF0XzEtPTI7CgogICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBEYXRfMFsxXSwgcERhdF8wWzBdLCB0d2QpOwoKICAgICAgYWNjdTEgPSBwRGF0XzFbMF07CiAgICAgIGFjY3UyID0gcERhdF8xWzFdOwoKICAgICAgcERhdF8xWzFdID0gLWFjY3UzOwogICAgICBwRGF0XzBbMF0gPSAgYWNjdTQ7CiAgICB9CgogICAgaWYgKCAoTSYxKSA9PSAwICkKICAgIHsKICAgICAgLyogTGFzdCBTaW4gYW5kIENvcyB2YWx1ZSBwYWlyIGFyZSB0aGUgc2FtZSAqLwogICAgICBhY2N1MSA9IGZNdWx0RGl2MihhY2N1MSwgV1RDKDB4NWE4Mjc5OWEpKTsKICAgICAgYWNjdTIgPSBmTXVsdERpdjIoYWNjdTIsIFdUQygweDVhODI3OTlhKSk7CgogICAgICBwRGF0XzFbMF0gPSBhY2N1MSArIGFjY3UyOwogICAgICBwRGF0XzBbMV0gPSBhY2N1MSAtIGFjY3UyOwogICAgfQogIH0KCiAgLyogQWRkIHR3aWRkZWxpbmcgc2NhbGUuICovCiAgKnBEYXRfZSArPSAyOwp9CiNlbmRpZiAvKiBkZWZpbmVkIChGVU5DVElPTl9kY3RfSVYpICovCgojaWYgIWRlZmluZWQoRlVOQ1RJT05fZHN0X0lWKQp2b2lkIGRzdF9JVihGSVhQX0RCTCAqcERhdCwKICAgICAgICAgICAgaW50IEwsCiAgICAgICAgICAgIGludCAqcERhdF9lICkKewogIGludCBzaW5fc3RlcCA9IDA7CiAgaW50IE0gPSBMID4+IDE7CgogIGNvbnN0IEZJWFBfV1RQICp0d2lkZGxlOwogIGNvbnN0IEZJWFBfU1RQICpzaW5fdHdpZGRsZTsKCiNpZmRlZiBEU1RJVjJfRU5BQkxFCiAgaWYgKEwgPT0gMikgewogICAgY29uc3QgRklYUF9TVFAgdGFiID0gU1RDUCgweDc2NDFBRjNELCAweDMwRkI5NDUyKTsKICAgIEZJWFBfREJMIHRtcDEsIHRtcDI7CgogICAgY3BseE11bHREaXYyKCZ0bXAyLCAmdG1wMSwgcERhdFswXSwgcERhdFsxXSwgdGFiKTsKCiAgICBwRGF0WzBdID0gdG1wMTsKICAgIHBEYXRbMV0gPSB0bXAyOwoKICAgICpwRGF0X2UgKz0gMTsKCiAgICByZXR1cm47CiAgfQojZWxzZQogIEZES19BU1NFUlQoTCA+PSA0KTsKI2VuZGlmCgogIGdldFRhYmxlcygmdHdpZGRsZSwgJnNpbl90d2lkZGxlLCAmc2luX3N0ZXAsIEwpOwoKI2lmZGVmIEZVTkNUSU9OX2RzdF9JVl9mdW5jMQogIGlmICggKE0+PTQpICYmICgoTSYzKSA9PSAwKSApIHsKICAgIGRzdF9JVl9mdW5jMShNLCB0d2lkZGxlLCAmcERhdFswXSwgJnBEYXRbTF0pOwogIH0gZWxzZQojZW5kaWYKICB7CiAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8wID0gJnBEYXRbMF07CiAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8xID0gJnBEYXRbTCAtIDJdOwoKICAgIHJlZ2lzdGVyIGludCBpOwoKICAgIC8qIDM0IGN5Y2xlcyBvbiBBUk05MjYgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBNLTE7IGkrPTIscERhdF8wKz0yLHBEYXRfMS09MikKICAgIHsKICAgICAgcmVnaXN0ZXIgRklYUF9EQkwgYWNjdTEsYWNjdTIsYWNjdTMsYWNjdTQ7CgogICAgICBhY2N1MSA9ICBwRGF0XzFbMV07IGFjY3UyID0gLXBEYXRfMFswXTsKICAgICAgYWNjdTMgPSAgcERhdF8wWzFdOyBhY2N1NCA9IC1wRGF0XzFbMF07CgogICAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIGFjY3UxLCBhY2N1MiwgdHdpZGRsZVtpXSk7CiAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgYWNjdTQsIGFjY3UzLCB0d2lkZGxlW2krMV0pOwoKICAgICAgcERhdF8wWzBdID0gYWNjdTI7IHBEYXRfMFsxXSA9IGFjY3UxOwogICAgICBwRGF0XzFbMF0gPSBhY2N1NDsgcERhdF8xWzFdID0gLWFjY3UzOwogICAgfQogICAgaWYgKE0mMSkKICAgIHsKICAgICAgcmVnaXN0ZXIgRklYUF9EQkwgYWNjdTEsYWNjdTI7CgogICAgICBhY2N1MSA9ICBwRGF0XzFbMV07IGFjY3UyID0gLXBEYXRfMFswXTsKCiAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYWNjdTEsIGFjY3UyLCB0d2lkZGxlW2ldKTsKCiAgICAgIHBEYXRfMFswXSA9IGFjY3UyOyBwRGF0XzBbMV0gPSBhY2N1MTsKICAgIH0KICB9CgogIGZmdChNLCBwRGF0LCBwRGF0X2UpOwoKI2lmZGVmIEZVTkNUSU9OX2RzdF9JVl9mdW5jMgogIGlmICggKE0+PTQpICYmICgoTSYzKSA9PSAwKSApIHsKICAgIGRzdF9JVl9mdW5jMihNPj4yLCBzaW5fdHdpZGRsZSArIHNpbl9zdGVwLCAmcERhdFswXSwgJnBEYXRbTCAtIDFdLCBzaW5fc3RlcCk7CiAgfSBlbHNlCiNlbmRpZiAvKiBGVU5DVElPTl9kc3RfSVZfZnVuYzIgKi8KICB7CiAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8wOwogICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMTsKICAgIHJlZ2lzdGVyIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UzLGFjY3U0OwogICAgaW50IGlkeCwgaTsKCiAgICBwRGF0XzAgPSAmcERhdFswXTsKICAgIHBEYXRfMSA9ICZwRGF0W0wgLSAyXTsKCiAgICAvKiBTaW4gYW5kIENvcyB2YWx1ZXMgYXJlIDAuMGYgYW5kIDEuMGYgKi8KICAgIGFjY3UxID0gcERhdF8xWzBdOwogICAgYWNjdTIgPSBwRGF0XzFbMV07CgogICAgcERhdF8xWzFdID0gLShwRGF0XzBbMF0+PjEpOwogICAgcERhdF8wWzBdID0gKHBEYXRfMFsxXT4+MSk7CgogICAgZm9yIChpZHggPSBzaW5fc3RlcCxpPTE7IGk8KE0rMSk+PjE7IGkrKywgaWR4Kz1zaW5fc3RlcCkKICAgIHsKICAgICAgRklYUF9TVFAgdHdkID0gc2luX3R3aWRkbGVbaWR4XTsKCiAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgYWNjdTEsIGFjY3UyLCB0d2QpOwogICAgICBwRGF0XzFbMF0gPSAgLWFjY3UzOwogICAgICBwRGF0XzBbMV0gPSAgLWFjY3U0OwoKICAgICAgcERhdF8wKz0yOwogICAgICBwRGF0XzEtPTI7CgogICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBEYXRfMFsxXSwgcERhdF8wWzBdLCB0d2QpOwoKICAgICAgYWNjdTEgPSBwRGF0XzFbMF07CiAgICAgIGFjY3UyID0gcERhdF8xWzFdOwoKICAgICAgcERhdF8wWzBdID0gIGFjY3UzOwogICAgICBwRGF0XzFbMV0gPSAtYWNjdTQ7CiAgICB9CgogICAgaWYgKCAoTSYxKSA9PSAwICkKICAgIHsKICAgICAgLyogTGFzdCBTaW4gYW5kIENvcyB2YWx1ZSBwYWlyIGFyZSB0aGUgc2FtZSAqLwogICAgICBhY2N1MSA9IGZNdWx0RGl2MihhY2N1MSwgV1RDKDB4NWE4Mjc5OWEpKTsKICAgICAgYWNjdTIgPSBmTXVsdERpdjIoYWNjdTIsIFdUQygweDVhODI3OTlhKSk7CgogICAgICBwRGF0XzBbMV0gPSAtIGFjY3UxIC0gYWNjdTI7CiAgICAgIHBEYXRfMVswXSA9ICAgYWNjdTIgLSBhY2N1MTsKICAgIH0KICB9CgogIC8qIEFkZCB0d2lkZGVsaW5nIHNjYWxlLiAqLwogICpwRGF0X2UgKz0gMjsKfQojZW5kaWYgLyogIWRlZmluZWQoRlVOQ1RJT05fZHN0X0lWKSAqLwoKCg==