Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgogICAgY29udGVudHMvZGVzY3JpcHRpb246IFRocmVzaG9sZCBjb21wZW5zYXRpb24KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJjb21tb25fZml4LmgiCgojaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCiNpbmNsdWRlICJhZGpfdGhyLmgiCiNpbmNsdWRlICJxY19kYXRhLmgiCiNpbmNsdWRlICJzZl9lc3RpbS5oIgojaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgoKCgoKI2RlZmluZSBJTlZfSU5UX1RBQl9TSVpFICAoOCkKc3RhdGljIGNvbnN0IEZJWFBfREJMIGludkludFtJTlZfSU5UX1RBQl9TSVpFXSA9CnsKICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDQwMDAwMDAwLCAweDJhYWFhYWFhLCAweDIwMDAwMDAwLCAweDE5OTk5OTk5LCAweDE1NTU1NTU1LCAweDEyNDkyNDkyCn07CgoKI2RlZmluZSBJTlZfU1FSVDRfVEFCX1NJWkUgICg4KQpzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52U3FydDRbSU5WX1NRUlQ0X1RBQl9TSVpFXSA9CnsKICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDZiYTI3ZTY1LCAweDYxNDI0YmI1LCAweDVhODI3OTk5LCAweDU1OTk0ODQ1LCAweDUxYzhlMzNjLCAweDRlYjE2MGQxCn07CgoKLypzdGF0aWMgY29uc3QgSU5UICAgICAgaW52UmVkRXhwID0gNDsqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluMSA9IChGSVhQX0RCTCkweGZjYWQwZGRmOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjMxNikvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluMiA9IChGSVhQX0RCTCkweDAzNTFlMWEyOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygzLjE2KSAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkRmFjICA9IChGSVhQX0RCTCkweGZmNWIyYzNlOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjgpICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwoKc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjMgPSAoRklYUF9EQkwpMHhmZTAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC41KSAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8Kc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjQgPSAoRklYUF9EQkwpMHgwMjAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMi4wKSAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8Kc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjUgPSAoRklYUF9EQkwpMHhmYzAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC4yNSkgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KCgovKgpUaGUgYml0czJQZSBmYWN0b3JzIGFyZSBjaG9vc2VuIGZvciB0aGUgY2FzZSB0aGF0IHNvbWUgdGltZXMKdGhlIGNyYXNoIHJlY292ZXJ5IHN0cmF0ZWd5IHdpbGwgYmUgYWN0aXZhdGVkIG9uY2UuCiovCgp0eXBlZGVmIHN0cnVjdCB7CiAgSU5UICAgICAgICAgICAgICAgICBiaXRyYXRlOwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vOwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vX3Nsb3BlOwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW87CiAgVUxPTkcgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX3N0ZXJlb19zbG9wZTsKICBVTE9ORyAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbW9ub19zY2ZPcHQ7CiAgVUxPTkcgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0X3Nsb3BlOwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0OwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0X3Nsb3BlOwoKfSBCSVRfUEVfU0ZBQzsKCnR5cGVkZWYgc3RydWN0IHsKICBjb25zdCBJTlQgICAgICAgICAgIHNhbXBsZVJhdGU7CiAgY29uc3QgQklUX1BFX1NGQUMgKiBwUGVUYWI7CiAgY29uc3QgSU5UICAgICAgICAgICBuRW50cmllczsKCn0gQklUUzJQRV9DRkdfVEFCOwoKc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjE2MDAwW10gPSB7CiAgeyAxMDAwMCwgMHgyMjhGNUMyOSwgMHgwMkZFRjU1RCwgMHgxRDcwQTNENywgMHgwOUJDOUQ2RCwgMHgyMjhGNUMyOSwgMHgwMkZFRjU1RCwgMHgxQzI4RjVDMywgMHgwQ0JCOTJDQX0sCiAgeyAyNDAwMCwgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxMywgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxM30sCiAgeyAzMjAwMCwgMHgyNDdBRTE0OCwgMHgxMUIxRDkyQiwgMHgyMzg1MUVCOCwgMHgwMUY3NTEwNSwgMHgyNDdBRTE0OCwgMHgxMTBBMTM3RiwgMHgyMzg1MUVCOCwgMHgwMUY3NTEwNX0sCiAgeyA0ODAwMCwgMHgyRDFFQjg1MiwgMHg2ODMzQzYwMCwgMHgyNDdBRTE0OCwgMHgwMTRGOEI1OSwgMHgyQ0NDQ0NDRCwgMHg2OERCOEJBQywgMHgyNDdBRTE0OCwgMHgwMUY3NTEwNX0sCiAgeyA2NDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTFFQjg1MiwgMHgxNTRDOTg1RiwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTcwQTNENywgMHgxNTRDOTg1Rn0sCiAgeyA5NjAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzOUVCODUxRiwgMHgwODg1MDlDMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzQTNENzBBNCwgMHgwODg1MDlDMH0sCiAgezEyODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MjNENzBBNCwgMHgxOEE0M0JCNCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MjhGNUMyOSwgMHgxODFFMDNGN30sCiAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1MTQ3QUUxNCwgMHgwMDAwMDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1MTQ3QUUxNCwgMHgwMDAwMDAwMH0KfTsKCnN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIyMjA1MFtdID0gewogIHsgMTYwMDAsIDB4MWE4ZjVjMjksIDB4MTc5N2NjM2EsIDB4MTI4ZjVjMjksIDB4MThlNzU3OTMsIDB4MTc1YzI4ZjYsIDB4MjIxNDI2ZmUsIDB4MDAwMDAwMDAsIDB4NWE3MDhlZGV9LAogIHsgMjQwMDAsIDB4MjA1MWViODUsIDB4MDkyY2NmNmMsIDB4MThhM2Q3MGEsIDB4MTNhOTJhMzAsIDB4MWZhZTE0N2IsIDB4YmNiZTYxZCwgIDB4MTYxNDdhZTEsIDB4MThlNzU3OTN9LAogIHsgMzIwMDAsIDB4MjI4ZjVjMjksIDB4MDI5ZjE2YjEsIDB4MWQ3MGEzZDcsIDB4MDg4NTA5YzAsIDB4MjI4ZjVjMjksIDB4MjlmMTZiMSwgIDB4MWMyOGY1YzMsIDB4MGIyNDIwNzF9LAogIHsgNDgwMDAsIDB4MjNkNzBhM2QsIDB4MDE0ZjhiNTksIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGEsIDB4MjNkNzBhM2QsIDB4MTRmOGI1OSwgIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGF9LAogIHsgNjQwMDAsIDB4MjQ3YWUxNDgsIDB4MDhkOGVjOTYsIDB4MjM4NTFlYjgsIDB4MDBmYmE4ODIsIDB4MjQ3YWUxNDgsIDB4ODg1MDljMCwgIDB4MjM4NTFlYjgsIDB4MDBmYmE4ODJ9LAogIHsgOTYwMDAsIDB4MmQxZWI4NTIsIDB4MzQxOWUzMDAsIDB4MjQ3YWUxNDgsIDB4MDBhN2M1YWMsIDB4MmNjY2NjY2QsIDB4MzQ2ZGM1ZDYsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODJ9LAogIHsxMjgwMDAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjUxZWI4NTIsIDB4MDI5ZjE2YjEsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjU3MGEzZDcsIDB4MDA5ZjE2YjF9LAogIHsxNDgwMDAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjZiODUxZWMsIDB4MDAwMDAwMDAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjcwYTNkNzEsIDB4MDAwMDAwMDB9Cn07CgpzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiMjQwMDBbXSA9IHsKICB7IDE2MDAwLCAweDE5ZWI4NTFmLCAweDEzYTkyYTMwLCAweDExNDdhZTE0LCAweDE2NDg0MGUxLCAweDE5OTk5OTlhLCAweDEyNTk5ZWQ4LCAweDAwMDAwMDAwLCAweDQ2Yzc2NGFlfSwKICB7IDI0MDAwLCAweDFlYjg1MWVjLCAweDBkMWI3MTc2LCAweDE2Yjg1MWVjLCAweDE4ZTc1NzkzLCAweDFlMTQ3YWUxLCAweDBmYmE4ODI3LCAweDExNDdhZTE0LCAweDJjOTA4MWMzfSwKICB7IDMyMDAwLCAweDIxZWI4NTFmLCAweDA0OTY2N2I2LCAweDFjY2NjY2NkLCAweDA3MzU3ZTY3LCAweDIxZWI4NTFmLCAweDAzZWVhMjBhLCAweDFjMjhmNWMzLCAweDA3MzU3ZTY3fSwKICB7IDQ4MDAwLCAweDI0MjhmNWMzLCAweDAxNGY4YjU5LCAweDIwNTFlYjg1LCAweDA1M2UyZDYyLCAweDIzZDcwYTNkLCAweDAxZjc1MTA1LCAweDFmYWUxNDdiLCAweDA3MzU3ZTY3fSwKICB7IDY0MDAwLCAweDI0Y2NjY2NkLCAweDA1ZTVmMzBlLCAweDIyZTE0N2FlLCAweDAxYTM2ZTJmLCAweDI0Y2NjY2NkLCAweDA1ZTVmMzBlLCAweDIzMzMzMzMzLCAweDAxNGY4YjU5fSwKICB7IDk2MDAwLCAweDJhOGY1YzI5LCAweDI0YjMzZGIwLCAweDI0N2FlMTQ4LCAweDAwZmJhODgyLCAweDJhOGY1YzI5LCAweDI2ZmU3MThiLCAweDI0N2FlMTQ4LCAweDAwZmJhODgyfSwKICB7MTI4MDAwLCAweDRlNjY2NjY2LCAweDFjZDVmOTljLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhLCAweDUwYTNkNzBhLCAweDE5MmE3MzcxLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhfSwKICB7MTQ4MDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI2MTQ3YWUxLCAweDAwMDAwMDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI2MTQ3YWUxLCAweDAwMDAwMDAwfQp9OwoKc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjMyMDAwW10gPSB7CiAgeyAxNjAwMCwgMHgxMTk5OTk5YSwgMHgyMGM0OWJhNiwgMHgwMDAwMDAwMCwgMHg0NTc3ZDk1NSwgMHgwMDAwMDAwMCwgMHg2MGZlNDc5OSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCiAgeyAyNDAwMCwgMHgxOTk5OTk5YSwgMHgwZmJhODgyNywgMHgxMGY1YzI4ZiwgMHgxYjg2NmU0NCwgMHgxN2FlMTQ3YiwgMHgwZmJhODgyNywgMHgwMDAwMDAwMCwgMHg0ZDU1MWQ2OX0sCiAgeyAzMjAwMCwgMHgxZDcwYTNkNywgMHgwNzM1N2U2NywgMHgxN2FlMTQ3YiwgMHgwOWQ0OTUxOCwgMHgxYjg1MWViOCwgMHgwYTdjNWFjNCwgMHgxMmUxNDdhZSwgMHgxMTBhMTM3Zn0sCiAgeyA0ODAwMCwgMHgyMGY1YzI4ZiwgMHgwNDk2NjdiNiwgMHgxYzdhZTE0OCwgMHgwNTNlMmQ2MiwgMHgyMGEzZDcwYSwgMHgwNTNlMmQ2MiwgMHgxYjMzMzMzMywgMHgwNWU1ZjMwZX0sCiAgeyA2NDAwMCwgMHgyMzMzMzMzMywgMHgwMjlmMTZiMSwgMHgxZjBhM2Q3MSwgMHgwMmYyZjk4NywgMHgyMzMzMzMzMywgMHgwMjlmMTZiMSwgMHgxZTE0N2FlMSwgMHgwM2VlYTIwYX0sCiAgeyA5NjAwMCwgMHgyNWMyOGY1YywgMHgyYzNjOWVlZCwgMHgyMWViODUxZiwgMHgwMWY3NTEwNSwgMHgyNWMyOGY1YywgMHgwYTdjNWFjNCwgMHgyMWViODUxZiwgMHgwMWEzNmUyZn0sCiAgezEyODAwMCwgMHg1MGY1YzI4ZiwgMHgxOGE0M2JiNCwgMHgyM2Q3MGEzZCwgMHgwMTBjNmY3YSwgMHgzMDAwMDAwMCwgMHgxNjhiNWNjMCwgMHgyMzg1MWViOCwgMHgwMTkyYTczN30sCiAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNDdhZTE0OCwgMHgwMGRmYjIzYiwgMHgzZGMyOGY1YywgMHgzMDBmNGFhZiwgMHgyNDdhZTE0OCwgMHgwMWJmNjQ3Nn0sCiAgezE2MDAwMCwgMHg2MDAwMDAwMCwgMHhiMTViNTc0MCwgMHgyNGNjY2NjZCwgMHgwNTNlMmQ2MiwgMHg0ZjVjMjhmNiwgMHhiZWZkMDA3MiwgMHgyNTFlYjg1MiwgMHgwNGZiMTE4NH0sCiAgezIwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyYjMzMzMzMywgMHgwODM2YmU5MSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyYjMzMzMzMywgMHgwODkwMzkwZn0sCiAgezMyMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0OTQ3YWUxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0YThmNWMyOSwgMHgwMDAwMDAwMH0KfTsKCnN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWI0NDEwMFtdID0gewogIHsgMTYwMDAsIDB4MTBhM2Q3MGEsIDB4MTc5N2NjM2EsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTkyMTAzODYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAogIHsgMjQwMDAsIDB4MTY2NjY2NjYsIDB4MTc5N2NjM2EsIDB4MDAwMDAwMDAsIDB4NjM5ZDVlNGEsIDB4MTVjMjhmNWMsIDB4MTI1OTllZDgsIDB4MDAwMDAwMDAsIDB4NWJjMDFhMzd9LAogIHsgMzIwMDAsIDB4MWMyOGY1YzMsIDB4MDQ5NjY3YjYsIDB4MTg1MWViODUsIDB4MDQ5NjY3YjYsIDB4MWEzZDcwYTQsIDB4MDg4NTA5YzAsIDB4MTY2NjY2NjYsIDB4MDUzZTJkNjJ9LAogIHsgNDgwMDAsIDB4MWU2NjY2NjYsIDB4MDVlNWYzMGUsIDB4MWE4ZjVjMjksIDB4MDQ5NjY3YjYsIDB4MWU2NjY2NjYsIDB4MDVlNWYzMGUsIDB4MThmNWMyOGYsIDB4MDVlNWYzMGV9LAogIHsgNjQwMDAsIDB4MjE0N2FlMTQsIDB4MDM0NmRjNWQsIDB4MWNjY2NjY2QsIDB4MDJmMmY5ODcsIDB4MjE0N2FlMTQsIDB4MDJmMmY5ODcsIDB4MWJkNzBhM2QsIDB4MDM5YWJmMzR9LAogIHsgOTYwMDAsIDB4MjQ3YWUxNDgsIDB4MDY4ZGI4YmIsIDB4MWZhZTE0N2IsIDB4MDI5ZjE2YjEsIDB4MjQyOGY1YzMsIDB4MDYzOWQ1ZTUsIDB4MWY1YzI4ZjYsIDB4MDI5ZjE2YjF9LAogIHsxMjgwMDAsIDB4MmFlMTQ3YWUsIDB4MWI0MzUyNjUsIDB4MjIzZDcwYTQsIDB4MDE5MmE3MzcsIDB4MmEzZDcwYTQsIDB4MTA0MGJmZTQsIDB4MjFlYjg1MWYsIDB4MDE5MmE3Mzd9LAogIHsxNDgwMDAsIDB4M2I4NTFlYjgsIDB4MjgzMjA2OWMsIDB4MjMzMzMzMzMsIDB4MDBkZmIyM2IsIDB4MzQyOGY1YzMsIDB4MjA1NGMyODgsIDB4MjJlMTQ3YWUsIDB4MDBkZmIyM2J9LAogIHsxNjAwMDAsIDB4NGEzZDcwYTQsIDB4YzMyZWJlNWEsIDB4MjM4NTFlYjgsIDB4MDFkNWMzMTYsIDB4NDAwMDAwMDAsIDB4Y2I5MjNhMmIsIDB4MjMzMzMzMzMsIDB4MDFkNWMzMTZ9LAogIHsyMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNWMsIDB4MDcxM2YwNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjU3MGEzZDcsIDB4MDcyYTRmMTd9LAogIHszMjAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZhZTE0N2IsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZhZTE0N2IsIDB4MDAwMDAwMDB9Cn07CgpzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiNDgwMDBbXSA9IHsKICB7IDE2MDAwLCAweDBmNWMyOGY2LCAweDMxY2VhZjI1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDc0YTc3MWM5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKICB7IDI0MDAwLCAweDFiODUxZWI4LCAweDAyOWYxNmIxLCAweDAwMDAwMDAwLCAweDY2M2M3NGZiLCAweDFjN2FlMTQ4LCAweGU0Nzk5MWJkLCAweDAwMDAwMDAwLCAweDQ5NjY3YjVmfSwKICB7IDMyMDAwLCAweDFjMjhmNWMzLCAweDAyOWYxNmIxLCAweDE4ZjVjMjhmLCAweDA3MzU3ZTY3LCAweDE1YzI4ZjVjLCAweDBmMTJjMjdhLCAweDExZWI4NTFmLCAweDEzMDE2NDg0fSwKICB7IDQ4MDAwLCAweDFkNzBhM2Q3LCAweDA1M2UyZDYyLCAweDFjN2FlMTQ4LCAweGZlMDhhZWZjLCAweDFkMWViODUyLCAweDA2OGRiOGJiLCAweDFiMzMzMzMzLCAweGZlYjA3NGE4fSwKICB7IDY0MDAwLCAweDIwMDAwMDAwLCAweDAzZWVhMjBhLCAweDFiODUxZWI4LCAweDAzNDZkYzVkLCAweDIwNTFlYjg1LCAweDAzNDZkYzVkLCAweDFhOGY1YzI5LCAweDAzOWFiZjM0fSwKICB7IDk2MDAwLCAweDIzZDcwYTNkLCAweDA1M2UyZDYyLCAweDFlYjg1MWVjLCAweDAyOWYxNmIxLCAweDIzODUxZWI4LCAweDA0ZWE0YThjLCAweDFlMTQ3YWUxLCAweDAyZjJmOTg3fSwKICB7MTI4MDAwLCAweDI4ZjVjMjhmLCAweDE0NzI3ZGNjLCAweDIxNDdhZTE0LCAweDAyMThkZWY0LCAweDI4NTFlYjg1LCAweDBlMjdlMGYwLCAweDIwZjVjMjhmLCAweDAyMThkZWY0fSwKICB7MTQ4MDAwLCAweDM1NzBhM2Q3LCAweDFjZDVmOTljLCAweDIyOGY1YzI5LCAweDAxYmY2NDc2LCAweDMwZjVjMjhmLCAweDE4Nzc3ZTc1LCAweDIyM2Q3MGE0LCAweDAxYmY2NDc2fSwKICB7MTYwMDAwLCAweDQwMDAwMDAwLCAweGNiOTIzYTJiLCAweDIzMzMzMzMzLCAweDAxOTJhNzM3LCAweDM5ZWI4NTFmLCAweGQwOGQ0YmFlLCAweDIyZTE0N2FlLCAweDAxOTJhNzM3fSwKICB7MjAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI1MWViODUyLCAweDA2Nzc1YTFiLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI0Y2NjY2NkLCAweDA2YTQxNzVhfSwKICB7MzIwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNjY2NjY2NkLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNkMWViODUyLCAweDAwMDAwMDAwfQp9OwoKc3RhdGljIGNvbnN0IEJJVFMyUEVfQ0ZHX1RBQiBiaXRzMlBlQ29uZmlnVGFiW10gPSB7CiAgeyAxNjAwMCwgU19CaXRzMlBlVGFiMTYwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIxNjAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAogIHsgMjIwNTAsIFNfQml0czJQZVRhYjIyMDUwLCBzaXplb2YoU19CaXRzMlBlVGFiMjIwNTApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKICB7IDI0MDAwLCBTX0JpdHMyUGVUYWIyNDAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjI0MDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0sCiAgeyAzMjAwMCwgU19CaXRzMlBlVGFiMzIwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIzMjAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAogIHsgNDQxMDAsIFNfQml0czJQZVRhYjQ0MTAwLCBzaXplb2YoU19CaXRzMlBlVGFiNDQxMDApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKICB7IDQ4MDAwLCBTX0JpdHMyUGVUYWI0ODAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjQ4MDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0KfTsKCgoKLyogdmFsdWVzIGZvciBhdm9pZCBob2xlIGZsYWcgKi8KZW51bSBfYXZvaWRfaG9sZV9zdGF0ZSB7CiAgICBOT19BSCAgICAgICAgICAgICAgPTAsCiAgICBBSF9JTkFDVElWRSAgICAgICAgPTEsCiAgICBBSF9BQ1RJVkUgICAgICAgICAgPTIKfTsKCgovKiAgUSBmb3JtYXQgZGVmaW5pdGlvbnMgKi8KI2RlZmluZSBRX0JJVEZBQyAgICAoMjQpICAgLyogUSBzY2FsaW5nIHVzZWQgaW4gRkRLYWFjRW5jX2JpdHJlc0NhbGNCaXRGYWMoKSBjYWxjdWxhdGlvbiAqLwojZGVmaW5lIFFfQVZHQklUUyAgICgxNykgICAvKiBzY2FsZSBiaXQgdmFsdWVzICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcgogICAgZGVzY3JpcHRpb246ICByZXRyaWV2ZSBiaXRzMlBlRmFjdG9yIGZyb20gdGFibGUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcigKICAgICAgICBGSVhQX0RCTCAqYml0czJQZUZhY3Rvcl9tLAogICAgICAgIElOVCAqYml0czJQZUZhY3Rvcl9lLAogICAgICAgIGNvbnN0IElOVCBiaXRSYXRlLAogICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCiAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGUsCiAgICAgICAgY29uc3QgSU5UIGFkdmFuY2VkQml0c1RvUGUsCiAgICAgICAgY29uc3QgSU5UIGludlF1YW50CiAgICAgICAgKQp7CiAgLyogZGVmYXVsdCBiaXRzMnBlIGZhY3RvciAqLwogIEZJWFBfREJMIGJpdDJQRV9tID0gRkwyRlhDT05TVF9EQkwoMS4xOGYvKDE8PCgxKSkpOwogIElOVCAgICAgIGJpdDJQRV9lID0gMTsKCiAgLyogbWFrZSB1c2Ugb2YgYWR2YW5jZWQgYml0cyB0byBwZSBmYWN0b3IgdGFibGUgKi8KICBpZiAoYWR2YW5jZWRCaXRzVG9QZSkgewoKICAgIGludCBpOwogICAgY29uc3QgQklUX1BFX1NGQUMgKnBlVGFiID0gTlVMTDsKICAgIElOVCBzaXplID0gMDsKCgogICAgLyogR2V0IGNvcnJlY3QgdGFibGUgZW50cnkgKi8KICAgIGZvciAoaT0wOyBpPChJTlQpKHNpemVvZihiaXRzMlBlQ29uZmlnVGFiKS9zaXplb2YoQklUUzJQRV9DRkdfVEFCKSk7IGkrKykgewogICAgICBpZiAoc2FtcGxlUmF0ZSA+PSBiaXRzMlBlQ29uZmlnVGFiW2ldLnNhbXBsZVJhdGUpIHsKICAgICAgICBwZVRhYiA9IGJpdHMyUGVDb25maWdUYWJbaV0ucFBlVGFiOwogICAgICAgIHNpemUgID0gYml0czJQZUNvbmZpZ1RhYltpXS5uRW50cmllczsKICAgICAgfQogICAgfQoKICAgIGlmICggKHBlVGFiIT1OVUxMKSAmJiAoc2l6ZSE9MCkgKSB7CgogICAgICBJTlQgc3RhcnRCICAgICAgPSAtMTsKICAgICAgTE9ORyBzdGFydFBGICAgID0gMDsKICAgICAgTE9ORyBwZVNsb3BlICAgID0gMDsKCiAgICAgIC8qIHN0ZXJlbyBvciBtb25vIG1vZGUgYW5kIGludlF1YW50IHVzZWQgb3Igbm90ICovCiAgICAgIGZvciAoaT0wOyBpPHNpemUtMTsgaSsrKQogICAgICB7CiAgICAgICAgaWYgKChwZVRhYltpXS5iaXRyYXRlPD1iaXRSYXRlKSAmJiAoKHBlVGFiW2krMV0uYml0cmF0ZT5iaXRSYXRlKSB8fCAoKGk9PXNpemUtMikpICkpCiAgICAgICAgewogICAgICAgICAgaWYgKG5DaGFubmVscz09MSkKICAgICAgICAgIHsKICAgICAgICAgICAgc3RhcnRQRiA9ICghaW52UXVhbnQpID8gcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0OwogICAgICAgICAgICBwZVNsb3BlID0gKCFpbnZRdWFudCkgPyBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2xvcGUgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0X3Nsb3BlOwogICAgICAgICAgICAvKmVuZFBGICAgPSAoIWludlF1YW50KSA/IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9tb25vIDogcGVUYWJbaSsxXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0OwogICAgICAgICAgICBlbmRCPXBlVGFiW2krMV0uYml0cmF0ZTsqLwogICAgICAgICAgICBzdGFydEI9cGVUYWJbaV0uYml0cmF0ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXJ0UEYgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX3N0ZXJlb19zY2ZPcHQ7CiAgICAgICAgICAgIHBlU2xvcGUgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvX3Nsb3BlIDogcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0X3Nsb3BlOwogICAgICAgICAgICAvKmVuZFBGICAgPSAoIWludlF1YW50KSA/IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9zdGVyZW8gOiBwZVRhYltpKzFdLmJpdHMyUGVGYWN0b3Jfc3RlcmVvX3NjZk9wdDsKICAgICAgICAgICAgZW5kQj1wZVRhYltpKzFdLmJpdHJhdGU7Ki8KICAgICAgICAgICAgc3RhcnRCPXBlVGFiW2ldLmJpdHJhdGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSAvKiBmb3IgaSAqLwoKICAgICAgLyogaWYgYSBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSAqLwogICAgICBpZiAoc3RhcnRCIT0tMSkgewogICAgICAgIC8qIGxpbmVhciBpbnRlcnBvbGF0ZSB0byBhY3R1YWwgUEVmYWN0b3IgKi8KICAgICAgICBGSVhQX0RCTCBwZUZhYyA9IGZNdWx0KChGSVhQX0RCTCkoYml0UmF0ZS1zdGFydEIpPDwxNCwgKEZJWFBfREJMKXBlU2xvcGUpIDw8IDI7CiAgICAgICAgRklYUF9EQkwgYml0MlBFID0gcGVGYWMgKyAoRklYUF9EQkwpc3RhcnRQRjsgLyogc3RhcnRQRl9mbG9hdCA9IHN0YXJ0UEYgPDwgMiAqLwoKICAgICAgICAvKiBzYW5pdHkgY2hlY2sgaWYgYml0czJwZSB2YWx1ZSBpcyBoaWdoIGVub3VnaCAqLwogICAgICAgIGlmICggYml0MlBFID49IChGTDJGWENPTlNUX0RCTCgwLjM1ZikgPj4gMikgKSB7CiAgICAgICAgICBiaXQyUEVfbSA9IGJpdDJQRTsKICAgICAgICAgIGJpdDJQRV9lID0gMjsgLyogIHRhYmxlIGlzIGZpeGVkIHNjYWxlZCAqLwogICAgICAgIH0KICAgICAgfSAvKiBiciAqLwogICAgfSAvKiBzciAqLwogIH0gLyogYWR2YW5jZWRCaXRzVG9QZSAqLwoKCiAgLyogcmV0dXJuIGJpdHMycGUgZmFjdG9yICovCiAgKmJpdHMyUGVGYWN0b3JfbSA9IGJpdDJQRV9tOwogICpiaXRzMlBlRmFjdG9yX2UgPSBiaXQyUEVfZTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19iaXRzMnBlMgpkZXNjcmlwdGlvbjogIGNvbnZlcnQgZnJvbSBiaXRzIHRvIHBlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIEZES2FhY0VuY19iaXRzMnBlMigKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHMsCiAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBmYWN0b3JfbSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGZhY3Rvcl9lCiAgICAgICAgKQp7CiAgIHJldHVybiAoSU5UKShmTXVsdChmYWN0b3JfbSwgKEZJWFBfREJMKShiaXRzPDxRX0FWR0JJVFMpKSA+PiAoUV9BVkdCSVRTLWZhY3Rvcl9lKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jYWxjVGhyZXNoRXhwCmRlc2NyaXB0aW9uOiAgbG91ZG5lc3MgY2FsY3VsYXRpb24gKHRocmVzaG9sZCB0byB0aGUgcG93ZXIgb2YgcmVkRXhwKQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAoRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQp7CiAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CiAgIEZJWFBfREJMIHRockV4cExkRGF0YTsKCiAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgIHRockV4cExkRGF0YSA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0+PjIgOwogICAgICAgICB0aHJFeHBbY2hdW3NmYkdycCtzZmJdID0gQ2FsY0ludkxkRGF0YSh0aHJFeHBMZERhdGEpOwogICAgICAgfQogICAgIH0KICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGFwdE1pblNucgogICAgZGVzY3JpcHRpb246ICByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50cyBmb3IgYmFuZHMgd2l0aCByZWxhdGl2ZSBsb3cgZW5lcmdpZXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19hZGFwdE1pblNucihRQ19PVVRfQ0hBTk5FTCAgICAgKnFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAgICpwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBuQ2hhbm5lbHMpCnsKICBJTlQgY2gsIHNmYiwgc2ZiR3JwLCBuU2ZiOwogIEZJWFBfREJMIGF2Z0VuTEQ2NCwgZGJSYXRpbywgbWluU25yUmVkOwogIEZJWFBfREJMIG1pblNuckxpbWl0TEQ2NCA9IEZMMkZYQ09OU1RfREJMKC0wLjAwNTAzMDEyNjQ4MjYyZik7IC8qIGxkNjQoMC44ZikgKi8KICBGSVhQX0RCTCBuU2ZiTEQ2NDsKICBGSVhQX0RCTCBhY2N1OwoKICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgLyogY2FsYyBhdmVyYWdlIGVuZXJneSBwZXIgc2NhbGVmYWN0b3IgYmFuZCAqLwogICAgblNmYiA9IDA7CiAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogICAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICBhY2N1ICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PjY7CgkJCQkgblNmYisrOwoJCQkgfQogICAgfQoKICAgIGlmICgoYWNjdSA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKG5TZmIgPT0gMCkpIHsKICAgICAgYXZnRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogICAgfQogICAgZWxzZSB7CiAgICAgIG5TZmJMRDY0ICA9IENhbGNMZEludChuU2ZiKTsKICAgICAgYXZnRW5MRDY0ID0gQ2FsY0xkRGF0YShhY2N1KTsKICAgICAgYXZnRW5MRDY0ID0gYXZnRW5MRDY0ICsgRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpIC0gblNmYkxENjQ7ICAvKiAwLjA5Mzc1ZjogY29tcGVuc2F0ZSBzaGlmdCB3aXRoIDYgKi8KICAgIH0KCiAgICAvKiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50IGJ5IG1pblNucl5taW5TbnJSZWQgZGVwZW5kZW50IG9uIGF2Z0VuL3NmYkVuICovCiAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgIGlmICggKG1zYVBhcmFtLT5zdGFydFJhdGlvICsgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKSA8IGF2Z0VuTEQ2NCApIHsKICAgICAgICAgIGRiUmF0aW8gPSBmTXVsdCgoYXZnRW5MRDY0IC0gcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKSxGTDJGWENPTlNUX0RCTCgwLjMwMTAyOTk5NTZmKSk7IC8qIHNjYWxlZCBieSAoMS4wZi8oMTAuMGYqNjQuMGYpKSAqLwogICAgICAgICAgbWluU25yUmVkID0gbXNhUGFyYW0tPnJlZE9mZnMgKyBmTXVsdChtc2FQYXJhbS0+cmVkUmF0aW9GYWMsZGJSYXRpbyk7IC8qIHNjYWxlZCBieSAxLjBmLzY0LjBmKi8KICAgICAgICAgIG1pblNuclJlZCA9IGZpeE1heChtaW5TbnJSZWQsIG1zYVBhcmFtLT5tYXhSZWQpOyAvKiBzY2FsZWQgYnkgMS4wZi82NC4wZiovCiAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSAoZk11bHQocWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLG1pblNuclJlZCkpIDw8IDY7CiAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNaW4obWluU25yTGltaXRMRDY0LCBxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZwpkZXNjcmlwdGlvbjogIGRldGVybWluZSBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIG5vdCBuZWNlc3NhcnkgcmVzcC4gcG9zc2libGUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZyhRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQRV9EQVRBICpwZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIX1BBUkFNICphaFBhcmFtKQp7CiAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CiAgIEZJWFBfREJMIHNmYkVuLCBzZmJFbm0xOwogICBGSVhQX0RCTCBzZmJFbkxkRGF0YTsKICAgRklYUF9EQkwgYXZnRW5MZERhdGE7CgogICAvKiBkZWNyZWFzZSBzcHJlYWQgZW5lcmd5IGJ5IDNkQiBmb3IgbG9uZyBibG9ja3MsIHJlc3AuIDJkQiBmb3Igc2hvcnRzCiAgICAgIChhdm9pZCBtb3JlIGhvbGVzIGluIGxvbmcgYmxvY2tzKSAqLwogICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgICBJTlQgc2ZiR3JwLCBzZmI7CiAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CgogICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKQogICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKQogICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdID4+PSAxIDsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKQogICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKQogICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdID0KICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjNmKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdKSA7CiAgICAgIH0KICAgfQoKICAgLyogaW5jcmVhc2UgbWluU25yIGZvciBsb2NhbCBwZWFrcywgZGVjcmVhc2UgaXQgZm9yIHZhbGxleXMgKi8KICAgaWYgKGFoUGFyYW0tPm1vZGlmeU1pblNucikgewogICAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CiAgICAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKXsKICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgICAgICAgRklYUF9EQkwgc2ZiRW5wMSwgYXZnRW47CiAgICAgICAgICAgICAgIGlmIChzZmIgPiAwKQogICAgICAgICAgICAgICAgICBzZmJFbm0xID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYi0xXTsKICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBzZmJFbm0xID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07CgogICAgICAgICAgICAgICBpZiAoc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwLTEpCiAgICAgICAgICAgICAgICAgIHNmYkVucDEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiKzFdOwogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHNmYkVucDEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKCiAgICAgICAgICAgICAgIGF2Z0VuID0gKHNmYkVubTE+PjEpICsgKHNmYkVucDE+PjEpOwogICAgICAgICAgICAgICBhdmdFbkxkRGF0YSA9IENhbGNMZERhdGEoYXZnRW4pOwogICAgICAgICAgICAgICBzZmJFbiA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICBzZmJFbkxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAvKiBwZWFrID8gKi8KICAgICAgICAgICAgICAgaWYgKHNmYkVuID4gYXZnRW4pIHsKICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wTWluU25yTGREYXRhOwogICAgICAgICAgICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZT09TE9OR19XSU5ET1cpCiAgICAgICAgICAgICAgICAgICAgIHRtcE1pblNuckxkRGF0YSA9IGZpeE1heCggU25yTGRGYWMgKyAoRklYUF9EQkwpKGF2Z0VuTGREYXRhIC0gc2ZiRW5MZERhdGEpLCAoRklYUF9EQkwpU25yTGRNaW4xICkgOwogICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHRtcE1pblNuckxkRGF0YSA9IGZpeE1heCggU25yTGRGYWMgKyAoRklYUF9EQkwpKGF2Z0VuTGREYXRhIC0gc2ZiRW5MZERhdGEpLCAoRklYUF9EQkwpU25yTGRNaW4zICkgOwoKICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPQogICAgICAgICAgICAgICAgICAgICBmaXhNaW4ocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sIHRtcE1pblNuckxkRGF0YSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLyogdmFsbGV5ID8gKi8KICAgICAgICAgICAgICAgaWYgKCAoKHNmYkVuTGREYXRhKyhGSVhQX0RCTClTbnJMZE1pbjQpIDwgKEZJWFBfREJMKWF2Z0VuTGREYXRhKSAmJiAoc2ZiRW4gPiBGTDJGWENPTlNUX0RCTCgwLjApKSApIHsKICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wTWluU25yTGREYXRhID0gYXZnRW5MZERhdGEgLSBzZmJFbkxkRGF0YSAtKEZJWFBfREJMKVNuckxkTWluNCArIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPSBmaXhNaW4oKEZJWFBfREJMKVNuckxkRmFjLCB0bXBNaW5TbnJMZERhdGEpOwogICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1pbih0bXBNaW5TbnJMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBTbnJMZE1pbjIgKSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgfQoKICAgLyogc3RlcmVvOiBhZGFwdCB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgc2ZiTWluU25yIG9mIG1pZCBhbmQKICAgICAgc2lkZSBjaGFubmVscyB0byBhdm9pZCBzcGVuZGluZyB1bm5vdGljYWJsZSBiaXRzICovCiAgIGlmIChuQ2hhbm5lbHMgPT0gMikgewogICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbk0gID0gcWNPdXRDaGFubmVsWzBdOwogICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhblMgID0gcWNPdXRDaGFubmVsWzFdOwogICAgICBQU1lfT1VUX0NIQU5ORUwqICBwc3lPdXRDaGFuTSAgPSBwc3lPdXRDaGFubmVsWzBdOwogICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuTS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5NLT5zZmJQZXJHcm91cCl7CiAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5NLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgIGlmICh0b29sc0luZm8tPm1zTWFza1tzZmJHcnArc2ZiXSkgewogICAgICAgICAgICAgRklYUF9EQkwgbWF4U2ZiRW5MZCA9IGZpeE1heChxY091dENoYW5NLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0scWNPdXRDaGFuUy0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKTsKICAgICAgICAgICAgIEZJWFBfREJMIG1heFRockxkLCBzZmJNaW5TbnJUbXBMZDsKCiAgICAgICAgICAgICBpZiAoICgoU25yTGRNaW41Pj4xKSArIChtYXhTZmJFbkxkPj4xKSArIChxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKSA8PSBGTDJGWENPTlNUX0RCTCgtMC41ZikpCiAgICAgICAgICAgICAgIG1heFRockxkID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpIDsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgbWF4VGhyTGQgPSBTbnJMZE1pbjUgKyBtYXhTZmJFbkxkICsgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdOwoKICAgICAgICAgICAgIGlmIChxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkKICAgICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBtYXhUaHJMZCAtIHFjT3V0Q2hhbk0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNYXgocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLHNmYk1pblNuclRtcExkKTsKCiAgICAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQogICAgICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWluKHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSwgKEZJWFBfREJMKVNuckxkRmFjKTsKCiAgICAgICAgICAgICBpZiAocWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdID4gRkwyRlhDT05TVF9EQkwoMC4wZikpCiAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gbWF4VGhyTGQgLSBxY091dENoYW5TLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWF4KHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSxzZmJNaW5TbnJUbXBMZCk7CgogICAgICAgICAgICAgaWYgKHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKICAgICAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1pbihxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sKEZJWFBfREJMKVNuckxkRmFjKTsKCiAgICAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPnFjT3V0Q2hhbk0tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSkKICAgICAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA9CiAgICAgICAgICAgICAgICAgICBmTXVsdChxY091dENoYW5TLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0sIEZMMkZYQ09OU1RfREJMKDAuOWYpKTsKCiAgICAgICAgICAgICBpZiAocWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPnFjT3V0Q2hhblMtPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSkKICAgICAgICAgICAgICAgIHFjT3V0Q2hhbk0tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA9CiAgICAgICAgICAgICAgICAgICBmTXVsdChxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0sIEZMMkZYQ09OU1RfREJMKDAuOWYpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgfQoKICAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwogICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CiAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW4gID0gcHN5T3V0Q2hhbm5lbFtjaF07CiAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CiAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICAgaWYgKChxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA+IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdKQogICAgICAgICAgICAgIHx8IChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewogICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IE5PX0FIOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID0gQUhfSU5BQ1RJVkU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgIH0KfQoKCgovKioKICogXGJyaWVmICBDYWxjdWxhdGUgY29uc3RhbnRzIHRoYXQgZG8gbm90IGNoYW5nZSBkdXJpbmcgc3VjY2Vzc2l2ZSBwZSBjYWxjdWxhdGlvbnMuCiAqCiAqIFxwYXJhbSBwZURhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyBQRSBkYXRhIG9mIGN1cnJlbnQgZWxlbWVudC4KICogXHBhcmFtIHBzeU91dENoYW5uZWwgICAgICAgICBQb2ludGVyIHRvIFBTWV9PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZyBuQ2hhbm5lbHMgZWxlbWVudHMuCiAqIFxwYXJhbSBxY091dENoYW5uZWwgICAgICAgICAgUG9pbnRlciB0byBRQ19PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZyBuQ2hhbm5lbHMgZWxlbWVudHMuCiAqIFxwYXJhbSBuQ2hhbm5lbHMgICAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzIGluIGVsZW1lbnQuCiAqIFxwYXJhbSBwZU9mZnNldCAgICAgICAgICAgICAgRml4ZWQgUEUgb2Zmc2V0IGRlZmluZWQgd2hpbGUgRkRLYWFjRW5jX0FkalRockluaXQoKSBkZXBlbmRpbmcgb24gYml0cmF0ZS4KICoKICogXHJldHVybiAgdm9pZAogKi8Kc3RhdGljCnZvaWQgRkRLYWFjRW5jX3ByZXBhcmVQZShQRV9EQVRBICpwZURhdGEsCiAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgIGNvbnN0IElOVCBwZU9mZnNldCkKewogICAgSU5UIGNoOwoKICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSBwc3lPdXRDaGFubmVsW2NoXTsKICAgICAgICBGREthYWNFbmNfcHJlcGFyZVNmYlBlKCZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLAogICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGEsCiAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YSwKICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRm9ybUZhY3RvckxkRGF0YSwKICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0cywKICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiQ250LAogICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCwKICAgICAgICAgICAgcHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXApOwogICAgfQogICAgcGVEYXRhLT5vZmZzZXQgPSBwZU9mZnNldDsKfQoKLyoqCiAqIFxicmllZiAgQ2FsY3VsYXRlIHdlaWdodGluZyBmYWN0b3IgZm9yIHRocmVzaG9sZCBhZGp1c3RtZW50LgogKgogKiBDYWxjdWxhdGUgd2VpZ2h0aW5nIGZhY3RvciB0byBiZSBhcHBsaWVkIGF0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGluIGxkNjQgZm9ybWF0LgogKgogKiBccGFyYW0gcGVEYXRhLCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gUEUgZGF0YSBpbiBjdXJyZW50IGVsZW1lbnQuCiAqIFxwYXJhbSBwc3lPdXRDaGFubmVsICAgICAgICAgUG9pbnRlciB0byBQU1lfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcgbkNoYW5uZWxzIGVsZW1lbnRzLgogKiBccGFyYW0gcWNPdXRDaGFubmVsICAgICAgICAgIFBvaW50ZXIgdG8gUUNfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcgbkNoYW5uZWxzIGVsZW1lbnRzLgogKiBccGFyYW0gdG9vbHNJbmZvICAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9vbHMgaW5mbyBzdHJ1Y3Qgb2YgY3VycmVudCBlbGVtZW50LgogKiBccGFyYW0gYWRqVGhyU3RhdGVFbGVtZW50ICAgIFBvaW50ZXIgdG8gQVRTX0VMRU1FTlQgaG9sZGluZyBlbkZhY1BhdGNoIHN0YXRlcy4KICogXHBhcmFtIG5DaGFubmVscyAgICAgICAgICAgICBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gZWxlbWVudC4KICogXHBhcmFtIHVzZVBhdGNoVG9vbCAgICAgICAgICBBcHBseSB0aGUgd2VpZ2h0aW5nIHRvb2wgMCAobm8pIGVsc2UgKHllcykuCiAqCiAqIFxyZXR1cm4gIHZvaWQKICovCnN0YXRpYwp2b2lkIEZES2FhY0VuY19jYWxjV2VpZ2h0aW5nKFBFX0RBVEEgKnBlRGF0YSwKICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAogICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtZW50LAogICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAogICAgICAgICAgICAgICBjb25zdCBJTlQgdXNlUGF0Y2hUb29sKQp7CiAgICBpbnQgY2gsIG5vU2hvcnRXaW5kb3dJbkZyYW1lID0gVFJVRTsKICAgIElOVCBleGVQYXRjaE0gPSAwOwoKICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7CiAgICAgICAgICAgIG5vU2hvcnRXaW5kb3dJbkZyYW1lID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIEZES21lbWNsZWFyKHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGQsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKICAgIH0KCiAgICBpZiAodXNlUGF0Y2hUb29sPT0wKSB7CiAgICAgICAgcmV0dXJuOyAvKiB0b29sIGlzIGRpc2FibGVkICovCiAgICB9CgogICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKCiAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gcHN5T3V0Q2hhbm5lbFtjaF07CgogICAgICAgIGlmIChub1Nob3J0V2luZG93SW5GcmFtZSkgeyAvKiByZXRhaW4gZW5lcmd5IHJhdGlvIGJldHdlZW4gYmxvY2tzIG9mIGRpZmZlcmVudCBsZW5ndGggKi8KCiAgICAgICAgICAgIEZJWFBfREJMIG5yZ1N1bTE0LCBucmdTdW0xMiwgbnJnU3VtMzQsIG5yZ1RvdGFsOwogICAgICAgICAgICBGSVhQX0RCTCBucmdGYWNMZF8xNCwgbnJnRmFjTGRfMTIsIG5yZ0ZhY0xkXzM0OwogICAgICAgICAgICBJTlQgdXNlUGF0Y2gsIGV4ZVBhdGNoOwogICAgICAgICAgICBpbnQgc2ZiLCBzZmJHcnAsIG5MaW5lc1N1bSA9IDA7CgogICAgICAgICAgICBucmdTdW0xNCA9IG5yZ1N1bTEyID0gbnJnU3VtMzQgPSBucmdUb3RhbCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CgogICAgICAgICAgICAvKiBjYWxjdWxhdGUgZmxhdG5lc3Mgb2YgYXVkaWJsZSBzcGVjdHJ1bSwgaS5lLiBzcGVjdHJ1bSBhYm92ZSBtYXNraW5nIHRocmVzaG9sZC4gKi8KICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CiAgICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgICAgICAgIEZJWFBfREJMIG5yZ0ZhYzEyID0gQ2FsY0ludkxkRGF0YShwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjEpOyAvKiBucmdeKDEvMikgKi8KICAgICAgICAgICAgICAgIEZJWFBfREJMIG5yZ0ZhYzE0ID0gQ2FsY0ludkxkRGF0YShwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjIpOyAvKiBucmdeKDEvNCkgKi8KCiAgICAgICAgICAgICAgICAvKiBtYXhpbWFsIG51bWJlciBvZiBiYW5kcyBpcyA2NCwgcmVzdWx0cyBzY2FsaW5nIGZhY3RvciA2ICovCiAgICAgICAgICAgICAgICBuTGluZXNTdW0gKz0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJOTGluZXNbc2ZiR3JwK3NmYl07ICAgICAgICAgICAgIC8qIHJlbGV2YW50IGxpbmVzICovCiAgICAgICAgICAgICAgICBucmdUb3RhbCAgKz0gKCBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0gPj4gNiApOyAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmcgKi8KICAgICAgICAgICAgICAgIG5yZ1N1bTEyICArPSAoIG5yZ0ZhYzEyID4+IDYgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIHVwIG5yZ14oMi80KSAqLwogICAgICAgICAgICAgICAgbnJnU3VtMTQgICs9ICggbnJnRmFjMTQgPj4gNiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgbnJnXigxLzQpICovCiAgICAgICAgICAgICAgICBucmdTdW0zNCAgKz0gKCBmTXVsdChucmdGYWMxNCwgbnJnRmFjMTIpID4+IDYgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmdeKDMvNCkgKi8KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5yZ1RvdGFsID0gQ2FsY0xkRGF0YShucmdUb3RhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBsZDY0IG9mIHRvdGFsIG5yZyAqLwoKICAgICAgICAgICAgbnJnRmFjTGRfMTQgPSBDYWxjTGREYXRhKG5yZ1N1bTE0KSAtIG5yZ1RvdGFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGQ2NChucmdTdW0xNC9ucmdUb3RhbCkgKi8KICAgICAgICAgICAgbnJnRmFjTGRfMTIgPSBDYWxjTGREYXRhKG5yZ1N1bTEyKSAtIG5yZ1RvdGFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGQ2NChucmdTdW0xMi9ucmdUb3RhbCkgKi8KICAgICAgICAgICAgbnJnRmFjTGRfMzQgPSBDYWxjTGREYXRhKG5yZ1N1bTM0KSAtIG5yZ1RvdGFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGQ2NChucmdTdW0zNC9ucmdUb3RhbCkgKi8KCiAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID0gRkRLbWF4KCBGTDJGWENPTlNUX0RCTCgwLjE4NzVmKSwgZkRpdk5vcm0obkxpbmVzU3VtLHBzeU91dENoYW4tPnNmYk9mZnNldHNbcHN5T3V0Q2hhbi0+c2ZiQ250XSkgKTsKCiAgICAgICAgICAgIHVzZVBhdGNoID0gKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC43ODEyNWYpKTsKICAgICAgICAgICAgZXhlUGF0Y2ggPSAoKHVzZVBhdGNoKSAmJiAoYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0pKTsKCiAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CgogICAgICAgICAgICAgICAgSU5UIHNmYkV4ZVBhdGNoOwoKICAgICAgICAgICAgICAgIC8qIGZvciBNUyBjb3VwbGVkIFNGQnMsIGFsc28gZXhlY3V0ZSBwYXRjaCBpbiBzaWRlIGNoYW5uZWwgaWYgZG9uZSBpbiBtaWQgY2hhbm5lbCAqLwogICAgICAgICAgICAgICAgaWYgKChjaCA9PSAxKSAmJiAodG9vbHNJbmZvLT5tc01hc2tbc2ZiR3JwK3NmYl0pKSB7CiAgICAgICAgICAgICAgICAgICAgc2ZiRXhlUGF0Y2ggPSBleGVQYXRjaE07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZmJFeGVQYXRjaCA9IGV4ZVBhdGNoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggKHNmYkV4ZVBhdGNoKSAmJiAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPkZMMkZYQ09OU1RfREJMKDAuZikpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvKiBleGVjdXRlIHBhdGNoIGJhc2VkIG9uIHNwZWN0cmFsIGZsYXRuZXNzIGNhbGN1bGF0ZWQgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoYWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVFbkZhY1tjaF0gPiBGTDJGWENPTlNUX0RCTCgwLjgxMjVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCtzZmJdID0gKCAobnJnRmFjTGRfMTQgKyAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKyhwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKSk+PjEgKTsgLyogc2ZiRW5lcmd5XigzLzQpICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC43OTY4NzVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCtzZmJdID0gKCAobnJnRmFjTGRfMTIgKyBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0pPj4xICk7ICAgICAgICAgIC8qIHNmYkVuZXJneV4oMi80KSAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSA9ICggKG5yZ0ZhY0xkXzM0ICsgKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXT4+MSkpPj4xICk7ICAgICAvKiBzZmJFbmVyZ3leKDEvNCkgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSA9IGZpeE1pbihxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCtzZmJdLChGSVhQX0RCTCkwKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IC8qIHNmYiBsb29wICovCgogICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmxhc3RFbkZhY1BhdGNoW2NoXSA9IHVzZVBhdGNoOwogICAgICAgICAgICBleGVQYXRjaE0gPSBleGVQYXRjaDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qICFub1Nob3J0V2luZG93SW5GcmFtZSAqLwogICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA9IEZMMkZYQ09OU1RfREJMKDAuNzVmKTsKICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0gPSBUUlVFOyAvKiBhbGxvdyB1c2Ugb2Ygc2ZiRW5GYWMgcGF0Y2ggaW4gdXBjb21pbmcgZnJhbWUgKi8KICAgICAgICB9CgogICAgfSAvKiBjaCBsb29wICovCgp9CgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY1BlCmRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlIHBlIGZvciBib3RoIGNoYW5uZWxzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMKdm9pZCBGREthYWNFbmNfY2FsY1BlKFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSwKICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKewogICBJTlQgY2g7CgogICBwZURhdGEtPnBlID0gcGVEYXRhLT5vZmZzZXQ7CiAgIHBlRGF0YS0+Y29uc3RQYXJ0ID0gMDsKICAgcGVEYXRhLT5uQWN0aXZlTGluZXMgPSAwOwogICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOwogICAgICBGREthYWNFbmNfY2FsY1NmYlBlKCZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLAogICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGEsCiAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEsCiAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250LAogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmlzQm9vaywKICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5pc1NjYWxlKTsKCiAgICAgIHBlRGF0YS0+cGUgKz0gcGVDaGFuRGF0YS0+cGU7CiAgICAgIHBlRGF0YS0+Y29uc3RQYXJ0ICs9IHBlQ2hhbkRhdGEtPmNvbnN0UGFydDsKICAgICAgcGVEYXRhLT5uQWN0aXZlTGluZXMgKz0gcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzOwogICB9Cn0KCnZvaWQgRkRLYWFjRW5jX3BlQ2FsY3VsYXRpb24oUEVfREFUQSAqcGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQp7CiAgLyogY29uc3RhbnRzIHRoYXQgd2lsbCBub3QgY2hhbmdlIGR1cmluZyBzdWNjZXNzaXZlIHBlIGNhbGN1bGF0aW9ucyAqLwogIEZES2FhY0VuY19wcmVwYXJlUGUocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIG5DaGFubmVscywgYWRqVGhyU3RhdGVFbGVtZW50LT5wZU9mZnNldCk7CgogIC8qIGNhbGN1bGF0ZSB3ZWlnaHRpbmcgZmFjdG9yIGZvciB0aHJlc2hvbGQgYWRqdXN0bWVudCAqLwogIEZES2FhY0VuY19jYWxjV2VpZ2h0aW5nKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCB0b29sc0luZm8sIGFkalRoclN0YXRlRWxlbWVudCwgbkNoYW5uZWxzLCAxKTsKewogICAgLyogbm8gd2VpZ2h0aW5nIG9mIHRocmVob2xkcyBhbmQgZW5lcmdpZXMgZm9yIG1sb3V0ICovCiAgICAvKiB3ZWlnaHQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgKi8KICAgIGludCBjaDsKICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CgogICAgICAgIGludCBzZmIsIHNmYkdycDsKICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcFFjT3V0Q2ggPSBxY091dENoYW5uZWxbY2hdOwoKICAgICAgICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICAgIHBRY091dENoLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmIrc2ZiR3JwXSA9IHBRY091dENoLT5zZmJFbmVyZ3lMZERhdGFbc2ZiK3NmYkdycF0gLSBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIrc2ZiR3JwXTsKICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYlRocmVzaG9sZExkRGF0YVtzZmIrc2ZiR3JwXSAgICAgLT0gcFFjT3V0Q2gtPnNmYkVuRmFjTGRbc2ZiK3NmYkdycF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgogIC8qIHBlIHdpdGhvdXQgcmVkdWN0aW9uICovCiAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZU5vQUgKZGVzY3JpcHRpb246ICBzdW0gdGhlIHBlIGRhdGEgb25seSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVOb0FIKElOVCAqcGUsCiAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdFBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICpuQWN0aXZlTGluZXMsCiAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAqcGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKewogICAgSU5UIGNoLCBzZmIsc2ZiR3JwOwoKICAgIElOVCBwZV90bXAgPSBwZURhdGEtPm9mZnNldDsKICAgIElOVCBjb25zdFBhcnRfdG1wID0gMDsKICAgIElOVCBuQWN0aXZlTGluZXNfdG1wID0gMDsKICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKICAgICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCl7CiAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICAgICAgICBpZihhaEZsYWdbY2hdW3NmYkdycCtzZmJdIDwgQUhfQUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgICAgcGVfdG1wICs9IHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0UGFydF90bXAgKz0gcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgICAgIG5BY3RpdmVMaW5lc190bXAgKz0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyogY29ycmVjdCBzY2FsZWQgcGUgYW5kIGNvbnN0UGFydCB2YWx1ZXMgKi8KICAgICpwZSA9IHBlX3RtcCA+PiBQRV9DT05TVFBBUlRfU0hJRlQ7CiAgICAqY29uc3RQYXJ0ID0gY29uc3RQYXJ0X3RtcCA+PiBQRV9DT05TVFBBUlRfU0hJRlQ7CgoJKm5BY3RpdmVMaW5lcyA9IG5BY3RpdmVMaW5lc190bXA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUgpkZXNjcmlwdGlvbjogIGFwcGx5IHJlZHVjdGlvbiBmb3JtdWxhCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgbGltaXRUaHJSZWR1Y2VkTGREYXRhID0gKEZJWFBfREJMKTB4MDAwMDgwMDA7IC8qRkwyRlhDT05TVF9EQkwoRkRLcG93KDIuMCwtTERfREFUQV9TQ0FMSU5HLzQuMCkpOyovCgpzdGF0aWMgdm9pZCBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUihRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHJlZFZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiByZWRWYWxTY2FsaW5nKQp7CiAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CiAgIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRoclJlZHVjZWRMZERhdGE7CiAgIEZJWFBfREJMIHNmYlRockV4cDsKCiAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW4gPSBxY091dENoYW5uZWxbY2hdOwogICAgICBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKXsKICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICBzZmJFbkxkRGF0YSAgPSBxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOwogICAgICAgICBzZmJUaHJMZERhdGEgPSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgc2ZiVGhyRXhwICAgID0gdGhyRXhwW2NoXVtzZmJHcnArc2ZiXTsKICAgICAgICAgaWYgKChzZmJFbkxkRGF0YSA+IHNmYlRockxkRGF0YSkgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gQUhfQUNUSVZFKSkgewoKICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlZHVjdGlvbiBmb3JtdWxhOgogICAgICAgICAgICAgZmxvYXQgdG1wID0gdGhyRXhwW2NoXVtzZmJdK3JlZFZhbDsKICAgICAgICAgICAgIHRtcCAqPSB0bXA7CiAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gdG1wKnRtcDsKICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW50IG1pblNjYWxlID0gZml4TWluKENvdW50TGVhZGluZ0JpdHMoc2ZiVGhyRXhwKSwgQ291bnRMZWFkaW5nQml0cyhyZWRWYWwpIC0gKERGUkFDVF9CSVRTLTEtcmVkVmFsU2NhbGluZykgKS0xOwoKICAgICAgICAgICAgLyogNCpsb2coIHNmYlRockV4cCArIHJlZFZhbCApICovCiAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBDYWxjTGREYXRhKGZBYnMoc2NhbGVWYWx1ZShzZmJUaHJFeHAsIG1pblNjYWxlKSArIHNjYWxlVmFsdWUocmVkVmFsLChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmcpK21pblNjYWxlKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKEZJWFBfREJMKShtaW5TY2FsZTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpOwogICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhIDw8PSAyOwoKICAgICAgICAgICAgLyogYXZvaWQgaG9sZXMgKi8KICAgICAgICAgICAgaWYgKCAoKHNmYlRoclJlZHVjZWRMZERhdGEgLSBzZmJFbkxkRGF0YSkgPiBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSApCiAgICAgICAgICAgICAgICAgICAgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUgpICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSAgPiAoRkwyRlhDT05TVF9EQkwoLTEuMGYpIC0gc2ZiRW5MZERhdGEpICl7CiAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSArIHNmYkVuTGREYXRhKSwgc2ZiVGhyTGREYXRhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOwogICAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIG1pbmltdW0gb2YgMjkgZEIgUmF0aW8gZm9yIFRocmVzaG9sZHMgKi8KICAgICAgICAgICAgaWYgKChzZmJFbkxkRGF0YSsoRklYUF9EQkwpTUFYVkFMX0RCTCkgPiBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSl7CiAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KHNmYlRoclJlZHVjZWRMZERhdGEsIChzZmJFbkxkRGF0YSAtIEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNi9MRF9EQVRBX1NDQUxJTkcpKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICB9Cn0KCi8qIHNpbWlsYXIgdG8gcHJlcGFyZVNmYlBlMSgpICovCnN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY0NoYW9zTWVhc3VyZShQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAqc2ZiRm9ybUZhY3RvckxkRGF0YSkKewogICNkZWZpbmUgU0NBTEVfRk9STV9GQUMgICAgICg0KSAgICAvKiAoU0NBTEVfRk9STV9GQUMrRk9STV9GQUNfU0hJRlQpID49IGxkKEZSQU1FX0xFTkdUSCkqLwogICNkZWZpbmUgU0NBTEVfTlJHUyAgICAgICAgICg4KQogICNkZWZpbmUgU0NBTEVfTkxJTkVTICAgICAgKDE2KQogICNkZWZpbmUgU0NBTEVfTlJHU19TUVJUNCAgICgyKSAgICAvKiAwLjI1ICogU0NBTEVfTlJHUyAqLwogICNkZWZpbmUgU0NBTEVfTkxJTkVTX1AzNCAgKDEyKSAgICAvKiAwLjc1ICogU0NBTEVfTkxJTkVTICovCgogIElOVCAgIHNmYkdycCwgc2ZiOwogIEZJWFBfREJMIGNoYW9zTWVhc3VyZTsKICBJTlQgZnJhbWVOTGluZXMgPSAwOwogIEZJWFBfREJMIGZyYW1lRm9ybUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgRklYUF9EQkwgZnJhbWVFbmVyZ3kgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwoKICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CiAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKXsKICAgICAgaWYgKHBzeU91dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA+IHBzeU91dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSkgewogICAgICAgIGZyYW1lRm9ybUZhY3RvciArPSAoQ2FsY0ludkxkRGF0YShzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCtzZmJdKT4+U0NBTEVfRk9STV9GQUMpOwogICAgICAgIGZyYW1lTkxpbmVzICAgICArPSAocHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJHcnArc2ZiKzFdIC0gcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJHcnArc2ZiXSk7CiAgICAgICAgZnJhbWVFbmVyZ3kgICAgICs9IChwc3lPdXRDaGFubmVsLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PlNDQUxFX05SR1MpOwogICAgICB9CiAgICB9CiAgfQoKICBpZihmcmFtZU5MaW5lcyA+IDApewoKICAgIC8qICBmcmFtZU5BY3RpdmVMaW5lcyA9IGZyYW1lRm9ybUZhY3RvcioyXkZPUk1fRkFDX1NISUZUICogKChmcmFtZUVuZXJneSAqMl5TQ0FMRV9OUkdTKS9mcmFtZU5MaW5lcyleLTAuMjUKICAgICAgICBjaGFvc01lYXN1cmUgICAgICA9IGZyYW1lTkFjdGl2ZUxpbmVzIC8gZnJhbWVOTGluZXMgKi8KICAgIGNoYW9zTWVhc3VyZSA9CiAgICAgICAgICAgQ2FsY0ludkxkRGF0YSggKCgoQ2FsY0xkRGF0YShmcmFtZUZvcm1GYWN0b3IpPj4xKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2FsY0xkRGF0YShmcmFtZUVuZXJneSk+PigyKzEpKSkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzVmKSxDYWxjTGREYXRhKChGSVhQX0RCTClmcmFtZU5MaW5lczw8KERGUkFDVF9CSVRTLTEtU0NBTEVfTkxJTkVTKSkpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKEZJWFBfREJMKShTQ0FMRV9GT1JNX0ZBQy1TQ0FMRV9OUkdTX1NRUlQ0K0ZPUk1fRkFDX1NISUZULShTQ0FMRV9OTElORVNfUDM0KSk8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKT4+MSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKTw8MSApOwogIH0gZWxzZSB7CgogICAgLyogYXNzdW1pbmcgdG90YWwgY2hhb3MsIGlmIG5vIHNmYiBpcyBhYm92ZSB0aHJlc2hvbGRzICovCiAgICBjaGFvc01lYXN1cmUgPSBGTDJGWENPTlNUX0RCTCgxLmYpOwogIH0KCiAgcmV0dXJuIGNoYW9zTWVhc3VyZTsKfQoKLyogYXBwbHkgcmVkdWN0aW9uIGZvcm11bGEgZm9yIFZCUi1tb2RlICovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzVkJSKFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRockV4cFsoMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgdmJyUXVhbEZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogY2hhb3NNZWFzdXJlT2xkKQp7CiAgSU5UIGNoLCBzZmJHcnAsIHNmYjsKICBGSVhQX0RCTCBjaEdyb3VwRW5lcmd5W1RSQU5TX0ZBQ11bMl07LyplbmVyZ3kgZm9yIGVhY2ggZ3JvdXAgYW5kIGNoYW5uZWwqLwogIEZJWFBfREJMIGNoQ2hhb3NNZWFzdXJlWzJdOwogIEZJWFBfREJMIGZyYW1lRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMWUtMTBmKTsKICBGSVhQX0RCTCBjaGFvc01lYXN1cmUgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRockV4cDsKICBGSVhQX0RCTCBzZmJUaHJSZWR1Y2VkTGREYXRhOwogIEZJWFBfREJMIGNoYW9zTWVhc3VyZUF2ZzsKICBJTlQgZ3JvdXBDbnQ7IC8qIGxvb3AgY291bnRlciAqLwogIEZJWFBfREJMIHJlZFZhbFtUUkFOU19GQUNdOyAvKiByZWR1Y3Rpb24gdmFsdWVzOyBpbiBzaG9ydC1ibG9jayBjYXNlIG9uZSByZWRWYWwgZm9yIGVhY2ggZ3JvdXAgKi8KICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbiAgPSBOVUxMOwogIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW4gID0gTlVMTDsKCiNkZWZpbmUgU0NBTEVfR1JPVVBfRU5FUkdZICAgKDgpCgojZGVmaW5lIENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18wICAoRkwyRlhDT05TVF9EQkwoMC4yNWYpKQojZGVmaW5lIENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18xICAoRkwyRlhDT05TVF9EQkwoMS5mLTAuMjVmKSkKCiNkZWZpbmUgTUlOX0xEVEhSRVNIICAgICAgICAgICAgICAgIChGTDJGWENPTlNUX0RCTCgtMC41MTU2MjVmKSkKCgogIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspewogICAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CiAgICBwc3lPdXRDaGFuICA9IHBzeU91dENoYW5uZWxbY2hdOwoKICAgIC8qIGFkZGluZyB1cCBlbmVyZ3kgZm9yIGVhY2ggY2hhbm5lbCBhbmQgZWFjaCBncm91cCBzZXBhcmF0ZWx5ICovCiAgICBGSVhQX0RCTCBjaEVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICBncm91cENudD0wOwoKICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXAsIGdyb3VwQ250KyspIHsKICAgICAgY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKyl7CiAgICAgICAgY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdICs9IChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PlNDQUxFX0dST1VQX0VORVJHWSk7CiAgICAgIH0KICAgICAgY2hFbmVyZ3kgKz0gY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdOwogICAgfQogICAgZnJhbWVFbmVyZ3kgKz0gY2hFbmVyZ3k7CgogICAgLyogY2hhb3NNZWFzdXJlICovCiAgICBpZiAocHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewogICAgICBjaENoYW9zTWVhc3VyZVtjaF0gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsgLyogYXNzdW1lIGEgY29uc3RhbnQgY2hhb3MgbWVhc3VyZSBvZiAwLjVmIGZvciBzaG9ydCBibG9ja3MgKi8KICAgIH0gZWxzZSB7CiAgICAgIGNoQ2hhb3NNZWFzdXJlW2NoXSA9IEZES2FhY0VuY19jYWxjQ2hhb3NNZWFzdXJlKHBzeU91dENoYW5uZWxbY2hdLCBxY091dENoYW5uZWxbY2hdLT5zZmJGb3JtRmFjdG9yTGREYXRhKTsKICAgIH0KICAgIGNoYW9zTWVhc3VyZSArPSBmTXVsdChjaENoYW9zTWVhc3VyZVtjaF0sIGNoRW5lcmd5KTsKICB9CgogIGlmKGZyYW1lRW5lcmd5ID4gY2hhb3NNZWFzdXJlKSB7CiAgICBJTlQgc2NhbGUgPSBDbnRMZWFkaW5nWmVyb3MoZnJhbWVFbmVyZ3kpIC0gMTsKICAgIEZJWFBfREJMIG51bSAgID0gY2hhb3NNZWFzdXJlPDxzY2FsZTsKICAgIEZJWFBfREJMIGRlbnVtID0gZnJhbWVFbmVyZ3k8PHNjYWxlOwogICAgY2hhb3NNZWFzdXJlICAgPSBzY2h1cl9kaXYobnVtLGRlbnVtLDE2KTsKICB9CiAgZWxzZSB7CiAgICBjaGFvc01lYXN1cmUgPSBGTDJGWENPTlNUX0RCTCgxLmYpOwogIH0KCiAgY2hhb3NNZWFzdXJlQXZnID0gZk11bHQoQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzAsIGNoYW9zTWVhc3VyZSkgKwogICAgICAgICAgICAgICAgICAgIGZNdWx0KENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18xLCAqY2hhb3NNZWFzdXJlT2xkKTsgICAgICAvKiBhdmVyYWdpbmcgY2hhb3MgbWVhc3VyZSAqLwogICpjaGFvc01lYXN1cmVPbGQgPSBjaGFvc01lYXN1cmUgPSAoZml4TWluKGNoYW9zTWVhc3VyZSwgY2hhb3NNZWFzdXJlQXZnKSk7ICAvKiB1c2UgbWluLXZhbHVlLCBzYWZlIGZvciBuZXh0IGZyYW1lICovCgogIC8qIGNoYXJhY3RlcmlzdGljIGN1cnZlCiAgICAgY2hhb3NNZWFzdXJlID0gMC4yZiArIDAuN2YvMC4zZiAqIChjaGFvc01lYXN1cmUgLSAwLjJmKTsKICAgICBjaGFvc01lYXN1cmUgPSBmaXhNaW4oMS4wZiwgZml4TWF4KDAuMWYsIGNoYW9zTWVhc3VyZSkpOwogICAgIGNvbnN0YW50cyBzY2FsZWQgYnkgNC5mCiAgKi8KICBjaGFvc01lYXN1cmUgPSAoKEZMMkZYQ09OU1RfREJMKDAuMmYpPj4yKSArIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YvKDQuZiowLjNmKSksIChjaGFvc01lYXN1cmUgLSBGTDJGWENPTlNUX0RCTCgwLjJmKSkpKTsKICBjaGFvc01lYXN1cmUgPSAoZml4TWluKChGSVhQX0RCTCkoRkwyRlhDT05TVF9EQkwoMS4wZik+PjIpLCBmaXhNYXgoKEZJWFBfREJMKShGTDJGWENPTlNUX0RCTCgwLjFmKT4+MiksIGNoYW9zTWVhc3VyZSkpKTw8MjsKCiAgLyogY2FsY3VsYXRpb24gb2YgcmVkdWN0aW9uIHZhbHVlICovCiAgaWYgKHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpeyAvKiBzaG9ydC1ibG9ja3MgKi8KICAgIEZES19BU1NFUlQoVFJBTlNfRkFDPT04KTsKICAgICNkZWZpbmUgICBXSU5fVFlQRV9TQ0FMRSAgICgzKQoKICAgIElOVCBzZmJHcnAsIGdyb3VwQ250PTA7CiAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwLGdyb3VwQ250KyspIHsKCiAgICAgIEZJWFBfREJMIGdyb3VwRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKCiAgICAgIGZvcihjaD0wO2NoPG5DaGFubmVscztjaCsrKXsKICAgICAgICBncm91cEVuZXJneSArPSBjaEdyb3VwRW5lcmd5W2dyb3VwQ250XVtjaF07ICAgLyogYWRkaW5nIHVwIHRoZSBjaGFubmVscyBncm91cEVuZXJneSAqLwogICAgICB9CgogICAgICBGREtfQVNTRVJUKHBzeU91dENoYW5uZWxbMF0tPmdyb3VwTGVuW2dyb3VwQ250XTw9SU5WX0lOVF9UQUJfU0laRSk7CiAgICAgIGdyb3VwRW5lcmd5ID0gZk11bHQoZ3JvdXBFbmVyZ3ksaW52SW50W3BzeU91dENoYW5uZWxbMF0tPmdyb3VwTGVuW2dyb3VwQ250XV0pOyAgLyogY29ycmVjdGlvbiBvZiBncm91cCBlbmVyZ3kgKi8KICAgICAgZ3JvdXBFbmVyZ3kgPSBmaXhNaW4oZ3JvdXBFbmVyZ3ksIGZyYW1lRW5lcmd5Pj5XSU5fVFlQRV9TQ0FMRSk7ICAgICAgICAgICAgICAgICAvKiBkbyBub3QgYWxsb3cgYW4gaGlnaGVyIHJlZFZhbCBhcyBjYWxjdWxhdGVkIGZyYW1ld2lzZSAqLwoKICAgICAgZ3JvdXBFbmVyZ3k+Pj0yOyAvKiAyKldJTl9UWVBFX1NDQUxFID0gNiA9PiA2KzIgPSA4ID09PiA4LzQgPSBpbnQgbnVtYmVyICovCgogICAgICByZWRWYWxbZ3JvdXBDbnRdID0gZk11bHQoZk11bHQodmJyUXVhbEZhY3RvcixjaGFvc01lYXN1cmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsY0ludkxkRGF0YShDYWxjTGREYXRhKGdyb3VwRW5lcmd5KT4+MikgKQogICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGludCkoICggMiArICgyKldJTl9UWVBFX1NDQUxFKSArIFNDQUxFX0dST1VQX0VORVJHWSApPj4yICkgOwoKICAgIH0KICB9IGVsc2UgeyAvKiBsb25nLWJsb2NrICovCgogICAgcmVkVmFsWzBdID0gZk11bHQoIGZNdWx0KHZiclF1YWxGYWN0b3IsY2hhb3NNZWFzdXJlKSwKICAgICAgICAgICAgICAgICAgICAgICBDYWxjSW52TGREYXRhKENhbGNMZERhdGEoZnJhbWVFbmVyZ3kpPj4yKSApCiAgICAgICAgICAgICAgICA8PCAoaW50KSggU0NBTEVfR1JPVVBfRU5FUkdZPj4yICkgOwogIH0KCiAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CiAgICBwc3lPdXRDaGFuICA9IHBzeU91dENoYW5uZWxbY2hdOwoKICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKyl7CgogICAgICAgIHNmYkVuTGREYXRhICA9IChxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKTsKICAgICAgICBzZmJUaHJMZERhdGEgPSAocWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pOwogICAgICAgIHNmYlRockV4cCAgICA9IHRockV4cFtjaF1bc2ZiR3JwK3NmYl07CgogICAgICAgIGlmICggKHNmYlRockxkRGF0YT49TUlOX0xEVEhSRVNIKSAmJiAoc2ZiRW5MZERhdGEgPiBzZmJUaHJMZERhdGEpICYmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IEFIX0FDVElWRSkpIHsKCiAgICAgICAgICAvKiBTaG9ydC1XaW5kb3cgKi8KICAgICAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewogICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXBOdW1iZXIgPSAoaW50KSBzZmIvcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7CgogICAgICAgICAgICBGREtfQVNTRVJUKElOVl9TUVJUNF9UQUJfU0laRT5wc3lPdXRDaGFuLT5ncm91cExlbltncm91cE51bWJlcl0pOwoKICAgICAgICAgICAgc2ZiVGhyRXhwID0gZk11bHQoc2ZiVGhyRXhwLCBmTXVsdCggRkwyRlhDT05TVF9EQkwoMi44MmYvNC5mKSwgaW52U3FydDRbcHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdXSkpPDwyIDsKCiAgICAgICAgICAgIGlmICggc2ZiVGhyRXhwIDw9IChsaW1pdFRoclJlZHVjZWRMZERhdGEtcmVkVmFsW2dyb3VwTnVtYmVyXSkgKSB7CiAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKChGSVhQX0RCTClyZWRWYWxbZ3JvdXBOdW1iZXJdID49IEZMMkZYQ09OU1RfREJMKDEuMGYpLXNmYlRockV4cCkKICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGEgKi8KICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gQ2FsY0xkRGF0YShzZmJUaHJFeHAgKyByZWRWYWxbZ3JvdXBOdW1iZXJdKTsKICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhIDw8PSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgKz0gKCBDYWxjTGRJbnQocHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJWFBfREJMKTY8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKSApOwogICAgICAgICAgfQoKICAgICAgICAgIC8qIExvbmctV2luZG93ICovCiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKChGSVhQX0RCTClyZWRWYWxbMF0gPj0gRkwyRlhDT05TVF9EQkwoMS4wZiktc2ZiVGhyRXhwKSB7CiAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWR1Y3Rpb24gZm9ybXVsYSAqLwogICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBDYWxjTGREYXRhKHNmYlRockV4cCArIHJlZFZhbFswXSk7CiAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA8PD0gMjsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8qIGF2b2lkIGhvbGVzICovCiAgICAgICAgICBpZiAoICgoc2ZiVGhyUmVkdWNlZExkRGF0YSAtIHNmYkVuTGREYXRhKSA+IHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICkKICAgICAgICAgICAgICAgICAgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUgpICkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICA+IChGTDJGWENPTlNUX0RCTCgtMS4wZikgLSBzZmJFbkxkRGF0YSkgKXsKICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSArIHNmYkVuTGREYXRhKSwgc2ZiVGhyTGREYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGE7CiAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHNmYlRoclJlZHVjZWRMZERhdGE8RkwyRlhDT05TVF9EQkwoLTAuNWYpKQogICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuZik7CgogICAgICAgICAgLyogbWluaW11bSBvZiAyOSBkQiBSYXRpbyBmb3IgVGhyZXNob2xkcyAqLwogICAgICAgICAgaWYgKChzZmJFbkxkRGF0YStGTDJGWENPTlNUX0RCTCgxLjBmKSkgPiBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSl7CiAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoc2ZiVGhyUmVkdWNlZExkRGF0YSwgc2ZiRW5MZERhdGEgLSBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSk7CiAgICAgICAgICB9CgogICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heChNSU5fTERUSFJFU0gsc2ZiVGhyUmVkdWNlZExkRGF0YSk7CgogICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBzZmJUaHJSZWR1Y2VkTGREYXRhOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2gKZGVzY3JpcHRpb246ICBpZiBwZSBkaWZmZXJlbmNlIGRlbHRhUGUgYmV0d2VlbiBkZXNpcmVkIHBlIGFuZCByZWFsIHBlIGlzIHNtYWxsIGVub3VnaCwKdGhlIGRpZmZlcmVuY2UgY2FuIGJlIGRpc3RyaWJ1dGVkIGFtb25nIHRoZSBzY2FsZSBmYWN0b3IgYmFuZHMuCk5ldyB0aHJlc2hvbGRzIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhpcyBwZS1kaWZmZXJlbmNlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfY29ycmVjdFRocmVzaChDSEFOTkVMX01BUFBJTkcqIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICBhaEZsYWdbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICB0aHJFeHBbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBGSVhQX0RCTCByZWRWYWxbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIFNDSEFSIHJlZFZhbFNjYWxpbmdbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBkZWx0YVBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIHByb2Nlc3NFbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBlbGVtZW50T2Zmc2V0KQp7CiAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CiAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW47CiAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbjsKICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhOwogICBGSVhQX0RCTCB0aHJGYWN0b3JMZERhdGE7CiAgIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRoclJlZHVjZWRMZERhdGE7CiAgIEZJWFBfREJMICpzZmJQZUZhY3RvcnNMZERhdGFbKDgpXVsoMildOwogICBGSVhQX0RCTCBzZmJOQWN0aXZlTGluZXNMZERhdGFbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl07CiAgIElOVCAgICAgIG5vcm1GYWN0b3JJbnQ7CiAgIEZJWFBfREJMIG5vcm1GYWN0b3JMZERhdGE7CgogICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CiAgIElOVCBlbGVtZW50SWQ7CgogICAvKiBzY3JhdGNoIGlzIGVtcHR5OyB1c2UgdGVtcG9yYWwgbWVtb3J5IGZyb20gcXVhbnRTcGVjIGluIFFDX09VVF9DSEFOTkVMICovCiAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CiAgICAgICBTSE9SVCogcHRyID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF0tPnF1YW50U3BlYzsKICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXSA9IChGSVhQX0RCTCopcHRyOwogICAgIH0KICAgfQoKICAgLyogZm9yIGVhY2ggc2ZiIGNhbGMgcmVsYXRpdmUgZmFjdG9ycyBmb3IgcGUgY2hhbmdlcyAqLwogICBub3JtRmFjdG9ySW50ID0gMDsKCiAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CgogICAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CgogICAgICAgICAgcWNPdXRDaGFuID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF07CiAgICAgICAgICBwc3lPdXRDaGFuID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXTsKICAgICAgICAgIHBlQ2hhbkRhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YS5wZUNoYW5uZWxEYXRhW2NoXTsKCiAgICAgICAgICBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CiAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKCiAgICAgICAgICAgICBpZiAoIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA9PSAwICkgewogICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiBCb3RoIENhbGNMZEludCBhbmQgQ2FsY0xkRGF0YSBjYW4gYmUgdXNlZCEKICAgICAgICAgICAgICAgICAqIE5vIG9mZnNldCBoYXMgdG8gYmUgc3VidHJhY3RlZCwgYmVjYXVzZSBzZmJOQWN0aXZlTGluZXNMZERhdGEKICAgICAgICAgICAgICAgICAqIGlzIHNob3J0ZWQgd2hpbGUgdGhyRmFjdG9yIGNhbGN1bGF0aW9uICovCiAgICAgICAgICAgICAgICBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBDYWxjTGRJbnQocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICggKChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPCBBSF9BQ1RJVkUpIHx8IChkZWx0YVBlID4gMCkpICYmCiAgICAgICAgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gIT0gMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID4gLXJlZFZhbFtlbGVtZW50SWRdKSB7CgogICAgICAgICAgICAgICAgICAgLyogc2ZiUGVGYWN0b3JzW2NoXVtzZmJHcnArc2ZiXSA9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdICsgcmVkVmFsW2VsZW1lbnRJZF0pOyAqLwoKICAgICAgICAgICAgICAgICAgIGludCBtaW5TY2FsZSA9IGZpeE1pbihDb3VudExlYWRpbmdCaXRzKHRockV4cFtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSksIENvdW50TGVhZGluZ0JpdHMocmVkVmFsW2VsZW1lbnRJZF0pIC0gKERGUkFDVF9CSVRTLTEtcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdKSApIC0gMTsKCiAgICAgICAgICAgICAgICAgICAvKiBzdW1sZCA9IGxkNjQoIHNmYlRockV4cCArIHJlZFZhbCApICovCiAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBzdW1MZCA9IENhbGNMZERhdGEoc2NhbGVWYWx1ZSh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0sIG1pblNjYWxlKSArIHNjYWxlVmFsdWUocmVkVmFsW2VsZW1lbnRJZF0sIChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSkrbWluU2NhbGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKEZJWFBfREJMKShtaW5TY2FsZTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpOwoKICAgICAgICAgICAgICAgICAgIGlmIChzdW1MZCA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKICAgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAtIHN1bUxkOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID4gKEZMMkZYQ09OU1RfREJMKC0xLmYpICsgc3VtTGQpICkgewogICAgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAtIHN1bUxkOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgbm9ybUZhY3RvckludCArPSAoSU5UKUNhbGNJbnZMZERhdGEoc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2Ugc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoMS4wZik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQoKICAgLyogbm9ybUZhY3RvckxkRGF0YSA9IGxkNjQoZGVsdGFQZS9ub3JtRmFjdG9ySW50KSAqLwogICBub3JtRmFjdG9yTGREYXRhID0gQ2FsY0xkRGF0YSgoRklYUF9EQkwpKChkZWx0YVBlPDApID8gKC1kZWx0YVBlKSA6IChkZWx0YVBlKSkpIC0gQ2FsY0xkRGF0YSgoRklYUF9EQkwpbm9ybUZhY3RvckludCk7CgogICAvKiBkaXN0cmlidXRlIHRoZSBwZSBkaWZmZXJlbmNlIHRvIHRoZSBzY2FsZWZhY3RvcnMKICAgICAgYW5kIGNhbGN1bGF0ZSB0aGUgYWNjb3JkaW5nIHRocmVzaG9sZHMgKi8KICAgZm9yKGVsZW1lbnRJZD1lbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKICAgICAgICAgIHFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOwogICAgICAgICAgcHN5T3V0Q2hhbiA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF07CiAgICAgICAgICBwZUNoYW5EYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGEucGVDaGFubmVsRGF0YVtjaF07CgogICAgICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewoKICAgICAgICAgICAgICBpZiAocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID4gMCkgewoKICAgICAgICAgICAgICAgICAvKiBwZSBkaWZmZXJlbmNlIGZvciB0aGlzIHNmYiAqLwogICAgICAgICAgICAgICAgIGlmICggKHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXT09RkwyRlhDT05TVF9EQkwoLTEuMGYpKSB8fAogICAgICAgICAgICAgICAgICAgICAgKGRlbHRhUGU9PTApICkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICB0aHJGYWN0b3JMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgIC8qIG5ldyB0aHJlc2hvbGQgKi8KICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRtcCA9IENhbGNJbnZMZERhdGEoc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdICsgbm9ybUZhY3RvckxkRGF0YSAtIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAtIEZMMkZYQ09OU1RfREJMKChmbG9hdClMRF9EQVRBX1NISUZUL0xEX0RBVEFfU0NBTElORykpOwoKICAgICAgICAgICAgICAgICAgIC8qIGxpbWl0IHRockZhY3RvciB0byA2MGRCICovCiAgICAgICAgICAgICAgICAgICB0bXAgPSAoZGVsdGFQZTwwKSA/IHRtcCA6ICgtdG1wKTsKICAgICAgICAgICAgICAgICAgIHRockZhY3RvckxkRGF0YSA9IEZES21pbih0bXAsIEZMMkZYQ09OU1RfREJMKDIwLmYvTERfREFUQV9TQ0FMSU5HKSk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAvKiBuZXcgdGhyZXNob2xkICovCiAgICAgICAgICAgICAgICAgc2ZiVGhyTGREYXRhID0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl07CiAgICAgICAgICAgICAgICAgc2ZiRW5MZERhdGEgID0gcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKCiAgICAgICAgICAgICAgICAgaWYgKHRockZhY3RvckxkRGF0YSA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKICAgICAgICAgICAgICAgICAgIGlmKCBzZmJUaHJMZERhdGEgPiAoRkwyRlhDT05TVF9EQkwoLTEuZiktdGhyRmFjdG9yTGREYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YSArIHRockZhY3RvckxkRGF0YTsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuZik7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YSArIHRockZhY3RvckxkRGF0YTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIC8qIGF2b2lkIGhvbGUgKi8KICAgICAgICAgICAgICAgICBpZiAoIChzZmJUaHJSZWR1Y2VkTGREYXRhIC0gc2ZiRW5MZERhdGEgPiBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSkgJiYKICAgICAgICAgICAgICAgICAgICAgIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPT0gQUhfSU5BQ1RJVkUpICkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogc2ZiVGhyUmVkdWNlZCA9IG1heChwc3lPdXRDaGFuW2NoXS0+c2ZiTWluU25yW2ldICogc2ZiRW4sIHNmYlRocik7ICovCiAgICAgICAgICAgICAgICAgICAgaWYgKCBzZmJFbkxkRGF0YSA+IChzZmJUaHJMZERhdGEtcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0pICkgewogICAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBzZmJFbkxkRGF0YTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0FDVElWRTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19yZWR1Y2VNaW5TbnIKICAgIGRlc2NyaXB0aW9uOiAgaWYgdGhlIGRlc2lyZWQgcGUgY2FuIG5vdCBiZSByZWFjaGVkLCByZWR1Y2UgcGUgYnkKICAgICAgICAgICAgICAgICAgcmVkdWNpbmcgbWluU25yCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoQ0hBTk5FTF9NQVBQSU5HKiBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgYWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgZGVzaXJlZFBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiAgICAgICAgICAgICByZWRQZUdsb2JhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIHByb2Nlc3NFbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIGVsZW1lbnRPZmZzZXQpCgp7CiAgIElOVCBlbGVtZW50SWQ7CiAgIElOVCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0K3Byb2Nlc3NFbGVtZW50czsKCiAgIElOVCBuZXdHbG9iYWxQZSA9ICpyZWRQZUdsb2JhbDsKCiAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CiAgICAgICBJTlQgY2g7CiAgICAgICBJTlQgbWF4U2ZiUGVyR3JvdXBbMl07CiAgICAgICBJTlQgc2ZiQ250WzJdOwogICAgICAgSU5UIHNmYlBlckdyb3VwWzJdOwoKICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cC0xOwogICAgICAgICBzZmJDbnRbY2hdICAgICAgICAgPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CiAgICAgICAgIHNmYlBlckdyb3VwW2NoXSAgICA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOwogICAgICAgfQoKICAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwoKICAgICAgIGRvCiAgICAgICB7CiAgICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewoKICAgICAgICAgICAgSU5UIHNmYiwgc2ZiR3JwOwogICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOwogICAgICAgICAgICBJTlQgbm9SZWR1Y3Rpb24gPSAxOwoKICAgICAgICAgICAgaWYgKG1heFNmYlBlckdyb3VwW2NoXT49MCkgeyAgLyogc2ZiIGluIG5leHQgY2hhbm5lbCAqLwogICAgICAgICAgICAgIElOVCBkZWx0YVBlID0gMDsKICAgICAgICAgICAgICBzZmIgPSBtYXhTZmJQZXJHcm91cFtjaF0tLTsKICAgICAgICAgICAgICBub1JlZHVjdGlvbiA9IDA7CgogICAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgc2ZiQ250W2NoXTsgc2ZiR3JwICs9IHNmYlBlckdyb3VwW2NoXSkgewoKICAgICAgICAgICAgICAgIGlmIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUggJiYKICAgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA8IFNuckxkRmFjKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAvKiBpbmNyZWFzZSB0aHJlc2hvbGQgdG8gbmV3IG1pblNuciBvZiAxZEIgKi8KICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBTbnJMZEZhYzsKCiAgICAgICAgICAgICAgICAgIC8qIHNmYlRoclJlZHVjZWQgPSBtYXgocHN5T3V0Q2hhbltjaF0tPnNmYk1pblNucltpXSAqIHNmYkVuLCBzZmJUaHIpOyAqLwogICAgICAgICAgICAgICAgICBpZiAoIHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPj0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gLSBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSApIHsKCiAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSArIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdOwoKICAgICAgICAgICAgICAgICAgICAgLyogY2FsYyBuZXcgcGUgKi8KICAgICAgICAgICAgICAgICAgICAgLyogQzIgKyBDMypsZCgxLzAuOCkgPSAxLjUgKi8KICAgICAgICAgICAgICAgICAgICAgZGVsdGFQZSAtPSAocGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUKTsKCiAgICAgICAgICAgICAgICAgICAgIC8qIHNmYlBlID0gMS41ICogc2ZiTkxpbmVzICovCiAgICAgICAgICAgICAgICAgICAgIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0gPSAoMypwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYk5MaW5lc1tzZmJHcnArc2ZiXSkgPDwgKFBFX0NPTlNUUEFSVF9TSElGVC0xKTsKICAgICAgICAgICAgICAgICAgICAgZGVsdGFQZSArPSAocGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUKTsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgfSAvKiBzZmJHcnAgbG9vcCAqLwoKICAgICAgICAgICAgICBwZURhdGEtPnBlICs9IGRlbHRhUGU7CiAgICAgICAgICAgICAgcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5wZSArPSBkZWx0YVBlOwogICAgICAgICAgICAgIG5ld0dsb2JhbFBlICs9IGRlbHRhUGU7CgogICAgICAgICAgICAgIC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCiAgICAgICAgICAgICAgaWYgKHBlRGF0YS0+cGUgPD0gZGVzaXJlZFBlKSB7CiAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSAvKiBzZmIgPiAwICovCgogICAgICAgICAgICBpZiAoIChjaD09KGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsLTEpKSAmJiBub1JlZHVjdGlvbiApIHsKICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgIH0gLyogY2ggbG9vcCAqLwoKICAgICAgIH0gd2hpbGUgKCBwZURhdGEtPnBlID4gZGVzaXJlZFBlKTsKCiAgICAgfSAvKiAhPSBJRF9EU0UgKi8KICAgfSAvKiBlbGVtZW50IGxvb3AgKi8KCgpiYWlsOgogICAvKiB1cGRhdGUgZ2xvYmFsIFBFICovCiAgICpyZWRQZUdsb2JhbCA9IG5ld0dsb2JhbFBlOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hbGxvd01vcmVIb2xlcwogICAgZGVzY3JpcHRpb246ICBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHNvbWUgbW9yZSBzY2FsZWZhY3RvcgogICAgICAgICAgICAgICAgICBiYW5kcyBoYXZlIHRvIGJlIHF1YW50aXplZCB0byB6ZXJvCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMoQ0hBTk5FTF9NQVBQSU5HKiBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY0VsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiAgICAgQWRqVGhyU3RhdGVFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgYWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIGRlc2lyZWRQZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBjdXJyZW50UGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgcHJvY2Vzc0VsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIGVsZW1lbnRPZmZzZXQpCnsKICBJTlQgZWxlbWVudElkOwogIElOVCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0K3Byb2Nlc3NFbGVtZW50czsKICBJTlQgYWN0UGUgPSBjdXJyZW50UGU7CgogIGlmIChhY3RQZSA8PSBkZXNpcmVkUGUpIHsKICAgIHJldHVybjsgLyogbm90aGluZyB0byBkbyAqLwogIH0KCiAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewoKICAgICAgSU5UIGNoLCBzZmIsIHNmYkdycDsKCiAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwogICAgICBjb25zdCBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CgogICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbm5lbFsoMildID0ge05VTEx9OwogICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSA9IHtOVUxMfTsKCiAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CgogICAgICAgIC8qIGluaXQgcG9pbnRlcnMgKi8KICAgICAgICBxY091dENoYW5uZWxbY2hdID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF07CiAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOwoKICAgICAgICBmb3Ioc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICAgICAgZm9yIChzZmI9cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICAgICBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCtzZmJdID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIGZvciBNUyBhbGxvdyBob2xlIGluIHRoZSBjaGFubmVsIHdpdGggbGVzcyBlbmVyZ3kgKi8KICAgICAgaWYgKCBuQ2hhbm5lbHM9PTIgJiYgcHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlPT1wc3lPdXRDaGFubmVsWzFdLT5sYXN0V2luZG93U2VxdWVuY2UgKSB7CgogICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsWzBdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgIGZvcihzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbMF0tPnNmYlBlckdyb3VwKSB7CiAgICAgICAgICAgIGlmIChwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnRvb2xzSW5mby5tc01hc2tbc2ZiR3JwK3NmYl0pIHsKICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lMZF9MID0gcWNPdXRDaGFubmVsWzBdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lMZF9SID0gcWNPdXRDaGFubmVsWzFdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKCiAgICAgICAgICAgICAgLyogYWxsb3cgaG9sZSBpbiBzaWRlIGNoYW5uZWwgPyAqLwogICAgICAgICAgICAgIGlmICggKGFoRmxhZ1tlbGVtZW50SWRdWzFdW3NmYkdycCtzZmJdICE9IE5PX0FIKSAmJgogICAgICAgICAgICAgICAgICAgKCgoRkwyRlhDT05TVF9EQkwoLTAuMDIwNjU1MTI2NDhmKT4+MSkgKyAocWNPdXRDaGFubmVsWzBdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKQogICAgICAgICAgICAgICAgICAgICAgICA+ICgoRW5lcmd5TGRfUj4+MSkgLSAoRW5lcmd5TGRfTD4+MSkpKSApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVsxXVtzZmJHcnArc2ZiXSA9IE5PX0FIOwogICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBFbmVyZ3lMZF9SOwogICAgICAgICAgICAgICAgICBhY3RQZSAtPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbMV0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLyogYWxsb3cgaG9sZSBpbiBtaWQgY2hhbm5lbCA/ICovCiAgICAgICAgICAgICAgZWxzZSBpZiAoIChhaEZsYWdbZWxlbWVudElkXVswXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKCgoRkwyRlhDT05TVF9EQkwoLTAuMDIwNjU1MTI2NDhmKT4+MSkgKyAocWNPdXRDaGFubmVsWzFdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gKChFbmVyZ3lMZF9MPj4xKSAtIChFbmVyZ3lMZF9SPj4xKSkpICkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdWzBdW3NmYkdycCtzZmJdID0gTk9fQUg7CiAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoMC4wMTU2MjVmKSArIEVuZXJneUxkX0w7CiAgICAgICAgICAgICAgICAgIGFjdFBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVswXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUOwogICAgICAgICAgICAgIH0gLyogaWYgKGFoRmxhZykgKi8KICAgICAgICAgICAgfSAvKiBpZiBNUyAqLwogICAgICAgICAgfSAvKiBzZmJHcnAgKi8KICAgICAgICAgIGlmIChhY3RQZSA8PSBkZXNpcmVkUGUpIHsKICAgICAgICAgICAgcmV0dXJuOyAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwogICAgICAgICAgfQogICAgICAgIH0gLyogc2ZiICovCiAgICAgIH0gLyogTVMgcG9zc2libGUgPyAqLwoKICAgICAgLyogbW9yZSBob2xlcyBuZWNlc3Nhcnk/IHN1YnNlcXVlbnRseSBlcmFzZSBiYW5kcwogICAgICAgICBzdGFydGluZyB3aXRoIGxvdyBlbmVyZ2llcyAqLwogICAgICBJTlQgc3RhcnRTZmJbMl07CiAgICAgIEZJWFBfREJMIGF2Z0VuTEQ2NCxtaW5FbkxENjQ7CiAgICAgIElOVCBhaENudDsKICAgICAgRklYUF9EQkwgYWhDbnRMRDY0OwogICAgICBJTlQgZW5JZHg7CiAgICAgIEZJWFBfREJMIGVuTEQ2NFs0XTsKICAgICAgRklYUF9EQkwgYXZnRW47CgogICAgICAvKiBkbyBub3QgZ28gYmVsb3cgc3RhcnRTZmIgKi8KICAgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCiAgICAgICAgICBzdGFydFNmYltjaF0gPSBBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbS5zdGFydFNmYkw7CiAgICAgICAgZWxzZQogICAgICAgICAgc3RhcnRTZmJbY2hdID0gQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPmFoUGFyYW0uc3RhcnRTZmJTOwogICAgICB9CgogICAgICAvKiBjYWxjIGF2ZyBhbmQgbWluIGVuZXJnaWVzIG9mIGJhbmRzIHRoYXQgYXZvaWQgaG9sZXMgKi8KICAgICAgYXZnRW4gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgbWluRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIGFoQ250ID0gMDsKCiAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CgogICAgICAgIHNmYkdycD0wOwogICAgICAgIHNmYj1zdGFydFNmYltjaF07CgogICAgICAgIGRvIHsKICAgICAgICAgIGZvciAoOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICAgICBpZiAoKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSE9Tk9fQUgpICYmCiAgICAgICAgICAgICAgICAocWNPdXRDaGFubmVsW2NoXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPiBxY091dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pKXsKICAgICAgICAgICAgICBtaW5FbkxENjQgPSBmaXhNaW4obWluRW5MRDY0LHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk7CiAgICAgICAgICAgICAgYXZnRW4gKz0gcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdID4+IDY7CiAgICAgICAgICAgICAgYWhDbnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7CiAgICAgICAgICBzZmI9MDsKCiAgICAgICAgfSB3aGlsZSAoc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCk7CiAgICAgIH0KCiAgICAgIGlmICggKGF2Z0VuID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB8fCAoYWhDbnQgPT0gMCkgKSB7CiAgICAgICAgYXZnRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgYXZnRW5MRDY0ID0gQ2FsY0xkRGF0YShhdmdFbik7CiAgICAgICAgYWhDbnRMRDY0ID0gQ2FsY0xkSW50KGFoQ250KTsKICAgICAgICBhdmdFbkxENjQgPSBhdmdFbkxENjQgKyBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikgLSBhaENudExENjQ7IC8qIGNvbXBlbnNhdGUgc2hpZnQgd2l0aCA2ICovCiAgICAgIH0KCiAgICAgIC8qIGNhbGMgc29tZSBlbmVyZ3kgYm9yZGVycyBiZXR3ZWVuIG1pbkVuIGFuZCBhdmdFbiAqLwogICAgICAvKiBmb3IgKGVuSWR4PTA7IGVuSWR4PDQ7IGVuSWR4KyspICovCiAgICAgICAgLyogZW5bZW5JZHhdID0gbWluRW4gKiAoZmxvYXQpRkRLcG93KGF2Z0VuLyhtaW5FbitGTFRfTUlOKSwgKDIqZW5JZHgrMSkvNy4wZik7ICovCiAgICAgIGVuTEQ2NFswXSA9IG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQtbWluRW5MRDY0KSxGTDJGWENPTlNUX0RCTCgwLjE0Mjg1NzE0Mjg1ZikpOwogICAgICBlbkxENjRbMV0gPSBtaW5FbkxENjQgKyBmTXVsdCgoYXZnRW5MRDY0LW1pbkVuTEQ2NCksRkwyRlhDT05TVF9EQkwoMC40Mjg1NzE0Mjg1N2YpKTsKICAgICAgZW5MRDY0WzJdID0gbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NC1taW5FbkxENjQpLEZMMkZYQ09OU1RfREJMKDAuNzE0Mjg1NzE0MjhmKSk7CiAgICAgIGVuTEQ2NFszXSA9IG1pbkVuTEQ2NCArIChhdmdFbkxENjQtbWluRW5MRDY0KTsKCiAgICAgIGZvciAoZW5JZHg9MDsgZW5JZHg8NDsgZW5JZHgrKykgewogICAgICAgIElOVCBub1JlZHVjdGlvbiA9IDE7CgogICAgICAgIElOVCBtYXhTZmJQZXJHcm91cFsyXTsKICAgICAgICBJTlQgc2ZiQ250WzJdOwogICAgICAgIElOVCBzZmJQZXJHcm91cFsyXTsKCiAgICAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CiAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cC0xOwogICAgICAgICAgc2ZiQ250W2NoXSAgICAgICAgID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OwogICAgICAgICAgc2ZiUGVyR3JvdXBbY2hdICAgID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7CiAgICAgICAgfQoKICAgICAgICBkbyB7CgogICAgICAgICAgbm9SZWR1Y3Rpb24gPSAxOwoKICAgICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewoKICAgICAgICAgICAgSU5UIHNmYiwgc2ZiR3JwOwoKICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBsb3dlc3QgZW5lcmd5IGJvcmRlciBhdCBoaWdoZXN0IHNmYiAqLwogICAgICAgICAgICBpZiAobWF4U2ZiUGVyR3JvdXBbY2hdPj1zdGFydFNmYltjaF0pIHsgIC8qIHNmYiBpbiBuZXh0IGNoYW5uZWwgKi8KICAgICAgICAgICAgICBzZmIgPSBtYXhTZmJQZXJHcm91cFtjaF0tLTsKICAgICAgICAgICAgICBub1JlZHVjdGlvbiA9IDA7CgogICAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgc2ZiQ250W2NoXTsgc2ZiR3JwICs9IHNmYlBlckdyb3VwW2NoXSkgewogICAgICAgICAgICAgICAgLyogc2ZiIGVuZXJneSBiZWxvdyBib3JkZXIgPyAqLwogICAgICAgICAgICAgICAgaWYgKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAhPSBOT19BSCAmJiBxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPCBlbkxENjRbZW5JZHhdKSB7CiAgICAgICAgICAgICAgICAgIC8qIGFsbG93IGhvbGUgKi8KICAgICAgICAgICAgICAgICAgYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gTk9fQUg7CiAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBxY091dENoYW5uZWxbY2hdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICAgICAgYWN0UGUgLT0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gLyogc2ZiR3JwICAqLwoKICAgICAgICAgICAgICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47IC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IC8qIHNmYiA+IDAgKi8KICAgICAgICAgIH0gLyogY2ggbG9vcCAqLwoKICAgICAgICB9IHdoaWxlKCAobm9SZWR1Y3Rpb24gPT0gMCkgJiYgKGFjdFBlID4gZGVzaXJlZFBlKSApOwoKICAgICAgICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7CiAgICAgICAgICByZXR1cm47IC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCiAgICAgICAgfQoKICAgICAgfSAvKiBlbklkeCBsb29wICovCgogICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCiAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwoKfQoKLyogcmVzZXQgYXZvaWQgaG9sZSBmbGFncyBmcm9tIEFIX0FDVElWRSB0byBBSF9JTkFDVElWRSAgKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX3Jlc2V0QUhGbGFncyggVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW5uZWxbKDIpXSkKewogIGludCBjaCwgc2ZiLCBzZmJHcnA7CgogIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CiAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgaWYgKCBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID09IEFIX0FDVElWRSkgewogICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0lOQUNUSVZFOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKCnN0YXRpYyBGSVhQX0RCTCBDYWxjUmVkVmFsUG93ZXIoRklYUF9EQkwgbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGRlbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgIHNjYWxpbmcgKQp7CiAgICBGSVhQX0RCTCB2YWx1ZSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CgogICAgaWYgKG51bT49RkwyRlhDT05TVF9EQkwoMC5mKSkgewogICAgICB2YWx1ZSA9IGZEaXZOb3JtKCBudW0sIGRlbnVtLCBzY2FsaW5nKTsKICAgIH0KICAgIGVsc2UgewogICAgICB2YWx1ZSA9IC1mRGl2Tm9ybSggLW51bSwgZGVudW0sIHNjYWxpbmcpOwogICAgfQogICAgdmFsdWUgPSBmMlBvdyh2YWx1ZSwgKnNjYWxpbmcsIHNjYWxpbmcpOwogICAgKnNjYWxpbmcgPSBERlJBQ1RfQklUUy0xLSpzY2FsaW5nOwoKICAgIHJldHVybiB2YWx1ZTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlCmRlc2NyaXB0aW9uOiAgdHdvIGd1ZXNzZXMgZm9yIHRoZSByZWR1Y3Rpb24gdmFsdWUgYW5kIG9uZSBmaW5hbCBjb3JyZWN0aW9uIG9mIHRoZSB0aHJlc2hvbGRzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZShDSEFOTkVMX01BUFBJTkcqICBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogICAgICBBZGpUaHJTdGF0ZUVsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICBxY0VsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqICBwc3lPdXRFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgZGVzaXJlZFBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIHByb2Nlc3NFbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBlbGVtZW50T2Zmc2V0KQp7CiAgIEZJWFBfREJMIHJlZFZhbHVlWyg4KV07CiAgIFNDSEFSICAgIHJlZFZhbFNjYWxpbmdbKDgpXTsKICAgVUNIQVIgICAgcEFoRmxhZ1soOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKICAgRklYUF9EQkwgcFRockV4cFsoOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKICAgaW50IGl0ZXI7CgogICBJTlQgY29uc3RQYXJ0R2xvYmFsLCBub1JlZFBlR2xvYmFsLCBuQWN0aXZlTGluZXNHbG9iYWwsIHJlZFBlR2xvYmFsOwogICBjb25zdFBhcnRHbG9iYWwgPSBub1JlZFBlR2xvYmFsID0gbkFjdGl2ZUxpbmVzR2xvYmFsID0gcmVkUGVHbG9iYWwgPSAwOwoKICAgaW50IGVsZW1lbnRJZDsKCiAgIGludCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0K3Byb2Nlc3NFbGVtZW50czsKICAgaWYobkVsZW1lbnRzID4gY20tPm5FbGVtZW50cykgewogICAgIG5FbGVtZW50cyA9IGNtLT5uRWxlbWVudHM7CiAgIH0KCiAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgLyogUGFydCBJOiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcyBhbmQgdmFyaWFibGVzLi4uICovCiAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CiAgICAgICBQRV9EQVRBICpwZURhdGEgICAgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKCiAgICAgICAvKiB0aHJlc2hvbGRzIHRvIHRoZSBwb3dlciBvZiByZWRFeHAgKi8KICAgICAgIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKHBUaHJFeHBbZWxlbWVudElkXSwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwoKICAgICAgIC8qIGxvd2VyIHRoZSBtaW5TbnIgcmVxdWlyZW1lbnRzIGZvciBsb3cgZW5lcmdpZXMgY29tcGFyZWQgdG8gdGhlIGF2ZXJhZ2UKICAgICAgICAgIGVuZXJneSBpbiB0aGlzIGZyYW1lICovCiAgICAgICBGREthYWNFbmNfYWRhcHRNaW5TbnIocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCAmQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPm1pblNuckFkYXB0UGFyYW0sIG5DaGFubmVscyk7CgogICAgICAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwogICAgICAgRkRLYWFjRW5jX2luaXRBdm9pZEhvbGVGbGFnKHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcEFoRmxhZ1tlbGVtZW50SWRdLCAmcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT50b29sc0luZm8sIG5DaGFubmVscywgcGVEYXRhLCAmQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPmFoUGFyYW0pOwoKICAgICAgIC8qIHN1bSB1cCAqLwogICAgICAgY29uc3RQYXJ0R2xvYmFsICAgICs9IHBlRGF0YS0+Y29uc3RQYXJ0OwogICAgICAgbm9SZWRQZUdsb2JhbCAgICAgICs9IHBlRGF0YS0+cGU7CiAgICAgICBuQWN0aXZlTGluZXNHbG9iYWwgKz0gZml4TWF4KChJTlQpcGVEYXRhLT5uQWN0aXZlTGluZXMsIDEpOwoKICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwoKICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgLyogUGFydCBJSTogQ2FsY3VsYXRlIGJpdCBjb25zdW1wdGlvbiBvZiBpbml0aWFsIGJpdCBjb25zdHJhaW50cyBzZXR1cCAqLwogICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewogICAgICAgLyoKICAgICAgIHJlZFZhbCA9ICggMiBeICggKGNvbnN0UGFydEdsb2JhbC1kZXNpcmVkUGUpIC8gKGludlJlZEV4cCpuQWN0aXZlTGluZXNHbG9iYWwpICkKICAgICAgICAgICAgICAgIC0gMiBeICggKGNvbnN0UGFydEdsb2JhbC1ub1JlZFBlR2xvYmFsKSAvIChpbnZSZWRFeHAqbkFjdGl2ZUxpbmVzR2xvYmFsKSApICkKICAgICAgICovCgoKICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwoKICAgICAgIC8qIGZpcnN0IGd1ZXNzIG9mIHJlZHVjdGlvbiB2YWx1ZSAqLwogICAgICAgaW50IHNjYWxlMD0wLCBzY2FsZTE9MDsKICAgICAgIEZJWFBfREJMIHRtcDAgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydEdsb2JhbC1kZXNpcmVkUGUsIDQqbkFjdGl2ZUxpbmVzR2xvYmFsLCAmc2NhbGUwICk7CiAgICAgICBGSVhQX0RCTCB0bXAxID0gQ2FsY1JlZFZhbFBvd2VyKCBjb25zdFBhcnRHbG9iYWwtbm9SZWRQZUdsb2JhbCwgNCpuQWN0aXZlTGluZXNHbG9iYWwsICZzY2FsZTEgKTsKCiAgICAgICBpbnQgc2NhbE1pbiA9IEZES21pbihzY2FsZTAsIHNjYWxlMSktMTsKCiAgICAgICByZWRWYWx1ZVtlbGVtZW50SWRdICA9IHNjYWxlVmFsdWUodG1wMCwoc2NhbE1pbi1zY2FsZTApKSAtIHNjYWxlVmFsdWUodG1wMSwoc2NhbE1pbi1zY2FsZTEpKTsKICAgICAgIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSA9IHNjYWxNaW47CgogICAgICAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KICAgICAgIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzQ0JSKHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcEFoRmxhZ1tlbGVtZW50SWRdLCBwVGhyRXhwW2VsZW1lbnRJZF0sIG5DaGFubmVscywgcmVkVmFsdWVbZWxlbWVudElkXSwgcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdKTsKCiAgICAgICAvKiBwZSBhZnRlciBmaXJzdCBndWVzcyAqLwogICAgICAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKCiAgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOwogICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwogICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCgogICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAvKiBQYXJ0IElJSTogSXRlcmF0ZSB1bnRpbCBiaXQgY29uc3RyYWludHMgYXJlIG1ldCAqLwogICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICBpdGVyID0gMDsKICAgd2hpbGUgKChmaXhwX2FicyhyZWRQZUdsb2JhbCAtIGRlc2lyZWRQZSkgPiBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4wNWYpLGRlc2lyZWRQZSkpICYmIChpdGVyIDwgMSkpIHsKCiAgICAgSU5UIGRlc2lyZWRQZU5vQUhHbG9iYWw7CiAgICAgSU5UIHJlZFBlTm9BSEdsb2JhbCA9IDA7CiAgICAgSU5UIGNvbnN0UGFydE5vQUhHbG9iYWwgPSAwOwogICAgIElOVCBuQWN0aXZlTGluZXNOb0FIR2xvYmFsID0gMDsKCiAgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewoKICAgICAgICAgSU5UIHJlZFBlTm9BSCwgY29uc3RQYXJ0Tm9BSCwgbkFjdGl2ZUxpbmVzTm9BSDsKICAgICAgICAgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOwogICAgICAgICBQRV9EQVRBICpwZURhdGEgICAgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKCiAgICAgICAgIC8qIHBlIGZvciBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIGluYWN0aXZlICovCiAgICAgICAgIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlTm9BSCgmcmVkUGVOb0FILCAmY29uc3RQYXJ0Tm9BSCwgJm5BY3RpdmVMaW5lc05vQUgsCiAgICAgICAgICAgICAgICAgICAgcGVEYXRhLCBwQWhGbGFnW2VsZW1lbnRJZF0sIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKCiAgICAgICAgIHJlZFBlTm9BSEdsb2JhbCArPSByZWRQZU5vQUg7CiAgICAgICAgIGNvbnN0UGFydE5vQUhHbG9iYWwgKz0gY29uc3RQYXJ0Tm9BSDsKICAgICAgICAgbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCArPSBuQWN0aXZlTGluZXNOb0FIOwogICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCiAgICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwoKICAgICAvKiBDYWxjdWxhdGUgbmV3IHJlZFZhbCAuLi4gKi8KICAgICBpZihkZXNpcmVkUGUgPCByZWRQZUdsb2JhbCkgewoKICAgICAgIC8qIG5ldyBkZXNpcmVkIHBlIHdpdGhvdXQgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBhY3RpdmUgKi8KICAgICAgIGRlc2lyZWRQZU5vQUhHbG9iYWwgPSBkZXNpcmVkUGUgLSAocmVkUGVHbG9iYWwgLSByZWRQZU5vQUhHbG9iYWwpOwoKICAgICAgIC8qIGxpbWl0IGRlc2lyZWRQZU5vQUggdG8gcG9zaXRpdmUgdmFsdWVzLCBhcyB0aGUgUEUgY2FuIG5vdCBiZWNvbWUgbmVnYXRpdmUgKi8KICAgICAgIGRlc2lyZWRQZU5vQUhHbG9iYWwgPSBGREttYXgoMCxkZXNpcmVkUGVOb0FIR2xvYmFsKTsKCiAgICAgICAvKiBzZWNvbmQgZ3Vlc3MgKG9ubHkgaWYgdGhlcmUgYXJlIGJhbmRzIGxlZnQgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSkqLwogICAgICAgaWYgKG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPiAwKSB7CiAgICAgICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgcmVkVmFsICs9ICggMiBeICggKGNvbnN0UGFydE5vQUhHbG9iYWwtZGVzaXJlZFBlTm9BSEdsb2JhbCkgLyAoaW52UmVkRXhwKm5BY3RpdmVMaW5lc05vQUhHbG9iYWwpICkKICAgICAgICAgICAgICAgICAgICAgICAtIDIgXiAoIChjb25zdFBhcnROb0FIR2xvYmFsLXJlZFBlTm9BSEdsb2JhbCkgLyAoaW52UmVkRXhwKm5BY3RpdmVMaW5lc05vQUhHbG9iYWwpICkgKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGludCBzY2FsZTAgPSAwOwogICAgICAgICAgICAgaW50IHNjYWxlMSA9IDA7CgogICAgICAgICAgICAgRklYUF9EQkwgdG1wMCA9IENhbGNSZWRWYWxQb3dlciggY29uc3RQYXJ0Tm9BSEdsb2JhbC1kZXNpcmVkUGVOb0FIR2xvYmFsLCA0Km5BY3RpdmVMaW5lc05vQUhHbG9iYWwsICZzY2FsZTAgKTsKICAgICAgICAgICAgIEZJWFBfREJMIHRtcDEgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydE5vQUhHbG9iYWwtcmVkUGVOb0FIR2xvYmFsLCA0Km5BY3RpdmVMaW5lc05vQUhHbG9iYWwsICZzY2FsZTEgKTsKCiAgICAgICAgICAgICBpbnQgc2NhbE1pbiA9IEZES21pbihzY2FsZTAsIHNjYWxlMSktMTsKCiAgICAgICAgICAgICB0bXAwID0gc2NhbGVWYWx1ZSh0bXAwLChzY2FsTWluLXNjYWxlMCkpIC0gc2NhbGVWYWx1ZSh0bXAxLChzY2FsTWluLXNjYWxlMSkpOwogICAgICAgICAgICAgc2NhbGUwID0gc2NhbE1pbjsKCiAgICAgICAgICAgICAvKiBvbGQgcmVkdWN0aW9uIHZhbHVlICovCiAgICAgICAgICAgICB0bXAxID0gcmVkVmFsdWVbZWxlbWVudElkXTsKICAgICAgICAgICAgIHNjYWxlMSA9IHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXTsKCiAgICAgICAgICAgICBzY2FsTWluID0gZml4TWluKHNjYWxlMCxzY2FsZTEpLTE7CgogICAgICAgICAgICAgLyogc3VtIHVwIG9sZCBhbmQgbmV3IHJlZHVjdGlvbiB2YWx1ZSAqLwogICAgICAgICAgICAgcmVkVmFsdWVbZWxlbWVudElkXSA9IHNjYWxlVmFsdWUodG1wMCwoc2NhbE1pbi1zY2FsZTApKSArIHNjYWxlVmFsdWUodG1wMSwoc2NhbE1pbi1zY2FsZTEpKTsKICAgICAgICAgICAgIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSA9IHNjYWxNaW47CgogICAgICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwogICAgICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCiAgICAgICB9IC8qIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPiAwICovCiAgICAgfQogICAgIGVsc2UgewogICAgICAgIC8qIGRlc2lyZWRQZSA+PSByZWRQZUdsb2JhbCAqLwogICAgICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgICAgICAgIElOVCByZWRWYWxfc2NhbGUgPSAwOwogICAgICAgICAgICBGSVhQX0RCTCB0bXAgPSBmRGl2Tm9ybSgoRklYUF9EQkwpcmVkUGVHbG9iYWwsIChGSVhQX0RCTClkZXNpcmVkUGUsICZyZWRWYWxfc2NhbGUpOwoKICAgICAgICAgICAgLyogcmVkVmFsICo9IHJlZFBlR2xvYmFsL2Rlc2lyZWRQZTsgKi8KICAgICAgICAgICAgcmVkVmFsdWVbZWxlbWVudElkXSA9IGZNdWx0KHJlZFZhbHVlW2VsZW1lbnRJZF0sIHRtcCk7CiAgICAgICAgICAgIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSAtPSByZWRWYWxfc2NhbGU7CgogICAgICAgICAgICBGREthYWNFbmNfcmVzZXRBSEZsYWdzKHBBaEZsYWdbZWxlbWVudElkXSwgY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCk7CiAgICAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KICAgICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCiAgICAgfQoKICAgICByZWRQZUdsb2JhbCA9IDA7CiAgICAgLyogQ2FsY3VsYXRlIG5ldyByZWRWYWwncyBQRS4uLiAqLwogICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKICAgICAgICAgUEVfREFUQSAqcGVEYXRhICAgID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CgogICAgICAgICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwogICAgICAgICBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUihxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHBBaEZsYWdbZWxlbWVudElkXSwgcFRockV4cFtlbGVtZW50SWRdLCBuQ2hhbm5lbHMsIHJlZFZhbHVlW2VsZW1lbnRJZF0sIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSk7CgogICAgICAgICAvKiBwZSBhZnRlciBzZWNvbmQgZ3Vlc3MgKi8KICAgICAgICAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKICAgICAgICAgcmVkUGVHbG9iYWwgKz0gcGVEYXRhLT5wZTsKCiAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCgogICAgIGl0ZXIrKzsKICAgfSAvKiBFT0Ygd2hpbGUgKi8KCgogICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgIC8qIFBhcnQgSVY6IGlmIHN0aWxsIHJlcXVpcmVkLCBmdXJ0aGVyIHJlZHVjZSBjb25zdHJhaW50cyAgKi8KICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAvKiAgICAgICAgICAgICAgICAgIDEuMCogICAgICAgIDEuMTUqICAgICAgIDEuMjAqCiAgICAqICAgICAgICAgICAgICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlCiAgICAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKICAgICogLi4uWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYfCAgICAgICAgICAgfAogICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8WFhYWFhYWFhYWFguLi4KICAgICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfFhYWFhYWFhYWFhYfAogICAgKiAgICAgICAgICAgIC0tLSBBIC0tLSAgICAgICAgICB8IC0tLSBCIC0tLSB8IC0tLSBDIC0tLQogICAgKgogICAgKiAoWCk6IHJlZFBlR2xvYmFsCiAgICAqIChBKTogRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2goKQogICAgKiAoQik6IEZES2FhY0VuY19hbGxvd01vcmVIb2xlcygpCiAgICAqIChDKTogRkRLYWFjRW5jX3JlZHVjZU1pblNucigpCiAgICovCgogICAvKiBjb3JyZWN0IHRocmVzaG9sZHMgdG8gZ2V0IGNsb3NlciB0byB0aGUgZGVzaXJlZCBwZSAqLwogICBpZiAoIHJlZFBlR2xvYmFsID4gZGVzaXJlZFBlICkgewogICAgIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKGNtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsIHBBaEZsYWcsIHBUaHJFeHAsIHJlZFZhbHVlLCByZWRWYWxTY2FsaW5nLAogICAgICAgICAgICAgICAgICAgZGVzaXJlZFBlIC0gcmVkUGVHbG9iYWwsIHByb2Nlc3NFbGVtZW50cywgZWxlbWVudE9mZnNldCk7CgogICAgIC8qIHVwZGF0ZSBQRSAqLwogICAgIHJlZFBlR2xvYmFsID0gMDsKICAgICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CgogICAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CiAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwoKICAgICAgICAgLyogcGUgYWZ0ZXIgY29ycmVjdFRocmVzaCAqLwogICAgICAgICBGREthYWNFbmNfY2FsY1BlKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcGVEYXRhLCBuQ2hhbm5lbHMpOwogICAgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOwoKICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwogICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KICAgfQoKICAgaWYgKCByZWRQZUdsb2JhbCA+IGRlc2lyZWRQZSApIHsKICAgICAvKiByZWR1Y2UgcGUgYnkgcmVkdWNpbmcgbWluU25yIHJlcXVpcmVtZW50cyAqLwogICAgIEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoY20sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwgcEFoRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4xNWYpLGRlc2lyZWRQZSkgKyBkZXNpcmVkUGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZFBlR2xvYmFsLCBwcm9jZXNzRWxlbWVudHMsIGVsZW1lbnRPZmZzZXQpOwoKICAgICAvKiByZWR1Y2UgcGUgYnkgYWxsb3dpbmcgYWRkaXRpb25hbCBzcGVjdHJhbCBob2xlcyAqLwogICAgIEZES2FhY0VuY19hbGxvd01vcmVIb2xlcyhjbSwgcWNFbGVtZW50LCBwc3lPdXRFbGVtZW50LCBBZGpUaHJTdGF0ZUVsZW1lbnQsIHBBaEZsYWcsCiAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFBlLCByZWRQZUdsb2JhbCwgcHJvY2Vzc0VsZW1lbnRzLCBlbGVtZW50T2Zmc2V0KTsKICAgfQoKfQoKLyogc2ltaWxhciB0byBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZSgpLCBmb3IgIFZCUi1tb2RlICovCnZvaWQgRkRLYWFjRW5jX0FkYXB0VGhyZXNob2xkc1ZCUihRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBBZGpUaHJTdGF0ZUVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICpwZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQp7CiAgIFVDSEFSICAgICgqcEFoRmxhZylbTUFYX0dST1VQRURfU0ZCXTsKICAgRklYUF9EQkwgKCpwVGhyRXhwKVtNQVhfR1JPVVBFRF9TRkJdOwoKICAgLyogYWxsb2NhdGUgc2NyYXRjaCBtZW1vcnkgKi8KICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9wQWhGbGFnLCBVQ0hBUiwgKDIpKk1BWF9HUk9VUEVEX1NGQikKICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9wVGhyRXhwLCBGSVhQX0RCTCwgKDIpKk1BWF9HUk9VUEVEX1NGQikKICAgcEFoRmxhZyA9IChVQ0hBUigqKVtNQVhfR1JPVVBFRF9TRkJdKV9wQWhGbGFnOwogICBwVGhyRXhwID0gKEZJWFBfREJMKCopW01BWF9HUk9VUEVEX1NGQl0pX3BUaHJFeHA7CgogICAvKiB0aHJlc2hvbGRzIHRvIHRoZSBwb3dlciBvZiByZWRFeHAgKi8KICAgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAocFRockV4cCwgcWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwoKICAgLyogbG93ZXIgdGhlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGxvdyBlbmVyZ2llcyBjb21wYXJlZCB0byB0aGUgYXZlcmFnZQogICAgICBlbmVyZ3kgaW4gdGhpcyBmcmFtZSAqLwogICBGREthYWNFbmNfYWRhcHRNaW5TbnIocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCAmQWRqVGhyU3RhdGVFbGVtZW50LT5taW5TbnJBZGFwdFBhcmFtLCBuQ2hhbm5lbHMpOwoKICAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwogICBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBwQWhGbGFnLCB0b29sc0luZm8sCiAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgcGVEYXRhLCAmQWRqVGhyU3RhdGVFbGVtZW50LT5haFBhcmFtKTsKCiAgIC8qIHJlZHVjZSB0aHJlc2hvbGRzICovCiAgIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzVkJSKHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgcEFoRmxhZywgcFRockV4cCwgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+dmJyUXVhbEZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVPbGQpOwoKICAgLyogZnJlZSBzY3JhdGNoIG1lbW9yeSAqLwogICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9wVGhyRXhwLCBGSVhQX0RCTCwgKDIpKk1BWF9HUk9VUEVEX1NGQikKICAgQ19BTExPQ19TQ1JBVENIX0VORChfcEFoRmxhZywgVUNIQVIsICgyKSpNQVhfR1JPVVBFRF9TRkIpCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY0JpdFNhdmUKICBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc2F2ZSwgc2VlIGZpZ3VyZSBiZWxvdwogIHJldHVybnM6CiAgaW5wdXQ6ICAgICAgICBwYXJhbWV0ZXJzIGFuZCBiaXRyZXMtZnVsbG5lc3MKICBvdXRwdXQ6ICAgICAgIHBlcmNlbnRhZ2Ugb2YgYml0IHNhdmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogICAgICAgIGJpdHNhdmUKICAgICAgICAgICAgICAgICAgICBtYXhCaXRTYXZlKCUpfCAgIGNsaXBMb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLVwtLS0tLS0tLS0tLS0tLT4gYml0cmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgbWluQml0U2F2ZSglKXwgICAgICAgICAgXC0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwSGlnaCAgICAgIG1heEJpdHJlcwoqLwpzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNCaXRTYXZlKEZJWFBfREJMIGZpbGxMZXZlbCwKICAgIGNvbnN0IEZJWFBfREJMIGNsaXBMb3csCiAgICBjb25zdCBGSVhQX0RCTCBjbGlwSGlnaCwKICAgIGNvbnN0IEZJWFBfREJMIG1pbkJpdFNhdmUsCiAgICBjb25zdCBGSVhQX0RCTCBtYXhCaXRTYXZlLAogICAgY29uc3QgRklYUF9EQkwgYml0c2F2ZV9zbG9wZSkKewogICAgRklYUF9EQkwgYml0c2F2ZTsKCiAgICBmaWxsTGV2ZWwgPSBmaXhNYXgoZmlsbExldmVsLCBjbGlwTG93KTsKICAgIGZpbGxMZXZlbCA9IGZpeE1pbihmaWxsTGV2ZWwsIGNsaXBIaWdoKTsKCiAgICBiaXRzYXZlID0gbWF4Qml0U2F2ZSAtIGZNdWx0KChmaWxsTGV2ZWwtY2xpcExvdyksIGJpdHNhdmVfc2xvcGUpOwoKICAgIHJldHVybiAoYml0c2F2ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jYWxjQml0U3BlbmQKICBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc3BlbmQsIHNlZSBmaWd1cmUgYmVsb3cKICByZXR1cm5zOgogIGlucHV0OiAgICAgICAgcGFyYW1ldGVycyBhbmQgYml0cmVzLWZ1bGxuZXNzCiAgb3V0cHV0OiAgICAgICBwZXJjZW50YWdlIG9mIGJpdCBzcGVuZAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNwZW5kICAgICAgY2xpcEhpZ2gKICAgICAgICAgICAgICAgICAgIG1heEJpdFNwZW5kKCUpfCAgICAgICAgICAvLS0tLS0tLS0tLS1tYXhCaXRyZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS8tLS0tLS0tLS0tLS0tLS0tLT4gYml0cmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAvCiAgICAgICAgICAgICAgICAgICBtaW5CaXRTcGVuZCglKXwtLS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwTG93CiovCnN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY0JpdFNwZW5kKEZJWFBfREJMIGZpbGxMZXZlbCwKICAgIGNvbnN0IEZJWFBfREJMIGNsaXBMb3csCiAgICBjb25zdCBGSVhQX0RCTCBjbGlwSGlnaCwKICAgIGNvbnN0IEZJWFBfREJMIG1pbkJpdFNwZW5kLAogICAgY29uc3QgRklYUF9EQkwgbWF4Qml0U3BlbmQsCiAgICBjb25zdCBGSVhQX0RCTCBiaXRzcGVuZF9zbG9wZSkKewogICAgRklYUF9EQkwgYml0c3BlbmQ7CgogICAgZmlsbExldmVsID0gZml4TWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7CiAgICBmaWxsTGV2ZWwgPSBmaXhNaW4oZmlsbExldmVsLCBjbGlwSGlnaCk7CgogICAgYml0c3BlbmQgPSBtaW5CaXRTcGVuZCArIGZNdWx0KGZpbGxMZXZlbC1jbGlwTG93LCBiaXRzcGVuZF9zbG9wZSk7CgogICAgcmV0dXJuIChiaXRzcGVuZCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYWRqdXN0UGVNaW5NYXgoKQogIGRlc2NyaXB0aW9uOiAgYWRqdXN0cyBwZU1pbiBhbmQgcGVNYXggcGFyYW1ldGVycyBvdmVyIHRpbWUKICByZXR1cm5zOgogIGlucHV0OiAgICAgICAgY3VycmVudCBwZSwgcGVNaW4sIHBlTWF4LCBiaXRyZXMgc2l6ZQogIG91dHB1dDogICAgICAgYWRqdXN0ZWQgcGVNaW4vcGVNYXgKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfYWRqdXN0UGVNaW5NYXgoY29uc3QgSU5UIGN1cnJQZSwKICAgIElOVCAgICAgICpwZU1pbiwKICAgIElOVCAgICAgICpwZU1heCkKewogIEZJWFBfREJMIG1pbkZhY0hpID0gRkwyRlhDT05TVF9EQkwoMC4zZiksIG1heEZhY0hpID0gKEZJWFBfREJMKU1BWFZBTF9EQkwsIG1pbkZhY0xvID0gRkwyRlhDT05TVF9EQkwoMC4xNGYpLCBtYXhGYWNMbyA9IEZMMkZYQ09OU1RfREJMKDAuMDdmKTsKICAgIElOVCBkaWZmOwoKICAgIElOVCBtaW5EaWZmX2ZpeCA9IGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjE2NjY2NjY2NjdmKSwgY3VyclBlKTsKCiAgICBpZiAoY3VyclBlID4gKnBlTWF4KQogICAgewogICAgICAgIGRpZmYgPSAoY3VyclBlLSpwZU1heCkgOwogICAgICAgICpwZU1pbiArPSBmTXVsdEkobWluRmFjSGksZGlmZik7CiAgICAgICAgKnBlTWF4ICs9IGZNdWx0SShtYXhGYWNIaSxkaWZmKTsKICAgIH0KICAgIGVsc2UgaWYgKGN1cnJQZSA8ICpwZU1pbikKICAgIHsKICAgICAgICBkaWZmID0gKCpwZU1pbi1jdXJyUGUpIDsKICAgICAgICAqcGVNaW4gLT0gZk11bHRJKG1pbkZhY0xvLGRpZmYpOwogICAgICAgICpwZU1heCAtPSBmTXVsdEkobWF4RmFjTG8sZGlmZik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgKnBlTWluICs9IGZNdWx0SShtaW5GYWNIaSwgKGN1cnJQZSAtICpwZU1pbikpOwogICAgICAgICpwZU1heCAtPSBmTXVsdEkobWF4RmFjTG8sICgqcGVNYXggLSBjdXJyUGUpKTsKICAgIH0KCiAgICBpZiAoKCpwZU1heCAtICpwZU1pbikgPCBtaW5EaWZmX2ZpeCkKICAgIHsKICAgICAgICBJTlQgcGVNYXhfZml4ID0gKnBlTWF4LCBwZU1pbl9maXggPSAqcGVNaW47CiAgICAgICAgRklYUF9EQkwgcGFydExvX2ZpeCwgcGFydEhpX2ZpeDsKCiAgICAgICAgcGFydExvX2ZpeCA9IChGSVhQX0RCTClmaXhNYXgoMCwgY3VyclBlIC0gcGVNaW5fZml4KTsKICAgICAgICBwYXJ0SGlfZml4ID0gKEZJWFBfREJMKWZpeE1heCgwLCBwZU1heF9maXggLSBjdXJyUGUpOwoKICAgICAgICBwZU1heF9maXggPSAoSU5UKShjdXJyUGUgKyBmTXVsdEkoZkRpdk5vcm0ocGFydEhpX2ZpeCwgKHBhcnRMb19maXgrcGFydEhpX2ZpeCkpLCBtaW5EaWZmX2ZpeCkpOwogICAgICAgIHBlTWluX2ZpeCA9IChJTlQpKGN1cnJQZSAtIGZNdWx0SShmRGl2Tm9ybShwYXJ0TG9fZml4LCAocGFydExvX2ZpeCtwYXJ0SGlfZml4KSksIG1pbkRpZmZfZml4KSk7CiAgICAgICAgcGVNaW5fZml4ID0gZml4TWF4KDAsIHBlTWluX2ZpeCk7CgogICAgICAgICpwZU1heCA9IHBlTWF4X2ZpeDsKICAgICAgICAqcGVNaW4gPSBwZU1pbl9maXg7CiAgICB9Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIGZ1bmN0aW9ubmFtZTogQml0cmVzQ2FsY0JpdEZhYwogIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlcyBmYWN0b3Igb2Ygc3BlbmRpbmcgYml0cyBmb3Igb25lIGZyYW1lCiAgMS4wIDogdGFrZSBhbGwgZnJhbWUgZHlucGFydCBiaXRzCiAgPjEuMCA6IHRha2UgYWxsIGZyYW1lIGR5bnBhcnQgYml0cyArIGJpdHJlcwogIDwxLjAgOiBwdXQgYml0cyBpbiBiaXRyZXNlcnZvaXIKICByZXR1cm5zOiAgICAgIEJpdEZhYwogIGlucHV0OiAgICAgICAgYml0cmVzLWZ1bGxuZXNzLCBwZSwgYmxvY2tUeXBlLCBwYXJhbWV0ZXItc2V0dGluZ3MKICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICAgICAgICAgICAgICAgICAgICAgYml0ZmFjKCUpICAgICAgICAgICAgcGVtYXgKICAgICAgICAgICAgICAgICAgIGJpdHNwZW5kKCUpICAgfCAgICAgICAgICAvLS0tLS0tLS0tLS1tYXhCaXRyZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS8tLS0tLS0tLS0tLS0tLS0tLT4gcGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIC8KICAgICAgICAgICAgICAgICAgIGJpdHNhdmUoJSkgICAgfC0tLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1pbgoqLwoKc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19iaXRyZXNDYWxjQml0RmFjKGNvbnN0IElOVCAgICAgICBiaXRyZXNCaXRzLAogICAgY29uc3QgSU5UICAgICAgICBtYXhCaXRyZXNCaXRzLAogICAgY29uc3QgSU5UICAgICAgICBwZSwKICAgIGNvbnN0IElOVCAgICAgICAgbGFzdFdpbmRvd1NlcXVlbmNlLAogICAgY29uc3QgSU5UICAgICAgICBhdmdCaXRzLAogICAgY29uc3QgRklYUF9EQkwgICBtYXhCaXRGYWMsCiAgICBBREpfVEhSX1NUQVRFICAgKkFkalRociwKICAgIEFUU19FTEVNRU5UICAgICAqYWRqVGhyQ2hhbikKewogICAgQlJFU19QQVJBTSAqYnJlc1BhcmFtOwogICAgSU5UIHBleDsKCiAgICBJTlQgcW1pbiwgcWJyLCBxYnJlcywgcW1icjsKICAgIEZJWFBfREJMIGJpdFNhdmUsIGJpdFNwZW5kOwoKICAgIEZJWFBfREJMIGJpdHJlc0ZhY19maXgsIHRtcF9jc3QsIHRtcF9maXg7CiAgICBGSVhQX0RCTCBwZV9wZXJzLCBiaXRzX3JhdGlvLCBtYXhCclZhbDsKICAgIEZJWFBfREJMIGJpdHNhdmVfc2xvcGUsIGJpdHNwZW5kX3Nsb3BlLCBtYXhCaXRGYWNfdG1wOwogICAgRklYUF9EQkwgZmlsbExldmVsX2ZpeCA9IChGSVhQX0RCTCkweDdmZmZmZmZmOwogICAgRklYUF9EQkwgVU5JVFkgPSAoRklYUF9EQkwpMHg3ZmZmZmZmZjsKICAgIEZJWFBfREJMIFBPSU5UNyA9IChGSVhQX0RCTCkweDU5OTk5OTlBOwoKICAgIGlmIChtYXhCaXRyZXNCaXRzID4gYml0cmVzQml0cykgewogICAgICBmaWxsTGV2ZWxfZml4ID0gZkRpdk5vcm0oYml0cmVzQml0cywgbWF4Qml0cmVzQml0cyk7CiAgICB9CgogICAgaWYgKGxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCiAgICB7CiAgICAgICAgYnJlc1BhcmFtID0gJihBZGpUaHItPmJyZXNQYXJhbUxvbmcpOwogICAgICAgIGJpdHNhdmVfc2xvcGUgPSAoRklYUF9EQkwpMHgzQkJCQkJCQzsKICAgICAgICBiaXRzcGVuZF9zbG9wZSA9IChGSVhQX0RCTCkweDU1NTU1NTU1OwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJyZXNQYXJhbSA9ICYoQWRqVGhyLT5icmVzUGFyYW1TaG9ydCk7CiAgICAgICAgYml0c2F2ZV9zbG9wZSA9IChGSVhQX0RCTCkweDJFOEJBMkU5OwogICAgICAgIGJpdHNwZW5kX3Nsb3BlID0gKEZJWFBfREJMKTB4N2ZmZmZmZmY7CiAgICB9CgogICAgcGV4ID0gZml4TWF4KHBlLCBhZGpUaHJDaGFuLT5wZU1pbik7CiAgICBwZXggPSBmaXhNaW4ocGV4LCBhZGpUaHJDaGFuLT5wZU1heCk7CgogICAgYml0U2F2ZSA9IEZES2FhY0VuY19jYWxjQml0U2F2ZShmaWxsTGV2ZWxfZml4LAogICAgICAgIGJyZXNQYXJhbS0+Y2xpcFNhdmVMb3csIGJyZXNQYXJhbS0+Y2xpcFNhdmVIaWdoLAogICAgICAgIGJyZXNQYXJhbS0+bWluQml0U2F2ZSwgYnJlc1BhcmFtLT5tYXhCaXRTYXZlLCBiaXRzYXZlX3Nsb3BlKTsKCiAgICBiaXRTcGVuZCA9IEZES2FhY0VuY19jYWxjQml0U3BlbmQoZmlsbExldmVsX2ZpeCwKICAgICAgICBicmVzUGFyYW0tPmNsaXBTcGVuZExvdywgYnJlc1BhcmFtLT5jbGlwU3BlbmRIaWdoLAogICAgICAgIGJyZXNQYXJhbS0+bWluQml0U3BlbmQsIGJyZXNQYXJhbS0+bWF4Qml0U3BlbmQsIGJpdHNwZW5kX3Nsb3BlKTsKCiAgICBwZV9wZXJzID0gKHBleCA+IGFkalRockNoYW4tPnBlTWluKSA/IGZEaXZOb3JtKHBleCAtIGFkalRockNoYW4tPnBlTWluLCBhZGpUaHJDaGFuLT5wZU1heCAtIGFkalRockNoYW4tPnBlTWluKSA6IDA7CiAgICB0bXBfZml4ID0gZk11bHQoKChGSVhQX0RCTCliaXRTcGVuZCArIChGSVhQX0RCTCliaXRTYXZlKSwgcGVfcGVycyk7CiAgICBiaXRyZXNGYWNfZml4ID0gKFVOSVRZPj4xKSAtICgoRklYUF9EQkwpYml0U2F2ZT4+MSkgKyAodG1wX2ZpeD4+MSk7IHFicmVzID0gKERGUkFDVF9CSVRTLTIpOwoKICAgIC8qIChmbG9hdCliaXRyZXNCaXRzLyhmbG9hdClhdmdCaXRzICovCiAgICBiaXRzX3JhdGlvID0gZkRpdk5vcm0oYml0cmVzQml0cywgYXZnQml0cywgJnFicik7CiAgICBxYnIgPSBERlJBQ1RfQklUUy0xLXFicjsKCiAgICAvKiBBZGQgMC43IGluIHEzMSB0byBiaXRzX3JhdGlvIGluIHFiciAqLwogICAgLyogMC43ZiArIChmbG9hdCliaXRyZXNCaXRzLyhmbG9hdClhdmdCaXRzICovCiAgICBxbWluID0gZml4TWluKHFiciwgKERGUkFDVF9CSVRTLTEpKTsKICAgIGJpdHNfcmF0aW8gPSBiaXRzX3JhdGlvID4+IChxYnIgLSBxbWluKTsKICAgIHRtcF9jc3QgPSBQT0lOVDcgPj4gKChERlJBQ1RfQklUUy0xKSAtIHFtaW4pOwogICAgbWF4QnJWYWwgPSAoYml0c19yYXRpbz4+MSkgKyAodG1wX2NzdD4+MSk7IHFtYnIgPSBxbWluIC0gMTsKCiAgICAvKiBiaXRyZXNGYWNfZml4ID0gZml4TWluKGJpdHJlc0ZhY19maXgsIDAuNyArIGJpdHJlc0JpdHMvYXZnQml0cyk7ICovCiAgICBiaXRyZXNGYWNfZml4ID0gYml0cmVzRmFjX2ZpeCA+PiAocWJyZXMgLSBxbWJyKTsgcWJyZXMgPSBxbWJyOwogICAgYml0cmVzRmFjX2ZpeCA9IGZpeE1pbihiaXRyZXNGYWNfZml4LCBtYXhCclZhbCk7CgogICAgLyogQ29tcGFyZSB3aXRoIG1heEJpdEZhYyAqLwogICAgcW1pbiA9IGZpeE1pbihRX0JJVEZBQywgcWJyZXMpOwogICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPj4gKHFicmVzIC0gcW1pbik7CiAgICBtYXhCaXRGYWNfdG1wID0gbWF4Qml0RmFjID4+IChRX0JJVEZBQyAtIHFtaW4pOwogICAgaWYobWF4Qml0RmFjX3RtcCA8IGJpdHJlc0ZhY19maXgpCiAgICB7CiAgICAgICAgYml0cmVzRmFjX2ZpeCA9IG1heEJpdEZhYzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZihxbWluIDwgUV9CSVRGQUMpCiAgICAgICAgewogICAgICAgICAgICBiaXRyZXNGYWNfZml4ID0gYml0cmVzRmFjX2ZpeCA8PCAoUV9CSVRGQUMtcW1pbik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGJpdHJlc0ZhY19maXggPSBiaXRyZXNGYWNfZml4ID4+IChxbWluLVFfQklURkFDKTsKICAgICAgICB9CiAgICB9CgogICAgRkRLYWFjRW5jX2FkanVzdFBlTWluTWF4KHBlLCAmYWRqVGhyQ2hhbi0+cGVNaW4sICZhZGpUaHJDaGFuLT5wZU1heCk7CgogICAgcmV0dXJuIGJpdHJlc0ZhY19maXg7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQWRqVGhyTmV3CmRlc2NyaXB0aW9uOiAgYWxsb2NhdGUgQURKX1RIUl9TVEFURQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSU5UIEZES2FhY0VuY19BZGpUaHJOZXcoQURKX1RIUl9TVEFURSoqIHBoQWRqVGhyLAogICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgbkVsZW1lbnRzKQp7CiAgICBJTlQgZXJyID0gMDsKICAgIElOVCBpOwogICAgQURKX1RIUl9TVEFURSogaEFkalRociA9IEdldFJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkKCk7CiAgICBpZiAoaEFkalRocj09TlVMTCkgewogICAgICAgIGVyciA9IDE7CiAgICAgICAgZ290byBiYWlsOwogICAgfQoKICAgIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CiAgICAgICAgaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldID0gIEdldFJhbV9hYWNFbmNfQWRqVGhyU3RhdGVFbGVtZW50KGkpOwogICAgICAgIGlmIChoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV09PU5VTEwpIHsKICAgICAgICAgIGVyciA9IDE7CiAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgfQogICAgfQoKYmFpbDoKICAgICpwaEFkalRociA9IGhBZGpUaHI7CiAgICByZXR1cm4gZXJyOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRockluaXQKZGVzY3JpcHRpb246ICBpbml0aWFsaXplIEFESl9USFJfU1RBVEUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgRkRLYWFjRW5jX0FkalRockluaXQoCiAgICAgICAgQURKX1RIUl9TVEFURSAgICpoQWRqVGhyLAogICAgICAgIGNvbnN0IElOVCAgICAgICBtZWFuUGUsCiAgICAgICAgRUxFTUVOVF9CSVRTICAgICplbEJpdHNbKDgpXSwKICAgICAgICBJTlQgICAgICAgICAgICAgaW52UXVhbnQsCiAgICAgICAgSU5UICAgICAgICAgICAgIG5FbGVtZW50cywKICAgICAgICBJTlQgICAgICAgICAgICAgbkNoYW5uZWxzRWZmLAogICAgICAgIElOVCAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgIElOVCAgICAgICAgICAgICBhZHZhbmNlZEJpdHNUb1BlLAogICAgICAgIEZJWFBfREJMICAgICAgICB2YnJRdWFsRmFjdG9yCiAgICAgICAgKQp7CiAgSU5UIGk7CgogIEZJWFBfREJMIFBPSU5UOCA9IEZMMkZYQ09OU1RfREJMKDAuOGYpOwogIEZJWFBfREJMIFBPSU5UNiA9IEZMMkZYQ09OU1RfREJMKDAuNmYpOwoKICAvKiBjb21tb24gZm9yIGFsbCBlbGVtZW50czogKi8KICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLwogIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVMb3cgICA9IChGSVhQX0RCTCkweDE5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlSGlnaCAgPSAoRklYUF9EQkwpMHg3OTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC45NWYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWluQml0U2F2ZSAgICA9IChGSVhQX0RCTCkweGY5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgtMC4wNWYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWF4Qml0U2F2ZSAgICA9IChGSVhQX0RCTCkweDI2NjY2NjY2OyAvKiBGTDJGWENPTlNUX0RCTCgwLjNmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTcGVuZExvdyAgPSAoRklYUF9EQkwpMHgxOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRIaWdoID0gKEZJWFBfREJMKTB4Nzk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuOTVmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNwZW5kICAgPSAoRklYUF9EQkwpMHhmMzMzMzMzMzsgLyogRkwyRlhDT05TVF9EQkwoLTAuMTBmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNwZW5kICAgPSAoRklYUF9EQkwpMHgzMzMzMzMzMzsgLyogRkwyRlhDT05TVF9EQkwoMC40Zik7ICovCgogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTYXZlTG93ICAgPSAoRklYUF9EQkwpMHgxOTk5OTlhMDsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVIaWdoICA9IChGSVhQX0RCTCkweDVmZmZmZmZmOyAvKiBGTDJGWENPTlNUX0RCTCgwLjc1Zik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWluQml0U2F2ZSAgICA9IChGSVhQX0RCTCkweDAwMDAwMDAwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjBmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTYXZlICAgID0gKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZExvdyAgPSAoRklYUF9EQkwpMHgxOTk5OTlhMDsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kSGlnaCA9IChGSVhQX0RCTCkweDVmZmZmZmZmOyAvKiBGTDJGWENPTlNUX0RCTCgwLjc1Zik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWluQml0U3BlbmQgICA9IChGSVhQX0RCTCkweGY5OTk5OTk4OyAvKiBGTDJGWENPTlNUX0RCTCgtMC4wNWYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1heEJpdFNwZW5kICAgPSAoRklYUF9EQkwpMHg0MDAwMDAwMDsgLyogRkwyRlhDT05TVF9EQkwoMC41Zik7ICovCgogIC8qIHNwZWNpZmljIGZvciBlYWNoIGVsZW1lbnQ6ICovCiAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKICAgIEFUU19FTEVNRU5UKiBhdHNFbGVtID0gaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldOwogICAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSA9ICZhdHNFbGVtLT5taW5TbnJBZGFwdFBhcmFtOwogICAgSU5UIGNoQml0cmF0ZSA9IGVsQml0c1tpXS0+Y2hCaXRyYXRlRWw7CgogICAgLyogcGFyYW1ldGVycyBmb3IgYml0cmVzIGNvbnRyb2wgKi8KICAgIGF0c0VsZW0tPnBlTWluID0gZk11bHRJKFBPSU5UOCwgbWVhblBlKSA+PiAxOwogICAgYXRzRWxlbS0+cGVNYXggPSBmTXVsdEkoUE9JTlQ2LCBtZWFuUGUpOwoKICAgIC8qIGZvciB1c2UgaW4gRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNWQlIgKi8KICAgIGF0c0VsZW0tPmNoYW9zTWVhc3VyZU9sZCA9IEZMMkZYQ09OU1RfREJMKDAuM2YpOwoKICAgIC8qIGFkZGl0aW9uYWwgcGUgb2Zmc2V0IHRvIGNvcnJlY3QgcGUyYml0cyBmb3IgbG93IGJpdHJhdGVzICovCiAgICBhdHNFbGVtLT5wZU9mZnNldCA9IDA7CgogICAgLyogdmJyIGluaXRpYWxpc2F0aW9uICovCiAgICBhdHNFbGVtLT52YnJRdWFsRmFjdG9yID0gdmJyUXVhbEZhY3RvcjsKICAgIGlmIChjaEJpdHJhdGUgPCAzMjAwMCkKICAgIHsKICAgICAgYXRzRWxlbS0+cGVPZmZzZXQgPSBmaXhNYXgoNTAsIDEwMC1mTXVsdEkoKEZJWFBfREJMKTB4NjY2NjY3LCBjaEJpdHJhdGUpKTsKICAgIH0KCiAgICAvKiBhdm9pZCBob2xlIHBhcmFtZXRlcnMgKi8KICAgIGlmIChjaEJpdHJhdGUgPiAyMDAwMCkgewogICAgICBhdHNFbGVtLT5haFBhcmFtLm1vZGlmeU1pblNuciA9IFRSVUU7CiAgICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJMID0gMTU7CiAgICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJTID0gMzsKICAgIH0KICAgIGVsc2UgewogICAgICBhdHNFbGVtLT5haFBhcmFtLm1vZGlmeU1pblNuciA9IEZBTFNFOwogICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiTCA9IDA7CiAgICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJTID0gMDsKICAgIH0KCiAgICAvKiBtaW5TbnIgYWRhcHRhdGlvbiAqLwogICAgbXNhUGFyYW0tPm1heFJlZCA9IEZMMkZYQ09OU1RfREJMKDAuMDAzOTA2MjVmKTsgLyogMC4yNWYvNjQuMGYgKi8KICAgIC8qIHN0YXJ0IGFkYXB0YXRpb24gb2YgbWluU25yIGZvciBhdmdFbi9zZmJFbiA+IHN0YXJ0UmF0aW8gKi8KICAgIG1zYVBhcmFtLT5zdGFydFJhdGlvID0gRkwyRlhDT05TVF9EQkwoMC4wNTE5MDUxMjY0OGYpOyAvKiBsZDY0KDEwLjBmKSAqLwogICAgLyogbWF4aW11bSBtaW5TbnIgcmVkdWN0aW9uIHRvIG1pblNucl5tYXhSZWQgaXMgcmVhY2hlZCBmb3IKICAgICAgIGF2Z0VuL3NmYkVuID49IG1heFJhdGlvICovCiAgICAvKiBtc2FQYXJhbS0+bWF4UmF0aW8gPSAxMDAwLjBmOyAqLwogICAgLyptc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSAoKGZsb2F0KTEuMGYgLSBtc2FQYXJhbS0+bWF4UmVkKSAvICgoZmxvYXQpMTAuMGYqbG9nMTAobXNhUGFyYW0tPnN0YXJ0UmF0aW8vbXNhUGFyYW0tPm1heFJhdGlvKS9sb2cxMCgyLjBmKSooZmxvYXQpMC4zMDEwMjk5OTU2Zik7Ki8KICAgIG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyA9IEZMMkZYQ09OU1RfREJMKC0wLjM3NWYpOyAvKiAtMC4wMzc1ZiAqIDEwLjBmICovCiAgICAvKm1zYVBhcmFtLT5yZWRPZmZzID0gKGZsb2F0KTEuMGYgLSBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgKiAoZmxvYXQpMTAuMGYgKiBsb2cxMChtc2FQYXJhbS0+c3RhcnRSYXRpbykvbG9nMTAoMi4wZikgKiAoZmxvYXQpMC4zMDEwMjk5OTU2ZjsqLwogICAgbXNhUGFyYW0tPnJlZE9mZnMgPSBGTDJGWENPTlNUX0RCTCgwLjAyMTQ4NDM3NSk7IC8qIDEuMzc1Zi82NC4wZiAqLwoKICAgIC8qIGluaXQgcGUgY29ycmVjdGlvbiAqLwogICAgYXRzRWxlbS0+cGVDb3JyZWN0aW9uRmFjdG9yX20gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsgLyogMS4wICovCiAgICBhdHNFbGVtLT5wZUNvcnJlY3Rpb25GYWN0b3JfZSA9IDE7CgogICAgYXRzRWxlbS0+ZHluQml0c0xhc3QgPSAtMTsKICAgIGF0c0VsZW0tPnBlTGFzdCA9IDA7CgogICAgLyogaW5pdCBiaXRzIHRvIHBlIGZhY3RvciAqLwoKICAgIC8qIGluaXQgYml0czJQZUZhY3RvciAqLwogICAgRkRLYWFjRW5jX0luaXRCaXRzMlBlRmFjdG9yKAogICAgICAgICAgICAgICZhdHNFbGVtLT5iaXRzMlBlRmFjdG9yX20sCiAgICAgICAgICAgICAgJmF0c0VsZW0tPmJpdHMyUGVGYWN0b3JfZSwKICAgICAgICAgICAgICBjaEJpdHJhdGUsICAgICAgIC8qIGJpdHJhdGUvY2hhbm5lbCovCiAgICAgICAgICAgICAgbkNoYW5uZWxzRWZmLCAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgIGFkdmFuY2VkQml0c1RvUGUsCiAgICAgICAgICAgICAgaW52UXVhbnQKICAgICAgICAgICAgICApOwoKICB9IC8qIGZvciBuRWxlbWVudHMgKi8KCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVDb3JyZWN0aW9uCiAgICBkZXNjcmlwdGlvbjogIGNhbGMgZGVzaXJlZCBwZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVDb3JyZWN0aW9uKAogICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgY29ycmVjdGlvbkZhY19tLAogICAgICAgIElOVCAqY29uc3QgICAgICAgICAgICAgICAgY29ycmVjdGlvbkZhY19lLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgcGVBY3QsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwZUxhc3QsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRzTGFzdCwKICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZQogICAgICAgICkKewogIGlmICggKGJpdHNMYXN0ID4gMCkgJiYgKHBlQWN0IDwgMS41ZipwZUxhc3QpICYmIChwZUFjdCA+IDAuN2YqcGVMYXN0KSAmJgogICAgICAgKEZES2FhY0VuY19iaXRzMnBlMihiaXRzTGFzdCwgZk11bHQoRkwyRlhDT05TVF9EQkwoMS4yZi8yLmYpLCBiaXRzMlBlRmFjdG9yX20pLCBiaXRzMlBlRmFjdG9yX2UrMSkgPiBwZUxhc3QpICYmCiAgICAgICAoRkRLYWFjRW5jX2JpdHMycGUyKGJpdHNMYXN0LCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjY1ZiksICAgIGJpdHMyUGVGYWN0b3JfbSksIGJpdHMyUGVGYWN0b3JfZSAgKSA8IHBlTGFzdCkgKQogIHsKICAgIEZJWFBfREJMIGNvcnJGYWMgPSAqY29ycmVjdGlvbkZhY19tOwoKICAgIGludCBzY2FsaW5nID0gMDsKICAgIEZJWFBfREJMIGRlbnVtID0gKEZJWFBfREJMKUZES2FhY0VuY19iaXRzMnBlMihiaXRzTGFzdCwgYml0czJQZUZhY3Rvcl9tLCBiaXRzMlBlRmFjdG9yX2UpOwogICAgRklYUF9EQkwgbmV3RmFjID0gZkRpdk5vcm0oKEZJWFBfREJMKXBlTGFzdCwgZGVudW0sICZzY2FsaW5nKTsKCiAgICAvKiBkZWFkIHpvbmUsIG5ld0ZhYyBhbmQgY29yckZhYyBhcmUgc2NhbGVkIGJ5IDAuNSAqLwogICAgaWYgKChGSVhQX0RCTClwZUxhc3QgPD0gZGVudW0pIHsgLyogcmF0aW8gPD0gMS5mICovCiAgICAgIG5ld0ZhYyA9IGZpeE1heChzY2FsZVZhbHVlKGZpeE1pbiggZk11bHQoRkwyRlhDT05TVF9EQkwoMS4xZi8yLmYpLCBuZXdGYWMpLCBzY2FsZVZhbHVlKEZMMkZYQ09OU1RfREJMKCAgMS5mLzIuZiksIC1zY2FsaW5nKSksIHNjYWxpbmcpLCBGTDJGWENPTlNUX0RCTCgwLjg1Zi8yLmYpICk7CiAgICB9CiAgICBlbHNlIHsgLyogcmF0aW8gPCAxLmYgKi8KICAgICBuZXdGYWMgPSBmaXhNYXgoIGZpeE1pbiggc2NhbGVWYWx1ZShmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmLzIuZiksIG5ld0ZhYyksIHNjYWxpbmcpLCBGTDJGWENPTlNUX0RCTCgxLjE1Zi8yLmYpICksIEZMMkZYQ09OU1RfREJMKCAgIDEuZi8yLmYpICk7CiAgICB9CgogICAgaWYgKCAgICgobmV3RmFjID4gRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpICYmIChjb3JyRmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpKQogICAgICAgIHx8ICgobmV3RmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpICYmIChjb3JyRmFjID4gRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpKSkKICAgIHsKICAgICAgY29yckZhYyA9IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpOwogICAgfQoKICAgIC8qIGZhc3RlciBhZGFwdGF0aW9uIHRvd2FyZHMgMS4wLCBzbG93ZXIgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiAqLwogICAgaWYgKCAoY29yckZhYyA8IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpICYmIG5ld0ZhYyA8IGNvcnJGYWMpCiAgICAgIHx8IChjb3JyRmFjID4gRkwyRlhDT05TVF9EQkwoMS5mLzIuZikgJiYgbmV3RmFjID4gY29yckZhYykgKQogICAgewogICAgICBjb3JyRmFjID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC44NWYpLCBjb3JyRmFjKSArIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMTVmKSwgbmV3RmFjKTsKICAgIH0KICAgIGVsc2UgewogICAgICBjb3JyRmFjID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksIGNvcnJGYWMpICsgZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zZiksIG5ld0ZhYyk7CiAgICB9CgogICAgY29yckZhYyA9IGZpeE1heCggZml4TWluKCBjb3JyRmFjLCBGTDJGWENPTlNUX0RCTCgxLjE1Zi8yLmYpICksIEZMMkZYQ09OU1RfREJMKDAuODUvMi5mKSApOwoKICAgICpjb3JyZWN0aW9uRmFjX20gPSBjb3JyRmFjOwogICAgKmNvcnJlY3Rpb25GYWNfZSA9IDE7CiAgfQogIGVsc2UgewogICAgKmNvcnJlY3Rpb25GYWNfbSA9IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpOwogICAgKmNvcnJlY3Rpb25GYWNfZSA9IDE7CiAgfQp9CgoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb25Mb3dCaXRSZXMoCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICBjb3JyZWN0aW9uRmFjX20sCiAgICAgICAgSU5UICpjb25zdCAgICAgICAgICAgICAgICBjb3JyZWN0aW9uRmFjX2UsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwZUxhc3QsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRzTGFzdCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHJlc0xldmVsLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAogICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9lCiAgICAgICAgKQp7CiAgLyogdHVuaW5nIHBhcmFtcyAqLwogIGNvbnN0IEZJWFBfREJMIGFtcCAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjAwNSk7CiAgY29uc3QgRklYUF9EQkwgbWF4RGlmZiA9IEZMMkZYQ09OU1RfREJMKDAuMjVmKTsKCiAgaWYgKGJpdHNMYXN0ID4gMCkgewoKICAgIC8qIEVzdGltYXRlIGRldmlhdGlvbiBvZiBncmFudGVkIGFuZCB1c2VkIGR5bmFtaWMgYml0cyBpbiBwcmV2aW91cyBmcmFtZSwgaW4gUEUgdW5pdHMgKi8KICAgIGNvbnN0IGludCBiaXRzQmFsTGFzdCA9IHBlTGFzdCAtIEZES2FhY0VuY19iaXRzMnBlMigKICAgICAgICAgIGJpdHNMYXN0LAogICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAogICAgICAgICAgYml0czJQZUZhY3Rvcl9lKTsKCiAgICAvKiByZXNlcnZlIG4gYml0cyBwZXIgY2hhbm5lbCAqLwogICAgaW50IGhlYWRyb29tID0gKGJpdHJlc0xldmVsPj01MCpuQ2hhbm5lbHMpID8gMCA6ICgxMDAqbkNoYW5uZWxzKTsKCiAgICAvKiBpbiBQRSB1bml0cyAqLwogICAgaGVhZHJvb20gPSBGREthYWNFbmNfYml0czJwZTIoCiAgICAgICAgICBoZWFkcm9vbSwKICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbSwKICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZSk7CgogICAgLyoKICAgICAqIGRpZmYgPSBhbXAgKiAoKGJpdHNCYWxMYXN0IC0gaGVhZHJvb20pIC8gKGJpdHJlc0xldmVsICsgaGVhZHJvb20pCiAgICAgKiBkaWZmID0gbWF4ICggbWluICggZGlmZiwgbWF4RGlmZiwgLW1heERpZmYpKSAvIDIKICAgICAqLwogICAgRklYUF9EQkwgZGVub21pbmF0b3IgPSAoRklYUF9EQkwpRkRLYWFjRW5jX2JpdHMycGUyKGJpdHJlc0xldmVsLCBiaXRzMlBlRmFjdG9yX20sIGJpdHMyUGVGYWN0b3JfZSkgKyAoRklYUF9EQkwpaGVhZHJvb207CgogICAgaW50IHNjYWxpbmcgPSAwOwogICAgRklYUF9EQkwgZGlmZiA9IChiaXRzQmFsTGFzdD49aGVhZHJvb20pCiAgICAgICAgID8gIGZNdWx0KGFtcCwgZkRpdk5vcm0oIChGSVhQX0RCTCkoYml0c0JhbExhc3QgLSBoZWFkcm9vbSksIGRlbm9taW5hdG9yLCAmc2NhbGluZykpCiAgICAgICAgIDogLWZNdWx0KGFtcCwgZkRpdk5vcm0oLShGSVhQX0RCTCkoYml0c0JhbExhc3QgLSBoZWFkcm9vbSksIGRlbm9taW5hdG9yLCAmc2NhbGluZykpIDsKCiAgICBzY2FsaW5nIC09IDE7IC8qIGRpdmlkZSBieSAyICovCgogICAgZGlmZiA9IChzY2FsaW5nPD0wKSA/IEZES21heCggRkRLbWluIChkaWZmPj4oLXNjYWxpbmcpLCBtYXhEaWZmPj4xKSwgLW1heERpZmY+PjEpCiAgICAgICAgICAgICAgICAgICAgICAgIDogRkRLbWF4KCBGREttaW4gKGRpZmYsIG1heERpZmY+PigxK3NjYWxpbmcpKSwgLW1heERpZmY+PigxK3NjYWxpbmcpKSA8PCBzY2FsaW5nOwoKICAgIC8qCiAgICAgKiBjb3JyRmFjICs9IGRpZmYKICAgICAqIGNvcnJGYWMgPSBtYXggKCBtaW4gKCBjb3JyRmFjLzIuZiwgMS5mLzIuZiwgMC43NWYvMi5mICkgKQogICAgICovCiAgICAqY29ycmVjdGlvbkZhY19tID0gRkRLbWF4KEZES21pbigoKmNvcnJlY3Rpb25GYWNfbSkrZGlmZiwgRkwyRlhDT05TVF9EQkwoMS4wZi8yLmYpKSwgRkwyRlhDT05TVF9EQkwoMC43NWYvMi5mKSkgOwogICAgKmNvcnJlY3Rpb25GYWNfZSA9IDE7CiAgfQogIGVsc2UgewogICAgKmNvcnJlY3Rpb25GYWNfbSA9IEZMMkZYQ09OU1RfREJMKDAuNzUvMi5mKTsKICAgICpjb3JyZWN0aW9uRmFjX2UgPSAxOwogIH0KfQoKdm9pZCBGREthYWNFbmNfRGlzdHJpYnV0ZUJpdHMoQURKX1RIUl9TVEFURSAqYWRqVGhyU3RhdGUsCiAgICBBVFNfRUxFTUVOVCAgICAgICAqQWRqVGhyU3RhdGVFbGVtZW50LAogICAgUFNZX09VVF9DSEFOTkVMICAgKnBzeU91dENoYW5uZWxbKDIpXSwKICAgIFBFX0RBVEEgICAgICAgICAgICpwZURhdGEsCiAgICBJTlQgICAgICAgICAgICAgICAqZ3JhbnRlZFBlLAogICAgSU5UICAgICAgICAgICAgICAgKmdyYW50ZWRQZUNvcnIsCiAgICBjb25zdCBJTlQgICAgICAgICBuQ2hhbm5lbHMsCiAgICBjb25zdCBJTlQgICAgICAgICBjb21tb25XaW5kb3csCiAgICBjb25zdCBJTlQgICAgICAgICBncmFudGVkRHluQml0cywKICAgIGNvbnN0IElOVCAgICAgICAgIGJpdHJlc0JpdHMsCiAgICBjb25zdCBJTlQgICAgICAgICBtYXhCaXRyZXNCaXRzLAogICAgY29uc3QgRklYUF9EQkwgICAgbWF4Qml0RmFjLAogICAgY29uc3QgSU5UICAgICAgICAgYml0RGlzdHJpYnV0aW9uTW9kZSkKewogIEZJWFBfREJMIGJpdEZhY3RvcjsKICBJTlQgbm9SZWRQZSA9IHBlRGF0YS0+cGU7CgogIC8qIHByZWZlciBzaG9ydCB3aW5kb3dzIGZvciBjYWxjdWxhdGlvbiBvZiBiaXRGYWN0b3IgKi8KICBJTlQgY3VyV2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKICBpZiAobkNoYW5uZWxzPT0yKSB7CiAgICBpZiAoKHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHx8CiAgICAgICAgKHBzeU91dENoYW5uZWxbMV0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpKSB7CiAgICAgICAgY3VyV2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7CiAgICB9CiAgfQogIGVsc2UgewogICAgY3VyV2luZG93U2VxdWVuY2UgPSBwc3lPdXRDaGFubmVsWzBdLT5sYXN0V2luZG93U2VxdWVuY2U7CiAgfQoKICBpZiAoZ3JhbnRlZER5bkJpdHMgPj0gMSkgewogICAgaWYgKGJpdERpc3RyaWJ1dGlvbk1vZGUhPTApIHsKICAgICAgKmdyYW50ZWRQZSA9IEZES2FhY0VuY19iaXRzMnBlMihncmFudGVkRHluQml0cywgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20sIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgIC8qIGZhY3RvciBkZXBlbmRlbmQgb24gY3VycmVudCBmaWxsIGxldmVsIGFuZCBwZSAqLwogICAgYml0RmFjdG9yID0gRkRLYWFjRW5jX2JpdHJlc0NhbGNCaXRGYWMoYml0cmVzQml0cywgbWF4Qml0cmVzQml0cywgbm9SZWRQZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyV2luZG93U2VxdWVuY2UsIGdyYW50ZWREeW5CaXRzLCBtYXhCaXRGYWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkalRoclN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAvKiBkZXNpcmVkIHBlIGZvciBhY3R1YWwgZnJhbWUgKi8KICAgIC8qIFdvcnN0IGNhc2UgbWF4IG9mIGdyYW50ZWREeW5CaXRzIGlzID0gMTAyNCAqIDUuMjcgKiAyICovCiAgICAqZ3JhbnRlZFBlID0gRkRLYWFjRW5jX2JpdHMycGUyKGdyYW50ZWREeW5CaXRzLAogICAgICAgICAgICAgICAgICAgICBmTXVsdChiaXRGYWN0b3IsIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9tKSwgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX2UrKERGUkFDVF9CSVRTLTEtUV9CSVRGQUMpCiAgICAgICAgICAgICAgICAgICAgICk7CiAgICB9CiAgfQogIGVsc2UgewogICAgKmdyYW50ZWRQZSA9IDA7IC8qIHByZXZlbnQgZGl2c2lvbiBieSAwICovCiAgfQoKICAvKiBjb3JyZWN0aW9uIG9mIHBlIHZhbHVlICovCiAgc3dpdGNoIChiaXREaXN0cmlidXRpb25Nb2RlKSB7CiAgY2FzZSAyOgogIGNhc2UgMToKICAgIEZES2FhY0VuY19jYWxjUGVDb3JyZWN0aW9uTG93Qml0UmVzKAogICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9tLAogICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9lLAogICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCwKICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCwKICAgICAgICAgICAgYml0cmVzQml0cywKICAgICAgICAgICAgbkNoYW5uZWxzLAogICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSwKICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX2UKICAgICAgICApOwogICAgYnJlYWs7CiAgY2FzZSAwOgogIGRlZmF1bHQ6CiAgICAgIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbigKICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfbSwKICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSwKICAgICAgICAgICAgZml4TWluKCpncmFudGVkUGUsIG5vUmVkUGUpLAogICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCwKICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCwKICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20sCiAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lCiAgICAgICAgICAgICk7CiAgICBicmVhazsKICB9CgogICpncmFudGVkUGVDb3JyID0gKElOVCkoZk11bHQoKEZJWFBfREJMKSgqZ3JhbnRlZFBlPDxRX0FWR0JJVFMpLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9tKSA+PiAoUV9BVkdCSVRTLUFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX2UpKTsKCiAgLyogdXBkYXRlIGxhc3QgcGUgKi8KICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCA9ICpncmFudGVkUGU7CiAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCA9IC0xOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkanVzdFRocmVzaG9sZHMKZGVzY3JpcHRpb246ICBhZGp1c3QgdGhyZXNob2xkcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcyhBVFNfRUxFTUVOVCogICAgICAgIEFkalRoclN0YXRlRWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgICAgcWNFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgICAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqICAgIHBzeU91dEVsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgIENCUmJpdHJhdGVNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogICAgY20pCnsKICAgIGludCBpOwogICAgaWYgKENCUmJpdHJhdGVNb2RlKQogICAgewogICAgICAgIC8qIEluIGNhc2UsIG5vIGJpdHMgbXVzdCBiZSBzaGlmdGVkIGJldHdlZW4gZGlmZmVyZW50IGVsZW1lbnRzLCAqLwogICAgICAgIC8qIGFuIGVsZW1lbnQtd2lzZSBleGVjdXRpb24gb2YgdGhlIHBlLWRlcGVuZGVudCB0aHJlc2hvbGQtICovCiAgICAgICAgLyogYWRhcHRpb24gYmVjb21lcyBuZWNlc3NhcnkuLi4gKi8KICAgICAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKCiAgICAgICAgICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CiAgICAgICAgICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvKiBxY0VsZW1lbnRbaV0tPmdyYW50ZWRQZSA9IDIwMDA7ICovICAvKiBVc2UgdGhpcyBvbmx5IGZvciBkZWJ1Z2dpbmcgKi8KICAgICAgICAgICAgICAgICAgICAvL2lmICh0b3RhbEdyYW50ZWRQZUNvcnIgPCB0b3RhbE5vUmVkUGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocWNFbGVtZW50W2ldLT5ncmFudGVkUGUgPCBxY0VsZW1lbnRbaV0tPnBlRGF0YS5wZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGMgdGhyZXNob2xkIG5lY2Vzc2FyeSBmb3IgZGVzaXJlZCBwZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZShjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2ldLT5ncmFudGVkUGVDb3JyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgLyogUHJvY2VzcyBvbmx5IDEgZWxlbWVudCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOyAgICAgICAgLyogUHJvY2VzcyBleGFjdGx5IFRISVMgZWxlbWVudCAqLwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwoKICAgICAgICAgICAgfSAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKCiAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgLyogZm9yIFZCUi1tb2RlICovCiAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19BZGFwdFRocmVzaG9sZHNWQlIocWNFbGVtZW50W2ldLT5xY091dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnRbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnRbaV0tPnRvb2xzSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNFbGVtZW50W2ldLT5wZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsKTsKICAgICAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwoKICAgICAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KCiAgICB9CiAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKICAgICAgICBpbnQgY2gsc2ZiLHNmYkdycDsKICAgICAgICAvKiBubyB3ZWlnaHRpbmcgb2YgdGhyZWhvbGRzIGFuZCBlbmVyZ2llcyBmb3IgbWxvdXQgKi8KICAgICAgICAvKiB3ZWlnaHQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgKi8KICAgICAgICBmb3IgKGNoPTA7IGNoPGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcFFjT3V0Q2ggPSBxY0VsZW1lbnRbaV0tPnFjT3V0Q2hhbm5lbFtjaF07CiAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgICAgICAgICAgICBwUWNPdXRDaC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYitzZmJHcnBdICs9IHBRY091dENoLT5zZmJFbkZhY0xkW3NmYitzZmJHcnBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIEZES2FhY0VuY19BZGpUaHJDbG9zZShBREpfVEhSX1NUQVRFKiogcGhBZGpUaHIpCnsKICAgIElOVCBpOwogICAgQURKX1RIUl9TVEFURSogaEFkalRociA9ICpwaEFkalRocjsKCiAgICBpZiAoaEFkalRociE9TlVMTCkgewogICAgICBmb3IgKGk9MDsgaTwoOCk7IGkrKykgewogICAgICAgIGlmIChoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0hPU5VTEwpIHsKICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudCgmaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgRnJlZVJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkKHBoQWRqVGhyKTsKICAgIH0KfQoK