Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgQWxleCBHcm9lc2NoZWwsIFRvYmlhcyBDaGFsdXBrYQogICBjb250ZW50cy9kZXNjcmlwdGlvbjogVGVtcG9yYWwgbm9pc2Ugc2hhcGluZwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImFhY2VuY190bnMuaCIKI2luY2x1ZGUgInBzeV9jb25zdC5oIgojaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKI2luY2x1ZGUgInRuc19mdW5jLmgiCiNpbmNsdWRlICJhYWNFbmNfcm9tLmgiCiNpbmNsdWRlICJhYWNlbmNfdG5zLmgiCgplbnVtIHsKICAgIEhJRklMVCA9IDAsIC8qIGluZGV4IG9mIGhpZ2hlciBmaWx0ZXIgKi8KICAgIExPRklMVCA9IDEgLyogaW5kZXggb2YgbG93ZXIgZmlsdGVyICovCn07CgoKI2RlZmluZSBGSUxURVJfRElSRUNUSU9OIDAKCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2ZXaW5kb3dMb25nWzEyKzMrMV0gPSB7CiAgMHg3ZmZmZmZmZiwweDdmYjgwMDAwLDB4N2VlMDAwMDAsMHg3ZDc4MDAwMCwweDdiODAwMDAwLDB4NzhmODAwMDAsMHg3NWUwMDAwMCwweDcyMzgwMDAwLAogIDB4NmUwMDAwMDAsMHg2OTM4MDAwMCwweDYzZTAwMDAwLDB4NWRmODAwMDAsMHg1NzgwMDAwMCwweDUwNzgwMDAwLDB4NDhlMDAwMDAsMHg0MGI4MDAwMAp9OwoKc3RhdGljIGNvbnN0IEZJWFBfREJMIGFjZldpbmRvd1Nob3J0WzQrMysxXSA9IHsKICAweDdmZmZmZmZmLDB4N2UwMDAwMDAsMHg3ODAwMDAwMCwweDZlMDAwMDAwLDB4NjAwMDAwMDAsMHg0ZTAwMDAwMCwweDM4MDAwMDAwLDB4MWUwMDAwMDAKfTsKCgp0eXBlZGVmIHN0cnVjdCB7CiAgSU5UICAgICAgZmlsdGVyRW5hYmxlZFtNQVhfTlVNX09GX0ZJTFRFUlNdOwogIElOVCAgICAgIHRocmVzaE9uW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgICAgICAgICAgIC8qIG1pbi4gcHJlZGljdGlvbiBnYWluIGZvciB1c2luZyB0bnMgVEFCVUwqLwogIElOVCAgICAgIGZpbHRlclN0YXJ0RnJlcVtNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAgIC8qIGxvd2VzdCBmcmVxIGZvciBscGMgVEFCVUwqLwogIElOVCAgICAgIHRuc0xpbWl0T3JkZXJbTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgICAgIC8qIExpbWl0IGZvciBUTlMgb3JkZXIgVEFCVUwqLwogIElOVCAgICAgIHRuc0ZpbHRlckRpcmVjdGlvbltNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgIC8qIEZpbHRlcmluZyBkaXJlY3Rpb24sIDA9dXAsIDE9ZG93biBUQUJVTCAqLwogIElOVCAgICAgIGFjZlNwbGl0W01BWF9OVU1fT0ZfRklMVEVSU107CiAgRklYUF9EQkwgdG5zVGltZVJlc29sdXRpb25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgLyogVE5TIG1heC4gdGltZSByZXNvbHV0aW9uIFRBQlVMLiBTaG91bGQgYmUgZnJhY3QgYnV0IE1TVkMgd29uJ3QgY29tcGlsZSB0aGVuICovCiAgSU5UICAgICAgc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZDsKCn0gVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQ7CgoKdHlwZWRlZiBzdHJ1Y3R7CiAgSU5UICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGVGcm9tWzJdOyAgLyogbm9uZVNicj0wLCB1c2VTYnI9MSAqLwogIElOVCAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlVG9bMl07ICAgIC8qIG5vbmVTYnI9MCwgdXNlU2JyPTEgKi8KICBUTlNfUEFSQU1FVEVSX1RBQlVMQVRFRCAgcGFyYW1UYWJbMl07ICAgICAvKiBtb25vPTAsIHN0ZXJlbz0xICovCgp9IFROU19JTkZPX1RBQjsKCiNkZWZpbmUgVE5TX1RJTUVSRVNfU0NBTEUgICAgKDEpCiNkZWZpbmUgRkwyX1RJTUVSRVNfRklYKGEpICAgKCBGTDJGWENPTlNUX0RCTChhLyhmbG9hdCkoMTw8VE5TX1RJTUVSRVNfU0NBTEUpKSApCgpzdGF0aWMgY29uc3QgVE5TX0lORk9fVEFCIHRuc0luZm9UYWJbXSA9CnsKICB7CiAgICB7ICAxNjAwMCwgIDEzNTAwfSwKICAgIHsgIDMyMDAwLCAgMjgwMDB9LAogICAgewogICAgICB7IHsxLCAxfSwgezE0MzcsIDE1MDB9LCB7MTQwMCwgNjAwfSwgezEyLCAxMn0sIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwgezMsIDF9LCB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4yZil9LCAxIH0sCiAgICAgIHsgezEsIDF9LCB7MTQzNywgMTUwMH0sIHsxNDAwLCA2MDB9LCB7MTIsIDEyfSwge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LCB7MywgMX0sIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjJmKX0sIDEgfQogICAgfQogIH0sCiAgewogICAgeyAgMzIwMDEsICAyODAwMX0sCiAgICB7ICA2MDAwMCwgIDUyMDAwfSwKICAgIHsKICAgICAgeyB7MSwgMX0sIHsxNDM3LCAxNTAwfSwgezE0MDAsIDYwMH0sIHsxMiwgMTB9LCB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sIHszLCAxfSwge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMGYpfSwgMSB9LAogICAgICB7IHsxLCAxfSwgezE0MzcsIDE1MDB9LCB7MTQwMCwgNjAwfSwgezEyLCAxMH0sIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwgezMsIDF9LCB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4wZil9LCAxIH0KICAgIH0KICB9LAogIHsKICAgIHsgIDYwMDAxLCAgNTIwMDF9LAogICAgeyAzODQwMDAsIDM4NDAwMH0sCiAgICB7CiAgICAgIHsgezEsIDF9LCB7MTQzNywgMTUwMH0sIHsxNDAwLCA2MDB9LCB7MTIsICA4fSwge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LCB7MywgMX0sIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjBmKX0sIDEgfSwKICAgICAgeyB7MSwgMX0sIHsxNDM3LCAxNTAwfSwgezE0MDAsIDYwMH0sIHsxMiwgIDh9LCB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sIHszLCAxfSwge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMGYpfSwgMSB9CiAgICB9CiAgfQp9OwoKdHlwZWRlZiBzdHJ1Y3QgewogIElOVCAgIHNhbXBsaW5nUmF0ZTsKICBTQ0hBUiBtYXhCYW5kc1syXTsgLyogbG9uZz0wOyBzaG9ydD0xICovCgp9IFROU19NQVhfVEFCX0VOVFJZOwoKc3RhdGljIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZIHRuc01heEJhbmRzVGFiMTAyNFtdID0KewogIHsgOTYwMDAsIHsgMzEsICA5fX0sCiAgeyA4ODIwMCwgeyAzMSwgIDl9fSwKICB7IDY0MDAwLCB7IDM0LCAxMH19LAogIHsgNDgwMDAsIHsgNDAsIDE0fX0sCiAgeyA0NDEwMCwgeyA0MiwgMTR9fSwKICB7IDMyMDAwLCB7IDUxLCAxNH19LAogIHsgMjQwMDAsIHsgNDYsIDE0fX0sCiAgeyAyMjA1MCwgeyA0NiwgMTR9fSwKICB7IDE2MDAwLCB7IDQyLCAxNH19LAogIHsgMTIwMDAsIHsgNDIsIDE0fX0sCiAgeyAxMTAyNSwgeyA0MiwgMTR9fSwKICB7IDgwMDAsICB7IDM5LCAxNH19Cn07CgpzdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWI0ODBbXSA9CnsKICB7IDQ4MDAwLCB7IDMxLCAtMX19LAogIHsgNDQxMDAsIHsgMzIsIC0xfX0sCiAgeyAzMjAwMCwgeyAzNywgLTF9fSwKICB7IDI0MDAwLCB7IDMwLCAtMX19LAogIHsgMjIwNTAsIHsgMzAsIC0xfX0KfTsKCnN0YXRpYyBjb25zdCBUTlNfTUFYX1RBQl9FTlRSWSB0bnNNYXhCYW5kc1RhYjUxMltdID0KewogIHsgNDgwMDAsIHsgMzEsIC0xfX0sCiAgeyA0NDEwMCwgeyAzMiwgLTF9fSwKICB7IDMyMDAwLCB7IDM3LCAtMX19LAogIHsgMjQwMDAsIHsgMzEsIC0xfX0sCiAgeyAyMjA1MCwgeyAzMSwgLTF9fQp9OwoKc3RhdGljIElOVCBGREthYWNFbmNfQXV0b1RvUGFyY29yKAogICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBpbnB1dCwKICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcmVmbENvZWZmLAogICAgICAgIGNvbnN0IElOVCBudW1PZkNvZWZmCiAgICAgICAgKTsKCnN0YXRpYyB2b2lkIEZES2FhY0VuY19QYXJjb3IySW5kZXgoCiAgICAgICAgY29uc3QgRklYUF9EQkwgKnBhcmNvciwKICAgICAgICBJTlQgKlJFU1RSSUNUIGluZGV4LAogICAgICAgIGNvbnN0IElOVCBvcmRlciwKICAgICAgICBjb25zdCBJTlQgYml0c1BlckNvZWZmCiAgICAgICAgKTsKCnN0YXRpYyB2b2lkIEZES2FhY0VuY19JbmRleDJQYXJjb3IoCiAgICAgICAgY29uc3QgSU5UICppbmRleCwKICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcGFyY29yLAogICAgICAgIGNvbnN0IElOVCBvcmRlciwKICAgICAgICBjb25zdCBJTlQgYml0c1BlckNvZWZmCiAgICAgICAgKTsKCnN0YXRpYyBJTlQgRkRLYWFjRW5jX1BhcmNvclRvTHBjKAogICAgICAgIGNvbnN0IEZJWFBfREJMICpyZWZsQ29lZmYsCiAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIExwY0NvZWZmLAogICAgICAgIGNvbnN0IElOVCBudW1PZkNvZWZmLAogICAgICAgIEZJWFBfREJMICpSRVNUUklDVCB3b3JrQnVmZmVyCiAgICAgICAgKTsKCnN0YXRpYyB2b2lkIEZES2FhY0VuY19BbmFseXNpc0ZpbHRlcigKICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2lnbmFsLAogICAgICAgIGNvbnN0IElOVCBudW1PZkxpbmVzLAogICAgICAgIGNvbnN0IEZJWFBfREJMICpwcmVkaWN0b3JDb2VmZiwKICAgICAgICBjb25zdCBJTlQgb3JkZXIsCiAgICAgICAgY29uc3QgSU5UIGxwY0dhaW5GYWN0b3IKICAgICAgICApOwoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNHYXVzc1dpbmRvdygKICAgICAgICBGSVhQX0RCTCAqd2luLAogICAgICAgIGNvbnN0IGludCB3aW5TaXplLAogICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUsCiAgICAgICAgY29uc3QgSU5UIHRyYW5zZm9ybVJlc29sdXRpb24sCiAgICAgICAgY29uc3QgRklYUF9EQkwgdGltZVJlc29sdXRpb24sCiAgICAgICAgY29uc3QgSU5UIHRpbWVSZXNvbHV0aW9uX2UKICAgICAgICApOwoKc3RhdGljIGNvbnN0IFROU19QQVJBTUVURVJfVEFCVUxBVEVEKiBGREthYWNFbmNfR2V0VG5zUGFyYW0oCiAgICAgICAgY29uc3QgSU5UIGJpdFJhdGUsCiAgICAgICAgY29uc3QgSU5UIGNoYW5uZWxzLAogICAgICAgIGNvbnN0IElOVCBzYnJMZAogICAgICAgICkKewogIGludCBpOwogIGNvbnN0IFROU19QQVJBTUVURVJfVEFCVUxBVEVEICp0bnNDb25maWdUYWIgPSBOVUxMOwoKICBmb3IgKGkgPSAwOyBpIDwgKGludCkgKHNpemVvZih0bnNJbmZvVGFiKS9zaXplb2YoVE5TX0lORk9fVEFCKSk7IGkrKykgewogICAgaWYgKChiaXRSYXRlID49IHRuc0luZm9UYWJbaV0uYml0UmF0ZUZyb21bc2JyTGQ/MTowXSkgJiYKICAgICAgICAgYml0UmF0ZSA8PSB0bnNJbmZvVGFiW2ldLmJpdFJhdGVUb1tzYnJMZD8xOjBdKQogICAgewogICAgICB0bnNDb25maWdUYWIgPSAmdG5zSW5mb1RhYltpXS5wYXJhbVRhYlsoY2hhbm5lbHM9PTEpPzA6MV07CiAgICB9CiAgfQoKICByZXR1cm4gdG5zQ29uZmlnVGFiOwp9CgoKc3RhdGljIElOVCBnZXRUbnNNYXhCYW5kcygKICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZSwKICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwKICAgICAgICBjb25zdCBJTlQgaXNTaG9ydEJsb2NrCiAgICAgICAgKQp7CiAgaW50IGk7CiAgSU5UIG51bUJhbmRzID0gLTE7CiAgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgKnBNYXhCYW5kc1RhYiA9IE5VTEw7CiAgaW50IG1heEJhbmRzVGFiU2l6ZSA9IDA7CgogIHN3aXRjaCAoZ3JhbnVsZUxlbmd0aCkgewogICAgY2FzZSAxMDI0OgogICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjEwMjQ7CiAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjEwMjQpL3NpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSA0ODA6CiAgICAgIHBNYXhCYW5kc1RhYiA9IHRuc01heEJhbmRzVGFiNDgwOwogICAgICBtYXhCYW5kc1RhYlNpemUgPSBzaXplb2YodG5zTWF4QmFuZHNUYWI0ODApL3NpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSA1MTI6CiAgICAgIHBNYXhCYW5kc1RhYiA9IHRuc01heEJhbmRzVGFiNTEyOwogICAgICBtYXhCYW5kc1RhYlNpemUgPSBzaXplb2YodG5zTWF4QmFuZHNUYWI1MTIpL3NpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgbnVtQmFuZHMgPSAtMTsKICB9CgogIGlmIChwTWF4QmFuZHNUYWIhPU5VTEwpIHsKICAgIGZvciAoaT0wOyBpPG1heEJhbmRzVGFiU2l6ZTsgaSsrKSB7CiAgICAgIG51bUJhbmRzID0gcE1heEJhbmRzVGFiW2ldLm1heEJhbmRzWyghaXNTaG9ydEJsb2NrKT8wOjFdOwogICAgICBpZiAoc2FtcGxlUmF0ZSA+PSBwTWF4QmFuZHNUYWJbaV0uc2FtcGxpbmdSYXRlKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBudW1CYW5kczsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICAgICBGREthYWNFbmNfRnJlcVRvQmFuZFdpdGhSb3VuZGluZwoKICBSZXR1cm5zIGluZGV4IG9mIG5lYXJlc3QgYmFuZCBib3JkZXIKCiAgXHBhcmFtIGZyZXF1ZW5jeQogIFxwYXJhbSBzYW1wbGluZyBmcmVxdWVuY3kKICBccGFyYW0gdG90YWwgbnVtYmVyIG9mIGJhbmRzCiAgXHBhcmFtIHBvaW50ZXIgdG8gdGFibGUgb2YgYmFuZCBib3JkZXJzCgogIFxyZXR1cm4gYmFuZCBib3JkZXIKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCklOVCBGREthYWNFbmNfRnJlcVRvQmFuZFdpdGhSb3VuZGluZygKICAgICAgICBjb25zdCBJTlQgZnJlcSwKICAgICAgICBjb25zdCBJTlQgZnMsCiAgICAgICAgY29uc3QgSU5UIG51bU9mQmFuZHMsCiAgICAgICAgY29uc3QgSU5UICpiYW5kU3RhcnRPZmZzZXQKICAgICAgICApCnsKICBJTlQgbGluZU51bWJlciwgYmFuZDsKCiAgLyogIGFzc2VydChmcmVxID49IDApOyAgKi8KICBsaW5lTnVtYmVyID0gKGZyZXEqYmFuZFN0YXJ0T2Zmc2V0W251bU9mQmFuZHNdKjQvZnMrMSkvMjsKCiAgLyogZnJlcSA+IGZzLzIgKi8KICBpZiAobGluZU51bWJlciA+PSBiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10pCiAgICByZXR1cm4gbnVtT2ZCYW5kczsKCiAgLyogZmluZCBiYW5kIHRoZSBsaW5lIG51bWJlciBsaWVzIGluICovCiAgZm9yIChiYW5kPTA7IGJhbmQ8bnVtT2ZCYW5kczsgYmFuZCsrKSB7CiAgICBpZiAoYmFuZFN0YXJ0T2Zmc2V0W2JhbmQrMV0+bGluZU51bWJlcikgYnJlYWs7CiAgfQoKICAvKiByb3VuZCB0byBuZWFyZXN0IGJhbmQgYm9yZGVyICovCiAgaWYgKGxpbmVOdW1iZXIgLSBiYW5kU3RhcnRPZmZzZXRbYmFuZF0gPgogICAgICBiYW5kU3RhcnRPZmZzZXRbYmFuZCsxXSAtIGxpbmVOdW1iZXIgKQogICAgewogICAgICBiYW5kKys7CiAgICB9CgogIHJldHVybihiYW5kKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0luaXRUbnNDb25maWd1cmF0aW9uCiAgICBkZXNjcmlwdGlvbjogIGZpbGwgVE5TX0NPTkZJRyBzdHJ1Y3R1cmUgd2l0aCBzZW5zaWJsZSBjb250ZW50CiAgICByZXR1cm5zOgogICAgaW5wdXQ6ICAgICAgICBiaXRyYXRlLCBzYW1wbGVyYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgIGJsb2NrdHlwZSAobG9uZyBvciBzaG9ydCksCiAgICAgICAgICAgICAgICAgIFROUyBDb25maWcgc3RydWN0IChtb2RpZmllZCksCiAgICAgICAgICAgICAgICAgIHBzeSBjb25maWcgc3RydWN0LAogICAgICAgICAgICAgICAgICB0bnMgYWN0aXZlIGZsYWcKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFRuc0NvbmZpZ3VyYXRpb24oSU5UIGJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBibG9ja1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZFNiclByZXNlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0QywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICpwQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdXNlVG5zUGVhaykKewogIGludCBpOwogIC8vZmxvYXQgYWNmVGltZVJlcyAgID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gMC4xMjVmIDogMC4wNDY4NzVmOwoKICBpZiAoY2hhbm5lbHMgPD0gMCkKICAgIHJldHVybiAoQUFDX0VOQ09ERVJfRVJST1IpMTsKCiAgLyogaW5pdGlhbGl6ZSBUTlMgZmlsdGVyIGZsYWcsIG9yZGVyLCBhbmQgY29lZmZpY2llbnQgcmVzb2x1dGlvbiAoaW4gYml0cyBwZXIgY29lZmYpICovCiAgdEMtPnRuc0FjdGl2ZSAgICAgID0gKGFjdGl2ZSkgPyBUUlVFIDogRkFMU0U7CiAgdEMtPm1heE9yZGVyICAgICAgID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gNSA6IDEyOyAgLyogbWF4aW11bTogNywgMjAgKi8KICBpZiAoYml0UmF0ZSA8IDE2MDAwKQogICAgdEMtPm1heE9yZGVyIC09IDI7CiAgdEMtPmNvZWZSZXMgICAgICAgID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gMyA6IDQ7CgogIC8qIExQQyBzdG9wIGxpbmU6IGhpZ2hlc3QgTURDVCBsaW5lIHRvIGJlIGNvZGVkLCBidXQgZG8gbm90IGdvIGJleW9uZCBUTlNfTUFYX0JBTkRTISAqLwogIHRDLT5scGNTdG9wQmFuZCA9IGdldFRuc01heEJhbmRzKHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDEgOiAwKTsKCiAgaWYgKHRDLT5scGNTdG9wQmFuZCA8IDApIHsKICAgIHJldHVybiAoQUFDX0VOQ09ERVJfRVJST1IpMTsKICB9CgogIHRDLT5scGNTdG9wQmFuZCA9IEZES21pbih0Qy0+bHBjU3RvcEJhbmQsIHBDLT5zZmJBY3RpdmUpOwogIHRDLT5scGNTdG9wTGluZSAgICA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0b3BCYW5kXTsKCiAgc3dpdGNoIChncmFudWxlTGVuZ3RoKSB7CiAgICBjYXNlIDEwMjQ6CiAgICAgIC8qIFROUyBzdGFydCBsaW5lOiBza2lwIGxvd2VyIE1EQ1QgbGluZXMgdG8gcHJldmVudCBhcnRpZmFjdHMgZHVlIHRvIGZpbHRlciBtaXNtYXRjaCAqLwogICAgICB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF0gICA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDAgOiAoKHNhbXBsZVJhdGUgPCAxODc4MykgPyA0IDogOCk7CiAgICAgIHRDLT5scGNTdGFydExpbmVbTE9GSUxUXSAgID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF1dOwoKICAgICAgaSA9IHRDLT5scGNTdG9wQmFuZDsKICAgICAgd2hpbGUgKHBDLT5zZmJPZmZzZXRbaV0gPiAodEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdICsgKHRDLT5scGNTdG9wTGluZSAtIHRDLT5scGNTdGFydExpbmVbTE9GSUxUXSkgLyA0KSkgaS0tOwogICAgICB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF0gICA9IGk7CiAgICAgIHRDLT5scGNTdGFydExpbmVbSElGSUxUXSAgID0gcEMtPnNmYk9mZnNldFtpXTsKCiAgICAgIHRDLT5jb25mVGFiLnRocmVzaE9uW0hJRklMVF0gPSAxNDM3OwogICAgICB0Qy0+Y29uZlRhYi50aHJlc2hPbltMT0ZJTFRdID0gMTUwMDsKCiAgICAgIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXSA9IHRDLT5tYXhPcmRlcjsKICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdID0gdEMtPm1heE9yZGVyIC0gNzsKCiAgICAgIHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltISUZJTFRdID0gRklMVEVSX0RJUkVDVElPTjsKICAgICAgdEMtPmNvbmZUYWIudG5zRmlsdGVyRGlyZWN0aW9uW0xPRklMVF0gPSBGSUxURVJfRElSRUNUSU9OOwoKICAgICAgdEMtPmNvbmZUYWIuYWNmU3BsaXRbSElGSUxUXSA9IC0xOyAgLyogc2lnbmFsIE1lcmdlZDR0bzJRdWFydGVyc0F1dG9Db3JyZWxhdGlvbiBpbiBGREthYWNFbmNfTWVyZ2VkQXV0b0NvcnJlbGF0aW9uKi8KICAgICAgdEMtPmNvbmZUYWIuYWNmU3BsaXRbTE9GSUxUXSA9IC0xOyAgLyogc2lnbmFsIE1lcmdlZDR0bzJRdWFydGVyc0F1dG9Db3JyZWxhdGlvbiBpbiBGREthYWNFbmNfTWVyZ2VkQXV0b0NvcnJlbGF0aW9uICovCgogICAgICB0Qy0+Y29uZlRhYi5maWx0ZXJFbmFibGVkW0hJRklMVF0gPSAxOwogICAgICB0Qy0+Y29uZlRhYi5maWx0ZXJFbmFibGVkW0xPRklMVF0gPSAxOwogICAgICB0Qy0+Y29uZlRhYi5zZXBlcmF0ZUZpbHRlcnNBbGxvd2VkID0gMTsKCiAgICAgIC8qIGNvbXB1dGUgYXV0b2NvcnJlbGF0aW9uIHdpbmRvdyBiYXNlZCBvbiBtYXhpbXVtIGZpbHRlciBvcmRlciBmb3IgZ2l2ZW4gYmxvY2sgdHlwZSAqLwogICAgICAvKiBmb3IgKGkgPSAwOyBpIDw9IHRDLT5tYXhPcmRlciArIDM7IGkrKykgewogICAgICAgICAgIGZsb2F0IGFjZldpblRlbXAgPSBhY2ZUaW1lUmVzICogaTsKICAgICAgICAgICBhY2ZXaW5kb3dbaV0gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC0gYWNmV2luVGVtcCAqIGFjZldpblRlbXApOwogICAgICAgICB9CiAgICAgICovCiAgICAgIGlmIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSB7CiAgICAgICAgRkRLbWVtY3B5KHRDLT5hY2ZXaW5kb3dbSElGSUxUXSwgYWNmV2luZG93U2hvcnQsIEZES21pbihzaXplb2YoYWNmV2luZG93U2hvcnQpLCBzaXplb2YodEMtPmFjZldpbmRvd1tISUZJTFRdKSkpOwogICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0xPRklMVF0sIGFjZldpbmRvd1Nob3J0LCBGREttaW4oc2l6ZW9mKGFjZldpbmRvd1Nob3J0KSwgc2l6ZW9mKHRDLT5hY2ZXaW5kb3dbSElGSUxUXSkpKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBGREttZW1jcHkodEMtPmFjZldpbmRvd1tISUZJTFRdLCBhY2ZXaW5kb3dMb25nLCBGREttaW4oc2l6ZW9mKGFjZldpbmRvd0xvbmcpLCBzaXplb2YodEMtPmFjZldpbmRvd1tISUZJTFRdKSkpOwogICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0xPRklMVF0sIGFjZldpbmRvd0xvbmcsIEZES21pbihzaXplb2YoYWNmV2luZG93TG9uZyksIHNpemVvZih0Qy0+YWNmV2luZG93W0hJRklMVF0pKSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDQ4MDoKICAgIGNhc2UgNTEyOgogICAgICB7CiAgICAgICAgY29uc3QgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQqIHBDZmcgPSBGREthYWNFbmNfR2V0VG5zUGFyYW0oYml0UmF0ZSwgY2hhbm5lbHMsIGxkU2JyUHJlc2VudCk7CgogICAgICAgIGlmICggcENmZyAhPSBOVUxMICkgewogICAgICAgICAgdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdICAgICAgICAgPSBGREthYWNFbmNfRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhwQ2ZnLT5maWx0ZXJTdGFydEZyZXFbSElGSUxUXSwgc2FtcGxlUmF0ZSwgcEMtPnNmYkNudCwgcEMtPnNmYk9mZnNldCk7CiAgICAgICAgICB0Qy0+bHBjU3RhcnRMaW5lW0hJRklMVF0gICAgICAgICA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdXTsKICAgICAgICAgIHRDLT5scGNTdGFydEJhbmRbTE9GSUxUXSAgICAgICAgID0gRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaXRoUm91bmRpbmcocENmZy0+ZmlsdGVyU3RhcnRGcmVxW0xPRklMVF0sIHNhbXBsZVJhdGUsIHBDLT5zZmJDbnQsIHBDLT5zZmJPZmZzZXQpOwogICAgICAgICAgdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdICAgICAgICAgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRbTE9GSUxUXV07CgogICAgICAgICAgdEMtPmNvbmZUYWIudGhyZXNoT25bSElGSUxUXSA9IHBDZmctPnRocmVzaE9uW0hJRklMVF07CiAgICAgICAgICB0Qy0+Y29uZlRhYi50aHJlc2hPbltMT0ZJTFRdID0gcENmZy0+dGhyZXNoT25bTE9GSUxUXTsKCiAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0gPSBwQ2ZnLT50bnNMaW1pdE9yZGVyW0hJRklMVF07CiAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0gPSBwQ2ZnLT50bnNMaW1pdE9yZGVyW0xPRklMVF07CgogICAgICAgICAgdEMtPmNvbmZUYWIudG5zRmlsdGVyRGlyZWN0aW9uW0hJRklMVF0gPSBwQ2ZnLT50bnNGaWx0ZXJEaXJlY3Rpb25bSElGSUxUXTsKICAgICAgICAgIHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltMT0ZJTFRdID0gcENmZy0+dG5zRmlsdGVyRGlyZWN0aW9uW0xPRklMVF07CgogICAgICAgICAgdEMtPmNvbmZUYWIuYWNmU3BsaXRbSElGSUxUXSA9IHBDZmctPmFjZlNwbGl0W0hJRklMVF07CiAgICAgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdFtMT0ZJTFRdID0gcENmZy0+YWNmU3BsaXRbTE9GSUxUXTsKCiAgICAgICAgICB0Qy0+Y29uZlRhYi5maWx0ZXJFbmFibGVkW0hJRklMVF0gPSBwQ2ZnLT5maWx0ZXJFbmFibGVkW0hJRklMVF07CiAgICAgICAgICB0Qy0+Y29uZlRhYi5maWx0ZXJFbmFibGVkW0xPRklMVF0gPSBwQ2ZnLT5maWx0ZXJFbmFibGVkW0xPRklMVF07CiAgICAgICAgICB0Qy0+Y29uZlRhYi5zZXBlcmF0ZUZpbHRlcnNBbGxvd2VkID0gcENmZy0+c2VwZXJhdGVGaWx0ZXJzQWxsb3dlZDsKCiAgICAgICAgICBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KHRDLT5hY2ZXaW5kb3dbSElGSUxUXSwgdEMtPm1heE9yZGVyKzEsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsIHBDZmctPnRuc1RpbWVSZXNvbHV0aW9uW0hJRklMVF0sIFROU19USU1FUkVTX1NDQUxFKTsKICAgICAgICAgIEZES2FhY0VuY19DYWxjR2F1c3NXaW5kb3codEMtPmFjZldpbmRvd1tMT0ZJTFRdLCB0Qy0+bWF4T3JkZXIrMSwgc2FtcGxlUmF0ZSwgZ3JhbnVsZUxlbmd0aCwgcENmZy0+dG5zVGltZVJlc29sdXRpb25bTE9GSUxUXSwgVE5TX1RJTUVSRVNfU0NBTEUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHRDLT50bnNBY3RpdmUgPSBGQUxTRTsgLyogbm8gY29uZmlndXJhdGlvbiBhdmFpbGFibGUsIGRpc2FibGUgdG5zIHRvb2wgKi8KICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0Qy0+dG5zQWN0aXZlID0gRkFMU0U7IC8qIG5vIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlLCBkaXNhYmxlIHRucyB0b29sICovCiAgfQoKICByZXR1cm4gQUFDX0VOQ19PSzsKCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQogIFxicmllZiAgICAgRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bQoKICBTY2FsZXMgdXAgc3BlY3RydW0gbGluZXMgaW4gYSBnaXZlbiBmcmVxdWVuY3kgc2VjdGlvbgoKICBccGFyYW0gc2NhbGVkIHNwZWN0cnVtCiAgXHBhcmFtIG9yaWdpbmFsIHNwZWN0cnVtCiAgXHBhcmFtIGZyZXF1ZW5jeSBsaW5lIHRvIHN0YXJ0IHNjYWxpbmcKICBccGFyYW0gZnJlcXVlbmN5IGxpbmUgdG8gZW5jIHNjYWxpbmcKCiAgXHJldHVybiBzY2FsZSBmYWN0b3IKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbmxpbmUgSU5UIEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0oCiAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpkZXN0LAogICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAqc3JjLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc3RvcExpbmUKICAgICAgICApCnsKICAgIElOVCBpLCBzY2FsZTsKCiAgICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwoKICAgIC8qIEdldCBoaWdoZXN0IHZhbHVlIGluIGdpdmVuIHNwZWN0cnVtICovCiAgICBmb3IgKGk9c3RhcnRMaW5lOyBpPHN0b3BMaW5lOyBpKyspIHsKICAgICAgbWF4VmFsID0gZml4TWF4KG1heFZhbCxmaXhwX2FicyhzcmNbaV0pKTsKICAgIH0KICAgIHNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhtYXhWYWwpOwoKICAgIC8qIFNjYWxlIHNwZWN0cnVtIGFjY29yZGluZyB0byBoaWdoZXN0IHZhbHVlICovCiAgICBmb3IgKGk9c3RhcnRMaW5lOyBpPHN0b3BMaW5lOyBpKyspIHsKICAgICAgZGVzdFtpXSA9IHNyY1tpXTw8c2NhbGU7CiAgICB9CgogICAgcmV0dXJuIHNjYWxlOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKICBcYnJpZWYgICAgIEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZQoKICBDYWxjdWxhdGUgYXV0b2NvcmVsbGF0aW9uIHZhbHVlIGZvciBvbmUgbGFnCgogIFxwYXJhbSBwb2ludGVyIHRvIHNwZWN0cnVtCiAgXHBhcmFtIHN0YXJ0IGxpbmUKICBccGFyYW0gc3RvcCBsaW5lCiAgXHBhcmFtIGxhZyB0byBiZSBjYWxjdWxhdGVkCiAgXHBhcmFtIHNjYWxpbmcgb2YgdGhlIGxhZwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGlubGluZSBGSVhQX0RCTCBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUoCiAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICpzcGVjdHJ1bSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHN0YXJ0TGluZSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHN0b3BMaW5lLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbGFnLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc2NhbGUKICAgICAgICApCnsKICAgIGludCBpOwogICAgRklYUF9EQkwgcmVzdWx0ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKCiAgICBpZiAobGFnPT0wKSB7CiAgICAgIGZvciAoaT1zdGFydExpbmU7IGk8c3RvcExpbmU7IGkrKykgewogICAgICAgIHJlc3VsdCArPSAoZlBvdzIoc3BlY3RydW1baV0pPj5zY2FsZSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICBmb3IgKGk9c3RhcnRMaW5lOyBpPChzdG9wTGluZS1sYWcpOyBpKyspIHsKICAgICAgICByZXN1bHQgKz0gKGZNdWx0KHNwZWN0cnVtW2ldLCBzcGVjdHJ1bVtpK2xhZ10pPj5zY2FsZSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKICBcYnJpZWYgICAgIEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMKCiAgQXV0b2NvcnJlbGF0aW9uIGZ1bmN0aW9uIGZvciAxc3QgYW5kIDJuZCBoYWxmIG9mIHRoZSBzcGVjdHJ1bQoKICBccGFyYW0gcG9pbnRlciB0byBzcGVjdHJ1bQogIFxwYXJhbSBwb2ludGVyIHRvIGF1dG9jb3JyZWxhdGlvbiB3aW5kb3cKICBccGFyYW0gZmlsdGVyIHN0YXJ0IGxpbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbmxpbmUgRklYUF9EQkwgRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYygKICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIHZhbHVlLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc2NhbGUsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICpzYwogICAgICAgICkKewogICAgI2RlZmluZSBITE1fTUlOX05SRyAwLjAwMDAwMDAwMzcyNTI5MDI5ODQ2MTkxNDA2MjVmIC8qIDJeLTI4ICovCiAgICAjZGVmaW5lIE1BWF9JTlZfTlJHRkFDICgxLmYvSExNX01JTl9OUkcpCgogICAgRklYUF9EQkwgcmV0VmFsdWU7CiAgICBGSVhQX0RCTCBBLCBCOwoKICAgIGlmIChzY2FsZT49MCkgewogICAgICBBID0gdmFsdWU7CiAgICAgIEIgPSBGTDJGWENPTlNUX0RCTChITE1fTUlOX05SRyk+PmZpeE1pbihERlJBQ1RfQklUUy0xLHNjYWxlKTsKICAgIH0KICAgIGVsc2UgewogICAgICBBID0gdmFsdWU+PmZpeE1pbihERlJBQ1RfQklUUy0xLCgtc2NhbGUpKTsKICAgICAgQiA9IEZMMkZYQ09OU1RfREJMKEhMTV9NSU5fTlJHKTsKICAgIH0KCiAgICBpZiAoQSA+IEIpIHsKICAgICAgaW50IHNoaWZ0ID0gMDsKICAgICAgRklYUF9EQkwgdG1wID0gaW52U3FydE5vcm0yKHZhbHVlLCZzaGlmdCk7CgogICAgICByZXRWYWx1ZSA9IGZNdWx0KHRtcCx0bXApOwogICAgICAqc2MgKz0gKDIqc2hpZnQpOwogICAgfQogICAgZWxzZSB7CiAgICAgIC8qIE1BWF9JTlZfTlJHRkFDKkZES3BvdygyLC0yOCkgPSAxLzJeLTI4ICogMl4tMjggPSAxLjAgKi8KICAgICAgcmV0VmFsdWUgPSAvKkZMMkZYQ09OU1RfREJMKE1BWF9JTlZfTlJHRkFDKkZES3BvdygyLC0yOCkpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAgICAgICpzYyArPSBzY2FsZSsyODsKICAgIH0KCiAgICByZXR1cm4gcmV0VmFsdWU7Cn0KCnN0YXRpYyB2b2lkIEZES2FhY0VuY19NZXJnZWRBdXRvQ29ycmVsYXRpb24oCiAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICpzcGVjdHJ1bSwKICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIGFjZldpbmRvd1tNQVhfTlVNX09GX0ZJTFRFUlNdW1ROU19NQVhfT1JERVIrMysxXSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGxwY1N0YXJ0TGluZVtNQVhfTlVNX09GX0ZJTFRFUlNdLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbHBjU3RvcExpbmUsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBtYXhPcmRlciwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGFjZlNwbGl0W01BWF9OVU1fT0ZfRklMVEVSU10sCiAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpfcnh4MSwKICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKl9yeHgyCiAgICAgICAgKQp7CiAgICBpbnQgaSwgaWR4MCwgaWR4MSwgaWR4MiwgaWR4MywgaWR4NCwgbGFnOwogICAgRklYUF9EQkwgcnh4MV8wLCByeHgyXzAsIHJ4eDNfMCwgcnh4NF8wOwoKICAgIC8qIGJ1ZmZlciBmb3IgdGVtcG9yYWwgc3BlY3RydW0gKi8KICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpOwoKICAgIC8qIHByZS1pbml0aWFsaXphdGlvbiBvdXRwdXQgKi8KICAgIEZES21lbWNsZWFyKCZfcnh4MVswXSwgc2l6ZW9mKEZJWFBfREJMKSoobWF4T3JkZXIrMSkpOwogICAgRkRLbWVtY2xlYXIoJl9yeHgyWzBdLCBzaXplb2YoRklYUF9EQkwpKihtYXhPcmRlcisxKSk7CgogICAgLyogTURDVCBsaW5lIGluZGljZXMgc2VwYXJhdGluZyB0aGUgMXN0LCAybmQsIDNyZCwgYW5kIDR0aCBhbmFseXNpcyBxdWFydGVycyAqLwogICAgaWYgKCAoYWNmU3BsaXRbTE9GSUxUXT09LTEpIHx8IChhY2ZTcGxpdFtISUZJTFRdPT0tMSkgKSB7CiAgICAgIC8qIGF1dG9jb3JyZWxhdGlvbiBmdW5jdGlvbiBmb3IgMXN0LCAybmQsIDNyZCwgYW5kIDR0aCBxdWFydGVyIG9mIHRoZSBzcGVjdHJ1bSAqLwogICAgICBpZHgwID0gbHBjU3RhcnRMaW5lW0xPRklMVF07CiAgICAgIGkgICAgPSBscGNTdG9wTGluZSAtIGxwY1N0YXJ0TGluZVtMT0ZJTFRdOwogICAgICBpZHgxID0gaWR4MCArIGkgLyA0OwogICAgICBpZHgyID0gaWR4MCArIGkgLyAyOwogICAgICBpZHgzID0gaWR4MCArIGkgKiAzIC8gNDsKICAgICAgaWR4NCA9IGxwY1N0b3BMaW5lOwogICAgfQogICAgZWxzZSB7CiAgICAgIEZES19BU1NFUlQoYWNmU3BsaXRbTE9GSUxUXT09MSk7CiAgICAgIEZES19BU1NFUlQoYWNmU3BsaXRbSElGSUxUXT09Myk7CiAgICAgIGkgICAgPSAobHBjU3RvcExpbmUgLSBscGNTdGFydExpbmVbSElGSUxUXSkgLyAzOwogICAgICBpZHgwID0gbHBjU3RhcnRMaW5lW0xPRklMVF07CiAgICAgIGlkeDEgPSBscGNTdGFydExpbmVbSElGSUxUXTsKICAgICAgaWR4MiA9IGlkeDEgKyBpOwogICAgICBpZHgzID0gaWR4MiArIGk7CiAgICAgIGlkeDQgPSBscGNTdG9wTGluZTsKICAgIH0KCiAgICAvKiBjb3B5IHNwZWN0cnVtIHRvIHRlbXBvcmFsIGJ1ZmZlciBhbmQgc2NhbGUgdXAgYXMgbXVjaCBhcyBwb3NzaWJsZSAqLwogICAgSU5UIHNjMSA9IEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0ocFNwZWN0cnVtLCBzcGVjdHJ1bSwgaWR4MCwgaWR4MSk7CiAgICBJTlQgc2MyID0gRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bShwU3BlY3RydW0sIHNwZWN0cnVtLCBpZHgxLCBpZHgyKTsKICAgIElOVCBzYzMgPSBGREthYWNFbmNfU2NhbGVVcFNwZWN0cnVtKHBTcGVjdHJ1bSwgc3BlY3RydW0sIGlkeDIsIGlkeDMpOwogICAgSU5UIHNjNCA9IEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0ocFNwZWN0cnVtLCBzcGVjdHJ1bSwgaWR4MywgaWR4NCk7CgogICAgLyogZ2V0IHNjYWxpbmcgdmFsdWVzIGZvciBzdW1tYXRpb24gKi8KICAgIElOVCBuc2MxLCBuc2MyLCBuc2MzLCBuc2M0OwogICAgZm9yIChuc2MxPTE7ICgxPDxuc2MxKTwoaWR4MS1pZHgwKTsgbnNjMSsrKTsKICAgIGZvciAobnNjMj0xOyAoMTw8bnNjMik8KGlkeDItaWR4MSk7IG5zYzIrKyk7CiAgICBmb3IgKG5zYzM9MTsgKDE8PG5zYzMpPChpZHgzLWlkeDIpOyBuc2MzKyspOwogICAgZm9yIChuc2M0PTE7ICgxPDxuc2M0KTwoaWR4NC1pZHgzKTsgbnNjNCsrKTsKCiAgICAvKiBjb21wdXRlIGF1dG9jb3JyZWxhdGlvbiB2YWx1ZSBhdCBsYWcgemVybywgaS4gZS4gZW5lcmd5LCBmb3IgZWFjaCBxdWFydGVyICovCiAgICByeHgxXzAgPSBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgwLCBpZHgxLCAwLCBuc2MxKTsKICAgIHJ4eDJfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDEsIGlkeDIsIDAsIG5zYzIpOwogICAgcnh4M18wID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MiwgaWR4MywgMCwgbnNjMyk7CiAgICByeHg0XzAgPSBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgzLCBpZHg0LCAwLCBuc2M0KTsKCiAgICAvKiBjb21wdXRlIGVuZXJneSBub3JtYWxpemF0aW9uIGZhY3RvcnMsIGkuIGUuIDEvZW5lcmd5IChzYXZlcyBzb21lIGRpdmlzaW9ucykgKi8KICAgIGlmIChyeHgxXzAgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkKICAgIHsKICAgICAgICBJTlQgc2NfZmFjMSA9IC0xOwogICAgICAgIEZJWFBfREJMIGZhYzEgPSBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKHJ4eDFfMCwgKCgtMipzYzEpK25zYzEpLCAmc2NfZmFjMSk7CiAgICAgICAgX3J4eDFbMF0gPSBzY2FsZVZhbHVlKGZNdWx0KHJ4eDFfMCxmYWMxKSxzY19mYWMxKTsKCiAgICAgICAgZm9yIChsYWcgPSAxOyBsYWcgPD0gbWF4T3JkZXI7IGxhZysrKSB7CiAgICAgICAgICAvKiBjb21wdXRlIGVuZXJneS1ub3JtYWxpemVkIGFuZCB3aW5kb3dlZCBhdXRvY29ycmVsYXRpb24gdmFsdWVzIGF0IHRoaXMgbGFnICovCiAgICAgICAgICBpZiAoKDMgKiBsYWcpIDw9IG1heE9yZGVyICsgMykgewogICAgICAgICAgICAgIEZJWFBfREJMIHgxID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MCwgaWR4MSwgbGFnLCBuc2MxKTsKICAgICAgICAgICAgICBfcnh4MVtsYWddID0gZk11bHQoc2NhbGVWYWx1ZShmTXVsdCh4MSxmYWMxKSxzY19mYWMxKSwgYWNmV2luZG93W0xPRklMVF1bMypsYWddKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogYXV0byBjb3JyIG92ZXIgdXBwZXIgMy80IG9mIHNwZWN0cnVtICovCiAgICBpZiAoICEoKHJ4eDJfMCA9PSBGTDJGWENPTlNUX0RCTCgwLmYpKSAmJiAocnh4M18wID09IEZMMkZYQ09OU1RfREJMKDAuZikpICYmIChyeHg0XzAgPT0gRkwyRlhDT05TVF9EQkwoMC5mKSkpICkKICAgIHsKICAgICAgICBGSVhQX0RCTCBmYWMyLCBmYWMzLCBmYWM0OwogICAgICAgIGZhYzIgPSBmYWMzID0gZmFjNCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgICAgSU5UIHNjX2ZhYzIsIHNjX2ZhYzMsIHNjX2ZhYzQ7CiAgICAgICAgc2NfZmFjMiA9IHNjX2ZhYzMgPSBzY19mYWM0ID0gMDsKCiAgICAgICAgaWYgKHJ4eDJfMCE9RkwyRlhDT05TVF9EQkwoMC5mKSkgewogICAgICAgICAgZmFjMiA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4Ml8wLCAoKC0yKnNjMikrbnNjMiksICZzY19mYWMyKTsKICAgICAgICAgIHNjX2ZhYzIgLT0gMjsKICAgICAgICB9CiAgICAgICAgaWYgKHJ4eDNfMCE9RkwyRlhDT05TVF9EQkwoMC5mKSkgewogICAgICAgICAgZmFjMyA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4M18wLCAoKC0yKnNjMykrbnNjMyksICZzY19mYWMzKTsKICAgICAgICAgIHNjX2ZhYzMgLT0gMjsKICAgICAgICB9CiAgICAgICAgaWYgKHJ4eDRfMCE9RkwyRlhDT05TVF9EQkwoMC5mKSkgewogICAgICAgICAgZmFjNCA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4NF8wLCAoKC0yKnNjNCkrbnNjNCksICZzY19mYWM0KTsKICAgICAgICAgIHNjX2ZhYzQgLT0gMjsKICAgICAgICB9CgogICAgICAgIF9yeHgyWzBdID0gc2NhbGVWYWx1ZShmTXVsdChyeHgyXzAsZmFjMiksc2NfZmFjMikgKwogICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChyeHgzXzAsZmFjMyksc2NfZmFjMykgKwogICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChyeHg0XzAsZmFjNCksc2NfZmFjNCk7CgogICAgICAgIGZvciAobGFnID0gMTsgbGFnIDw9IG1heE9yZGVyOyBsYWcrKykgewogICAgICAgICAgLyogbWVyZ2UgcXVhcnRlcnMgMiwgMywgNCBpbnRvIG9uZSBhdXRvY29ycmVsYXRpb247IHF1YXJ0ZXIgMSBzdGF5cyBzZXBhcmF0ZSAqLwogICAgICAgICAgRklYUF9EQkwgeDIgPSBzY2FsZVZhbHVlKGZNdWx0KEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDEsIGlkeDIsIGxhZywgbnNjMiksIGZhYzIpLHNjX2ZhYzIpICsKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgyLCBpZHgzLCBsYWcsIG5zYzMpLCBmYWMzKSxzY19mYWMzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUoZk11bHQoRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MywgaWR4NCwgbGFnLCBuc2M0KSwgZmFjNCksc2NfZmFjNCk7CgogICAgICAgICAgX3J4eDJbbGFnXSA9IGZNdWx0KHgyLCBhY2ZXaW5kb3dbSElGSUxUXVtsYWddKTsKICAgICAgICB9CiAgICB9CgogICAgQ19BTExPQ19TQ1JBVENIX0VORChwU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19UbnNEZXRlY3QKICAgIGRlc2NyaXB0aW9uOiAgZG8gZGVjaXNpb24sIGlmIFROUyBzaGFsbCBiZSB1c2VkIG9yIG5vdAogICAgcmV0dXJuczoKICAgIGlucHV0OiAgICAgICAgdG5zIGRhdGEgc3RydWN0dXJlIChtb2RpZmllZCksCiAgICAgICAgICAgICAgICAgIHRucyBjb25maWcgc3RydWN0dXJlLAogICAgICAgICAgICAgICAgICBzY2FsZWZhY3RvciBzaXplIGFuZCB0YWJsZSwKICAgICAgICAgICAgICAgICAgc3BlY3RydW0sCiAgICAgICAgICAgICAgICAgIHN1YmJsb2NrIG51bSwgYmxvY2t0eXBlLAogICAgICAgICAgICAgICAgICBzZmItd2lzZSBlbmVyZ3kuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSU5UIEZES2FhY0VuY19UbnNEZXRlY3QoCiAgICAgICAgICAgICAgVE5TX0RBVEEgKnRuc0RhdGEsCiAgICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyAqdEMsCiAgICAgICAgICAgICAgVE5TX0lORk8qIHRuc0luZm8sCiAgICAgICAgICAgICAgSU5UIHNmYkNudCwKICAgICAgICAgICAgICBGSVhQX0RCTCAqc3BlY3RydW0sCiAgICAgICAgICAgICAgSU5UIHN1YkJsb2NrTnVtYmVyLAogICAgICAgICAgICAgIElOVCBibG9ja1R5cGUKICAgICAgICAgICAgICApCnsKICAvKiBhdXRvY29ycmVsYXRpb24gZnVuY3Rpb24gZm9yIDFzdCwgMm5kLCAzcmQsIGFuZCA0dGggcXVhcnRlciBvZiB0aGUgc3BlY3RydW0uICovCiAgRklYUF9EQkwgcnh4MVtUTlNfTUFYX09SREVSKzFdOyAvKiBoaWdoZXIgcGFydCAqLwogIEZJWFBfREJMIHJ4eDJbVE5TX01BWF9PUkRFUisxXTsgLyogbG93ZXIgcGFydCAqLwogIEZJWFBfREJMIHBhcmNvcl90bXBbVE5TX01BWF9PUkRFUl07CgogIGludCBpOwoKICBUTlNfU1VCQkxPQ0tfSU5GTyAqdHNiaSA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKQogICAgPyAmdG5zRGF0YS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdCiAgICA6ICZ0bnNEYXRhLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvOwoKICB0bnNEYXRhLT5maWx0ZXJzTWVyZ2VkICA9IEZBTFNFOwogIHRzYmktPnRuc0FjdGl2ZSAgICAgICAgID0gRkFMU0U7CiAgdHNiaS0+cHJlZGljdGlvbkdhaW4gICAgPSAxMDAwOwogIHRuc0luZm8tPm51bU9mRmlsdGVyc1tzdWJCbG9ja051bWJlcl0gPSAwOwogIHRuc0luZm8tPmNvZWZSZXNbc3ViQmxvY2tOdW1iZXJdICAgICAgPSB0Qy0+Y29lZlJlczsKICBmb3IgKGkgPSAwOyBpIDwgdEMtPm1heE9yZGVyOyBpKyspIHsKICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0gPSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldID0gMDsKICB9CgogIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9IHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9IDA7CiAgdG5zSW5mby0+b3JkZXIgW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdID0gdG5zSW5mby0+b3JkZXIgW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID0gMDsKCiAgaWYgKCAodEMtPnRuc0FjdGl2ZSkgJiYgKHRDLT5tYXhPcmRlcj4wKSApCiAgewogICAgaW50IHN1bVNxckNvZWY7CgogICAgRkRLYWFjRW5jX01lcmdlZEF1dG9Db3JyZWxhdGlvbigKICAgICAgICAgIHNwZWN0cnVtLAogICAgICAgICAgdEMtPmFjZldpbmRvdywKICAgICAgICAgIHRDLT5scGNTdGFydExpbmUsCiAgICAgICAgICB0Qy0+bHBjU3RvcExpbmUsCiAgICAgICAgICB0Qy0+bWF4T3JkZXIsCiAgICAgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdCwKICAgICAgICAgIHJ4eDEsCiAgICAgICAgICByeHgyKTsKCiAgICAvKiBjb21wdXRlIGhpZ2hlciBUTlMgZmlsdGVyIGluIGxhdHRpY2UgKFBhckNvcikgZm9ybSB3aXRoIExlUm91eC1HdWVndWVuIGFsZ29yaXRobSAqLwogICAgdHNiaS0+cHJlZGljdGlvbkdhaW4gPSBGREthYWNFbmNfQXV0b1RvUGFyY29yKHJ4eDIsIHBhcmNvcl90bXAsIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXSk7CgogICAgLyogbm9uLWxpbmVhciBxdWFudGl6YXRpb24gb2YgVE5TIGxhdHRpY2UgY29lZmZpY2llbnRzIHdpdGggZ2l2ZW4gcmVzb2x1dGlvbiAqLwogICAgRkRLYWFjRW5jX1BhcmNvcjJJbmRleCgKICAgICAgICAgICAgcGFyY29yX3RtcCwKICAgICAgICAgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXSwKICAgICAgICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdLAogICAgICAgICAgICB0Qy0+Y29lZlJlcyk7CgogICAgLyogcmVkdWNlIGZpbHRlciBvcmRlciBieSB0cnVuY2F0aW5nIHRyYWlsaW5nIHplcm9zLCBjb21wdXRlIHN1bShhYnMoY29lZnMpKSAqLwogICAgZm9yIChpID0gdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0gIT0gMCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSBpICsgMTsKCiAgICBzdW1TcXJDb2VmID0gMDsKICAgIGZvciAoOyBpID49IDA7IGktLSkgewogICAgICBzdW1TcXJDb2VmICs9IHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0gKiB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldOwogICAgfQoKICAgIHRuc0luZm8tPmRpcmVjdGlvbltzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9IHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltISUZJTFRdOwogICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdID0gc2ZiQ250IC0gdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdOwoKICAgIC8qIGRpc2FibGUgVE5TIGlmIHByZWRpY3Rpb25HYWluIGlzIGxlc3MgdGhhbiAzZEIgb3Igc3VtU3FyQ29lZiBpcyB0b28gc21hbGwgKi8KICAgIGlmICgodHNiaS0+cHJlZGljdGlvbkdhaW4gPiB0Qy0+Y29uZlRhYi50aHJlc2hPbltISUZJTFRdKSB8fCAoc3VtU3FyQ29lZiA+ICh0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0vMiArIDIpKSkKICAgIHsKICAgICAgdHNiaS0+dG5zQWN0aXZlID0gVFJVRTsKICAgICAgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW3N1YkJsb2NrTnVtYmVyXSsrOwoKICAgICAgLyogY29tcHV0ZSBzZWNvbmQgZmlsdGVyIGZvciBsb3dlciBxdWFydGVyOyBvbmx5IGFsbG93ZWQgZm9yIGxvbmcgd2luZG93cyEgKi8KICAgICAgaWYgKCAoYmxvY2tUeXBlICE9IFNIT1JUX1dJTkRPVykgJiYKICAgICAgICAgICAodEMtPmNvbmZUYWIuZmlsdGVyRW5hYmxlZFtMT0ZJTFRdKSAmJiAodEMtPmNvbmZUYWIuc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZCkgKQogICAgICB7CiAgICAgICAgLyogY29tcHV0ZSBzZWNvbmQgZmlsdGVyIGZvciBsb3dlciBmcmVxdWVuY2llcyAqLwoKICAgICAgICAvKiBjb21wdXRlIFROUyBmaWx0ZXIgaW4gbGF0dGljZSAoUGFyQ29yKSBmb3JtIHdpdGggTGVSb3V4LUd1ZWd1ZW4gYWxnb3JpdGhtICovCiAgICAgICAgSU5UIHByZWRHYWluID0gRkRLYWFjRW5jX0F1dG9Ub1BhcmNvcihyeHgxLCBwYXJjb3JfdG1wLCB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0pOwoKICAgICAgICAvKiBub24tbGluZWFyIHF1YW50aXphdGlvbiBvZiBUTlMgbGF0dGljZSBjb2VmZmljaWVudHMgd2l0aCBnaXZlbiByZXNvbHV0aW9uICovCiAgICAgICAgRkRLYWFjRW5jX1BhcmNvcjJJbmRleCgKICAgICAgICAgICAgICAgIHBhcmNvcl90bXAsCiAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdLAogICAgICAgICAgICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdLAogICAgICAgICAgICAgICAgdEMtPmNvZWZSZXMpOwoKICAgICAgICAvKiByZWR1Y2UgZmlsdGVyIG9yZGVyIGJ5IHRydW5jYXRpbmcgdHJhaWxpbmcgemVyb3MsIGNvbXB1dGUgc3VtKGFicyhjb2VmcykpICovCiAgICAgICAgZm9yIChpID0gdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldICE9IDApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID0gaSArIDE7CgogICAgICAgIHN1bVNxckNvZWYgPSAwOwogICAgICAgIGZvciAoOyBpID49IDA7IGktLSkgewogICAgICAgICAgc3VtU3FyQ29lZiArPSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldICogdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXTsKICAgICAgICB9CgogICAgICAgIHRuc0luZm8tPmRpcmVjdGlvbltzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9IHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltMT0ZJTFRdOwogICAgICAgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9IHRDLT5scGNTdGFydEJhbmRbSElGSUxUXSAtIHRDLT5scGNTdGFydEJhbmRbTE9GSUxUXTsKCiAgICAgICAgLyogZmlsdGVyIGxvd2VyIHF1YXJ0ZXIgaWYgZ2FpbiBpcyBoaWdoIGVub3VnaCwgYnV0IG5vdCBpZiBpdCdzIHRvbyBoaWdoICovCiAgICAgICAgaWYgKCAoIChwcmVkR2FpbiA+IHRDLT5jb25mVGFiLnRocmVzaE9uW0xPRklMVF0pICYmIChwcmVkR2FpbiA8ICgxNjAwMCAqIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXSkpICkKICAgICAgICAgIHx8ICggKHN1bVNxckNvZWYgPiA5KSAgJiYgKHN1bVNxckNvZWYgPCAyMiAqIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXSkgKSApCiAgICAgICAgewogICAgICAgICAgLyogY29tcGFyZSBsb3dlciB0byB1cHBlciBmaWx0ZXI7IGlmIHRoZXkgYXJlIHZlcnkgc2ltaWxhciwgbWVyZ2UgdGhlbSAqLwogICAgICAgICAgc3VtU3FyQ29lZiA9IDA7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdOyBpKyspIHsKICAgICAgICAgICAgc3VtU3FyQ29lZiArPSBGREthYnModG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSAtIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF1baV0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCAoc3VtU3FyQ29lZiA8IDIpICYmCiAgICAgICAgICAgICAgICh0bnNJbmZvLT5kaXJlY3Rpb25bc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPT0gdG5zSW5mby0+ZGlyZWN0aW9uW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdKSApCiAgICAgICAgICB7CiAgICAgICAgICAgIHRuc0RhdGEtPmZpbHRlcnNNZXJnZWQgPSBUUlVFOwogICAgICAgICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSBzZmJDbnQgLSB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF07CiAgICAgICAgICAgIGZvciAoOyBpIDwgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF07IGkrKykgewogICAgICAgICAgICAgIGlmIChGREthYnModG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSkgPiAxKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgaWYgKHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0gIT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpIDwgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0pIHsKICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9IGkgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW3N1YkJsb2NrTnVtYmVyXSsrOwogICAgICAgICAgfQogICAgICAgIH0gLyogZmlsdGVyIGxvd2VyIHBhcnQgKi8KICAgICAgfSAvKiBzZWNvbmQgZmlsdGVyIGFsbG93ZWQgICovCiAgICB9IC8qIGlmIHByZWRpY3Rpb25HYWluID4gMTQzNyAuLi4gKi8KICB9IC8qIG1heE9yZGVyID4gMCAmJiB0bnNBY3RpdmUgKi8KCiAgcmV0dXJuIDA7Cgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICAgICBGREthYWNMZEVuY19UbnNTeW5jCgogIHN5bmNocm9uaXplIFROUyBwYXJhbWV0ZXJzIHdoZW4gVE5TIGdhaW4gZGlmZmVyZW5jZSBzbWFsbCAocmVsYXRpdmUpCgogIFxwYXJhbSBwb2ludGVyIHRvIFROUyBkYXRhIHN0cnVjdHVyZSAoZGVzdGluYXRpb24pCiAgXHBhcmFtIHBvaW50ZXIgdG8gVE5TIGRhdGEgc3RydWN0dXJlIChzb3VyY2UpCiAgXHBhcmFtIHBvaW50ZXIgdG8gVE5TIGNvbmZpZyBzdHJ1Y3R1cmUKICBccGFyYW0gbnVtYmVyIG9mIHN1Yi1ibG9jawogIFxwYXJhbSBibG9jayB0eXBlCgogIFxyZXR1cm4gdm9pZAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEZES2FhY0VuY19UbnNTeW5jKAogICAgICAgICAgICAgVE5TX0RBVEEgKnRuc0RhdGFEZXN0LAogICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCiAgICAgICAgICAgICBUTlNfSU5GTyAqdG5zSW5mb0Rlc3QsCiAgICAgICAgICAgICBUTlNfSU5GTyAqdG5zSW5mb1NyYywKICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVEZXN0LAogICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZVNyYywKICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDCiAgICAgICAgICAgICApCnsKICBpbnQgaSwgdywgYWJzRGlmZiwgbldpbmRvd3M7CiAgVE5TX1NVQkJMT0NLX0lORk8gKnNiSW5mb0Rlc3Q7CiAgY29uc3QgVE5TX1NVQkJMT0NLX0lORk8gKnNiSW5mb1NyYzsKCiAgLyogaWYgb25lIGNoYW5uZWwgY29udGFpbnMgc2hvcnQgYmxvY2tzIGFuZCB0aGUgb3RoZXIgbm90LCBkbyBub3Qgc3luY2hyb25pemUgKi8KICBpZiAoIChibG9ja1R5cGVTcmMgPT0gU0hPUlRfV0lORE9XICYmIGJsb2NrVHlwZURlc3QgIT0gU0hPUlRfV0lORE9XKSB8fAogICAgICAgKGJsb2NrVHlwZURlc3QgPT0gU0hPUlRfV0lORE9XICYmIGJsb2NrVHlwZVNyYyAhPSBTSE9SVF9XSU5ET1cpICkKICB7CiAgICByZXR1cm47CiAgfQoKICBpZiAoYmxvY2tUeXBlRGVzdCAhPSBTSE9SVF9XSU5ET1cpIHsKICAgIHNiSW5mb0Rlc3QgPSAmdG5zRGF0YURlc3QtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm87CiAgICBzYkluZm9TcmMgID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm87CiAgICBuV2luZG93cyAgID0gMTsKICB9IGVsc2UgewogICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bMF07CiAgICBzYkluZm9TcmMgID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvWzBdOwogICAgbldpbmRvd3MgICA9IDg7CiAgfQoKICBmb3IgKHc9MDsgdzxuV2luZG93czsgdysrKSB7CiAgICAgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpwU2JJbmZvU3JjVyAgPSBzYkluZm9TcmMgICsgdzsKICAgICAgVE5TX1NVQkJMT0NLX0lORk8gICAgICAgKnBTYkluZm9EZXN0VyA9IHNiSW5mb0Rlc3QgKyB3OwogICAgICBJTlQgZG9TeW5jID0gMSwgYWJzRGlmZlN1bSA9IDA7CgogICAgICAvKiBpZiBUTlMgaXMgYWN0aXZlIGluIGF0IGxlYXN0IG9uZSBjaGFubmVsLCBjaGVjayBpZiBQYXJDb3IgY29lZmZpY2llbnRzIG9mIGhpZ2hlciBmaWx0ZXIgYXJlIHNpbWlsYXIgKi8KICAgICAgaWYgKHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlIHx8IHBTYkluZm9TcmNXLT50bnNBY3RpdmUpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdEMtPm1heE9yZGVyOyBpKyspIHsKICAgICAgICAgIGFic0RpZmYgPSBGREthYnModG5zSW5mb0Rlc3QtPmNvZWZbd11bSElGSUxUXVtpXSAtIHRuc0luZm9TcmMtPmNvZWZbd11bSElGSUxUXVtpXSk7CiAgICAgICAgICBhYnNEaWZmU3VtICs9IGFic0RpZmY7CiAgICAgICAgICAvKiBpZiBjb2VmZmljaWVudHMgZGl2ZXJnZSB0b28gbXVjaCBiZXR3ZWVuIGNoYW5uZWxzLCBkbyBub3Qgc3luY2hyb25pemUgKi8KICAgICAgICAgIGlmICgoYWJzRGlmZiA+IDEpIHx8IChhYnNEaWZmU3VtID4gMikpIHsKICAgICAgICAgICAgZG9TeW5jID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoZG9TeW5jKSB7CiAgICAgICAgICAgIC8qIGlmIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2Ugd2FzIGRldGVjdGVkLCBzeW5jaHJvbml6ZSBjb2VmZmljaWVudCBzZXRzICovCiAgICAgICAgICAgIGlmIChwU2JJbmZvU3JjVy0+dG5zQWN0aXZlKSB7CiAgICAgICAgICAgICAgLyogbm8gZGVzdCBmaWx0ZXIsIG9yIG1vcmUgZGVzdCB0aGFuIHNvdXJjZSBmaWx0ZXJzOiB1c2Ugb25lIGRlc3QgZmlsdGVyICovCiAgICAgICAgICAgICAgaWYgKCghcFNiSW5mb0Rlc3RXLT50bnNBY3RpdmUpIHx8CiAgICAgICAgICAgICAgICAgICgocFNiSW5mb0Rlc3RXLT50bnNBY3RpdmUpICYmICh0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID4gdG5zSW5mb1NyYy0+bnVtT2ZGaWx0ZXJzW3ddKSkpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcFNiSW5mb0Rlc3RXLT50bnNBY3RpdmUgPSB0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID0gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdG5zRGF0YURlc3QtPmZpbHRlcnNNZXJnZWQgPSB0bnNEYXRhU3JjLT5maWx0ZXJzTWVyZ2VkOwogICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5vcmRlciAgICAgICBbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPm9yZGVyICAgICAgIFt3XVtISUZJTFRdOwogICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5sZW5ndGggICAgICBbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPmxlbmd0aCAgICAgIFt3XVtISUZJTFRdOwogICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5kaXJlY3Rpb24gICBbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPmRpcmVjdGlvbiAgIFt3XVtISUZJTFRdOwogICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5jb2VmQ29tcHJlc3Nbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPmNvZWZDb21wcmVzc1t3XVtISUZJTFRdOwoKICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdEMtPm1heE9yZGVyOyBpKyspIHsKICAgICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5jb2VmW3ddW0hJRklMVF1baV0gPSB0bnNJbmZvU3JjLT5jb2VmW3ddW0hJRklMVF1baV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZSA9IHRuc0luZm9EZXN0LT5udW1PZkZpbHRlcnNbd10gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICAgICBGREthYWNFbmNfVG5zRW5jb2RlCgogIHBlcmZvcm0gVE5TIGVuY29kaW5nCgogIFxwYXJhbSBwb2ludGVyIHRvIFROUyBpbmZvIHN0cnVjdHVyZQogIFxwYXJhbSBwb2ludGVyIHRvIFROUyBkYXRhIHN0cnVjdHVyZQogIFxwYXJhbSBudW1iZXIgb2Ygc2ZicwogIFxwYXJhbSBwb2ludGVyIHRvIFROUyBjb25maWcgc3RydWN0dXJlCiAgXHBhcmFtIGxvdy1wYXNzIGxpbmUKICBccGFyYW0gcG9pbnRlciB0byBzcGVjdHJ1bQogIFxwYXJhbSBudW1iZXIgb2Ygc3ViLWJsb2NrCiAgXHBhcmFtIGJsb2NrIHR5cGUKCiAgXHJldHVybiBFUlJPUiBTVEFUVVMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSU5UIEZES2FhY0VuY19UbnNFbmNvZGUoCiAgICAgICAgVE5TX0lORk8qIHRuc0luZm8sCiAgICAgICAgVE5TX0RBVEEqIHRuc0RhdGEsCiAgICAgICAgY29uc3QgSU5UIG51bU9mU2ZiLAogICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDLAogICAgICAgIGNvbnN0IElOVCBsb3dQYXNzTGluZSwKICAgICAgICBGSVhQX0RCTCogc3BlY3RydW0sCiAgICAgICAgY29uc3QgSU5UIHN1YkJsb2NrTnVtYmVyLAogICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGUKICAgICAgICApCnsKICAgIElOVCBpLCBzdGFydExpbmUsIHN0b3BMaW5lOwoKICAgIGlmICggKCAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgJiYgKCF0bnNEYXRhLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0udG5zQWN0aXZlKSApCiAgICAgIHx8ICggKGJsb2NrVHlwZSAhPSBTSE9SVF9XSU5ET1cpICYmICghdG5zRGF0YS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUpICkgKQogICAgewogICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBzdGFydExpbmUgPSAodG5zRGF0YS0+ZmlsdGVyc01lcmdlZCkgPyB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0gOiB0Qy0+bHBjU3RhcnRMaW5lW0hJRklMVF07CiAgICBzdG9wTGluZSAgPSB0Qy0+bHBjU3RvcExpbmU7CgogICAgZm9yIChpPTA7IGk8dG5zSW5mby0+bnVtT2ZGaWx0ZXJzW3N1YkJsb2NrTnVtYmVyXTsgaSsrKSB7CgogICAgICAgIElOVCBscGNHYWluRmFjdG9yOwogICAgICAgIEZJWFBfREJMIExwY0NvZWZmW1ROU19NQVhfT1JERVJdOwogICAgICAgIEZJWFBfREJMIHdvcmtCdWZmZXJbVE5TX01BWF9PUkRFUl07CiAgICAgICAgRklYUF9EQkwgcGFyY29yX3RtcFtUTlNfTUFYX09SREVSXTsKCiAgICAgICAgRkRLYWFjRW5jX0luZGV4MlBhcmNvcigKICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW2ldLAogICAgICAgICAgICAgICAgcGFyY29yX3RtcCwKICAgICAgICAgICAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXVtpXSwKICAgICAgICAgICAgICAgIHRDLT5jb2VmUmVzKTsKCiAgICAgICAgbHBjR2FpbkZhY3RvciA9IEZES2FhY0VuY19QYXJjb3JUb0xwYygKICAgICAgICAgICAgICAgIHBhcmNvcl90bXAsCiAgICAgICAgICAgICAgICBMcGNDb2VmZiwKICAgICAgICAgICAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXVtpXSwKICAgICAgICAgICAgICAgIHdvcmtCdWZmZXIpOwoKICAgICAgICBGREthYWNFbmNfQW5hbHlzaXNGaWx0ZXIoCiAgICAgICAgICAgICAgICAmc3BlY3RydW1bc3RhcnRMaW5lXSwKICAgICAgICAgICAgICAgIHN0b3BMaW5lIC0gc3RhcnRMaW5lLAogICAgICAgICAgICAgICAgTHBjQ29lZmYsCiAgICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1baV0sCiAgICAgICAgICAgICAgICBscGNHYWluRmFjdG9yKTsKCiAgICAgICAgLyogdXBkYXRlIGZvciBzZWNvbmQgZmlsdGVyICovCiAgICAgICAgc3RhcnRMaW5lID0gdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdOwogICAgICAgIHN0b3BMaW5lICA9IHRDLT5scGNTdGFydExpbmVbSElGSUxUXTsKICAgIH0KCiAgICByZXR1cm4oMCk7Cgp9CgpzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KAogICAgICAgIEZJWFBfREJMICp3aW4sCiAgICAgICAgY29uc3QgaW50IHdpblNpemUsCiAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKICAgICAgICBjb25zdCBJTlQgdHJhbnNmb3JtUmVzb2x1dGlvbiwKICAgICAgICBjb25zdCBGSVhQX0RCTCB0aW1lUmVzb2x1dGlvbiwKICAgICAgICBjb25zdCBJTlQgdGltZVJlc29sdXRpb25fZQogICAgICAgICkKewogICNkZWZpbmUgUElfRSAgICAgICAgICAgKDIpCiAgI2RlZmluZSBQSV9NICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzLjE0MTZmLyhmbG9hdCkoMTw8UElfRSkpCgogICNkZWZpbmUgRVVMRVJfRSAgICAgICAgKDIpCiAgI2RlZmluZSBFVUxFUl9NICAgICAgICBGTDJGWENPTlNUX0RCTCgyLjcxODMvKGZsb2F0KSgxPDxFVUxFUl9FKSkKCiAgI2RlZmluZSBDT0VGRl9MT09QX1NDQUxFICg0KQoKICBJTlQgaSwgZTEsIGUyLCBnYXVzc0V4cF9lOwogIEZJWFBfREJMIGdhdXNzRXhwX207CgogIC8qIGNhbGMuIHdpbmRvdyBleHBvbmVudCBmcm9tIHRpbWUgcmVzb2x1dGlvbjoKICAgKgogICAqICAgZ2F1c3NFeHAgPSBQSSAqIHNhbXBsaW5nUmF0ZSAqIDAuMDAxZiAqIHRpbWVSZXNvbHV0aW9uIC8gdHJhbnNmb3JtUmVzb2x1dGlvbjsKICAgKiAgIGdhdXNzRXhwID0gLTAuNWYgKiBnYXVzc0V4cCAqIGdhdXNzRXhwOwogICAqLwogIGdhdXNzRXhwX20gPSBmTXVsdE5vcm0odGltZVJlc29sdXRpb24sIGZNdWx0KFBJX00sIGZEaXZOb3JtKCAoRklYUF9EQkwpKHNhbXBsaW5nUmF0ZSksIChGSVhQX0RCTCkoTE9ORykodHJhbnNmb3JtUmVzb2x1dGlvbioxMDAwLmYpLCAmZTEpKSwgJmUyKTsKICBnYXVzc0V4cF9tID0gLWZQb3cyRGl2MihnYXVzc0V4cF9tKTsKICBnYXVzc0V4cF9lID0gMiooZTErZTIrdGltZVJlc29sdXRpb25fZStQSV9FKTsKCiAgRkRLX0FTU0VSVCggd2luU2l6ZSA8ICgxPDxDT0VGRl9MT09QX1NDQUxFKSApOwoKICAvKiBjYWxjLiB3aW5kb3cgY29lZmZpY2llbnRzCiAgICogICB3aW5baV0gPSAoZmxvYXQpZXhwKCBnYXVzc0V4cCAqIChpKzAuNSkgKiAoaSswLjUpICk7CiAgICovCiAgZm9yKCBpPTA7IGk8d2luU2l6ZTsgaSsrKSB7CgogICAgd2luW2ldID0gZlBvdygKICAgICAgICAgICAgRVVMRVJfTSwKICAgICAgICAgICAgRVVMRVJfRSwKICAgICAgICAgICAgZk11bHQoZ2F1c3NFeHBfbSwgZlBvdzIoKGkqRkwyRlhDT05TVF9EQkwoMS5mLyhmbG9hdCkoMTw8Q09FRkZfTE9PUF9TQ0FMRSkpICsgRkwyRlhDT05TVF9EQkwoLjVmLyhmbG9hdCkoMTw8Q09FRkZfTE9PUF9TQ0FMRSkpKSkpLAogICAgICAgICAgICBnYXVzc0V4cF9lICsgMipDT0VGRl9MT09QX1NDQUxFLAogICAgICAgICAgICZlMSk7CgogICAgd2luW2ldID0gc2NhbGVWYWx1ZVNhdHVyYXRlKHdpbltpXSwgZTEpOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQogIFxicmllZiAgICAgRkRLYWFjRW5jX0F1dG9Ub1BhcmNvcgoKICBjb252ZXJzaW9uIGF1dG9jb3JyZWxhdGlvbiB0byByZWZsZWN0aW9uIGNvZWZmaWNpZW50cwoKICBccGFyYW0gcG9pbnRlciB0byBpbnB1dCAoYWNmKQogIFxwYXJhbSBwb2ludGVyIHRvIG91dHB1dCAocmVmbGVjdGlvbiBjb2VmZmljaWVudHMpCiAgXHBhcmFtIG51bWJlciBvZiBjb2VmZmljaWVudHMKCiAgXHJldHVybiBwcmVkaWN0aW9uIGdhaW4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVCBGREthYWNFbmNfQXV0b1RvUGFyY29yKAogICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBpbnB1dCwKICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcmVmbENvZWZmLAogICAgICAgIGNvbnN0IElOVCBudW1PZkNvZWZmCiAgICAgICAgKQp7CiAgSU5UICAgICAgIGksIGosIHNjYWxlPTA7CiAgRklYUF9EQkwgIHRtcCwgcGFyY29yV29ya0J1ZmZlcltUTlNfTUFYX09SREVSXTsKICBJTlQgICAgICAgcHJlZGljdGlvbkdhaW4gPSAoSU5UKShUTlNfUFJFREdBSU5fU0NBTEUpOwoKICBGSVhQX0RCTCAqUkVTVFJJQ1Qgd29ya0J1ZmZlciA9IHBhcmNvcldvcmtCdWZmZXI7CiAgY29uc3QgRklYUF9EQkwgIGF1dG9Db3JyXzAgPSBpbnB1dFswXTsKCiAgaWYoKEZJWFBfREJMKWlucHV0WzBdID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKICAgIEZES21lbWNsZWFyKHJlZmxDb2VmZixudW1PZkNvZWZmKnNpemVvZihGSVhQX0RCTCkpOwogICAgcmV0dXJuKHByZWRpY3Rpb25HYWluKTsKICB9CgogIEZES21lbWNweSh3b3JrQnVmZmVyLCZpbnB1dFsxXSxudW1PZkNvZWZmKnNpemVvZihGSVhQX0RCTCkpOwogIGZvcihpPTA7IGk8bnVtT2ZDb2VmZjsgaSsrKSB7CiAgICBMT05HIHNpZ24gPSAoKExPTkcpd29ya0J1ZmZlclswXSA+PiAoREZSQUNUX0JJVFMtMSkpOwogICAgdG1wID0gKEZJWFBfREJMKSgoTE9ORyl3b3JrQnVmZmVyWzBdXnNpZ24pOwoKICAgIGlmKGlucHV0WzBdPHRtcCkKICAgICAgYnJlYWs7CgogICAgdG1wID0gKEZJWFBfREJMKSgoTE9ORylzY2h1cl9kaXYodG1wLCBpbnB1dFswXSwgRlJBQ1RfQklUUyleKH5zaWduKSk7CiAgICByZWZsQ29lZmZbaV0gPSB0bXA7CgogICAgZm9yKGo9bnVtT2ZDb2VmZi1pLTE7IGo+PTA7IGotLSkgewogICAgICBGSVhQX0RCTCBhY2N1MSA9IGZNdWx0KHRtcCwgaW5wdXRbal0pOwogICAgICBGSVhQX0RCTCBhY2N1MiA9IGZNdWx0KHRtcCwgd29ya0J1ZmZlcltqXSk7CiAgICAgIHdvcmtCdWZmZXJbal0gKz0gYWNjdTE7CiAgICAgIGlucHV0W2pdICs9IGFjY3UyOwogICAgfQoKICAgIHdvcmtCdWZmZXIrKzsKICB9CgogIHRtcCA9IGZNdWx0KChGSVhQX0RCTCkoKExPTkcpVE5TX1BSRURHQUlOX1NDQUxFPDwyMSksIGZEaXZOb3JtKGZBYnMoYXV0b0NvcnJfMCksIGZBYnMoaW5wdXRbMF0pLCAmc2NhbGUpKTsKICBpZiAoIGZNdWx0RGl2MihhdXRvQ29ycl8wLCBpbnB1dFswXSk8RkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CiAgICB0bXAgPSAtdG1wOwogIH0KICBwcmVkaWN0aW9uR2FpbiA9IChMT05HKXNjYWxlVmFsdWUodG1wLHNjYWxlLTIxKTsKCiAgcmV0dXJuIChwcmVkaWN0aW9uR2Fpbik7Cn0KCgpzdGF0aWMgSU5UIEZES2FhY0VuY19TZWFyY2gzKEZJWFBfREJMIHBhcmNvcikKewogIElOVCBpLCBpbmRleD0wOwoKICBmb3IoaT0wO2k8ODtpKyspewogICAgaWYocGFyY29yID4gRkRLYWFjRW5jX3Ruc0NvZWZmM0JvcmRlcnNbaV0pCiAgICAgIGluZGV4PWk7CiAgfQogIHJldHVybihpbmRleC00KTsKfQoKc3RhdGljIElOVCBGREthYWNFbmNfU2VhcmNoNChGSVhQX0RCTCBwYXJjb3IpCnsKICBJTlQgaSwgaW5kZXg9MDsKCiAgZm9yKGk9MDtpPDE2O2krKyl7CiAgICBpZihwYXJjb3IgPiBGREthYWNFbmNfdG5zQ29lZmY0Qm9yZGVyc1tpXSkKICAgICAgaW5kZXg9aTsKICB9CiAgcmV0dXJuKGluZGV4LTgpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUGFyY29yMkluZGV4CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX1BhcmNvcjJJbmRleCgKICAgICAgICBjb25zdCBGSVhQX0RCTCAqcGFyY29yLAogICAgICAgIElOVCAqUkVTVFJJQ1QgaW5kZXgsCiAgICAgICAgY29uc3QgSU5UIG9yZGVyLAogICAgICAgIGNvbnN0IElOVCBiaXRzUGVyQ29lZmYKICAgICAgICApCnsKICBJTlQgaTsKICBmb3IoaT0wOyBpPG9yZGVyOyBpKyspIHsKICAgIGlmKGJpdHNQZXJDb2VmZiA9PSAzKQogICAgICBpbmRleFtpXSA9IEZES2FhY0VuY19TZWFyY2gzKHBhcmNvcltpXSk7CiAgICBlbHNlCiAgICAgIGluZGV4W2ldID0gRkRLYWFjRW5jX1NlYXJjaDQocGFyY29yW2ldKTsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19JbmRleDJQYXJjb3IKICAgIGRlc2NyaXB0aW9uOiAgaW52ZXJzZSBxdWFudGl6YXRpb24gZm9yIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCiAgICByZXR1cm5zOiAgICAgIC0KICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHZhbHVlcywgcHRyLiB0byByZWZsZWN0aW9uIGNvZWZmaWNpZW50cywKICAgICAgICAgICAgICAgICAgbm8uIG9mIGNvZWZmaWNpZW50cywgcmVzb2x1dGlvbgogICAgb3V0cHV0OiAgICAgICByZWZsZWN0aW9uIGNvZWZmaWNpZW50cwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19JbmRleDJQYXJjb3IoCiAgICAgICAgY29uc3QgSU5UICppbmRleCwKICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcGFyY29yLAogICAgICAgIGNvbnN0IElOVCBvcmRlciwKICAgICAgICBjb25zdCBJTlQgYml0c1BlckNvZWZmCiAgICAgICAgKQp7CiAgSU5UIGk7CiAgZm9yKGk9MDsgaTxvcmRlcjsgaSsrKQogICAgcGFyY29yW2ldID0gYml0c1BlckNvZWZmID09IDQgPyBGREthYWNFbmNfdG5zRW5jQ29lZmY0W2luZGV4W2ldKzhdIDogRkRLYWFjRW5jX3Ruc0VuY0NvZWZmM1tpbmRleFtpXSs0XTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1BhcmNvclRvTHBjCiAgICBkZXNjcmlwdGlvbjogIGNvbnZlcnNpb24gcmVmbGVjdGlvbiBjb2VmZmljaWVudHMgdG8gTFBDIGNvZWZmaWNpZW50cwogICAgcmV0dXJuczogICAgICBHYWluIGZhY3RvcgogICAgaW5wdXQ6ICAgICAgICByZWZsZWN0aW9uIGNvZWZmaWNpZW50cywgbm8uIG9mIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzIDxvcmRlcj4sCiAgICAgICAgICAgICAgICAgIHB0ci4gdG8gd29yayBidWZmZXIgKHJlcXVpcmVkIHNpemU6IG9yZGVyKQogICAgb3V0cHV0OiAgICAgICA8b3JkZXI+IExQQyBjb2VmZmljaWVudHMKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIEZES2FhY0VuY19QYXJjb3JUb0xwYygKICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVmbENvZWZmLAogICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBMcGNDb2VmZiwKICAgICAgICBjb25zdCBJTlQgbnVtT2ZDb2VmZiwKICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgd29ya0J1ZmZlcgogICAgICAgICkKewogIElOVCBpLCBqOwogIElOVCBzaGlmdHZhbCwgcGFyMkxwY1NoaWZ0VmFsID0gNjsgIC8qIDYgc2hvdWxkIGJlIGVub3VnaCwgYmVjLiBtYXgobnVtT2ZDb2VmZikgPSAyMCAqLwogIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICBMcGNDb2VmZlswXSA9IHJlZmxDb2VmZlswXSA+PiBwYXIyTHBjU2hpZnRWYWw7CiAgZm9yKGk9MTsgaTxudW1PZkNvZWZmOyBpKyspIHsKICAgIGZvcihqPTA7IGo8aTsgaisrKSB7CiAgICAgICAgd29ya0J1ZmZlcltqXSA9IExwY0NvZWZmW2ktMS1qXTsKICAgIH0KCiAgICBmb3Ioaj0wOyBqPGk7IGorKykgewogICAgICAgIExwY0NvZWZmW2pdICs9IGZNdWx0KHJlZmxDb2VmZltpXSx3b3JrQnVmZmVyW2pdKTsKICAgIH0KCiAgICBMcGNDb2VmZltpXSA9IHJlZmxDb2VmZltpXSA+PiBwYXIyTHBjU2hpZnRWYWw7CiAgfQoKICAvKiBub3JtYWxpemUgTHBjQ29lZmYgYW5kIGNhbGMgc2hpZnRmYWN0b3IgKi8KICBmb3IoaT0wOyBpPG51bU9mQ29lZmY7IGkrKykgewogICAgICBtYXhWYWwgPSBmaXhNYXgobWF4VmFsLChGSVhQX0RCTClmaXhwX2FicyhMcGNDb2VmZltpXSkpOwogIH0KCiAgc2hpZnR2YWwgPSBDb3VudExlYWRpbmdCaXRzKG1heFZhbCk7CiAgc2hpZnR2YWwgPSAoc2hpZnR2YWw+PXBhcjJMcGNTaGlmdFZhbCkgPyBwYXIyTHBjU2hpZnRWYWwgOiBzaGlmdHZhbDsKCiAgZm9yKGk9MDsgaTxudW1PZkNvZWZmOyBpKyspCiAgICAgIExwY0NvZWZmW2ldID0gTHBjQ29lZmZbaV08PHNoaWZ0dmFsOwoKICByZXR1cm4gKHBhcjJMcGNTaGlmdFZhbCAtIHNoaWZ0dmFsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICAgICBGREthYWNFbmNfQW5hbHlzaXNGaWx0ZXIKCiAgVE5TIGFuYWx5c2lzIGZpbHRlciAoYWxsLXplcm8gZmlsdGVyKQoKICBccGFyYW0gcG9pbnRlciB0byBzaWduYWwgc3BlY3RydW0KICBccGFyYW0gbnVtYmVyIG9mIGxpbmVzCiAgXHBhcmFtIHBvaW50ZXIgdG8gbHBjIGNvZWZmaWNpZW50cwogIFxwYXJhbSBmaWx0ZXIgb3JkZXIKICBccGFyYW0gbHBjIGdhaW4gZmFjdG9yCgogIFxyZXR1cm4gdm9pZAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBOb3RlOiBpbi1wbGFjZSBjb21wdXRhdGlvbiBwb3NzaWJsZSAqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfQW5hbHlzaXNGaWx0ZXIoCiAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNpZ25hbCwKICAgICAgICBjb25zdCBJTlQgbnVtT2ZMaW5lcywKICAgICAgICBjb25zdCBGSVhQX0RCTCAqcHJlZGljdG9yQ29lZmYsCiAgICAgICAgY29uc3QgSU5UIG9yZGVyLAogICAgICAgIGNvbnN0IElOVCBscGNHYWluRmFjdG9yCiAgICAgICAgKQp7CiAgRklYUF9EQkwgc3RhdHVzVmFyW1ROU19NQVhfT1JERVJdOwogIElOVCBpLCBqOwogIGNvbnN0IElOVCBzaGlmdCA9IGxwY0dhaW5GYWN0b3IgKyAxOyAgICAgIC8qICsxLCBiZWNhdXNlIGZNdWx0RGl2MiAqLwogIEZJWFBfREJMIHRtcDsKCiAgaWYgKG9yZGVyPjApIHsKCiAgICBJTlQgaWR4ID0gMDsKCiAgICAvKiBrZWVwIGZpbHRlciBjb2VmZmljaWVudHMgdHdpY2UgYW5kIHNhdmUgbWVtb3J5IGNvcHkgb3BlcmF0aW9uIGluCiAgICAgICBtb2R1bG8gc3RhdGUgYnVmZmVyICovCiNpZiBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYpCiAgICBGSVhQX1NHTCAgY29lZmZbMipUTlNfTUFYX09SREVSXTsKICAgIGNvbnN0IEZJWFBfU0dMICpwQ29lZmY7CiAgICBmb3IoaT0wO2k8b3JkZXI7aSsrKSB7CiAgICAgIGNvZWZmW2ldICAgICAgID0gRlhfREJMMkZYX1NHTChwcmVkaWN0b3JDb2VmZltpXSk7CiAgICB9CiAgICBGREttZW1jcHkoJmNvZWZmW29yZGVyXSwgY29lZmYsIG9yZGVyKnNpemVvZihGSVhQX1NHTCkpOwojZWxzZQogICAgRklYUF9EQkwgIGNvZWZmWzIqVE5TX01BWF9PUkRFUl07CiAgICBjb25zdCBGSVhQX0RCTCAqcENvZWZmOwogICAgRkRLbWVtY3B5KCZjb2VmZlswXSwgICAgIHByZWRpY3RvckNvZWZmLCBvcmRlcipzaXplb2YoRklYUF9EQkwpKTsKICAgIEZES21lbWNweSgmY29lZmZbb3JkZXJdLCBwcmVkaWN0b3JDb2VmZiwgb3JkZXIqc2l6ZW9mKEZJWFBfREJMKSk7CiNlbmRpZgogICAgRkRLbWVtY2xlYXIoc3RhdHVzVmFyLCBvcmRlcipzaXplb2YoRklYUF9EQkwpKTsKCiAgICBmb3Ioaj0wOyBqPG51bU9mTGluZXM7IGorKykgewogICAgICBwQ29lZmYgPSAmY29lZmZbKG9yZGVyLWlkeCldOwogICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwKTsKICAgICAgZm9yKGk9MDsgaTxvcmRlcjsgaSsrKSB7CiAgICAgICAgICB0bXAgPSBmTXVsdEFkZERpdjIodG1wLCBwQ29lZmZbaV0sIHN0YXR1c1ZhcltpXSkgOwogICAgICB9CgogICAgICBpZigtLWlkeDwwKSB7IGlkeCA9IG9yZGVyLTE7IH0KICAgICAgc3RhdHVzVmFyW2lkeF0gPSBzaWduYWxbal07CgogICAgICBGREtfQVNTRVJUKGxwY0dhaW5GYWN0b3I+PTApOwogICAgICBzaWduYWxbal0gPSAodG1wPDxzaGlmdCkgKyBzaWduYWxbal07CiAgICB9CiAgfQp9CgoK