Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaWYgKFFNRl9OT19QT0xZPT01KQoKI2RlZmluZSBGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZAoKI2lmZGVmIEZVTkNUSU9OX3FtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkCnN0YXRpYyB2b2lkCnFtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqdGltZUluLCAgICAgICAgLyohPCBUaW1lIFNpZ25hbCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKnJTdWJiYW5kICkgICAgICAgICAgIC8qITwgUmVhbCBPdXRwdXQgKi8KewogIGludCBpOwogIGludCBMID0gYW5hUW1mLT5ub19jaGFubmVsczsKICBpbnQgTSA9IEw+PjE7CiAgaW50IHNoaWZ0ID0gKGFuYVFtZi0+bm9fY2hhbm5lbHM+PjYpICsgMTsKICBpbnQgclN1YmJhbmRfZSA9IDA7CgogIEZJWFBfUU1GICpyU3ViYmFuZFB0cjAgPSAmclN1YmJhbmRbTSswXTsgICAgICAgICAgICAgICAgLyogcnVucyB3aXRoIGluY3JlbWVudCAqLwogIEZJWFBfUU1GICpyU3ViYmFuZFB0cjEgPSAmclN1YmJhbmRbTS0xXTsgICAgICAgICAgICAgICAgLyogcnVucyB3aXRoIGRlY3JlbWVudCAqLwogIEZJWFBfUU1GICp0aW1lSW4wID0gKEZJWFBfREJMICopICZ0aW1lSW5bMF07ICAgICAgICAgICAgLyogcnVucyB3aXRoIGluY3JlbWVudCAqLwogIEZJWFBfUU1GICp0aW1lSW4xID0gKEZJWFBfREJMICopICZ0aW1lSW5bTF07ICAgICAgICAgICAgLyogcnVucyB3aXRoIGluY3JlbWVudCAqLwogIEZJWFBfUU1GICp0aW1lSW4yID0gKEZJWFBfREJMICopICZ0aW1lSW5bTC0xXTsgICAgICAgICAgLyogcnVucyB3aXRoIGRlY3JlbWVudCAqLwogIEZJWFBfUU1GICp0aW1lSW4zID0gKEZJWFBfREJMICopICZ0aW1lSW5bMipMLTFdOyAgICAgICAgLyogcnVucyB3aXRoIGRlY3JlbWVudCAqLwoKICBmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQogIHsKICAgICpyU3ViYmFuZFB0cjArKyA9ICgqdGltZUluMi0tID4+IDEpIC0gKCp0aW1lSW4wKysgPj4gc2hpZnQpOwogICAgKnJTdWJiYW5kUHRyMS0tID0gKCp0aW1lSW4xKysgPj4gMSkgKyAoKnRpbWVJbjMtLSA+PiBzaGlmdCk7CiAgfQoKICBkY3RfSVYoclN1YmJhbmQsTCwgJnJTdWJiYW5kX2UpOwp9CiNlbmRpZiAvKiBGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZCAqLwoKCi8qIE5FT04gb3B0aW1pemVkIFFNRiBjdXJyZW50bHkgYnVpbHRzIG9ubHkgd2l0aCBSVkNUIHRvb2xjaGFpbiAqLwoKI2lmIGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykKCiNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCiNkZWZpbmUgRlVOQ1RJT05fcW1mQW5hUHJvdG90eXBlRmlyU2xvdAojZW5kaWYKCiNpZmRlZiBGVU5DVElPTl9xbWZBbmFQcm90b3R5cGVGaXJTbG90CgojaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwoKaW5saW5lIElOVCBTTVVMQkIgKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKewogIElOVCByZXN1bHQgOwogIF9fYXNtX18gKCJzbXVsYmIgJTAsICUxLCAlMiIKICAgICA6ICI9ciIgKHJlc3VsdCkKICAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKICByZXR1cm4gcmVzdWx0IDsKfQppbmxpbmUgSU5UIFNNVUxCVCAoY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQp7CiAgSU5UIHJlc3VsdCA7CiAgX19hc21fXyAoInNtdWxidCAlMCwgJTEsICUyIgogICAgIDogIj1yIiAocmVzdWx0KQogICAgIDogInIiIChhKSwgInIiIChiKSkgOwogIHJldHVybiByZXN1bHQgOwp9CgppbmxpbmUgSU5UIFNNTEFCQihjb25zdCBMT05HIGFjY3UsIGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKewogIElOVCByZXN1bHQgOwogIF9fYXNtX18gKCJzbWxhYmIgJTAsICUxLCAlMiwlMyIKICAgICA6ICI9ciIgKHJlc3VsdCkKICAgICA6ICJyIiAoYSksICJyIiAoYiksICJyIiAoYWNjdSkpIDsKICByZXR1cm4gcmVzdWx0Owp9CmlubGluZSBJTlQgU01MQUJUKGNvbnN0IExPTkcgYWNjdSwgY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQp7CiAgSU5UIHJlc3VsdCA7CiAgX19hc21fXyAoInNtbGFidCAlMCwgJTEsICUyLCUzIgogICAgIDogIj1yIiAocmVzdWx0KQogICAgIDogInIiIChhKSwgInIiIChiKSwgInIiIChhY2N1KSkgOwogIHJldHVybiByZXN1bHQ7Cn0KI2VuZGlmIC8qIGNvbXBpbGVyIHNlbGVjdGlvbiAgKi8KCgp2b2lkIHFtZkFuYVByb3RvdHlwZUZpclNsb3QoIEZJWFBfUU1GICphbmFseXNpc0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9fY2hhbm5lbHMsICAgICAgICAgICAgIC8qITwgTnVtYmVyIGNoYW5uZWxzIG9mIGFuYWx5c2lzIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUEZUICpwX2ZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgcF9zdHJpZGUsICAgICAgICAgICAgICAgIC8qITwgU3RpZGUgb2YgYW5hbHlzaXMgZmlsdGVyICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RQVMgKlJFU1RSSUNUIHBGaWx0ZXJTdGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIExPTkcgKnBfZmx0ID0gKExPTkcgKikgcF9maWx0ZXI7CiAgTE9ORyBmbHQ7CiAgRklYUF9RTUYgKlJFU1RSSUNUIHBEYXRhXzAgPSBhbmFseXNpc0J1ZmZlciArIDIqbm9fY2hhbm5lbHMgLSAxOwogIEZJWFBfUU1GICpSRVNUUklDVCBwRGF0YV8xID0gYW5hbHlzaXNCdWZmZXI7CgogIEZJWFBfUUFTICpSRVNUUklDVCBzdGFfMCA9IChGSVhQX1FBUyAqKXBGaWx0ZXJTdGF0ZXM7CiAgRklYUF9RQVMgKlJFU1RSSUNUIHN0YV8xID0gKEZJWFBfUUFTICopcEZpbHRlclN0YXRlcyArICgyKlFNRl9OT19QT0xZKm5vX2NoYW5uZWxzKSAtIDE7CgogIEZJWFBfREJMIGFjY3UwLCBhY2N1MTsKICBGSVhQX1FBUyBzdGEwLCBzdGExOwoKICBpbnQgc3RhU3RlcDEgPSAgbm9fY2hhbm5lbHM8PDE7CiAgaW50IHN0YVN0ZXAyID0gKG5vX2NoYW5uZWxzPDwzKSAtIDE7IC8qIFJld2luZCBvbmUgbGVzcyAqLwoKICBpZiAocF9zdHJpZGUgPT0gMSkKICB7CiAgICAvKiBGSVIgZmlsdGVyIDAgKi8KICAgIGZsdCA9ICpwX2ZsdCsrOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTEgPSBTTVVMQkIoICAgICAgICBzdGExLCBmbHQpOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgIGZsdCA9ICpwX2ZsdCsrOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgIGZsdCA9ICpwX2ZsdCsrOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xICs9IHN0YVN0ZXAyOwogICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwogICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwoKICAgIC8qIEZJUiBmaWx0ZXJzIDEuLjYzIDEyNy4uNjUgb3IgMS4uMzEgNjMuLjMzICovCiAgICBub19jaGFubmVscyA+Pj0gMTsKICAgIGZvciAoOyAtLW5vX2NoYW5uZWxzOyApCiAgICB7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOyAgLyogMSwzLDUsIC4uLiAyOS82MSAqLwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTVVMQlQoICAgICAgICBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNVUxCVCggICAgICAgIHN0YTEsIGZsdCk7CgogICAgICBmbHQgPSAqcF9mbHQrKzsKICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICBmbHQgPSAqcF9mbHQrKzsKICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CiAgICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKCiAgICAgIC8qIFNhbWUgc2VxdWVuY2UgYXMgYWJvdmUsIGJ1dCBtaXggQj1ib3R0b20gd2l0aCBUPVRvcCAqLwoKICAgICAgZmx0ID0gKnBfZmx0Kys7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOyAgLyogMiw0LDYsIC4uLiAzMC82MiAqLwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNVUxCQiggICAgICAgIHN0YTEsIGZsdCk7CgogICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgICAgZmx0ID0gKnBfZmx0Kys7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgICAgZmx0ID0gKnBfZmx0Kys7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CiAgICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKICAgIH0KCiAgICAvKiBGSVIgZmlsdGVyIDMxLzYzIGFuZCAzMy82NSAqLwogICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgIGFjY3UwID0gU01VTEJUKCAgICAgICAgc3RhMCwgZmx0KTsKICAgIGFjY3UxID0gU01VTEJUKCAgICAgICAgc3RhMSwgZmx0KTsKCiAgICBmbHQgPSAqcF9mbHQrKzsKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICBmbHQgPSAqcF9mbHQrKzsKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgLT0gc3RhU3RlcDI7CiAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CiAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1MTw8MSk7CgogICAgLyogRklSIGZpbHRlciAzMi82NCAqLwogICAgZmx0ID0gKnBfZmx0Kys7CiAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOwogICAgYWNjdTEgPSBTTVVMQkIoICAgICAgICBzdGExLCBmbHQpOwoKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgZmx0ID0gKnBfZmx0Kys7CiAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgZmx0ID0gKnBfZmx0OwogICAgc3RhMCA9ICpzdGFfMDsKICAgIHN0YTEgPSAqc3RhXzE7CiAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgKnBEYXRhXzAtLSA9IEZYX0RCTDJGWF9RTUYoYWNjdTA8PDEpOwogICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwogIH0KICBlbHNlCiAgewogICAgaW50IHBmbHRTdGVwID0gUU1GX05PX1BPTFkgKiAocF9zdHJpZGUtMSk7CgogICAgZmx0ID0gcF9mbHRbMF07CiAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MSA9IFNNVUxCQiggICAgICAgIHN0YTEsIGZsdCk7CiAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgZmx0ID0gcF9mbHRbMV07CiAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CiAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgZmx0ID0gcF9mbHRbMl07IHBfZmx0ICs9IHBmbHRTdGVwOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xICs9IHN0YVN0ZXAyOwogICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwogICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwoKICAgIC8qIEZJUiBmaWx0ZXJzIDEuLjYzIDEyNy4uNjUgb3IgMS4uMzEgNjMuLjMzICovCiAgICBmb3IgKDsgLS1ub19jaGFubmVsczsgKQogICAgewogICAgICBmbHQgPSBwX2ZsdFswXTsKICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgICBhY2N1MCA9IFNNVUxCQiggICAgICAgIHN0YTAsIGZsdCk7CiAgICAgIGFjY3UxID0gU01VTEJCKCAgICAgICAgc3RhMSwgZmx0KTsKCiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICBmbHQgPSBwX2ZsdFsxXTsKICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICBmbHQgPSBwX2ZsdFsyXTsgcF9mbHQgKz0gcGZsdFN0ZXA7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CiAgICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKICAgIH0KCiAgICAvKiBGSVIgZmlsdGVyIDMyLzY0ICovCiAgICBmbHQgPSBwX2ZsdFswXTsKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOwogICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7CgogICAgZmx0ID0gcF9mbHRbMV07CiAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwoKICAgIGZsdCA9IHBfZmx0WzJdOwogICAgc3RhMCA9ICpzdGFfMDsKICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3UwPDwxKTsKICB9Cn0KI2VuZGlmIC8qIEZVTkNUSU9OX3FtZkFuYVByb3RvdHlwZUZpclNsb3QgKi8KI2VuZGlmIC8qICNpZiBkZWZpbmVkKF9fQ0NfQVJNKSAmJiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSAqLwoKI2lmICggZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSAmJiAoU0FNUExFX0JJVFMgPT0gMTYpICkgJiYgIWRlZmluZWQoUU1GX1RBQkxFX0ZVTEwpCgojZGVmaW5lIEZVTkNUSU9OX3FtZlN5blByb3RvdHlwZUZpclNsb3QKCiNpZiBkZWZpbmVkKEZVTkNUSU9OX3FtZlN5blByb3RvdHlwZUZpclNsb3QpCgojaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwoKaW5saW5lIElOVCBTTVVMV0IgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQp7CiAgSU5UIHJlc3VsdCA7CiAgX19hc21fXyAoInNtdWx3YiAlMCwgJTEsICUyIgogICAgOiAiPXIiIChyZXN1bHQpCiAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKCiAgcmV0dXJuIHJlc3VsdCA7Cn0KaW5saW5lIElOVCBTTVVMV1QgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQp7CiAgSU5UIHJlc3VsdCA7CiAgX19hc21fXyAoInNtdWx3dCAlMCwgJTEsICUyIgogICAgOiAiPXIiIChyZXN1bHQpCiAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKCiAgcmV0dXJuIHJlc3VsdCA7Cn0KCmlubGluZSBJTlQgU01MQVdCKGNvbnN0IExPTkcgYWNjdSwgY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpCnsKICBJTlQgcmVzdWx0OwogIGFzbSgic21sYXdiICUwLCAlMSwgJTIsICUzICIKICAgICAgICA6ICI9ciIgKHJlc3VsdCkKICAgICAgICA6ICJyIiAoYSksICJyIiAoYiksICJyIiAoYWNjdSkgKTsKICByZXR1cm4gcmVzdWx0IDsKfQoKaW5saW5lIElOVCBTTUxBV1QoY29uc3QgTE9ORyBhY2N1LCBjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKewogIElOVCByZXN1bHQ7CiAgYXNtKCJzbWxhd3QgJTAsICUxLCAlMiwgJTMgIgogICAgICAgIDogIj1yIiAocmVzdWx0KQogICAgICAgIDogInIiIChhKSwgInIiIChiKSwgInIiIChhY2N1KSApOwogIHJldHVybiByZXN1bHQgOwp9CgojZW5kaWYgLyogQVJNIGNvbXBpbGVyIHNlbGVjdG9yICovCgoKc3RhdGljIHZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdDFfZmlsdGVyKEZJWFBfUU1GICpSRVNUUklDVCByZWFsU2xvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgaW1hZ1Nsb3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBfZmx0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUVNTICpSRVNUUklDVCBzdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcE15VGltZU91dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fY2hhbm5lbHMpCnsKICAvKiBUaGlzIGNvZGUgd2FzIHRoZSBiYXNlIGZvciB0aGUgYWJvdmUgbGlzdGVkIGFzc2VtYmxlciBzZXF1ZW5jZSAqLwogIC8qIEl0IGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSBvciBmdXJ0aGVyIG9wdGltaXphdGlvbnMgICovCiAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBfZmx0bSA9IHBfZmx0ICsgMTU1OwoKICBkbwogIHsKICAgICBGSVhQX0RCTCByZXN1bHQ7CiAgICAgRklYUF9EQkwgQSwgQiwgcmVhbCwgaW1hZywgc3RhMDsKCiAgICAgcmVhbCA9ICotLXJlYWxTbG90OwogICAgIGltYWcgPSAqLS1pbWFnU2xvdDsKICAgICBCID0gcF9mbHRbNF07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVs4XSBUb3A9WzldICAgICAqLwogICAgIEEgPSBwX2ZsdG1bM107ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxNl0gVG9wPVszMTddICovCiAgICAgc3RhMCA9IHN0YVswXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgc3RhdGVbMF0gICAgICAgICAgKi8KICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9OS4uLi4uLi4uLi4uMzE5ICAqLwogICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTYuLi4uLi4uLi4uLjYgICovCiAgICAgc3RhWzBdID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTgsMTgsICAgIC4uLjMxOCAgKi8KICAgICBCID0gcF9mbHRbM107ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVs2XSBUb3A9WzddICAgICAqLwogICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTcuLi4uLi4uLi4uLjcgICovCiAgICAgQSA9IHBfZmx0bVs0XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzE4XSBUb3A9WzMxOV0gKi8KICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9Ny4uLi4uLi4uLi4uMzE3ICAqLwogICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTguLi4uLi4uLi4uLjggICovCiAgICAgc3RhWzBdID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTYuLi4uLi4uLi4uLjMxNiAgKi8KICAgICBCID0gcF9mbHRbMl07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVtYXSBUb3A9WzVdICAgICAqLwogICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD05Li4uLi4uLi4uLi4zMTkgICovCiAgICAgQSA9IHBfZmx0bVsyXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bWF0gVG9wPVszMTVdICAgKi8KICAgICBzdGFbMF0gPSAgICAgICAgIFNNVUxXVCggaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9NSwxNSwgLi4uICAgMzE1ICAqLwogICAgIHJlc3VsdCA9IFNNTEFXVCggc3RhMCwgICByZWFsLCBBICk7ICAvKiBpbmRleD0zMTUuLi4uLi4uLi4uLjUgICovCgogICAgIHBNeVRpbWVPdXRbMF0gPSByZXN1bHQ7IHBNeVRpbWVPdXQrKzsKCiAgICAgcmVhbCA9ICotLXJlYWxTbG90OwogICAgIGltYWcgPSAqLS1pbWFnU2xvdDsKICAgICBBID0gcF9mbHRtWzBdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTBdIFRvcD1bMzExXSAqLwogICAgIEIgPSBwX2ZsdFs3XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzE0XSAgVG9wPVsxNV0gICovCiAgICAgcmVzdWx0ID0gU01MQVdCKCBzdGFbMF0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxMC4uLi4uLi4uLi4uMCAgKi8KICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9MTQuLi4uLi4uLi4uMzI0ICAqLwogICAgIHBNeVRpbWVPdXRbMF0gPSByZXN1bHQ7IHBNeVRpbWVPdXQrKzsKICAgICBCID0gcF9mbHRbNl07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxMl0gIFRvcD1bMTNdICAqLwogICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTEuLi4uLi4uLi4uLjEgICovCiAgICAgQSA9IHBfZmx0bVsxXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzEyXSBUb3A9WzMxM10gKi8KICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9MTMuLi4uLi4uLi4uMzIzICAqLwogICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTIuLi4uLi4uLi4uLjIgICovCiAgICAgc3RhWzBdID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTEyLi4uLi4uLi4uLjMyMiAgKi8KICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzEzLi4uLi4uLi4uLi4zICAqLwogICAgIEEgPSBwX2ZsdG1bMl07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxNF0gVG9wPVszMTVdICovCiAgICAgQiA9IHBfZmx0WzVdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMTBdICBUb3A9WzExXSAgKi8KICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9MTEuLi4uLi4uLi4uMzIxICAqLwogICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTQuLi4uLi4uLi4uLjQgICovCiAgICAgc3RhWzBdID0gICAgICAgICBTTVVMV0IoIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTEwLi4uLi4uLi4uLjMyMCAgKi8KCgogICAgIHBfZmx0ICAgICs9IDU7CiAgICAgcF9mbHRtICAgLT0gNTsKICB9IAogIHdoaWxlICgoLS1ub19jaGFubmVscykgIT0gMCk7Cgp9CgoKCklOVCBxbWZTeW5Qcm90b3R5cGVGaXJTbG90MigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHFtZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgcmVhbFNsb3QsICAgICAgICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byByZWFsIFNsb3QgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgaW1hZ1Nsb3QsICAgICAgICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byBpbWFnIFNsb3QgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqUkVTVFJJQ1QgdGltZU91dCwgICAgICAgICAgICAgLyohPCBUaW1lIGRvbWFpbiBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgIHN0cmlkZSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZSBvdXRwdXQgYnVmZmVyIHN0cmlkZSBmYWN0b3IqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgRklYUF9RU1MgKlJFU1RSSUNUIHN0YSA9IChGSVhQX1FTUyopcW1mLT5GaWx0ZXJTdGF0ZXM7CiAgaW50IG5vX2NoYW5uZWxzID0gcW1mLT5ub19jaGFubmVsczsKICBpbnQgc2NhbGUgPSAoKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IpOwoKICAvKiBXZSBtYXAgYW4gYXJyeSBvZiAxNi1iaXQgdmFsdWVzIHVwb24gYW4gYXJyYXkgb2YgMioxNi1iaXQgdmFsdWVzIHRvIHJlYWQgMiB2YWx1ZXMgaW4gb25lIHNob3QgKi8KICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcF9mbHQgID0gKEZJWFBfREJMICopIHFtZi0+cF9maWx0ZXI7ICAgICAgICAgICAvKiBsb3c9WzBdLCAgIGhpZ2g9WzFdICAgKi8KICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcF9mbHRtID0gKEZJWFBfREJMICopIHFtZi0+cF9maWx0ZXIgKyAxNTU7ICAgICAvKiBsb3c9WzMxMF0sIGhpZ2g9WzMxMV0gKi8KCiAgRkRLX0FTU0VSVChTQU1QTEVfQklUUy0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7IC8vICAgKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7CiAgRkRLX0FTU0VSVChxbWYtPnBfc3RyaWRlPT0yICYmIHFtZi0+bm9fY2hhbm5lbHMgPT0gMzIpOwoKICBGREtfQVNTRVJUKChub19jaGFubmVscyYzKSA9PSAwKTsgIC8qIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDQgKi8KCiAgcmVhbFNsb3QgKz0gbm9fY2hhbm5lbHMtMTsgICAgLy8gfn4ifn4KICBpbWFnU2xvdCArPSBub19jaGFubmVscy0xOyAgICAvLyBub19jaGFubmVscy0xIC4uIDAKCiAgRklYUF9EQkwgTXlUaW1lT3V0WzMyXTsKICBGSVhQX0RCTCAqcE15VGltZU91dCA9ICZNeVRpbWVPdXRbMF07CgogIGZvciAobm9fY2hhbm5lbHMgPSBub19jaGFubmVsczsgbm9fY2hhbm5lbHMtLTspCiAgewogICAgIEZJWFBfREJMIHJlc3VsdDsKICAgICBGSVhQX0RCTCBBLCBCLCByZWFsLCBpbWFnOwoKICAgICByZWFsID0gKnJlYWxTbG90LS07CiAgICAgaW1hZyA9ICppbWFnU2xvdC0tOwogICAgIEEgPSBwX2ZsdG1bMF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxMF0gVG9wPVszMTFdICovCiAgICAgQiA9IHBfZmx0WzddOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMTRdICBUb3A9WzE1XSAgKi8KICAgICByZXN1bHQgPSBTTUxBV0IoIHN0YVswXSwgcmVhbCwgQSApOyAgLyogaW5kZXg9MzEwLi4uLi4uLi4uLi4wICAqLwogICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xNC4uLi4uLi4uLi4zMjQgICovCiAgICAgQiA9IHBfZmx0WzZdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMTJdICBUb3A9WzEzXSAgKi8KICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzExLi4uLi4uLi4uLi4xICAqLwogICAgIEEgPSBwX2ZsdG1bMV07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxMl0gVG9wPVszMTNdICovCiAgICAgc3RhWzBdID0gU01MQVdUKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTEzLi4uLi4uLi4uLjMyMyAgKi8KICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzEyLi4uLi4uLi4uLi4yICAqLwogICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMi4uLi4uLi4uLi4zMjIgICovCiAgICAgc3RhWzBdID0gU01MQVdUKCBzdGFbMV0sIHJlYWwsIEEgKTsgc3RhKys7IC8qIGluZGV4PTMxMy4uLi4uLi4uLi4uMyAgKi8KICAgICBBID0gcF9mbHRtWzJdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTRdIFRvcD1bMzE1XSAqLwogICAgIEIgPSBwX2ZsdFs1XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzEwXSAgVG9wPVsxMV0gICovCiAgICAgc3RhWzBdID0gU01MQVdUKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTExLi4uLi4uLi4uLjMyMSAgKi8KICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzE0Li4uLi4uLi4uLi40ICAqLwogICAgIHN0YVswXSA9ICAgICAgICAgU01VTFdCKCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMC4uLi4uLi4uLi4zMjAgICovCgogICAgIHBNeVRpbWVPdXRbMF0gPSByZXN1bHQ7IHBNeVRpbWVPdXQrKzsKCiAgICAgcF9mbHRtICAgLT0gNTsKICAgICBwX2ZsdCAgICArPSA1OwogIH0KCiAgcE15VGltZU91dCA9ICZNeVRpbWVPdXRbMF07CiNpZiAoU0FNUExFX0JJVFMgPT0gMTYpICAgICAgCiAgY29uc3QgRklYUF9EQkwgbWF4X3BvcyA9IChGSVhQX0RCTCkgMHgwMDAwN0ZGRiA8PCBzY2FsZTsKICBjb25zdCBGSVhQX0RCTCBtYXhfbmVnID0gKEZJWFBfREJMKSAweEZGRkY4MDAxIDw8IHNjYWxlOwojZWxzZQogIHNjYWxlID0gLXNjYWxlOwogIGNvbnN0IEZJWFBfREJMIG1heF9wb3MgPSAoRklYUF9EQkwpIDB4N0ZGRkZGRkYgPj4gc2NhbGU7CiAgY29uc3QgRklYUF9EQkwgbWF4X25lZyA9IChGSVhQX0RCTCkgMHg4MDAwMDAwMSA+PiBzY2FsZTsgIAojZW5kaWYKICBjb25zdCBGSVhQX0RCTCBhZGRfbmVnID0gKDEgPDwgc2NhbGUpIC0gMTsKCiAgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOwoKICB0aW1lT3V0ICs9IG5vX2NoYW5uZWxzKnN0cmlkZTsKCiAgRkRLX0FTU0VSVChzY2FsZSA+PSAwKTsKCiAgaWYgKHFtZi0+b3V0R2FpbiAhPSAweDgwMDAwMDAwKQogIHsKICAgIEZJWFBfREJMIGdhaW4gPSBxbWYtPm91dEdhaW47CiAgICBmb3IgKG5vX2NoYW5uZWxzPj49Mjsgbm9fY2hhbm5lbHMtLTspCiAgICB7CiAgICAgIEZJWFBfREJMIHJlc3VsdDEsIHJlc3VsdDI7CgogICAgICByZXN1bHQxID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwogICAgICByZXN1bHQyID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwoKICAgICAgcmVzdWx0MSA9IGZNdWx0KHJlc3VsdDEsZ2Fpbik7CiAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwogICAgICBpZiAocmVzdWx0MSA8IDApICAgICAgICByZXN1bHQxICs9IGFkZF9uZWc7CiAgICAgIGlmIChyZXN1bHQxIDwgbWF4X25lZykgIHJlc3VsdDEgPSBtYXhfbmVnOwogICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKI2lmIChTQU1QTEVfQklUUyA9PSAxNikKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPj4gc2NhbGU7CiNlbHNlCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxIDw8IHNjYWxlOwojZW5kaWYKCiAgICAgIHJlc3VsdDIgPSBmTXVsdChyZXN1bHQyLGdhaW4pOwogICAgICB0aW1lT3V0IC09IHN0cmlkZTsKICAgICAgaWYgKHJlc3VsdDIgPCAwKSAgICAgICAgcmVzdWx0MiArPSBhZGRfbmVnOwogICAgICBpZiAocmVzdWx0MiA8IG1heF9uZWcpICByZXN1bHQyID0gbWF4X25lZzsKICAgICAgaWYgKHJlc3VsdDIgPiBtYXhfcG9zKSAgcmVzdWx0MiA9IG1heF9wb3M7CiNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyID4+IHNjYWxlOwojZWxzZQogICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA8PCBzY2FsZTsKI2VuZGlmCgogICAgICByZXN1bHQxID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwogICAgICByZXN1bHQyID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwoKICAgICAgcmVzdWx0MSA9IGZNdWx0KHJlc3VsdDEsZ2Fpbik7CiAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwogICAgICBpZiAocmVzdWx0MSA8IDApICAgICAgICByZXN1bHQxICs9IGFkZF9uZWc7CiAgICAgIGlmIChyZXN1bHQxIDwgbWF4X25lZykgIHJlc3VsdDEgPSBtYXhfbmVnOwogICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKI2lmIChTQU1QTEVfQklUUyA9PSAxNikKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPj4gc2NhbGU7CiNlbHNlCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxIDw8IHNjYWxlOwojZW5kaWYKCiAgICAgIHJlc3VsdDIgPSBmTXVsdChyZXN1bHQyLGdhaW4pOwogICAgICB0aW1lT3V0IC09IHN0cmlkZTsKICAgICAgaWYgKHJlc3VsdDIgPCAwKSAgICAgICAgcmVzdWx0MiArPSBhZGRfbmVnOwogICAgICBpZiAocmVzdWx0MiA8IG1heF9uZWcpICByZXN1bHQyID0gbWF4X25lZzsKICAgICAgaWYgKHJlc3VsdDIgPiBtYXhfcG9zKSAgcmVzdWx0MiA9IG1heF9wb3M7CiNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyID4+IHNjYWxlOwojZWxzZQogICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA8PCBzY2FsZTsKI2VuZGlmCiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBmb3IgKG5vX2NoYW5uZWxzPj49Mjsgbm9fY2hhbm5lbHMtLTspCiAgICB7CiAgICAgIEZJWFBfREJMIHJlc3VsdDEsIHJlc3VsdDI7CiAgICAgIHJlc3VsdDEgPSBwTXlUaW1lT3V0WzBdOyBwTXlUaW1lT3V0Kys7CiAgICAgIHJlc3VsdDIgPSBwTXlUaW1lT3V0WzBdOyBwTXlUaW1lT3V0Kys7CiAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwogICAgICBpZiAocmVzdWx0MSA8IDApICAgICAgICByZXN1bHQxICs9IGFkZF9uZWc7CiAgICAgIGlmIChyZXN1bHQxIDwgbWF4X25lZykgIHJlc3VsdDEgPSBtYXhfbmVnOwogICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKI2lmIChTQU1QTEVfQklUUyA9PSAxNikKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPj4gc2NhbGU7CiNlbHNlCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxIDw8IHNjYWxlOwojZW5kaWYKICAgICAgCiAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwogICAgICBpZiAocmVzdWx0MiA8IDApICAgICAgICByZXN1bHQyICs9IGFkZF9uZWc7CiAgICAgIGlmIChyZXN1bHQyIDwgbWF4X25lZykgIHJlc3VsdDIgPSBtYXhfbmVnOwogICAgICBpZiAocmVzdWx0MiA+IG1heF9wb3MpICByZXN1bHQyID0gbWF4X3BvczsKI2lmIChTQU1QTEVfQklUUyA9PSAxNikKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPj4gc2NhbGU7CiNlbHNlCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyIDw8IHNjYWxlOwojZW5kaWYKICAgICAgCiAgICAgIHJlc3VsdDEgPSBwTXlUaW1lT3V0WzBdOyBwTXlUaW1lT3V0Kys7CiAgICAgIHJlc3VsdDIgPSBwTXlUaW1lT3V0WzBdOyBwTXlUaW1lT3V0Kys7CiAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwogICAgICBpZiAocmVzdWx0MSA8IDApICAgICAgICByZXN1bHQxICs9IGFkZF9uZWc7CiAgICAgIGlmIChyZXN1bHQxIDwgbWF4X25lZykgIHJlc3VsdDEgPSBtYXhfbmVnOwogICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKI2lmIChTQU1QTEVfQklUUyA9PSAxNikKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPj4gc2NhbGU7CiNlbHNlCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxIDw8IHNjYWxlOwojZW5kaWYKICAgICAgCiAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwogICAgICBpZiAocmVzdWx0MiA8IDApICAgICAgICByZXN1bHQyICs9IGFkZF9uZWc7CiAgICAgIGlmIChyZXN1bHQyIDwgbWF4X25lZykgIHJlc3VsdDIgPSBtYXhfbmVnOwogICAgICBpZiAocmVzdWx0MiA+IG1heF9wb3MpICByZXN1bHQyID0gbWF4X3BvczsKI2lmIChTQU1QTEVfQklUUyA9PSAxNikKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPj4gc2NhbGU7CiNlbHNlCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyIDw8IHNjYWxlOwojZW5kaWYKICAgIH0KICB9CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYwp2b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3RfZmFsbGJhY2soIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgcW1mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpyZWFsU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICppbWFnU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICp0aW1lT3V0LCAgICAgICAgICAgICAvKiE8IFRpbWUgZG9tYWluIGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgc3RyaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKLyohCiAgXGJyaWVmIFBlcmZvcm0gU3ludGhlc2lzIFByb3RvdHlwZSBGaWx0ZXJpbmcgb24gYSBzaW5nbGUgc2xvdCBvZiBpbnB1dCBkYXRhLgoKICBUaGUgZmlsdGVyIHRha2VzIDIgKiAjTUFYX1NZTlRIRVNJU19DSEFOTkVMUyBvZiBpbnB1dCBkYXRhIGFuZAogIGdlbmVyYXRlcyAjTUFYX1NZTlRIRVNJU19DSEFOTkVMUyB0aW1lIGRvbWFpbiBvdXRwdXQgc2FtcGxlcy4KKi8KCnN0YXRpYwp2b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3QoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgcW1mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpyZWFsU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICppbWFnU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICp0aW1lT3V0LCAgICAgICAgICAgICAvKiE8IFRpbWUgZG9tYWluIGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgc3RyaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICAgIElOVCBlcnIgPSAtMTsKCiAgICBzd2l0Y2ggKHFtZi0+cF9zdHJpZGUpIHsKICAgIGNhc2UgMjoKICAgICAgZXJyID0gcW1mU3luUHJvdG90eXBlRmlyU2xvdDIocW1mLCByZWFsU2xvdCwgaW1hZ1Nsb3QsIHRpbWVPdXQsIHN0cmlkZSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZXJyID0gLTE7CiAgICB9CgogICAgLyogZmFsbGJhY2sgaWYgY29uZmlndXJhdGlvbiBub3QgYXZhaWxhYmxlIG9yIGZhaWxlZCAqLwogICAgaWYoZXJyIT0wKSB7CiAgICAgICAgcW1mU3luUHJvdG90eXBlRmlyU2xvdF9mYWxsYmFjayhxbWYsIHJlYWxTbG90LCBpbWFnU2xvdCwgdGltZU91dCwgc3RyaWRlKTsKICAgIH0KfQojZW5kaWYgLyogRlVOQ1RJT05fcW1mU3luUHJvdG90eXBlRmlyU2xvdCAqLwoKI2VuZGlmICAvKiAgKCBkZWZpbmVkKF9fQ0NfQVJNKSAmJiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pICYmIChTQU1QTEVfQklUUyA9PSAxNikgKSAmJiAhZGVmaW5lZChRTUZfVEFCTEVfRlVMTCkgKi8KCgoKLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCgoKCiNlbmRpZiAgLyogKFFNRl9OT19QT0xZPT01KSAqLwoK