Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKToKICAgRGVzY3JpcHRpb246IFNjYWxpbmcgb3BlcmF0aW9ucwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImNvbW1vbl9maXguaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElubGluZSBkZWZpbml0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIFNDQUxFX0lOTElORSBpbmxpbmUKCgojaWYgZGVmaW5lZChfX21pcHNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwojaW5jbHVkZSAibWlwcy9zY2FsZS5jcHAiCgojZWxpZiBkZWZpbmVkKF9fYXJtX18pCiNpbmNsdWRlICJhcm0vc2NhbGVfYXJtLmNwcCIKCiNlbmRpZgoKI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlc19TR0wKLyohCiAqCiAqICBcYnJpZWYgIE11bHRpcGx5IGlucHV0IHZlY3RvciBieSBcZiQgMl57c2NhbGVmYWN0b3J9IFxmJAogKiAgXHBhcmFtIGxlbiAgICBtdXN0IGJlIGxhcmdlciB0aGFuIDQKICogIFxyZXR1cm4gdm9pZAogKgogKi8KI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc19TR0wKU0NBTEVfSU5MSU5FCnZvaWQgc2NhbGVWYWx1ZXMoRklYUF9TR0wgKnZlY3RvciwgIC8qITwgVmVjdG9yICovCiAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgICAvKiE8IExlbmd0aCAqLwogICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgICAgLyohPCBTY2FsZWZhY3RvciAqLwogICAgICAgICAgICAgICAgICkKewogIElOVCBpOwoKICAvKiBSZXR1cm4gaWYgc2NhbGVmYWN0b3IgaXMgWmVybyAqLwogIGlmIChzY2FsZWZhY3Rvcj09MCkgcmV0dXJuOwoKICBpZihzY2FsZWZhY3RvciA+IDApewogICAgc2NhbGVmYWN0b3IgPSBmaXhtaW5fSShzY2FsZWZhY3RvciwoSU5UKShERlJBQ1RfQklUUy0xKSk7CiAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCiAgICB7CiAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgIH0KICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCiAgICB7CiAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CiAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgIH0KICB9IGVsc2UgewogICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7CiAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCiAgICB7CiAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgIH0KICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCiAgICB7CiAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwogICAgICAqKHZlY3RvcisrKSA+Pj0gbmVnU2NhbGVmYWN0b3I7CiAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgIH0KICB9Cn0KI2VuZGlmCgojaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzX0RCTAovKiEKICoKICogIFxicmllZiAgTXVsdGlwbHkgaW5wdXQgdmVjdG9yIGJ5IFxmJCAyXntzY2FsZWZhY3Rvcn0gXGYkCiAqICBccGFyYW0gbGVuIG11c3QgYmUgbGFyZ2VyIHRoYW4gNAogKiAgXHJldHVybiB2b2lkCiAqCiAqLwojZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzX0RCTApTQ0FMRV9JTkxJTkUKdm9pZCBzY2FsZVZhbHVlcyhGSVhQX0RCTCAqdmVjdG9yLCAgICAvKiE8IFZlY3RvciAqLwogICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgICAgIC8qITwgTGVuZ3RoICovCiAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAgICAgLyohPCBTY2FsZWZhY3RvciAqLwogICAgICAgICAgICAgICAgKQp7CiAgSU5UIGk7CgogIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCiAgaWYgKHNjYWxlZmFjdG9yPT0wKSByZXR1cm47CgogIGlmKHNjYWxlZmFjdG9yID4gMCl7CiAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7CiAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCiAgICB7CiAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgIH0KICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCiAgICB7CiAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CiAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgIH0KICB9IGVsc2UgewogICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7CiAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCiAgICB7CiAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgIH0KICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCiAgICB7CiAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwogICAgICAqKHZlY3RvcisrKSA+Pj0gbmVnU2NhbGVmYWN0b3I7CiAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgIH0KICB9Cn0KI2VuZGlmCgojaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzX0RCTERCTAovKiEKICoKICogIFxicmllZiAgTXVsdGlwbHkgaW5wdXQgdmVjdG9yIHNyYyBieSBcZiQgMl57c2NhbGVmYWN0b3J9IFxmJAogKiAgICAgICAgICBhbmQgcGxhY2UgcmVzdWx0IGludG8gZHN0CiAqICBccGFyYW0gZHN0IGRldGluYXRpb24gYnVmZmVyCiAqICBccGFyYW0gc3JjIHNvdXJjZSBidWZmZXIKICogIFxwYXJhbSBsZW4gbXVzdCBiZSBsYXJnZXIgdGhhbiA0CiAqICBccGFyYW0gc2NhbGVmYWN0b3IgYW1vdW50IG9mIGxlZnQgc2hpZnRzIHRvIGJlIGFwcGxpZWQKICogIFxyZXR1cm4gdm9pZAogKgogKi8KI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc19EQkxEQkwKU0NBTEVfSU5MSU5FCnZvaWQgc2NhbGVWYWx1ZXMoRklYUF9EQkwgKmRzdCwgICAgICAgLyohPCBkc3QgVmVjdG9yICovCiAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnNyYywgLyohPCBzcmMgVmVjdG9yICovCiAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgICAgLyohPCBMZW5ndGggKi8KICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAgICAvKiE8IFNjYWxlZmFjdG9yICovCiAgICAgICAgICAgICAgICApCnsKICBJTlQgaTsKCiAgLyogUmV0dXJuIGlmIHNjYWxlZmFjdG9yIGlzIFplcm8gKi8KICBpZiAoc2NhbGVmYWN0b3I9PTApIHsKCWlmIChkc3QgIT0gc3JjKQogICAgICBGREttZW1tb3ZlKGRzdCwgc3JjLCBsZW4qc2l6ZW9mKEZJWFBfREJMKSk7CiAgfQogIGVsc2UgewoKICAgIGlmKHNjYWxlZmFjdG9yID4gMCl7CiAgICAgIHNjYWxlZmFjdG9yID0gZml4bWluX0koc2NhbGVmYWN0b3IsKElOVClERlJBQ1RfQklUUy0xKTsKICAgICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQogICAgICB7CiAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA8PCBzY2FsZWZhY3RvcjsKICAgICAgfQogICAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQogICAgICB7CiAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA8PCBzY2FsZWZhY3RvcjsKICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOwogICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CiAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA8PCBzY2FsZWZhY3RvcjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7CiAgICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKICAgICAgewogICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CiAgICAgIH0KICAgICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKICAgICAgewogICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CiAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspID4+IG5lZ1NjYWxlZmFjdG9yOwogICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CiAgICAgIH0KICAgIH0KICB9Cn0KI2VuZGlmCgojaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzV2l0aEZhY3Rvcl9EQkwKLyohCiAqCiAqICBcYnJpZWYgIE11bHRpcGx5IGlucHV0IHZlY3RvciBieSBcZiQgMl57c2NhbGVmYWN0b3J9IFxmJAogKiAgXHBhcmFtIGxlbiBtdXN0IGJlIGxhcmdlciB0aGFuIDQKICogIFxyZXR1cm4gdm9pZAogKgogKi8KI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc1dpdGhGYWN0b3JfREJMClNDQUxFX0lOTElORQp2b2lkIHNjYWxlVmFsdWVzV2l0aEZhY3RvcigKICAgICAgICBGSVhQX0RCTCAqdmVjdG9yLAogICAgICAgIEZJWFBfREJMIGZhY3RvciwKICAgICAgICBJTlQgbGVuLAogICAgICAgIElOVCBzY2FsZWZhY3RvcgogICAgICAgICkKewogIElOVCBpOwoKICAvKiBDb21wZW5zYXRlIGZNdWx0RGl2MiAqLwogIHNjYWxlZmFjdG9yKys7CgogIGlmKHNjYWxlZmFjdG9yID4gMCl7CiAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7CiAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCiAgICB7CiAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA8PCBzY2FsZWZhY3RvcjsKICAgICAgdmVjdG9yKys7CiAgICB9CiAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQogICAgewogICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7IHZlY3RvcisrOwogICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7IHZlY3RvcisrOwogICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7IHZlY3RvcisrOwogICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7IHZlY3RvcisrOwogICAgfQogIH0gZWxzZSB7CiAgICBJTlQgbmVnU2NhbGVmYWN0b3IgPSBmaXhtaW5fSSgtc2NhbGVmYWN0b3IsKElOVClERlJBQ1RfQklUUy0xKTsKICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKICAgIHsKICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpID4+IG5lZ1NjYWxlZmFjdG9yOwogICAgICB2ZWN0b3IrKzsKICAgIH0KICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCiAgICB7CiAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA+PiBuZWdTY2FsZWZhY3RvcjsgdmVjdG9yKys7CiAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA+PiBuZWdTY2FsZWZhY3RvcjsgdmVjdG9yKys7CiAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA+PiBuZWdTY2FsZWZhY3RvcjsgdmVjdG9yKys7CiAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA+PiBuZWdTY2FsZWZhY3RvcjsgdmVjdG9yKys7CiAgICB9CiAgfQp9CiNlbmRpZiAvKiBGVU5DVElPTl9zY2FsZVZhbHVlc1dpdGhGYWN0b3JfREJMICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCklNUE9SVEFOVCBOT1RFIGZvciB1c2FnZSBvZiBnZXRTY2FsZWZhY3RvcigpCgpJZiB0aGUgaW5wdXQgYXJyYXkgY29udGFpbnMgbmVnYXRpdmUgdmFsdWVzIHRvbywgdGhlbiB0aGVzZSBmdW5jdGlvbnMgbWF5IHNvbWV0aW1lcyByZXR1cm4KdGhlIGFjdHVhbCBtYXhpbXVtIHZhbHVlIG1pbnVzIDEsIGR1ZSB0byB0aGUgbmF0dXJlIG9mIHRoZSBhcHBsaWVkIGFsZ29yaXRobS4KU28gYmUgY2FyZWZ1bCB3aXRoIHBvc3NpYmxlIGZyYWN0aW9uYWwgLTEgdmFsdWVzIHRoYXQgbWF5IGxlYWQgdG8gb3ZlcmZsb3dzIHdoZW4gYmVpbmcgZlBvdzIoKSdlZC4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgojaWZuZGVmIEZVTkNUSU9OX2dldFNjYWxlZmFjdG9yU2hvcnQKLyohCiAqCiAqICBcYnJpZWYgQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBzY2FsZSBmYWN0b3IgZm9yIGlucHV0IHZlY3RvciBvZiBzaG9ydHMKICoKICogIFxyZXR1cm4gTWF4aW11bSBzY2FsZSBmYWN0b3IgLyBwb3NzaWJsZSBsZWZ0IHNoaWZ0CiAqCiAqLwojZGVmaW5lIEZVTkNUSU9OX2dldFNjYWxlZmFjdG9yU2hvcnQKU0NBTEVfSU5MSU5FCklOVCBnZXRTY2FsZWZhY3RvclNob3J0KGNvbnN0IFNIT1JUICp2ZWN0b3IsIC8qITwgUG9pbnRlciB0byBpbnB1dCB2ZWN0b3IgKi8KICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbiAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgaW5wdXQgdmVjdG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgSU5UIGk7CiAgU0hPUlQgdGVtcCwgbWF4VmFsID0gMDsKCiAgZm9yKGk9bGVuO2khPTA7aS0tKXsKICAgIHRlbXAgPSAoU0hPUlQpKCp2ZWN0b3IrKyk7CiAgICBtYXhWYWwgfD0gKHRlbXBeKHRlbXA+PihTSE9SVF9CSVRTLTEpKSk7CiAgfQoKICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QoKElOVCltYXhWYWwpIC0gKElOVCkxIC0gKElOVCkoREZSQUNUX0JJVFMgLSBTSE9SVF9CSVRTKSkpOwp9CiNlbmRpZgoKI2lmbmRlZiBGVU5DVElPTl9nZXRTY2FsZWZhY3RvclBDTQovKiEKICoKICogIFxicmllZiBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHNjYWxlIGZhY3RvciBmb3IgaW5wdXQgdmVjdG9yIG9mIHNob3J0cwogKgogKiAgXHJldHVybiBNYXhpbXVtIHNjYWxlIGZhY3RvcgogKgogKi8KI2RlZmluZSBGVU5DVElPTl9nZXRTY2FsZWZhY3RvclBDTQpTQ0FMRV9JTkxJTkUKSU5UIGdldFNjYWxlZmFjdG9yUENNKGNvbnN0IElOVF9QQ00gKnZlY3RvciwgLyohPCBQb2ludGVyIHRvIGlucHV0IHZlY3RvciAqLwogICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KICAgICAgICAgICAgICAgICAgICAgIElOVCBzdHJpZGUKICAgICAgICAgICAgICAgICAgICAgICkKewogIElOVCBpOwogIElOVF9QQ00gdGVtcCwgbWF4VmFsID0gMDsKCiAgZm9yKGk9bGVuO2khPTA7aS0tKXsKICAgIHRlbXAgPSAoSU5UX1BDTSkoKnZlY3Rvcik7IHZlY3Rvcis9c3RyaWRlOwogICAgbWF4VmFsIHw9ICh0ZW1wXih0ZW1wPj4oKHNpemVvZihJTlRfUENNKSo4KS0xKSkpOwogIH0KICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QoKElOVCltYXhWYWwpIC0gKElOVCkxIC0gKElOVCkoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUykpKTsKfQojZW5kaWYKCiNpZm5kZWYgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JTaG9ydAovKiEKICoKICogIFxicmllZiBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHNjYWxlIGZhY3RvciBmb3IgaW5wdXQgdmVjdG9yIG9mIHNob3J0cwogKiAgXHBhcmFtIHN0cmlkZSwgaXRlbSBpbmNyZW1lbnQgYmV0d2VlbiB2ZWN0b3IgbWVtYmVycy4KICogIFxyZXR1cm4gTWF4aW11bSBzY2FsZSBmYWN0b3IKICoKICovCiNkZWZpbmUgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JTaG9ydApTQ0FMRV9JTkxJTkUKSU5UIGdldFNjYWxlZmFjdG9yU2hvcnQoY29uc3QgU0hPUlQgKnZlY3RvciwgLyohPCBQb2ludGVyIHRvIGlucHV0IHZlY3RvciAqLwogICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0cmlkZQogICAgICAgICAgICAgICAgICAgICAgICkKewogIElOVCBpOwogIFNIT1JUIHRlbXAsIG1heFZhbCA9IDA7CgogIGZvcihpPWxlbjtpIT0wO2ktLSl7CiAgICB0ZW1wID0gKFNIT1JUKSgqdmVjdG9yKTsgdmVjdG9yKz1zdHJpZGU7CiAgICBtYXhWYWwgfD0gKHRlbXBeKHRlbXA+PihTSE9SVF9CSVRTLTEpKSk7CiAgfQoKICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QoKElOVCltYXhWYWwpIC0gKElOVCkxIC0gKElOVCkoREZSQUNUX0JJVFMgLSBTSE9SVF9CSVRTKSkpOwp9CiNlbmRpZgoKI2lmbmRlZiBGVU5DVElPTl9nZXRTY2FsZWZhY3Rvcl9EQkwKLyohCiAqCiAqICBcYnJpZWYgQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBzY2FsZSBmYWN0b3IgZm9yIGlucHV0IHZlY3RvcgogKgogKiAgXHJldHVybiBNYXhpbXVtIHNjYWxlIGZhY3RvcgogKgogKiAgVGhpcyBmdW5jdGlvbiBjYW4gY29uc3RpdHV0ZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb21wdXRhdGlvbmFsIGNvbXBsZXhpdHkgLSB2ZXJ5IG11Y2ggZGVwZW5kaW5nIG9uIHRoZQogKiAgYml0cmF0ZS4gU2luY2UgaXQgaXMgYSByYXRoZXIgc21hbGwgZnVuY3Rpb24sIGVmZmVjdGl2ZSBhc3NlbWJsZXIgb3B0aW1pemF0aW9uIG1pZ2h0IGJlIHBvc3NpYmxlLgogKgogKi8KI2RlZmluZSBGVU5DVElPTl9nZXRTY2FsZWZhY3Rvcl9EQkwKU0NBTEVfSU5MSU5FCklOVCBnZXRTY2FsZWZhY3Rvcihjb25zdCBGSVhQX0RCTCAqdmVjdG9yLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgdmVjdG9yICovCiAgICAgICAgICAgICAgICAgICBJTlQgbGVuKSAgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KewogIElOVCBpOwogIEZJWFBfREJMIHRlbXAsIG1heFZhbCA9IChGSVhQX0RCTCkwOwoKICBmb3IoaT1sZW47aSE9MDtpLS0pewogICAgdGVtcCA9IChMT05HKSgqdmVjdG9yKyspOwogICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpdGVtcF4oTE9ORykodGVtcD4+KERGUkFDVF9CSVRTLTEpKSk7CiAgfQoKICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QobWF4VmFsKSAtIDEpKTsKfQojZW5kaWYKCiNpZm5kZWYgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JfU0dMCiNkZWZpbmUgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JfU0dMClNDQUxFX0lOTElORQpJTlQgZ2V0U2NhbGVmYWN0b3IoY29uc3QgRklYUF9TR0wgKnZlY3RvciwgLyohPCBQb2ludGVyIHRvIGlucHV0IHZlY3RvciAqLwogICAgICAgICAgICAgICAgICAgSU5UIGxlbikgICAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgaW5wdXQgdmVjdG9yICovCnsKICBJTlQgaTsKICBTSE9SVCB0ZW1wLCBtYXhWYWwgPSAoRklYUF9TR0wpMDsKCiAgZm9yKGk9bGVuO2khPTA7aS0tKXsKICAgIHRlbXAgPSAoU0hPUlQpKCp2ZWN0b3IrKyk7CiAgICBtYXhWYWwgfD0gKHRlbXBeKHRlbXA+PihGUkFDVF9CSVRTLTEpKSk7CiAgfQoKICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QoRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpbWF4VmFsKSkgLSAxKSk7Cn0KI2VuZGlmCgo=