Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgRW52ZWxvcGUgY2FsY3VsYXRpb24gIAoKICBUaGUgZW52ZWxvcGUgYWRqdXN0b3IgY29tcGFyZXMgdGhlIGVuZXJnaWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zcG9zZWQKICBoaWdoYmFuZCB0byB0aGUgcmVmZXJlbmNlIGVuZXJnaWVzIGNvbnZleWVkIHdpdGggdGhlIGJpdHN0cmVhbS4KICBUaGUgaGlnaGJhbmQgaXMgYW1wbGlmaWVkIChzb21ldGltZXMpIG9yIGF0dGVudWF0ZWQgKG1vc3RseSkgdG8gdGhlCiAgZGVzaXJlZCBsZXZlbC4KCiAgVGhlIHNwZWN0cmFsIHNoYXBlIG9mIHRoZSByZWZlcmVuY2UgZW5lcmdpZXMgY2FuIGJlIGNoYW5nZWQgc2V2ZXJhbCB0aW1lcyBwZXIKICBmcmFtZSBpZiBuZWNlc3NhcnkuIEVhY2ggc2V0IG9mIGVuZXJneSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBhIGNlcnRhaW4gcmFuZ2UKICBpbiB0aW1lIHdpbGwgYmUgY2FsbGVkIGFuIDxlbT5lbnZlbG9wZTwvZW0+IGhlcmUuCiAgVGhlIGJpdHN0cmVhbSBzdXBwb3J0cyBzZXZlcmFsIGZyZXF1ZW5jeSBzY2FsZXMgYW5kIHR3byByZXNvbHV0aW9ucy4gTm9ybWFsbHksCiAgb25lIG9yIG1vcmUgUU1GLXN1YmJhbmRzIGFyZSBncm91cGVkIHRvIG9uZSBTQlItYmFuZC4gQW4gZW52ZWxvcGUgY29udGFpbnMKICByZWZlcmVuY2UgZW5lcmdpZXMgZm9yIGVhY2ggU0JSLWJhbmQuCiAgSW4gYWRkaXRpb24gdG8gdGhlIGVuZXJneSBlbnZlbG9wZXMsIG5vaXNlIGVudmVsb3BlcyBhcmUgdHJhbnNtaXR0ZWQgdGhhdAogIGRlZmluZSB0aGUgcmF0aW8gb2YgZW5lcmd5IHdoaWNoIGlzIGdlbmVyYXRlZCBieSBhZGRpbmcgbm9pc2UgaW5zdGVhZCBvZgogIHRyYW5zcG9zaW5nIHRoZSBsb3diYW5kLiBUaGUgbm9pc2UgZW52ZWxvcGVzIGFyZSBnaXZlbiBpbiBhIGNvYXJzZXIgdGltZQogIGFuZCBmcmVxdWVuY3kgcmVzb2x1dGlvbi4KICBJZiBhIHNpZ25hbCBjb250YWlucyBzdHJvbmcgdG9uYWwgY29tcG9uZW50cywgc3ludGhldGljIHNpbmVzIGNhbiBiZQogIGdlbmVyYXRlZCBpbiBpbmRpdmlkdWFsIFNCUiBiYW5kcy4KCiAgQW4gb3ZlcmxhcCBidWZmZXIgb2YgNiBRTUYtdGltZXNsb3RzIGlzIHVzZWQgdG8gYWxsb3cgYSBtb3JlCiAgZmxleGlibGUgYWxpZ25tZW50IG9mIHRoZSBlbnZlbG9wZXMgaW4gdGltZSB0aGF0IGlzIG5vdCByZXN0cmljdGVkIHRvIHRoZQogIGNvcmUgY29kZWMncyBmcmFtZSBib3JkZXJzLgogIFRoZXJlZm9yZSB0aGUgZW52ZWxvcGUgYWRqdXN0b3IgaGFzIGFjY2VzcyB0byB0aGUgc3BlY3RyYWwgZGF0YSBvZiB0aGUKICBjdXJyZW50IGZyYW1lIGFzIHdlbGwgYXMgdGhlIGxhc3QgNiBRTUYtdGltZXNsb3RzIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4KICBIb3dldmVyLCBpbiBhdmVyYWdlIG9ubHkgdGhlIGRhdGEgb2YgMSBmcmFtZSBpcyBiZWluZyBwcm9jZXNzZWQgYXMKICB0aGUgYWRqdXN0b3IgaXMgY2FsbGVkIG9uY2UgcGVyIGZyYW1lLgoKICBEZXBlbmRpbmcgb24gdGhlIGZyZXF1ZW5jeSByYW5nZSBzZXQgaW4gdGhlIGJpdHN0cmVhbSwgb25seSBRTUYtc3ViYmFuZHMgYmV0d2VlbgogIDxlbT5sb3dTdWJiYW5kPC9lbT4gYW5kIDxlbT5oaWdoU3ViYmFuZDwvZW0+IGFyZSBhZGp1c3RlZC4KCiAgU2NhbGluZyBvZiBzcGVjdHJhbCBkYXRhIHRvIG1heGltaXplIFNOUiAoc2VlICNRTUZfU0NBTEVfRkFDVE9SKSBhcyB3ZWxsIGFzIGEgc3BlY2lhbCBNYW50aXNzYS1FeHBvbmVudCBmb3JtYXQKICAoIHNlZSAgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSApIGFyZSBiZWluZyB1c2VkLiBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhpcyBtb2R1bGVzIGlzIGNhbGN1bGF0ZVNickVudmVsb3BlKCkuCgogIFxzYSBzYnJfc2NhbGUuaCwgI1FNRl9TQ0FMRV9GQUNUT1IsIGNhbGN1bGF0ZVNickVudmVsb3BlKCksIFxyZWYgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3CiovCgoKI2luY2x1ZGUgImVudl9jYWxjLmgiCgojaW5jbHVkZSAic2JyZGVjX2ZyZXFfc2NhLmgiCiNpbmNsdWRlICJlbnZfZXh0ci5oIgojaW5jbHVkZSAidHJhbnNjZW5kZW50LmgiCiNpbmNsdWRlICJzYnJfcmFtLmgiCiNpbmNsdWRlICJzYnJfcm9tLmgiCgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIgICAgICAgICAgIC8qIG5lZWQgRkRLcG93KCkgZm9yIGRlYnVnIG91dHB1dHMgKi8KCiNpZiBkZWZpbmVkKF9fYXJtX18pCiNpbmNsdWRlICJhcm0vZW52X2NhbGNfYXJtLmNwcCIKI2VuZGlmCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBGSVhQX0RCTCBucmdSZWZbTUFYX0ZSRVFfQ09FRkZTXTsKICAgIEZJWFBfREJMIG5yZ0VzdFtNQVhfRlJFUV9DT0VGRlNdOwogICAgRklYUF9EQkwgbnJnR2FpbltNQVhfRlJFUV9DT0VGRlNdOwogICAgRklYUF9EQkwgbm9pc2VMZXZlbFtNQVhfRlJFUV9DT0VGRlNdOwogICAgRklYUF9EQkwgbnJnU2luZVtNQVhfRlJFUV9DT0VGRlNdOwoKICAgIFNDSEFSICAgbnJnUmVmX2VbTUFYX0ZSRVFfQ09FRkZTXTsKICAgIFNDSEFSICAgbnJnRXN0X2VbTUFYX0ZSRVFfQ09FRkZTXTsKICAgIFNDSEFSICAgbnJnR2Fpbl9lW01BWF9GUkVRX0NPRUZGU107CiAgICBTQ0hBUiAgIG5vaXNlTGV2ZWxfZVtNQVhfRlJFUV9DT0VGRlNdOwogICAgU0NIQVIgICBucmdTaW5lX2VbTUFYX0ZSRVFfQ09FRkZTXTsKfQpFTlZfQ0FMQ19OUkdTOwoKc3RhdGljIHZvaWQgZXF1YWxpemVGaWx0QnVmZmVyRXhwKEZJWFBfREJMICpmaWx0QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAqZmlsdEJ1ZmZlcl9lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKk5yZ0dhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICpOcmdHYWluX2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgc3ViYmFuZHMpOwoKc3RhdGljIHZvaWQgY2FsY05yZ1BlclN1YmJhbmQoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqYW5hbHlzQnVmZmVySW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsIGludCBoaWdoU3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHN0YXJ0X3BvcywgIGludCBuZXh0X3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGZyYW1lRXhwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnRXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnRXN0X2UgKTsKCnN0YXRpYyB2b2lkIGNhbGNOcmdQZXJTZmIoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpmcmVxQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICBpbnQgbmV4dF9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGlucHV0X2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ19lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKm5yZ19lc3RfZSApOwoKc3RhdGljIHZvaWQgY2FsY1N1YmJhbmRHYWluKEZJWFBfREJMICBucmdSZWYsIFNDSEFSIG5yZ1JlZl9lLCBFTlZfQ0FMQ19OUkdTKiBucmdzLCBpbnQgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0bXBOb2lzZSwgU0NIQVIgdG1wTm9pc2VfZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lUHJlc2VudEZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgc2luZU1hcHBlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZyk7CgpzdGF0aWMgdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGxvd1N1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgaGlnaFN1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqc3VtUmVmX20sCiAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAqc3VtUmVmX2UsCiAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqcHRyQXZnR2Fpbl9tLAogICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgKnB0ckF2Z0dhaW5fZSk7CgpzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdF9FbGRHcmlkKEZJWFBfREJMICAqcHRyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnB0ckhhcm1JbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGxvd1N1YmJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9TdWJiYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2NoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG5vTm9pc2VGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqcHRyUGhhc2VJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2RpZmZfbG93KTsKCnN0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90TEMoRklYUF9EQkwgICpwdHJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcHRySGFybUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbG93U3ViYmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub1N1YmJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgc2NhbGVfY2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9Ob2lzZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpwdHJQaGFzZUluZGV4KTsKc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RIUShGSVhQX0RCTCAgKnB0clJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqcHRySW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGxvd1N1YmJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9TdWJiYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2NoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgc21vb3RoX3JhdGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9Ob2lzZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7CgoKLyohCiAgXGJyaWVmICAgICBNYXAgc2luZSBmbGFncyBmcm9tIGJpdHN0cmVhbSB0byBRTUYgYmFuZHMKCiAgVGhlIGJpdHN0cmVhbSBjYXJyaWVzIG9ubHkgMSBzaW5lIGZsYWcgcGVyIGJhbmQgYW5kIGZyYW1lLgogIFRoaXMgZnVuY3Rpb24gbWFwcyBldmVyeSBzaW5lIGZsYWcgZnJvbSB0aGUgYml0c3RyZWFtIHRvIGEgc3BlY2lmaWMgUU1GIHN1YmJhbmQKICBhbmQgdG8gYSBzcGVjaWZpYyBlbnZlbG9wZSB3aGVyZSB0aGUgc2luZSBzaGFsbCBzdGFydC4KICBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgdmVjdG9yIHNpbmVNYXBwZWQgd2hpY2ggY29udGFpbnMgb25lIGVudHJ5IHBlcgogIFFNRiBzdWJiYW5kLiBUaGUgdmFsdWUgb2YgYW4gZW50cnkgc3BlY2lmaWVzIHRoZSBlbnZlbG9wZSB3aGVyZSBhIHNpbmUKICBzaGFsbCBzdGFydC4gQSB2YWx1ZSBvZiAjTUFYX0VOVkVMT1BFUyBpbmRpY2F0ZXMgdGhhdCBubyBzaW5lIGlzIHByZXNlbnQKICBpbiB0aGUgc3ViYmFuZC4KICBUaGUgbWlzc2luZyBoYXJtb25pY3MgZmxhZ3MgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUgKGhhcm1GbGFnc1ByZXYpIGRldGVybWluZQogIGlmIGEgc2luZSBzdGFydHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUgb3IgYXQgdGhlIHRyYW5zaWVudCBwb3NpdGlvbi4KICBBZGRpdGlvbmFsbHksIHRoZSBmbGFncyBpbiBoYXJtRmxhZ3NQcmV2IGFyZSBiZWluZyB1cGRhdGVkIGJ5IHRoaXMgZnVuY3Rpb24KICBmb3IgdGhlIG5leHQgZnJhbWUuCiovCnN0YXRpYyB2b2lkIG1hcFNpbmVGbGFncyhVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAgICAvKiE8IEJhbmQgYm9yZGVycyAodGhlcmUncyBvbmx5IDEgZmxhZyBwZXIgYmFuZCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2ZiLCAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGluIHRoZSB0YWJsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmFkZEhhcm1vbmljcywgICAgICAgICAgIC8qITwgdmVjdG9yIHdpdGggMSBmbGFnIHBlciBzZmIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaGFybUZsYWdzUHJldiwgICAgICAgICAgIC8qITwgUGFja2VkICdhZGRIYXJtb25pY3MnICovCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbkVudiwgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zaWVudCBwb3NpdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnNpbmVNYXBwZWQpICAgICAgICAgICAgLyohPCBSZXN1bHRpbmcgdmVjdG9yIG9mIHNpbmUgc3RhcnQgcG9zaXRpb25zIGZvciBlYWNoIFFNRiBiYW5kICovCgp7CiAgaW50IGk7CiAgaW50IGxvd1N1YmJhbmQyID0gZnJlcUJhbmRUYWJsZVswXTw8MTsKICBpbnQgYml0Y291bnQgPSAwOwogIGludCBvbGRmbGFncyA9ICpoYXJtRmxhZ3NQcmV2OwogIGludCBuZXdmbGFncyA9IDA7CgogIC8qCiAgICBGb3JtYXQgb2YgaGFybUZsYWdzUHJldjoKCiAgICBmaXJzdCB3b3JkID0gZmxhZ3MgZm9yIGhpZ2hlc3QgMTYgc2ZiIGJhbmRzIGluIHVzZQogICAgc2Vjb25kIHdvcmQgPSBmbGFncyBmb3IgbmV4dCBsb3dlciAxNiBzZmIgYmFuZHMgKGlmIHByZXNlbnQpCiAgICB0aGlyZCB3b3JkID0gZmxhZ3MgZm9yIGxvd2VzdCAxNiBzZmIgYmFuZHMgKGlmIHByZXNlbnQpCgogICAgVXAgdG8gTUFYX0ZSRVFfQ09FRkZTIHNmYiBiYW5kcyBjYW4gYmUgZmxhZ2dlZCBmb3IgYSBzaWduLgogICAgVGhlIGxvd2VzdCBiaXQgb2YgdGhlIGZpcnN0IHdvcmQgY29ycmVzcG9uZHMgdG8gdGhlIF9oaWdoZXN0XyBzZmIgYmFuZCBpbiB1c2UuCiAgICBUaGlzIGlzIGVuc3VyZXMgdGhhdCBlYWNoIGZsYWcgaXMgIG1hcHBlZCB0byB0aGUgc2FtZSBRTUYgYmFuZCBldmVuIGFmdGVyIGEKICAgIGNoYW5nZSBvZiB0aGUgY3Jvc3NvdmVyLWZyZXF1ZW5jeS4KICAqLwoKCiAgLyogUmVzZXQgdGhlIG91dHB1dCB2ZWN0b3IgZmlyc3QgKi8KICBGREttZW1zZXQoc2luZU1hcHBlZCwgTUFYX0VOVkVMT1BFUyxNQVhfRlJFUV9DT0VGRlMpOyAvKiBNQVhfRU5WRUxPUEVTIG1lYW5zICdubyBzaW5lJyAqLwoKICBmcmVxQmFuZFRhYmxlICs9IG5TZmI7CiAgYWRkSGFybW9uaWNzICArPSBuU2ZiLTE7CgogIGZvciAoaT1uU2ZiOyBpIT0wOyBpLS0pIHsKICAgIGludCB1aSA9ICpmcmVxQmFuZFRhYmxlLS07ICAgICAgICAgICAgICAgICAvKiBVcHBlciBsaW1pdCBvZiB0aGUgY3VycmVudCBzY2FsZSBmYWN0b3IgYmFuZC4gKi8KICAgIGludCBsaSA9ICpmcmVxQmFuZFRhYmxlOyAgICAgICAgICAgICAgICAgICAvKiBMb3dlciBsaW1pdCBvZiB0aGUgY3VycmVudCBzY2FsZSBmYWN0b3IgYmFuZC4gKi8KCiAgICBpZiAoICphZGRIYXJtb25pY3MtLSApIHsgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgYSBzaW5lIGluIHRoaXMgYmFuZCAqLwoKICAgICAgdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IGJpdGNvdW50OwogICAgICBuZXdmbGFncyB8PSBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBmbGFnICovCgogICAgICAvKgogICAgICAgIElmIHRoZXJlIHdhcyBhIHNpbmUgaW4gdGhlIGxhc3QgZnJhbWUsIGxldCBpdCBjb250aW51ZSBmcm9tIHRoZSBmaXJzdCBlbnZlbG9wZSBvbgogICAgICAgIGVsc2Ugc3RhcnQgYXQgdGhlIHRyYW5zaWVudCBwb3NpdGlvbi4KICAgICAgKi8KICAgICAgc2luZU1hcHBlZFsodWkrbGktbG93U3ViYmFuZDIpID4+IDFdID0gKCBvbGRmbGFncyAmIG1hc2sgKSA/IDAgOiB0cmFuRW52OwogICAgfQoKICAgIGlmICgoKytiaXRjb3VudCA9PSAxNikgfHwgaT09MSkgewogICAgICBiaXRjb3VudCA9IDA7CiAgICAgICpoYXJtRmxhZ3NQcmV2KysgPSBuZXdmbGFnczsKICAgICAgb2xkZmxhZ3MgPSAqaGFybUZsYWdzUHJldjsgICAgICAgICAgICAgICAvKiBGZXRjaCAxNiBvZiB0aGUgb2xkIGZsYWdzICovCiAgICAgIG5ld2ZsYWdzID0gMDsKICAgIH0KICB9Cn0KCgovKiEKICBcYnJpZWYgICAgIFJlZHVjZSBnYWluLWFkanVzdG1lbnQgaW5kdWNlZCBhbGlhc2luZyBmb3IgcmVhbCB2YWx1ZWQgZmlsdGVyYmFuay4KKi8KLypzdGF0aWMqLyB2b2lkCmFsaWFzaW5nUmVkdWN0aW9uKEZJWFBfREJMKiBkZWdyZWVBbGlhcywgICAgICAgLyohPCBlc3RpbWF0ZWQgYWxpYXNpbmcgZm9yIGVhY2ggUU1GIGNoYW5uZWwgKi8KICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgaW50KiAgICAgIHVzZUFsaWFzUmVkdWN0aW9uLCAvKiE8IHN5bnRoZXRpYyBzaW5lIGVuZ2VyZ3kgZm9yIGVhY2ggc3ViYmFuZCwgdXNlZCBhcyBmbGFnICovCiAgICAgICAgICAgICAgICAgIGludCAgICAgICBub1N1YmJhbmRzKSAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIGNoYW5uZWxzIHRvIHByb2Nlc3MgKi8KewogIEZJWFBfREJMKiBucmdHYWluICAgPSBucmdzLT5ucmdHYWluOyAgICAgICAgICAvKiE8IHN1YmJhbmQgZ2FpbnMgdG8gYmUgbW9kaWZpZWQgKi8KICBTQ0hBUiogICAgbnJnR2Fpbl9lID0gbnJncy0+bnJnR2Fpbl9lOyAgICAgICAgLyohPCBzdWJiYW5kIGdhaW5zIHRvIGJlIG1vZGlmaWVkIChleHBvbmVudHMpICovCiAgRklYUF9EQkwqIG5yZ0VzdCAgICA9IG5yZ3MtPm5yZ0VzdDsgICAgICAgICAgIC8qITwgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFtcGxpZmljYXRpb24gKi8KICBTQ0hBUiogICAgbnJnRXN0X2UgID0gbnJncy0+bnJnRXN0X2U7ICAgICAgICAgLyohPCBzdWJiYW5kIGVuZXJneSBiZWZvcmUgYW1wbGlmaWNhdGlvbiAoZXhwb25lbnRzKSAqLwogIGludCBncm91cGluZyA9IDAsIGluZGV4ID0gMCwgbm9Hcm91cHMsIGs7CiAgaW50IGdyb3VwVmVjdG9yW01BWF9GUkVRX0NPRUZGU107CgogIC8qIENhbGN1bGF0ZSBncm91cGluZyovCiAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHMtMTsgaysrICl7CiAgICBpZiAoIChkZWdyZWVBbGlhc1trICsgMV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIHVzZUFsaWFzUmVkdWN0aW9uW2tdICkgewogICAgICBpZihncm91cGluZz09MCl7CiAgICAgICAgZ3JvdXBWZWN0b3JbaW5kZXgrK10gPSBrOwogICAgICAgIGdyb3VwaW5nID0gMTsKICAgICAgfQogICAgICBlbHNlewogICAgICAgIGlmKGdyb3VwVmVjdG9yW2luZGV4LTFdICsgMyA9PSBrKXsKICAgICAgICAgIGdyb3VwVmVjdG9yW2luZGV4KytdID0gayArIDE7CiAgICAgICAgICBncm91cGluZyA9IDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlewogICAgICBpZihncm91cGluZyl7CiAgICAgICAgaWYodXNlQWxpYXNSZWR1Y3Rpb25ba10pCiAgICAgICAgICBncm91cFZlY3RvcltpbmRleCsrXSA9IGsgKyAxOwogICAgICAgIGVsc2UKICAgICAgICAgIGdyb3VwVmVjdG9yW2luZGV4KytdID0gazsKICAgICAgICBncm91cGluZyA9IDA7CiAgICAgIH0KICAgIH0KICB9CgogIGlmKGdyb3VwaW5nKXsKICAgIGdyb3VwVmVjdG9yW2luZGV4KytdID0gbm9TdWJiYW5kczsKICB9CiAgbm9Hcm91cHMgPSBpbmRleCA+PiAxOwoKCiAgLypDYWxjdWxhdGUgbmV3IGdhaW4qLwogIGZvciAoaW50IGdyb3VwID0gMDsgZ3JvdXAgPCBub0dyb3VwczsgZ3JvdXAgKyspIHsKICAgIEZJWFBfREJMIG5yZ09yaWcgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsgICAgLyogT3JpZ2luYWwgc2lnbmFsIGVuZXJneSBpbiBjdXJyZW50IGdyb3VwIG9mIGJhbmRzICovCiAgICBTQ0hBUiAgICBucmdPcmlnX2UgPSAwOwogICAgRklYUF9EQkwgbnJnQW1wID0gRkwyRlhDT05TVF9EQkwoMC4wZik7ICAgICAvKiBBbXBsaWZpZWQgc2lnbmFsIGVuZXJneSBpbiBncm91cCAodXNpbmcgY3VycmVudCBnYWlucykgKi8KICAgIFNDSEFSICAgIG5yZ0FtcF9lID0gMDsKICAgIEZJWFBfREJMIG5yZ01vZCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOyAgIC8qIFNpZ25hbCBlbmVyZ3kgaW4gZ3JvdXAgd2hlbiBhcHBseWluZyBtb2RpZmllZCBnYWlucyAqLwogICAgU0NIQVIgICAgbnJnTW9kX2UgPSAwOwogICAgRklYUF9EQkwgZ3JvdXBHYWluOyAgICAgICAgIC8qIFRvdGFsIGVuZXJneSBnYWluIGluIGdyb3VwICovCiAgICBTQ0hBUiAgICBncm91cEdhaW5fZTsKICAgIEZJWFBfREJMIGNvbXBlbnNhdGlvbjsgICAgICAvKiBDb21wZW5zYXRpb24gZmFjdG9yIGZvciB0aGUgZW5lcmd5IGNoYW5nZSB3aGVuIGFwcGx5aW5nIG1vZGlmaWVkIGdhaW5zICovCiAgICBTQ0hBUiAgICBjb21wZW5zYXRpb25fZTsKCiAgICBpbnQgc3RhcnRHcm91cCA9IGdyb3VwVmVjdG9yWzIqZ3JvdXBdOwogICAgaW50IHN0b3BHcm91cCAgPSBncm91cFZlY3RvclsyKmdyb3VwKzFdOwoKICAgIC8qIENhbGN1bGF0ZSB0b3RhbCBlbmVyZ3kgaW4gZ3JvdXAgYmVmb3JlIGFuZCBhZnRlciBhbXBsaWZpY2F0aW9uIHdpdGggY3VycmVudCBnYWluczogKi8KICAgIGZvcihrID0gc3RhcnRHcm91cDsgayA8IHN0b3BHcm91cDsgaysrKXsKICAgICAgLyogR2V0IG9yaWdpbmFsIGJhbmQgZW5lcmd5ICovCiAgICAgIEZJWFBfREJMIHRtcCA9IG5yZ0VzdFtrXTsKICAgICAgU0NIQVIgICAgdG1wX2UgPSBucmdFc3RfZVtrXTsKCiAgICAgIEZES19hZGRfTWFudEV4cCh0bXAsIHRtcF9lLCBucmdPcmlnLCBucmdPcmlnX2UsICZucmdPcmlnLCAmbnJnT3JpZ19lKTsKCiAgICAgIC8qIE11bHRpcGx5IGJhbmQgZW5lcmd5IHdpdGggY3VycmVudCBnYWluICovCiAgICAgIHRtcCA9IGZNdWx0KHRtcCxucmdHYWluW2tdKTsKICAgICAgdG1wX2UgPSB0bXBfZSArIG5yZ0dhaW5fZVtrXTsKCiAgICAgIEZES19hZGRfTWFudEV4cCh0bXAsIHRtcF9lLCBucmdBbXAsIG5yZ0FtcF9lLCAmbnJnQW1wLCAmbnJnQW1wX2UpOwogICAgfQoKICAgIC8qIENhbGN1bGF0ZSB0b3RhbCBlbmVyZ3kgZ2FpbiBpbiBncm91cCAqLwogICAgRkRLX2RpdmlkZV9NYW50RXhwKG5yZ0FtcCwgbnJnQW1wX2UsCiAgICAgICAgICAgICAgICAgICAgICAgbnJnT3JpZywgbnJnT3JpZ19lLAogICAgICAgICAgICAgICAgICAgICAgICZncm91cEdhaW4sICZncm91cEdhaW5fZSk7CgogICAgZm9yKGsgPSBzdGFydEdyb3VwOyBrIDwgc3RvcEdyb3VwOyBrKyspewogICAgICBGSVhQX0RCTCB0bXA7CiAgICAgIFNDSEFSICAgIHRtcF9lOwoKICAgICAgRklYUF9EQkwgYWxwaGEgPSBkZWdyZWVBbGlhc1trXTsKICAgICAgaWYgKGsgPCBub1N1YmJhbmRzIC0gMSkgewogICAgICAgIGlmIChkZWdyZWVBbGlhc1trICsgMV0gPiBhbHBoYSkKICAgICAgICAgIGFscGhhID0gZGVncmVlQWxpYXNbayArIDFdOwogICAgICB9CgogICAgICAvKiBNb2RpZnkgZ2FpbiBkZXBlbmRpbmcgb24gdGhlIGRlZ3JlZSBvZiBhbGlhc2luZyAqLwogICAgICBGREtfYWRkX01hbnRFeHAoIGZNdWx0KGFscGhhLGdyb3VwR2FpbiksIGdyb3VwR2Fpbl9lLAogICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIGFscGhhLG5yZ0dhaW5ba10pLCBucmdHYWluX2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgJm5yZ0dhaW5ba10sICZucmdHYWluX2Vba10gKTsKCiAgICAgIC8qIEFwcGx5IG1vZGlmaWVkIGdhaW4gdG8gb3JpZ2luYWwgZW5lcmd5ICovCiAgICAgIHRtcCA9IGZNdWx0KG5yZ0dhaW5ba10sbnJnRXN0W2tdKTsKICAgICAgdG1wX2UgPSBucmdHYWluX2Vba10gKyBucmdFc3RfZVtrXTsKCiAgICAgIC8qIEFjY3VtdWxhdGUgZW5lcmd5IHdpdGggbW9kaWZpZWQgZ2FpbnMgYXBwbGllZCAqLwogICAgICBGREtfYWRkX01hbnRFeHAoIHRtcCwgdG1wX2UsCiAgICAgICAgICAgICAgICAgICAgICAgbnJnTW9kLCBucmdNb2RfZSwKICAgICAgICAgICAgICAgICAgICAgICAmbnJnTW9kLCAmbnJnTW9kX2UgKTsKICAgIH0KCiAgICAvKiBDYWxjdWxhdGUgY29tcGVuc2F0aW9uIGZhY3RvciB0byByZXRhaW4gdGhlIGVuZXJneSBvZiB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLwogICAgRkRLX2RpdmlkZV9NYW50RXhwKG5yZ0FtcCwgbnJnQW1wX2UsCiAgICAgICAgICAgICAgICAgICAgICAgbnJnTW9kLCBucmdNb2RfZSwKICAgICAgICAgICAgICAgICAgICAgICAmY29tcGVuc2F0aW9uLCAmY29tcGVuc2F0aW9uX2UpOwoKICAgIC8qIEFwcGx5IGNvbXBlbnNhdGlvbiBmYWN0b3IgdG8gYWxsIGdhaW5zIG9mIHRoZSBncm91cCAqLwogICAgZm9yKGsgPSBzdGFydEdyb3VwOyBrIDwgc3RvcEdyb3VwOyBrKyspewogICAgICBucmdHYWluW2tdID0gZk11bHQobnJnR2FpbltrXSxjb21wZW5zYXRpb24pOwogICAgICBucmdHYWluX2Vba10gPSBucmdHYWluX2Vba10gKyBjb21wZW5zYXRpb25fZTsKICAgIH0KICB9Cn0KCgogLyogQ29udmVydCBoZWFkcm9vbSBiaXRzIHRvIGV4cG9uZW50ICovCiNkZWZpbmUgU0NBTEUyRVhQKHMpICgxNS0ocykpCiNkZWZpbmUgRVhQMlNDQUxFKGUpICgxNS0oZSkpCgovKiEKICBcYnJpZWYgIEFwcGx5IHNwZWN0cmFsIGVudmVsb3BlIHRvIHN1YmJhbmQgc2FtcGxlcwoKICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHNicl9kZWMuY3BwIGluIGVhY2ggZnJhbWUuCgogIFRvIGVuaGFuY2UgYWNjdXJhY3kgYW5kIGR1ZSB0byB0aGUgdXNhZ2Ugb2YgdGFibGVzIGZvciBzcXVhcmVyb290cyBhbmQKICBpbnZlcnNlLCBzb21lIGNhbGN1bGF0aW9ucyBhcmUgcGVyZm9ybWVkIHdpdGggdGhlIG9wZXJhbmRzIGJlaW5nIHNwbGl0CiAgaW50byBtYW50aXNzYSBhbmQgZXhwb25lbnQuIFRoZSB2YXJpYWJsZSBuYW1lcyBpbiB0aGUgc291cmNlIGNvZGUgY2FycnkKICB0aGUgc3VmZml4ZXMgPGVtPl9tPC9lbT4gYW5kICA8ZW0+X2U8L2VtPiByZXNwZWN0aXZlbHkuIFRoZSBjb250cm9sIGRhdGEKICBpbiAjaEZyYW1lRGF0YSBjb250YWludHMgZW52ZWxvcGUgZGF0YSB3aGljaCBpcyByZXByZXNlbnRlZCBieSB0aGlzIGZvcm1hdCBidXQKICBzdG9yZWQgaW4gc2luZ2xlIHdvcmRzLiAoU2VlIHJlcXVhbnRpemVFbnZlbG9wZURhdGEoKSBmb3IgZGV0YWlscykuIFRoaXMgZGF0YQogIGlzIHVucGFja2VkIHdpdGhpbiBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIHRvIGZvbGxvdyB0aGUgZGVzY3JpYmVkIHN1ZmZpeCBjb252ZW50aW9uLgoKICBUaGUgYWN0dWFsIHZhbHVlIChjb21wYXJhYmxlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZsb2F0LXZhcmlhYmxlIGluIHRoZQogIHJlc2VhcmNoLWltcGxlbWVudGF0aW9uKSBvZiBhIG1hbnRpc3NhL2V4cG9uZW50LXBhaXIgY2FuIGJlIGNhbGN1bGF0ZWQgYXMKCiAgXGYkIHZhbHVlID0gdmFsdWVcX20gKiAyXnt2YWx1ZVxfZX0gXGYkCgogIEFsbCBlbmVyZ2llcyBhbmQgbm9pc2UgbGV2ZWxzIGRlY29kZWQgZnJvbSB0aGUgYml0c3RyZWFtIHN1aXQgZm9yIGFuCiAgb3JpZ2luYWwgc2lnbmFsIG1hZ25pdHVkZSBvZiBcZiRccG0gMzI3NjggXGYkIHJhdGhlciB0aGFuIFxmJCBccG0gMVxmJC4gVGhlcmVmb3JlLAogIHRoZSBzY2FsZSBmYWN0b3IgPGVtPmhiX3NjYWxlPC9lbT4gcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNvbnZlcnRlZAogIHRvIGFuICdpbnB1dCBleHBvbmVudCcgKCNpbnB1dF9lKSwgd2hpY2ggZml0cyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCgogIEJlZm9yZSB0aGUgYWN0dWFsIHByb2Nlc3NpbmcsIGFuIGV4cG9uZW50ICNhZGpfZSBmb3IgcmVzdWx0aW5nIGFkanVzdGVkCiAgc2FtcGxlcyBpcyBkZXJpdmVkIGZyb20gdGhlIG1heGltdW0gcmVmZXJlbmNlIGVuZXJneS4KCiAgVGhlbiwgZm9yIGVhY2ggZW52ZWxvcGUsIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHBlcmZvcm1lZDoKCiAgXGxpIENhbGN1bGF0ZSBlbmVyZ3kgaW4gdGhlIHNpZ25hbCB0byBiZSBhZGp1c3RlZC4gRGVwZW5kaW5nIG9uIHRoZSB0aGUgdmFsdWUgb2YKICAgICAgI2ludGVycG9sRnJlcSAoaW50ZXJwb2xhdGlvbiBtb2RlKSwgdGhpcyBpcyBlaXRoZXIgZG9uZSBzZXBlcmF0ZWx5CiAgICAgIGZvciBlYWNoIFFNRi1zdWJiYW5kIG9yIGZvciBlYWNoIFNCUi1iYW5kLgogICAgICBUaGUgcmVzdWx0aW5nIGVuZXJnaWVzIGFyZSBzdG9yZWQgaW4gI25yZ0VzdF9tWyNNQVhfRlJFUV9DT0VGRlNdIChtYW50aXNzYXMpCiAgICAgIGFuZCAjbnJnRXN0X2VbI01BWF9GUkVRX0NPRUZGU10gKGV4cG9uZW50cykuCiAgXGxpIENhbGN1bGF0ZSBnYWluIGFuZCBub2lzZSBsZXZlbCBmb3IgZWFjaCBzdWJiYW5kOjxicj4KICAgICAgXGYkIGdhaW4gID0gXHNxcnR7IFxmcmFje25yZ1JlZn17bnJnRXN0fSBcY2RvdCAoMSAtIG5vaXNlUmF0aW8pIH0KICAgICAgICAgIFxoc3BhY2V7MmNtfQogICAgICAgICAgbm9pc2UgPSBcc3FydHsgbnJnUmVmIFxjZG90IG5vaXNlUmF0aW8gfQogICAgICBcZiQ8YnI+CiAgICAgIHdoZXJlIDxlbT5ub2lzZVJhdGlvPC9lbT4gYW5kIDxlbT5ucmdSZWY8L2VtPiBhcmUgZXh0cmFjdGVkIGZyb20gdGhlCiAgICAgIGJpdHN0cmVhbSBhbmQgPGVtPm5yZ0VzdDwvZW0+IGlzIHRoZSBzdWJiYW5kIGVuZXJneSBiZWZvcmUgYWRqdXN0bWVudC4KICAgICAgVGhlIHJlc3VsdGluZyBnYWlucyBhcmUgc3RvcmVkIGluICNucmdHYWluX21bI01BWF9GUkVRX0NPRUZGU10KICAgICAgKG1hbnRpc3NhcykgYW5kICNucmdHYWluX2VbI01BWF9GUkVRX0NPRUZGU10gKGV4cG9uZW50cyksIHRoZSBub2lzZSBsZXZlbHMKICAgICAgYXJlIHN0b3JlZCBpbiAjbm9pc2VMZXZlbF9tWyNNQVhfRlJFUV9DT0VGRlNdIGFuZCAjbm9pc2VMZXZlbF9lWyNNQVhfRlJFUV9DT0VGRlNdCiAgICAgIChleHBvbmVudHMpLgogICAgICBUaGUgc2luZSBsZXZlbHMgYXJlIHN0b3JlZCBpbiAjbnJnU2luZV9tWyNNQVhfRlJFUV9DT0VGRlNdCiAgICAgIGFuZCAjbnJnU2luZV9lWyNNQVhfRlJFUV9DT0VGRlNdLgogIFxsaSBOb2lzZSBsaW1pdGluZzogVGhlIGdhaW4gZm9yIGVhY2ggc3ViYmFuZCBpcyBsaW1pdGVkIGJvdGggYWJzb2x1dGVseQogICAgICBhbmQgcmVsYXRpdmVseSBjb21wYXJlZCB0byB0aGUgdG90YWwgZ2FpbiBvdmVyIGFsbCBzdWJiYW5kcy4KICBcbGkgQm9vc3QgZ2FpbjogQ2FsY3VsYXRlIGFuZCBhcHBseSBib29zdCBmYWN0b3IgZm9yIGVhY2ggbGltaXRlciBiYW5kCiAgICAgIGluIG9yZGVyIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBlbmVyZ3kgbG9zcyBpbXBvc2VkIGJ5IHRoZSBsaW1pdGluZy4KICBcbGkgQXBwbHkgZ2FpbnMgYW5kIGFkZCBub2lzZTogVGhlIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgYXJlIGFwcGxpZWQKICAgICAgdG8gYWxsIHRpbWVzbG90cyBvZiB0aGUgY3VycmVudCBlbnZlbG9wZS4gQSBzaG9ydCBGSVItZmlsdGVyIChsZW5ndGggNAogICAgICBRTUYtdGltZXNsb3RzKSBjYW4gYmUgdXNlZCB0byBzbW9vdGggdGhlIHN1ZGRlbiBjaGFuZ2UgYXQgdGhlIGVudmVsb3BlIGJvcmRlcnMuCiAgICAgIEVhY2ggY29tcGxleCBzdWJiYW5kIHNhbXBsZSBvZiB0aGUgY3VycmVudCB0aW1lc2xvdCBpcyBtdWx0aXBsaWVkIGJ5IHRoZQogICAgICBzbW9vdGhlZCBnYWluLCB0aGVuIHJhbmRvbSBub2lzZSB3aXRoIHRoZSBjYWxjdWxhdGVkIGxldmVsIGlzIGFkZGVkLgoKICBcbm90ZQogIFRvIHJlZHVjZSB0aGUgc3RhY2sgc2l6ZSwgc29tZSBvZiB0aGUgbG9jYWwgYXJyYXlzIGNvdWxkIGJlIGxvY2F0ZWQgd2l0aGluCiAgdGhlIHRpbWUgb3V0cHV0IGJ1ZmZlci4gT2YgdGhlIDUxMiBzYW1wbGVzIHRlbXBvcmFyaWx5IGF2YWlsYWJsZSB0aGVyZSwKICBhYm91dCBoYWxmIHRoZSBzaXplIGlzIGFscmVhZHkgdXNlZCBieSAjU0JSX0ZSQU1FX0RBVEEuIEEgcG9pbnRlciB0byB0aGUKICByZW1haW5pbmcgZnJlZSBtZW1vcnkgY291bGQgYmUgc3VwcGxpZWQgYnkgYW4gYWRkaXRpb25hbCBhcmd1bWVudCB0byBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpCiAgaW4gc2JyX2RlYzoKCiAgXHBhcgogIFxjb2RlCiAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoJmhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjLT5TYnJDYWxjdWxhdGVFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlclJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVySW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0UHRyICsgc2l6ZW9mKFNCUl9GUkFNRV9EQVRBKS9zaXplb2YoRmxvYXQpICsgMSk7CiAgXGVuZGNvZGUKCiAgXHBhcgogIFdpdGhpbiBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpLCBzb21lIHBvaW50ZXJzIGNvdWxkIGJlIGRlZmluZWQgaW5zdGVhZCBvZiB0aGUgYXJyYXlzCiAgI25yZ1JlZl9tLCAjbnJnUmVmX2UsICNucmdFc3RfbSwgI25yZ0VzdF9lLCAjbm9pc2VMZXZlbF9tOgoKICBccGFyCiAgXGNvZGUKICAgIGZyYWN0KiAgICAgICAgbnJnUmVmX20gPSB0aW1lT3V0UHRyOwogICAgU0NIQVIqICAgICAgICBucmdSZWZfZSA9IG5yZ1JlZl9tICsgTUFYX0ZSRVFfQ09FRkZTOwogICAgZnJhY3QqICAgICAgICBucmdFc3RfbSA9IG5yZ1JlZl9lICsgTUFYX0ZSRVFfQ09FRkZTOwogICAgU0NIQVIqICAgICAgICBucmdFc3RfZSA9IG5yZ0VzdF9tICsgTUFYX0ZSRVFfQ09FRkZTOwogICAgZnJhY3QqICAgICAgICBub2lzZUxldmVsX20gPSBucmdFc3RfZSArIE1BWF9GUkVRX0NPRUZGUzsKICBcZW5kY29kZQoKICA8YnI+CiovCnZvaWQKY2FsY3VsYXRlU2JyRW52ZWxvcGUgKFFNRl9TQ0FMRV9GQUNUT1IgICpzYnJTY2FsZUZhY3RvciwgICAgICAgICAgIC8qITwgU2NhbGluZyBmYWN0b3JzICovCiAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LCAvKiE8IEhhbmRsZSB0byBzdHJ1Y3QgZmlsbGVkIGJ5IHRoZSBjcmVhdGUtZnVuY3Rpb24gKi8KICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhLCAgICAgICAgICAgLyohPCBDb250cm9sIGRhdGEgb2YgY3VycmVudCBmcmFtZSAqLwogICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJSZWFsLCAgICAgICAgICAgICAgICAgLyohPCBSZWFsIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCAqLwogICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJJbWFnLCAgICAgICAgICAgICAgICAgLyohPCBJbWFnIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCAqLwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVzZUxQLAogICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFc3RpbWF0ZWQgYWxpYXNpbmcgZm9yIGVhY2ggUU1GIGNoYW5uZWwgKi8KICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVFcnJvckZsYWcKICAgICAgICAgICAgICAgICAgICAgICkKewogIGludCBjLCBpLCBqLCBlbnZOb2lzZSA9IDA7CiAgVUNIQVIqICAgYm9yZGVycyA9IGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzOwoKICBGSVhQX1NHTCAqbm9pc2VMZXZlbHMgICAgICAgPSBoRnJhbWVEYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWw7CiAgSEFORExFX0ZSRVFfQkFORF9EQVRBIGhGcmVxID0gJmhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGE7CgogIGludCBsb3dTdWJiYW5kICA9IGhGcmVxLT5sb3dTdWJiYW5kOwogIGludCBoaWdoU3ViYmFuZCA9IGhGcmVxLT5oaWdoU3ViYmFuZDsKICBpbnQgbm9TdWJiYW5kcyAgPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CgogIGludCAgICBub05vaXNlQmFuZHMgPSBoRnJlcS0+bk5mYjsKICBpbnQgICAgbm9fY29scyAgICAgID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcDsKICBVQ0hBUiAgZmlyc3Rfc3RhcnQgID0gYm9yZGVyc1swXSAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcDsKCiAgU0NIQVIgIHNpbmVNYXBwZWRbTUFYX0ZSRVFfQ09FRkZTXTsKICBTQ0hBUiAgb3ZfYWRqX2UgPSBTQ0FMRTJFWFAoc2JyU2NhbGVGYWN0b3ItPm92X2hiX3NjYWxlKTsKICBTQ0hBUiAgYWRqX2UgPSAwOwogIFNDSEFSICBvdXRwdXRfZTsKICBTQ0hBUiAgZmluYWxfZSA9IDA7CgogIFNDSEFSICBtYXhHYWluTGltaXRfZSA9IChmcmFtZUVycm9yRmxhZykgPyBNQVhfR0FJTl9DT05DRUFMX0VYUCA6IE1BWF9HQUlOX0VYUDsKCiAgaW50IHVzZUFsaWFzUmVkdWN0aW9uWzY0XTsKICBVQ0hBUiBzbW9vdGhfbGVuZ3RoID0gMDsKCiAgRklYUF9TR0wgKiBwSWVudiA9IGhGcmFtZURhdGEtPmlFbnZlbG9wZTsKCiAgLyoKICAgIEV4dHJhY3Qgc2luZSBmbGFncyBmb3IgYWxsIFFNRiBiYW5kcwogICovCiAgbWFwU2luZUZsYWdzKGhGcmVxLT5mcmVxQmFuZFRhYmxlWzFdLAogICAgICAgICAgICAgICBoRnJlcS0+blNmYlsxXSwKICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+YWRkSGFybW9uaWNzLAogICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5oYXJtRmxhZ3NQcmV2LAogICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5mcmFtZUluZm8udHJhbkVudiwKICAgICAgICAgICAgICAgc2luZU1hcHBlZCk7CgoKICAvKgogICAgU2NhbiBmb3IgbWF4aW11bSBpbiBidWZmZXJkIG5vaXNlIGxldmVscy4KICAgIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhhdCB3ZSBoYWQgc3Ryb25nIG5vaXNlIGluIHRoZSBwcmV2aW91cyBmcmFtZQogICAgd2hpY2ggaXMgc21vb3RoZWQgaW50byB0aGUgY3VycmVudCBmcmFtZS4KICAgIFRoZSByZXN1bHRpbmcgZXhwb25lbnQgaXMgdXNlZCBhcyBzdGFydCB2YWx1ZSBmb3IgdGhlIG1heGltdW0gc2VhcmNoCiAgICBpbiByZWZlcmVuY2UgZW5lcmdpZXMKICAqLwogIGlmICghdXNlTFApCiAgICBhZGpfZSA9IGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gZ2V0U2NhbGVmYWN0b3IoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlLCBub1N1YmJhbmRzKTsKCiAgLyoKICAgIFNjYW4gZm9yIG1heGltdW0gcmVmZXJlbmNlIGVuZXJneSB0byBiZSBhYmxlCiAgICB0byBzZWxlY3QgYXBwcm9wcmlhdGUgdmFsdWVzIGZvciBhZGpfZSBhbmQgZmluYWxfZS4KICAqLwoKICBmb3IgKGkgPSAwOyBpIDwgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXM7IGkrKykgewogICAgSU5UIG1heFNmYk5yZ19lID0gLUZSQUNUX0JJVFMrTlJHX0VYUF9PRkZTRVQ7IC8qIHN0YXJ0IHZhbHVlIGZvciBtYXhpbXVtIHNlYXJjaCAqLwoKICAgIC8qIEZldGNoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBjdXJyZW50IGVudmVsb3BlOiAqLwogICAgZm9yIChqPWhGcmVxLT5uU2ZiW2hGcmFtZURhdGEtPmZyYW1lSW5mby5mcmVxUmVzW2ldXTsgaiE9MDsgai0tKSB7CiAgICAgIG1heFNmYk5yZ19lID0gZml4TWF4KG1heFNmYk5yZ19lLChJTlQpKChMT05HKSgqcEllbnYrKykgJiBNQVNLX0UpKTsKICAgIH0KICAgIG1heFNmYk5yZ19lIC09IE5SR19FWFBfT0ZGU0VUOwoKICAgIC8qIEVuZXJneSAtPiBtYWduaXR1ZGUgKHNxcnQgaGFsZmVucyBleHBvbmVudCkgKi8KICAgIG1heFNmYk5yZ19lID0gKG1heFNmYk5yZ19lKzEpID4+IDE7ICAvKiArMSB0byBnbyBzYWZlIChyb3VuZCB0byBuZXh0IGhpZ2hlciBpbnQpICovCgogICAgLyogU29tZSBzYWZldHkgbWFyZ2luIGlzIG5lZWRlZCBmb3IgMiByZWFzb25zOgogICAgICAgLSBUaGUgc2lnbmFsIGVuZXJneSBpcyBub3QgZXF1YWxseSBzcHJlYWQgb3ZlciBhbGwgc3ViYmFuZCBzYW1wbGVzIGluCiAgICAgICAgIGEgc3BlY2lmaWMgc2ZiIG9mIGFuIGVudmVsb3BlIChOcmcgY291bGQgYmUgdG9vIGhpZ2ggYnkgYSBmYWN0b3Igb2YKICAgICAgICAgZW52V2lkdGggKiBzZmJXaWR0aCkKICAgICAgIC0gU21vb3RoaW5nIGNhbiBzbWVhciBoaWdoIGdhaW5zIG9mIHRoZSBwcmV2aW91cyBlbnZlbG9wZSBpbnRvIHRoZSBjdXJyZW50CiAgICAqLwogICAgbWF4U2ZiTnJnX2UgKz0gNjsKCiAgICBpZiAoYm9yZGVyc1tpXSA8IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMpCiAgICAgIC8qIFRoaXMgZW52ZWxvcGUgYWZmZWN0cyB0aW1lc2xvdHMgdGhhdCBiZWxvbmcgdG8gdGhlIG91dHB1dCBmcmFtZSAqLwogICAgICBhZGpfZSA9IChtYXhTZmJOcmdfZSA+IGFkal9lKSA/IG1heFNmYk5yZ19lIDogYWRqX2U7CgogICAgaWYgKGJvcmRlcnNbaSsxXSA+IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMpCiAgICAgIC8qIFRoaXMgZW52ZWxvcGUgYWZmZWN0cyB0aW1lc2xvdHMgYWZ0ZXIgdGhlIG91dHB1dCBmcmFtZSAqLwogICAgICBmaW5hbF9lID0gIChtYXhTZmJOcmdfZSA+IGZpbmFsX2UpID8gbWF4U2ZiTnJnX2UgOiBmaW5hbF9lOwoKICB9CgogIC8qCiAgICBDYWxjdWxhdGUgYWRqdXN0bWVudCBmYWN0b3JzIGFuZCBhcHBseSB0aGVtIGZvciBldmVyeSBlbnZlbG9wZS4KICAqLwogIHBJZW52ID0gaEZyYW1lRGF0YS0+aUVudmVsb3BlOwoKICBmb3IgKGkgPSAwOyBpIDwgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXM7IGkrKykgewoKICAgIGludCBrLCBub05vaXNlRmxhZzsKICAgIFNDSEFSICBub2lzZV9lLCBpbnB1dF9lID0gU0NBTEUyRVhQKHNiclNjYWxlRmFjdG9yLT5oYl9zY2FsZSk7CiAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocE5yZ3MsIEVOVl9DQUxDX05SR1MsIDEpOwoKICAgIC8qCiAgICAgIEhlbHBlciB2YXJpYWJsZXMuCiAgICAqLwogICAgVUNIQVIgc3RhcnRfcG9zID0gaEhlYWRlckRhdGEtPnRpbWVTdGVwICogYm9yZGVyc1tpXTsgIC8qIFN0YXJ0LXBvc2l0aW9uIGluIHRpbWUgKHN1YmJhbmQgc2FtcGxlKSBmb3IgY3VycmVudCBlbnZlbG9wZS4gKi8KICAgIFVDSEFSIHN0b3BfcG9zID0gaEhlYWRlckRhdGEtPnRpbWVTdGVwICogYm9yZGVyc1tpKzFdOyAvKiBTdG9wLXBvc2l0aW9uIGluIHRpbWUgKHN1YmJhbmQgc2FtcGxlKSBmb3IgY3VycmVudCBlbnZlbG9wZS4gKi8KICAgIFVDSEFSIGZyZXFfcmVzID0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmZyZXFSZXNbaV07ICAgICAvKiBGcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgY3VycmVudCBlbnZlbG9wZS4gKi8KCgogICAgLyogQWx3YXlzIGRvIGZ1bGx5IGluaXRpYWxpemUgdGhlIHRlbXBvcmFyeSBlbmVyZ3kgdGFibGUuIFRoaXMgcHJldmVudHMgbmVnYXRpdmUgZW5lcmdpZXMgYW5kIGV4dHJlbWUgZ2FpbiBmYWN0b3JzIGluCiAgICAgICBjYXNlcyB3aGVyZSB0aGUgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIHN1YmJhbmRzLiBUaGUgbGF0dGVyIGNhbiBiZSBjYXVzZWQgYnkgdW5kZXRlY3RlZCBiaXQKICAgICAgIGVycm9ycyBhbmQgaXMgdGVzdGVkIGJ5IHNvbWUgc3RyZWFtcyBmcm9tIHRoZSBjZXJ0aWZpY2F0aW9uIHNldC4gKi8KICAgIEZES21lbWNsZWFyKHBOcmdzLCBzaXplb2YoRU5WX0NBTENfTlJHUykpOwoKICAgIC8qIElmIHRoZSBzdGFydC1wb3Mgb2YgdGhlIGN1cnJlbnQgZW52ZWxvcGUgZXF1YWxzIHRoZSBzdG9wIHBvcyBvZiB0aGUgY3VycmVudAogICAgICAgbm9pc2UgZW52ZWxvcGUsIGluY3JlYXNlIHRoZSBwb2ludGVyIChpLmUuIGNob29zZSB0aGUgbmV4dCBub2lzZS1mbG9vcikuKi8KICAgIGlmIChib3JkZXJzW2ldID09IGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzTm9pc2VbZW52Tm9pc2UrMV0pewogICAgICBub2lzZUxldmVscyArPSBub05vaXNlQmFuZHM7ICAgLyogVGhlIG5vaXNlIGZsb29yIGRhdGEgaXMgc3RvcmVkIGluIGEgcm93IFtub2lzZUZsb29yMSBub2lzZUZsb29yMi4uLl0uKi8KICAgICAgZW52Tm9pc2UrKzsKICAgIH0KCiAgICBpZihpPT1oRnJhbWVEYXRhLT5mcmFtZUluZm8udHJhbkVudiB8fCBpPT1oX3Nicl9jYWxfZW52LT5wcmV2VHJhbkVudikgLyogYXR0YWNrICovCiAgICB7CiAgICAgIG5vTm9pc2VGbGFnID0gMTsKICAgICAgaWYgKCF1c2VMUCkKICAgICAgICBzbW9vdGhfbGVuZ3RoID0gMDsgIC8qIE5vIHNtb290aGluZyBvbiBhdHRhY2tzISAqLwogICAgfQogICAgZWxzZSB7CiAgICAgIG5vTm9pc2VGbGFnID0gMDsKICAgICAgaWYgKCF1c2VMUCkKICAgICAgICBzbW9vdGhfbGVuZ3RoID0gKDEgLSBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zbW9vdGhpbmdMZW5ndGgpIDw8IDI7ICAvKiBjYW4gYmVjb21lIGVpdGhlciAwIG9yIDQgKi8KICAgIH0KCgogICAgLyoKICAgICAgRW5lcmd5IGVzdGltYXRpb24gaW4gdHJhbnNwb3NlZCBoaWdoYmFuZC4KICAgICovCiAgICBpZiAoaEhlYWRlckRhdGEtPmJzX2RhdGEuaW50ZXJwb2xGcmVxKQogICAgICBjYWxjTnJnUGVyU3ViYmFuZChhbmFseXNCdWZmZXJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsIGhpZ2hTdWJiYW5kLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsIHN0b3BfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9lLAogICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnRXN0LAogICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnRXN0X2UpOwogICAgZWxzZQogICAgICBjYWxjTnJnUGVyU2ZiKGFuYWx5c0J1ZmZlclJlYWwsCiAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgIGhGcmVxLT5uU2ZiW2ZyZXFfcmVzXSwKICAgICAgICAgICAgICAgICAgICBoRnJlcS0+ZnJlcUJhbmRUYWJsZVtmcmVxX3Jlc10sCiAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLCBzdG9wX3BvcywKICAgICAgICAgICAgICAgICAgICBpbnB1dF9lLAogICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdFc3QsCiAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0VzdF9lKTsKCiAgICAvKgogICAgICBDYWxjdWxhdGUgc3ViYmFuZCBnYWlucwogICAgKi8KICAgIHsKICAgICAgVUNIQVIgKiB0YWJsZSA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlW2ZyZXFfcmVzXTsKICAgICAgVUNIQVIgKiBwVWlOb2lzZSA9ICZoRnJlcS0+ZnJlcUJhbmRUYWJsZU5vaXNlWzFdOyAvKiEgVXBwZXIgbGltaXQgb2YgdGhlIGN1cnJlbnQgbm9pc2UgZmxvb3IgYmFuZC4gKi8KCiAgICAgIEZJWFBfU0dMICogcE5vaXNlTGV2ZWxzID0gbm9pc2VMZXZlbHM7CgogICAgICBGSVhQX0RCTCB0bXBOb2lzZSA9IEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSgoTE9ORykoKnBOb2lzZUxldmVscykgJiBNQVNLX00pKTsKICAgICAgU0NIQVIgICAgdG1wTm9pc2VfZSA9IChVQ0hBUikoKExPTkcpKCpwTm9pc2VMZXZlbHMrKykgJiBNQVNLX0UpIC0gTk9JU0VfRVhQX09GRlNFVDsKCiAgICAgIGludCBjYyA9IDA7CiAgICAgIGMgPSAwOwogICAgICBmb3IgKGogPSAwOyBqIDwgaEZyZXEtPm5TZmJbZnJlcV9yZXNdOyBqKyspIHsKCiAgICAgICAgRklYUF9EQkwgcmVmTnJnICAgPSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwSWVudikgJiBNQVNLX00pKTsKICAgICAgICBTQ0hBUiAgICByZWZOcmdfZSA9IChTQ0hBUikoKExPTkcpKCpwSWVudikgJiBNQVNLX0UpIC0gTlJHX0VYUF9PRkZTRVQ7CgogICAgICAgIFVDSEFSIHNpbmVQcmVzZW50RmxhZyA9IDA7CiAgICAgICAgaW50IGxpID0gdGFibGVbal07CiAgICAgICAgaW50IHVpID0gdGFibGVbaisxXTsKCiAgICAgICAgZm9yIChrPWxpOyBrPHVpOyBrKyspIHsKICAgICAgICAgIHNpbmVQcmVzZW50RmxhZyB8PSAoaSA+PSBzaW5lTWFwcGVkW2NjXSk7CiAgICAgICAgICBjYysrOwogICAgICAgIH0KCiAgICAgICAgZm9yIChrPWxpOyBrPHVpOyBrKyspIHsKICAgICAgICAgIGlmIChrID49ICpwVWlOb2lzZSkgewogICAgICAgICAgICB0bXBOb2lzZSA9IEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSgoTE9ORykoKnBOb2lzZUxldmVscykgJiBNQVNLX00pKTsKICAgICAgICAgICAgdG1wTm9pc2VfZSA9IChTQ0hBUikoKExPTkcpKCpwTm9pc2VMZXZlbHMrKykgJiBNQVNLX0UpIC0gTk9JU0VfRVhQX09GRlNFVDsKCiAgICAgICAgICAgIHBVaU5vaXNlKys7CiAgICAgICAgICB9CgogICAgICAgICAgRkRLX0FTU0VSVChrID49IGxvd1N1YmJhbmQpOwoKICAgICAgICAgIGlmICh1c2VMUCkKICAgICAgICAgICAgdXNlQWxpYXNSZWR1Y3Rpb25bay1sb3dTdWJiYW5kXSA9ICFzaW5lUHJlc2VudEZsYWc7CgogICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVbY10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICAgIHBOcmdzLT5ucmdTaW5lX2VbY10gPSAwOwoKICAgICAgICAgIGNhbGNTdWJiYW5kR2FpbihyZWZOcmcsIHJlZk5yZ19lLCBwTnJncywgYywKICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBOb2lzZSwgdG1wTm9pc2VfZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5lUHJlc2VudEZsYWcsIGkgPj0gc2luZU1hcHBlZFtjXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBub05vaXNlRmxhZyk7CgogICAgICAgICAgcE5yZ3MtPm5yZ1JlZltjXSAgID0gcmVmTnJnOwogICAgICAgICAgcE5yZ3MtPm5yZ1JlZl9lW2NdID0gcmVmTnJnX2U7CgogICAgICAgICAgYysrOwogICAgICAgIH0KICAgICAgICBwSWVudisrOwogICAgICB9CiAgICB9CgogICAgLyoKICAgICAgTm9pc2UgbGltaXRpbmcKICAgICovCgogICAgZm9yIChjID0gMDsgYyA8IGhGcmVxLT5ub0xpbWl0ZXJCYW5kczsgYysrKSB7CgogICAgICBGSVhQX0RCTCBzdW1SZWYsIGJvb3N0R2FpbiwgbWF4R2FpbjsKICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICBTQ0hBUiAgIHN1bVJlZl9lLCBib29zdEdhaW5fZSwgbWF4R2Fpbl9lLCBhY2N1X2UgPSAwOwoKICAgICAgY2FsY0F2Z0dhaW4ocE5yZ3MsCiAgICAgICAgICAgICAgICAgIGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdLCBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjKzFdLAogICAgICAgICAgICAgICAgICAmc3VtUmVmLCAmc3VtUmVmX2UsCiAgICAgICAgICAgICAgICAgICZtYXhHYWluLCAmbWF4R2Fpbl9lKTsKCiAgICAgIC8qIE11bHRpcGx5IG1heEdhaW4gd2l0aCBsaW1pdGVyR2FpbjogKi8KICAgICAgbWF4R2FpbiA9IGZNdWx0KG1heEdhaW4sIEZES19zYnJEZWNvZGVyX3Nicl9saW1HYWluc19tW2hIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJHYWluc10pOwogICAgICBtYXhHYWluX2UgKz0gRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbaEhlYWRlckRhdGEtPmJzX2RhdGEubGltaXRlckdhaW5zXTsKCiAgICAgIC8qIFNjYWxlIG1hbnRpc3NhIG9mIE1heEdhaW4gaW50byByYW5nZSBiZXR3ZWVuIDAuNSBhbmQgMTogKi8KICAgICAgaWYgKG1heEdhaW4gPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpCiAgICAgICAgbWF4R2Fpbl9lID0gLUZSQUNUX0JJVFM7CiAgICAgIGVsc2UgewogICAgICAgIFNDSEFSIGNoYXJUZW1wID0gQ291bnRMZWFkaW5nQml0cyhtYXhHYWluKTsKICAgICAgICBtYXhHYWluX2UgLT0gY2hhclRlbXA7CiAgICAgICAgbWF4R2FpbiAgPDw9IChpbnQpY2hhclRlbXA7CiAgICAgIH0KCiAgICAgIGlmIChtYXhHYWluX2UgPj0gbWF4R2FpbkxpbWl0X2UpIHsgLyogdXBwZXIgbGltaXQgKGUuZy4gOTYgZEIpICovCiAgICAgICAgbWF4R2FpbiA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOwogICAgICAgIG1heEdhaW5fZSA9IG1heEdhaW5MaW1pdF9lOwogICAgICB9CgoKICAgICAgLyogRXZlcnkgc3ViYmFuZCBnYWluIGlzIGNvbXBhcmVkIHRvIHRoZSBzY2FsZWQgImF2ZXJhZ2UgZ2FpbiIKICAgICAgICAgYW5kIGxpbWl0ZWQgaWYgbmVjZXNzYXJ5OiAqLwogICAgICBmb3IgKGsgPSBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjXTsgayA8IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2MrMV07IGsrKykgewogICAgICAgIGlmICggKHBOcmdzLT5ucmdHYWluX2Vba10gPiBtYXhHYWluX2UpIHx8IChwTnJncy0+bnJnR2Fpbl9lW2tdID09IG1heEdhaW5fZSAmJiBwTnJncy0+bnJnR2FpbltrXT5tYXhHYWluKSApIHsKCiAgICAgICAgICBGSVhQX0RCTCBub2lzZUFtcDsKICAgICAgICAgIFNDSEFSICAgIG5vaXNlQW1wX2U7CgogICAgICAgICAgRkRLX2RpdmlkZV9NYW50RXhwKG1heEdhaW4sIG1heEdhaW5fZSwgcE5yZ3MtPm5yZ0dhaW5ba10sIHBOcmdzLT5ucmdHYWluX2Vba10sICZub2lzZUFtcCwgJm5vaXNlQW1wX2UpOwogICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gICAgPSBmTXVsdChwTnJncy0+bm9pc2VMZXZlbFtrXSxub2lzZUFtcCk7CiAgICAgICAgICBwTnJncy0+bm9pc2VMZXZlbF9lW2tdICs9IG5vaXNlQW1wX2U7CiAgICAgICAgICBwTnJncy0+bnJnR2FpbltrXSAgICAgICA9IG1heEdhaW47CiAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdICAgICA9IG1heEdhaW5fZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIC0tIEJvb3N0IGdhaW4KICAgICAgICBDYWxjdWxhdGUgYW5kIGFwcGx5IGJvb3N0IGZhY3RvciBmb3IgZWFjaCBsaW1pdGVyIGJhbmQ6CiAgICAgICAgMS4gQ2hlY2sgaG93IG11Y2ggZW5lcmd5IHdvdWxkIGJlIHByZXNlbnQgd2hlbiB1c2luZyB0aGUgbGltaXRlZCBnYWluCiAgICAgICAgMi4gQ2FsY3VsYXRlIGJvb3N0IGZhY3RvciBieSBjb21wYXJpc29uIHdpdGggcmVmZXJlbmNlIGVuZXJneQogICAgICAgIDMuIEFwcGx5IGJvb3N0IGZhY3RvciB0byBjb21wZW5zYXRlIGZvciB0aGUgZW5lcmd5IGxvc3MgZHVlIHRvIGxpbWl0aW5nCiAgICAgICovCiAgICAgIGZvciAoayA9IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdOyBrIDwgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbYyArIDFdOyBrKyspIHsKCiAgICAgICAgLyogMS5hICBBZGQgZW5lcmd5IG9mIGFkanVzdGVkIHNpZ25hbCAodXNpbmcgcHJlbGltaW5hcnkgZ2FpbikgKi8KICAgICAgICBGSVhQX0RCTCAgdG1wICAgPSBmTXVsdChwTnJncy0+bnJnR2FpbltrXSxwTnJncy0+bnJnRXN0W2tdKTsKICAgICAgICBTQ0hBUiAgICAgdG1wX2UgPSBwTnJncy0+bnJnR2Fpbl9lW2tdICsgcE5yZ3MtPm5yZ0VzdF9lW2tdOwogICAgICAgIEZES19hZGRfTWFudEV4cCh0bXAsIHRtcF9lLCBhY2N1LCBhY2N1X2UsICZhY2N1LCAmYWNjdV9lKTsKCiAgICAgICAgLyogMS5iICBBZGQgc2luZSBlbmVyZ3kgKGlmIHByZXNlbnQpICovCiAgICAgICAgaWYocE5yZ3MtPm5yZ1NpbmVba10gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgICAgIEZES19hZGRfTWFudEV4cChwTnJncy0+bnJnU2luZVtrXSwgcE5yZ3MtPm5yZ1NpbmVfZVtrXSwgYWNjdSwgYWNjdV9lLCAmYWNjdSwgJmFjY3VfZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLyogMS5jICBBZGQgbm9pc2UgZW5lcmd5IChpZiBwcmVzZW50KSAqLwogICAgICAgICAgaWYobm9Ob2lzZUZsYWcgPT0gMCkgewogICAgICAgICAgICBGREtfYWRkX01hbnRFeHAocE5yZ3MtPm5vaXNlTGV2ZWxba10sIHBOcmdzLT5ub2lzZUxldmVsX2Vba10sIGFjY3UsIGFjY3VfZSwgJmFjY3UsICZhY2N1X2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogMi5hICBDYWxjdWxhdGUgcmF0aW8gb2Ygd2FudGVkIGVuZXJneSBhbmQgYWNjdW11bGF0ZWQgZW5lcmd5ICovCiAgICAgIGlmIChhY2N1ID09IChGSVhQX0RCTCkwKSB7IC8qIElmIGRpdmlzb3IgaXMgMCwgbGltaXQgcXVvdGllbnQgdG8gKzQgZEIgKi8KICAgICAgICBib29zdEdhaW4gPSBGTDJGWENPTlNUX0RCTCgwLjYyNzk3MTZmKTsKICAgICAgICBib29zdEdhaW5fZSA9IDI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgSU5UIGRpdl9lOwogICAgICAgIGJvb3N0R2FpbiA9IGZEaXZOb3JtKHN1bVJlZiwgYWNjdSwgJmRpdl9lKTsKICAgICAgICBib29zdEdhaW5fZSA9IHN1bVJlZl9lIC0gYWNjdV9lICsgZGl2X2U7CiAgICAgIH0KCgogICAgICAvKiAyLmIgUmVzdWx0IHRvbyBoaWdoPyAtLT4gTGltaXQgdGhlIGJvb3N0IGZhY3RvciB0byArNCBkQiAqLwogICAgICBpZigoYm9vc3RHYWluX2UgID4gMykgfHwKICAgICAgICAgKGJvb3N0R2Fpbl9lID09IDIgJiYgYm9vc3RHYWluID4gRkwyRlhDT05TVF9EQkwoMC42Mjc5NzE2ZikpIHx8CiAgICAgICAgIChib29zdEdhaW5fZSA9PSAzICYmIGJvb3N0R2FpbiA+IEZMMkZYQ09OU1RfREJMKDAuMzEzOTg1OGYpKSApCiAgICAgIHsKICAgICAgICBib29zdEdhaW4gPSBGTDJGWENPTlNUX0RCTCgwLjYyNzk3MTZmKTsKICAgICAgICBib29zdEdhaW5fZSA9IDI7CiAgICAgIH0KICAgICAgLyogMy4gIE11bHRpcGx5IGFsbCBzaWduYWwgY29tcG9uZW50cyB3aXRoIHRoZSBib29zdCBmYWN0b3IgKi8KICAgICAgZm9yIChrID0gaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY107IGsgPCBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjICsgMV07IGsrKykgewogICAgICAgIHBOcmdzLT5ucmdHYWluW2tdICAgPSBmTXVsdERpdjIocE5yZ3MtPm5yZ0dhaW5ba10sYm9vc3RHYWluKTsKICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdID0gcE5yZ3MtPm5yZ0dhaW5fZVtrXSArIGJvb3N0R2Fpbl9lICsgMTsKCiAgICAgICAgcE5yZ3MtPm5yZ1NpbmVba10gICA9IGZNdWx0RGl2MihwTnJncy0+bnJnU2luZVtrXSxib29zdEdhaW4pOwogICAgICAgIHBOcmdzLT5ucmdTaW5lX2Vba10gPSBwTnJncy0+bnJnU2luZV9lW2tdICsgYm9vc3RHYWluX2UgKyAxOwoKICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSAgID0gZk11bHREaXYyKHBOcmdzLT5ub2lzZUxldmVsW2tdLGJvb3N0R2Fpbik7CiAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxfZVtrXSA9IHBOcmdzLT5ub2lzZUxldmVsX2Vba10gKyBib29zdEdhaW5fZSArIDE7CiAgICAgIH0KICAgIH0KICAgIC8qIEVuZCBvZiBub2lzZSBsaW1pdGluZyAqLwoKICAgIGlmICh1c2VMUCkKICAgICAgYWxpYXNpbmdSZWR1Y3Rpb24oZGVncmVlQWxpYXMrbG93U3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUFsaWFzUmVkdWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzKTsKCiAgICAvKiBGb3IgdGhlIHRpbWVzbG90cyB3aXRoaW4gdGhlIHJhbmdlIGZvciB0aGUgb3V0cHV0IGZyYW1lLAogICAgICAgdXNlIHRoZSBzYW1lIHNjYWxlIGZvciB0aGUgbm9pc2UgbGV2ZWxzLgogICAgICAgRHJhd2JhY2s6IElmIHRoZSBlbnZlbG9wZSBleGNlZWRzIHRoZSBmcmFtZSBib3JkZXIsIHRoZSBub2lzZSBsZXZlbHMKICAgICAgICAgICAgICAgICB3aWxsIGhhdmUgdG8gYmUgcmVzY2FsZWQgbGF0ZXIgdG8gZml0IGZpbmFsX2Ugb2YKICAgICAgICAgICAgICAgICB0aGUgZ2Fpbi12YWx1ZXMuCiAgICAqLwogICAgbm9pc2VfZSA9IChzdGFydF9wb3MgPCBub19jb2xzKSA/IGFkal9lIDogZmluYWxfZTsKCiAgICAvKgogICAgICBDb252ZXJ0IGVuZXJnaWVzIHRvIGFtcGxpdHVkZSBsZXZlbHMKICAgICovCiAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspIHsKICAgICAgRkRLX3NxcnRfTWFudEV4cCgmcE5yZ3MtPm5yZ1NpbmVba10sICAgICZwTnJncy0+bnJnU2luZV9lW2tdLCAgICAmbm9pc2VfZSk7CiAgICAgIEZES19zcXJ0X01hbnRFeHAoJnBOcmdzLT5ucmdHYWluW2tdLCAgICAmcE5yZ3MtPm5yZ0dhaW5fZVtrXSwgICAgJnBOcmdzLT5ucmdHYWluX2Vba10pOwogICAgICBGREtfc3FydF9NYW50RXhwKCZwTnJncy0+bm9pc2VMZXZlbFtrXSwgJnBOcmdzLT5ub2lzZUxldmVsX2Vba10sICZub2lzZV9lKTsKICAgIH0KCgoKICAgIC8qCiAgICAgIEFwcGx5IGNhbGN1bGF0ZWQgZ2FpbnMgYW5kIGFkYXB0aXZlIG5vaXNlCiAgICAqLwoKICAgIC8qIGFzc2VtYmxlSGZTaWduYWxzKCkgKi8KICAgIHsKICAgICAgaW50IHNjYWxlX2NoYW5nZSwgc2NfY2hhbmdlOwogICAgICBGSVhQX1NHTCBzbW9vdGhfcmF0aW87CiAgICAgIGludCBmaWx0QnVmZmVyTm9pc2VTaGlmdD0wOwoKICAgICAgLyogSW5pdGlhbGl6ZSBzbW9vdGhpbmcgYnVmZmVycyB3aXRoIHRoZSBmaXJzdCB2YWxpZCB2YWx1ZXMgKi8KICAgICAgaWYgKGhfc2JyX2NhbF9lbnYtPnN0YXJ0VXApCiAgICAgIHsKICAgICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSA9IG5vaXNlX2U7CgogICAgICAgICAgRkRLbWVtY3B5KGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJfZSwgICAgcE5yZ3MtPm5yZ0dhaW5fZSwgIG5vU3ViYmFuZHMqc2l6ZW9mKFNDSEFSKSk7CiAgICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlLCBwTnJncy0+bm9pc2VMZXZlbCwgbm9TdWJiYW5kcypzaXplb2YoRklYUF9EQkwpKTsKICAgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyLCAgICAgIHBOcmdzLT5ucmdHYWluLCAgICBub1N1YmJhbmRzKnNpemVvZihGSVhQX0RCTCkpOwoKICAgICAgICB9CiAgICAgICAgaF9zYnJfY2FsX2Vudi0+c3RhcnRVcCA9IDA7CiAgICAgIH0KCiAgICAgIGlmICghdXNlTFApIHsKCiAgICAgICAgZXF1YWxpemVGaWx0QnVmZmVyRXhwKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXIsICAgIC8qIGJ1ZmZlcmVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJfZSwgIC8qIGJ1ZmZlcmVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluLCAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluX2UsICAgICAgICAgICAgIC8qIGN1cnJlbnQgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMpOwoKICAgICAgICAvKiBBZGFwdCBleHBvbmVudCBvZiBidWZmZXJlZCBub2lzZSBsZXZlbHMgdG8gdGhlIGN1cnJlbnQgZXhwb25lbnQKICAgICAgICAgICBzbyB0aGV5IGNhbiBlYXNpbHkgYmUgc21vb3RoZWQgKi8KICAgICAgICBpZigoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLSBub2lzZV9lKT49MCkgewogICAgICAgICAgaW50IHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsKGludCkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLSBub2lzZV9lKSk7CiAgICAgICAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspCiAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZVtrXSA8PD0gc2hpZnQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaW50IHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLShpbnQpKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gbm9pc2VfZSkpOwogICAgICAgICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKQogICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2Vba10gPj49IHNoaWZ0OwogICAgICAgIH0KCiAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgPSBub2lzZV9lOwogICAgICB9CgogICAgICAvKiBmaW5kIGJlc3Qgc2NhbGluZyEgKi8KICAgICAgc2NhbGVfY2hhbmdlID0gLShERlJBQ1RfQklUUy0xKTsKICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7CiAgICAgICAgICBzY2FsZV9jaGFuZ2UgPSBmaXhNYXgoc2NhbGVfY2hhbmdlLChpbnQpcE5yZ3MtPm5yZ0dhaW5fZVtrXSk7CiAgICAgIH0KICAgICAgc2NfY2hhbmdlID0gKHN0YXJ0X3Bvczxub19jb2xzKT8gYWRqX2UgLSBpbnB1dF9lIDogZmluYWxfZSAtIGlucHV0X2U7CgogICAgICBpZiAoKHNjYWxlX2NoYW5nZS1zY19jaGFuZ2UrMSk8MCkKICAgICAgICAgIHNjYWxlX2NoYW5nZS09KHNjYWxlX2NoYW5nZS1zY19jaGFuZ2UrMSk7CgogICAgICBzY2FsZV9jaGFuZ2UgPSAoc2NhbGVfY2hhbmdlLXNjX2NoYW5nZSkrMTsKCiAgICAgIGZvcihrPTA7azxub1N1YmJhbmRzO2srKykgewogICAgICAgICAgaW50IHNjID0gc2NhbGVfY2hhbmdlLXBOcmdzLT5ucmdHYWluX2Vba10gKyAoc2NfY2hhbmdlLTEpOwogICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gID4+PSBzYzsKICAgICAgICAgIHBOcmdzLT5ucmdHYWluX2Vba10gKz0gc2M7CiAgICAgIH0KCiAgICAgIGlmICghdXNlTFApIHsKICAgICAgICBmb3Ioaz0wO2s8bm9TdWJiYW5kcztrKyspIHsKICAgICAgICAgIGludCBzYyA9IHNjYWxlX2NoYW5nZS1oX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2Vba10gKyAoc2NfY2hhbmdlLTEpOwogICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcltrXSA+Pj0gc2M7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKGogPSBzdGFydF9wb3M7IGogPCBzdG9wX3BvczsgaisrKQogICAgICB7CiAgICAgICAgLyogVGhpcyB0aW1lc2xvdCBpcyBsb2NhdGVkIHdpdGhpbiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcHJvY2Vzc2luZyBidWZmZXIKICAgICAgICAgICBhbmQgd2lsbCBiZSBmZWQgaW50byB0aGUgUU1GLXN5bnRoZXNpcyBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuCiAgICAgICAgICAgICAgIGFkal9lIC0gaW5wdXRfZQogICAgICAgICAgIFRoaXMgdGltZXNsb3Qgd2lsbCBub3QgeWV0IGJlIGZlZCBpbnRvIHRoZSBRTUYgc28gd2UgZG8gbm90IGNhcmUKICAgICAgICAgICBhYm91dCB0aGUgYWRqX2UuCiAgICAgICAgICAgICAgIHNjX2NoYW5nZSA9IGZpbmFsX2UgLSBpbnB1dF9lCiAgICAgICAgKi8KICAgICAgICBpZiAoIChqPT1ub19jb2xzKSAmJiAoc3RhcnRfcG9zPG5vX2NvbHMpICkKICAgICAgICB7CiAgICAgICAgICBpbnQgc2hpZnQgPSAoaW50KSAobm9pc2VfZSAtIGZpbmFsX2UpOwogICAgICAgICAgaWYgKCF1c2VMUCkKICAgICAgICAgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQgPSBzaGlmdDsgICAgICAgICAgICAgICAvKiBzaGlmdGluZyBvZiBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2Vba10gd2lsbCBiZSBhcHBsaWVkIGluIGZ1bmN0aW9uIGFkanVzdFRpbWVTbG90SFEoKSAqLwogICAgICAgICAgaWYgKHNoaWZ0Pj0wKSB7CiAgICAgICAgICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsc2hpZnQpOwogICAgICAgICAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspIHsKICAgICAgICAgICAgICBwTnJncy0+bnJnU2luZVtrXSA8PD0gc2hpZnQ7CiAgICAgICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gIDw8PSBzaGlmdDsKICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgIGlmICghdXNlTFApCiAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2Vba10gIDw8PSBzaGlmdDsKICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwtc2hpZnQpOwogICAgICAgICAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspIHsKICAgICAgICAgICAgICBwTnJncy0+bnJnU2luZVtrXSA+Pj0gc2hpZnQ7CiAgICAgICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gID4+PSBzaGlmdDsKICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgIGlmICghdXNlTFApCiAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2Vba10gID4+PSBzaGlmdDsKICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLyogdXBkYXRlIG5vaXNlIHNjYWxpbmcgKi8KICAgICAgICAgIG5vaXNlX2UgPSBmaW5hbF9lOwogICAgICAgICAgaWYgKCF1c2VMUCkKICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgPSBub2lzZV9lOyAgLyogc2NhbGluZyB2YWx1ZSB1bnVzZWQhICovCgogICAgICAgICAgLyogdXBkYXRlIGdhaW4gYnVmZmVyKi8KICAgICAgICAgIHNjX2NoYW5nZSAtPSAoZmluYWxfZSAtIGlucHV0X2UpOwoKICAgICAgICAgIGlmIChzY19jaGFuZ2U8MCkgewogICAgICAgICAgICBmb3Ioaz0wO2s8bm9TdWJiYW5kcztrKyspIHsKICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluW2tdICA+Pj0gLXNjX2NoYW5nZTsKICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluX2Vba10gKz0gLXNjX2NoYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7CiAgICAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcltrXSA+Pj0gLXNjX2NoYW5nZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNjYWxlX2NoYW5nZSs9c2NfY2hhbmdlOwogICAgICAgICAgfQoKICAgICAgICB9IC8vIGlmCgogICAgICAgIGlmICghdXNlTFApIHsKCiAgICAgICAgICAvKiBQcmV2ZW50IHRoZSBzbW9vdGhpbmcgZmlsdGVyIGZyb20gcnVubmluZyBvbiBjb25zdGFudCBsZXZlbHMgKi8KICAgICAgICAgIGlmIChqLXN0YXJ0X3BvcyA8IHNtb290aF9sZW5ndGgpCiAgICAgICAgICAgIHNtb290aF9yYXRpbyA9IEZES19zYnJEZWNvZGVyX3Nicl9zbW9vdGhGaWx0ZXJbai1zdGFydF9wb3NdOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBzbW9vdGhfcmF0aW8gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKCiAgICAgICAgICBhZGp1c3RUaW1lU2xvdEhRKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5hbHlzQnVmZmVySW1hZ1tqXVtsb3dTdWJiYW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2VudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoX3JhdGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBub05vaXNlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgaWYgKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSB7CiAgICAgICAgICAgIGFkanVzdFRpbWVTbG90X0VsZEdyaWQoJmFuYWx5c0J1ZmZlclJlYWxbal1bbG93U3ViYmFuZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPnBoYXNlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUDJTQ0FMRShhZGpfZSkgLSBzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpOwogICAgICAgICAgfSBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIGFkanVzdFRpbWVTbG90TEMoJmFuYWx5c0J1ZmZlclJlYWxbal1bbG93U3ViYmFuZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPnBoYXNlSW5kZXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSAvLyBmb3IKCiAgICAgIGlmICghdXNlTFApIHsKICAgICAgICAvKiBVcGRhdGUgdGltZS1zbW9vdGhpbmctYnVmZmVycyBmb3IgZ2FpbnMgYW5kIG5vaXNlIGxldmVscwogICAgICAgICAgIFRoZSBnYWlucyBhbmQgdGhlIG5vaXNlIHZhbHVlcyBvZiB0aGUgY3VycmVudCBlbnZlbG9wZSBhcmUgY29waWVkIGludG8gdGhlIGJ1ZmZlci4KICAgICAgICAgICBUaGlzIGhhcyB0byBiZSBkb25lIGF0IHRoZSBlbmQgb2YgZWFjaCBlbnZlbG9wZSBhcyB0aGUgdmFsdWVzIGFyZSByZXF1aXJlZCBmb3IKICAgICAgICAgICBhIHNtb290aCB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IGVudmVsb3BlLiAqLwogICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyLCAgICAgIHBOcmdzLT5ucmdHYWluLCAgICBub1N1YmJhbmRzKnNpemVvZihGSVhQX0RCTCkpOwogICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsICAgIHBOcmdzLT5ucmdHYWluX2UsICBub1N1YmJhbmRzKnNpemVvZihTQ0hBUikpOwogICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2UsIHBOcmdzLT5ub2lzZUxldmVsLCBub1N1YmJhbmRzKnNpemVvZihGSVhQX0RCTCkpOwogICAgICB9CgogICAgfQogICAgQ19BTExPQ19TQ1JBVENIX0VORChwTnJncywgRU5WX0NBTENfTlJHUywgMSk7CiAgfQoKICAvKiBSZXNjYWxlIG91dHB1dCBzYW1wbGVzICovCiAgewogICAgRklYUF9EQkwgbWF4VmFsOwogICAgaW50IG92X3Jlc2VydmUsIHJlc2VydmU7CgogICAgLyogRGV0ZXJtaW5lIGhlYWRyb29tIGluIG9sZCBhZGp1c3RlZCBzYW1wbGVzICovCiAgICBtYXhWYWwgPSBtYXhTdWJiYW5kU2FtcGxlKCBhbmFseXNCdWZmZXJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rfc3RhcnQpOwoKICAgIG92X3Jlc2VydmUgPSBmTm9ybShtYXhWYWwpOwoKICAgIC8qIERldGVybWluZSBoZWFkcm9vbSBpbiBuZXcgYWRqdXN0ZWQgc2FtcGxlcyAqLwogICAgbWF4VmFsID0gbWF4U3ViYmFuZFNhbXBsZSggYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VMUCkgPyBOVUxMIDogYW5hbHlzQnVmZmVySW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fY29scyk7CgogICAgcmVzZXJ2ZSA9IGZOb3JtKG1heFZhbCk7CgogICAgLyogRGV0ZXJtaW5lIGNvbW1vbiBvdXRwdXQgZXhwb25lbnQgKi8KICAgIGlmIChvdl9hZGpfZSAtIG92X3Jlc2VydmUgID4gIGFkal9lIC0gcmVzZXJ2ZSApIC8qIHNldCBvdXRwdXRfZSB0byB0aGUgbWF4aW11bSAqLwogICAgICBvdXRwdXRfZSA9IG92X2Fkal9lIC0gb3ZfcmVzZXJ2ZTsKICAgIGVsc2UKICAgICAgb3V0cHV0X2UgPSBhZGpfZSAtIHJlc2VydmU7CgogICAgLyogUmVzY2FsZSBvbGQgc2FtcGxlcyAqLwogICAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKCBhbmFseXNCdWZmZXJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsIGhpZ2hTdWJiYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBmaXJzdF9zdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZfYWRqX2UgLSBvdXRwdXRfZSk7CgogICAgLyogUmVzY2FsZSBuZXcgc2FtcGxlcyAqLwogICAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKCBhbmFseXNCdWZmZXJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsIGhpZ2hTdWJiYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9zdGFydCwgbm9fY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqX2UgLSBvdXRwdXRfZSk7CiAgfQoKICAvKiBVcGRhdGUgaGJfc2NhbGUgKi8KICBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUgPSBFWFAyU0NBTEUob3V0cHV0X2UpOwoKICAvKiBTYXZlIHRoZSBjdXJyZW50IGZpbmFsIGV4cG9uZW50IGZvciB0aGUgbmV4dCBmcmFtZTogKi8KICBzYnJTY2FsZUZhY3Rvci0+b3ZfaGJfc2NhbGUgPSBFWFAyU0NBTEUoZmluYWxfZSk7CgoKICAvKiBXZSBuZWVkIHRvIHJlbWViZXIgdG8gdGhlIG5leHQgZnJhbWUgdGhhdCB0aGUgdHJhbnNpZW50CiAgICAgd2lsbCBvY2N1ciBpbiB0aGUgZmlyc3QgZW52ZWxvcGUgKGlmIHRyYW5FbnYgPT0gbkVudmVsb3BlcykuICovCiAgaWYoaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYgPT0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXMpCiAgICBoX3Nicl9jYWxfZW52LT5wcmV2VHJhbkVudiA9IDA7CiAgZWxzZQogICAgaF9zYnJfY2FsX2Vudi0+cHJldlRyYW5FbnYgPSAtMTsKCn0KCgovKiEKICBcYnJpZWYgICBDcmVhdGUgZW52ZWxvcGUgaW5zdGFuY2UKCiAgTXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjaGFubmVsIGJlZm9yZSBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIGNhbiBiZSB1c2VkLgoKICBccmV0dXJuICBlcnJvckNvZGUsIDAgaWYgc3VjY2Vzc2Z1bAoqLwpTQlJfRVJST1IKY3JlYXRlU2JyRW52ZWxvcGVDYWxjIChIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBocywgICAvKiE8IHBvaW50ZXIgdG8gZW52ZWxvcGUgaW5zdGFuY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IHN0YXRpYyBTQlIgY29udHJvbCBkYXRhLCBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHRzICovCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW4sICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIGZvciB3aGljaCB0byBhc3NpZ24gYnVmZmVycyAqLwogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MpCnsKICBTQlJfRVJST1IgZXJyID0gU0JSREVDX09LOwogIGludCBpOwoKICAvKiBDbGVhciBwcmV2aW91cyBtaXNzaW5nIGhhcm1vbmljcyBmbGFncyAqLwogIGZvciAoaT0wOyBpPChNQVhfRlJFUV9DT0VGRlMrMTUpPj40OyBpKyspIHsKICAgIGhzLT5oYXJtRmxhZ3NQcmV2W2ldID0gMDsKICB9CiAgaHMtPmhhcm1JbmRleCA9IDA7CgogIC8qCiAgICBTZXR1cCBwb2ludGVycyBmb3IgdGltZSBzbW9vdGhpbmcuCiAgICBUaGUgYnVmZmVyIGl0c2VsZiB3aWxsIGJlIGluaXRpYWxpemVkIGxhdGVyIHRyaWdnZXJlZCBieSB0aGUgc3RhcnRVcC1mbGFnLgogICovCiAgaHMtPnByZXZUcmFuRW52ID0gLTE7CgoKICAvKiBpbml0aWFsaXphdGlvbiAqLwogIHJlc2V0U2JyRW52ZWxvcGVDYWxjKGhzKTsKCiAgaWYgKGNoYW49PTApIHsgLyogZG8gdGhpcyBvbmx5IG9uY2UgKi8KICAgIGVyciA9IHJlc2V0RnJlcUJhbmRUYWJsZXMoaEhlYWRlckRhdGEsIGZsYWdzKTsKICB9CgogIHJldHVybiBlcnI7Cn0KCi8qIQogIFxicmllZiAgIENyZWF0ZSBlbnZlbG9wZSBpbnN0YW5jZQoKICBNdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNoYW5uZWwgYmVmb3JlIGNhbGN1bGF0ZVNickVudmVsb3BlKCkgY2FuIGJlIHVzZWQuCgogIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCiovCmludApkZWxldGVTYnJFbnZlbG9wZUNhbGMgKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhzKQp7CiAgcmV0dXJuIDA7Cn0KCgovKiEKICBcYnJpZWYgICBSZXNldCBlbnZlbG9wZSBpbnN0YW5jZQoKICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZvciBlYWNoIGNoYW5uZWwgb24gYSBjaGFuZ2Ugb2YgY29uZmlndXJhdGlvbi4KICBOb3RlIHRoYXQgcmVzZXRGcmVxQmFuZFRhYmxlcyBzaG91bGQgYWxzbyBiZSBjYWxsZWQgaW4gdGhpcyBjYXNlLgoKICBccmV0dXJuICBlcnJvckNvZGUsIDAgaWYgc3VjY2Vzc2Z1bAoqLwp2b2lkCnJlc2V0U2JyRW52ZWxvcGVDYWxjIChIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoQ2FsRW52KSAvKiE8IHBvaW50ZXIgdG8gZW52ZWxvcGUgaW5zdGFuY2UgKi8KewogIGhDYWxFbnYtPnBoYXNlSW5kZXggPSAwOwoKICAvKiBOb2lzZSBleHBvbmVudCBuZWVkcyB0byBiZSByZXNldCBiZWNhdXNlIHRoZSBvdXRwdXQgZXhwb25lbnQgZm9yIHRoZSBuZXh0IGZyYW1lIGRlcGVuZHMgb24gaXQgKi8KICBoQ2FsRW52LT5maWx0QnVmZmVyTm9pc2VfZSA9IDA7CgogIGhDYWxFbnYtPnN0YXJ0VXAgPSAxOwp9CgoKLyohCiAgXGJyaWVmICBFcXVhbGl6ZSBleHBvbmVudHMgb2YgdGhlIGJ1ZmZlcmVkIGdhaW4gdmFsdWVzIGFuZCB0aGUgbmV3IG9uZXMKCiAgQWZ0ZXIgZXF1YWxpemF0aW9uIG9mIGV4cG9uZW50cywgdGhlIEZJUi1maWx0ZXIgYWRkaXRpb24gZm9yIHNtb290aGluZwogIGNhbiBiZSBwZXJmb3JtZWQuCiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBlbnZlbG9wZSBiZWZvcmUgYWRqdXN0aW5nLgoqLwpzdGF0aWMgdm9pZCBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoRklYUF9EQkwgKmZpbHRCdWZmZXIsICAgICAvKiE8IGJ1ZmZlcmQgZ2FpbnMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpmaWx0QnVmZmVyX2UsICAgLyohPCBleHBvbmVudHMgb2YgYnVmZmVyZCBnYWlucyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ0dhaW4sICAgICAgICAvKiE8IGdhaW5zIGZvciBjdXJyZW50IGVudmVsb3BlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnR2Fpbl9lLCAgICAgIC8qITwgZXhwb25lbnRzIG9mIGdhaW5zIGZvciBjdXJyZW50IGVudmVsb3BlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc3ViYmFuZHMpICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLwp7CiAgaW50ICAgYmFuZDsKICBpbnQgIGRpZmY7CgogIGZvciAoYmFuZD0wOyBiYW5kPHN1YmJhbmRzOyBiYW5kKyspewogICAgZGlmZiA9IChpbnQpIChucmdHYWluX2VbYmFuZF0gLSBmaWx0QnVmZmVyX2VbYmFuZF0pOwogICAgaWYgKGRpZmY+MCkgewogICAgICBmaWx0QnVmZmVyW2JhbmRdID4+PSBkaWZmOyAgIC8qIENvbXBlbnNhdGUgZm9yIHRoZSBzY2FsZSBjaGFuZ2UgYnkgc2hpZnRpbmcgdGhlIG1hbnRpc3NhLiAqLwogICAgICBmaWx0QnVmZmVyX2VbYmFuZF0gKz0gZGlmZjsgIC8qIE5ldyBnYWluIGlzIGJpZ2dlciwgdXNlIGl0cyBleHBvbmVudCAqLwogICAgfQogICAgZWxzZSBpZiAoZGlmZjwwKSB7CiAgICAgIC8qIFRoZSBidWZmZXJlZCBnYWlucyBzZWVtIHRvIGJlIGxhcmdlciwgYnV0IG1heWJlIHRoZXJlCiAgICAgICAgIGFyZSBzb21lIHVudXNlZCBiaXRzIGxlZnQgaW4gdGhlIG1hbnRpc3NhICovCgogICAgICBpbnQgcmVzZXJ2ZSA9IENudExlYWRpbmdaZXJvcyhmaXhwX2FicyhmaWx0QnVmZmVyW2JhbmRdKSktMTsKCiAgICAgIGlmICgoLWRpZmYpIDw9IHJlc2VydmUpIHsKICAgICAgICAvKiBUaGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIGJ1ZmZlcmVkIG1hbnRpc3NhIHNvCiAgICAgICAgICAgdGhhdCB3ZSBjYW4gdGFrZSB0aGUgbmV3IGV4cG9uZW50IGFzIGNvbW1vbi4KICAgICAgICAqLwogICAgICAgIGZpbHRCdWZmZXJbYmFuZF0gPDw9ICgtZGlmZik7CiAgICAgICAgZmlsdEJ1ZmZlcl9lW2JhbmRdICs9IGRpZmY7ICAvKiBiZWNvbWVzIGVxdWFsIHRvICpwdHJOZXdFeHAgKi8KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBmaWx0QnVmZmVyW2JhbmRdIDw8PSByZXNlcnZlOyAgIC8qIFNoaWZ0IHRoZSBtYW50aXNzYSBhcyBmYXIgYXMgcG9zc2libGU6ICovCiAgICAgICAgZmlsdEJ1ZmZlcl9lW2JhbmRdIC09IHJlc2VydmU7ICAvKiBDb21wZW5zYXRlIGluIHRoZSBleHBvbmVudDogKi8KCiAgICAgICAgLyogRm9yIHRoZSByZW1haW5pbmcgZGlmZmVyZW5jZSwgY2hhbmdlIHRoZSBuZXcgZ2FpbiB2YWx1ZSAqLwogICAgICAgIGRpZmYgPSBmaXhNaW4oLShyZXNlcnZlICsgZGlmZiksREZSQUNUX0JJVFMtMSk7CiAgICAgICAgbnJnR2FpbltiYW5kXSA+Pj0gZGlmZjsKICAgICAgICBucmdHYWluX2VbYmFuZF0gKz0gZGlmZjsKICAgICAgfQogICAgfQogIH0KfQoKLyohCiAgXGJyaWVmICBTaGlmdCBsZWZ0IHRoZSBtYW50aXNzYXMgb2YgYWxsIHN1YmJhbmQgc2FtcGxlcwogICAgICAgICAgaW4gdGhlIGdpdmVudGltZSBhbmQgZnJlcXVlbmN5IHJhbmdlIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMuCgogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXNjYWxlIHRoZSBhdWRpbyBkYXRhIGluIHRoZSBvdmVybGFwIGJ1ZmZlcgogIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gZW52ZWxvcGUgYWRqdXN0ZWQgd2l0aCB0aGUgbGFzdCBmcmFtZS4KKi8Kdm9pZCByZXNjYWxlU3ViYmFuZFNhbXBsZXMoRklYUF9EQkwgKiogcmUsICAgLyohPCBSZWFsIHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiogaW0sICAgLyohPCBJbWFnaW5hcnkgcGFydCBvZiBpbnB1dCBhbmQgb3V0cHV0IHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93U3ViYmFuZCwgICAvKiE8IEJlZ2luIG9mIGZyZXF1ZW5jeSByYW5nZSB0byBwcm9jZXNzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaWdoU3ViYmFuZCwgIC8qITwgRW5kIG9mIGZyZXF1ZW5jeSByYW5nZSB0byBwcm9jZXNzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9wb3MsICAgIC8qITwgQmVnaW4gb2YgdGltZSByYWdlIChRTUYtdGltZXNsb3QpICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0X3BvcywgICAgIC8qITwgRW5kIG9mIHRpbWUgcmFnZSAoUU1GLXRpbWVzbG90KSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQpICAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0ICovCnsKICBpbnQgd2lkdGggPSBoaWdoU3ViYmFuZC1sb3dTdWJiYW5kOwoKICBpZiAoICh3aWR0aCA+IDApICYmIChzaGlmdCE9MCkgKSB7CiAgICBpZiAoaW0hPU5VTEwpIHsKICAgICAgZm9yIChpbnQgbD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgICAgc2NhbGVWYWx1ZXMoJnJlW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCwgc2hpZnQpOwogICAgICAgICAgc2NhbGVWYWx1ZXMoJmltW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCwgc2hpZnQpOwogICAgICB9CiAgICB9IGVsc2UKICAgIHsKICAgICAgZm9yIChpbnQgbD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgICAgc2NhbGVWYWx1ZXMoJnJlW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCwgc2hpZnQpOwogICAgICB9CiAgICB9CiAgfQp9CgoKLyohCiAgXGJyaWVmICAgRGV0ZXJtaW5lIGhlYWRyb29tIGZvciBzaGlmdGluZwoKICBEZXRlcm1pbmUgYnkgaG93IG11Y2ggdGhlIHNwZWN0cnVtIGNhbiBiZSBzaGlmdGVkIGxlZnQKICBmb3IgYmV0dGVyIGFjY3VyYWN5IGluIGxhdGVyIHByb2Nlc3NpbmcuCgogIFxyZXR1cm4gIE51bWJlciBvZiBmcmVlIGJpdHMgaW4gdGhlIGJpZ2dlc3Qgc3BlY3RyYWwgdmFsdWUKKi8KCkZJWFBfREJMIG1heFN1YmJhbmRTYW1wbGUoIEZJWFBfREJMICoqIHJlLCAgIC8qITwgUmVhbCBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIGltLCAgIC8qITwgUmVhbCBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dTdWJiYW5kLCAgIC8qITwgQmVnaW4gb2YgZnJlcXVlbmN5IHJhbmdlIHRvIHByb2Nlc3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hTdWJiYW5kLCAgLyohPCBOdW1iZXIgb2YgUU1GIGJhbmRzIHRvIHByb2Nlc3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3BvcywgICAgLyohPCBCZWdpbiBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRfcG9zICAgICAgLyohPCBFbmQgb2YgdGltZSByYWdlIChRTUYtdGltZXNsb3QpICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhfREJMKDAuMGYpOwogIHVuc2lnbmVkIGludCB3aWR0aCA9IGhpZ2hTdWJiYW5kIC0gbG93U3ViYmFuZDsKCiAgRkRLX0FTU0VSVCh3aWR0aCA8PSAoNjQpKTsKCiAgaWYgKCB3aWR0aCA+IDAgKSB7CiAgICBpZiAoaW0hPU5VTEwpIAogICAgewogICAgICBmb3IgKGludCBsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSAKICAgICAgewojaWZkZWYgRlVOQ1RJT05fRkRLX2dldF9tYXh2YWwKICAgICAgICBtYXhWYWwgPSBGREtfZ2V0X21heHZhbChtYXhWYWwsICZyZVtsXVtsb3dTdWJiYW5kXSwgJmltW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCk7CiNlbHNlCiAgICAgICAgaW50IGs9d2lkdGg7CiAgICAgICAgRklYUF9EQkwgKnJlVG1wID0gJnJlW2xdW2xvd1N1YmJhbmRdOwogICAgICAgIEZJWFBfREJMICppbVRtcCA9ICZpbVtsXVtsb3dTdWJiYW5kXTsKICAgICAgICBkb3sKICAgICAgICAgIEZJWFBfREJMIHRtcDEgPSAqKHJlVG1wKyspOwogICAgICAgICAgRklYUF9EQkwgdG1wMiA9ICooaW1UbXArKyk7CiAgICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykodG1wMSleKChMT05HKXRtcDE+PihERlJBQ1RfQklUUy0xKSkpOwogICAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKHRtcDIpXigoTE9ORyl0bXAyPj4oREZSQUNUX0JJVFMtMSkpKTsKICAgICAgICB9IHdoaWxlKC0tayE9MCk7CiNlbmRpZgogICAgICB9CiAgICB9IGVsc2UKICAgIHsKICAgICAgZm9yIChpbnQgbD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgIGludCBrPXdpZHRoOwogICAgICAgIEZJWFBfREJMICpyZVRtcCA9ICZyZVtsXVtsb3dTdWJiYW5kXTsKICAgICAgICBkb3sKICAgICAgICAgIEZJWFBfREJMIHRtcCA9ICoocmVUbXArKyk7CiAgICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykodG1wKV4oKExPTkcpdG1wPj4oREZSQUNUX0JJVFMtMSkpKTsKICAgICAgICB9d2hpbGUoLS1rIT0wKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuKG1heFZhbCk7Cn0KCiNkZWZpbmUgU0hJRlRfQkVGT1JFX1NRVUFSRSAoMykgLyogKDcvMikgKi8KLyohPAogIElmIHRoZSBhY2N1bXVsYXRvciBkb2VzIG5vdCBwcm92aWRlIGVub3VnaCBvdmVyZmxvdyBiaXRzIG9yCiAgZG9lcyBub3QgcHJvdmlkZSBhIGhpZ2ggZHluYW1pYyByYW5nZSwgdGhlIGJlbG93IGVuZXJneSBjYWxjdWxhdGlvbgogIHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgc2hpZnQgb3BlcmF0aW9uIGZvciBlYWNoIHNhbXBsZS4KICBPbiB0aGUgb3RoZXIgaGFuZCwgZG9pbmcgdGhlIHNoaWZ0IGFsbG93cyB1c2luZyBhIHNpbmdsZS1wcmVjaXNpb24KICBtdWx0aXBsaWNhdGlvbiBmb3IgdGhlIHNxdWFyZSAoYXQgbGVhc3QgMTZiaXQgeCAxNmJpdCkuCiAgRm9yIGV2ZW4gdmFsdWVzIG9mIE9WUkZMV19CSVRTICgwLCAyLCA0LCA2KSwgc2F0dXJhdGVkIGFyaXRobWV0aWMKICBpcyByZXF1aXJlZCBmb3IgdGhlIGVuZXJneSBhY2N1bXVsYXRpb24uCiAgVGhlb3JldGljYWxseSwgdGhlIHNhbXBsZS1zcXVhcmVzIGNhbiBzdW0gdXAgdG8gYSB2YWx1ZSBvZiA3NiwKICByZXF1aXJpbmcgNyBvdmVyZmxvdyBiaXRzLiBIb3dldmVyIHNpbmNlIHN1Y2ggc2l0dWF0aW9ucyBhcmUgKnZlcnkqCiAgcmFyZSwgYWNjdSBjYW4gYmUgbGltaXRlZCB0byA2NC4KICBJbiBjYXNlIG5hdGl2ZSBzYXR1cmF0ZWQgYXJpdGhtZXRpYyBpcyBub3QgYXZhaWxhYmxlLCBvdmVyZmxvd3MKICBjYW4gYmUgcHJldmVudGVkIGJ5IHJlcGxhY2luZyB0aGUgYWJvdmUgI2RlZmluZSBieQogICAgI2RlZmluZSBTSElGVF9CRUZPUkVfU1FVQVJFICgoOCAtIE9WUkZMV19CSVRTKSAvIDIpCiAgd2hpY2ggd2lsbCByZXN1bHQgaW4gc2xpZ2h0bHkgcmVkdWNlZCBhY2N1cmFjeS4KKi8KCi8qIQogIFxicmllZiAgRXN0aW1hdGVzIHRoZSBtZWFuIGVuZXJneSBvZiBlYWNoIGZpbHRlci1iYW5rIGNoYW5uZWwgZm9yIHRoZQogICAgICAgICAgZHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgZW52ZWxvcGUKCiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gaW50ZXJwb2xGcmVxIGlzIHRydWUuCiovCnN0YXRpYyB2b2lkIGNhbGNOcmdQZXJTdWJiYW5kKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLCAvKiE8IEltYWdpbmFyeSBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgICAgICAgIC8qITwgQmVnaW4gb2YgdGhlIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGhpZ2hTdWJiYW5kLCAgICAgICAgICAvKiE8IEhpZ2ggZW5kIG9mIHRoZSBTQlIgZnJlcXVlbmN5IHJhbmdlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICAgICAgICAgICAgLyohPCBGaXJzdCBRTUYtc2xvdCBvZiBjdXJyZW50IGVudmVsb3BlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuZXh0X3BvcywgICAgICAgICAgICAgLyohPCBMYXN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKyAxICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBmcmFtZUV4cCwgICAgICAgICAgICAgLyohPCBDb21tb24gZXhwb25lbnQgZm9yIGFsbCBpbnB1dCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdFc3QsICAgICAgICAgICAgICAgLyohPCByZXN1bHRpbmcgRW5lcmd5ICgwLi4xKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnRXN0X2UgKSAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgcmVzdWx0aW5nIEVuZXJneSAqLwp7CiAgRklYUF9TR0wgaW52V2lkdGg7CiAgU0NIQVIgIHByZVNoaWZ0OwogIFNDSEFSICBzaGlmdDsKICBGSVhQX0RCTCBzdW07CiAgaW50IGssbDsKCiAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlIGxhdGVyOiAqLwogIGludldpZHRoID0gRlhfREJMMkZYX1NHTChHZXRJbnZJbnQobmV4dF9wb3MgLSBzdGFydF9wb3MpKTsKICAvKiBUaGUgY29tbW9uIGV4cG9uZW50IG5lZWRzIHRvIGJlIGRvdWJsZWQgYmVjYXVzZSBhbGwgbWFudGlzc2FzIGFyZSBzcXVhcmVkOiAqLwogIGZyYW1lRXhwID0gZnJhbWVFeHAgPDwgMTsKCiAgZm9yIChrPWxvd1N1YmJhbmQ7IGs8aGlnaFN1YmJhbmQ7IGsrKykgewogICAgRklYUF9EQkwgIGJ1ZmZlclJlYWxbKCgoMTAyNCkvKDMyKSkrKDYpKV07CiAgICBGSVhQX0RCTCAgYnVmZmVySW1hZ1soKCgxMDI0KS8oMzIpKSsoNikpXTsKICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKCiAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyE9TlVMTCkKICAgIHsKICAgICAgZm9yIChsPXN0YXJ0X3BvcztsPG5leHRfcG9zO2wrKykgCiAgICAgIHsKICAgICAgICBidWZmZXJJbWFnW2xdID0gYW5hbHlzQnVmZmVySW1hZ1tsXVtrXTsKICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykoYnVmZmVySW1hZ1tsXSleKChMT05HKWJ1ZmZlckltYWdbbF0+PihERlJBQ1RfQklUUy0xKSkpOwogICAgICAgIGJ1ZmZlclJlYWxbbF0gPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdOwogICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2xdKV4oKExPTkcpYnVmZmVyUmVhbFtsXT4+KERGUkFDVF9CSVRTLTEpKSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgZm9yIChsPXN0YXJ0X3BvcztsPG5leHRfcG9zO2wrKykKICAgICAgewogICAgICAgIGJ1ZmZlclJlYWxbbF0gPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdOwogICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2xdKV4oKExPTkcpYnVmZmVyUmVhbFtsXT4+KERGUkFDVF9CSVRTLTEpKSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobWF4VmFsIT1GTDJGWENPTlNUX0RCTCgwLmYpKSB7CgoKICAgICAgLyogSWYgdGhlIGFjY3UgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggb3ZlcmZsb3cgYml0cywgd2UgY2Fubm90CiAgICAgICAgIHNoaWZ0IHRoZSBzYW1wbGVzIHVwIHRvIHRoZSBsaW1pdC4KICAgICAgICAgSW5zdGVhZCwga2VlcCB1cCB0byAzIGZyZWUgYml0cyBpbiBlYWNoIHNhbXBsZSwgaS5lLiB1cCB0bwogICAgICAgICA2IGJpdHMgYWZ0ZXIgY2FsY3VsYXRpb24gb2Ygc3F1YXJlLgogICAgICAgICBQbGVhc2Ugbm90ZSB0aGUgY29tbWVudCBvbiBzYXR1cmF0ZWQgYXJpdGhtZXRpYyBhYm92ZSEKICAgICAgKi8KICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICBwcmVTaGlmdCA9IENudExlYWRpbmdaZXJvcyhtYXhWYWwpLTE7CiAgICAgIHByZVNoaWZ0IC09IFNISUZUX0JFRk9SRV9TUVVBUkU7CgogICAgICBpZiAocHJlU2hpZnQ+PTApIHsKICAgICAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyE9TlVMTCkgewogICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICAgIEZJWFBfREJMIHRlbXAxID0gYnVmZmVyUmVhbFtsXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICBGSVhQX0RCTCB0ZW1wMiA9IGJ1ZmZlckltYWdbbF0gPDwgKGludClwcmVTaGlmdDsKICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wMSk7CiAgICAgICAgICAgIGFjY3UgPSBmUG93MkFkZERpdjIoYWNjdSwgdGVtcDIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZQogICAgICAgIHsKICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgICAgICBGSVhQX0RCTCB0ZW1wID0gYnVmZmVyUmVhbFtsXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsgICAgLyogaWYgbmVnYXRpdmUgc2hpZnQgdmFsdWUgKi8KICAgICAgICBpbnQgbmVncHJlU2hpZnQgPSAtcHJlU2hpZnQ7CiAgICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpIHsKICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgICAgICBGSVhQX0RCTCB0ZW1wMSA9IGJ1ZmZlclJlYWxbbF0gPj4gKGludCluZWdwcmVTaGlmdDsKICAgICAgICAgICAgRklYUF9EQkwgdGVtcDIgPSBidWZmZXJJbWFnW2xdID4+IChpbnQpbmVncHJlU2hpZnQ7CiAgICAgICAgICAgIGFjY3UgPSBmUG93MkFkZERpdjIoYWNjdSwgdGVtcDEpOwogICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXAyKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UKICAgICAgICB7CiAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKICAgICAgICAgICAgRklYUF9EQkwgdGVtcCA9IGJ1ZmZlclJlYWxbbF0gPj4gKGludCluZWdwcmVTaGlmdDsKICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgYWNjdSA8PD0gMTsKCiAgICAgIC8qIENvbnZlcnQgZG91YmxlIHByZWNpc2lvbiB0byBNYW50aXNzYS9FeHBvbmVudDogKi8KICAgICAgc2hpZnQgPSBmTm9ybShhY2N1KTsKICAgICAgc3VtID0gYWNjdSA8PCAoaW50KXNoaWZ0OwoKICAgICAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlIGFuZCBhcHBseSBmcmFtZSBzY2FsZTogKi8KICAgICAgKm5yZ0VzdCsrID0gZk11bHQoc3VtLCBpbnZXaWR0aCk7CiAgICAgIHNoaWZ0ICs9IDIgKiBwcmVTaGlmdDsKICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpCiAgICAgICAgKm5yZ0VzdF9lKysgPSBmcmFtZUV4cCAtIHNoaWZ0OwogICAgICBlbHNlCiAgICAgICAgKm5yZ0VzdF9lKysgPSBmcmFtZUV4cCAtIHNoaWZ0ICsgMTsgIC8qICsxIGR1ZSB0byBtaXNzaW5nIGltYWcuIHBhcnQgKi8KICAgIH0gLyogbWF4VmFsIT0wICovCiAgICBlbHNlIHsKCiAgICAgIC8qIFByZXZlbnQgYSB6ZXJvLW1hbnRpc3NhLW51bWJlciBmcm9tIGJlaW5nIG1pc2ludGVycHJldGVkCiAgICAgICAgIGR1ZSB0byBpdHMgZXhwb25lbnQuICovCiAgICAgICpucmdFc3QrKyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAqbnJnRXN0X2UrKyA9IDA7CiAgICB9CiAgfQp9CgovKiEKICBcYnJpZWYgICBFc3RpbWF0ZXMgdGhlIG1lYW4gZW5lcmd5IG9mIGVhY2ggU2NhbGUgZmFjdG9yIGJhbmQgZm9yIHRoZQogICAgICAgICAgIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlLgoKICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbnRlcnBvbEZyZXEgaXMgZmFsc2UuCiovCnN0YXRpYyB2b2lkIGNhbGNOcmdQZXJTZmIoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwgIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsICAvKiE8IEltYWdpbmFyeSBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuU2ZiLCAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBzY2FsZSBmYWN0b3IgYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAqZnJlcUJhbmRUYWJsZSwgICAgICAgLyohPCBGaXJzdCBTdWJiYW5kIGZvciBlYWNoIFNmYiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICAgICAgICAgICAvKiE8IEZpcnN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbmV4dF9wb3MsICAgICAgICAgICAgLyohPCBMYXN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKyAxICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGlucHV0X2UsICAgICAgICAgICAgIC8qITwgQ29tbW9uIGV4cG9uZW50IGZvciBhbGwgaW5wdXQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdFc3QsICAgICAgICAgICAgICAvKiE8IHJlc3VsdGluZyBFbmVyZ3kgKDAuLjEpICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKm5yZ0VzdF9lICkgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgcmVzdWx0aW5nIEVuZXJneSAqLwp7CiAgRklYUF9TR0wgIGludldpZHRoOwogIEZJWFBfREJMICB0ZW1wOwogIFNDSEFSICBwcmVTaGlmdDsKICBTQ0hBUiAgIHNoaWZ0LCBzdW1fZTsKICBGSVhQX0RCTCAgc3VtOwoKICBpbnQgaixrLGwsbGksdWk7CiAgRklYUF9EQkwgc3VtQWxsLCBzdW1MaW5lOyAvKiBTaW5nbGUgcHJlY2lzaW9uIHdvdWxkIGJlIHN1ZmZpY2llbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IG92ZXJmbG93IGJpdHMgYXJlIHJlcXVpcmVkIGZvciBhY2N1bXVsYXRpb24gKi8KCiAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlIGxhdGVyOiAqLwogIGludldpZHRoID0gRlhfREJMMkZYX1NHTChHZXRJbnZJbnQobmV4dF9wb3MgLSBzdGFydF9wb3MpKTsKICAvKiBUaGUgY29tbW9uIGV4cG9uZW50IG5lZWRzIHRvIGJlIGRvdWJsZWQgYmVjYXVzZSBhbGwgbWFudGlzc2FzIGFyZSBzcXVhcmVkOiAqLwogIGlucHV0X2UgPSBpbnB1dF9lIDw8IDE7CgogIGZvcihqPTA7IGo8blNmYjsgaisrKSB7CiAgICBsaSA9IGZyZXFCYW5kVGFibGVbal07CiAgICB1aSA9IGZyZXFCYW5kVGFibGVbaisxXTsKCiAgICBGSVhQX0RCTCBtYXhWYWwgPSBtYXhTdWJiYW5kU2FtcGxlKCBhbmFseXNCdWZmZXJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzQnVmZmVySW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BvcyApOwoKICAgIGlmIChtYXhWYWwhPUZMMkZYQ09OU1RfREJMKDAuZikpIHsKCiAgICAgIHByZVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKG1heFZhbCktMTsKCiAgICAgIC8qIElmIHRoZSBhY2N1IGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIG92ZXJmbG93IGJpdHMsIHdlIGNhbm5vdAogICAgICAgICBzaGlmdCB0aGUgc2FtcGxlcyB1cCB0byB0aGUgbGltaXQuCiAgICAgICAgIEluc3RlYWQsIGtlZXAgdXAgdG8gMyBmcmVlIGJpdHMgaW4gZWFjaCBzYW1wbGUsIGkuZS4gdXAgdG8KICAgICAgICAgNiBiaXRzIGFmdGVyIGNhbGN1bGF0aW9uIG9mIHNxdWFyZS4KICAgICAgICAgUGxlYXNlIG5vdGUgdGhlIGNvbW1lbnQgb24gc2F0dXJhdGVkIGFyaXRobWV0aWMgYWJvdmUhCiAgICAgICovCiAgICAgIHByZVNoaWZ0IC09IFNISUZUX0JFRk9SRV9TUVVBUkU7CgogICAgICBzdW1BbGwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCgogICAgICBmb3IgKGs9bGk7IGs8dWk7IGsrKykgewoKICAgICAgICBzdW1MaW5lID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogICAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKSB7CiAgICAgICAgICBpZiAocHJlU2hpZnQ+PTApIHsKICAgICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOwogICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlckltYWdbbF1ba10gPDwgKGludClwcmVTaGlmdDsKICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba10gPj4gLShpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgc3VtTGluZSArPSBmUG93MkRpdjIodGVtcCk7CiAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVySW1hZ1tsXVtrXSA+PiAtKGludClwcmVTaGlmdDsKICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZQogICAgICAgIHsKICAgICAgICAgIGlmIChwcmVTaGlmdD49MCkgewogICAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKICAgICAgICAgICAgICB0ZW1wICAgPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdIDw8IChpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgc3VtTGluZSArPSBmUG93MkRpdjIodGVtcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba10gPj4gLShpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgc3VtTGluZSArPSBmUG93MkRpdjIodGVtcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFRoZSBudW1iZXIgb2YgUU1GLWNoYW5uZWxzIHBlciBTQlIgYmFuZHMgbWF5IGJlIHVwIHRvIDE1LgogICAgICAgICAgIFNoaWZ0IHJpZ2h0IHRvIGF2b2lkIG92ZXJmbG93cyBpbiBzdW0gb3ZlciBhbGwgY2hhbm5lbHMuICovCiAgICAgICAgc3VtTGluZSA9IHN1bUxpbmUgPj4gKDQtMSk7CiAgICAgICAgc3VtQWxsICArPSBzdW1MaW5lOwogICAgICB9CgogICAgICAvKiBDb252ZXJ0IGRvdWJsZSBwcmVjaXNpb24gdG8gTWFudGlzc2EvRXhwb25lbnQ6ICovCiAgICAgIHNoaWZ0ID0gZk5vcm0oc3VtQWxsKTsKICAgICAgc3VtID0gc3VtQWxsIDw8IChpbnQpc2hpZnQ7CgogICAgICAvKiBEaXZpZGUgYnkgd2lkdGggb2YgZW52ZWxvcGU6ICovCiAgICAgIHN1bSA9IGZNdWx0KHN1bSxpbnZXaWR0aCk7CgogICAgICAvKiBEaXZpZGUgYnkgd2lkdGggb2YgU2ZiOiAqLwogICAgICBzdW0gPSBmTXVsdChzdW0sIEZYX0RCTDJGWF9TR0woR2V0SW52SW50KHVpLWxpKSkpOwoKICAgICAgLyogU2V0IGFsbCBTdWJiYW5kIGVuZXJnaWVzIGluIHRoZSBTZmIgdG8gdGhlIGF2ZXJhZ2UgZW5lcmd5OiAqLwogICAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyE9TlVMTCkKICAgICAgICBzdW1fZSA9IGlucHV0X2UgKyA0IC0gc2hpZnQ7ICAvKiAtNCB0byBjb21wZW5zYXRlIHJpZ2h0LXNoaWZ0ICovCiAgICAgIGVsc2UKICAgICAgICBzdW1fZSA9IGlucHV0X2UgKyA0ICsgMSAtIHNoaWZ0OyAgLyogLTQgdG8gY29tcGVuc2F0ZSByaWdodC1zaGlmdDsgKzEgZHVlIHRvIG1pc3NpbmcgaW1hZy4gcGFydCAqLwoKICAgICAgc3VtX2UgLT0gMiAqIHByZVNoaWZ0OwogICAgfSAvKiBtYXhWYWwhPTAgKi8KICAgIGVsc2UgewoKICAgICAgLyogUHJldmVudCBhIHplcm8tbWFudGlzc2EtbnVtYmVyIGZyb20gYmVpbmcgbWlzaW50ZXJwcmV0ZWQKICAgICAgICAgZHVlIHRvIGl0cyBleHBvbmVudC4gKi8KICAgICAgc3VtID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIHN1bV9lID0gMDsKICAgIH0KCiAgICBmb3IgKGs9bGk7IGs8dWk7IGsrKykKICAgIHsKICAgICAgKm5yZ0VzdCsrICAgPSBzdW07CiAgICAgICpucmdFc3RfZSsrID0gc3VtX2U7CiAgICB9CiAgfQp9CgoKLyohCiAgXGJyaWVmICBDYWxjdWxhdGUgZ2Fpbiwgbm9pc2UsIGFuZCBhZGRpdGlvbmFsIHNpbmUgbGV2ZWwgZm9yIG9uZSBzdWJiYW5kLgoKICBUaGUgcmVzdWx0aW5nIGVuZXJneSBnYWluIGlzIGdpdmVuIGJ5IG1hbnRpc3NhIGFuZCBleHBvbmVudC4KKi8Kc3RhdGljIHZvaWQgY2FsY1N1YmJhbmRHYWluKEZJWFBfREJMICBucmdSZWYsICAgICAgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgbnJnUmVmX2UsICAgICAgICAgIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAoZXhwb25lbnQpICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgdG1wTm9pc2UsICAgICAgICAgIC8qITwgUmVsYXRpdmUgbm9pc2UgbGV2ZWwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICB0bXBOb2lzZV9lLCAgICAgICAgLyohPCBSZWxhdGl2ZSBub2lzZSBsZXZlbCAoZXhwb25lbnQpICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgc2luZVByZXNlbnRGbGFnLCAgIC8qITwgSW5kaWNhdGVzIGlmIHNpbmUgaXMgcHJlc2VudCBvbiBiYW5kICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgc2luZU1hcHBlZCwgICAgICAgIC8qITwgSW5kaWNhdGVzIGlmIHNpbmUgbXVzdCBiZSBhZGRlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vTm9pc2VGbGFnKSAgICAgICAvKiE8IEZsYWcgdG8gc3VwcHJlc3Mgbm9pc2UgYWRkaXRpb24gKi8KewogIEZJWFBfREJMICBucmdFc3QgICAgICAgICAgPSBucmdzLT5ucmdFc3RbaV07ICAgICAgICAgICAgLyohPCBFbmVyZ3kgaW4gdHJhbnNwb3NlZCBzaWduYWwgKi8KICBTQ0hBUiAgICAgbnJnRXN0X2UgICAgICAgID0gbnJncy0+bnJnRXN0X2VbaV07ICAgICAgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsIChleHBvbmVudCkgKi8KICBGSVhQX0RCTCAqcHRyTnJnR2FpbiAgICAgID0gJm5yZ3MtPm5yZ0dhaW5baV07ICAgICAgICAgIC8qITwgUmVzdWx0aW5nIGVuZXJneSBnYWluICovCiAgU0NIQVIgICAgKnB0ck5yZ0dhaW5fZSAgICA9ICZucmdzLT5ucmdHYWluX2VbaV07ICAgICAgICAvKiE8IFJlc3VsdGluZyBlbmVyZ3kgZ2FpbiAoZXhwb25lbnQpICovCiAgRklYUF9EQkwgKnB0ck5vaXNlTGV2ZWwgICA9ICZucmdzLT5ub2lzZUxldmVsW2ldOyAgICAgICAvKiE8IFJlc3VsdGluZyBhYnNvbHV0ZSBub2lzZSBlbmVyZ3kgKi8KICBTQ0hBUiAgICAqcHRyTm9pc2VMZXZlbF9lID0gJm5yZ3MtPm5vaXNlTGV2ZWxfZVtpXTsgICAgIC8qITwgUmVzdWx0aW5nIGFic29sdXRlIG5vaXNlIGVuZXJneSAoZXhwb25lbnQpICovCiAgRklYUF9EQkwgKnB0ck5yZ1NpbmUgICAgICA9ICZucmdzLT5ucmdTaW5lW2ldOyAgICAgICAgICAvKiE8IEFkZGl0aW9uYWwgc2luZSBlbmVyZ3kgKi8KICBTQ0hBUiAgICAqcHRyTnJnU2luZV9lICAgID0gJm5yZ3MtPm5yZ1NpbmVfZVtpXTsgICAgICAgIC8qITwgQWRkaXRpb25hbCBzaW5lIGVuZXJneSAoZXhwb25lbnQpICovCgogIEZJWFBfREJMIGEsIGIsIGM7CiAgU0NIQVIgICAgYV9lLCBiX2UsIGNfZTsKCiAgLyoKICAgICBUaGlzIGFkZGl0aW9uIG9mIDEgcHJldmVudHMgZGl2aXNpb25zIGJ5IHplcm8gaW4gdGhlIHJlZmVyZW5jZSBjb2RlLgogICAgIEZvciB2ZXJ5IHNtYWxsIGVuZXJnaWVzIGluIG5yZ0VzdCwgaXQgcHJldmVudHMgdGhlIGdhaW5zIGZyb20gYmVjb21pbmcKICAgICB2ZXJ5IGhpZ2ggd2hpY2ggY291bGQgY2F1c2Ugc29tZSB0cm91YmxlIGR1ZSB0byB0aGUgc21vb3RoaW5nLgogICovCiAgYl9lID0gKGludCkobnJnRXN0X2UgLSAxKTsKICBpZiAoYl9lPj0wKSB7CiAgICBucmdFc3QgPSAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gKElOVClmaXhNaW4oYl9lKzEsREZSQUNUX0JJVFMtMSkpICsgKG5yZ0VzdCA+PiAxKTsKICAgIG5yZ0VzdF9lICs9IDE7ICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLwoKICB9IGVsc2UgewogICAgbnJnRXN0ID0gKG5yZ0VzdCA+PiAoSU5UKShmaXhNaW4oLWJfZSsxLERGUkFDVF9CSVRTLTEpKSkgKyAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gMSk7CiAgICBucmdFc3RfZSA9IDI7ICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLwogIH0KCiAgLyogIEEgPSBOcmdSZWYgKiBUbXBOb2lzZSAqLwogIGEgPSBmTXVsdChucmdSZWYsdG1wTm9pc2UpOwogIGFfZSA9IG5yZ1JlZl9lICsgdG1wTm9pc2VfZTsKCiAgLyogIEIgPSAxICsgVG1wTm9pc2UgKi8KICBiX2UgPSAoaW50KSh0bXBOb2lzZV9lIC0gMSk7CiAgaWYgKGJfZT49MCkgewogICAgYiA9IChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAoSU5UKWZpeE1pbihiX2UrMSxERlJBQ1RfQklUUy0xKSkgKyAodG1wTm9pc2UgPj4gMSk7CiAgICBiX2UgPSB0bXBOb2lzZV9lICsgMTsgIC8qIHNoaWZ0IGJ5IDEgYml0IHRvIGF2b2lkIG92ZXJmbG93ICovCiAgfSBlbHNlIHsKICAgIGIgPSAodG1wTm9pc2UgPj4gKElOVCkoZml4TWluKC1iX2UrMSxERlJBQ1RfQklUUy0xKSkpICsgKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IDEpOwogICAgYl9lID0gMjsgIC8qIHNoaWZ0IGJ5IDEgYml0IHRvIGF2b2lkIG92ZXJmbG93ICovCiAgfQoKICAvKiAgbm9pc2VMZXZlbCA9IEEgLyBCID0gKE5yZ1JlZiAqIFRtcE5vaXNlKSAvICgxICsgVG1wTm9pc2UpICovCiAgRkRLX2RpdmlkZV9NYW50RXhwKCBhLCAgYV9lLAogICAgICAgICAgICAgICAgICAgICAgYiwgIGJfZSwKICAgICAgICAgICAgICAgICAgICAgIHB0ck5vaXNlTGV2ZWwsIHB0ck5vaXNlTGV2ZWxfZSk7CgogIGlmIChzaW5lUHJlc2VudEZsYWcpIHsKCiAgICAvKiAgQyA9ICgxICsgVG1wTm9pc2UpICogTnJnRXN0ICovCiAgICBjID0gZk11bHQoYixucmdFc3QpOwogICAgY19lID0gYl9lICsgbnJnRXN0X2U7CgogICAgLyogIGdhaW4gPSBBIC8gQyA9IChOcmdSZWYgKiBUbXBOb2lzZSkgLyAoMSArIFRtcE5vaXNlKSAqIE5yZ0VzdCAqLwogICAgRkRLX2RpdmlkZV9NYW50RXhwKCBhLCAgYV9lLAogICAgICAgICAgICAgICAgICAgICAgICBjLCAgY19lLAogICAgICAgICAgICAgICAgICAgICAgICBwdHJOcmdHYWluLCBwdHJOcmdHYWluX2UpOwoKICAgIGlmIChzaW5lTWFwcGVkKSB7CgogICAgICAvKiAgc2luZUxldmVsID0gbnJnUmVmLyAoMSArIFRtcE5vaXNlKSAqLwogICAgICBGREtfZGl2aWRlX01hbnRFeHAoIG5yZ1JlZiwgIG5yZ1JlZl9lLAogICAgICAgICAgICAgICAgICAgICAgICAgIGIsICBiX2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyTnJnU2luZSwgcHRyTnJnU2luZV9lKTsKICAgIH0KICB9CiAgZWxzZSB7CiAgICBpZiAobm9Ob2lzZUZsYWcpIHsKICAgICAgLyogIEIgPSBOcmdFc3QgKi8KICAgICAgYiA9IG5yZ0VzdDsKICAgICAgYl9lID0gbnJnRXN0X2U7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogIEIgPSBOcmdFc3QgKiAoMSArIFRtcE5vaXNlKSAqLwogICAgICBiID0gZk11bHQoYixucmdFc3QpOwogICAgICBiX2UgPSBiX2UgKyBucmdFc3RfZTsKICAgIH0KCgogICAgLyogIGdhaW4gPSBucmdSZWYgLyBCICovCiAgICBGREtfZGl2aWRlX01hbnRFeHAoIG5yZ1JlZiwgIG5yZ1JlZl9lLAogICAgICAgICAgICAgICAgICAgICAgICBiLCAgYl9lLAogICAgICAgICAgICAgICAgICAgICAgICBwdHJOcmdHYWluLCBwdHJOcmdHYWluX2UpOwogIH0KfQoKCi8qIQogIFxicmllZiAgQ2FsY3VsYXRlICJhdmVyYWdlIGdhaW4iIGZvciB0aGUgc3BlY2lmaWVkIHN1YmJhbmQgcmFuZ2UuCgogIFRoaXMgaXMgcmF0aGVyIGEgZ2FpbiBvZiB0aGUgYXZlcmFnZSBtYWduaXR1ZGUgdGhhbiB0aGUgYXZlcmFnZQogIG9mIGdhaW5zIQogIFRoZSByZXN1bHQgaXMgdXNlZCBhcyBhIHJlbGF0aXZlIGxpbWl0IGZvciBhbGwgZ2FpbnMgd2l0aGluIHRoZQogIGN1cnJlbnQgImxpbWl0ZXIgYmFuZCIgKGEgY2VydGFpbiBmcmVxdWVuY3kgcmFuZ2UpLgoqLwpzdGF0aWMgdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGxvd1N1YmJhbmQsICAgIC8qITwgQmVnaW4gb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGhpZ2hTdWJiYW5kLCAgIC8qITwgSGlnaCBlbmQgb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLwogICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKnB0clN1bVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpwdHJTdW1SZWZfZSwKICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJBdmdHYWluLCAgLyohPCBSZXN1bHRpbmcgb3ZlcmFsbCBnYWluIChtYW50aXNzYSkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpwdHJBdmdHYWluX2UpICAvKiE8IFJlc3VsdGluZyBvdmVyYWxsIGdhaW4gKGV4cG9uZW50KSAqLwp7CiAgRklYUF9EQkwgICpucmdSZWYgICA9IG5yZ3MtPm5yZ1JlZjsgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhICovCiAgU0NIQVIgICAgICpucmdSZWZfZSA9IG5yZ3MtPm5yZ1JlZl9lOyAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhIChleHBvbmVudCkgKi8KICBGSVhQX0RCTCAgKm5yZ0VzdCAgID0gbnJncy0+bnJnRXN0OyAgICAgICAvKiE8IEVuZXJneSBpbiB0cmFuc3Bvc2VkIHNpZ25hbCAqLwogIFNDSEFSICAgICAqbnJnRXN0X2UgPSBucmdzLT5ucmdFc3RfZTsgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsIChleHBvbmVudCkgKi8KCiAgRklYUF9EQkwgc3VtUmVmID0gMTsKICBGSVhQX0RCTCBzdW1Fc3QgPSAxOwogIFNDSEFSICAgIHN1bVJlZl9lID0gLUZSQUNUX0JJVFM7CiAgU0NIQVIgICAgc3VtRXN0X2UgPSAtRlJBQ1RfQklUUzsKICBpbnQgICAgICBrOwoKICBmb3IgKGs9bG93U3ViYmFuZDsgazxoaWdoU3ViYmFuZDsgaysrKXsKICAgIC8qIEFkZCBucmdSZWZba10gdG8gc3VtUmVmOiAqLwogICAgRkRLX2FkZF9NYW50RXhwKCBzdW1SZWYsIHN1bVJlZl9lLAogICAgICAgICAgICAgICAgICAgICBucmdSZWZba10sIG5yZ1JlZl9lW2tdLAogICAgICAgICAgICAgICAgICAgICAmc3VtUmVmLCAmc3VtUmVmX2UgKTsKCiAgICAvKiBBZGQgbnJnRXN0W2tdIHRvIHN1bUVzdDogKi8KICAgIEZES19hZGRfTWFudEV4cCggc3VtRXN0LCBzdW1Fc3RfZSwKICAgICAgICAgICAgICAgICAgICAgbnJnRXN0W2tdLCBucmdFc3RfZVtrXSwKICAgICAgICAgICAgICAgICAgICAgJnN1bUVzdCwgJnN1bUVzdF9lICk7CiAgfQoKICBGREtfZGl2aWRlX01hbnRFeHAoc3VtUmVmLCBzdW1SZWZfZSwKICAgICAgICAgICAgICAgICAgICAgc3VtRXN0LCBzdW1Fc3RfZSwKICAgICAgICAgICAgICAgICAgICAgcHRyQXZnR2FpbiwgcHRyQXZnR2Fpbl9lKTsKCiAgKnB0clN1bVJlZiA9IHN1bVJlZjsKICAqcHRyU3VtUmVmX2UgPSBzdW1SZWZfZTsKfQoKc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RfRWxkR3JpZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnB0clJlYWwsICAgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpwdHJIYXJtSW5kZXgsICAgLyohPCBIYXJtb25pYyBpbmRleCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub1N1YmJhbmRzLCAgICAgLyohPCBOdW1iZXIgb2YgUU1GIHN1YmJhbmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9jaGFuZ2UsICAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZywgICAgLyohPCBGbGFnIHRvIHN1cHByZXNzIG5vaXNlIGFkZGl0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICpwdHJQaGFzZUluZGV4LCAgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9kaWZmX2xvdykgLyohPCAgKi8KewogIGludCBrOwogIEZJWFBfREJMICBzaWduYWxSZWFsLCBzYk5vaXNlOwogIGludCB0b25lX2NvdW50ID0gMDsKCiAgRklYUF9EQkwgKnBHYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwogIEZJWFBfREJMICpwTm9pc2VMZXZlbCA9IG5yZ3MtPm5vaXNlTGV2ZWw7ICAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCiAgRklYUF9EQkwgKnBTaW5lTGV2ZWwgID0gbnJncy0+bnJnU2luZTsgICAgIC8qITwgU2luZSBsZXZlbHMgKi8KCiAgaW50ICAgIHBoYXNlSW5kZXggPSAqcHRyUGhhc2VJbmRleDsKICBVQ0hBUiAgaGFybUluZGV4ICA9ICpwdHJIYXJtSW5kZXg7CgogIHN0YXRpYyBjb25zdCBJTlQgaGFybW9uaWNQaGFzZSBbMl1bNF0gPSB7CiAgICB7IDEsIDAsIC0xLCAgMH0sCiAgICB7IDAsIDEsICAwLCAtMX0KICB9OwoKICBzdGF0aWMgY29uc3QgRklYUF9EQkwgaGFybW9uaWNQaGFzZVggWzJdWzRdID0gewogICAgeyBGTDJGWENPTlNUX0RCTCgyLjAqMS4yNDUxODMxNTQ1MzkxMzllLTAwMSksICBGTDJGWENPTlNUX0RCTCgyLjAqLTEuMTIzNzY3ODU5MzI1MDI4ZS0wMDEpLCAgRkwyRlhDT05TVF9EQkwoMi4wKi0xLjI0NTE4MzE1NDUzOTEzOWUtMDAxKSwgRkwyRlhDT05TVF9EQkwoMi4wKiAxLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKSB9LAogICAgeyBGTDJGWENPTlNUX0RCTCgyLjAqMS4yNDUxODMxNTQ1MzkxMzllLTAwMSksICBGTDJGWENPTlNUX0RCTCgyLjAqIDEuMTIzNzY3ODU5MzI1MDI4ZS0wMDEpLCAgRkwyRlhDT05TVF9EQkwoMi4wKi0xLjI0NTE4MzE1NDUzOTEzOWUtMDAxKSwgRkwyRlhDT05TVF9EQkwoMi4wKi0xLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKSB9CiAgfTsKCiAgZm9yIChrPTA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKCiAgICBwaGFzZUluZGV4ID0gKHBoYXNlSW5kZXggKyAxKSAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwoKICAgIGlmKCAocFNpbmVMZXZlbFswXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKG5vTm9pc2VGbGFnID09IDEpICl7CiAgICAgIHNiTm9pc2UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIH0gZWxzZSB7CiAgICAgIHNiTm9pc2UgPSBwTm9pc2VMZXZlbFswXTsKICAgIH0KCiAgICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLCpwR2FpbikgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKCiAgICBzaWduYWxSZWFsICs9IChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW3BoYXNlSW5kZXhdWzBdLCBzYk5vaXNlKTw8NCk7CgogICAgc2lnbmFsUmVhbCArPSBwU2luZUxldmVsWzBdICogaGFybW9uaWNQaGFzZVswXVtoYXJtSW5kZXhdOwoKICAgICpwdHJSZWFsID0gc2lnbmFsUmVhbDsKCiAgICBpZiAoayA9PSAwKSB7CiAgICAgICoocHRyUmVhbC0xKSArPSBzY2FsZVZhbHVlKGZNdWx0RGl2MihoYXJtb25pY1BoYXNlWFtsb3dTdWJiYW5kJjFdW2hhcm1JbmRleF0sIHBTaW5lTGV2ZWxbMF0pLCAtc2NhbGVfZGlmZl9sb3cpICA7CiAgICAgIGlmIChrIDwgbm9TdWJiYW5kcyAtIDEpIHsKICAgICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbMV0sIGhhcm1vbmljUGhhc2VYWyhsb3dTdWJiYW5kKzEpJjFdW2hhcm1JbmRleF0pOwogICAgICB9CiAgICB9CiAgICBpZiAoayA+IDAgJiYgayA8IG5vU3ViYmFuZHMgLSAxICYmIHRvbmVfY291bnQgPCAxNikgewogICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbLSAxXSwgaGFybW9uaWNQaGFzZVggWyhsb3dTdWJiYW5kK2spJjFdICBbaGFybUluZGV4XSk7CiAgICAgICoocHRyUmVhbCkgICArPSBmTXVsdERpdjIocFNpbmVMZXZlbFsrIDFdLCBoYXJtb25pY1BoYXNlWCBbKGxvd1N1YmJhbmQraysxKSYxXVtoYXJtSW5kZXhdKTsKICAgIH0KICAgIGlmIChrID09IG5vU3ViYmFuZHMgLSAxICYmIHRvbmVfY291bnQgPCAxNikgewogICAgICBpZiAoayA+IDApIHsKICAgICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbLSAxXSwgaGFybW9uaWNQaGFzZVggWyhsb3dTdWJiYW5kK2spJjFdW2hhcm1JbmRleF0pOwogICAgICB9CiAgICAgIGlmIChrICsgbG93U3ViYmFuZCArIDE8IDYzKSB7CiAgICAgICAgKihwdHJSZWFsKzEpICs9IGZNdWx0RGl2MihwU2luZUxldmVsWzBdLCBoYXJtb25pY1BoYXNlWFsobG93U3ViYmFuZCtrKzEpJjFdW2hhcm1JbmRleF0pOwogICAgICB9CiAgICB9CgogICAgaWYocFNpbmVMZXZlbFswXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7CiAgICAgIHRvbmVfY291bnQrKzsKICAgIH0KICAgIHB0clJlYWwrKzsKICAgIHBOb2lzZUxldmVsKys7CiAgICBwR2FpbisrOwogICAgcFNpbmVMZXZlbCsrOwogIH0KCiAgKnB0ckhhcm1JbmRleCA9IChoYXJtSW5kZXggKyAxKSAmIDM7CiAgKnB0clBoYXNlSW5kZXggPSBwaGFzZUluZGV4ICYgKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7Cn0KCi8qIQogIFxicmllZiAgIEFtcGxpZnkgb25lIHRpbWVzbG90IG9mIHRoZSBzaWduYWwgd2l0aCB0aGUgY2FsY3VsYXRlZCBnYWlucwogICAgICAgICAgIGFuZCBhZGQgdGhlIG5vaXNlZmxvb3IuCiovCgpzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdExDKEZJWFBfREJMICpwdHJSZWFsLCAgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAqcHRySGFybUluZGV4LCAgLyohPCBIYXJtb25pYyBpbmRleCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCAgICAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub1N1YmJhbmRzLCAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc2NhbGVfY2hhbmdlLCAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vTm9pc2VGbGFnLCAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICpwdHJQaGFzZUluZGV4KSAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KewogIEZJWFBfREJMICpwR2FpbiAgICAgICA9IG5yZ3MtPm5yZ0dhaW47ICAgICAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KICBGSVhQX0RCTCAqcE5vaXNlTGV2ZWwgPSBucmdzLT5ub2lzZUxldmVsOyAgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwogIEZJWFBfREJMICpwU2luZUxldmVsICA9IG5yZ3MtPm5yZ1NpbmU7ICAgICAvKiE8IFNpbmUgbGV2ZWxzICovCgogIGludCAgICBrOwogIGludCAgICBpbmRleCA9ICpwdHJQaGFzZUluZGV4OwogIFVDSEFSICBoYXJtSW5kZXggPSAqcHRySGFybUluZGV4OwogIFVDSEFSICBmcmVxSW52RmxhZyA9IChsb3dTdWJiYW5kICYgMSk7CiAgRklYUF9EQkwgIHNpZ25hbFJlYWwsIHNpbmVMZXZlbCwgc2luZUxldmVsTmV4dCwgc2luZUxldmVsUHJldjsKICBpbnQgICAgdG9uZV9jb3VudCA9IDA7CiAgaW50ICAgIHNpbmVTaWduID0gMTsKCiAgI2RlZmluZSBDMSAgICgoRklYUF9TR0wpRkwyRlhDT05TVF9TR0woMi5mKjAuMDA4MTVmKSkKICAjZGVmaW5lIEMxX0NMREZCICgoRklYUF9TR0wpRkwyRlhDT05TVF9TR0woMi5mKjAuMTY3NzNmKSkKCiAgLyoKICAgIEZpcnN0IHBhc3MgZm9yIGs9MCBwdWxsZWQgb3V0IG9mIHRoZSBsb29wOgogICovCgogIGluZGV4ID0gKGluZGV4ICsgMSkgJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKCiAgLyoKICAgIFRoZSBuZXh0IG11bHRpcGxpY2F0aW9uIGNvbnN0aXR1dGVzIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudAogICAgb2YgdGhlIHNpZ25hbCBhbmQgc2hvdWxkIGJlIGNhcnJpZWQgb3V0IHdpdGggZnVsbCBhY2N1cmFjeQogICAgKHN1cHBseWluZyAjRlJBQ1RfQklUUyB2YWxpZCBiaXRzKS4KICAqLwogIHNpZ25hbFJlYWwgICAgPSBmTXVsdERpdjIoKnB0clJlYWwsKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CiAgc2luZUxldmVsICAgICA9ICpwU2luZUxldmVsKys7CiAgc2luZUxldmVsTmV4dCA9IChub1N1YmJhbmRzID4gMSkgPyBwU2luZUxldmVsWzBdIDogRkwyRlhDT05TVF9EQkwoMC4wZik7CgogIGlmIChzaW5lTGV2ZWwhPUZMMkZYQ09OU1RfREJMKDAuMGYpKSB0b25lX2NvdW50Kys7CiAgZWxzZSBpZiAoIW5vTm9pc2VGbGFnKQogICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCiAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CgogIHsKICAgIGlmICghKGhhcm1JbmRleCYweDEpKSB7CiAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KICAgICAgc2lnbmFsUmVhbCArPSAoaGFybUluZGV4JjB4MikgPyAtc2luZUxldmVsIDogc2luZUxldmVsOwogICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbDsKICAgIH0KICAgIGVsc2UgewogICAgICAvKiBoYXJtSW5kZXggMSwzIGluIGNvbWJpbmF0aW9uIHdpdGggZnJlcUludkZsYWcgKi8KICAgICAgaW50IHNoaWZ0ID0gKGludCkgKHNjYWxlX2NoYW5nZSsxKTsKICAgICAgc2hpZnQgPSAoc2hpZnQ+PTApID8gZml4TWluKERGUkFDVF9CSVRTLTEsc2hpZnQpIDogZml4TWF4KC0oREZSQUNUX0JJVFMtMSksc2hpZnQpOwoKICAgICAgRklYUF9EQkwgdG1wMSA9IChzaGlmdD49MCkgPyAoIGZNdWx0RGl2MihDMSwgc2luZUxldmVsKSA+PiBzaGlmdCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCBmTXVsdERpdjIoQzEsIHNpbmVMZXZlbCkgPDwgKC1zaGlmdCkgKTsKICAgICAgRklYUF9EQkwgdG1wMiA9IGZNdWx0RGl2MihDMSwgc2luZUxldmVsTmV4dCk7CgoKICAgICAgLyogc2F2ZSBzd2l0Y2ggYW5kIGNvbXBhcmUgb3BlcmF0aW9ucyBhbmQgcmVkdWNlIHRvIFhPUiBzdGF0ZW1lbnQgKi8KICAgICAgaWYgKCAoKGhhcm1JbmRleD4+MSkmMHgxKV5mcmVxSW52RmxhZykgewogICAgICAgICAgKihwdHJSZWFsLTEpICs9IHRtcDE7CiAgICAgICAgICBzaWduYWxSZWFsICAgLT0gdG1wMjsKICAgICAgfSBlbHNlIHsKICAgICAgICAgICoocHRyUmVhbC0xKSAtPSB0bXAxOwogICAgICAgICAgc2lnbmFsUmVhbCAgICs9IHRtcDI7CiAgICAgIH0KICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgIGZyZXFJbnZGbGFnID0gIWZyZXFJbnZGbGFnOwogICAgfQogIH0KCiAgcE5vaXNlTGV2ZWwrKzsKCiAgaWYgKCBub1N1YmJhbmRzID4gMiApIHsKICAgIGlmICghKGhhcm1JbmRleCYweDEpKSB7CiAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KICAgICAgaWYoIWhhcm1JbmRleCkgCiAgICAgIHsKICAgICAgICBzaW5lU2lnbiA9IDA7CiAgICAgIH0KCiAgICAgIGZvciAoaz1ub1N1YmJhbmRzLTI7IGshPTA7IGstLSkgewogICAgICAgIEZJWFBfREJMIHNpbmVsZXZlbCA9ICpwU2luZUxldmVsKys7CiAgICAgICAgaW5kZXgrKzsKICAgICAgICBpZiAoKChzaWduYWxSZWFsID0gKHNpbmVTaWduID8gLXNpbmVsZXZlbCA6IHNpbmVsZXZlbCkpID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAgJiYgIW5vTm9pc2VGbGFnKSAKICAgICAgICB7CiAgICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLwogICAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CiAgICAgICAgICBzaWduYWxSZWFsICs9IChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgcE5vaXNlTGV2ZWxbMF0pPDw0KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyogVGhlIG5leHQgbXVsdGlwbGljYXRpb24gY29uc3RpdHV0ZXMgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50IG9mIHRoZSBzaWduYWwuICovCiAgICAgICAgc2lnbmFsUmVhbCArPSBmTXVsdERpdjIoKnB0clJlYWwsKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CgogICAgICAgIHBOb2lzZUxldmVsKys7CiAgICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgIH0gLyogZm9yIC4uLiAqLwogICAgfQogICAgZWxzZSB7CiAgICAgIC8qIGhhcm1JbmRleCAxLDMgaW4gY29tYmluYXRpb24gd2l0aCBmcmVxSW52RmxhZyAqLwogICAgICBpZiAoaGFybUluZGV4PT0xKSBmcmVxSW52RmxhZyA9ICFmcmVxSW52RmxhZzsKCiAgICAgIGZvciAoaz1ub1N1YmJhbmRzLTI7IGshPTA7IGstLSkgewogICAgICAgIGluZGV4Kys7CiAgICAgICAgLyogVGhlIG5leHQgbXVsdGlwbGljYXRpb24gY29uc3RpdHV0ZXMgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50IG9mIHRoZSBzaWduYWwuICovCiAgICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwqcEdhaW4rKykgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKCiAgICAgICAgaWYgKCpwU2luZUxldmVsKyshPUZMMkZYQ09OU1RfREJMKDAuMGYpKSB0b25lX2NvdW50Kys7CiAgICAgICAgZWxzZSBpZiAoIW5vTm9pc2VGbGFnKSB7CiAgICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLwogICAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CiAgICAgICAgICBzaWduYWxSZWFsICs9IChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgcE5vaXNlTGV2ZWxbMF0pPDw0KTsKICAgICAgICB9CgogICAgICAgIHBOb2lzZUxldmVsKys7CgogICAgICAgIGlmICh0b25lX2NvdW50IDw9IDE2KSB7CiAgICAgICAgICBGSVhQX0RCTCBhZGRTaW5lID0gZk11bHREaXYyKChwU2luZUxldmVsWy0yXSAtIHBTaW5lTGV2ZWxbMF0pLCBDMSk7CiAgICAgICAgICBzaWduYWxSZWFsICs9IChmcmVxSW52RmxhZykgPyAoLWFkZFNpbmUpIDogKGFkZFNpbmUpOwogICAgICAgIH0KCiAgICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgICAgZnJlcUludkZsYWcgPSAhZnJlcUludkZsYWc7CiAgICAgIH0gLyogZm9yIC4uLiAqLwogICAgfQogIH0KCiAgaWYgKG5vU3ViYmFuZHMgPiAtMSkgewogICAgaW5kZXgrKzsKICAgIC8qIFRoZSBuZXh0IG11bHRpcGxpY2F0aW9uIGNvbnN0aXR1dGVzIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudCBvZiB0aGUgc2lnbmFsLiAqLwogICAgc2lnbmFsUmVhbCAgICA9IGZNdWx0RGl2MigqcHRyUmVhbCwqcEdhaW4pIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CiAgICBzaW5lTGV2ZWxQcmV2ID0gZk11bHREaXYyKHBTaW5lTGV2ZWxbLTFdLEZMMkZYX1NHTCgwLjAxNjNmKSk7CiAgICBzaW5lTGV2ZWwgICAgID0gcFNpbmVMZXZlbFswXTsKCiAgICBpZiAocFNpbmVMZXZlbFswXSE9RkwyRlhDT05TVF9EQkwoMC4wZikpIHRvbmVfY291bnQrKzsKICAgIGVsc2UgaWYgKCFub05vaXNlRmxhZykgewogICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCiAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CiAgICAgICAgc2lnbmFsUmVhbCA9IHNpZ25hbFJlYWwgKyAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CiAgICB9CgogICAgaWYgKCEoaGFybUluZGV4JjB4MSkpIHsKICAgICAgLyogaGFybUluZGV4IDAsMiAqLwogICAgICAqcHRyUmVhbCA9IHNpZ25hbFJlYWwgKyAoIChzaW5lU2lnbikgPyAtc2luZUxldmVsIDogc2luZUxldmVsKTsKICAgIH0KICAgIGVsc2UgewogICAgICAvKiBoYXJtSW5kZXggMSwzIGluIGNvbWJpbmF0aW9uIHdpdGggZnJlcUludkZsYWcgKi8KICAgICAgaWYodG9uZV9jb3VudCA8PSAxNil7CiAgICAgICAgaWYgKGZyZXFJbnZGbGFnKSB7CiAgICAgICAgICAqcHRyUmVhbCsrICAgPSBzaWduYWxSZWFsIC0gc2luZUxldmVsUHJldjsKICAgICAgICAgIGlmIChub1N1YmJhbmRzICsgbG93U3ViYmFuZCA8IDYzKQogICAgICAgICAgICAqcHRyUmVhbCA9ICpwdHJSZWFsICsgZk11bHREaXYyKEMxLCBzaW5lTGV2ZWwpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsICsgc2luZUxldmVsUHJldjsKICAgICAgICAgIGlmIChub1N1YmJhbmRzICsgbG93U3ViYmFuZCA8IDYzKQogICAgICAgICAgICAqcHRyUmVhbCA9ICpwdHJSZWFsIC0gZk11bHREaXYyKEMxLCBzaW5lTGV2ZWwpOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlICpwdHJSZWFsID0gc2lnbmFsUmVhbDsKICAgIH0KICB9CiAgKnB0ckhhcm1JbmRleCA9IChoYXJtSW5kZXggKyAxKSAmIDM7CiAgKnB0clBoYXNlSW5kZXggPSBpbmRleCAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwp9CnN0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFEoCiAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRyUmVhbCwgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCiAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRySW1hZywgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgaW1hZyBwYXJ0ICovCiAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LAogICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCAgICAgICAgICAgIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCiAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9TdWJiYW5kcywgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9jaGFuZ2UsICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYWRqdXN0ZWQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgIHNtb290aF9yYXRpbywgICAgICAgICAgLyohPCBJbXBhY3Qgb2YgbGFzdCBlbnZlbG9wZSAqLwogICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vTm9pc2VGbGFnLCAgICAgICAgICAgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCiAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpICAvKiE8IFNoaWZ0IGZhY3RvciBvZiBmaWx0QnVmZmVyTm9pc2UgKi8KewoKICBGSVhQX0RCTCAqUkVTVFJJQ1QgZ2FpbiAgICAgICA9IG5yZ3MtPm5yZ0dhaW47ICAgICAgICAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KICBGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VMZXZlbCA9IG5yZ3MtPm5vaXNlTGV2ZWw7ICAgICAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCiAgRklYUF9EQkwgKlJFU1RSSUNUIHBTaW5lTGV2ZWwgPSBucmdzLT5ucmdTaW5lOyAgICAgICAgLyohPCBTaW5lIGxldmVscyAqLwoKICBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdEJ1ZmZlciAgICAgID0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcjsgICAgICAvKiE8IEdhaW5zIG9mIGxhc3QgZW52ZWxvcGUgKi8KICBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdEJ1ZmZlck5vaXNlID0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlOyAvKiE8IE5vaXNlIGxldmVscyBvZiBsYXN0IGVudmVsb3BlICovCiAgVUNIQVIgICAgKlJFU1RSSUNUIHB0ckhhcm1JbmRleCAgICA9Jmhfc2JyX2NhbF9lbnYtPmhhcm1JbmRleDsgICAgICAgLyohPCBIYXJtb25pYyBpbmRleCAqLwogIGludCAgICAgICpSRVNUUklDVCBwdHJQaGFzZUluZGV4ICAgPSZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4OyAgICAgIC8qITwgU3RhcnQgaW5kZXggdG8gcmFuZG9tIG51bWJlciBhcnJheSAqLwoKICBpbnQgICAgazsKICBGSVhQX0RCTCBzaWduYWxSZWFsLCBzaWduYWxJbWFnOwogIEZJWFBfREJMIG5vaXNlUmVhbCwgIG5vaXNlSW1hZzsKICBGSVhQX0RCTCAgc21vb3RoZWRHYWluLCBzbW9vdGhlZE5vaXNlOwogIEZJWFBfU0dMIGRpcmVjdF9yYXRpbyA9IC8qRkwyRlhDT05TVF9TR0woMS4wZikgKi8gKEZJWFBfU0dMKU1BWFZBTF9TR0wgLSBzbW9vdGhfcmF0aW87CiAgaW50ICAgIGluZGV4ID0gKnB0clBoYXNlSW5kZXg7CiAgVUNIQVIgICBoYXJtSW5kZXggPSAqcHRySGFybUluZGV4OwogIHJlZ2lzdGVyIGludCBmcmVxSW52RmxhZyA9IChsb3dTdWJiYW5kICYgMSk7CiAgRklYUF9EQkwgc2luZUxldmVsOwogIGludCBzaGlmdDsKCiAgKnB0clBoYXNlSW5kZXggPSAoaW5kZXgrbm9TdWJiYW5kcykgJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKICAqcHRySGFybUluZGV4ID0gKGhhcm1JbmRleCArIDEpICYgMzsKCiAgLyoKICAgIFBvc3NpYmxlIG9wdGltaXphdGlvbjoKICAgIHNtb290aF9yYXRpbyBhbmQgaGFybUluZGV4IHN0YXkgY29uc3RhbnQgZHVyaW5nIHRoZSBsb29wLgogICAgSXQgbWlnaHQgYmUgZmFzdGVyIHRvIGluY2x1ZGUgYSBzZXBhcmF0ZSBsb29wIGluIGVhY2ggcGF0aC4KCiAgICB0aGUgY2hlY2sgZm9yIHNtb290aF9yYXRpbyBpcyBub3cgb3V0c2lkZSB0aGUgbG9vcCBhbmQgdGhlIHdvcmtsb2FkCiAgICBvZiB0aGUgd2hvbGUgZnVuY3Rpb24gZGVjcmVhc2VkIGJ5IGFib3V0IDIwICUKICAqLwoKICBmaWx0QnVmZmVyTm9pc2VTaGlmdCArPSAxOyAgICAgIC8qIGR1ZSB0byBsYXRlciB1c2Ugb2YgZk11bHREaXYyIGluc3RlYWQgb2YgZk11bHQgKi8KICBpZiAoZmlsdEJ1ZmZlck5vaXNlU2hpZnQ8MCkKICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLWZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKICBlbHNlCiAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLCBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7CgogIGlmIChzbW9vdGhfcmF0aW8gPiBGTDJGWENPTlNUX1NHTCgwLjBmKSkgewoKICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykgewogICAgICAvKgogICAgICAgIFNtb290aGluZzogVGhlIG9sZCBlbnZlbG9wZSBoYXMgYmVlbiBidWZmZXJkIGFuZCBhIGNlcnRhaW4gcmF0aW8KICAgICAgICBvZiB0aGUgb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgaXMgdXNlZC4KICAgICAgKi8KCiAgICAgIHNtb290aGVkR2FpbiA9IGZNdWx0KHNtb290aF9yYXRpbyxmaWx0QnVmZmVyW2tdKSArCiAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGRpcmVjdF9yYXRpbyxnYWluW2tdKTsKCiAgICAgIGlmIChmaWx0QnVmZmVyTm9pc2VTaGlmdDwwKSB7CiAgICAgICAgc21vb3RoZWROb2lzZSA9IChmTXVsdERpdjIoc21vb3RoX3JhdGlvLGZpbHRCdWZmZXJOb2lzZVtrXSk+PnNoaWZ0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sbm9pc2VMZXZlbFtrXSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc21vb3RoZWROb2lzZSA9IChmTXVsdERpdjIoc21vb3RoX3JhdGlvLGZpbHRCdWZmZXJOb2lzZVtrXSk8PHNoaWZ0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sbm9pc2VMZXZlbFtrXSk7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAgVGhlIG5leHQgMiBtdWx0aXBsaWNhdGlvbnMgY29uc3RpdHV0ZSB0aGUgYWN0dWFsIGVudmVsb3BlIGFkanVzdG1lbnQKICAgICAgICBvZiB0aGUgc2lnbmFsIGFuZCBzaG91bGQgYmUgY2FycmllZCBvdXQgd2l0aCBmdWxsIGFjY3VyYWN5CiAgICAgICAgKHN1cHBseWluZyAjREZSQUNUX0JJVFMgdmFsaWQgYml0cykuCiAgICAgICovCiAgICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsc21vb3RoZWRHYWluKTw8KChpbnQpc2NhbGVfY2hhbmdlKTsKICAgICAgc2lnbmFsSW1hZyA9IGZNdWx0RGl2MigqcHRySW1hZyxzbW9vdGhlZEdhaW4pPDwoKGludClzY2FsZV9jaGFuZ2UpOwoKICAgICAgaW5kZXgrKzsKCiAgICAgIGlmIChwU2luZUxldmVsW2tdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgc2luZUxldmVsID0gcFNpbmVMZXZlbFtrXTsKCiAgICAgICAgc3dpdGNoKGhhcm1JbmRleCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCArIHNpbmVMZXZlbCk7CiAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsIC0gc2luZUxldmVsKTsKICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwpOwogICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQogICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgLSBzaW5lTGV2ZWwpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgKyBzaW5lTGV2ZWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCiAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyArIHNpbmVMZXZlbCk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyAtIHNpbmVMZXZlbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKG5vTm9pc2VGbGFnKSB7CiAgICAgICAgICAvKiBKdXN0IHRoZSBhbXBsaWZpZWQgc2lnbmFsIGlzIHNhdmVkICovCiAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwpOwogICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLwogICAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CiAgICAgICAgICBub2lzZVJlYWwgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgc21vb3RoZWROb2lzZSk8PDQ7CiAgICAgICAgICBub2lzZUltYWcgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVsxXSwgc21vb3RoZWROb2lzZSk8PDQ7CiAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwgKyBub2lzZVJlYWwpOwogICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnICsgbm9pc2VJbWFnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnJlcUludkZsYWcgXj0gMTsKICAgIH0KCiAgfQogIGVsc2UgCiAgewogICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKSAKICAgIHsKICAgICAgc21vb3RoZWRHYWluICA9IGdhaW5ba107CiAgICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsIHNtb290aGVkR2FpbikgPDwgc2NhbGVfY2hhbmdlOwogICAgICBzaWduYWxJbWFnID0gZk11bHREaXYyKCpwdHJJbWFnLCBzbW9vdGhlZEdhaW4pIDw8IHNjYWxlX2NoYW5nZTsKCiAgICAgIGluZGV4Kys7CgogICAgICBpZiAoKHNpbmVMZXZlbCA9IHBTaW5lTGV2ZWxba10pICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAKICAgICAgewogICAgICAgIHN3aXRjaCAoaGFybUluZGV4KSAKICAgICAgICB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgc2lnbmFsUmVhbCArPSBzaW5lTGV2ZWw7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCiAgICAgICAgICAgIHNpZ25hbEltYWcgLT0gc2luZUxldmVsOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBzaWduYWxJbWFnICs9IHNpbmVMZXZlbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHNpZ25hbFJlYWwgLT0gc2luZUxldmVsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQogICAgICAgICAgICBzaWduYWxJbWFnICs9IHNpbmVMZXZlbDsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgc2lnbmFsSW1hZyAtPSBzaW5lTGV2ZWw7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSAKICAgICAgewogICAgICAgIGlmIChub05vaXNlRmxhZyA9PSAwKQogICAgICAgIHsKICAgICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCiAgICAgICAgICBzbW9vdGhlZE5vaXNlID0gbm9pc2VMZXZlbFtrXTsKICAgICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwogICAgICAgICAgbm9pc2VSZWFsID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHNtb290aGVkTm9pc2UpOwogICAgICAgICAgbm9pc2VJbWFnID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMV0sIHNtb290aGVkTm9pc2UpOwogICAgICAgICAgc2lnbmFsUmVhbCArPSBub2lzZVJlYWw8PDQ7CiAgICAgICAgICBzaWduYWxJbWFnICs9IG5vaXNlSW1hZzw8NDsKICAgICAgICB9CiAgICAgIH0KICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgICpwdHJJbWFnKysgPSBzaWduYWxJbWFnOwoKICAgICAgZnJlcUludkZsYWcgXj0gMTsKICAgIH0KICB9Cn0KCgovKiEKICBcYnJpZWYgICBSZXNldCBsaW1pdGVyIGJhbmRzLgoKICBCdWlsZCBmcmVxdWVuY3kgYmFuZCB0YWJsZSBmb3IgdGhlIGdhaW4gbGltaXRlciBkZXBlbmRlbnQgb24KICB0aGUgcHJldmlvdXNseSBnZW5lcmF0ZWQgdHJhbnNwb3NlciBwYXRjaCBhcmVhcy4KCiAgXHJldHVybiAgU0JSREVDX09LIGlmIG9rLCAgU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRyBvbiBlcnJvcgoqLwpTQlJfRVJST1IKUmVzZXRMaW1pdGVyQmFuZHMgKCBVQ0hBUiAqbGltaXRlckJhbmRUYWJsZSwgICAvKiE8IFJlc3VsdGluZyBiYW5kIGJvcmRlcnMgaW4gUU1GIGNoYW5uZWxzICovCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vTGltaXRlckJhbmRzLCAgICAgLyohPCBSZXN1bHRpbmcgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZCAqLwogICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgIC8qITwgVGFibGUgd2l0aCBwb3NzaWJsZSBiYW5kIGJvcmRlcnMgKi8KICAgICAgICAgICAgICAgICAgICBpbnQgbm9GcmVxQmFuZHMsICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGluIGZyZXFCYW5kVGFibGUgKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSwgICAgIC8qITwgVHJhbnNwb3NlciBwYXRjaCBwYXJhbWV0ZXJzICovCiAgICAgICAgICAgICAgICAgICAgaW50IG5vUGF0Y2hlcywgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0cmFuc3Bvc2VyIHBhdGNoZXMgKi8KICAgICAgICAgICAgICAgICAgICBpbnQgbGltaXRlckJhbmRzKSAgICAgICAgICAgICAgICAgIC8qITwgU2VsZWN0ZWQgJ2JhbmQgZGVuc2l0eScgZnJvbSBiaXRzdHJlYW0gKi8KewogIGludCBpLCBrLCBpc1BhdGNoQm9yZGVyWzJdLCBsb0xpbUluZGV4LCBoaUxpbUluZGV4LCB0ZW1wTm9MaW0sIG5CYW5kczsKICBVQ0hBUiB3b3JrTGltaXRlckJhbmRUYWJsZVtNQVhfRlJFUV9DT0VGRlMgLyAyICsgTUFYX05VTV9QQVRDSEVTICsgMV07CiAgaW50IHBhdGNoQm9yZGVyc1tNQVhfTlVNX1BBVENIRVMgKyAxXTsKICBpbnQga3gsIGsyOwoKICBpbnQgbG93U3ViYmFuZCA9IGZyZXFCYW5kVGFibGVbMF07CiAgaW50IGhpZ2hTdWJiYW5kID0gZnJlcUJhbmRUYWJsZVtub0ZyZXFCYW5kc107CgogIC8qIDEgbGltaXRlciBiYW5kLiAqLwogIGlmKGxpbWl0ZXJCYW5kcyA9PSAwKSB7CiAgICBsaW1pdGVyQmFuZFRhYmxlWzBdID0gMDsKICAgIGxpbWl0ZXJCYW5kVGFibGVbMV0gPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CiAgICBuQmFuZHMgPSAxOwogIH0gZWxzZSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbm9QYXRjaGVzOyBpKyspIHsKICAgICAgcGF0Y2hCb3JkZXJzW2ldID0gcGF0Y2hQYXJhbVtpXS5ndWFyZFN0YXJ0QmFuZCAtIGxvd1N1YmJhbmQ7CiAgICB9CiAgICBwYXRjaEJvcmRlcnNbaV0gPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CgogICAgLyogMS4yLCAyLCBvciAzIGxpbWl0ZXIgYmFuZHMvb2N0YXZlIHBsdXMgYmFuZGJvcmRlcnMgYXQgcGF0Y2hib3JkZXJzLiAqLwogICAgZm9yIChrID0gMDsgayA8PSBub0ZyZXFCYW5kczsgaysrKSB7CiAgICAgIHdvcmtMaW1pdGVyQmFuZFRhYmxlW2tdID0gZnJlcUJhbmRUYWJsZVtrXSAtIGxvd1N1YmJhbmQ7CiAgICB9CiAgICBmb3IgKGsgPSAxOyBrIDwgbm9QYXRjaGVzOyBrKyspIHsKICAgICAgd29ya0xpbWl0ZXJCYW5kVGFibGVbbm9GcmVxQmFuZHMgKyBrXSA9IHBhdGNoQm9yZGVyc1trXTsKICAgIH0KCiAgICB0ZW1wTm9MaW0gPSBuQmFuZHMgPSBub0ZyZXFCYW5kcyArIG5vUGF0Y2hlcyAtIDE7CiAgICBzaGVsbHNvcnQod29ya0xpbWl0ZXJCYW5kVGFibGUsIHRlbXBOb0xpbSArIDEpOwoKICAgIGxvTGltSW5kZXggPSAwOwogICAgaGlMaW1JbmRleCA9IDE7CgoKICAgIHdoaWxlIChoaUxpbUluZGV4IDw9IHRlbXBOb0xpbSkgewogICAgICBGSVhQX0RCTCBkaXZfbSwgb2N0X20sIHRlbXA7CiAgICAgIElOVCBkaXZfZSAgPSAwLCBvY3RfZSAgPSAwLCB0ZW1wX2UgPSAwOwoKICAgICAgazIgPSB3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSArIGxvd1N1YmJhbmQ7CiAgICAgIGt4ID0gd29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0gKyBsb3dTdWJiYW5kOwoKICAgICAgZGl2X20gID0gZkRpdk5vcm0oazIsIGt4LCAmZGl2X2UpOwoKICAgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBvY3RhdmVzICovCiAgICAgIG9jdF9tICA9IGZMb2cyKGRpdl9tLCBkaXZfZSwgJm9jdF9lKTsKCiAgICAgIC8qIG11bHRpcGx5IHdpdGggbGltaXRlcmJhbmRzIHBlciBvY3RhdmUgICAgKi8KICAgICAgLyogdmFsdWVzIDEsIDEuMiwgMiwgMyAtPiBzY2FsZSBmYWN0b3Igb2YgMiAqLwogICAgICB0ZW1wID0gZk11bHROb3JtKG9jdF9tLCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltaXRlckJhbmRzUGVyT2N0YXZlRGl2NF9EQkxbbGltaXRlckJhbmRzXSwgJnRlbXBfZSk7CgogICAgICAvKiBvdmVyYWxsIHNjYWxlIGZhY3RvciBvZiB0ZW1wIGlzdCBhZGRpdGlvbiBvZiBzY2FsZWZhY3RvcnMgZnJvbSBsb2cyIGNhbGN1bGF0aW9uLAogICAgICAgICBsaW1pdGVyIGJhbmRzIHNjYWxlZmFjdG9yICgyKSBhbmQgbGltaXRlciBiYW5kcyBtdWx0aXBsaWNhdGlvbiAqLwogICAgICB0ZW1wX2UgKz0gb2N0X2UgKyAyOwoKICAgICAgLyogICAgZGl2IGNhbiBiZSBhIG1heGltdW0gb2YgNjQgKGsyID0gNjQgYW5kIGt4ID0gMSkKICAgICAgICAgLT4gb2N0IGNhbiBiZSBhIG1heGltdW0gb2YgNgogICAgICAgICAtPiB0ZW1wIGNhbiBiZSBhIG1heGltdW0gb2YgMTggKGFzIGxpbWl0ZXJCYW5kc1Blck9jdG9hdmUgaXMgYSBtYXhpbXVtIGZhY3RvciBvZiAzKQogICAgICAgICAtPiB3ZSBuZWVkIGEgc2NhbGUgZmFjdG9yIG9mIDUgZm9yIGNvbXBhcmlzc29uCiAgICAgICovCiAgICAgIGlmICh0ZW1wID4+ICg1IC0gdGVtcF9lKSA8IEZMMkZYQ09OU1RfREJMICgwLjQ5ZikgPj4gNSkgewoKICAgICAgICBpZiAod29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gPT0gd29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0pIHsKICAgICAgICAgIHdvcmtMaW1pdGVyQmFuZFRhYmxlW2hpTGltSW5kZXhdID0gaGlnaFN1YmJhbmQ7CiAgICAgICAgICBuQmFuZHMtLTsKICAgICAgICAgIGhpTGltSW5kZXgrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpc1BhdGNoQm9yZGVyWzBdID0gaXNQYXRjaEJvcmRlclsxXSA9IDA7CiAgICAgICAgZm9yIChrID0gMDsgayA8PSBub1BhdGNoZXM7IGsrKykgewogICAgICAgICAgaWYgKHdvcmtMaW1pdGVyQmFuZFRhYmxlW2hpTGltSW5kZXhdID09IHBhdGNoQm9yZGVyc1trXSkgewogICAgICAgICAgICBpc1BhdGNoQm9yZGVyWzFdID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghaXNQYXRjaEJvcmRlclsxXSkgewogICAgICAgICAgd29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gPSBoaWdoU3ViYmFuZDsKICAgICAgICAgIG5CYW5kcy0tOwogICAgICAgICAgaGlMaW1JbmRleCsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAoayA9IDA7IGsgPD0gbm9QYXRjaGVzOyBrKyspIHsKICAgICAgICAgIGlmICh3b3JrTGltaXRlckJhbmRUYWJsZVtsb0xpbUluZGV4XSA9PSBwYXRjaEJvcmRlcnNba10pIHsKICAgICAgICAgICAgaXNQYXRjaEJvcmRlclswXSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWlzUGF0Y2hCb3JkZXJbMF0pIHsKICAgICAgICAgIHdvcmtMaW1pdGVyQmFuZFRhYmxlW2xvTGltSW5kZXhdID0gaGlnaFN1YmJhbmQ7CiAgICAgICAgICBuQmFuZHMtLTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbG9MaW1JbmRleCA9IGhpTGltSW5kZXg7CiAgICAgIGhpTGltSW5kZXgrKzsKCiAgICB9CiAgICBzaGVsbHNvcnQod29ya0xpbWl0ZXJCYW5kVGFibGUsIHRlbXBOb0xpbSArIDEpOwoKICAgIC8qIFRlc3QgaWYgYWxnb3JpdGhtIGV4Y2VlZGVkIG1heGltdW0gYWxsb3dlZCBsaW1pdGVyYmFuZHMgKi8KICAgIGlmKCBuQmFuZHMgPiBNQVhfTlVNX0xJTUlURVJTIHx8IG5CYW5kcyA8PSAwKSB7CiAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgfQoKICAgIC8qIENvcHkgbGltaXRlcmJhbmRzIGZyb20gd29ya2luZyBidWZmZXIgaW50byBmaW5hbCBkZXN0aW5hdGlvbiAqLwogICAgZm9yIChrID0gMDsgayA8PSBuQmFuZHM7IGsrKykgewogICAgICBsaW1pdGVyQmFuZFRhYmxlW2tdID0gd29ya0xpbWl0ZXJCYW5kVGFibGVba107CiAgICB9CiAgfQogICpub0xpbWl0ZXJCYW5kcyA9IG5CYW5kczsKCiAgcmV0dXJuIFNCUkRFQ19PSzsKfQoK