Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAicHNkZWNfaHlicmlkLmgiCgoKI2luY2x1ZGUgImZmdC5oIgojaW5jbHVkZSAic2JyX3JhbS5oIgoKI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKI2luY2x1ZGUgInNicl9yb20uaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBJbml0SHlicmlkRmlsdGVyQmFuawogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOiAgIEluaXQgb25lIGluc3RhbmNlIG9mIEhBTkRMRV9IWUJSSUQgc3R1Y3QKCiBBcmd1bWVudHM6CgogUmV0dXJuOiAgICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgpTQlJfRVJST1IKSW5pdEh5YnJpZEZpbHRlckJhbmsgKCBIQU5ETEVfSFlCUklEIGhzLCAgICAgICAgICAvKiE8IEhhbmRsZSB0byBIWUJSSUQgc3RydWN0LiAqLwogICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGZyYW1lU2l6ZSwgICAgICAgICAgIC8qITwgRnJhbWVzaXplIChpbiBRbWYgc/piYmFuZCBzYW1wbGVzKS4gKi8KICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBub0JhbmRzLCAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRbWYgYmFuZHMgZm9yIGh5YnJpZCBmaWx0ZXJpbmcuICovCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBSZXNvbHV0aW9uICkgLyohPCBSZXNvbHV0aW9uIGluIFFtZiBiYW5kcyAobGVuZ3RoIG5vQmFuZHMpLiAqLwp7CiAgU0NIQVIgaTsKICBVQ0hBUiBtYXhOb0NoYW5uZWxzID0gMDsKCiAgZm9yIChpID0gMDsgaSA8IG5vQmFuZHM7IGkrKykgewogICAgaHMtPnBSZXNvbHV0aW9uW2ldID0gcFJlc29sdXRpb25baV07CiAgICBpZihwUmVzb2x1dGlvbltpXSA+IG1heE5vQ2hhbm5lbHMpCiAgICAgIG1heE5vQ2hhbm5lbHMgPSBwUmVzb2x1dGlvbltpXTsKICB9CgogIGhzLT5uUW1mQmFuZHMgICAgID0gbm9CYW5kczsKICBocy0+ZnJhbWVTaXplICAgICA9IGZyYW1lU2l6ZTsKICBocy0+cW1mQnVmZmVyTW92ZSA9IEhZQlJJRF9GSUxURVJfTEVOR1RIIC0gMTsKCiAgaHMtPnNmX21RbWZCdWZmZXIgPSAwOwoKICByZXR1cm4gU0JSREVDX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgZHVhbENoYW5uZWxGaWx0ZXJpbmcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjogICBmYXN0IDItY2hhbm5lbCByZWFsLXZhbHVlZCBmaWx0ZXJpbmcgd2l0aCA2LXRhcCBkZWxheS4KCiBBcmd1bWVudHM6CgogUmV0dXJuOiAgICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIQoyIGNoYW5uZWwgZmlsdGVyCjxwcmU+CiAgIEZpbHRlciBDb2VmczoKICAgMC4wLAogICAwLjAxODk5NDg3NTI2MDQ5LAogICAwLjAsCiAgIC0wLjA3MjkzMTM5MTY3NTM4LAogICAwLjAsCiAgIDAuMzA1OTY2MzA1NDUxNjgsCiAgIDAuNSwKICAgMC4zMDU5NjYzMDU0NTE2OCwKICAgMC4wLAogICAtMC4wNzI5MzEzOTE2NzUzOCwKICAgMC4wLAogICAwLjAxODk5NDg3NTI2MDQ5LAogICAwLjAKCgogICBGaWx0ZXIgZGVzaWduOgogICBoW3Esbl0gPSBnW25dICogY29zKDJwaS8yICogcSAqIChuLTYpICk7ICBuID0gMC4uMTIsICBxID0gMCwxOwoKICAgLT4gIGhbMCxuXSA9IGdbbl0gKiAxOwogICAtPiAgaFsxLG5dID0gZ1tuXSAqIHBvdygtMSxuKTsKPC9wcmU+CiovCgpzdGF0aWMgdm9pZCBzbG90QmFzZWREdWFsQ2hhbm5lbEZpbHRlcmluZyggY29uc3QgRklYUF9EQkwgKnBRbWZSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnBRbWZJbWFnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICptSHlicmlkUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICptSHlicmlkSW1hZykKewoKICBGSVhQX0RCTCAgdDEsIHQzLCB0NSwgdDY7CgogIC8qIHN5bW1ldHJpYyBmaWx0ZXIgY29lZmZpY2llbnRzICovCgogIC8qICB5b3UgZG9uJ3QgaGF2ZSB0byBzaGlmdCB0aGUgcmVzdWx0IGFmdGVyIGZNdWx0IGJlY2F1c2Ugb2YgcDJfMTNfMjAgPD0gMC41ICovCiAgdDEgPSBmTXVsdERpdjIocDJfMTNfMjBbMV0gLCAoIChwUW1mUmVhbFsxXSA+PiAxKSArIChwUW1mUmVhbFsxMV0gPj4gMSkpKTsKICB0MyA9IGZNdWx0RGl2MihwMl8xM18yMFszXSAsICggKHBRbWZSZWFsWzNdID4+IDEpICsgKHBRbWZSZWFsWyA5XSA+PiAxKSkpOwogIHQ1ID0gZk11bHREaXYyKHAyXzEzXzIwWzVdICwgKCAocFFtZlJlYWxbNV0gPj4gMSkgKyAocFFtZlJlYWxbIDddID4+IDEpKSk7CiAgdDYgPSBmTXVsdERpdjIocDJfMTNfMjBbNl0gLCAgIChwUW1mUmVhbFs2XSA+PiAxKSApOwoKICBtSHlicmlkUmVhbFswXSA9ICh0MSArIHQzICsgdDUgKyB0NikgPDwgMjsKICBtSHlicmlkUmVhbFsxXSA9ICgtIHQxIC0gdDMgLSB0NSArIHQ2KSA8PCAyOwoKICB0MSA9IGZNdWx0RGl2MihwMl8xM18yMFsxXSAsICggKHBRbWZJbWFnWzFdID4+IDEpICsgKHBRbWZJbWFnWzExXSA+PiAxKSkpOwogIHQzID0gZk11bHREaXYyKHAyXzEzXzIwWzNdICwgKCAocFFtZkltYWdbM10gPj4gMSkgKyAocFFtZkltYWdbIDldID4+IDEpKSk7CiAgdDUgPSBmTXVsdERpdjIocDJfMTNfMjBbNV0gLCAoIChwUW1mSW1hZ1s1XSA+PiAxKSArIChwUW1mSW1hZ1sgN10gPj4gMSkpKTsKICB0NiA9IGZNdWx0RGl2MihwMl8xM18yMFs2XSAsICAgIHBRbWZJbWFnWzZdID4+IDEgKTsKCiAgbUh5YnJpZEltYWdbMF0gPSAodDEgKyB0MyArIHQ1ICsgdDYpIDw8IDI7CiAgbUh5YnJpZEltYWdbMV0gPSAoLSB0MSAtIHQzIC0gdDUgKyB0NikgPDwgMjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBlaWdodENoYW5uZWxGaWx0ZXJpbmcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjogICBmYXN0IDgtY2hhbm5lbCBjb21wbGV4LXZhbHVlZCBmaWx0ZXJpbmcgd2l0aCA2LXRhcCBkZWxheS4KCiBBcmd1bWVudHM6CgogUmV0dXJuOiAgICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgIDggY2hhbm5lbCBmaWx0ZXIKCiAgIEltcGxlbWVudGF0aW9uIHVzaW5nIGEgRkZUIG9mIGxlbmd0aCA4CjxwcmU+CiAgIHByb3RvdHlwZSBmaWx0ZXIgY29lZmZpY2llbnRzOgogICAwLjAwNzQ2MDgyOTQ5ODEyICAgMC4wMjI3MDQyMDk0OTgyNSAgIDAuMDQ1NDY4NjU5MzA0NzMgICAwLjA3MjY2MTEzOTI5NTkxICAgMC4wOTg4NTEwODU3NTI2NCAgIDAuMTE3OTM3MTA1NjcyMTcKICAgMC4xMjUKICAgMC4xMTc5MzcxMDU2NzIxNyAgIDAuMDk4ODUxMDg1NzUyNjQgICAwLjA3MjY2MTEzOTI5NTkxICAgMC4wNDU0Njg2NTkzMDQ3MyAgIDAuMDIyNzA0MjA5NDk4MjUgICAwLjAwNzQ2MDgyOTQ5ODEyCgogICBGaWx0ZXIgZGVzaWduOgogICBOID0gMTM7IFEgPSA4OwogICBoW3Esbl0gICAgICAgPSBnW25dICogZXhwKGogKiAyICogcGkgLyBRICogKHEgKyAuNSkgKiAobiAtIDYpKTsgIG4gPSAwLi4oTi0xKSwgIHEgPSAwLi4oUS0xKTsKCiAgIFRpbWUgU2lnbmFsOiAgIHhbdF07CiAgIEZpbHRlciBCYW5rIE91dHB1dAogICB5W3EsdF0gPSBjb252KHhbdF0saFtxLHRdKSA9IGNvbnYoaFtxLHRdLHhbdF0pID0gc3VtKHhba10gKiBoW3EsIHQgLSBrXSApID0gc3VtKGhbcSwga10gKiB4W3QgLSBrXSApOyBrID0gMC4uKE4tMSk7CgogICB5W3EsdF0gPSAgIHhbdCAtIDEyXSpoW3EsIDEyXSAgKyAgeFt0IC0gMTFdKmhbcSwgMTFdICArICB4W3QgLSAxMF0qaFtxLCAxMF0gICsgIHhbdCAtICA5XSpoW3EsICA5XQogICAgICAgICAgICsgIHhbdCAtICA4XSpoW3EsICA4XSAgKyAgeFt0IC0gIDddKmhbcSwgIDddCiAgICAgICAgICAgKyAgeFt0IC0gIDZdKmhbcSwgIDZdCiAgICAgICAgICAgKyAgeFt0IC0gIDVdKmhbcSwgIDVdICArICB4W3QgLSAgNF0qaFtxLCAgNF0KICAgICAgICAgICArICB4W3QgLSAgM10qaFtxLCAgM10gICsgIHhbdCAtICAyXSpoW3EsICAyXSAgKyAgeFt0IC0gIDFdKmhbcSwgIDFdICArICB4W3QgLSAgMF0qaFtxLCAgMF07CgogICBoJ1txLCBuXSA9IGhbcSwoTi0xKS1uXSA9IGdbbl0gKiBleHAoaiAqIDIgKiBwaSAvIFEgKiAocSArIC41KSAqICg2IC0gbikpOyAgbiA9IDAuLihOLTEpLCAgcSA9IDAuLihRLTEpOwoKICAgeVtxLHRdID0gICB4W3QgLSAxMl0qaCdbcSwgIDBdICArICB4W3QgLSAxMV0qaCdbcSwgIDFdICArICB4W3QgLSAxMF0qaCdbcSwgIDJdICArICB4W3QgLSAgOV0qaCdbcSwgIDNdCiAgICAgICAgICAgKyAgeFt0IC0gIDhdKmgnW3EsICA0XSAgKyAgeFt0IC0gIDddKmgnW3EsICA1XQogICAgICAgICAgICsgIHhbdCAtICA2XSpoJ1txLCAgNl0KICAgICAgICAgICArICB4W3QgLSAgNV0qaCdbcSwgIDddICArICB4W3QgLSAgNF0qaCdbcSwgIDhdCiAgICAgICAgICAgKyAgeFt0IC0gIDNdKmgnW3EsICA5XSAgKyAgeFt0IC0gIDJdKmgnW3EsIDEwXSAgKyAgeFt0IC0gIDFdKmgnW3EsIDExXSAgKyAgeFt0IC0gIDBdKmgnW3EsIDEyXTsKCiAgIFRyeSB0byBzcGxpdCBvZmYgRkZUIE1vZHVsYXRpb24gVGVybToKICAgRkZUKHhbdF0sIHEpID0gc3VtKHhbdCtrXSpleHAoLWoqMipwaS9OICpxICogaykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0KICAgU3RlcCAxOiAgaCdbcSxuXSA9IGdbbl0gKiAoIGV4cChqICogMiAqIHBpIC8gOCAqIC41ICogKDYgLSBuKSkgKSAqICggZXhwIChqICogMiAqIHBpIC8gOCAqIHEgKiAoNiAtIG4pKSApOwoKICAgIGgnW3Esbl0gPSBnW25dICpjW25dICogbVtxLG5dOyAoc2VlIGFib3ZlKQogICAgY1tuXSAgICA9IGV4cCggaiAqIDIgKiBwaSAvIDggKiAuNSAqICg2IC0gbikgKTsKICAgIG1bcSxuXSAgPSBleHAoIGogKiAyICogcGkgLyA4ICogIHEgKiAoNiAtIG4pICk7CgogICAgeVtxLHRdID0geFt0IC0gIDBdKmdbMF0qY1swXSptW3EsMF0gICsgIHhbdCAtICAxXSpnWzFdKmNbIDFdKm1bcSwgMV0gICsgLi4uCiAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgKyAgeFt0IC0gMTJdKmdbMl0qY1sxMl0qbVtxLDEyXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIG4gICAgICAgICAgICAgICAgICAgbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXhwKC1qKjIqcGkpICAgICAgICAgICAgfCAgIG4nICAgICAgICAgICAgICAgICAgIGZmdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAwICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogNikgLT4gIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogMikgICAgIHwgICAyICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAwKQogICAgMSAgICAgICBleHAoIGogKiAyICogcGkgLyA4ICogcSAqIDUpIC0+ICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDMpICAgICB8ICAgMyAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogMSkKICAgIDIgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCAqIHEgKiA0KSAtPiAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA0KSAgICAgfCAgIDQgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDIpCiAgICAzICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogMykgLT4gIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNSkgICAgIHwgICA1ICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAzKQogICAgNCAgICAgICBleHAoIGogKiAyICogcGkgLyA4ICogcSAqIDIpIC0+ICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDYpICAgICB8ICAgNiAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNCkKICAgIDUgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCAqIHEgKiAxKSAtPiAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA3KSAgICAgfCAgIDcgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDUpCiAgICA2ICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAwICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA2KQogICAgNyAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMSAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNykKICAgIDggICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIKICAgIDkgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMKICAgIDEwICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQKICAgIDExICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUKICAgIDEyICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDYKCgogICAgbm93IHVzZSBmZnQgbW9kdWxhdGlvbiBjb2VmZmljaWVudHMKICAgIG1bNl0gID0gICAgICAgPSBmZnRbMF0KICAgIG1bN10gID0gICAgICAgPSBmZnRbMV0KICAgIG1bOF0gID0gbVsgMF0gPSBmZnRbMl0KICAgIG1bOV0gID0gbVsgMV0gPSBmZnRbM10KICAgIG1bMTBdID0gbVsgMl0gPSBmZnRbNF0KICAgIG1bMTFdID0gbVsgM10gPSBmZnRbNV0KICAgIG1bMTJdID0gbVsgNF0gPSBmZnRbNl0KICAgICAgICAgICAgbVsgNV0gPSBmZnRbN10KCiAgICB5W3EsdF0gPSAoICAgICAgICAgICAgICAgICAgICAgICB4W3QtIDZdKmdbIDZdKmNbIDZdICkgKiBmZnRbcSwwXSAgKwogICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgeFt0LSA3XSpnWyA3XSpjWyA3XSApICogZmZ0W3EsMV0gICsKICAgICAgICAgICAgICggeFt0LSAwXSpnWyAwXSpjWyAwXSArIHhbdC0gOF0qZ1sgOF0qY1sgOF0gKSAqIGZmdFtxLDJdICArCiAgICAgICAgICAgICAoIHhbdC0gMV0qZ1sgMV0qY1sgMV0gKyB4W3QtIDldKmdbIDldKmNbIDldICkgKiBmZnRbcSwzXSAgKwogICAgICAgICAgICAgKCB4W3QtIDJdKmdbIDJdKmNbIDJdICsgeFt0LTEwXSpnWzEwXSpjWzEwXSApICogZmZ0W3EsNF0gICsKICAgICAgICAgICAgICggeFt0LSAzXSpnWyAzXSpjWyAzXSArIHhbdC0xMV0qZ1sxMV0qY1sxMV0gKSAqIGZmdFtxLDVdICArCiAgICAgICAgICAgICAoIHhbdC0gNF0qZ1sgNF0qY1sgNF0gKyB4W3QtMTJdKmdbMTJdKmNbMTJdICkgKiBmZnRbcSw2XSAgKwogICAgICAgICAgICAgKCB4W3QtIDVdKmdbIDVdKmNbIDVdICAgICAgICAgICAgICAgICAgICAgICApICogZmZ0W3EsN107CgogICAgcHJlIHR3aWRkbGUgZmFjdG9ycyBjW25dID0gZXhwKGogKiAyICogcGkgLyA4ICogLjUgKiAoNiAtIG4pKTsKICAgIG4gICAgICAgICAgICAgICAgY10gICAgICAgICAgIHwgIG4gICAgICAgICAgICAgICAgY1tuXSAgICAgICAgIHwgIG4gICAgICAgICAgICAgICAgY1tuXQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIDAgICAgICAgZXhwKCBqICogNiAqIHBpIC8gOCkgIHwgIDEgICAgICAgZXhwKCBqICogNSAqIHBpIC8gOCkgIHwgIDIgICAgICAgZXhwKCBqICogNCAqIHBpIC8gOCkKICAgIDMgICAgICAgZXhwKCBqICogMyAqIHBpIC8gOCkgIHwgIDQgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCkgIHwgIDUgICAgICAgZXhwKCBqICogMSAqIHBpIC8gOCkKICAgIDYgICAgICAgZXhwKCBqICogMCAqIHBpIC8gOCkgIHwgIDcgICAgICAgZXhwKC1qICogMSAqIHBpIC8gOCkgIHwgIDggICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCkKICAgIDkgICAgICAgZXhwKC1qICogMyAqIHBpIC8gOCkgIHwgMTAgICAgICAgZXhwKC1qICogNCAqIHBpIC8gOCkgIHwgMTEgICAgICAgZXhwKC1qICogNSAqIHBpIC8gOCkKICAgMTIgICAgICAgZXhwKC1qICogNiAqIHBpIC8gOCkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKPC9wcmU+CiovCgovKiBkZWZpbmluZyByb3RhdGlvbiBmYWN0b3JzIGZvciAqQ2hhbm5lbEZpbHRlcmluZyAqLwoKI2RlZmluZSBjb3MwUGkgICAgRkwyRlhDT05TVF9EQkwoIDEuZikKI2RlZmluZSBzaW4wUGkgICAgRkwyRlhDT05TVF9EQkwoIDAuZikKCiNkZWZpbmUgY29zMVBpICAgIEZMMkZYQ09OU1RfREJMKC0xLmYpCiNkZWZpbmUgc2luMVBpICAgIEZMMkZYQ09OU1RfREJMKCAwLmYpCgojZGVmaW5lIGNvczFQaV8yICBGTDJGWENPTlNUX0RCTCggMC5mKQojZGVmaW5lIHNpbjFQaV8yICBGTDJGWENPTlNUX0RCTCggMS5mKQoKI2RlZmluZSBjb3MxUGlfMyAgRkwyRlhDT05TVF9EQkwoIDAuNWYpCiNkZWZpbmUgc2luMVBpXzMgIEZMMkZYQ09OU1RfREJMKCAwLjg2NjAyNTQwMzc4NDQ0ZikKCiNkZWZpbmUgY29zMFBpXzQgIGNvczBQaQojZGVmaW5lIGNvczFQaV80ICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU1ZikKI2RlZmluZSBjb3MyUGlfNCAgY29zMVBpXzIKI2RlZmluZSBjb3MzUGlfNCAgKC1jb3MxUGlfNCkKI2RlZmluZSBjb3M0UGlfNCAgKC1jb3MwUGlfNCkKI2RlZmluZSBjb3M1UGlfNCAgY29zM1BpXzQKI2RlZmluZSBjb3M2UGlfNCAgY29zMlBpXzQKCiNkZWZpbmUgc2luMFBpXzQgIHNpbjBQaQojZGVmaW5lIHNpbjFQaV80ICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU1ZikKI2RlZmluZSBzaW4yUGlfNCAgc2luMVBpXzIKI2RlZmluZSBzaW4zUGlfNCAgc2luMVBpXzQKI2RlZmluZSBzaW40UGlfNCAgc2luMFBpXzQKI2RlZmluZSBzaW41UGlfNCAgKC1zaW4zUGlfNCkKI2RlZmluZSBzaW42UGlfNCAgKC1zaW4yUGlfNCkKCiNkZWZpbmUgY29zMFBpXzggIGNvczBQaQojZGVmaW5lIGNvczFQaV84ICBGTDJGWENPTlNUX0RCTCgwLjkyMzg3OTUzMjUxMTI5ZikKI2RlZmluZSBjb3MyUGlfOCAgY29zMVBpXzQKI2RlZmluZSBjb3MzUGlfOCAgRkwyRlhDT05TVF9EQkwoMC4zODI2ODM0MzIzNjUwOWYpCiNkZWZpbmUgY29zNFBpXzggIGNvczJQaV80CiNkZWZpbmUgY29zNVBpXzggICgtY29zM1BpXzgpCiNkZWZpbmUgY29zNlBpXzggICgtY29zMlBpXzgpCgojZGVmaW5lIHNpbjBQaV84ICBzaW4wUGkKI2RlZmluZSBzaW4xUGlfOCAgY29zM1BpXzgKI2RlZmluZSBzaW4yUGlfOCAgc2luMVBpXzQKI2RlZmluZSBzaW4zUGlfOCAgY29zMVBpXzgKI2RlZmluZSBzaW40UGlfOCAgc2luMlBpXzQKI2RlZmluZSBzaW41UGlfOCAgc2luM1BpXzgKI2RlZmluZSBzaW42UGlfOCAgc2luMVBpXzQKCiNpZiBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYpCiAgI2RlZmluZSBGSVhQX0hZQiBGSVhQX1NHTAogICNkZWZpbmUgRklYUF9DQVNUIEZYX0RCTDJGWF9TR0wKI2Vsc2UKICAjZGVmaW5lIEZJWFBfSFlCIEZJWFBfREJMCiAgI2RlZmluZSBGSVhQX0NBU1QKI2VuZGlmCgpzdGF0aWMgY29uc3QgRklYUF9IWUIgIGNyWzEzXSA9CnsKICAgRklYUF9DQVNUKGNvczZQaV84KSwgRklYUF9DQVNUKGNvczVQaV84KSwgRklYUF9DQVNUKGNvczRQaV84KSwKICAgRklYUF9DQVNUKGNvczNQaV84KSwgRklYUF9DQVNUKGNvczJQaV84KSwgRklYUF9DQVNUKGNvczFQaV84KSwKICAgRklYUF9DQVNUKGNvczBQaV84KSwKICAgRklYUF9DQVNUKGNvczFQaV84KSwgRklYUF9DQVNUKGNvczJQaV84KSwgRklYUF9DQVNUKGNvczNQaV84KSwKICAgRklYUF9DQVNUKGNvczRQaV84KSwgRklYUF9DQVNUKGNvczVQaV84KSwgRklYUF9DQVNUKGNvczZQaV84KQp9OwoKc3RhdGljIGNvbnN0IEZJWFBfSFlCICBjaVsxM10gPQp7CiAgIEZJWFBfQ0FTVCggc2luNlBpXzgpLCBGSVhQX0NBU1QoIHNpbjVQaV84KSwgRklYUF9DQVNUKCBzaW40UGlfOCksCiAgIEZJWFBfQ0FTVCggc2luM1BpXzgpLCBGSVhQX0NBU1QoIHNpbjJQaV84KSwgRklYUF9DQVNUKCBzaW4xUGlfOCksCiAgIEZJWFBfQ0FTVCggc2luMFBpXzgpICwKICAgRklYUF9DQVNUKC1zaW4xUGlfOCksIEZJWFBfQ0FTVCgtc2luMlBpXzgpLCBGSVhQX0NBU1QoLXNpbjNQaV84KSwKICAgRklYUF9DQVNUKC1zaW40UGlfOCksIEZJWFBfQ0FTVCgtc2luNVBpXzgpLCBGSVhQX0NBU1QoLXNpbjZQaV84KQp9OwoKc3RhdGljIHZvaWQgc2xvdEJhc2VkRWlnaHRDaGFubmVsRmlsdGVyaW5nKCBjb25zdCBGSVhQX0RCTCAqcFFtZlJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnBRbWZJbWFnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZEltYWcpCnsKCiAgaW50IGJpbjsKICBGSVhQX0RCTCBfZmZ0WzEyOCArIEFMSUdOTUVOVF9ERUZBVUxUIC0gMV07CiAgRklYUF9EQkwgKmZmdCA9IChGSVhQX0RCTCAqKUFMSUdOX1BUUihfZmZ0KTsKCiNpZiBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYpCiAgY29uc3QgRklYUF9TR0wgKnAgPSBwOF8xM18yMDsgLyogQkFTRUxJTkVfUFMgKi8KI2Vsc2UKICBjb25zdCBGSVhQX0RCTCAqcCA9IHA4XzEzXzIwOyAvKiBCQVNFTElORV9QUyAqLwojZW5kaWYKCiAgLyogcHJlIHR3aWRkZWxpbmcgKi8KCiAgLyogICB4KihhKmIgKyBjKmQpID0gZk11bHREaXYyKHgsIGZNdWx0QWRkRGl2MihmTXVsdERpdjIoYSwgYiksIGMsIGQpKSAqLwogIC8qICAgeCooYSpiIC0gYypkKSA9IGZNdWx0RGl2Mih4LCBmTXVsdFN1YkRpdjIoZk11bHREaXYyKGEsIGIpLCBjLCBkKSkgKi8KICBGSVhQX0RCTCBhY2N1MSwgYWNjdTIsIGFjY3UzLCBhY2N1NDsKCiAgI2RlZmluZSBUV0lERExFXzEobl8wLG5fMSxuXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbbl8wXSwgcFFtZkltYWdbbl8wXSwgY3Jbbl8wXSwgY2lbbl8wXSk7ICBcCiAgICAgICAgIGFjY3UxID0gZk11bHREaXYyKHBbbl8wXSwgYWNjdTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGFjY3UyID0gZk11bHREaXYyKHBbbl8wXSwgYWNjdTIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcFFtZlJlYWxbbl8xXSwgcFFtZkltYWdbbl8xXSwgY3Jbbl8xXSwgY2lbbl8xXSk7ICBcCiAgICAgICAgIGFjY3UzID0gZk11bHREaXYyKHBbbl8xXSwgYWNjdTMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGFjY3U0ID0gZk11bHREaXYyKHBbbl8xXSwgYWNjdTQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGZmdFtGSVhQX0ZGVF9JRFhfUihuXzIpXSA9IGFjY3UxICsgYWNjdTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGZmdFtGSVhQX0ZGVF9JRFhfSShuXzIpXSA9IGFjY3UyICsgYWNjdTQ7CgogICNkZWZpbmUgVFdJRERMRV8wKG5fMCxuXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW25fMF0sIHBRbWZJbWFnW25fMF0sIGNyW25fMF0sIGNpW25fMF0pOyAgXAogICAgICAgICBmZnRbRklYUF9GRlRfSURYX1Iobl8xKV0gPSBmTXVsdERpdjIocFtuXzBdLCBhY2N1MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBmZnRbRklYUF9GRlRfSURYX0kobl8xKV0gPSBmTXVsdERpdjIocFtuXzBdLCBhY2N1Mik7CgogIFRXSURETEVfMCggNiwgMCkKICBUV0lERExFXzAoIDcsIDEpCgogIFRXSURETEVfMSggMCwgOCwgMikKICBUV0lERExFXzEoIDEsIDksIDMpCiAgVFdJRERMRV8xKCAyLDEwLCA0KQogIFRXSURETEVfMSggMywxMSwgNSkKICBUV0lERExFXzEoIDQsMTIsIDYpCgogIFRXSURETEVfMCggNSwgNykKCiAgZmZ0XzggKGZmdCk7CgogIC8qIHJlc29ydCBmZnQgZGF0YSBpbnRvIG91dHB1dCBhcnJheSovCiAgZm9yKGJpbj0wOyBiaW48ODtiaW4rKyApIHsKICAgIG1IeWJyaWRSZWFsW2Jpbl0gPSBmZnRbRklYUF9GRlRfSURYX1IoYmluKV0gPDwgNDsKICAgIG1IeWJyaWRJbWFnW2Jpbl0gPSBmZnRbRklYUF9GRlRfSURYX0koYmluKV0gPDwgNDsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgZmlsbEh5YnJpZERlbGF5TGluZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOiAgIFRoZSBkZWxheSBsaW5lIG9mIHRoZSBoeWJyaWQgZmlsdGVyIGlzIGZpbGxlZCBhbmQgY29waWVkIGZyb20KICAgICAgICAgICAgICAgIGxlZnQgdG8gcmlnaHQuCgogUmV0dXJuOiAgICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQKZmlsbEh5YnJpZERlbGF5TGluZSggRklYUF9EQkwgKipmaXhwUW1mUmVhbCwgICAgICAgICAgLyohPCBRbWYgcmVhbCBWYWx1ZXMgICAgKi8KICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipmaXhwUW1mSW1hZywgICAgICAgICAgLyohPCBRbWYgaW1hZyBWYWx1ZXMgICAgKi8KICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkTGVmdFJbMTJdLCAgLyohPCBIeWJyaWQgcmVhbCBWYWx1ZXMgbGVmdCBjaGFubmVsICAqLwogICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgIGZpeHBIeWJyaWRMZWZ0SVsxMl0sICAvKiE8IEh5YnJpZCBpbWFnIFZhbHVlcyBsZWZ0IGNoYW5uZWwgICovCiAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZFJpZ2h0UlsxMl0sIC8qITwgSHlicmlkIHJlYWwgVmFsdWVzIHJpZ2h0IGNoYW5uZWwgKi8KICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkUmlnaHRJWzEyXSwgLyohPCBIeWJyaWQgaW1hZyBWYWx1ZXMgcmlnaHQgY2hhbm5lbCAqLwogICAgICAgICAgICAgICAgICAgICBIQU5ETEVfSFlCUklEIGhIeWJyaWQgKQp7CiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGkgPCBIWUJSSURfRklMVEVSX0RFTEFZOyBpKyspIHsKICAgIHNsb3RCYXNlZEh5YnJpZEFuYWx5c2lzICggZml4cFFtZlJlYWxbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHBRbWZSZWFsW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhwSHlicmlkTGVmdFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHBIeWJyaWRMZWZ0SSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEh5YnJpZCApOwogIH0KCiAgRkRLbWVtY3B5KGZpeHBIeWJyaWRSaWdodFIsIGZpeHBIeWJyaWRMZWZ0Uiwgc2l6ZW9mKEZJWFBfREJMKSpOT19TVUJfUU1GX0NIQU5ORUxTKTsKICBGREttZW1jcHkoZml4cEh5YnJpZFJpZ2h0SSwgZml4cEh5YnJpZExlZnRJLCBzaXplb2YoRklYUF9EQkwpKk5PX1NVQl9RTUZfQ0hBTk5FTFMpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIHNsb3RCYXNlZEh5YnJpZEFuYWx5c2lzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246ICAgVGhlIGxvd2VyIFFNRiBzdWJiYW5kcyBhcmUgZnVydGhlciBzcGxpdCB0byBwcm92aWRlIGJldHRlcgogICAgICAgICAgICAgICAgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIFBTIHByb2Nlc3NpbmcuCgogIFJldHVybjogICAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKdm9pZApzbG90QmFzZWRIeWJyaWRBbmFseXNpcyAoIEZJWFBfREJMICpmaXhwUW1mUmVhbCwgICAgICAvKiE8IFFtZiByZWFsIFZhbHVlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpmaXhwUW1mSW1hZywgICAgICAvKiE8IFFtZiBpbWFnIFZhbHVlcyAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgZml4cEh5YnJpZFJlYWxbMTJdLCAgIC8qITwgSHlicmlkIHJlYWwgVmFsdWVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGZpeHBIeWJyaWRJbWFnWzEyXSwgICAvKiE8IEh5YnJpZCBpbWFnIFZhbHVlcyAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfSFlCUklEIGhIeWJyaWQpCnsKICBpbnQgIGssIGJhbmQ7CiAgSFlCUklEX1JFUyBoeWJyaWRSZXM7CiAgaW50ICBjaE9mZnNldCA9IDA7CgogIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwVGVtcFJlYWxTbG90LCBGSVhQX0RCTCwgNCpIWUJSSURfRklMVEVSX0xFTkdUSCk7CgogIEZJWFBfREJMICpwVGVtcEltYWdTbG90ID0gcFRlbXBSZWFsU2xvdCArIEhZQlJJRF9GSUxURVJfTEVOR1RIOwogIEZJWFBfREJMICpwV29ya1JlYWxTbG90ID0gcFRlbXBJbWFnU2xvdCArIEhZQlJJRF9GSUxURVJfTEVOR1RIOwogIEZJWFBfREJMICpwV29ya0ltYWdTbG90ID0gcFdvcmtSZWFsU2xvdCArIEhZQlJJRF9GSUxURVJfTEVOR1RIOwoKICAvKiEKICBIeWJyaWQgZmlsdGVyaW5nIGlzIGFwcGxpZWQgdG8gdGhlIGZpcnN0IGhIeWJyaWQtPm5RbWZCYW5kcyBRTUYgYmFuZHMgKDMgd2hlbiAxMCBvciAyMCBzdGVyZW8gYmFuZHMKICBhcmUgdXNlZCwgNSB3aGVuIDM0IHN0ZXJlbyBiYW5kcyBhcmUgdXNlZCkuIEZvciB0aGUgcmVtYWluaW5nIFFNRiBiYW5kcyBhIGRlbGF5IHdvdWxkIGJlIG5lY2Vzc2FyeS4KICBCdXQgdGhlcmUgaXMgbm8gbmVlZCB0byBpbXBsZW1lbnQgYSBkZWxheSBiZWNhdXNlIHRoZXJlIGlzIGEgbG9vay1haGVhZCBvZiBIWUJSSURfRklMVEVSX0RFTEFZID0gNgogIFFNRiBzYW1wbGVzIGluIHRoZSBsb3ctYmFuZCBidWZmZXIuCiAgKi8KCiAgZm9yKGJhbmQgPSAwOyBiYW5kIDwgaEh5YnJpZC0+blFtZkJhbmRzOyBiYW5kKyspIHsKCiAgICAvKiAgZ2V0IGh5YnJpZCByZXNvbHV0aW9uIHBlciBxbWYgYmFuZCAgICAgICAgICAgICAgICAqLwogICAgLyogIGluIGNhc2Ugb2YgYmFzZWxpbmUgcHMgMTAvMjAgYmFuZCBzdGVyZW8gbW9kZSA6ICAgKi8KICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgICAgICAgICAgICBxbWZCYW5kWzBdIDogOCAoIEhZQlJJRF84X0NQTFggKSAgICAgICAqLwogICAgLyogICAgICAgICAgICAgcW1mQmFuZFsxXSA6IDIgKCBIWUJSSURfMl9SRUFMICkgICAgICAgKi8KICAgIC8qICAgICAgICAgICAgIHFtZkJhbmRbMl0gOiAyICggSFlCUklEXzJfUkVBTCApICAgICAgICovCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgLyogIChzcGxpdCB0aGUgMyBsb3dlciBxbWYgYmFuZCB0byAxMiBoeWJyaWQgYmFuZHMpICAgKi8KCiAgICBoeWJyaWRSZXMgPSAoSFlCUklEX1JFUyloSHlicmlkLT5wUmVzb2x1dGlvbltiYW5kXTsKCiAgICBGREttZW1jcHkocFdvcmtSZWFsU2xvdCwgaEh5YnJpZC0+bVFtZkJ1ZmZlclJlYWxTbG90W2JhbmRdLCBoSHlicmlkLT5xbWZCdWZmZXJNb3ZlICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICBGREttZW1jcHkocFdvcmtJbWFnU2xvdCwgaEh5YnJpZC0+bVFtZkJ1ZmZlckltYWdTbG90W2JhbmRdLCBoSHlicmlkLT5xbWZCdWZmZXJNb3ZlICogc2l6ZW9mKEZJWFBfREJMKSk7CgogICAgcFdvcmtSZWFsU2xvdFtoSHlicmlkLT5xbWZCdWZmZXJNb3ZlXSA9IGZpeHBRbWZSZWFsW2JhbmRdOwogICAgcFdvcmtJbWFnU2xvdFtoSHlicmlkLT5xbWZCdWZmZXJNb3ZlXSA9IGZpeHBRbWZJbWFnW2JhbmRdOwoKICAgIEZES21lbWNweShoSHlicmlkLT5tUW1mQnVmZmVyUmVhbFNsb3RbYmFuZF0sIHBXb3JrUmVhbFNsb3QgKyAxLCBoSHlicmlkLT5xbWZCdWZmZXJNb3ZlICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICBGREttZW1jcHkoaEh5YnJpZC0+bVFtZkJ1ZmZlckltYWdTbG90W2JhbmRdLCBwV29ya0ltYWdTbG90ICsgMSwgaEh5YnJpZC0+cW1mQnVmZmVyTW92ZSAqIHNpemVvZihGSVhQX0RCTCkpOwoKICAgIGlmIChmaXhwUW1mUmVhbCkgewoKICAgICAgLyogYWN0dWFsIGZpbHRlcmluZyBvbmx5IGlmIG91dHB1dCBzaWduYWwgcmVxdWVzdGVkICovCiAgICAgIHN3aXRjaCggaHlicmlkUmVzICkgewoKICAgICAgLyogSFlCUklEXzJfUkVBTCAmIEhZQlJJRF84X0NQTFggYXJlIG9ubHkgbmVlZGZ1bCBmb3IgYmFzZWxpbmUgcHMgKi8KICAgICAgY2FzZSBIWUJSSURfMl9SRUFMOgoKICAgICAgICBzbG90QmFzZWREdWFsQ2hhbm5lbEZpbHRlcmluZyggcFdvcmtSZWFsU2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtJbWFnU2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBSZWFsU2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBJbWFnU2xvdCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEhZQlJJRF84X0NQTFg6CgogICAgICAgIHNsb3RCYXNlZEVpZ2h0Q2hhbm5lbEZpbHRlcmluZyggcFdvcmtSZWFsU2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrSW1hZ1Nsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFJlYWxTbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBJbWFnU2xvdCk7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIEZES19BU1NFUlQoMCk7CiAgICAgIH0KCiAgICAgIGZvcihrID0gMDsgayA8IChTQ0hBUiloeWJyaWRSZXM7IGsrKykgewogICAgICAgIGZpeHBIeWJyaWRSZWFsIFtjaE9mZnNldCArIGtdID0gcFRlbXBSZWFsU2xvdFtrXTsKICAgICAgICBmaXhwSHlicmlkSW1hZyBbY2hPZmZzZXQgKyBrXSA9IHBUZW1wSW1hZ1Nsb3Rba107CiAgICAgIH0KICAgICAgY2hPZmZzZXQgKz0gaHlicmlkUmVzOwogICAgfSAvKiBpZiAobUh5YnJpZFJlYWwpICovCiAgfQoKICAvKiBncm91cCBoeWJyaWQgY2hhbm5lbHMgMys0IC0+IDMgYW5kIDIrNSAtPiAyICovCiAgZml4cEh5YnJpZFJlYWxbM10gKz0gZml4cEh5YnJpZFJlYWxbNF07CiAgZml4cEh5YnJpZEltYWdbM10gKz0gZml4cEh5YnJpZEltYWdbNF07CiAgZml4cEh5YnJpZFJlYWxbNF0gPSAoRklYUF9EQkwpMDsKICBmaXhwSHlicmlkSW1hZ1s0XSA9IChGSVhQX0RCTCkwOwoKICBmaXhwSHlicmlkUmVhbFsyXSArPSBmaXhwSHlicmlkUmVhbFs1XTsKICBmaXhwSHlicmlkSW1hZ1syXSArPSBmaXhwSHlicmlkSW1hZ1s1XTsKICBmaXhwSHlicmlkUmVhbFs1XSA9IChGSVhQX0RCTCkwOwogIGZpeHBIeWJyaWRJbWFnWzVdID0gKEZJWFBfREJMKTA7CgogIC8qIGZyZWUgbWVtb3J5IG9uIHNjcmF0Y2ggKi8KICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBUZW1wUmVhbFNsb3QsIEZJWFBfREJMLCA0KkhZQlJJRF9GSUxURVJfTEVOR1RIKTsKCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgc2xvdEJhc2VkSHlicmlkU3ludGhlc2lzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246ICBUaGUgY29lZmZpY2llbnRzIG9mZmVyaW5nIGhpZ2hlciByZXNvbHV0aW9uIGZvciB0aGUgbG93ZXIgUU1GCiAgICAgICAgICAgICAgIGNoYW5uZWwgYXJlIHNpbXBseSBhZGRlZCBwcmlvciB0byB0aGUgc3ludGhlc2lzIHdpdGggdGhlIDU0CiAgICAgICAgICAgICAgIHN1YmJhbmRzIFFNRi4KCiBBcmd1bWVudHM6CgogUmV0dXJuOiAgICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qISA8cHJlPgogICAgICBsLHIwKG4pIC0tLVwKICAgICAgbCxyMShuKSAtLS0tICsgLS1cCiAgICAgIGwscjIobikgLS0tLyAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICsgLS0+IEYwKHcpCiAgICAgIGwscjMobikgLS0tXCAgICAgIC8KICAgICAgbCxyNChuKSAtLS0tICsgLS0vCiAgICAgIGwscjUobikgLS0tLwoKCiAgICAgIGwscjYobikgLS0tXAogICAgICAgICAgICAgICAgICArIC0tLS0tLS0tLT4gRjEodykKICAgICAgbCxyNyhuKSAtLS0vCgoKICAgICAgbCxyOChuKSAtLS1cCiAgICAgICAgICAgICAgICAgICsgLS0tLS0tLS0tPiBGMih3KQogICAgICBsLHI5KG4pIC0tLS8KCiAgICA8L3ByZT4KICAgICAgSHlicmlkIFFNRiBzeW50aGVzaXMgZmlsdGVyYmFuayBmb3IgdGhlIDEwIGFuZCAyMCBzdGVyZW8tYmFuZHMgY29uZmlndXJhdGlvbnMuIFRoZQogICAgICBjb2VmZmljaWVudHMgb2ZmZXJpbmcgaGlnaGVyIHJlc29sdXRpb24gZm9yIHRoZSBsb3dlciBRTUYgY2hhbm5lbCBhcmUgc2ltcGx5IGFkZGVkCiAgICAgIHByaW9yIHRvIHRoZSBzeW50aGVzaXMgd2l0aCB0aGUgNTQgc3ViYmFuZHMgUU1GLgoKICAgICAgW3NlZSBJU08vSUVDIDE0NDk2LTM6MjAwMS9GREFNIDI6MjAwNChFKSAtIFBhZ2UgNTJdCiovCgoKdm9pZApzbG90QmFzZWRIeWJyaWRTeW50aGVzaXMgKCBGSVhQX0RCTCAgKmZpeHBIeWJyaWRSZWFsLCAgLyohPCBIeWJyaWQgcmVhbCBWYWx1ZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpmaXhwSHlicmlkSW1hZywgIC8qITwgSHlicmlkIGltYWcgVmFsdWVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cFFtZlJlYWwsICAgICAvKiE8IFFtZiByZWFsIFZhbHVlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKmZpeHBRbWZJbWFnLCAgICAgLyohPCBRbWYgaW1hZyBWYWx1ZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0hZQlJJRCBoSHlicmlkICkgICAgIC8qITwgSGFuZGxlIHRvIEhZQlJJRCBzdHJ1Y3QuICovCnsKICBpbnQgIGssIGJhbmQ7CgogIEhZQlJJRF9SRVMgaHlicmlkUmVzOwogIGludCAgY2hPZmZzZXQgPSAwOwoKICBmb3IoYmFuZCA9IDA7IGJhbmQgPCBoSHlicmlkLT5uUW1mQmFuZHM7IGJhbmQrKykgewoKICAgIEZJWFBfREJMIHFtZlJlYWwgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgRklYUF9EQkwgcW1mSW1hZyA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICBoeWJyaWRSZXMgPSAoSFlCUklEX1JFUyloSHlicmlkLT5wUmVzb2x1dGlvbltiYW5kXTsKCiAgICBmb3IoayA9IDA7IGsgPCAoU0NIQVIpaHlicmlkUmVzOyBrKyspIHsKICAgICAgcW1mUmVhbCArPSBmaXhwSHlicmlkUmVhbFtjaE9mZnNldCArIGtdOwogICAgICBxbWZJbWFnICs9IGZpeHBIeWJyaWRJbWFnW2NoT2Zmc2V0ICsga107CiAgICB9CgogICAgZml4cFFtZlJlYWxbYmFuZF0gPSBxbWZSZWFsOwogICAgZml4cFFtZkltYWdbYmFuZF0gPSBxbWZJbWFnOwoKICAgIGNoT2Zmc2V0ICs9IGh5YnJpZFJlczsKICB9Cn0KCgoK