Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIEFBQyBFbmNvZGVyIGxpYiAgKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6IE0uIE5ldXNpbmdlcgogICBEZXNjcmlwdGlvbjogQ29tcHJlc3NvciBmb3IgQUFDIE1ldGFkYXRhIEdlbmVyYXRvcgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCiNpbmNsdWRlICJtZXRhZGF0YV9jb21wcmVzc29yLmgiCiNpbmNsdWRlICJjaGFubmVsX21hcC5oIgoKCiNkZWZpbmUgTE9HMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjkzMTQ3MTgwNTZmICAvKiBuYXR1cmFsIGxvZ2FyaXRobSBvZiAyICovCiNkZWZpbmUgSUxPRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDQyNjk1MDQxZiAgICAvKiAxL0xPRzIgKi8KI2RlZmluZSBGSVhQX0lMT0cyX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKElMT0cyLzIpKQoKLyotLS0tLS0tLS0tLS0tLS0tLSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2RlZmluZSBNQVhfRFJDX0NIQU5ORUxTICAgICAgICAoOCkgICAgICAgICAgLyohPCBNYXggbnVtYmVyIG9mIGF1ZGlvIGlucHV0IGNoYW5uZWxzLiAqLwojZGVmaW5lIERPV05NSVhfU0hJRlQgICAgICAgICAgICgzKSAgICAgICAgICAvKiE8IE1heCA4IGNoYW5uZWwuICovCiNkZWZpbmUgV0VJR0hUSU5HX0ZJTFRFUl9TSElGVCAgKDIpICAgICAgICAgIC8qITwgU2NhbGluZyB1c2VkIGluIHdlaWdodGluZyBmaWx0ZXIuICovCgojZGVmaW5lIE1FVEFEQVRBX0lOVF9CSVRTICAgICAgMTAKI2RlZmluZSBNRVRBREFUQV9MSU5UX0JJVFMgICAgIDIwCiNkZWZpbmUgTUVUQURBVEFfSU5UX1NDQUxFICAgICAoSU5UNjQoMSk8PChNRVRBREFUQV9JTlRfQklUUykpCiNkZWZpbmUgTUVUQURBVEFfRlJBQ1RfQklUUyAgICAoREZSQUNUX0JJVFMtMS1NRVRBREFUQV9JTlRfQklUUykKI2RlZmluZSBNRVRBREFUQV9GUkFDVF9TQ0FMRSAgIChJTlQ2NCgxKTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMpKQoKLyoqCiAqICBFbnVtIGZvciBjaGFubmVsIGFzc2lnbm1lbnQuCiAqLwplbnVtIHsKICAgIEwgICA9IDAsCiAgICBSICAgPSAxLAogICAgQyAgID0gMiwKICAgIExGRSA9IDMsCiAgICBMUyAgPSA0LAogICAgUlMgID0gNSwKICAgIFMgICA9IDYsCiAgICBMUzIgPSA3LAogICAgUlMyID0gOAp9OwoKLyotLS0tLS0tLS0tLS0tLS0gc3RydWN0dXJlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKgogKiAgU3RydWN0dXJlIGhvbGRzIHdlaWdodGluZyBmaWx0ZXIgZmlsdGVyIHN0YXRlcy4KICovCnN0cnVjdCBXRUlHSFRJTkdfU1RBVEVTIHsKICAgIEZJWFBfREJMIHgxOwogICAgRklYUF9EQkwgeDI7CiAgICBGSVhQX0RCTCB5MTsKICAgIEZJWFBfREJMIHkyOwp9OwoKLyoqCiAqICBEeW5hbWljIFJhbmdlIENvbnRyb2wgY29tcHJlc3NvciBzdHJ1Y3R1cmUuCiAqLwpzdHJ1Y3QgRFJDX0NPTVAgewoKICAgIEZJWFBfREJMICAgICBtYXhCb29zdFRoclsyXTsgICAgICAgICAgICAgLyohPCBNYXggYm9vc3QgdGhyZXNob2xkLiAqLwogICAgRklYUF9EQkwgICAgIGJvb3N0VGhyWzJdOyAgICAgICAgICAgICAgICAvKiE8IEJvb3N0IHRocmVzaG9sZC4gKi8KICAgIEZJWFBfREJMICAgICBlYXJseUN1dFRoclsyXTsgICAgICAgICAgICAgLyohPCBFYXJseSBjdXQgdGhyZXNob2xkLiAqLwogICAgRklYUF9EQkwgICAgIGN1dFRoclsyXTsgICAgICAgICAgICAgICAgICAvKiE8IEN1dCB0aHJlc2hvbGQuICovCiAgICBGSVhQX0RCTCAgICAgbWF4Q3V0VGhyWzJdOyAgICAgICAgICAgICAgIC8qITwgTWF4IGN1dCB0aHJlc2hvbGQuICovCgogICAgRklYUF9EQkwgICAgIGJvb3N0RmFjWzJdOyAgICAgICAgICAgICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBib29zdCBjb21wcmVzc2lvbi4gKi8KICAgIEZJWFBfREJMICAgICBlYXJseUN1dEZhY1syXTsgICAgICAgICAgICAgLyohPCBQcmVjYWxjdWxhdGVkIGZhY3RvciBmb3IgZWFybHkgY3V0IGNvbXByZXNzaW9uLiAqLwogICAgRklYUF9EQkwgICAgIGN1dEZhY1syXTsgICAgICAgICAgICAgICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBjdXQgY29tcHJlc3Npb24uICovCgogICAgRklYUF9EQkwgICAgIG1heEJvb3N0WzJdOyAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gYm9vc3QuICovCiAgICBGSVhQX0RCTCAgICAgbWF4Q3V0WzJdOyAgICAgICAgICAgICAgICAgIC8qITwgTWF4aW11bSBjdXQuICovCiAgICBGSVhQX0RCTCAgICAgbWF4RWFybHlDdXRbMl07ICAgICAgICAgICAgIC8qITwgTWF4aW11bSBlYXJseSBjdXQuICovCgogICAgRklYUF9EQkwgICAgIGZhc3RBdHRhY2tbMl07ICAgICAgICAgICAgICAvKiE8IEZhc3QgYXR0YWNrIGNvZWZmaWNpZW50LiAqLwogICAgRklYUF9EQkwgICAgIGZhc3REZWNheVsyXTsgICAgICAgICAgICAgICAvKiE8IEZhc3QgcmVsZWFzZSBjb2VmZmljaWVudC4gKi8KICAgIEZJWFBfREJMICAgICBzbG93QXR0YWNrWzJdOyAgICAgICAgICAgICAgLyohPCBTbG93IGF0dGFjayBjb2VmZmljaWVudC4gKi8KICAgIEZJWFBfREJMICAgICBzbG93RGVjYXlbMl07ICAgICAgICAgICAgICAgLyohPCBTbG93IHJlbGVhc2UgY29lZmZpY2llbnQuICovCiAgICBVSU5UICAgICAgICAgaG9sZE9mZlsyXTsgICAgICAgICAgICAgICAgIC8qITwgSG9sZCB0aW1lIGluIGJsb2Nrcy4gKi8KCiAgICBGSVhQX0RCTCAgICAgYXR0YWNrVGhyWzJdOyAgICAgICAgICAgICAgIC8qITwgU2xvdy9mYXN0IGF0dGFjayB0aHJlc2hvbGQuICovCiAgICBGSVhQX0RCTCAgICAgZGVjYXlUaHJbMl07ICAgICAgICAgICAgICAgIC8qITwgU2xvdy9mYXN0IHJlbGVhc2UgdGhyZXNob2xkLiAqLwoKICAgIERSQ19QUk9GSUxFICBwcm9maWxlWzJdOyAgICAgICAgICAgICAgICAgLyohPCBEUkMgcHJvZmlsZS4gKi8KICAgIElOVCAgICAgICAgICBibG9ja0xlbmd0aDsgICAgICAgICAgICAgICAgLyohPCBCbG9jayBsZW5ndGggaW4gc2FtcGxlcy4gKi8KICAgIFVJTlQgICAgICAgICBzYW1wbGVSYXRlOyAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGUgcmF0ZS4gKi8KICAgIENIQU5ORUxfTU9ERSBjaGFuQ29uZmlnOyAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24uICovCgogICAgVUNIQVIgICAgICAgIHVzZVdlaWdodGluZzsgICAgICAgICAgICAgICAvKiE8IFVzZSB3ZWlnaHRpbmcgZmlsdGVyLiAqLwoKICAgIFVJTlQgICAgICAgICBjaGFubmVsczsgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMuICovCiAgICBVSU5UICAgICAgICAgZnVsbENoYW5uZWxzOyAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGZ1bGwgcmFuZ2UgY2hhbm5lbHMuICovCiAgICBJTlQgICAgICAgICAgY2hhbm5lbElkeFs5XTsgICAgICAgICAgICAgIC8qITwgT2Zmc2V0cyBvZiBpbnRlcmxlYXZlZCBjaGFubmVsIHNhbXBsZXMgKEwsIFIsIEMsIExGRSwgTHMsIFJzLCBTLCBMczIsIFJzMikuICovCgogICAgRklYUF9EQkwgICAgIHNtb290aExldmVsWzJdOyAgICAgICAgICAgICAvKiE8IGxldmVsIHNtb290aGluZyBzdGF0ZXMgKi8KICAgIEZJWFBfREJMICAgICBzbW9vdGhHYWluWzJdOyAgICAgICAgICAgICAgLyohPCBnYWluIHNtb290aGluZyBzdGF0ZXMgKi8KICAgIFVJTlQgICAgICAgICBob2xkQ250WzJdOyAgICAgICAgICAgICAgICAgLyohPCBob2xkIGNvdW50ZXIgKi8KCiAgICBGSVhQX0RCTCAgICAgbGltR2FpblsyXTsgICAgICAgICAgICAgICAgIC8qITwgbGltaXRlciBnYWluICovCiAgICBGSVhQX0RCTCAgICAgbGltRGVjYXk7ICAgICAgICAgICAgICAgICAgIC8qITwgbGltaXRlciBkZWNheSAobGluZWFyKSAqLwogICAgRklYUF9EQkwgICAgIHByZXZQZWFrWzJdOyAgICAgICAgICAgICAgICAvKiE8IG1heCBwZWFrIG9mIHByZXZpb3VzIGJsb2NrIChzdGVyZW8vbW9ubykqLwoKICAgIFdFSUdIVElOR19TVEFURVMgZmlsdGVyW01BWF9EUkNfQ0hBTk5FTFNdOyAvKiE8IGFycmF5IGhvbGRzIHdlaWdodGluZyBmaWx0ZXIgc3RhdGVzICovCgp9OwoKLyotLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKioKICogIFByb2ZpbGUgdGFibGVzLgogKi8Kc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEJvb3N0VGhyW10gPSB7CiAgICAoRklYUF9EQkwpKC00Mzw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC01Mzw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC01NTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC02NTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC01MDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC00MDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkJvb3N0VGhyW10gPSB7CiAgICAoRklYUF9EQkwpKC0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC00MTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC00MTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkVhcmx5Q3V0VGhyW10gPSB7CiAgICAoRklYUF9EQkwpKC0yNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkN1dFRocltdICAgICAgPSB7CiAgICAoRklYUF9EQkwpKC0xNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0xMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0xNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0xNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0xMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEN1dFRocltdICAgPSB7CiAgICAoRklYUF9EQkwpKDQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSg5PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDk8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSg0PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoNDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkJvb3N0UmF0aW9bXSA9IHsKICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAogICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAogICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzUuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvNS5mKSAtIDEuZikgKQp9OwpzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRWFybHlDdXRSYXRpb1tdID0gewogICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAogICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzEuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApCn07CnN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJDdXRSYXRpb1tdICAgICAgPSB7CiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvIDIuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICkKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEJvb3N0W10gPSB7CiAgICAoRklYUF9EQkwpKCA2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoIDY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgxMjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDEyPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEN1dFtdICAgPSB7CiAgICAoRklYUF9EQkwpKDI0PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgyNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgyNDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkZhc3RBdHRhY2tbXSA9IHsKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKQp9OwpzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRmFzdERlY2F5W10gID0gewogICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCiAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMDAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAogICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCiAgICBGTDJGWENPTlNUX0RCTCggKDIwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAgICgwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpCn07CnN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJTbG93QXR0YWNrW10gPSB7CiAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAogICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCiAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAogICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAgKDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSkKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYlNsb3dEZWNheVtdICA9IHsKICAgIEZMMkZYQ09OU1RfREJMKCAoMzAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoMzAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMDAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoMzAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoMTAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAgICAoMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKQp9OwoKc3RhdGljIGNvbnN0IElOVCB0YWJIb2xkT2ZmW10gICAgPSB7IDEwLCAxMCwgMTAsIDEwLCAxMCwgMCB9OwoKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkF0dGFja1RocltdID0gewogICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDEwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkRlY2F5VGhyW10gID0gewogICAgKEZJWFBfREJMKSgyMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDIwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMjA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgyMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDEwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoIDA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCn07CgovKioKICogIFdlaWdodGluZyBmaWx0ZXIgY29lZmZpY2llbnRzIChiaXF1YWQgYmFuZHBhc3MpLgogKi8Kc3RhdGljIGNvbnN0IEZJWFBfREJMIGIwID0gRkwyRlhDT05TVF9EQkwoMC41MzA1MDY2MmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYjEgPSAwLCBiMiA9IC1iMCAqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgYTEgPSBGTDJGWENPTlNUX0RCTCgtMC45NTIzNzk4M2YpLCBhMiA9IEZMMkZYQ09OU1RfREJMKC0wLjAyMjQ4ODM2Zik7ICAvKiBhMCA9IDEgKi8KCgovKi0tLS0tLS0tLS0tLS0gZnVuY3Rpb24gZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLSovCgovKioKICogXGJyaWVmICBDYWxjdWxhdGUgc2NhbGluZyBmYWN0b3IgZm9yIGRlbm90ZWQgcHJvY2Vzc2luZyBibG9jay4KICoKICogXHBhcmFtIGJsb2NrTGVuZ3RoICAgTGVuZ3RoIG9mIHByb2Nlc3NpbmcgYmxvY2suCiAqCiAqIFxyZXR1cm4gICAgc2hpZnRGYWN0b3IKICovCnN0YXRpYyBVSU5UIGdldFNoaWZ0RmFjdG9yKAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgbGVuZ3RoCiAgICAgICAgKQp7CiAgICBVSU5UIGxkTjsKICAgIGZvcihsZE49MTsoKChVSU5UKTEpPDxsZE4pIDwgbGVuZ3RoO2xkTisrKTsKCiAgICByZXR1cm4gbGROOwp9CgovKioKICogXGJyaWVmICBTdW0gdXAgZml4cG9pbnQgdmFsdWVzIHdpdGggYmVzdCBwb3NzaWJsZSBhY2N1cmFjeS4KICoKICogXHBhcmFtIHZhbHVlMSAgICAgICAgRmlyc3QgaW5wdXQgdmFsdWUuCiAqIFxwYXJhbSBxMSAgICAgICAgICAgIFNjYWxpbmcgZmFjdG9yIG9mIGZpcnN0IGlucHV0IHZhbHVlLgogKiBccGFyYW0gcFZhbHVlMiAgICAgICBQb2ludGVyIHRvIHNlY29uZCBpbnB1dCB2YWx1ZSwgd2lsbCBiZSBtb2RpZmllZCBvbiByZXR1cm4uCiAqIFxwYXJhbSBwUTIgICAgICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIHNjYWxpbmcgZmFjdG9yLCB3aWxsIGJlIG1vZGlmaWVkIG9uIHJldHVybi4KICoKICogXHJldHVybiAgICB2b2lkCiAqLwpzdGF0aWMgdm9pZCBmaXhwQWRkKAogICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgICAgICAgdmFsdWUxLAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAgICAgcTEsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgICAgICBwVmFsdWUyLAogICAgICAgIGludCAqY29uc3QgICAgICAgICAgICAgICAgICAgICAgcFEyCiAgICAgICAgKQp7CiAgY29uc3QgaW50IGhlYWRyb29tMSA9IGZOb3JteihmaXhwX2Ficyh2YWx1ZTEpKS0xOwogIGNvbnN0IGludCBoZWFkcm9vbTIgPSBmTm9ybXooZml4cF9hYnMoKnBWYWx1ZTIpKS0xOwogIGludCByZXN1bHRTY2FsZSA9IGZpeE1heChxMS1oZWFkcm9vbTEsICgqcFEyKS1oZWFkcm9vbTIpOwoKICBpZiAoICh2YWx1ZTEhPUZMMkZYQ09OU1RfREJMKDAuZikpICYmICgqcFZhbHVlMiE9RkwyRlhDT05TVF9EQkwoMC5mKSkgKSB7CiAgICByZXN1bHRTY2FsZSsrOwogIH0KCiAgKnBWYWx1ZTIgPSBzY2FsZVZhbHVlKHZhbHVlMSwgcTEtcmVzdWx0U2NhbGUpICsgc2NhbGVWYWx1ZSgqcFZhbHVlMiwgKCpwUTIpLXJlc3VsdFNjYWxlKTsKICAqcFEyID0gKCpwVmFsdWUyIT0oRklYUF9EQkwpMCkgPyByZXN1bHRTY2FsZSA6IERGUkFDVF9CSVRTLTE7Cn0KCi8qKgogKiBcYnJpZWYgIEZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIHRpbWUgY29uc3RhbnQgdG8gZmlsdGVyIGNvZWZmaWNpZW50LgogKgogKiBccGFyYW0gdCAgICAgICAgICAgICBUaW1lIGNvbnN0YW50LgogKiBccGFyYW0gc2FtcGxlUmF0ZSAgICBTYW1wbGluZyByYXRlIGluIEh6LgogKiBccGFyYW0gYmxvY2tMZW5ndGggICBMZW5ndGggb2YgcHJvY2Vzc2luZyBibG9jayBpbiBzYW1wbGVzIHBlciBjaGFubmVsLgogKgogKiBccmV0dXJuICAgIHJlc3VsdCA9IDEuMCAtIGV4cCgtMS4wLygodCkgKiAoZikpKQogKi8Kc3RhdGljIEZJWFBfREJMIHRjMkNvZWZmKAogICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgdCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBibG9ja0xlbmd0aAogICAgICAgICkKewogICBGSVhQX0RCTCBzYW1wbGVSYXRlRnJhY3Q7CiAgIEZJWFBfREJMIGJsb2NrTGVuZ3RoRnJhY3Q7CiAgIEZJWFBfREJMIGYsIHByb2R1Y3Q7CiAgIEZJWFBfREJMIGV4cG9uZW50LCByZXN1bHQ7CiAgIElOVCBlX3JlczsKCiAgIC8qIGYgPSBzYW1wbGVSYXRlL2Jsb2NrTGVuZ3RoICovCiAgIHNhbXBsZVJhdGVGcmFjdCA9IChGSVhQX0RCTCkoc2FtcGxlUmF0ZTw8KERGUkFDVF9CSVRTLTEtTUVUQURBVEFfTElOVF9CSVRTKSk7CiAgIGJsb2NrTGVuZ3RoRnJhY3QgPSAoRklYUF9EQkwpKGJsb2NrTGVuZ3RoPDwoREZSQUNUX0JJVFMtMS1NRVRBREFUQV9MSU5UX0JJVFMpKTsKICAgZiA9IGZEaXZOb3JtKHNhbXBsZVJhdGVGcmFjdCwgYmxvY2tMZW5ndGhGcmFjdCwgJmVfcmVzKTsKICAgZiA9IHNjYWxlVmFsdWUoZiwgZV9yZXMtTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBjb252ZXJ0IHRvIE1FVEFEQVRBX0ZSQUNUICovCgogICAvKiBwcm9kdWN0ID0gdCpmICovCiAgIHByb2R1Y3QgPSBmTXVsdE5vcm0odCwgZiwgJmVfcmVzKTsKICAgcHJvZHVjdCA9IHNjYWxlVmFsdWUocHJvZHVjdCwgZV9yZXMrTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBjb252ZXJ0IHRvIE1FVEFEQVRBX0ZSQUNUICovCgogICAvKiBleHBvbmVudCA9ICgtMS4wLygodCkgKiAoZikpKSAqLwogICBleHBvbmVudCA9IGZEaXZOb3JtKE1FVEFEQVRBX0ZSQUNUX1NDQUxFLCBwcm9kdWN0LCAmZV9yZXMpOwogICBleHBvbmVudCA9IHNjYWxlVmFsdWUoZXhwb25lbnQsIGVfcmVzLU1FVEFEQVRBX0lOVF9CSVRTKTsgLyogY29udmVydCB0byBNRVRBREFUQV9GUkFDVCAqLwoKICAgLyogZXhwb25lbnQgKiBsZChlKSAqLwogICBleHBvbmVudCA9IGZNdWx0KGV4cG9uZW50LEZJWFBfSUxPRzJfRElWMik8PDE7IC8qIGVeKHgpID0gMl4oeCpsZChlKSkgKi8KCiAgIC8qIGV4cCgtMS4wLygodCkgKiAoZikpKSAqLwogICByZXN1bHQgPSBmMlBvdygtZXhwb25lbnQsIERGUkFDVF9CSVRTLTEtTUVUQURBVEFfRlJBQ1RfQklUUywgJmVfcmVzKTsKCiAgIC8qIHJlc3VsdCA9IDEuMCAtIGV4cCgtMS4wLygodCkgKiAoZikpKSAqLwogICByZXN1bHQgPSAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIHNjYWxlVmFsdWUocmVzdWx0LCBlX3Jlcyk7CgogICByZXR1cm4gcmVzdWx0Owp9CgpJTlQgRkRLX0RSQ19HZW5lcmF0b3JfT3BlbigKICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgKnBoRHJjQ29tcAogICAgICAgICkKewogICAgSU5UIGVyciA9IDA7CiAgICBIRFJDX0NPTVAgaERjQ29tcCA9IE5VTEw7CgogICAgaWYgKHBoRHJjQ29tcCA9PSBOVUxMKSB7CiAgICAgIGVyciA9IC0xOwogICAgICBnb3RvIGJhaWw7CiAgICB9CgogICAgLyogYWxsb2NhdGUgbWVtb3J5ICovCiAgICBoRGNDb21wID0gKEhEUkNfQ09NUClGREtjYWxsb2MoMSwgc2l6ZW9mKERSQ19DT01QKSk7CgogICAgaWYgKGhEY0NvbXAgPT0gTlVMTCkgewogICAgICBlcnIgPSAtMTsKICAgICAgZ290byBiYWlsOwogICAgfQoKICAgIEZES21lbWNsZWFyKGhEY0NvbXAsIHNpemVvZihEUkNfQ09NUCkpOwoKICAgIC8qIFJldHVybiBkcmMgY29tcHJlc3NvciBpbnN0YW5jZSAqLwogICAgKnBoRHJjQ29tcCA9IGhEY0NvbXA7CiAgICByZXR1cm4gZXJyOwpiYWlsOgogICAgRkRLX0RSQ19HZW5lcmF0b3JfQ2xvc2UoJmhEY0NvbXApOwogICAgcmV0dXJuIGVycjsKfQoKSU5UIEZES19EUkNfR2VuZXJhdG9yX0Nsb3NlKAogICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAqcGhEcmNDb21wCiAgICAgICAgKQp7CiAgICBpZiAocGhEcmNDb21wID09IE5VTEwpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgaWYgKCpwaERyY0NvbXAgIT0gTlVMTCkgewogICAgICBGREtmcmVlKCpwaERyY0NvbXApOwogICAgICAqcGhEcmNDb21wID0gTlVMTDsKICAgIH0KICAgIHJldHVybiAwOwp9CgoKSU5UIEZES19EUkNfR2VuZXJhdG9yX0luaXRpYWxpemUoCiAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICBkcmNDb21wLAogICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZUxpbmUsCiAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlUkYsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBibG9ja0xlbmd0aCwKICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFICAgICAgICAgICAgICBjaGFubmVsTW9kZSwKICAgICAgICBjb25zdCBDSEFOTkVMX09SREVSICAgICAgICAgICAgIGNoYW5uZWxPcmRlciwKICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHVzZVdlaWdodGluZwogICAgICAgICkKewogICAgaW50IGk7CiAgICBDSEFOTkVMX01BUFBJTkcgY2hhbm5lbE1hcHBpbmc7CgogICAgZHJjQ29tcC0+bGltRGVjYXkgPSBGTDJGWENPTlNUX0RCTCggKCgwLjAwNmYgLyAyNTYpICogYmxvY2tMZW5ndGgpIC8gTUVUQURBVEFfSU5UX1NDQUxFICk7CgogICAgLyogU2F2ZSBwYXJhbWV0ZXJzLiAqLwogICAgZHJjQ29tcC0+YmxvY2tMZW5ndGggPSBibG9ja0xlbmd0aDsKICAgIGRyY0NvbXAtPnNhbXBsZVJhdGUgID0gc2FtcGxlUmF0ZTsKICAgIGRyY0NvbXAtPmNoYW5Db25maWcgPSBjaGFubmVsTW9kZTsKICAgIGRyY0NvbXAtPnVzZVdlaWdodGluZyA9IHVzZVdlaWdodGluZzsKCiAgICBpZiAoRkRLX0RSQ19HZW5lcmF0b3Jfc2V0RHJjUHJvZmlsZShkcmNDb21wLCBwcm9maWxlTGluZSwgcHJvZmlsZVJGKSE9MCkgeyAvKiBleHBlY3RzIGluaXRpYWxpemVkIGJsb2NrTGVuZ3RoIGFuZCBzYW1wbGVSYXRlICovCiAgICAgIHJldHVybiAoLTEpOwogICAgfQoKICAgIC8qIFNldCBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGNoYW5uZWwgb2Zmc2V0cy4gKi8KICAgIGlmIChGREthYWNFbmNfSW5pdENoYW5uZWxNYXBwaW5nKGNoYW5uZWxNb2RlLCBjaGFubmVsT3JkZXIsICZjaGFubmVsTWFwcGluZykhPUFBQ19FTkNfT0spIHsKICAgICAgcmV0dXJuICgtMik7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgZHJjQ29tcC0+Y2hhbm5lbElkeFtpXSA9IC0xOwoKICAgIHN3aXRjaCAoY2hhbm5lbE1vZGUpIHsKICAgIGNhc2UgTU9ERV8xOiAvKiBtb25vICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8yOiAvKiBzdGVyZW8gKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMV07CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE1PREVfMV8yOiAvKiAzY2ggKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8xXzJfMTogLyogNGNoICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8xXzJfMjogLyogNWNoICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBNT0RFXzFfMl8yXzE6ICAvKiA1LjEgY2ggKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6IC8qIDcuMSBjaCAqLwogICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsgLyogbCAqLwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMV07IC8qIHIgKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBjICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzRdLkNoYW5uZWxJbmRleFswXTsgLyogbGZlICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzNdLkNoYW5uZWxJbmRleFswXTsgLyogbHMgKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzFdOyAvKiBycyAqLwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07IC8qIGxjICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsgLyogcmMgKi8KICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsgLyogciAqLwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07IC8qIGMgKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bNF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsZmUgKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOyAvKiBscmVhciAqLwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMV07IC8qIHJyZWFyICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsgLyogbHMgKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOyAvKiBycyAqLwogICAgICAgIGJyZWFrOwogICAgY2FzZSBNT0RFXzFfMToKICAgIGNhc2UgTU9ERV8xXzFfMV8xOgogICAgY2FzZSBNT0RFXzFfMV8xXzFfMV8xOgogICAgY2FzZSBNT0RFXzFfMV8xXzFfMV8xXzFfMToKICAgIGNhc2UgTU9ERV8xXzFfMV8xXzFfMV8xXzFfMV8xXzFfMToKICAgIGNhc2UgTU9ERV8yXzI6CiAgICBjYXNlIE1PREVfMl8yXzI6CiAgICBjYXNlIE1PREVfMl8yXzJfMjoKICAgIGNhc2UgTU9ERV8yXzJfMl8yXzJfMjoKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CgogICAgZHJjQ29tcC0+ZnVsbENoYW5uZWxzID0gY2hhbm5lbE1hcHBpbmcubkNoYW5uZWxzRWZmOwogICAgZHJjQ29tcC0+Y2hhbm5lbHMgICAgID0gY2hhbm5lbE1hcHBpbmcubkNoYW5uZWxzOwoKICAgIC8qIEluaXQgc3RhdGVzLiAqLwogICAgZHJjQ29tcC0+c21vb3RoTGV2ZWxbMF0gPSBkcmNDb21wLT5zbW9vdGhMZXZlbFsxXSA9IChGSVhQX0RCTCkoLTEzNTw8TUVUQURBVEFfRlJBQ1RfQklUUyk7CgogICAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+c21vb3RoR2Fpbiwgc2l6ZW9mKGRyY0NvbXAtPnNtb290aEdhaW4pKTsKICAgIEZES21lbWNsZWFyKGRyY0NvbXAtPmhvbGRDbnQsIHNpemVvZihkcmNDb21wLT5ob2xkQ250KSk7CiAgICBGREttZW1jbGVhcihkcmNDb21wLT5saW1HYWluLCBzaXplb2YoZHJjQ29tcC0+bGltR2FpbikpOwogICAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+cHJldlBlYWssIHNpemVvZihkcmNDb21wLT5wcmV2UGVhaykpOwogICAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+ZmlsdGVyLCBzaXplb2YoZHJjQ29tcC0+ZmlsdGVyKSk7CgogICAgcmV0dXJuICgwKTsKfQoKCklOVCBGREtfRFJDX0dlbmVyYXRvcl9zZXREcmNQcm9maWxlKAogICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29tcCwKICAgICAgICBjb25zdCBEUkNfUFJPRklMRSAgICAgICAgICAgICAgIHByb2ZpbGVMaW5lLAogICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZVJGCiAgICAgICAgKQp7CiAgICBpbnQgcHJvZmlsZUlkeCwgaTsKCiAgICBkcmNDb21wLT5wcm9maWxlWzBdID0gcHJvZmlsZUxpbmU7CiAgICBkcmNDb21wLT5wcm9maWxlWzFdID0gcHJvZmlsZVJGOwoKICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAvKiBnZXQgcHJvZmlsZSBpbmRleCAqLwogICAgICAgIHN3aXRjaCAoZHJjQ29tcC0+cHJvZmlsZVtpXSkgewogICAgICAgICAgICBjYXNlIERSQ19OT05FOgogICAgICAgICAgICBjYXNlIERSQ19GSUxNU1RBTkRBUkQ6ICBwcm9maWxlSWR4ID0gMDsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRFJDX0ZJTE1MSUdIVDogICAgIHByb2ZpbGVJZHggPSAxOyBicmVhazsKICAgICAgICAgICAgY2FzZSBEUkNfTVVTSUNTVEFOREFSRDogcHJvZmlsZUlkeCA9IDI7IGJyZWFrOwogICAgICAgICAgICBjYXNlIERSQ19NVVNJQ0xJR0hUOiAgICBwcm9maWxlSWR4ID0gMzsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRFJDX1NQRUVDSDogICAgICAgIHByb2ZpbGVJZHggPSA0OyBicmVhazsKICAgICAgICAgICAgY2FzZSBEUkNfREVMQVlfVEVTVDogICAgcHJvZmlsZUlkeCA9IDU7IGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gKC0xKTsKICAgICAgICB9CgogICAgICAgIC8qIGdldCBwYXJhbWV0ZXJzIGZvciBzZWxlY3RlZCBwcm9maWxlICovCiAgICAgICAgaWYgKHByb2ZpbGVJZHggPj0gMCkgewogICAgICAgICAgICBkcmNDb21wLT5tYXhCb29zdFRocltpXSA9IHRhYk1heEJvb3N0VGhyW3Byb2ZpbGVJZHhdOwogICAgICAgICAgICBkcmNDb21wLT5ib29zdFRocltpXSAgICA9IHRhYkJvb3N0VGhyW3Byb2ZpbGVJZHhdOwogICAgICAgICAgICBkcmNDb21wLT5lYXJseUN1dFRocltpXSA9IHRhYkVhcmx5Q3V0VGhyW3Byb2ZpbGVJZHhdOwogICAgICAgICAgICBkcmNDb21wLT5jdXRUaHJbaV0gICAgICA9IHRhYkN1dFRocltwcm9maWxlSWR4XTsKICAgICAgICAgICAgZHJjQ29tcC0+bWF4Q3V0VGhyW2ldICAgPSB0YWJNYXhDdXRUaHJbcHJvZmlsZUlkeF07CgogICAgICAgICAgICBkcmNDb21wLT5ib29zdEZhY1tpXSAgICA9IHRhYkJvb3N0UmF0aW9bcHJvZmlsZUlkeF07CiAgICAgICAgICAgIGRyY0NvbXAtPmVhcmx5Q3V0RmFjW2ldID0gdGFiRWFybHlDdXRSYXRpb1twcm9maWxlSWR4XTsKICAgICAgICAgICAgZHJjQ29tcC0+Y3V0RmFjW2ldICAgICAgPSB0YWJDdXRSYXRpb1twcm9maWxlSWR4XTsKCiAgICAgICAgICAgIGRyY0NvbXAtPm1heEJvb3N0W2ldICAgID0gdGFiTWF4Qm9vc3RbcHJvZmlsZUlkeF07CiAgICAgICAgICAgIGRyY0NvbXAtPm1heEN1dFtpXSAgICAgID0gdGFiTWF4Q3V0W3Byb2ZpbGVJZHhdOwogICAgICAgICAgICBkcmNDb21wLT5tYXhFYXJseUN1dFtpXSA9IC0gZk11bHQoKGRyY0NvbXAtPmN1dFRocltpXSAtIGRyY0NvbXAtPmVhcmx5Q3V0VGhyW2ldKSwgZHJjQ29tcC0+ZWFybHlDdXRGYWNbaV0pOyAvKiBubyBzY2FsaW5nIGFmdGVyIG11bHQgbmVlZGVkLCBlYXJseUN1dEZhYyBpcyBpbiBGSVhQX0RCTCAqLwoKICAgICAgICAgICAgZHJjQ29tcC0+ZmFzdEF0dGFja1tpXSAgPSB0YzJDb2VmZih0YWJGYXN0QXR0YWNrW3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CiAgICAgICAgICAgIGRyY0NvbXAtPmZhc3REZWNheVtpXSAgID0gdGMyQ29lZmYodGFiRmFzdERlY2F5W3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CiAgICAgICAgICAgIGRyY0NvbXAtPnNsb3dBdHRhY2tbaV0gID0gdGMyQ29lZmYodGFiU2xvd0F0dGFja1twcm9maWxlSWR4XSwgZHJjQ29tcC0+c2FtcGxlUmF0ZSwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOwogICAgICAgICAgICBkcmNDb21wLT5zbG93RGVjYXlbaV0gICA9IHRjMkNvZWZmKHRhYlNsb3dEZWNheVtwcm9maWxlSWR4XSwgZHJjQ29tcC0+c2FtcGxlUmF0ZSwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOwogICAgICAgICAgICBkcmNDb21wLT5ob2xkT2ZmW2ldICAgICA9IHRhYkhvbGRPZmZbcHJvZmlsZUlkeF0gKiAyNTYgLyBkcmNDb21wLT5ibG9ja0xlbmd0aDsKCiAgICAgICAgICAgIGRyY0NvbXAtPmF0dGFja1RocltpXSAgID0gdGFiQXR0YWNrVGhyW3Byb2ZpbGVJZHhdOwogICAgICAgICAgICBkcmNDb21wLT5kZWNheVRocltpXSAgICA9IHRhYkRlY2F5VGhyW3Byb2ZpbGVJZHhdOwogICAgICAgIH0KCiAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpbltpXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICB9CiAgICByZXR1cm4gKDApOwp9CgoKSU5UIEZES19EUkNfR2VuZXJhdG9yX0NhbGMoCiAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICBkcmNDb21wLAogICAgICAgIGNvbnN0IElOVF9QQ00gKiBjb25zdCAgICAgICAgICAgaW5TYW1wbGVzLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgZGlhbG5vcm0sCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBkcmNfVGFyZ2V0UmVmTGV2ZWwsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBjb21wX1RhcmdldFJlZkxldmVsLAogICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICAgICAgY2xldiwKICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgICAgIHNsZXYsCiAgICAgICAgSU5UICogY29uc3QgICAgICAgICAgICAgICAgICAgICBwRHlucm5nLAogICAgICAgIElOVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgcENvbXByCiAgICAgICAgKQp7CiAgICBpbnQgaSwgYzsKICAgIEZJWFBfREJMIHBlYWtbMl07CgoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKiBjb21wcmVzc29yCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgaWYgKChkcmNDb21wLT5wcm9maWxlWzBdICE9IERSQ19OT05FKSB8fCAoZHJjQ29tcC0+cHJvZmlsZVsxXSAhPSBEUkNfTk9ORSkpIHsKICAgICAgICAvKiBDYWxjIGxvdWRuZXNzIGxldmVsICovCiAgICAgICAgRklYUF9EQkwgbGV2ZWxfYiA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgICAgaW50ICAgICAgbGV2ZWxfZSA9IERGUkFDVF9CSVRTLTE7CgogICAgICAgIC8qIEluY3JlYXNlIGVuZXJneSB0aW1lIHJlc29sdXRpb24gd2l0aCBzaG9ydGVyIHByb2Nlc3NpbmcgYmxvY2tzLiAzMiBpcyBhbiBlbXBpcmljIHZhbHVlLiAqLwogICAgICAgIGNvbnN0IGludCBncmFudWxlTGVuZ3RoID0gZml4TWluKDMyLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CgogICAgICAgIGlmIChkcmNDb21wLT51c2VXZWlnaHRpbmcpIHsKICAgICAgICAgICAgRklYUF9EQkwgeDEsIHgyLCB5LCB5MSwgeTI7CiAgICAgICAgICAgIC8qIHN1bSBvZiBmaWx0ZXIgY29lZmZpY2llbnRzIGFib3V0IDIuNSAtPiBzcXVhcmVkIHZhbHVlIGlzIDYuMjUKICAgICAgICAgICAgICAgV0VJR0hUSU5HX0ZJTFRFUl9TSElGVCBpcyAyIC0+IHNjYWxpbmcgYWJvdXQgMTYsIHRoZXJlZm9yZSByZWR1Y2UgZ3JhbnVsZVNoaWZ0IGJ5IDEuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25zdCBpbnQgZ3JhbnVsZVNoaWZ0ID0gZ2V0U2hpZnRGYWN0b3IoZ3JhbnVsZUxlbmd0aCktMTsKCiAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAoaW50KWRyY0NvbXAtPmNoYW5uZWxzOyBjKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gJmluU2FtcGxlc1tjXTsKCiAgICAgICAgICAgICAgICBpZiAoYyA9PSBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0pIHsKICAgICAgICAgICAgICAgICAgY29udGludWU7ICAvKiBza2lwIExGRSAqLwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIGdldCBmaWx0ZXIgc3RhdGVzICovCiAgICAgICAgICAgICAgICB4MSA9IGRyY0NvbXAtPmZpbHRlcltjXS54MTsKICAgICAgICAgICAgICAgIHgyID0gZHJjQ29tcC0+ZmlsdGVyW2NdLngyOwogICAgICAgICAgICAgICAgeTEgPSBkcmNDb21wLT5maWx0ZXJbY10ueTE7CiAgICAgICAgICAgICAgICB5MiA9IGRyY0NvbXAtPmZpbHRlcltjXS55MjsKCiAgICAgICAgICAgICAgICBpID0gMDsKCiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaTsKICAgICAgICAgICAgICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CgogICAgICAgICAgICAgICAgICBmb3IgKGk9b2Zmc2V0OyBpIDwgZml4TWluKG9mZnNldCtncmFudWxlTGVuZ3RoLGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLyogYXBwbHkgd2VpZ2h0aW5nIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHggPSBGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tpKmRyY0NvbXAtPmNoYW5uZWxzXSkgPj4gV0VJR0hUSU5HX0ZJTFRFUl9TSElGVDsKCiAgICAgICAgICAgICAgICAgICAgLyogeSA9IGIwICogKHggLSB4MikgLSBhMSAqIHkxIC0gYTIgKiB5MjsgKi8KICAgICAgICAgICAgICAgICAgICB5ID0gZk11bHQoYjAseC14MikgLSBmTXVsdChhMSx5MSkgLSBmTXVsdChhMix5Mik7CgogICAgICAgICAgICAgICAgICAgIHgyID0geDE7CiAgICAgICAgICAgICAgICAgICAgeDEgPSB4OwogICAgICAgICAgICAgICAgICAgIHkyID0geTE7CiAgICAgICAgICAgICAgICAgICAgeTEgPSB5OwoKICAgICAgICAgICAgICAgICAgICBhY2N1ICs9IGZQb3cyRGl2Mih5KT4+KGdyYW51bGVTaGlmdC0xKTsgICAgIC8qIHBhcnRpYWwgZW5lcmd5ICovCiAgICAgICAgICAgICAgICAgIH0gLyogaSAqLwoKICAgICAgICAgICAgICAgICAgZml4cEFkZChhY2N1LCBncmFudWxlU2hpZnQrMipXRUlHSFRJTkdfRklMVEVSX1NISUZULCAmbGV2ZWxfYiwgJmxldmVsX2UpOyAvKiBzdXAgdXAgcGFydGlhbCBlbmVyZ2llcyAqLwoKICAgICAgICAgICAgICAgIH0gd2hpbGUgKCBpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGggKTsKCgogICAgICAgICAgICAgICAgLyogc2F2ZSBmaWx0ZXIgc3RhdGVzICovCiAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueDEgPSB4MTsKICAgICAgICAgICAgICAgIGRyY0NvbXAtPmZpbHRlcltjXS54MiA9IHgyOwogICAgICAgICAgICAgICAgZHJjQ29tcC0+ZmlsdGVyW2NdLnkxID0geTE7CiAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueTIgPSB5MjsKICAgICAgICAgICAgfSAvKiBjICovCiAgICAgICAgfSAvKiB3ZWlnaHRpbmcgKi8KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29uc3QgaW50IGdyYW51bGVTaGlmdCA9IGdldFNoaWZ0RmFjdG9yKGdyYW51bGVMZW5ndGgpOwoKICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IChpbnQpZHJjQ29tcC0+Y2hhbm5lbHM7IGMrKykgewogICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSogcFNhbXBsZXMgPSAmaW5TYW1wbGVzW2NdOwoKICAgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgLyogc2tpcCBMRkUgKi8KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpID0gMDsKCiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBpOwogICAgICAgICAgICAgICAgICBGSVhQX0RCTCBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKCiAgICAgICAgICAgICAgICAgIGZvciAoaT1vZmZzZXQ7IGkgPCBmaXhNaW4ob2Zmc2V0K2dyYW51bGVMZW5ndGgsZHJjQ29tcC0+YmxvY2tMZW5ndGgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsIGVuZXJneSAqLwogICAgICAgICAgICAgICAgICAgIGFjY3UgKz0gZlBvdzJEaXYyKChGSVhQX1BDTSlwU2FtcGxlc1tpKmRyY0NvbXAtPmNoYW5uZWxzXSk+PihncmFudWxlU2hpZnQtMSk7CiAgICAgICAgICAgICAgICAgIH0gLyogaSAqLwoKICAgICAgICAgICAgICAgICAgZml4cEFkZChhY2N1LCBncmFudWxlU2hpZnQsICZsZXZlbF9iLCAmbGV2ZWxfZSk7IC8qIHN1cCB1cCBwYXJ0aWFsIGVuZXJnaWVzICovCgogICAgICAgICAgICAgICAgfSB3aGlsZSAoIGkgPCBkcmNDb21wLT5ibG9ja0xlbmd0aCApOwogICAgICAgICAgICB9CiAgICAgICAgfSAvKiB3ZWlnaHRpbmcgKi8KCiAgICAgICAgLyoKICAgICAgICAgKiBDb252ZXJ0IHRvIGRCRlMsIGFwcGx5IGRpYWxub3JtCiAgICAgICAgICovCiAgICAgICAgLyogbGV2ZWwgc2NhbGluZyAqLwoKICAgICAgICAvKiBkZXNjYWxlZCBsZXZlbCBpbiBsZDY0IHJlcHJlc2VudGF0aW9uICovCiAgICAgICAgRklYUF9EQkwgbGRMZXZlbCA9IENhbGNMZERhdGEobGV2ZWxfYikgKyAoRklYUF9EQkwpKChsZXZlbF9lLTEyKTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpIC0gQ2FsY0xkRGF0YSgoRklYUF9EQkwpKGRyY0NvbXAtPmJsb2NrTGVuZ3RoPDwoREZSQUNUX0JJVFMtMS0xMikpKTsKCiAgICAgICAgLyogaWYgKGxldmVsIDwgMWUtMTApIGxldmVsID0gMWUtMTBmOyAqLwogICAgICAgIGxkTGV2ZWwgPSBGREttYXgobGRMZXZlbCwgRkwyRlhDT05TVF9EQkwoLTAuNTE5MDUxMjY0ODI2MTUwMzY2ODU0NzM3NDEwODU3NzJmKSk7CgogICAgICAgIC8qIGxldmVsID0gMTAgKiBsb2cobGV2ZWwpL2xvZygxMCkgKyAzOwogICAgICAgICAqICAgICAgID0gMTAqbG9nKDIpL2xvZygxMCkgKiBsZChsZXZlbCkgKyAzOwogICAgICAgICAqICAgICAgID0gMTAgKiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQobGV2ZWwpICsgMwogICAgICAgICAqICAgICAgID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkKGxldmVsKSArIDAuMykKICAgICAgICAgKiAgICAgICA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KGxldmVsKSArIDAuMy82NCkgKiA2NAogICAgICAgICAqCiAgICAgICAgICogICAgYWRkaXRpb25hbCBzY2FsaW5nIHdpdGggTUVUQURBVEFfRlJBQ1RfQklUUzoKICAgICAgICAgKiAgICAgICA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KGxldmVsKSArIDAuMy82NCkgKiA2NCAqIDJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMpCiAgICAgICAgICogICAgICAgPSAxMCAqICgwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChsZXZlbCkgKyAwLjMvNjQpICogMl4oTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKQogICAgICAgICAqICAgICAgID0gMTAqMl4oTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKSAqICggMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQobGV2ZWwpICsgMC4zLzY0ICkKICAgICAgICAgKiAqLwogICAgICAgIEZJWFBfREJMIGxldmVsID0gZk11bHQoKEZJWFBfREJMKSgxMDw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkpLCBmTXVsdCggRkwyRlhDT05TVF9EQkwoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OWYpLCBsZExldmVsKSArIChGSVhQX0RCTCkoRkwyRlhDT05TVF9EQkwoMC4zZik+PkxEX0RBVEFfU0hJRlQpICk7CgogICAgICAgIC8qIGxldmVsIC09IGRpYWxub3JtICsgMzEgKi8gICAvKiB0aGlzIGlzIGZpeGVkIHRvIERvbGJ5LVJlZmVyZW5jZUxldmVsIGFzIGNvbXByZXNzb3IgcHJvZmlsZXMgYXJlIGRlZmluZWQgcmVsYXRpdmUgdG8gdGhpcyAqLwogICAgICAgIGxldmVsIC09ICgoRklYUF9EQkwpKGRpYWxub3JtPDwoTUVUQURBVEFfRlJBQ1RfQklUUy0xNikpICArIChGSVhQX0RCTCkoMzE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpKTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICBpZiAoZHJjQ29tcC0+cHJvZmlsZVtpXSA9PSBEUkNfTk9ORSkgewogICAgICAgICAgICAgICAgLyogbm8gY29tcHJlc3Npb24gKi8KICAgICAgICAgICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5baV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgRklYUF9EQkwgZ2FpbiwgYWxwaGEsIGx2bDJzbXRobHZsOwoKICAgICAgICAgICAgICAgIC8qIGNhbGMgc3RhdGljIGdhaW4gKi8KICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8PSBkcmNDb21wLT5tYXhCb29zdFRocltpXSkgewogICAgICAgICAgICAgICAgICAgIC8qIG1heCBib29zdCAqLwogICAgICAgICAgICAgICAgICAgIGdhaW4gPSBkcmNDb21wLT5tYXhCb29zdFtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgZHJjQ29tcC0+Ym9vc3RUaHJbaV0pIHsKICAgICAgICAgICAgICAgICAgICAvKiBib29zdCByYW5nZSAqLwogICAgICAgICAgICAgICAgICAgIGdhaW4gPSBmTXVsdCgobGV2ZWwgLSBkcmNDb21wLT5ib29zdFRocltpXSksZHJjQ29tcC0+Ym9vc3RGYWNbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPD0gZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0pIHsKICAgICAgICAgICAgICAgICAgICAvKiBudWxsIGJhbmQgKi8KICAgICAgICAgICAgICAgICAgICBnYWluID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDw9IGRyY0NvbXAtPmN1dFRocltpXSkgewogICAgICAgICAgICAgICAgICAgIC8qIGVhcmx5IGN1dCByYW5nZSAqLwogICAgICAgICAgICAgICAgICAgIGdhaW4gPSBmTXVsdCgobGV2ZWwgLSBkcmNDb21wLT5lYXJseUN1dFRocltpXSksIGRyY0NvbXAtPmVhcmx5Q3V0RmFjW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgZHJjQ29tcC0+bWF4Q3V0VGhyW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgLyogY3V0IHJhbmdlICovCiAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGZNdWx0KChsZXZlbCAtIGRyY0NvbXAtPmN1dFRocltpXSksIGRyY0NvbXAtPmN1dEZhY1tpXSkgLSBkcmNDb21wLT5tYXhFYXJseUN1dFtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIG1heCBjdXQgKi8KICAgICAgICAgICAgICAgICAgICBnYWluID0gLWRyY0NvbXAtPm1heEN1dFtpXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBjaG9vc2UgdGltZSBjb25zdGFudCAqLwogICAgICAgICAgICAgICAgbHZsMnNtdGhsdmwgPSBsZXZlbCAtIGRyY0NvbXAtPnNtb290aExldmVsW2ldOwogICAgICAgICAgICAgICAgaWYgKGdhaW4gPCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgLyogYXR0YWNrICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGx2bDJzbXRobHZsID4gZHJjQ29tcC0+YXR0YWNrVGhyW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhc3QgYXR0YWNrICovCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gZHJjQ29tcC0+ZmFzdEF0dGFja1tpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsb3cgYXR0YWNrICovCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gZHJjQ29tcC0+c2xvd0F0dGFja1tpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGx2bDJzbXRobHZsIDwgLWRyY0NvbXAtPmRlY2F5VGhyW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhc3QgcmVsZWFzZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPmZhc3REZWNheVtpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsb3cgcmVsZWFzZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPnNsb3dEZWNheVtpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogc21vb3RoIGdhaW4gJiBsZXZlbCAqLwogICAgICAgICAgICAgICAgaWYgKChnYWluIDwgZHJjQ29tcC0+c21vb3RoR2FpbltpXSkgfHwgKGRyY0NvbXAtPmhvbGRDbnRbaV0gPT0gMCkpIHsgLyogaG9sZCBnYWluIHVubGVzcyB3ZSBoYXZlIGFuIGF0dGFjayBvciBob2xkIHBlcmlvZCBpcyBvdmVyICovCiAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgYWNjdTsKCiAgICAgICAgICAgICAgICAgICAgLyogZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gPSAoMS1hbHBoYSkgKiBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSArIGFscGhhICogbGV2ZWw7ICovCiAgICAgICAgICAgICAgICAgICAgYWNjdSA9ICBmTXVsdCgoKEZJWFBfREJMKU1BWFZBTF9EQkwtYWxwaGEpLCBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgYWNjdSArPSBmTXVsdChhbHBoYSxsZXZlbCk7CiAgICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gPSBhY2N1OwoKICAgICAgICAgICAgICAgICAgICAvKiBkcmNDb21wLT5zbW9vdGhHYWluW2ldICA9ICgxLWFscGhhKSAqIGRyY0NvbXAtPnNtb290aEdhaW5baV0gKyBhbHBoYSAqIGdhaW47ICovCiAgICAgICAgICAgICAgICAgICAgYWNjdSA9ICBmTXVsdCgoKEZJWFBfREJMKU1BWFZBTF9EQkwtYWxwaGEpLCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKTsKICAgICAgICAgICAgICAgICAgICBhY2N1ICs9IGZNdWx0KGFscGhhLGdhaW4pOwogICAgICAgICAgICAgICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5baV0gPSBhY2N1OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIGhvbGQgY291bnRlciAqLwogICAgICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmhvbGRDbnRbaV0pIHsKICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+aG9sZENudFtpXS0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGdhaW4gPCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKSB7CiAgICAgICAgICAgICAgICAgIGRyY0NvbXAtPmhvbGRDbnRbaV0gPSBkcmNDb21wLT5ob2xkT2ZmW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IC8qIHByb2ZpbGUgIT0gRFJDX05PTkUgKi8KICAgICAgICB9IC8qIGZvciBpPTEuLjIgKi8KICAgICAgfSBlbHNlIHsKICAgICAgICAvKiBubyBjb21wcmVzc2lvbiAqLwogICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5bMF0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5bMV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgICB9CgogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqIGxpbWl0ZXIKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIC8qIGZpbmQgcGVhayBsZXZlbCAqLwogICAgcGVha1swXSA9IHBlYWtbMV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgZm9yIChpID0gMDsgaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoOyBpKyspIHsKICAgICAgICBGSVhQX0RCTCB0bXA7CiAgICAgICAgY29uc3QgSU5UX1BDTSogcFNhbXBsZXMgPSAmaW5TYW1wbGVzW2kqZHJjQ29tcC0+Y2hhbm5lbHNdOwogICAgICAgIElOVF9QQ00gbWF4U2FtcGxlID0gMDsKCiAgICAgICAgLyogc2luZ2xlIGNoYW5uZWxzICovCiAgICAgICAgZm9yIChjID0gMDsgYyA8IChpbnQpZHJjQ29tcC0+Y2hhbm5lbHM7IGMrKykgewogICAgICAgICAgICBtYXhTYW1wbGUgPSBGREttYXgobWF4U2FtcGxlLCBmQWJzKHBTYW1wbGVzW2NdKSk7CiAgICAgICAgfQogICAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgRlhfUENNMkZYX0RCTChtYXhTYW1wbGUpPj5ET1dOTUlYX1NISUZUKTsKCiAgICAgICAgLyogTHQvUnQgZG93bm1peCAqLwogICAgICAgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiAyKSB7CiAgICAgICAgICAgIC8qIEx0ICovCiAgICAgICAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CgogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgIC8qIExzICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgLyogTHMyICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgLyogUnMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAvKiBSczIgKi8KICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgIC8qIFMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAvKiBDICovCiAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTCAqLwoKICAgICAgICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKCiAgICAgICAgICAgIC8qIFJ0ICovCiAgICAgICAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgLyogTHMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAvKiBMczIgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAvKiBScyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgIC8qIFJzMiAqLwogICAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkpIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgLyogUyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgIC8qIEMgKi8KICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSICovCgogICAgICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOwogICAgICAgIH0KCiAgICAgICAgLyogTG8vUm8gZG93bm1peCAqLwogICAgICAgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiAyKSB7CiAgICAgICAgICAgIC8qIExvICovCiAgICAgICAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMczIgKi8KICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pKT4+KERPV05NSVhfU0hJRlQtMSk7IC8qIFMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDICovCiAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTCAqLwoKICAgICAgICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKCiAgICAgICAgICAgIC8qIFJvICovCiAgICAgICAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUnMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSczIgKi8KICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pKT4+KERPV05NSVhfU0hJRlQtMSk7IC8qIFMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDICovCiAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUiAqLwoKICAgICAgICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKICAgICAgICB9CgogICAgICAgIHBlYWtbMV0gPSBmaXhNYXgocGVha1swXSwgcGVha1sxXSk7CgogICAgICAgIC8qIE1vbm8gRG93bm1peCAtIGZvciBjb21wX3ZhbCBvbmx5ICovCiAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDEpIHsKICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMcyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExzMiAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUnMyICovCiAgICAgICAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSkgdG1wID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNy4xY2ggKi8KICAgICAgICAgICAgLyppZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkpIHRtcCAqPTAuNzA3ZjsqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pKT4+KERPV05NSVhfU0hJRlQtMSk7IC8qIFMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkgdG1wICs9IGZNdWx0KGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDICgyKmNsZXYpICovCiAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTCAqLwogICAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUl1dKT4+RE9XTk1JWF9TSElGVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFIgKi8KCiAgICAgICAgICAgIHBlYWtbMV0gPSBmaXhNYXgocGVha1sxXSwgZml4cF9hYnModG1wKSk7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaT0wOyBpPDI7IGkrKykgewogICAgICBGSVhQX0RCTCB0bXAgPSBkcmNDb21wLT5wcmV2UGVha1tpXTsKICAgICAgZHJjQ29tcC0+cHJldlBlYWtbaV0gPSBwZWFrW2ldOwogICAgICBwZWFrW2ldID0gZml4TWF4KHBlYWtbaV0sIHRtcCk7CgogICAgICAvKgogICAgICAgKiBDb252ZXJ0IHRvIGRCRlMsIGFwcGx5IGRpYWxub3JtCiAgICAgICAqLwogICAgICAvKiBkZXNjYWxlZCBwZWFrIGluIGxkNjQgcmVwcmVzZW50YXRpb24gKi8KICAgICAgRklYUF9EQkwgbGRfcGVhayA9IENhbGNMZERhdGEocGVha1tpXSkgKyAoRklYUF9EQkwpKChMT05HKURPV05NSVhfU0hJRlQ8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKTsKCiAgICAgIC8qIGlmIChwZWFrIDwgMWUtNikgbGV2ZWwgPSAxZS02ZjsgKi8KICAgICAgbGRfcGVhayA9IEZES21heChsZF9wZWFrLCBGTDJGWENPTlNUX0RCTCgtMC4zMTE0MzA3NTg4OTU2OTAyMjAxMTI4NDI0NDY1MTQ2M2YpKTsKCiAgICAgIC8qIHBlYWtbaV0gPSAyMCAqIGxvZyhwZWFrW2ldKS9sb2coMTApICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykKICAgICAgICogcGVha1tpXSA9IDIwICogbG9nKDIpL2xvZygxMCkgKiBsZChwZWFrW2ldKSArIDAuMmYgKyAoZHJjQ29tcC0+c21vb3RoR2FpbltpXSoyXk1FVEFEQVRBX0ZSQUNUX0JJVFMpCiAgICAgICAqIHBlYWtbaV0gPSAxMCAqIDIqMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkKHBlYWtbaV0pICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykKICAgICAgICoKICAgICAgICogICAgYWRkaXRpb25hbCBzY2FsaW5nIHdpdGggTUVUQURBVEFfRlJBQ1RfQklUUzoKICAgICAgICogcGVha1tpXSA9ICgxMCAqIDIqMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQocGVha1tpXSkgKiA2NCArIDAuMmYgKyAoZHJjQ29tcC0+c21vb3RoR2FpbltpXSoyXk1FVEFEQVRBX0ZSQUNUX0JJVFMpKSoyXigtTUVUQURBVEFfRlJBQ1RfQklUUykKICAgICAgICogcGVha1tpXSA9IDEwKjJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkgKiAyKjAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KHBlYWtbaV0pCiAgICAgICAqICAgICAgICAgKyAwLjJmKjJeKC1NRVRBREFUQV9GUkFDVF9CSVRTKSArIGRyY0NvbXAtPnNtb290aEdhaW5baV0KICAgICAgICovCiAgICAgIHBlYWtbaV0gPSBmTXVsdCgoRklYUF9EQkwpKDEwPDwoTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKSksIGZNdWx0KCBGTDJGWF9EQkwoMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ZiksIGxkX3BlYWspKTsKICAgICAgcGVha1tpXSArPSAoRkwyRlhfREJMKDAuNWYpPj5NRVRBREFUQV9JTlRfQklUUyk7ICAgICAgICAgICAvKiBhZGQgYSBsaXR0bGUgYml0IGhlYWRyb29tICovCiAgICAgIHBlYWtbaV0gKz0gIGRyY0NvbXAtPnNtb290aEdhaW5baV07CiAgICB9CgogICAgLyogcGVhayAtPSBkaWFsbm9ybSArIDMxOyAqLyAgLyogdGhpcyBpcyBEb2xieSBzdHlsZSBvbmx5ICovCiAgICBwZWFrWzBdIC09IChGSVhQX0RCTCkoKGRpYWxub3JtLWRyY19UYXJnZXRSZWZMZXZlbCk8PChNRVRBREFUQV9GUkFDVF9CSVRTLTE2KSk7IC8qIHBlYWtbMF0gLT0gZGlhbG5vcm0gLSBkcmNfVGFyZ2V0UmVmTGV2ZWwgKi8KCiAgICAvKiBwZWFrICs9IDExOyAqLyAgIC8qIHRoaXMgaXMgRG9sYnkgc3R5bGUgb25seSAqLyAgICAgIC8qIFJGIG1vZGUgb3V0cHV0IGlzIDExZEIgaGlnaGVyICovCiAgICAvKnBlYWsgKz0gY29tcF9UYXJnZXRSZWZMZXZlbCAtIGRyY19UYXJnZXRSZWZMZXZlbDsqLwogICAgcGVha1sxXSAtPSAoRklYUF9EQkwpKChkaWFsbm9ybS1jb21wX1RhcmdldFJlZkxldmVsKTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKTsgLyogcGVha1sxXSAtPSBkaWFsbm9ybSAtIGNvbXBfVGFyZ2V0UmVmTGV2ZWwgKi8KCiAgICAvKiBsaW1pdGVyIGdhaW4gKi8KICAgIGRyY0NvbXAtPmxpbUdhaW5bMF0gKz0gZHJjQ29tcC0+bGltRGVjYXk7ICAgICAgICAgICAgICAgLyogbGluZWFyIGxpbWl0ZXIgcmVsZWFzZSAqLwogICAgZHJjQ29tcC0+bGltR2FpblswXSA9IGZpeE1pbihkcmNDb21wLT5saW1HYWluWzBdLCAtcGVha1swXSk7CgogICAgZHJjQ29tcC0+bGltR2FpblsxXSArPSAyKmRyY0NvbXAtPmxpbURlY2F5OyAgICAgICAgICAgICAvKiBsaW5lYXIgbGltaXRlciByZWxlYXNlICovCiAgICBkcmNDb21wLT5saW1HYWluWzFdID0gZml4TWluKGRyY0NvbXAtPmxpbUdhaW5bMV0sIC1wZWFrWzFdKTsKCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAvKiBhcHBseSBsaW1pdGluZywgcmV0dXJuIERSQyBnYWlucyovCiAgICB7CiAgICAgICAgRklYUF9EQkwgdG1wOwoKICAgICAgICB0bXAgPSBkcmNDb21wLT5zbW9vdGhHYWluWzBdOwogICAgICAgIGlmIChkcmNDb21wLT5saW1HYWluWzBdIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgewogICAgICAgICAgdG1wICs9IGRyY0NvbXAtPmxpbUdhaW5bMF07CiAgICAgICAgfQogICAgICAgICpwRHlucm5nID0gKExPTkcpIHNjYWxlVmFsdWUodG1wLCAtKE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKTsKCiAgICAgICAgdG1wID0gZHJjQ29tcC0+c21vb3RoR2FpblsxXTsKICAgICAgICBpZiAoZHJjQ29tcC0+bGltR2FpblsxXSA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKICAgICAgICAgIHRtcCArPSBkcmNDb21wLT5saW1HYWluWzFdOwogICAgICAgIH0KICAgICAgICAqcENvbXByICA9IChMT05HKSBzY2FsZVZhbHVlKHRtcCwgLShNRVRBREFUQV9GUkFDVF9CSVRTLTE2KSk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCgpEUkNfUFJPRklMRSBGREtfRFJDX0dlbmVyYXRvcl9nZXREcmNQcm9maWxlKGNvbnN0IEhEUkNfQ09NUCBkcmNDb21wKQp7CiAgICByZXR1cm4gZHJjQ29tcC0+cHJvZmlsZVswXTsKfQoKRFJDX1BST0ZJTEUgRkRLX0RSQ19HZW5lcmF0b3JfZ2V0Q29tcFByb2ZpbGUoY29uc3QgSERSQ19DT01QIGRyY0NvbXApCnsKICAgIHJldHVybiBkcmNDb21wLT5wcm9maWxlWzFdOwp9CgoK