Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogTWFya3VzIExvaHdhc3NlcgogICBEZXNjcmlwdGlvbjogRkRLIFRvb2xzIEh5YnJpZCBGaWx0ZXJiYW5rCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiRkRLX2h5YnJpZC5oIgoKCiNpbmNsdWRlICJmZnQuaCIKCi8qLS0tLS0tLS0tLS0tLS0tIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojZGVmaW5lIEZGVF9JRFhfUihhKSAgKDIqYSkKI2RlZmluZSBGRlRfSURYX0koYSkgICgyKmErMSkKCiNkZWZpbmUgSFlCX0NPRUY4XzAgICggMC4wMDc0NjA4Mjk0OTgxMmYgKQojZGVmaW5lIEhZQl9DT0VGOF8xICAoIDAuMDIyNzA0MjA5NDk4MjVmICkKI2RlZmluZSBIWUJfQ09FRjhfMiAgKCAwLjA0NTQ2ODY1OTMwNDczZiApCiNkZWZpbmUgSFlCX0NPRUY4XzMgICggMC4wNzI2NjExMzkyOTU5MWYgKQojZGVmaW5lIEhZQl9DT0VGOF80ICAoIDAuMDk4ODUxMDg1NzUyNjRmICkKI2RlZmluZSBIWUJfQ09FRjhfNSAgKCAwLjExNzkzNzEwNTY3MjE3ZiApCiNkZWZpbmUgSFlCX0NPRUY4XzYgICggMC4xMjUwMDAwMDAwMDAwMGYgKQojZGVmaW5lIEhZQl9DT0VGOF83ICAoIEhZQl9DT0VGOF81ICkKI2RlZmluZSBIWUJfQ09FRjhfOCAgKCBIWUJfQ09FRjhfNCApCiNkZWZpbmUgSFlCX0NPRUY4XzkgICggSFlCX0NPRUY4XzMgKQojZGVmaW5lIEhZQl9DT0VGOF8xMCAoIEhZQl9DT0VGOF8yICkKI2RlZmluZSBIWUJfQ09FRjhfMTEgKCBIWUJfQ09FRjhfMSApCiNkZWZpbmUgSFlCX0NPRUY4XzEyICggSFlCX0NPRUY4XzAgKQoKCi8qLS0tLS0tLS0tLS0tLS0tIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0qLwoKI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKICAjZGVmaW5lIEZJWFBfSFRCIEZJWFBfU0dMICAgICAgICAgICAgICAgLyogU0dMIGRhdGEgdHlwZS4gKi8KICAjZGVmaW5lIEZJWFBfSFRQIEZJWFBfU1BLICAgICAgICAgICAgICAgLyogUGFja2VkIFNHTCBkYXRhIHR5cGUuICovCiAgI2RlZmluZSBIVEMoYSkgKEZYX0RCTDJGWENPTlNUX1NHTChhKSkgIC8qIENhc3QgdG8gU0dMICovCiAgI2RlZmluZSBGTDJGWENPTlNUX0hUQiBGTDJGWENPTlNUX1NHTAojZWxzZQogICNkZWZpbmUgRklYUF9IVEIgRklYUF9EQkwgICAgICAgICAgICAgICAvKiBTR0wgZGF0YSB0eXBlLiAqLwogICNkZWZpbmUgRklYUF9IVFAgRklYUF9EUEsgICAgICAgICAgICAgICAvKiBQYWNrZWQgREJMIGRhdGEgdHlwZS4gKi8KICAjZGVmaW5lIEhUQyhhKSAoKEZJWFBfREJMKShMT05HKShhKSkgICAgLyogQ2FzdCB0byBEQkwgKi8KICAjZGVmaW5lIEZMMkZYQ09OU1RfSFRCIEZMMkZYQ09OU1RfREJMCiNlbmRpZgoKI2RlZmluZSBIVENQKHJlYWwsaW1hZykgeyB7IEhUQyhyZWFsKSwgSFRDKGltYWcpIH0gfSAvKiBIb3cgdG8gYXJyYW5nZSB0aGUgcGFja2VkIHZhbHVlcy4gKi8KCgpzdHJ1Y3QgRkRLX0hZQlJJRF9TRVRVUAp7CiAgICBVQ0hBUiAgICAgICAgICAgICAgIG5yUW1mQmFuZHM7ICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBiYW5kcyB0byBiZSBjb252ZXJ0ZWQgdG8gaHlicmlkLiAqLwogICAgVUNIQVIgICAgICAgICAgICAgICBuSHliQmFuZHNbM107ICAgICAgICAvKiE8IE51bWJlciBvZiBIeWJyaWQgYmFuZHMgZ2VuZXJhdGVkIGJ5IG5yUW1mQmFuZHMuICovCiAgICBTQ0hBUiAgICAgICAgICAgICAgIGtIeWJyaWRbM107ICAgICAgICAgIC8qITwgRmlsdGVyIGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBRTUYgYmFuZC4gKi8KICAgIFVDSEFSICAgICAgICAgICAgICAgcHJvdG9MZW47ICAgICAgICAgICAgLyohPCBQcm90b3R5cGUgZmlsdGVyIGxlbmd0aC4gKi8KICAgIFVDSEFSICAgICAgICAgICAgICAgZmlsdGVyRGVsYXk7ICAgICAgICAgLyohPCBEZWxheSBjYXVzZWQgYnkgaHlicmlkIGZpbHRlci4gKi8KICAgIGNvbnN0IElOVCAgICAgICAgICAqcFJlYWRJZHhUYWJsZTsgICAgICAgLyohPCBIZWxwZXIgdGFibGUgdG8gYWNjZXNzIGlucHV0IGRhdGEgcmluZ2J1ZmZlci4gKi8KCn07CgovKi0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGNvbnN0IElOVCByaW5nYnVmZklkeFRhYlsyKjEzXSA9IHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiB9OwoKc3RhdGljIGNvbnN0IEZES19IWUJSSURfU0VUVVAgc2V0dXBfM18xNiA9IHsgMywgeyA4LCA0LCA0fSwgeyAgOCwgIDQsICA0fSwgMTMsICgxMy0xKS8yLCByaW5nYnVmZklkeFRhYn07CnN0YXRpYyBjb25zdCBGREtfSFlCUklEX1NFVFVQIHNldHVwXzNfMTIgPSB7IDMsIHsgOCwgMiwgMn0sIHsgIDgsICAyLCAgMn0sIDEzLCAoMTMtMSkvMiwgcmluZ2J1ZmZJZHhUYWJ9OwpzdGF0aWMgY29uc3QgRkRLX0hZQlJJRF9TRVRVUCBzZXR1cF8zXzEwID0geyAzLCB7IDYsIDIsIDJ9LCB7IC04LCAtMiwgIDJ9LCAxMywgKDEzLTEpLzIsIHJpbmdidWZmSWR4VGFifTsKCgpzdGF0aWMgY29uc3QgRklYUF9IVFAgSHliRmlsdGVyQ29lZjhbXSA9IHsKICBIVENQKDB4MTAwMDAwMDAsIDB4MDAwMDAwMDApLCBIVENQKDB4MGRmMjY0MDcsIDB4ZmEzOTE4ODIpLCBIVENQKDB4ZmY1MzIxMDksIDB4MDBhY2RlZjcpLCBIVENQKDB4MDhmMjZkMzYsIDB4ZjcwZDkyY2EpLAogIEhUQ1AoMHhmZWUzNGI1ZiwgMHgwMmFmNTcwZiksIEhUQ1AoMHgwMzhmMjc2ZSwgMHhmNzY4NDc5MyksIEhUQ1AoMHgwMDAwMDAwMCwgMHgwNWQxZWFjMiksIEhUQ1AoMHgwMDAwMDAwMCwgMHgwNWQxZWFjMiksCiAgSFRDUCgweDAzOGYyNzZlLCAweDA4OTdiODZkKSwgSFRDUCgweGZlZTM0YjVmLCAweGZkNTBhOGYxKSwgSFRDUCgweDA4ZjI2ZDM2LCAweDA4ZjI2ZDM2KSwgSFRDUCgweGZmNTMyMTA5LCAweGZmNTMyMTA5KSwKICBIVENQKDB4MGRmMjY0MDcsIDB4MDVjNmU3N2UpCn07CgpzdGF0aWMgY29uc3QgRklYUF9IVEIgSHliRmlsdGVyQ29lZjJbMTNdID0gewogIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAxODk5NDg3NTI2MDQ5ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKC0wLjA3MjkzMTM5MTY3NTM4ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjMwNTk2NjMwNTQ1MTY4ZiksCiAgRkwyRlhDT05TVF9IVEIoIDAuNTAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9IVEIoIDAuMzA1OTY2MzA1NDUxNjhmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9IVEIoLTAuMDcyOTMxMzkxNjc1MzhmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDE4OTk0ODc1MjYwNDlmKSwKICBGTDJGWENPTlNUX0hUQiggMC4wMDAwMDAwMDAwMDAwMGYpCn07CgpzdGF0aWMgY29uc3QgRklYUF9IVEIgSHliRmlsdGVyQ29lZjRbMTNdID0gewogIEZMMkZYQ09OU1RfSFRCKC0wLjAwMzA1MTUxOTI3MzA1ZiksIEZMMkZYQ09OU1RfSFRCKC0wLjAwNzk0ODYyMzE2MjAzZiksIEZMMkZYQ09OU1RfSFRCKCAgICAgICAgICAgICAgMC4wZiksIEZMMkZYQ09OU1RfSFRCKCAwLjA0MzE4OTI0MDM4NzU2ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjEyNTQyNDQ4MjEwNDQ1ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjIxMjI3ODA3MDQ5MTYwZiksCiAgRkwyRlhDT05TVF9IVEIoICAgICAgICAgICAgIDAuMjVmKSwgRkwyRlhDT05TVF9IVEIoIDAuMjEyMjc4MDcwNDkxNjBmKSwgRkwyRlhDT05TVF9IVEIoIDAuMTI1NDI0NDgyMTA0NDVmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDQzMTg5MjQwMzg3NTZmKSwgRkwyRlhDT05TVF9IVEIoICAgICAgICAgICAgICAwLjBmKSwgRkwyRlhDT05TVF9IVEIoLTAuMDA3OTQ4NjIzMTYyMDNmKSwKICBGTDJGWENPTlNUX0hUQigtMC4wMDMwNTE1MTkyNzMwNWYpCn07CgovKi0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIElOVCBrQ2hhbm5lbEZpbHRlcmluZygKICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mUmVhbCwKICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKICAgICAgICBjb25zdCBJTlQgKmNvbnN0ICAgICAgICAgICBwUmVhZElkeCwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkUmVhbCwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKICAgICAgICBjb25zdCBTQ0hBUiAgICAgICAgICAgICAgICBoeWJyaWRDb25maWcKICAgICAgICApOwoKCi8qLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0qLwoKSU5UIEZES2h5YnJpZEFuYWx5c2lzT3BlbigKICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcExGbWVtb3J5LAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgIExGbWVtb3J5U2l6ZSwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwSEZtZW1vcnksCiAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgSEZtZW1vcnlTaXplCiAgICAgICAgKQp7CiAgSU5UIGVyciA9IDA7CgogIC8qIFNhdmUgcG9pbnRlciB0byBleHRlcm4gbWVtb3J5LiAqLwogIGhBbmFseXNpc0h5YkZpbHRlci0+cExGbWVtb3J5ICAgID0gcExGbWVtb3J5OwogIGhBbmFseXNpc0h5YkZpbHRlci0+TEZtZW1vcnlTaXplID0gTEZtZW1vcnlTaXplOwoKICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBIRm1lbW9yeSAgICA9IHBIRm1lbW9yeTsKICBoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSA9IEhGbWVtb3J5U2l6ZTsKCiAgcmV0dXJuIGVycjsKfQoKSU5UIEZES2h5YnJpZEFuYWx5c2lzSW5pdCgKICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCiAgICAgICAgY29uc3QgRkRLX0hZQlJJRF9NT0RFICAgICAgbW9kZSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBxbWZCYW5kcywKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBjcGx4QmFuZHMsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlc0ZsYWcKICAgICAgICApCnsKICAgIGludCBrOwogICAgSU5UIGVyciA9IDA7CiAgICBGSVhQX0RCTCAqcE1lbSA9IE5VTEw7CiAgICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBzZXR1cCA9IE5VTEw7CgogICAgc3dpdGNoIChtb2RlKSB7CiAgICAgIGNhc2UgVEhSRUVfVE9fVEVOOiAgICAgc2V0dXAgPSAoSEFORExFX0ZES19IWUJSSURfU0VUVVApJnNldHVwXzNfMTA7IGJyZWFrOwogICAgICBjYXNlIFRIUkVFX1RPX1RXRUxWRTogIHNldHVwID0gKEhBTkRMRV9GREtfSFlCUklEX1NFVFVQKSZzZXR1cF8zXzEyOyBicmVhazsKICAgICAgY2FzZSBUSFJFRV9UT19TSVhURUVOOiBzZXR1cCA9IChIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCkmc2V0dXBfM18xNjsgYnJlYWs7CiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgZXJyID0gLTE7IGdvdG8gYmFpbDsKICAgIH0KCiAgICAvKiBJbml0aWFsaXplIGhhbmRsZS4gKi8KICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwICAgICAgPSBzZXR1cDsKICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZwb3MgPSBzZXR1cC0+cHJvdG9MZW4tMTsKICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3MgPSAwOwogICAgaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzICAgICA9IHFtZkJhbmRzOwogICAgaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgICA9IGNwbHhCYW5kczsKICAgIGhBbmFseXNpc0h5YkZpbHRlci0+aGZNb2RlICAgICAgPSAwOwoKICAgIC8qIENoZWNrIGF2YWlsYWJsZSBtZW1vcnkuICovCiAgICBpZiAoICgoMipzZXR1cC0+bnJRbWZCYW5kcypzZXR1cC0+cHJvdG9MZW4qc2l6ZW9mKEZJWFBfREJMKSkgPiBoQW5hbHlzaXNIeWJGaWx0ZXItPkxGbWVtb3J5U2l6ZSkKICAgICAgfHwgKChzZXR1cC0+ZmlsdGVyRGVsYXkqKChxbWZCYW5kcy1zZXR1cC0+bnJRbWZCYW5kcykrKGNwbHhCYW5kcy1zZXR1cC0+bnJRbWZCYW5kcykpKnNpemVvZihGSVhQX0RCTCkpID4gaEFuYWx5c2lzSHliRmlsdGVyLT5IRm1lbW9yeVNpemUpICkKICAgIHsKICAgICAgZXJyID0gLTI7CiAgICAgIGdvdG8gYmFpbDsKICAgIH0KCiAgICAvKiBEaXN0cmlidXQgTEYgbWVtb3J5LiAqLwogICAgcE1lbSA9IGhBbmFseXNpc0h5YkZpbHRlci0+cExGbWVtb3J5OwogICAgZm9yIChrPTA7IGs8c2V0dXAtPm5yUW1mQmFuZHM7IGsrKykgewogICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXSA9IHBNZW07IHBNZW0gKz0gc2V0dXAtPnByb3RvTGVuOwogICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSA9IHBNZW07IHBNZW0gKz0gc2V0dXAtPnByb3RvTGVuOwogICAgfQoKICAgIC8qIERpc3RyaWJ1dCBIRiBtZW1vcnkuICovCiAgICBwTWVtID0gaEFuYWx5c2lzSHliRmlsdGVyLT5wSEZtZW1vcnk7CiAgICBmb3IgKGs9MDsgazxzZXR1cC0+ZmlsdGVyRGVsYXk7IGsrKykgewogICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGUmVhbFtrXSA9IHBNZW07IHBNZW0gKz0gKHFtZkJhbmRzLXNldHVwLT5uclFtZkJhbmRzKTsKICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdba10gPSBwTWVtOyBwTWVtICs9IChjcGx4QmFuZHMtc2V0dXAtPm5yUW1mQmFuZHMpOwogICAgfQoKICAgIGlmIChpbml0U3RhdGVzRmxhZykgewogICAgICAvKiBDbGVhciBMRiBidWZmZXIgKi8KICAgICAgZm9yIChrPTA7IGs8c2V0dXAtPm5yUW1mQmFuZHM7IGsrKykgewogICAgICAgIEZES21lbWNsZWFyKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdLCBzZXR1cC0+cHJvdG9MZW4qc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICAgRkRLbWVtY2xlYXIoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRkltYWdba10sIHNldHVwLT5wcm90b0xlbipzaXplb2YoRklYUF9EQkwpKTsKICAgICAgfQoKICAgICAgaWYgKHFtZkJhbmRzID4gc2V0dXAtPm5yUW1mQmFuZHMpIHsKICAgICAgLyogQ2xlYXIgSEYgYnVmZmVyICovCiAgICAgIGZvciAoaz0wOyBrPHNldHVwLT5maWx0ZXJEZWxheTsgaysrKSB7CiAgICAgICAgRkRLbWVtY2xlYXIoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxba10sIChxbWZCYW5kcy1zZXR1cC0+bnJRbWZCYW5kcykqc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICAgRkRLbWVtY2xlYXIoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdba10sIChjcGx4QmFuZHMtc2V0dXAtPm5yUW1mQmFuZHMpKnNpemVvZihGSVhQX0RCTCkpOwogICAgICB9CiAgICB9CiAgICB9CgpiYWlsOgogICAgcmV0dXJuIGVycjsKfQoKSU5UIEZES2h5YnJpZEFuYWx5c2lzU2NhbGVTdGF0ZXMoCiAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHNjYWxpbmdWYWx1ZQogICAgICAgICkKewogICAgSU5UIGVyciA9IDA7CgogICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlcj09TlVMTCkgewogICAgICBlcnIgPSAxOyAvKiBpbnZhbGlkIGhhbmRsZSAqLwogICAgfQogICAgZWxzZSB7CiAgICAgIGludCBrOwogICAgICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBzZXR1cCA9IGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwOwoKICAgICAgLyogU2NhbGUgTEYgYnVmZmVyICovCiAgICAgIGZvciAoaz0wOyBrPHNldHVwLT5uclFtZkJhbmRzOyBrKyspIHsKICAgICAgICBzY2FsZVZhbHVlcyhoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXSwgc2V0dXAtPnByb3RvTGVuLCBzY2FsaW5nVmFsdWUpOwogICAgICAgIHNjYWxlVmFsdWVzKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZJbWFnW2tdLCBzZXR1cC0+cHJvdG9MZW4sIHNjYWxpbmdWYWx1ZSk7CiAgICAgIH0KICAgICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcyA+IHNldHVwLT5uclFtZkJhbmRzKSB7CiAgICAgICAgLyogU2NhbGUgSEYgYnVmZmVyICovCiAgICAgICAgZm9yIChrPTA7IGs8c2V0dXAtPmZpbHRlckRlbGF5OyBrKyspIHsKICAgICAgICAgIHNjYWxlVmFsdWVzKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2tdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzLXNldHVwLT5uclFtZkJhbmRzKSwgc2NhbGluZ1ZhbHVlKTsKICAgICAgICAgIHNjYWxlVmFsdWVzKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2tdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMtc2V0dXAtPm5yUW1mQmFuZHMpLCBzY2FsaW5nVmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGVycjsKfQoKSU5UIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoCiAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAogICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAogICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAogICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBIeWJyaWRSZWFsLAogICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBIeWJyaWRJbWFnKQp7CiAgICBpbnQgaywgaHliT2Zmc2V0ID0gMDsKICAgIElOVCBlcnIgPSAwOwogICAgY29uc3QgaW50IG5yUW1mQmFuZHNMRiA9IGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5uclFtZkJhbmRzOyAvKiBudW1iZXIgb2YgUU1GIGJhbmRzIHRvIGJlIGNvbnZlcnRlZCB0byBoeWJyaWQgKi8KCiAgICBjb25zdCBpbnQgd3JpdEluZGV4ID0gaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRnBvczsKICAgIGludCByZWFkSW5kZXggPSBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zOwoKICAgIGlmICgrK3JlYWRJbmRleD49aEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXAtPnByb3RvTGVuKSByZWFkSW5kZXggPSAwOwogICAgY29uc3QgSU5UKiBwQnVmZmVyTEZyZWFkSWR4ID0gJmhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5wUmVhZElkeFRhYmxlW3JlYWRJbmRleF07CgogICAgLyoKICAgICAqIExGIGJ1ZmZlci4KICAgICAqLwogICAgZm9yIChrPTA7IGs8bnJRbWZCYW5kc0xGOyBrKyspIHsKICAgICAgICAvKiBOZXcgaW5wdXQgc2FtcGxlLiAqLwogICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdW3dyaXRJbmRleF0gPSBwUW1mUmVhbFtrXTsKICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXVt3cml0SW5kZXhdID0gcFFtZkltYWdba107CgogICAgLyogUGVyZm9ybSBoeWJyaWQgZmlsdGVyaW5nLiAqLwogICAgICAgIGtDaGFubmVsRmlsdGVyaW5nKAogICAgICAgICAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRlJlYWxba10sCiAgICAgICAgICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSwKICAgICAgICAgICAgICAgIHBCdWZmZXJMRnJlYWRJZHgsCiAgICAgICAgICAgICAgICBwSHlicmlkUmVhbCtoeWJPZmZzZXQsCiAgICAgICAgICAgICAgICBwSHlicmlkSW1hZytoeWJPZmZzZXQsCiAgICAgICAgICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+a0h5YnJpZFtrXSk7CgogICAgICAgIGh5Yk9mZnNldCArPSBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+bkh5YkJhbmRzW2tdOwogICAgfQoKICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZwb3MgPSByZWFkSW5kZXg7IC8qIEluZGV4IHdoZXJlIHRvIHdyaXRlIG5leHQgaW5wdXQgc2FtcGxlLiAqLwoKICAgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgPiBuclFtZkJhbmRzTEYpIHsKICAgIC8qCiAgICAgKiBIRiBidWZmZXIuCiAgICAgKi8KICAgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXItPmhmTW9kZSE9MCkgewogICAgICAgIC8qIEhGIGRlbGF5IGNvbXBlbnNhdGlvbiB3YXMgYXBwbGllZCBvdXRzaWRlLiAqLwogICAgICAgIEZES21lbWNweShwSHlicmlkUmVhbCtoeWJPZmZzZXQsICZwUW1mUmVhbFtuclFtZkJhbmRzTEZdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICAgRkRLbWVtY3B5KHBIeWJyaWRJbWFnK2h5Yk9mZnNldCwgJnBRbWZJbWFnW25yUW1mQmFuZHNMRl0sIChoQW5hbHlzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcy1uclFtZkJhbmRzTEYpKnNpemVvZihGSVhQX0RCTCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyogSEYgZGVsYXkgY29tcGVuc2F0aW9uLCBmaWx0ZXJsZW5ndGgvMi4gKi8KICAgIEZES21lbWNweShwSHlicmlkUmVhbCtoeWJPZmZzZXQsIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CiAgICBGREttZW1jcHkocEh5YnJpZEltYWcraHliT2Zmc2V0LCBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGSW1hZ1toQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CgogICAgRkRLbWVtY3B5KGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLCAmcFFtZlJlYWxbbnJRbWZCYW5kc0xGXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcy1uclFtZkJhbmRzTEYpKnNpemVvZihGSVhQX0RCTCkpOwogICAgRkRLbWVtY3B5KGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLCAmcFFtZkltYWdbbnJRbWZCYW5kc0xGXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CgogICAgaWYgKCsraEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvcz49aEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXAtPmZpbHRlckRlbGF5KSBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zID0gMDsKICAgIH0KICAgIH0gLyogcHJvY2VzcyBIRiBwYXJ0Ki8KCiAgICByZXR1cm4gZXJyOwp9CgpJTlQgRkRLaHlicmlkQW5hbHlzaXNDbG9zZSgKICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSIGhBbmFseXNpc0h5YkZpbHRlcgogICAgICAgICkKewogIElOVCBlcnIgPSAwOwoKICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyICE9IE5VTEwpIHsKICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cExGbWVtb3J5ICAgID0gTlVMTDsKICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cEhGbWVtb3J5ICAgID0gTlVMTDsKICAgIGhBbmFseXNpc0h5YkZpbHRlci0+TEZtZW1vcnlTaXplID0gMDsKICAgIGhBbmFseXNpc0h5YkZpbHRlci0+SEZtZW1vcnlTaXplID0gMDsKICB9CgogIHJldHVybiBlcnI7Cn0KCklOVCBGREtoeWJyaWRTeW50aGVzaXNJbml0KAogICAgICAgIEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgIGhTeW50aGVzaXNIeWJGaWx0ZXIsCiAgICAgICAgY29uc3QgRkRLX0hZQlJJRF9NT0RFICAgICAgbW9kZSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBxbWZCYW5kcywKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBjcGx4QmFuZHMKICAgICAgICApCnsKICAgIElOVCBlcnIgPSAwOwogICAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgc2V0dXAgPSBOVUxMOwoKICAgIHN3aXRjaCAobW9kZSkgewogICAgICBjYXNlIFRIUkVFX1RPX1RFTjogICAgIHNldHVwID0gKEhBTkRMRV9GREtfSFlCUklEX1NFVFVQKSZzZXR1cF8zXzEwOyBicmVhazsKICAgICAgY2FzZSBUSFJFRV9UT19UV0VMVkU6ICBzZXR1cCA9IChIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCkmc2V0dXBfM18xMjsgYnJlYWs7CiAgICAgIGNhc2UgVEhSRUVfVE9fU0lYVEVFTjogc2V0dXAgPSAoSEFORExFX0ZES19IWUJSSURfU0VUVVApJnNldHVwXzNfMTY7IGJyZWFrOwogICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIGVyciA9IC0xOyBnb3RvIGJhaWw7CiAgICB9CgogICAgaFN5bnRoZXNpc0h5YkZpbHRlci0+cFNldHVwICAgICAgPSBzZXR1cDsKICAgIGhTeW50aGVzaXNIeWJGaWx0ZXItPm5yQmFuZHMgICAgID0gcW1mQmFuZHM7CiAgICBoU3ludGhlc2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgICA9IGNwbHhCYW5kczsKCmJhaWw6CiAgICByZXR1cm4gZXJyOwp9CgoKSU5UIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KAogICAgICAgIEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgIGhTeW50aGVzaXNIeWJGaWx0ZXIsCiAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcEh5YnJpZFJlYWwsCiAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcEh5YnJpZEltYWcsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcFFtZlJlYWwsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcFFtZkltYWcKICAgICAgICApCnsKICAgIGludCBrLCBuLCBoeWJPZmZzZXQ9MDsKICAgIElOVCBlcnIgPSAwOwogICAgY29uc3QgSU5UIG5yUW1mQmFuZHNMRiA9IGhTeW50aGVzaXNIeWJGaWx0ZXItPnBTZXR1cC0+bnJRbWZCYW5kczsKCiAgICAvKgogICAgICogTEYgYnVmZmVyLgogICAgICovCiAgICBmb3IgKGs9MDsgazxuclFtZkJhbmRzTEY7IGsrKykgewogICAgICBjb25zdCBpbnQgbkh5YkJhbmRzID0gaFN5bnRoZXNpc0h5YkZpbHRlci0+cFNldHVwLT5uSHliQmFuZHNba107CgogICAgICBGSVhQX0RCTCBhY2N1MSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgIEZJWFBfREJMIGFjY3UyID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKCiAgICAgIC8qIFBlcmZvcm0gaHlicmlkIGZpbHRlcmluZy4gKi8KICAgICAgZm9yIChuPTA7IG48bkh5YkJhbmRzOyBuKyspIHsKICAgICAgICAgIGFjY3UxICs9IHBIeWJyaWRSZWFsW2h5Yk9mZnNldCtuXTsKICAgICAgICAgIGFjY3UyICs9IHBIeWJyaWRJbWFnW2h5Yk9mZnNldCtuXTsKICAgICAgfQogICAgICBwUW1mUmVhbFtrXSA9IGFjY3UxOwogICAgICBwUW1mSW1hZ1trXSA9IGFjY3UyOwoKICAgICAgaHliT2Zmc2V0ICs9IG5IeWJCYW5kczsKICAgIH0KCiAgICBpZiAoaFN5bnRoZXNpc0h5YkZpbHRlci0+bnJCYW5kcyA+IG5yUW1mQmFuZHNMRikgewogICAgICAvKgogICAgICAgKiBIRiBidWZmZXIuCiAgICAgICAqLwogICAgRkRLbWVtY3B5KCZwUW1mUmVhbFtuclFtZkJhbmRzTEZdLCAmcEh5YnJpZFJlYWxbaHliT2Zmc2V0XSwgKGhTeW50aGVzaXNIeWJGaWx0ZXItPm5yQmFuZHMtbnJRbWZCYW5kc0xGKSpzaXplb2YoRklYUF9EQkwpKTsKICAgIEZES21lbWNweSgmcFFtZkltYWdbbnJRbWZCYW5kc0xGXSwgJnBIeWJyaWRJbWFnW2h5Yk9mZnNldF0sIChoU3ludGhlc2lzSHliRmlsdGVyLT5jcGx4QmFuZHMtbnJRbWZCYW5kc0xGKSpzaXplb2YoRklYUF9EQkwpKTsKICAgIH0KCiAgICByZXR1cm4gZXJyOwp9CgpzdGF0aWMgdm9pZCBkdWFsQ2hhbm5lbEZpbHRlcmluZygKICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mUmVhbCwKICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKICAgICAgICBjb25zdCBJTlQgKmNvbnN0ICAgICAgICAgICBwUmVhZElkeCwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkUmVhbCwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBpbnZlcnQKICAgICAgICApCnsKICAgIGNvbnN0IEZJWFBfSFRCICpwID0gSHliRmlsdGVyQ29lZjI7CgogICAgRklYUF9EQkwgIHIxLCByNjsKICAgIEZJWFBfREJMICBpMSwgaTY7CgogICAgLyogc3ltbWV0cmljIGZpbHRlciBjb2VmZmljaWVudHMgKi8KICAgIHIxICA9IGZNdWx0RGl2MihwWzFdLCBwUW1mUmVhbFtwUmVhZElkeFsxXV0pICsgZk11bHREaXYyKHBbMV0sIHBRbWZSZWFsW3BSZWFkSWR4WzExXV0pIDsKICAgIGkxICA9IGZNdWx0RGl2MihwWzFdLCBwUW1mSW1hZ1twUmVhZElkeFsxXV0pICsgZk11bHREaXYyKHBbMV0sIHBRbWZJbWFnW3BSZWFkSWR4WzExXV0pIDsKICAgIHIxICs9IGZNdWx0RGl2MihwWzNdLCBwUW1mUmVhbFtwUmVhZElkeFszXV0pICsgZk11bHREaXYyKHBbM10sIHBRbWZSZWFsW3BSZWFkSWR4WyA5XV0pIDsKICAgIGkxICs9IGZNdWx0RGl2MihwWzNdLCBwUW1mSW1hZ1twUmVhZElkeFszXV0pICsgZk11bHREaXYyKHBbM10sIHBRbWZJbWFnW3BSZWFkSWR4WyA5XV0pIDsKICAgIHIxICs9IGZNdWx0RGl2MihwWzVdLCBwUW1mUmVhbFtwUmVhZElkeFs1XV0pICsgZk11bHREaXYyKHBbNV0sIHBRbWZSZWFsW3BSZWFkSWR4WyA3XV0pIDsKICAgIGkxICs9IGZNdWx0RGl2MihwWzVdLCBwUW1mSW1hZ1twUmVhZElkeFs1XV0pICsgZk11bHREaXYyKHBbNV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA3XV0pIDsKICAgIHI2ICA9IGZNdWx0RGl2MihwWzZdLCBwUW1mUmVhbFtwUmVhZElkeFs2XV0pIDsKICAgIGk2ICA9IGZNdWx0RGl2MihwWzZdLCBwUW1mSW1hZ1twUmVhZElkeFs2XV0pIDsKCiAgICBpZiAoaW52ZXJ0KSB7CiAgICAgIG1IeWJyaWRSZWFsWzFdID0gKHIxICsgcjYpIDw8IDE7CiAgICAgIG1IeWJyaWRJbWFnWzFdID0gKGkxICsgaTYpIDw8IDE7CgogICAgICBtSHlicmlkUmVhbFswXSA9IChyNiAtIHIxKSA8PCAxOwogICAgICBtSHlicmlkSW1hZ1swXSA9IChpNiAtIGkxKSA8PCAxOwogICAgfQogICAgZWxzZSB7CiAgICAgIG1IeWJyaWRSZWFsWzBdID0gKHIxICsgcjYpIDw8IDE7CiAgICAgIG1IeWJyaWRJbWFnWzBdID0gKGkxICsgaTYpIDw8IDE7CgogICAgICBtSHlicmlkUmVhbFsxXSA9IChyNiAtIHIxKSA8PCAxOwogICAgICBtSHlicmlkSW1hZ1sxXSA9IChpNiAtIGkxKSA8PCAxOwogICAgfQp9CgpzdGF0aWMgdm9pZCBmb3VyQ2hhbm5lbEZpbHRlcmluZygKICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mUmVhbCwKICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKICAgICAgICBjb25zdCBJTlQgKmNvbnN0ICAgICAgICAgICBwUmVhZElkeCwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkUmVhbCwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBpbnZlcnQKICAgICAgICApCnsKICAgIGNvbnN0IEZJWFBfSFRCICpwID0gSHliRmlsdGVyQ29lZjQ7CgogICAgRklYUF9EQkwgZmZ0WzhdOwoKICAgIHN0YXRpYyBjb25zdCBGSVhQX0RCTCAgY3JbMTNdID0gewogICAgICBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAwLmYpLCBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLCBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgIC0xLmYpLAogICAgICBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLCBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAwLmYpLCBGTDJGWENPTlNUX0RCTCggMC43MDcxMDY3ODExODY1NWYpLAogICAgICBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAxLmYpLAogICAgICBGTDJGWENPTlNUX0RCTCggMC43MDcxMDY3ODExODY1NWYpLCBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAwLmYpLCBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLAogICAgICBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgIC0xLmYpLCBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLCBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAwLmYpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IEZJWFBfREJMICBjaVsxM10gPSB7CiAgICAgIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgLTEuZiksIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZiksCiAgICAgIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDEuZiksIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksCiAgICAgIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZiksCiAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgLTEuZiksIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksCiAgICAgIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZiksIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDEuZikKICAgIH07CgoKICAgIC8qIEZJUiBmaWx0ZXIuICovCiAgICAvKiBwcmUgdHdpZGRlbGluZyB3aXRoIHByZS10d2lkZGxpbmcgY29lZmZpY2llbnRzIGNbbl0gICovCiAgICAvKiBtdWx0aXBsaWNhdGlvbiB3aXRoIGZpbHRlciBjb2VmZmljaWVudHMgcFtuXSAgICAgICAgICovCiAgICAvKiBoaW50OiAoYSArIGliKSooYyArIGlkKSA9IChhKmMgLSBiKmQpICsgaShhKmQgKyBiKmMpICovCiAgICAvKiB3cml0ZSB0byBmZnQgY29lZmZpY2llbnQgbicgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBmZnRbRkZUX0lEWF9SKDApXSA9ICAoIGZNdWx0KHBbMTBdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgMl0sIHBRbWZSZWFsW3BSZWFkSWR4WyAyXV0pLCBjaVsgMl0sIHBRbWZJbWFnW3BSZWFkSWR4WyAyXV0pKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA2XSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDZdLCBwUW1mUmVhbFtwUmVhZElkeFsgNl1dKSwgY2lbIDZdLCBwUW1mSW1hZ1twUmVhZElkeFsgNl1dKSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgMl0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWzEwXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTBdXSksIGNpWzEwXSwgcFFtZkltYWdbcFJlYWRJZHhbMTBdXSkpKSApOwogICAgZmZ0W0ZGVF9JRFhfSSgwKV0gPSAgKCBmTXVsdChwWzEwXSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDJdLCBwUW1mUmVhbFtwUmVhZElkeFsgMl1dKSwgY3JbIDJdLCBwUW1mSW1hZ1twUmVhZElkeFsgMl1dKSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgNl0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyA2XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDZdXSksIGNyWyA2XSwgcFFtZkltYWdbcFJlYWRJZHhbIDZdXSkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDJdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxMF0sIHBRbWZSZWFsW3BSZWFkSWR4WzEwXV0pLCBjclsxMF0sIHBRbWZJbWFnW3BSZWFkSWR4WzEwXV0pKSkgKTsKCiAgICAvKiB0d2lkZGxlIGRlZSBkdW0gKi8KICAgIGZmdFtGRlRfSURYX1IoMSldID0gICggZk11bHQocFsgOV0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyAzXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDNdXSksIGNpWyAzXSwgcFFtZkltYWdbcFJlYWRJZHhbIDNdXSkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDVdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgN10sIHBRbWZSZWFsW3BSZWFkSWR4WyA3XV0pLCBjaVsgN10sIHBRbWZJbWFnW3BSZWFkSWR4WyA3XV0pKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyAxXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbMTFdLCBwUW1mUmVhbFtwUmVhZElkeFsxMV1dKSwgY2lbMTFdLCBwUW1mSW1hZ1twUmVhZElkeFsxMV1dKSkpICk7CiAgICBmZnRbRkZUX0lEWF9JKDEpXSA9ICAoIGZNdWx0KHBbIDldLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgM10sIHBRbWZSZWFsW3BSZWFkSWR4WyAzXV0pLCBjclsgM10sIHBRbWZJbWFnW3BSZWFkSWR4WyAzXV0pKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA1XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDddLCBwUW1mUmVhbFtwUmVhZElkeFsgN11dKSwgY3JbIDddLCBwUW1mSW1hZ1twUmVhZElkeFsgN11dKSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgMV0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWzExXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTFdXSksIGNyWzExXSwgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSkpKSApOwoKICAgIC8qIHR3aWRkbGUgZGVlIGRlZSAqLwogICAgZmZ0W0ZGVF9JRFhfUigyKV0gPSAgKCBmTXVsdChwWzEyXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDBdLCBwUW1mUmVhbFtwUmVhZElkeFsgMF1dKSwgY2lbIDBdLCBwUW1mSW1hZ1twUmVhZElkeFsgMF1dKSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgOF0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyA0XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDRdXSksIGNpWyA0XSwgcFFtZkltYWdbcFJlYWRJZHhbIDRdXSkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDRdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgOF0sIHBRbWZSZWFsW3BSZWFkSWR4WyA4XV0pLCBjaVsgOF0sIHBRbWZJbWFnW3BSZWFkSWR4WyA4XV0pKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyAwXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbMTJdLCBwUW1mUmVhbFtwUmVhZElkeFsxMl1dKSwgY2lbMTJdLCBwUW1mSW1hZ1twUmVhZElkeFsxMl1dKSkpICk7CiAgICBmZnRbRkZUX0lEWF9JKDIpXSA9ICAoIGZNdWx0KHBbMTJdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgMF0sIHBRbWZSZWFsW3BSZWFkSWR4WyAwXV0pLCBjclsgMF0sIHBRbWZJbWFnW3BSZWFkSWR4WyAwXV0pKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA4XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDRdLCBwUW1mUmVhbFtwUmVhZElkeFsgNF1dKSwgY3JbIDRdLCBwUW1mSW1hZ1twUmVhZElkeFsgNF1dKSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgNF0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyA4XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDhdXSksIGNyWyA4XSwgcFFtZkltYWdbcFJlYWRJZHhbIDhdXSkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDBdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxMl0sIHBRbWZSZWFsW3BSZWFkSWR4WzEyXV0pLCBjclsxMl0sIHBRbWZJbWFnW3BSZWFkSWR4WzEyXV0pKSkgKTsKCiAgICBmZnRbRkZUX0lEWF9SKDMpXSA9ICAoIGZNdWx0KHBbMTFdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgMV0sIHBRbWZSZWFsW3BSZWFkSWR4WyAxXV0pLCBjaVsgMV0sIHBRbWZJbWFnW3BSZWFkSWR4WyAxXV0pKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA3XSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDVdLCBwUW1mUmVhbFtwUmVhZElkeFsgNV1dKSwgY2lbIDVdLCBwUW1mSW1hZ1twUmVhZElkeFsgNV1dKSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgM10sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyA5XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDldXSksIGNpWyA5XSwgcFFtZkltYWdbcFJlYWRJZHhbIDldXSkpKSApOwogICAgZmZ0W0ZGVF9JRFhfSSgzKV0gPSAgKCBmTXVsdChwWzExXSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDFdLCBwUW1mUmVhbFtwUmVhZElkeFsgMV1dKSwgY3JbIDFdLCBwUW1mSW1hZ1twUmVhZElkeFsgMV1dKSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgN10sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyA1XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDVdXSksIGNyWyA1XSwgcFFtZkltYWdbcFJlYWRJZHhbIDVdXSkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDNdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgOV0sIHBRbWZSZWFsW3BSZWFkSWR4WyA5XV0pLCBjclsgOV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA5XV0pKSkgKTsKCiAgICAvKiBmZnQgbW9kdWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgLyogaGVyZTogZmFzdCBtYW51YWwgZmZ0IG1vZHVsYXRpb24gZm9yIGEgZmZ0IG9mIGxlbmd0aCBNPTQgICAgICAgICAgKi8KICAgIC8qIGZmdF80e3hbbl19ID0geFswXSpleHAoLWkqMipwaS80Km0qMCkgKyB4WzFdKmV4cCgtaSoyKnBpLzQqbSoxKSArCiAgICB4WzJdKmV4cCgtaSoyKnBpLzQqbSoyKSArIHhbM10qZXhwKC1pKjIqcGkvNCptKjMpICAgKi8KCiAgICAvKgogICAgZmZ0IGJpbiBtPTA6CiAgICBYWzAsIG5dID0geFswXSArICAgeFsxXSArIHhbMl0gKyAgIHhbM10KICAgICovCiAgICBtSHlicmlkUmVhbFswXSA9IGZmdFtGRlRfSURYX1IoMCldICsgZmZ0W0ZGVF9JRFhfUigxKV0gKyBmZnRbRkZUX0lEWF9SKDIpXSArIGZmdFtGRlRfSURYX1IoMyldOwogICAgbUh5YnJpZEltYWdbMF0gPSBmZnRbRkZUX0lEWF9JKDApXSArIGZmdFtGRlRfSURYX0koMSldICsgZmZ0W0ZGVF9JRFhfSSgyKV0gKyBmZnRbRkZUX0lEWF9JKDMpXTsKCiAgICAvKgogICAgZmZ0IGJpbiBtPTE6CiAgICBYWzEsIG5dID0geFswXSAtIGkqeFsxXSAtIHhbMl0gKyBpKnhbM10KICAgICovCiAgICBtSHlicmlkUmVhbFsxXSA9IGZmdFtGRlRfSURYX1IoMCldICsgZmZ0W0ZGVF9JRFhfSSgxKV0gLSBmZnRbRkZUX0lEWF9SKDIpXSAtIGZmdFtGRlRfSURYX0koMyldOwogICAgbUh5YnJpZEltYWdbMV0gPSBmZnRbRkZUX0lEWF9JKDApXSAtIGZmdFtGRlRfSURYX1IoMSldIC0gZmZ0W0ZGVF9JRFhfSSgyKV0gKyBmZnRbRkZUX0lEWF9SKDMpXTsKCiAgICAvKgogICAgZmZ0IGJpbiBtPTI6CiAgICBYWzIsIG5dID0geFswXSAtICAgeFsxXSArIHhbMl0gLSAgIHhbM10KICAgICovCiAgICBtSHlicmlkUmVhbFsyXSA9IGZmdFtGRlRfSURYX1IoMCldIC0gZmZ0W0ZGVF9JRFhfUigxKV0gKyBmZnRbRkZUX0lEWF9SKDIpXSAtIGZmdFtGRlRfSURYX1IoMyldOwogICAgbUh5YnJpZEltYWdbMl0gPSBmZnRbRkZUX0lEWF9JKDApXSAtIGZmdFtGRlRfSURYX0koMSldICsgZmZ0W0ZGVF9JRFhfSSgyKV0gLSBmZnRbRkZUX0lEWF9JKDMpXTsKCiAgICAvKgogICAgZmZ0IGJpbiBtPTM6CiAgICBYWzMsIG5dID0geFswXSArIGoqeFsxXSAtIHhbMl0gLSBqKnhbM10KICAgICovCiAgICBtSHlicmlkUmVhbFszXSA9IGZmdFtGRlRfSURYX1IoMCldIC0gZmZ0W0ZGVF9JRFhfSSgxKV0gLSBmZnRbRkZUX0lEWF9SKDIpXSArIGZmdFtGRlRfSURYX0koMyldOwogICAgbUh5YnJpZEltYWdbM10gPSBmZnRbRkZUX0lEWF9JKDApXSArIGZmdFtGRlRfSURYX1IoMSldIC0gZmZ0W0ZGVF9JRFhfSSgyKV0gLSBmZnRbRkZUX0lEWF9SKDMpXTsKfQoKCnN0YXRpYyB2b2lkIGVpZ2h0Q2hhbm5lbEZpbHRlcmluZygKICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mUmVhbCwKICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKICAgICAgICBjb25zdCBJTlQgKmNvbnN0ICAgICAgICAgICBwUmVhZElkeCwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkUmVhbCwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBpbnZlcnQKICAgICAgICApCnsKICAgIGNvbnN0IEZJWFBfSFRQICpwID0gSHliRmlsdGVyQ29lZjg7CiAgICBJTlQgaywgc2M7CgogICAgRklYUF9EQkwgbWZmdFsxNitBTElHTk1FTlRfREVGQVVMVF07CiAgICBGSVhQX0RCTCAqcGZmdCA9IChGSVhQX0RCTCopQUxJR05fUFRSKG1mZnQpOwoKICAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MiwgYWNjdTMsIGFjY3U0OwoKICAgIC8qIHByZSB0d2lkZGVsaW5nICovCiAgICBwZmZ0W0ZGVF9JRFhfUigwKV0gPSBmTXVsdERpdjIocFswXS52LnJlLCBwUW1mUmVhbFtwUmVhZElkeFs2XV0pOwogICAgcGZmdFtGRlRfSURYX0koMCldID0gZk11bHREaXYyKHBbMF0udi5yZSwgcFFtZkltYWdbcFJlYWRJZHhbNl1dKTsKCiAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzddXSwgcFFtZkltYWdbcFJlYWRJZHhbN11dLCBwWzFdKTsKICAgIHBmZnRbRkZUX0lEWF9SKDEpXSA9IGFjY3UxOwogICAgcGZmdFtGRlRfSURYX0koMSldID0gYWNjdTI7CgogICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFswXV0sIHBRbWZJbWFnW3BSZWFkSWR4WzBdXSwgcFsyXSk7CiAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBRbWZSZWFsW3BSZWFkSWR4WzhdXSwgcFFtZkltYWdbcFJlYWRJZHhbOF1dLCBwWzNdKTsKICAgIHBmZnRbRkZUX0lEWF9SKDIpXSA9IGFjY3UxICsgYWNjdTM7CiAgICBwZmZ0W0ZGVF9JRFhfSSgyKV0gPSBhY2N1MiArIGFjY3U0OwoKICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbcFJlYWRJZHhbMV1dLCBwUW1mSW1hZ1twUmVhZElkeFsxXV0sIHBbNF0pOwogICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtwUmVhZElkeFs5XV0sIHBRbWZJbWFnW3BSZWFkSWR4WzldXSwgcFs1XSk7CiAgICBwZmZ0W0ZGVF9JRFhfUigzKV0gPSBhY2N1MSArIGFjY3UzOwogICAgcGZmdFtGRlRfSURYX0koMyldID0gYWNjdTIgKyBhY2N1NDsKCiAgICBwZmZ0W0ZGVF9JRFhfUig0KV0gPSBmTXVsdERpdjIocFFtZkltYWdbcFJlYWRJZHhbMTBdXSwgcFs3XS52LmltKSAtIGZNdWx0RGl2MihwUW1mSW1hZ1twUmVhZElkeFsgMl1dLCBwWzZdLnYuaW0pOwogICAgcGZmdFtGRlRfSURYX0koNCldID0gZk11bHREaXYyKHBRbWZSZWFsW3BSZWFkSWR4WyAyXV0sIHBbNl0udi5pbSkgLSBmTXVsdERpdjIocFFtZlJlYWxbcFJlYWRJZHhbMTBdXSwgcFs3XS52LmltKTsKCiAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WyAzXV0sIHBRbWZJbWFnW3BSZWFkSWR4WyAzXV0sIHBbOF0pOwogICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtwUmVhZElkeFsxMV1dLCBwUW1mSW1hZ1twUmVhZElkeFsxMV1dLCBwWzldKTsKICAgIHBmZnRbRkZUX0lEWF9SKDUpXSA9IGFjY3UxICsgYWNjdTM7CiAgICBwZmZ0W0ZGVF9JRFhfSSg1KV0gPSBhY2N1MiArIGFjY3U0OwoKICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbcFJlYWRJZHhbIDRdXSwgcFFtZkltYWdbcFJlYWRJZHhbIDRdXSwgcFsxMF0pOwogICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtwUmVhZElkeFsxMl1dLCBwUW1mSW1hZ1twUmVhZElkeFsxMl1dLCBwWzExXSk7CiAgICBwZmZ0W0ZGVF9JRFhfUig2KV0gPSBhY2N1MSArIGFjY3UzOwogICAgcGZmdFtGRlRfSURYX0koNildID0gYWNjdTIgKyBhY2N1NDsKCiAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WyA1XV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA1XV0sIHBbMTJdKTsKICAgIHBmZnRbRkZUX0lEWF9SKDcpXSA9IGFjY3UxOwogICAgcGZmdFtGRlRfSURYX0koNyldID0gYWNjdTI7CgogICAgLyogZmZ0IG1vZHVsYXRpb24gKi8KICAgIGZmdF84IChwZmZ0KTsKICAgIHNjID0gMSArIDI7CgogICAgaWYgKGludmVydCkgewogICAgICBtSHlicmlkUmVhbFswXSAgPSBwZmZ0W0ZGVF9JRFhfUig3KV0gPDwgc2M7CiAgICAgIG1IeWJyaWRJbWFnWzBdICA9IHBmZnRbRkZUX0lEWF9JKDcpXSA8PCBzYzsKICAgICAgbUh5YnJpZFJlYWxbMV0gID0gcGZmdFtGRlRfSURYX1IoMCldIDw8IHNjOwogICAgICBtSHlicmlkSW1hZ1sxXSAgPSBwZmZ0W0ZGVF9JRFhfSSgwKV0gPDwgc2M7CgogICAgICBtSHlicmlkUmVhbFsyXSAgPSBwZmZ0W0ZGVF9JRFhfUig2KV0gPDwgc2M7CiAgICAgIG1IeWJyaWRJbWFnWzJdICA9IHBmZnRbRkZUX0lEWF9JKDYpXSA8PCBzYzsKICAgICAgbUh5YnJpZFJlYWxbM10gID0gcGZmdFtGRlRfSURYX1IoMSldIDw8IHNjOwogICAgICBtSHlicmlkSW1hZ1szXSAgPSBwZmZ0W0ZGVF9JRFhfSSgxKV0gPDwgc2M7CgogICAgICBtSHlicmlkUmVhbFs0XSAgPSBwZmZ0W0ZGVF9JRFhfUigyKV0gPDwgc2M7CiAgICAgIG1IeWJyaWRSZWFsWzRdICs9IHBmZnRbRkZUX0lEWF9SKDUpXSA8PCBzYzsKICAgICAgbUh5YnJpZEltYWdbNF0gID0gcGZmdFtGRlRfSURYX0koMildIDw8IHNjOwogICAgICBtSHlicmlkSW1hZ1s0XSArPSBwZmZ0W0ZGVF9JRFhfSSg1KV0gPDwgc2M7CgogICAgICBtSHlicmlkUmVhbFs1XSAgPSBwZmZ0W0ZGVF9JRFhfUigzKV0gPDwgc2M7CiAgICAgIG1IeWJyaWRSZWFsWzVdICs9IHBmZnRbRkZUX0lEWF9SKDQpXSA8PCBzYzsKICAgICAgbUh5YnJpZEltYWdbNV0gID0gcGZmdFtGRlRfSURYX0koMyldIDw8IHNjOwogICAgICBtSHlicmlkSW1hZ1s1XSArPSBwZmZ0W0ZGVF9JRFhfSSg0KV0gPDwgc2M7CiAgICB9CiAgICBlbHNlIHsKICAgICAgZm9yKGs9MDsgazw4O2srKyApIHsKICAgICAgICBtSHlicmlkUmVhbFtrXSA9IHBmZnRbRkZUX0lEWF9SKGspXSA8PCBzYzsKICAgICAgICBtSHlicmlkSW1hZ1trXSA9IHBmZnRbRkZUX0lEWF9JKGspXSA8PCBzYzsKICAgICAgfQogICAgfQp9CgpzdGF0aWMgSU5UIGtDaGFubmVsRmlsdGVyaW5nKAogICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAogICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAogICAgICAgIGNvbnN0IElOVCAqY29uc3QgICAgICAgICAgIHBSZWFkSWR4LAogICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRSZWFsLAogICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRJbWFnLAogICAgICAgIGNvbnN0IFNDSEFSICAgICAgICAgICAgICAgIGh5YnJpZENvbmZpZwogICAgICAgICkKewogICAgSU5UIGVyciA9IDA7CgogICAgc3dpdGNoIChoeWJyaWRDb25maWcpIHsKICAgICAgY2FzZSAgMjoKICAgICAgY2FzZSAtMjoKICAgICAgICBkdWFsQ2hhbm5lbEZpbHRlcmluZyhwUW1mUmVhbCwgcFFtZkltYWcsIHBSZWFkSWR4LCBtSHlicmlkUmVhbCwgbUh5YnJpZEltYWcsIChoeWJyaWRDb25maWc8MCkgPyAxIDogMCApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICA0OgogICAgICBjYXNlIC00OgogICAgICAgIGZvdXJDaGFubmVsRmlsdGVyaW5nKHBRbWZSZWFsLCBwUW1mSW1hZywgcFJlYWRJZHgsIG1IeWJyaWRSZWFsLCBtSHlicmlkSW1hZywgKGh5YnJpZENvbmZpZzwwKSA/IDEgOiAwICk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIDg6CiAgICAgIGNhc2UgLTg6CiAgICAgICAgZWlnaHRDaGFubmVsRmlsdGVyaW5nKHBRbWZSZWFsLCBwUW1mSW1hZywgcFJlYWRJZHgsIG1IeWJyaWRSZWFsLCBtSHlicmlkSW1hZywgKGh5YnJpZENvbmZpZzwwKSA/IDEgOiAwICk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgZXJyID0gLTE7CiAgICB9CgogICAgcmV0dXJuIGVycjsKfQoKCgo=