Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUcgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgTi4gUmV0dGVsYmFjaAogICBjb250ZW50cy9kZXNjcmlwdGlvbjogUGFyYW1ldHJpYyBTdGVyZW8gYml0c3RyZWFtIGVuY29kZXIKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJwc19tYWluLmgiCgoKI2luY2x1ZGUgInBzX2NvbnN0LmgiCiNpbmNsdWRlICJwc19iaXRlbmMuaCIKCnN0YXRpYwppbmxpbmUgVUNIQVIgRkRLc2JyRW5jX1dyaXRlQml0c19wcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBVSU5UIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykKewogIC8qIGhCaXRTdHJlYW0gPT0gTlVMTCBoYXBwZW5zIGhlcmUgaW50ZW50aW9uYWxseSAqLwogIGlmKGhCaXRTdHJlYW0hPU5VTEwpewogICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHZhbHVlLCBudW1iZXJPZkJpdHMpOwogIH0KICByZXR1cm4gbnVtYmVyT2ZCaXRzOwp9CgojZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTICAgICAgICAgICAgICA0CiNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyAgICAgICAgIDgKI2RlZmluZSBTSV9TQlJfRVhURU5TSU9OX0lEX0JJVFMgICAgICAgICAgICAgICAgMgojZGVmaW5lIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcgICAgICAgICAgICAgICAgICAyCiNkZWZpbmUgUFNfRVhUX0lEX1YwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKCnN0YXRpYyBjb25zdCBJTlQgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0ID0gMTQ7CnN0YXRpYyBjb25zdCBJTlQgaWlkRGVsdGFDb2Fyc2VfTWF4VmFsID0gMjg7CnN0YXRpYyBjb25zdCBJTlQgaWlkRGVsdGFGaW5lX09mZnNldCA9IDMwOwpzdGF0aWMgY29uc3QgSU5UIGlpZERlbHRhRmluZV9NYXhWYWwgPSA2MDsKCi8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlpZERlbHRhRnJlcUNvYXJzZSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YUZyZXFDb2Fyc2VfTGVuZ3RoW10gPQp7CiAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE2LCAgMTUsICAgIDEzLCAgICAxMCwgICAgIDksICAgICA3LAogICA2LCAgICAgNSwgICAgIDQsICAgICAzLCAgICAgMSwgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNiwKICAgOCwgICAgMTEsICAgIDEzLCAgICAxNCwgICAgMTQsICAxNSwgICAgMTcsICAgIDE4LCAgICAxOAp9OwpzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YUZyZXFDb2Fyc2VfQ29kZVtdICA9CnsKICAweDAwMDFmZmZiLCAgMHgwMDAxZmZmYywgIDB4MDAwMWZmZmQsICAweDAwMDFmZmZhLCAgMHgwMDAwZmZmYywgIDB4MDAwMDdmZmMsICAweDAwMDAxZmZkLCAgMHgwMDAwMDNmZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwMDdlLAogIDB4MDAwMDAwM2MsICAweDAwMDAwMDFkLCAgMHgwMDAwMDAwZCwgIDB4MDAwMDAwMDUsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwNCwgIDB4MDAwMDAwMGMsICAweDAwMDAwMDFjLCAgMHgwMDAwMDAzZCwgIDB4MDAwMDAwM2UsCiAgMHgwMDAwMDBmZSwgIDB4MDAwMDA3ZmUsICAweDAwMDAxZmZjLCAgMHgwMDAwM2ZmYywgIDB4MDAwMDNmZmQsICAweDAwMDA3ZmZkLCAgMHgwMDAxZmZmZSwgIDB4MDAwM2ZmZmUsICAweDAwMDNmZmZmCn07CgovKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpaWREZWx0YUZyZXFGaW5lICovCnN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhRnJlcUZpbmVfTGVuZ3RoW10gPQp7CiAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE3LAogIDE4LCAgICAxNywgICAgMTcsICAgIDE2LCAgICAxNiwgIDE1LCAgICAxNCwgICAgMTQsICAgIDEzLCAgICAxMiwKICAxMiwgICAgMTEsICAgIDEwLCAgICAxMCwgICAgIDgsICAgNywgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsCiAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAogIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNCwgIDE1LCAgICAxNiwgICAgMTYsICAgIDE3LCAgICAxNywKICAxOCwgICAgMTcsICAgIDE4LCAgICAxOCwgICAgMTgsICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsCiAgMTgKfTsKc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxRmluZV9Db2RlW10gPQp7CiAgMHgwMDAxZmViNCwgIDB4MDAwMWZlYjUsICAweDAwMDFmZDc2LCAgMHgwMDAxZmQ3NywgIDB4MDAwMWZkNzQsICAweDAwMDFmZDc1LCAgMHgwMDAxZmU4YSwgIDB4MDAwMWZlOGIsICAweDAwMDFmZTg4LCAgMHgwMDAwZmU4MCwKICAweDAwMDFmZWI2LCAgMHgwMDAwZmU4MiwgIDB4MDAwMGZlYjgsICAweDAwMDA3ZjQyLCAgMHgwMDAwN2ZhZSwgIDB4MDAwMDNmYWYsICAweDAwMDAxZmQxLCAgMHgwMDAwMWZlOSwgIDB4MDAwMDBmZTksICAweDAwMDAwN2VhLAogIDB4MDAwMDA3ZmIsICAweDAwMDAwM2ZiLCAgMHgwMDAwMDFmYiwgIDB4MDAwMDAxZmYsICAweDAwMDAwMDdjLCAgMHgwMDAwMDAzYywgIDB4MDAwMDAwMWMsICAweDAwMDAwMDBjLCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDEsCiAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwZCwgIDB4MDAwMDAwMWQsICAweDAwMDAwMDNkLCAgMHgwMDAwMDA3ZCwgIDB4MDAwMDAwZmMsICAweDAwMDAwMWZjLCAgMHgwMDAwMDNmYywKICAweDAwMDAwM2Y0LCAgMHgwMDAwMDdlYiwgIDB4MDAwMDBmZWEsICAweDAwMDAxZmVhLCAgMHgwMDAwMWZkNiwgIDB4MDAwMDNmZDAsICAweDAwMDA3ZmFmLCAgMHgwMDAwN2Y0MywgIDB4MDAwMGZlYjksICAweDAwMDBmZTgzLAogIDB4MDAwMWZlYjcsICAweDAwMDBmZTgxLCAgMHgwMDAxZmU4OSwgIDB4MDAwMWZlOGUsICAweDAwMDFmZThmLCAgMHgwMDAxZmU4YywgIDB4MDAwMWZlOGQsICAweDAwMDFmZWIyLCAgMHgwMDAxZmViMywgIDB4MDAwMWZlYjAsCiAgMHgwMDAxZmViMQp9OwoKLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWlkRGVsdGFUaW1lQ29hcnNlICovCnN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9MZW5ndGhbXSA9CnsKICAxOSwgICAgMTksICAgIDE5LCAgICAyMCwgICAgMjAsICAyMCwgICAgMTcsICAgIDE1LCAgICAxMiwgICAgMTAsCiAgIDgsICAgICA2LCAgICAgNCwgICAgIDIsICAgICAxLCAgIDMsICAgICA1LCAgICAgNywgICAgIDksICAgIDExLAogIDEzLCAgICAxNCwgICAgMTcsICAgIDE5LCAgICAyMCwgIDIwLCAgICAyMCwgICAgMjAsICAgIDIwCn07CnN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9Db2RlW10gPQp7CiAgMHgwMDA3ZmZmOSwgIDB4MDAwN2ZmZmEsICAweDAwMDdmZmZiLCAgMHgwMDBmZmZmOCwgIDB4MDAwZmZmZjksICAweDAwMGZmZmZhLCAgMHgwMDAxZmZmZCwgIDB4MDAwMDdmZmUsICAweDAwMDAwZmZlLCAgMHgwMDAwMDNmZSwKICAweDAwMDAwMGZlLCAgMHgwMDAwMDAzZSwgIDB4MDAwMDAwMGUsICAweDAwMDAwMDAyLCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDYsICAweDAwMDAwMDFlLCAgMHgwMDAwMDA3ZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwN2ZlLAogIDB4MDAwMDFmZmUsICAweDAwMDAzZmZlLCAgMHgwMDAxZmZmYywgIDB4MDAwN2ZmZjgsICAweDAwMGZmZmZiLCAgMHgwMDBmZmZmYywgIDB4MDAwZmZmZmQsICAweDAwMGZmZmZlLCAgMHgwMDBmZmZmZgp9OwoKLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWlkRGVsdGFUaW1lRmluZSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YVRpbWVGaW5lX0xlbmd0aFtdID0KewogIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgICAxNiwgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgICAxNSwKICAxNSwgICAgMTUsICAgIDE1LCAgICAxNSwgICAgMTUsICAxNCwgICAgMTQsICAgIDEzLCAgICAxMywgICAgMTMsCiAgMTIsICAgIDEyLCAgICAxMSwgICAgMTAsICAgICA5LCAgIDksICAgICA3LCAgICAgNiwgICAgIDUsICAgICAzLAogICAxLCAgICAgMiwgICAgIDUsICAgICA2LCAgICAgNywgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMSwKICAxMiwgICAgMTIsICAgIDEzLCAgICAxMywgICAgMTQsICAxNCwgICAgMTUsICAgIDE1LCAgICAxNSwgICAgMTUsCiAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LAogIDE2Cn07CnN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUZpbmVfQ29kZVtdID0KewogIDB4MDAwMDRlZDQsICAweDAwMDA0ZWQ1LCAgMHgwMDAwNGVjZSwgIDB4MDAwMDRlY2YsICAweDAwMDA0ZWNjLCAgMHgwMDAwNGVkNiwgIDB4MDAwMDRlZDgsICAweDAwMDA0ZjQ2LCAgMHgwMDAwNGY2MCwgIDB4MDAwMDI3MTgsCiAgMHgwMDAwMjcxOSwgIDB4MDAwMDI3NjQsICAweDAwMDAyNzY1LCAgMHgwMDAwMjc2ZCwgIDB4MDAwMDI3YjEsICAweDAwMDAxM2I3LCAgMHgwMDAwMTNkNiwgIDB4MDAwMDA5YzcsICAweDAwMDAwOWU5LCAgMHgwMDAwMDllZCwKICAweDAwMDAwNGVlLCAgMHgwMDAwMDRmNywgIDB4MDAwMDAyNzgsICAweDAwMDAwMTM5LCAgMHgwMDAwMDA5YSwgIDB4MDAwMDAwOWYsICAweDAwMDAwMDIwLCAgMHgwMDAwMDAxMSwgIDB4MDAwMDAwMGEsICAweDAwMDAwMDAzLAogIDB4MDAwMDAwMDEsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwYiwgIDB4MDAwMDAwMTIsICAweDAwMDAwMDIxLCAgMHgwMDAwMDA0YywgIDB4MDAwMDAwOWIsICAweDAwMDAwMTNhLCAgMHgwMDAwMDI3OSwgIDB4MDAwMDAyNzAsCiAgMHgwMDAwMDRlZiwgIDB4MDAwMDA0ZTIsICAweDAwMDAwOWVhLCAgMHgwMDAwMDlkOCwgIDB4MDAwMDEzZDcsICAweDAwMDAxM2QwLCAgMHgwMDAwMjdiMiwgIDB4MDAwMDI3YTIsICAweDAwMDAyNzFhLCAgMHgwMDAwMjcxYiwKICAweDAwMDA0ZjY2LCAgMHgwMDAwNGY2NywgIDB4MDAwMDRmNjEsICAweDAwMDA0ZjQ3LCAgMHgwMDAwNGVkOSwgIDB4MDAwMDRlZDcsICAweDAwMDA0ZWNkLCAgMHgwMDAwNGVkMiwgIDB4MDAwMDRlZDMsICAweDAwMDA0ZWQwLAogIDB4MDAwMDRlZDEKfTsKCnN0YXRpYyBjb25zdCBJTlQgaWNjRGVsdGFfT2Zmc2V0ID0gIDc7CnN0YXRpYyBjb25zdCBJTlQgaWNjRGVsdGFfTWF4VmFsID0gMTQ7Ci8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGljY0RlbHRhRnJlcSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YUZyZXFfTGVuZ3RoW10gPQp7CiAgMTQsICAgIDE0LCAgICAxMiwgICAgMTAsICAgICA3LCAgIDUsICAgICAzLCAgICAgMSwgICAgIDIsICAgICA0LAogICA2LCAgICAgOCwgICAgIDksICAgIDExLCAgICAxMwp9OwpzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YUZyZXFfQ29kZVtdID0KewogIDB4MDAwMDNmZmYsICAweDAwMDAzZmZlLCAgMHgwMDAwMGZmZSwgIDB4MDAwMDAzZmUsICAweDAwMDAwMDdlLCAgMHgwMDAwMDAxZSwgIDB4MDAwMDAwMDYsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMGUsCiAgMHgwMDAwMDAzZSwgIDB4MDAwMDAwZmUsICAweDAwMDAwMWZlLCAgMHgwMDAwMDdmZSwgIDB4MDAwMDFmZmUKfTsKCi8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGljY0RlbHRhVGltZSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YVRpbWVfTGVuZ3RoW10gPQp7CiAgMTQsICAgIDEzLCAgICAxMSwgICAgIDksICAgICA3LCAgIDUsICAgICAzLCAgICAgMSwgICAgIDIsICAgICA0LAogICA2LCAgICAgOCwgICAgMTAsICAgIDEyLCAgICAxNAp9OwpzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YVRpbWVfQ29kZVtdID0KewogIDB4MDAwMDNmZmUsICAweDAwMDAxZmZlLCAgMHgwMDAwMDdmZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwMDdlLCAgMHgwMDAwMDAxZSwgIDB4MDAwMDAwMDYsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMGUsCiAgMHgwMDAwMDAzZSwgIDB4MDAwMDAwZmUsICAweDAwMDAwM2ZlLCAgMHgwMDAwMGZmZSwgIDB4MDAwMDNmZmYKfTsKCgoKc3RhdGljIGNvbnN0IElOVCBpcGREZWx0YV9PZmZzZXQgPSAwOwpzdGF0aWMgY29uc3QgSU5UIGlwZERlbHRhX01heFZhbCA9IDc7Ci8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlwZERlbHRhRnJlcSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YUZyZXFfTGVuZ3RoW10gPQp7CiAgIDEsICAgICAzLCAgICAgNCwgICAgIDQsICAgICA0LCAgIDQsICAgICA0LCAgICAgNAp9OwpzdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YUZyZXFfQ29kZVtdID0KewogIDB4MDAwMDAwMDEsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwNiwgIDB4MDAwMDAwMDQsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMywgIDB4MDAwMDAwMDUsICAweDAwMDAwMDA3Cn07CgovKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpcGREZWx0YVRpbWUgKi8Kc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFUaW1lX0xlbmd0aFtdID0KewogICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNSwgICA0LCAgICAgNCwgICAgIDMKfTsKc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFUaW1lX0NvZGVbXSA9CnsKICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAzLCAgMHgwMDAwMDAwMiwgIDAwMDAwMDAwMDAsICAweDAwMDAwMDAzLCAgMHgwMDAwMDAwMwp9OwoKCnN0YXRpYyBjb25zdCBJTlQgb3BkRGVsdGFfT2Zmc2V0ID0gMDsKc3RhdGljIGNvbnN0IElOVCBvcGREZWx0YV9NYXhWYWwgPSA3OwovKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBvcGREZWx0YUZyZXEgKi8Kc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFGcmVxX0xlbmd0aFtdID0KewogICAxLCAgICAgMywgICAgIDQsICAgICA0LCAgICAgNSwgICA1LCAgICAgNCwgICAgIDMKfTsKc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFGcmVxX0NvZGVbXSA9CnsKICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDYsICAweDAwMDAwMDA0LCAgMHgwMDAwMDAwZiwgIDB4MDAwMDAwMGUsICAweDAwMDAwMDA1LCAgMDAwMDAwMDAwMCwKfTsKCi8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IG9wZERlbHRhVGltZSAqLwpzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YVRpbWVfTGVuZ3RoW10gPQp7CiAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA1LCAgIDQsICAgICA0LCAgICAgMwp9OwpzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YVRpbWVfQ29kZVtdID0KewogIDB4MDAwMDAwMDEsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDcsICAweDAwMDAwMDA2LCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAzCn07CgpzdGF0aWMgSU5UIGdldE5vQmFuZHMoY29uc3QgSU5UIG1vZGUpCnsKICBJTlQgbm9CYW5kcyA9IDA7CgogIHN3aXRjaCAobW9kZSkgewogICAgY2FzZSAwOiBjYXNlIDM6IC8qIGNvYXJzZSAqLwogICAgICBub0JhbmRzID0gUFNfQkFORFNfQ09BUlNFOwogICAgICBicmVhazsKICAgIGNhc2UgMTogY2FzZSA0OiAvKiBtaWQgKi8KICAgICAgbm9CYW5kcyA9IFBTX0JBTkRTX01JRDsKICAgICAgYnJlYWs7CiAgICBjYXNlIDI6IGNhc2UgNTogLyogZmluZSBub3Qgc3VwcG9ydGVkICovCiAgICBkZWZhdWx0OiAgICAgICAgLyogY29hcnNlIGFzIGRlZmF1bHQgKi8KICAgICAgbm9CYW5kcyA9IFBTX0JBTkRTX0NPQVJTRTsKICB9CgogIHJldHVybiBub0JhbmRzOwp9CgpzdGF0aWMgSU5UIGdldElJRFJlcyhJTlQgaWlkTW9kZSkKewogIGlmKGlpZE1vZGU8MykKICAgIHJldHVybiBQU19JSURfUkVTX0NPQVJTRTsKICBlbHNlCiAgICByZXR1cm4gUFNfSUlEX1JFU19GSU5FOwp9CgpzdGF0aWMgSU5UCmVuY29kZURlbHRhRnJlcShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAogICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICp2YWwsCiAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG5CYW5kcywKICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmNvZGVUYWJsZSwKICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlLAogICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICB0YWJsZU9mZnNldCwKICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbWF4VmFsLAogICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICplcnJvcikKewogIElOVCBiaXRDbnQgPSAwOwogIElOVCBsYXN0VmFsID0gMDsKICBJTlQgYmFuZDsKCiAgZm9yKGJhbmQ9MDtiYW5kPG5CYW5kcztiYW5kKyspIHsKICAgIElOVCBkZWx0YSA9ICh2YWxbYmFuZF0gLSBsYXN0VmFsKSArIHRhYmxlT2Zmc2V0OwogICAgbGFzdFZhbCA9IHZhbFtiYW5kXTsKICAgIGlmKCAoZGVsdGE+bWF4VmFsKSB8fCAoZGVsdGE8MCkgKSB7CiAgICAgICplcnJvciA9IDE7CiAgICAgIGRlbHRhID0gZGVsdGE+MD9tYXhWYWw6MDsKICAgIH0KICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIGNvZGVUYWJsZVtkZWx0YV0sIGxlbmd0aFRhYmxlW2RlbHRhXSk7CiAgfQoKICByZXR1cm4gYml0Q250Owp9CgpzdGF0aWMgSU5UCmVuY29kZURlbHRhVGltZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAogICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICp2YWwsCiAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgKnZhbExhc3QsCiAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG5CYW5kcywKICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmNvZGVUYWJsZSwKICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlLAogICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICB0YWJsZU9mZnNldCwKICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbWF4VmFsLAogICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICplcnJvcikKewogIElOVCBiaXRDbnQgPSAwOwogIElOVCBiYW5kOwoKICBmb3IoYmFuZD0wO2JhbmQ8bkJhbmRzO2JhbmQrKykgewogICAgSU5UIGRlbHRhID0gKHZhbFtiYW5kXSAtIHZhbExhc3RbYmFuZF0pICsgdGFibGVPZmZzZXQ7CiAgICBpZiggKGRlbHRhPm1heFZhbCkgfHwgKGRlbHRhPDApICkgewogICAgICAqZXJyb3IgPSAxOwogICAgICBkZWx0YSA9IGRlbHRhPjA/bWF4VmFsOjA7CiAgICB9CiAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBjb2RlVGFibGVbZGVsdGFdLCBsZW5ndGhUYWJsZVtkZWx0YV0pOwogIH0KCiAgcmV0dXJuIGJpdENudDsKfQoKSU5UIEZES3NickVuY19FbmNvZGVJaWQoSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGhCaXRCdWYsCiAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgKmlpZFZhbCwKICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAqaWlkVmFsTGFzdCwKICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgbkJhbmRzLAogICAgICAgICAgICAgIGNvbnN0IFBTX0lJRF9SRVNPTFVUSU9OICByZXMsCiAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgICAgICAgICAgIG1vZGUsCiAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgKmVycm9yKQp7CiAgY29uc3QgVUlOVCAqY29kZVRhYmxlOwogIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlOwogIElOVCBiaXRDbnQgPSAwOwoKICBiaXRDbnQgPSAwOwoKICBzd2l0Y2gobW9kZSkgewogIGNhc2UgUFNfREVMVEFfRlJFUToKICAgIHN3aXRjaChyZXMpIHsKICAgIGNhc2UgUFNfSUlEX1JFU19DT0FSU0U6CiAgICAgIGNvZGVUYWJsZSAgID0gaWlkRGVsdGFGcmVxQ29hcnNlX0NvZGU7CiAgICAgIGxlbmd0aFRhYmxlID0gaWlkRGVsdGFGcmVxQ29hcnNlX0xlbmd0aDsKICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpaWRWYWwsIG5CYW5kcywgY29kZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpaWREZWx0YUNvYXJzZV9PZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkRGVsdGFDb2Fyc2VfTWF4VmFsLCBlcnJvcik7CiAgICBicmVhazsKICAgIGNhc2UgUFNfSUlEX1JFU19GSU5FOgogICAgICBjb2RlVGFibGUgICA9IGlpZERlbHRhRnJlcUZpbmVfQ29kZTsKICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YUZyZXFGaW5lX0xlbmd0aDsKICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpaWRWYWwsIG5CYW5kcywgY29kZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpaWREZWx0YUZpbmVfT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhRmluZV9NYXhWYWwsIGVycm9yKTsKICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgKmVycm9yID0gMTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIFBTX0RFTFRBX1RJTUU6CiAgICBzd2l0Y2gocmVzKSB7CiAgICBjYXNlIFBTX0lJRF9SRVNfQ09BUlNFOgogICAgICBjb2RlVGFibGUgICA9IGlpZERlbHRhVGltZUNvYXJzZV9Db2RlOwogICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhVGltZUNvYXJzZV9MZW5ndGg7CiAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1ZiwgaWlkVmFsLCBpaWRWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhQ29hcnNlX01heFZhbCwgZXJyb3IpOwogICAgYnJlYWs7CiAgICBjYXNlIFBTX0lJRF9SRVNfRklORToKICAgICAgY29kZVRhYmxlICAgPSBpaWREZWx0YVRpbWVGaW5lX0NvZGU7CiAgICAgIGxlbmd0aFRhYmxlID0gaWlkRGVsdGFUaW1lRmluZV9MZW5ndGg7CiAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1ZiwgaWlkVmFsLCBpaWRWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFGaW5lX09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWREZWx0YUZpbmVfTWF4VmFsLCBlcnJvcik7CiAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICplcnJvciA9IDE7CiAgICB9CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgICplcnJvciA9IDE7CiAgfQoKICByZXR1cm4gYml0Q250Owp9CgoKSU5UIEZES3NickVuY19FbmNvZGVJY2MoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaWNjVmFsLAogICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppY2NWYWxMYXN0LAogICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCiAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgIG1vZGUsCiAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKQp7CiAgY29uc3QgVUlOVCAqY29kZVRhYmxlOwogIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlOwogIElOVCBiaXRDbnQgPSAwOwoKICBzd2l0Y2gobW9kZSkgewogIGNhc2UgUFNfREVMVEFfRlJFUToKICAgIGNvZGVUYWJsZSAgID0gaWNjRGVsdGFGcmVxX0NvZGU7CiAgICBsZW5ndGhUYWJsZSA9IGljY0RlbHRhRnJlcV9MZW5ndGg7CiAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFGcmVxKGhCaXRCdWYsIGljY1ZhbCwgbkJhbmRzLCBjb2RlVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpY2NEZWx0YV9PZmZzZXQsIGljY0RlbHRhX01heFZhbCwgZXJyb3IpOwogICAgYnJlYWs7CgogIGNhc2UgUFNfREVMVEFfVElNRToKICAgIGNvZGVUYWJsZSAgID0gaWNjRGVsdGFUaW1lX0NvZGU7CiAgICBsZW5ndGhUYWJsZSA9IGljY0RlbHRhVGltZV9MZW5ndGg7CgogICAgYml0Q250ICs9IGVuY29kZURlbHRhVGltZShoQml0QnVmLCBpY2NWYWwsIGljY1ZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWNjRGVsdGFfT2Zmc2V0LCBpY2NEZWx0YV9NYXhWYWwsIGVycm9yKTsKICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgKmVycm9yID0gMTsKICB9CgogIHJldHVybiBiaXRDbnQ7Cn0KCklOVCBGREtzYnJFbmNfRW5jb2RlSXBkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsCiAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmlwZFZhbCwKICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaXBkVmFsTGFzdCwKICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkJhbmRzLAogICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAogICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcikKewogIGNvbnN0IFVJTlQgKmNvZGVUYWJsZTsKICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKICBJTlQgYml0Q250ID0gMDsKCiAgc3dpdGNoKG1vZGUpIHsKICBjYXNlIFBTX0RFTFRBX0ZSRVE6CiAgICBjb2RlVGFibGUgICA9IGlwZERlbHRhRnJlcV9Db2RlOwogICAgbGVuZ3RoVGFibGUgPSBpcGREZWx0YUZyZXFfTGVuZ3RoOwogICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpcGRWYWwsIG5CYW5kcywgY29kZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaXBkRGVsdGFfT2Zmc2V0LCBpcGREZWx0YV9NYXhWYWwsIGVycm9yKTsKICAgIGJyZWFrOwoKICBjYXNlIFBTX0RFTFRBX1RJTUU6CiAgICBjb2RlVGFibGUgICA9IGlwZERlbHRhVGltZV9Db2RlOwogICAgbGVuZ3RoVGFibGUgPSBpcGREZWx0YVRpbWVfTGVuZ3RoOwoKICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1ZiwgaXBkVmFsLCBpcGRWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlwZERlbHRhX09mZnNldCwgaXBkRGVsdGFfTWF4VmFsLCBlcnJvcik7CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgICplcnJvciA9IDE7CiAgfQoKICByZXR1cm4gYml0Q250Owp9CgpJTlQgRkRLc2JyRW5jX0VuY29kZU9wZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAogICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpvcGRWYWwsCiAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKm9wZFZhbExhc3QsCiAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqZXJyb3IpCnsKICBjb25zdCBVSU5UICpjb2RlVGFibGU7CiAgY29uc3QgVUlOVCAqbGVuZ3RoVGFibGU7CiAgSU5UIGJpdENudCA9IDA7CgogIHN3aXRjaChtb2RlKSB7CiAgY2FzZSBQU19ERUxUQV9GUkVROgogICAgY29kZVRhYmxlICAgPSBvcGREZWx0YUZyZXFfQ29kZTsKICAgIGxlbmd0aFRhYmxlID0gb3BkRGVsdGFGcmVxX0xlbmd0aDsKICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1Ziwgb3BkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIG9wZERlbHRhX09mZnNldCwgb3BkRGVsdGFfTWF4VmFsLCBlcnJvcik7CiAgICBicmVhazsKCiAgY2FzZSBQU19ERUxUQV9USU1FOgogICAgY29kZVRhYmxlICAgPSBvcGREZWx0YVRpbWVfQ29kZTsKICAgIGxlbmd0aFRhYmxlID0gb3BkRGVsdGFUaW1lX0xlbmd0aDsKCiAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIG9wZFZhbCwgb3BkVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBvcGREZWx0YV9PZmZzZXQsIG9wZERlbHRhX01heFZhbCwgZXJyb3IpOwogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAqZXJyb3IgPSAxOwogIH0KCiAgcmV0dXJuIGJpdENudDsKfQoKc3RhdGljIElOVCBlbmNvZGVJcGRPcGQoSEFORExFX1BTX09VVCAgICAgICAgcHNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYgKQp7CiAgSU5UIGJpdENudCA9IDA7CiAgSU5UIGVycm9yICA9IDA7CiAgSU5UIGVudjsKCiAgRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc091dC0+ZW5hYmxlSXBkT3BkLCAxKTsKCiAgaWYocHNPdXQtPmVuYWJsZUlwZE9wZD09MSkgewogICAgSU5UICppcGRMYXN0ID0gcHNPdXQtPmlwZExhc3Q7CiAgICBJTlQgKm9wZExhc3QgPSBwc091dC0+b3BkTGFzdDsKCiAgICBmb3IoZW52PTA7IGVudjxwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5kZWx0YUlQRFtlbnZdLCAxKTsKICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVJcGQoIGhCaXRCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5pcGRbZW52XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBkTGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcyhwc091dC0+aWlkTW9kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YUlQRFtlbnZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOwoKICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5kZWx0YU9QRFtlbnZdLCAxKTsKICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVPcGQoIGhCaXRCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5vcGRbZW52XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BkTGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcyhwc091dC0+aWlkTW9kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YU9QRFtlbnZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKTsKICAgIH0KICAgIC8qIHJlc2VydmVkIGJpdCAqLwogICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIDAsIDEpOwogIH0KCgogIHJldHVybiBiaXRDbnQ7Cn0KCnN0YXRpYyBJTlQgZ2V0RW52SWR4KGNvbnN0IElOVCBuRW52ZWxvcGVzLCBjb25zdCBJTlQgZnJhbWVDbGFzcykKewogIElOVCBlbnZJZHggPSAwOwoKICBzd2l0Y2gobkVudmVsb3BlcykgewogIGNhc2UgMDoKICAgIGVudklkeCA9IDA7CiAgICBicmVhazsKCiAgY2FzZSAxOgogICAgaWYgKGZyYW1lQ2xhc3M9PTApCiAgICAgIGVudklkeCA9IDE7CiAgICBlbHNlCiAgICAgIGVudklkeCA9IDA7CiAgICBicmVhazsKCiAgY2FzZSAyOgogICAgaWYgKGZyYW1lQ2xhc3M9PTApCiAgICAgIGVudklkeCA9IDI7CiAgICBlbHNlCiAgICAgIGVudklkeCA9IDE7CiAgICBicmVhazsKCiAgY2FzZSAzOgogICAgZW52SWR4ID0gMjsKICAgIGJyZWFrOwoKICBjYXNlIDQ6CiAgICBlbnZJZHggPSAzOwogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAvKiB1bnN1cHBvcnRlZCBudW1iZXIgb2YgZW52ZWxvcGVzICovCiAgICBlbnZJZHggPSAwOwogIH0KCiAgcmV0dXJuIGVudklkeDsKfQoKCnN0YXRpYyBJTlQgZW5jb2RlUFNFeHRlbnNpb24oY29uc3QgSEFORExFX1BTX09VVCAgIHBzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmICkKewogIElOVCBiaXRDbnQgPSAwOwoKICBpZihwc091dC0+ZW5hYmxlSXBkT3BkPT0xKSB7CiAgICBJTlQgaXBkT3BkQml0cyA9IDA7CiAgICBJTlQgZXh0U2l6ZSA9ICgyICsgZW5jb2RlSXBkT3BkKHBzT3V0LE5VTEwpKzcpPj4zOwoKICAgIGlmKGV4dFNpemU8MTUpIHsKICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgIGV4dFNpemUsIDQpOwogICAgfQogICAgZWxzZSB7CiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsICAgICAgICAgIDE1ICwgNCk7CiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIChleHRTaXplLTE1KSwgOCk7CiAgICB9CgogICAgLyogd3JpdGUgaXBkIG9wZCBkYXRhICovCiAgICBpcGRPcGRCaXRzICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgUFNfRVhUX0lEX1YwLCAyKTsKICAgIGlwZE9wZEJpdHMgKz0gZW5jb2RlSXBkT3BkKHBzT3V0LCBoQml0QnVmICk7CgogICAgLyogYnl0ZSBhbGlnbiB0aGUgaXBkIG9wZCBkYXRhICAqLwogICAgaWYoaXBkT3BkQml0cyU4KQogICAgICBpcGRPcGRCaXRzICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgMCwgKDgtKGlwZE9wZEJpdHMlOCkpICk7CgogICAgYml0Q250ICs9IGlwZE9wZEJpdHM7CiAgfQoKICByZXR1cm4gKGJpdENudCk7Cn0KCklOVCBGREtzYnJFbmNfV3JpdGVQU0JpdHN0cmVhbShjb25zdCBIQU5ETEVfUFNfT1VUICAgcHNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiApCnsKICBJTlQgcHNFeHRFbmFibGUgPSAwOwogIElOVCBiaXRDbnQgPSAwOwogIElOVCBlcnJvciA9IDA7CiAgSU5UIGVudjsKCiAgaWYocHNPdXQgIT0gTlVMTCl7CgogICAgLyogUFMgSEVBREVSICovCiAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZVBTSGVhZGVyLCAxKTsKCiAgICBpZihwc091dC0+ZW5hYmxlUFNIZWFkZXIpIHsKCiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZW5hYmxlSUlELCAxKTsKICAgICAgaWYocHNPdXQtPmVuYWJsZUlJRCkgewogICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+aWlkTW9kZSwgMyk7CiAgICAgIH0KICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5lbmFibGVJQ0MsIDEpOwogICAgICBpZihwc091dC0+ZW5hYmxlSUNDKSB7CiAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5pY2NNb2RlLCAzKTsKICAgICAgfQogICAgICBpZihwc091dC0+ZW5hYmxlSXBkT3BkKSB7CiAgICAgICAgcHNFeHRFbmFibGUgPSAxOwogICAgICB9CiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc0V4dEVuYWJsZSwgMSk7CiAgICB9CgogICAgLyogRnJhbWUgY2xhc3MsIG51bWJlciBvZiBlbnZlbG9wZXMgKi8KICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZnJhbWVDbGFzcywgMSk7CiAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgZ2V0RW52SWR4KHBzT3V0LT5uRW52ZWxvcGVzLCBwc091dC0+ZnJhbWVDbGFzcyksIDIpOwoKICAgIGlmKHBzT3V0LT5mcmFtZUNsYXNzPT0xKSB7CiAgICAgIGZvcihlbnY9MDsgZW52PHBzT3V0LT5uRW52ZWxvcGVzOyBlbnYrKykgewogICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZnJhbWVCb3JkZXJbZW52XSwgNSk7CiAgICAgIH0KICAgIH0KCiAgICBpZihwc091dC0+ZW5hYmxlSUlEPT0xKSB7CiAgICAgIElOVCAqaWlkTGFzdCA9IHBzT3V0LT5paWRMYXN0OwogICAgICBmb3IoZW52PTA7IGVudjxwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmRlbHRhSUlEW2Vudl0sIDEpOwogICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfRW5jb2RlSWlkKCBoQml0QnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5paWRbZW52XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWRMYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vQmFuZHMocHNPdXQtPmlpZE1vZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU19JSURfUkVTT0xVVElPTilnZXRJSURSZXMocHNPdXQtPmlpZE1vZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YUlJRFtlbnZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApOwoKICAgICAgICBpaWRMYXN0ID0gcHNPdXQtPmlpZFtlbnZdOwogICAgICB9CiAgICB9CgogICAgaWYocHNPdXQtPmVuYWJsZUlDQz09MSkgewogICAgICBJTlQgKmljY0xhc3QgPSBwc091dC0+aWNjTGFzdDsKICAgICAgZm9yKGVudj0wOyBlbnY8cHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5kZWx0YUlDQ1tlbnZdLCAxKTsKICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZUljYyggaEJpdEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+aWNjW2Vudl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjTGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb0JhbmRzKHBzT3V0LT5pY2NNb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFJQ0NbZW52XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOwoKICAgICAgICBpY2NMYXN0ID0gcHNPdXQtPmljY1tlbnZdOwogICAgICB9CiAgICB9CgogICAgaWYocHNFeHRFbmFibGUhPTApIHsKICAgICAgYml0Q250ICs9IGVuY29kZVBTRXh0ZW5zaW9uKHBzT3V0LCBoQml0QnVmKTsKICAgIH0KCiAgfSAvKiBpZihwc091dCAhPSBOVUxMKSAqLwoKICByZXR1cm4gYml0Q250Owp9Cgo=