Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKICAgY29udGVudHMvZGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKI2luY2x1ZGUgImFkal90aHIuaCIKI2luY2x1ZGUgImFhY0VuY19yb20uaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKI2luY2x1ZGUgIkZES190cmlnRmN0cy5oIgoKdHlwZWRlZiBzdHJ1Y3R7CiAgICBMT05HICBzYW1wbGVSYXRlOwogICAgY29uc3QgU0ZCX1BBUkFNX0xPTkcgICpwYXJhbUxvbmc7CiAgICBjb25zdCBTRkJfUEFSQU1fU0hPUlQgKnBhcmFtU2hvcnQ7Cn1TRkJfSU5GT19UQUI7CgoKc3RhdGljIGNvbnN0IFNGQl9JTkZPX1RBQiBzZmJJbmZvVGFiW10gPSB7CiAgICB7ODAwMCwgICZwX0ZES2FhY0VuY184MDAwX2xvbmdfMTAyNCwgICZwX0ZES2FhY0VuY184MDAwX3Nob3J0XzEyOH0sCiAgICB7MTEwMjUsICZwX0ZES2FhY0VuY18xMTAyNV9sb25nXzEwMjQsICZwX0ZES2FhY0VuY18xMTAyNV9zaG9ydF8xMjh9LAogICAgezEyMDAwLCAmcF9GREthYWNFbmNfMTIwMDBfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfMTIwMDBfc2hvcnRfMTI4fSwKICAgIHsxNjAwMCwgJnBfRkRLYWFjRW5jXzE2MDAwX2xvbmdfMTAyNCwgJnBfRkRLYWFjRW5jXzE2MDAwX3Nob3J0XzEyOH0sCiAgICB7MjIwNTAsICZwX0ZES2FhY0VuY18yMjA1MF9sb25nXzEwMjQsICZwX0ZES2FhY0VuY18yMjA1MF9zaG9ydF8xMjh9LAogICAgezI0MDAwLCAmcF9GREthYWNFbmNfMjQwMDBfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfMjQwMDBfc2hvcnRfMTI4fSwKICAgIHszMjAwMCwgJnBfRkRLYWFjRW5jXzMyMDAwX2xvbmdfMTAyNCwgJnBfRkRLYWFjRW5jXzMyMDAwX3Nob3J0XzEyOH0sCiAgICB7NDQxMDAsICZwX0ZES2FhY0VuY180NDEwMF9sb25nXzEwMjQsICZwX0ZES2FhY0VuY180NDEwMF9zaG9ydF8xMjh9LAogICAgezQ4MDAwLCAmcF9GREthYWNFbmNfNDgwMDBfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfNDgwMDBfc2hvcnRfMTI4fSwKICAgIHs2NDAwMCwgJnBfRkRLYWFjRW5jXzY0MDAwX2xvbmdfMTAyNCwgJnBfRkRLYWFjRW5jXzY0MDAwX3Nob3J0XzEyOH0sCiAgICB7ODgyMDAsICZwX0ZES2FhY0VuY184ODIwMF9sb25nXzEwMjQsICZwX0ZES2FhY0VuY184ODIwMF9zaG9ydF8xMjh9LAogICAgezk2MDAwLCAmcF9GREthYWNFbmNfOTYwMDBfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfOTYwMDBfc2hvcnRfMTI4fQoKfTsKCi8qIDIyMDUwIGFuZCAyNDAwMCBIeiAqLwpzdGF0aWMgY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF8yMjA1MF9sb25nXzUxMiA9IHsKICAgIDMxLAogICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKICAgICAgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAyMCwgMjQsCiAgICAgIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAogICAgICAzMn0KfTsKCi8qIDMyMDAwIEh6ICovCnN0YXRpYyBjb25zdCBTRkJfUEFSQU1fTE9ORyBwXzMyMDAwX2xvbmdfNTEyID0gewogICAgMzcsCiAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAogICAgICAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwKICAgICAgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMjAsIDI0LCAyNCwgMjgsCiAgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyfQp9OwoKLyogNDQxMDAgSHogKi8Kc3RhdGljIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfNDQxMDBfbG9uZ181MTIgPSB7CiAgICAzNiwKICAgIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAogICAgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsCiAgICAxMiwgMTIsIDEyLCAxMiwgMTYsIDIwLCAyNCwgMjgsIDMyLCAzMiwKICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgNTJ9Cn07CgpzdGF0aWMgY29uc3QgU0ZCX0lORk9fVEFCIHNmYkluZm9UYWJMRDUxMltdID0gewogICAgeyA4MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCiAgICB7MTEwMjUsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKICAgIHsxMjAwMCwgJnBfMjIwNTBfbG9uZ181MTIsIE5VTEx9LAogICAgezE2MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCiAgICB7MjIwNTAsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKICAgIHsyNDAwMCwgJnBfMjIwNTBfbG9uZ181MTIsIE5VTEx9LAogICAgezMyMDAwLCAmcF8zMjAwMF9sb25nXzUxMiwgTlVMTH0sCiAgICB7NDQxMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKICAgIHs0ODAwMCwgJnBfNDQxMDBfbG9uZ181MTIsIE5VTEx9LAogICAgezY0MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCiAgICB7ODgyMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKICAgIHs5NjAwMCwgJnBfNDQxMDBfbG9uZ181MTIsIE5VTEx9LAoKfTsKCgovKiAyMjA1MCBhbmQgMjQwMDAgSHogKi8Kc3RhdGljIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfMjIwNTBfbG9uZ180ODAgPSB7CiAgICAzMCwKICAgIHsgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKICAgICAgNCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxMiwgMTYsIDIwLCAyNCwKICAgICAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMn0KfTsKCi8qIDMyMDAwIEh6ICovCnN0YXRpYyBjb25zdCBTRkJfUEFSQU1fTE9ORyBwXzMyMDAwX2xvbmdfNDgwID0gewogICAgMzcsCiAgICB7IDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCiAgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsCiAgICAgIDgsICA4LCAxMiwgMTIsIDEyLCAxNiwgMTYsIDIwLCAyNCwgMzIsCiAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzJ9Cn07CgovKiA0NDEwMCBIeiAqLwpzdGF0aWMgY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF80NDEwMF9sb25nXzQ4MCA9IHsKICAgIDM1LAogICAgeyA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAogICAgICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEyLAogICAgIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDI0LCAyOCwgMzIsIDMyLAogICAgIDMyLCAzMiwgMzIsIDMyLCA0OH0KfTsKCnN0YXRpYyBjb25zdCBTRkJfSU5GT19UQUIgc2ZiSW5mb1RhYkxENDgwW10gPSB7CiAgICB7IDgwMDAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKICAgIHsxMTAyNSwgJnBfMjIwNTBfbG9uZ180ODAsIE5VTEx9LAogICAgezEyMDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCiAgICB7MTYwMDAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKICAgIHsyMjA1MCwgJnBfMjIwNTBfbG9uZ180ODAsIE5VTEx9LAogICAgezI0MDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCiAgICB7MzIwMDAsICZwXzMyMDAwX2xvbmdfNDgwLCBOVUxMfSwKICAgIHs0NDEwMCwgJnBfNDQxMDBfbG9uZ180ODAsIE5VTEx9LAogICAgezQ4MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCiAgICB7NjQwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKICAgIHs4ODIwMCwgJnBfNDQxMDBfbG9uZ180ODAsIE5VTEx9LAogICAgezk2MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCgp9OwoKLyogRml4ZWQgcG9pbnQgcHJlY2lzaW9uIGRlZmluaXRpb25zICovCiNkZWZpbmUgUV9CQVJDVkFMICAgICAgICAoMjUpCgpzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX2luaXRTZmJUYWJsZShMT05HIHNhbXBsZVJhdGUsIElOVCBibG9ja1R5cGUsIElOVCBncmFudWxlTGVuZ3RoLCBJTlQgKnNmYk9mZnNldCwgSU5UICpzZmJDbnQpCnsKICBJTlQgIGksIHNwZWNTdGFydE9mZnNldCA9IDA7CiAgY29uc3QgVUNIQVIqIHNmYldpZHRoID0gTlVMTDsKICBjb25zdCBTRkJfSU5GT19UQUIgKnNmYkluZm8gPSBOVUxMOwogIGludCBzaXplOwoKICAvKgogICAgc2VsZWN0IHRhYmxlCiAgKi8KICBzd2l0Y2goZ3JhbnVsZUxlbmd0aCkgewogICAgY2FzZSAxMDI0OgogICAgY2FzZSAgOTYwOgogICAgICBzZmJJbmZvID0gc2ZiSW5mb1RhYjsKICAgICAgc2l6ZSA9IChJTlQpKHNpemVvZihzZmJJbmZvVGFiKS9zaXplb2YoU0ZCX0lORk9fVEFCKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSA1MTI6CiAgICAgIHNmYkluZm8gPSBzZmJJbmZvVGFiTEQ1MTI7CiAgICAgIHNpemUgPSBzaXplb2Yoc2ZiSW5mb1RhYkxENTEyKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDQ4MDoKICAgICAgc2ZiSW5mbyA9IHNmYkluZm9UYWJMRDQ4MDsKICAgICAgc2l6ZSA9IHNpemVvZihzZmJJbmZvVGFiTEQ0ODApOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfRlJBTUVfTEVOR1RIOwogIH0KCiAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXsKICAgIGlmKHNmYkluZm9baV0uc2FtcGxlUmF0ZSA9PSBzYW1wbGVSYXRlKXsKICAgICAgc3dpdGNoKGJsb2NrVHlwZSl7CiAgICAgIGNhc2UgTE9OR19XSU5ET1c6CiAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgogICAgICBjYXNlIFNUT1BfV0lORE9XOgogICAgICAgIHNmYldpZHRoID0gc2ZiSW5mb1tpXS5wYXJhbUxvbmctPnNmYldpZHRoOwogICAgICAgICpzZmJDbnQgID0gc2ZiSW5mb1tpXS5wYXJhbUxvbmctPnNmYkNudDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTSE9SVF9XSU5ET1c6CiAgICAgICAgc2ZiV2lkdGggPSBzZmJJbmZvW2ldLnBhcmFtU2hvcnQtPnNmYldpZHRoOwogICAgICAgICpzZmJDbnQgID0gc2ZiSW5mb1tpXS5wYXJhbVNob3J0LT5zZmJDbnQ7CiAgICAgICAgZ3JhbnVsZUxlbmd0aCAvPSBUUkFOU19GQUM7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChpID09IHNpemUpIHsKICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX1NBTVBMSU5HUkFURTsKICB9CgogIC8qCiAgICBjYWxjIHNmYiBvZmZzZXRzCiAgKi8KICBmb3IoaSA9IDA7IGkgPCAqc2ZiQ250OyBpKyspewogICAgICBzZmJPZmZzZXRbaV0gPSBzcGVjU3RhcnRPZmZzZXQ7CiAgICAgIHNwZWNTdGFydE9mZnNldCArPSBzZmJXaWR0aFtpXTsKICAgICAgaWYgKHNwZWNTdGFydE9mZnNldCA+PSBncmFudWxlTGVuZ3RoKSB7CiAgICAgICAgICBpKys7CiAgICAgICAgICBicmVhazsKICAgICAgfQogIH0KICAqc2ZiQ250ID0gZml4TWluKGksKnNmYkNudCk7CiAgc2ZiT2Zmc2V0WypzZmJDbnRdID0gZml4TWluKHNwZWNTdGFydE9mZnNldCxncmFudWxlTGVuZ3RoKTsKCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19CYXJjTGluZVZhbHVlCiAgICBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgYmFyYyB2YWx1ZSBmb3Igb25lIGZyZXF1ZW5jeSBsaW5lCiAgICByZXR1cm5zOiAgICAgIGJhcmMgdmFsdWUgb2YgbGluZQogICAgaW5wdXQ6ICAgICAgICBudW1iZXIgb2YgbGluZXMgaW4gdHJhbnNmb3JtLCBpbmRleCBvZiBsaW5lIHRvIGNoZWNrLCBGcwogICAgb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShJTlQgbm9PZkxpbmVzLCBJTlQgZmZ0TGluZSwgTE9ORyBzYW1wbGluZ0ZyZXEpCnsKCiAgICBGSVhQX0RCTCBGT1VSQlkzRU00ICAgICA9IChGSVhQX0RCTCkweDQ1ZTdiMjczOyAvKiA0LjAvMyAqIDAuMDAwMSBpbiBxNDMgKi8KICAgIEZJWFBfREJMIFBaWlo3NiAgICAgICAgID0gKEZJWFBfREJMKTB4NjM5ZDVlNGE7IC8qIDAuMDAwNzYgaW4gcTQxICovCiAgICBGSVhQX0RCTCBPTkUzUDMgICAgICAgICA9IChGSVhQX0RCTCkweDM1MzMzMzMzOyAvKiAxMy4zIGluIHEyNiAqLwogICAgRklYUF9EQkwgVEhSRUVQNSAgICAgICAgPSAoRklYUF9EQkwpMHgxYzAwMDAwMDsgLyogMy41IGluIHEyNyAqLwogICAgRklYUF9EQkwgSU5WNDgwICAgICAgICAgPSAoRklYUF9EQkwpMHg0NDQ0NDQ0NDsgLy8gMS80ODAgaW4gcTM5CgogICAgRklYUF9EQkwgY2VudGVyX2ZyZXEsIHgxLCB4MjsKICAgIEZJWFBfREJMIGJ2YWxGRlRMaW5lLCBhdGFuMSwgYXRhbjI7CgogICAgLyogVGhlb3JpdGljYWwgbWF4aW11bSBvZiBjZW50ZXJfZnJlcSAoc2FtcF9mcmVxKjAuNSkgaXMgOTZraHogKiAwLjUgPSA0ODAwMCAgICAgICAgKi8KICAgIC8qIFRoZW9yaXRpY2FsIG1heGltdW0gb2YgeDEgaXMgMS4zMzMzMzMzZS00ZiAqIGNlbnRlcl9mcmVxID0gNi40LCBjYW4ga2VlcCBpbiBxMjggICovCiAgICAvKiBUaGVvcml0aWNhbCBtYXhpbXVtIG9mIHgyIGlzIDAuMDAwNzZmICogY2VudGVyX2ZyZXEgPSAzNi40OCwgY2FuIGtlZXAgaW4gcTI1ICAgICAqLwoKICAgIGNlbnRlcl9mcmVxID0gZmZ0TGluZSAqIHNhbXBsaW5nRnJlcTsgICAgICAgLyogcTExIG9yIHE4ICovCgogICAgc3dpdGNoIChub09mTGluZXMpIHsKICAgICAgY2FzZSAxMDI0OgogICAgICAgIGNlbnRlcl9mcmVxID0gY2VudGVyX2ZyZXEgPDwgMjsgLyogcTEzICovCiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTI4OgogICAgICAgIGNlbnRlcl9mcmVxID0gY2VudGVyX2ZyZXEgPDwgNTsgLyogcTEzICovCiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNTEyOgogICAgICAgIGNlbnRlcl9mcmVxID0gKGZmdExpbmUgKiBzYW1wbGluZ0ZyZXEpIDw8IDM7ICAgLy8gcTEzCiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNDgwOgogICAgICAgIGNlbnRlcl9mcmVxID0gZk11bHQoY2VudGVyX2ZyZXEsIElOVjQ4MCkgPDwgNDsgLy8gcTEzCiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2VudGVyX2ZyZXEgPSAoRklYUF9EQkwpMDsKICAgIH0KCiAgICB4MSA9IGZNdWx0KGNlbnRlcl9mcmVxLCBGT1VSQlkzRU00KTsgICAgICAgIC8qIHExMyAqIHE0MyAtIChERlJBQ1RfQklUUy0xKSA9IHEyNSAqLwogICAgeDIgPSBmTXVsdChjZW50ZXJfZnJlcSwgUFpaWjc2KSA8PCAyOyAgICAgICAvKiBxMTMgKiBxNDEgLSAoREZSQUNUX0JJVFMtMSkgKyAyID0gcTI1ICovCgogICAgYXRhbjEgPSBmaXhwX2F0YW4oeDEpOwogICAgYXRhbjIgPSBmaXhwX2F0YW4oeDIpOwoKICAgIC8qIHEyNSAocTI2ICogcTMwIC0gKERGUkFDVF9CSVRTLTEpKSArIHEyNSAocTI3ICogcTMwICogcTMwKSAqLwogICAgYnZhbEZGVExpbmUgPSBmTXVsdChPTkUzUDMsIGF0YW4yKSArIGZNdWx0KFRIUkVFUDUsIGZNdWx0KGF0YW4xLCBhdGFuMSkpOwogICAgcmV0dXJuKGJ2YWxGRlRMaW5lKTsKCn0KCi8qCiAgIGRvIG5vdCBjb25zaWRlciBlbmVyZ2llcyBiZWxvdyBhIGNlcnRhaW4gaW5wdXQgc2lnbmFsIGxldmVsLAogICBpLmUuIG9mIC05NmRCIG9yIDEgYml0IGF0IDE2IGJpdCBQQ00gcmVzb2x1dGlvbiwKICAgbWlnaHQgbmVlZCB0byBiZSBjb25maWd1cmFibGUgdG8gZS5nLiAyNCBiaXQgUENNIElucHV0IG9yIGEgbG93ZXIKICAgcmVzb2x1dGlvbiBmb3IgbG93IGJpdCByYXRlcwoqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfSW5pdE1pblBDTVJlc29sdXRpb24oaW50ICAgbnVtUGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpwYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYlBDTXF1YW50VGhyZXNob2xkKQp7CiAgLyogUENNX1FVQU5UX05PSVNFID0gRkRLcG93KDEwLjBmLCAtIDIwLmYgLyAxMC4wZikgKiBBQlNfTE9XICogTk9STV9QQ01fRU5FUkdZICogRkRLcG93KDIsUENNX1FVQU5UX1RIUl9TQ0FMRSkgKi8KICAjZGVmaW5lIFBDTV9RVUFOVF9OT0lTRSAgKChGSVhQX0RCTCkweDAwNTQ3MDYyKQoKICBmb3IoIGludCBpID0gMDsgaSA8IG51bVBiOyBpKysgKSB7CiAgICBzZmJQQ01xdWFudFRocmVzaG9sZFtpXSA9IChwYk9mZnNldFtpKzFdIC0gcGJPZmZzZXRbaV0pICogUENNX1FVQU5UX05PSVNFOwogIH0KfQoKc3RhdGljIEZJWFBfREJMIGdldE1hc2tGYWN0b3IoCiAgICAgICAgY29uc3QgRklYUF9EQkwgZGJWYWxfZml4LAogICAgICAgIGNvbnN0IElOVCAgICAgIGRiVmFsX2UsCiAgICAgICAgY29uc3QgRklYUF9EQkwgdGVuX2ZpeCwKICAgICAgICBjb25zdCBJTlQgICAgICB0ZW5fZQogICAgICAgICkKewogICAgSU5UIHFfbXNrOwogICAgRklYUF9EQkwgbWFza19mYWN0b3I7CgogICAgbWFza19mYWN0b3IgPSBmUG93KHRlbl9maXgsIERGUkFDVF9CSVRTLTEtdGVuX2UsIC1kYlZhbF9maXgsIERGUkFDVF9CSVRTLTEtZGJWYWxfZSwgJnFfbXNrKTsKICAgIHFfbXNrID0gZml4TWluKERGUkFDVF9CSVRTLTEsZml4TWF4KC0oREZSQUNUX0JJVFMtMSkscV9tc2spKTsKCiAgICBpZiAoIChxX21zaz4wKSAmJiAobWFza19mYWN0b3I+KEZJWFBfREJMKU1BWFZBTF9EQkw+PnFfbXNrKSApIHsKICAgICAgbWFza19mYWN0b3IgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgIH0KICAgIGVsc2UgewogICAgICBtYXNrX2ZhY3RvciA9IHNjYWxlVmFsdWUobWFza19mYWN0b3IsIHFfbXNrKTsKICAgIH0KCiAgICByZXR1cm4gKG1hc2tfZmFjdG9yKTsKfQoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX2luaXRTcHJlYWRpbmcoSU5UIG51bVBiLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYkJhcmNWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJNYXNrTG9GYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBiTWFza0hpRmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tMb0ZhY3RvclNwckVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tIaUZhY3RvclNwckVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExPTkcgYml0cmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlKQoKewogICAgSU5UIGk7CiAgICBGSVhQX0RCTCBNQVNLTE9XU1BSRU4sIE1BU0tISUdIU1BSRU47CgogICAgRklYUF9EQkwgTUFTS0hJR0ggICAgICAgICAgICAgICA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAvKiAxLjUgaW4gcTI5ICovCiAgICBGSVhQX0RCTCBNQVNLTE9XICAgICAgICAgICAgICAgID0gKEZJWFBfREJMKTB4NjAwMDAwMDA7IC8qIDMuMCBpbiBxMjkgKi8KICAgIEZJWFBfREJMIE1BU0tMT1dTUFJFTkxPTkcgICAgICAgPSAoRklYUF9EQkwpMHg2MDAwMDAwMDsgLyogMy4wIGluIHEyOSAqLwogICAgRklYUF9EQkwgTUFTS0hJR0hTUFJFTkxPTkcgICAgICA9IChGSVhQX0RCTCkweDQwMDAwMDAwOyAvKiAyLjAgaW4gcTI5ICovCiAgICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOTE9OR0xPV0JSID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDEuNSBpbiBxMjkgKi8KICAgIEZJWFBfREJMIE1BU0tMT1dTUFJFTlNIT1JUICAgICAgPSAoRklYUF9EQkwpMHg0MDAwMDAwMDsgLyogMi4wIGluIHEyOSAqLwogICAgRklYUF9EQkwgTUFTS0hJR0hTUFJFTlNIT1JUICAgICA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAvKiAxLjUgaW4gcTI5ICovCiAgICBGSVhQX0RCTCBURU4gICAgICAgICAgICAgICAgICAgID0gKEZJWFBfREJMKTB4NTAwMDAwMDA7IC8qIDEwLjAgaW4gcTI3ICovCgogICAgaWYgKGJsb2NrVHlwZSAhPSBTSE9SVF9XSU5ET1cpCiAgICB7CiAgICAgICAgTUFTS0xPV1NQUkVOID0gTUFTS0xPV1NQUkVOTE9ORzsKICAgICAgICBNQVNLSElHSFNQUkVOID0gKGJpdHJhdGU+MjAwMDApP01BU0tISUdIU1BSRU5MT05HOk1BU0tISUdIU1BSRU5MT05HTE9XQlI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgTUFTS0xPV1NQUkVOID0gTUFTS0xPV1NQUkVOU0hPUlQ7CiAgICAgICAgTUFTS0hJR0hTUFJFTiA9IE1BU0tISUdIU1BSRU5TSE9SVDsKICAgIH0KCiAgICBmb3IoaT0wOyBpPG51bVBiOyBpKyspCiAgICB7CiAgICAgICAgaWYgKGkgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gPSBnZXRNYXNrRmFjdG9yKAogICAgICAgICAgICAgICAgICAgIGZNdWx0KE1BU0tISUdILCAocGJCYXJjVmFsdWVbaV0gLSBwYkJhcmNWYWx1ZVtpLTFdKSksIDIzLAogICAgICAgICAgICAgICAgICAgIFRFTiwgMjcpOwoKICAgICAgICAgICAgcGJNYXNrTG9GYWN0b3JbaS0xXSA9IGdldE1hc2tGYWN0b3IoCiAgICAgICAgICAgICAgICAgICAgZk11bHQoTUFTS0xPVywgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaS0xXSkpLCAyMywKICAgICAgICAgICAgICAgICAgICBURU4sIDI3KTsKCiAgICAgICAgICAgIHBiTWFza0hpRmFjdG9yU3ByRW5baV0gPSBnZXRNYXNrRmFjdG9yKAogICAgICAgICAgICAgICAgICAgIGZNdWx0KE1BU0tISUdIU1BSRU4sIChwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2ktMV0pKSwgMjMsCiAgICAgICAgICAgICAgICAgICAgVEVOLCAyNyk7CgogICAgICAgICAgICBwYk1hc2tMb0ZhY3RvclNwckVuW2ktMV0gPSBnZXRNYXNrRmFjdG9yKAogICAgICAgICAgICAgICAgICAgIGZNdWx0KE1BU0tMT1dTUFJFTiwgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaS0xXSkpLCAyMywKICAgICAgICAgICAgICAgICAgICBURU4sIDI3KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gICAgICAgICAgICA9IChGSVhQX0RCTCkwOwogICAgICAgICAgICBwYk1hc2tMb0ZhY3RvcltudW1QYi0xXSAgICAgID0gKEZJWFBfREJMKTA7CiAgICAgICAgICAgIHBiTWFza0hpRmFjdG9yU3ByRW5baV0gICAgICAgPSAoRklYUF9EQkwpMDsKICAgICAgICAgICAgcGJNYXNrTG9GYWN0b3JTcHJFbltudW1QYi0xXSA9IChGSVhQX0RCTCkwOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX2luaXRCYXJjVmFsdWVzKElOVCBudW1QYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bUxpbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxpbmdGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYkJ2YWwpCnsKICAgIElOVCBpOwogICAgRklYUF9EQkwgTUFYX0JBUkMgPSAoRklYUF9EQkwpMHgzMDAwMDAwMDsgLyogMjQuMCBpbiBxMjUgKi8KCiAgICBmb3IoaT0wOyBpPG51bVBiOyBpKyspCiAgICB7CiAgICAgICAgRklYUF9EQkwgdjEsIHYyLCBjdXJfYmFyazsKICAgICAgICB2MSA9IEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBwYk9mZnNldFtpXSwgc2FtcGxpbmdGcmVxdWVuY3kpOwogICAgICAgIHYyID0gRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUobnVtTGluZXMsIHBiT2Zmc2V0W2krMV0sIHNhbXBsaW5nRnJlcXVlbmN5KTsKICAgICAgICBjdXJfYmFyayA9ICh2MSA+PiAxKSArICh2MiA+PiAxKTsKICAgICAgICBwYkJ2YWxbaV0gPSBmaXhNaW4oY3VyX2JhcmssIE1BWF9CQVJDKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX2luaXRNaW5TbnIoY29uc3QgTE9ORyAgIGJpdHJhdGUsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMT05HICAgc2FtcGxlcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBudW1MaW5lcywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpzZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgc2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIGJsb2NrVHlwZSwKICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpzZmJNaW5TbnJMZERhdGEpCnsKICAgIElOVCBzZmI7CgogICAgLyogRml4IGNvbnZlcnNpb24gdmFyaWFibGVzICovCiAgICBJTlQgcWJmYWMsIHFwZXJ3aW4sIHFkaXYsIHFwZXBydF9jb25zdCwgcXBlcHJ0OwogICAgSU5UIHF0bXAsIHFzbnIsIHNmYldpZHRoOwoKICAgIEZJWFBfREJMIE1BWF9CQVJDICAgICAgID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDI0LjAgaW4gcTI1ICovCiAgICBGSVhQX0RCTCBNQVhfQkFSQ1AxICAgICA9IChGSVhQX0RCTCkweDMyMDAwMDAwOyAvKiAyNS4wIGluIHEyNSAqLwogICAgRklYUF9EQkwgQklUUzJQRUZBQyAgICAgPSAoRklYUF9EQkwpMHg0Yjg1MWViODsgLyogMS4xOCBpbiBxMzAgKi8KICAgIEZJWFBfREJMIFBFUlMyUDQgICAgICAgID0gKEZJWFBfREJMKTB4NjI0ZGQyZjI7IC8qIDAuMDI0IGluIHEzNiAqLwogICAgRklYUF9EQkwgT05FUDUgICAgICAgICAgPSAoRklYUF9EQkwpMHg2MDAwMDAwMDsgLyogMS41IGluIHEzMCAqLwogICAgRklYUF9EQkwgTUFYX1NOUiAgICAgICAgPSAoRklYUF9EQkwpMHgzMzMzMzMzMzsgLyogMC44IGluIHEzMCAqLwogICAgRklYUF9EQkwgTUlOX1NOUiAgICAgICAgPSAoRklYUF9EQkwpMHgwMDMxMjZlOTsgLyogMC4wMDMgaW4gcTMwICovCgogICAgRklYUF9EQkwgYmFyY0ZhY3RvciwgcGVQZXJXaW5kb3csIHBlUGFydCwgYmFyY1dpZHRoOwogICAgRklYUF9EQkwgcGVQYXJ0X2NvbnN0LCB0bXAsIHNuciwgb25lX3FzbnIsIG9uZV9wb2ludDU7CgogICAgLyogcmVsYXRpdmUgbnVtYmVyIG9mIGFjdGl2ZSBiYXJrcyAqLwogICAgYmFyY0ZhY3RvciA9IGZEaXZOb3JtKGZpeE1pbihGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShudW1MaW5lcywgc2ZiT2Zmc2V0W3NmYkFjdGl2ZV0sIHNhbXBsZXJhdGUpLCBNQVhfQkFSQyksCiAgICAgICAgTUFYX0JBUkNQMSwgJnFiZmFjKTsKCiAgICBxYmZhYyA9IERGUkFDVF9CSVRTLTEtcWJmYWM7CgogICAgcGVQZXJXaW5kb3cgPSBmRGl2Tm9ybShiaXRyYXRlLCBzYW1wbGVyYXRlLCAmcXBlcndpbik7CiAgICBxcGVyd2luID0gREZSQUNUX0JJVFMtMS1xcGVyd2luOwogICAgcGVQZXJXaW5kb3cgPSBmTXVsdChwZVBlcldpbmRvdywgQklUUzJQRUZBQyk7ICAgICAgICAgICAgICAgICAgIHFwZXJ3aW4gPSBxcGVyd2luICsgMzAgLSAoREZSQUNUX0JJVFMtMSk7CiAgICBwZVBlcldpbmRvdyA9IGZNdWx0KHBlUGVyV2luZG93LCBQRVJTMlA0KTsgICAgICAgICAgICAgICAgICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gKyAzNiAtIChERlJBQ1RfQklUUy0xKTsKCiAgICBzd2l0Y2ggKG51bUxpbmVzKSB7CiAgICAgIGNhc2UgMTAyNDoKICAgICAgICBxcGVyd2luID0gcXBlcndpbiAtIDEwOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDEyODoKICAgICAgICBxcGVyd2luID0gcXBlcndpbiAtIDc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNTEyOgogICAgICAgIHFwZXJ3aW4gPSBxcGVyd2luIC0gOTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA0ODA6CiAgICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gLSA5OwogICAgICAgIHBlUGVyV2luZG93ID0gZk11bHQocGVQZXJXaW5kb3csIEZMMkZYQ09OU1RfREJMKDQ4MC5mLzUxMi5mKSk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgLyogZm9yIHNob3J0IGJsb2NrcyBpdCBpcyBhc3N1bWVkIHRoYXQgbW9yZSBiaXRzIGFyZSBhdmFpbGFibGUgKi8KICAgIGlmIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKQogICAgewogICAgICAgIHBlUGVyV2luZG93ID0gZk11bHQocGVQZXJXaW5kb3csIE9ORVA1KTsKICAgICAgICBxcGVyd2luID0gcXBlcndpbiArIDMwIC0gKERGUkFDVF9CSVRTLTEpOwogICAgfQogICAgcGVQYXJ0X2NvbnN0ID0gZkRpdk5vcm0ocGVQZXJXaW5kb3csIGJhcmNGYWN0b3IsICZxZGl2KTsgICAgICBxcGVwcnRfY29uc3QgPSBxcGVyd2luIC0gcWJmYWMgKyBERlJBQ1RfQklUUy0xLXFkaXY7CgogICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKQogICAgewogICAgICAgIGJhcmNXaWR0aCA9IEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBzZmJPZmZzZXRbc2ZiKzFdLCBzYW1wbGVyYXRlKSAtCiAgICAgICAgICAgIEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBzZmJPZmZzZXRbc2ZiXSwgc2FtcGxlcmF0ZSk7CgogICAgICAgIC8qIGFkYXB0IHRvIHNmYiBiYW5kcyAqLwogICAgICAgIHBlUGFydCA9IGZNdWx0KHBlUGFydF9jb25zdCwgYmFyY1dpZHRoKTsgcXBlcHJ0ID0gcXBlcHJ0X2NvbnN0ICsgMjUgLSAoREZSQUNUX0JJVFMtMSk7CgogICAgICAgIC8qIHBlIC0+IHNuciBjYWxjdWxhdGlvbiAqLwogICAgICAgIHNmYldpZHRoID0gKHNmYk9mZnNldFtzZmIrMV0gLSBzZmJPZmZzZXRbc2ZiXSk7CiAgICAgICAgcGVQYXJ0ID0gZkRpdk5vcm0ocGVQYXJ0LCBzZmJXaWR0aCwgJnFkaXYpOyBxcGVwcnQgKz0gREZSQUNUX0JJVFMtMS1xZGl2OwoKICAgICAgICB0bXAgPSBmMlBvdyhwZVBhcnQsIERGUkFDVF9CSVRTLTEtcXBlcHJ0LCAmcXRtcCk7CiAgICAgICAgcXRtcCA9IERGUkFDVF9CSVRTLTEtcXRtcDsKCiAgICAgICAgLyogU3VidHJhY3QgMS41ICovCiAgICAgICAgcXNuciA9IGZpeE1pbihxdG1wLCAzMCk7CiAgICAgICAgdG1wID0gdG1wID4+IChxdG1wIC0gcXNucik7CgogICAgICAgIGlmKCgzMCsxLXFzbnIpID4gKERGUkFDVF9CSVRTLTEpKQogICAgICAgICAgICBvbmVfcG9pbnQ1ID0gKEZJWFBfREJMKTA7CiAgICAgICAgZWxzZQogICAgICAgICAgICBvbmVfcG9pbnQ1ID0gKEZJWFBfREJMKShPTkVQNSA+PiAoMzArMS1xc25yKSk7CgogICAgICAgIHNuciA9ICh0bXA+PjEpIC0gKG9uZV9wb2ludDUpOyBxc25yIC09IDE7CgogICAgICAgIC8qIG1heChzbnIsIDEuMCkgKi8KICAgICAgICBpZihxc25yID4gMCkKICAgICAgICAgICAgb25lX3FzbnIgPSAoRklYUF9EQkwpKDEgPDwgcXNucik7CiAgICAgICAgZWxzZQogICAgICAgICAgICBvbmVfcXNuciA9IChGSVhQX0RCTCkwOwoKICAgICAgICBzbnIgPSBmaXhNYXgob25lX3FzbnIsIHNucik7CgogICAgICAgIC8qIDEvc25yICovCiAgICAgICAgc25yID0gZkRpdk5vcm0ob25lX3FzbnIsIHNuciwgJnFzbnIpOwogICAgICAgIHFzbnIgPSBERlJBQ1RfQklUUy0xLXFzbnI7CiAgICAgICAgc25yID0gKHFzbnIgPiAzMCk/IChzbnI+Pihxc25yLTMwKSk6c25yOwoKICAgICAgICAvKiB1cHBlciBsaW1pdCBpcyAtMSBkQiAqLwogICAgICAgIHNuciA9IChzbnIgPiBNQVhfU05SKSA/IE1BWF9TTlIgOiBzbnI7CgogICAgICAgIC8qIGxvd2VyIGxpbWl0IGlzIC0yNSBkQiAqLwogICAgICAgIHNuciA9IChzbnIgPCBNSU5fU05SKSA/IE1JTl9TTlIgOiBzbnI7CiAgICAgICAgc25yID0gc25yIDw8IDE7CgogICAgICAgIHNmYk1pblNuckxkRGF0YVtzZmJdID0gQ2FsY0xkRGF0YShzbnIpOwogICAgfQp9CgpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFBzeUNvbmZpZ3VyYXRpb24oSU5UICAgYml0cmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNhbXBsZXJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBiYW5kd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBibG9ja3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgdXNlSVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTiAqcHN5Q29uZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCX1RZUEUgZmlsdGVyYmFuaykKewogICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgICBJTlQgICAgICBzZmI7CiAgICBGSVhQX0RCTCBzZmJCYXJjVmFsW01BWF9TRkJdOwogICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoTG9uZyA9IGdyYW51bGVMZW5ndGg7CiAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGhTaG9ydCA9IGdyYW51bGVMZW5ndGgvVFJBTlNfRkFDOwoKICAgIEZES21lbWNsZWFyKHBzeUNvbmYsIHNpemVvZihQU1lfQ09ORklHVVJBVElPTikpOwogICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCA9IGdyYW51bGVMZW5ndGg7CiAgICBwc3lDb25mLT5maWx0ZXJiYW5rID0gZmlsdGVyYmFuazsKCiAgICBwc3lDb25mLT5hbGxvd0lTICAgICAgID0gKHVzZUlTKSAmJiAoIChiaXRyYXRlL2JhbmR3aWR0aCkgPCA1ICk7CgogICAgLyogaW5pdCBzZmIgdGFibGUgKi8KICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX2luaXRTZmJUYWJsZShzYW1wbGVyYXRlLGJsb2NrdHlwZSxncmFudWxlTGVuZ3RoLHBzeUNvbmYtPnNmYk9mZnNldCwmcHN5Q29uZi0+c2ZiQ250KTsKICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CgogICAgLyogY2FsY3VsYXRlIGJhcmMgdmFsdWVzIGZvciBlYWNoIHBiICovCiAgICBGREthYWNFbmNfaW5pdEJhcmNWYWx1ZXMocHN5Q29uZi0+c2ZiQ250LAogICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCiAgICAgICAgICAgICAgICAgICBzYW1wbGVyYXRlLAogICAgICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCk7CgogICAgRkRLYWFjRW5jX0luaXRNaW5QQ01SZXNvbHV0aW9uKHBzeUNvbmYtPnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYlBjbVF1YW50VGhyZXNob2xkKTsKCiAgICAvKiBjYWxjdWxhdGUgc3ByZWFkaW5nIGZ1bmN0aW9uICovCiAgICBGREthYWNFbmNfaW5pdFNwcmVhZGluZyhwc3lDb25mLT5zZmJDbnQsCiAgICAgICAgICAgICAgICAgIHNmYkJhcmNWYWwsCiAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3IsCiAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yLAogICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sCiAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCiAgICAgICAgICAgICAgICAgIGJpdHJhdGUsCiAgICAgICAgICAgICAgICAgIGJsb2NrdHlwZSk7CgogICAgLyogaW5pdCByYXRpbyAqLwoKICAgIHBzeUNvbmYtPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGVnZXIgKi8KICAgIHBzeUNvbmYtPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciA9IChGSVhQX1NHTCkweDAxNDg7IC8qIEZMMkZYQ09OU1RfU0dMKDAuMDFmKTsgKi8gIC8qIGZyYWN0ICAgKi8KCiAgICBwc3lDb25mLT5jbGlwRW5lcmd5ID0gKEZJWFBfREJMKTB4NzczNTkzZmY7IC8qIEZMMkZYQ09OU1RfREJMKDEuMGU5Kk5PUk1fUENNX0VORVJHWSk7ICovCgogICAgaWYgKGJsb2NrdHlwZSE9U0hPUlRfV0lORE9XKSB7CiAgICAgICAgcHN5Q29uZi0+bG93cGFzc0xpbmUgPSAoSU5UKSgoMipiYW5kd2lkdGgqZnJhbWVMZW5ndGhMb25nKS9zYW1wbGVyYXRlKTsKICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZUxGRSA9IExGRV9MT1dQQVNTX0xJTkU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZSA9IChJTlQpKCgyKmJhbmR3aWR0aCpmcmFtZUxlbmd0aFNob3J0KS9zYW1wbGVyYXRlKTsKICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZUxGRSA9IDA7IC8qIExGRSBvbmx5IGluIGxvbmYgYmxvY2tzICovCiAgICAgICAgLyogcHN5Q29uZi0+Y2xpcEVuZXJneSAvPSAoVFJBTlNfRkFDICogVFJBTlNfRkFDKTsgKi8KICAgICAgICBwc3lDb25mLT5jbGlwRW5lcmd5ID4+PSA2OwogICAgfQoKICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5Q29uZi0+c2ZiQ250OyBzZmIrKyl7CiAgICAgICAgaWYgKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdID49IHBzeUNvbmYtPmxvd3Bhc3NMaW5lKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHBzeUNvbmYtPnNmYkFjdGl2ZSA9IHNmYjsKCiAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeUNvbmYtPnNmYkNudDsgc2ZiKyspewogICAgICAgIGlmIChwc3lDb25mLT5zZmJPZmZzZXRbc2ZiXSA+PSBwc3lDb25mLT5sb3dwYXNzTGluZUxGRSkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBwc3lDb25mLT5zZmJBY3RpdmVMRkUgPSBzZmI7CgogICAgLyogY2FsY3VsYXRlIG1pblNuciAqLwogICAgRkRLYWFjRW5jX2luaXRNaW5TbnIoYml0cmF0ZSwKICAgICAgICAgICAgICAgc2FtcGxlcmF0ZSwKICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCiAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldCwKICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICBibG9ja3R5cGUsCiAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1pblNuckxkRGF0YSk7CgogICAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCg==