Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBFcmljIEFsbGFtYW5jaGUKICAgRGVzY3JpcHRpb246IGEgcnVkaW1lbnRhcnkgd2F2IGZpbGUgaW50ZXJmYWNlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCiNpbmNsdWRlICJ3YXZfZmlsZS5oIgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKCgpzdGF0aWMgSU5UX1BDTSB1bGF3MnBjbSAoVUNIQVIgdWxhd2J5dGUpOwoKLyohCiAqCiAqICBcYnJpZWYgUmVhZCBoZWFkZXIgZnJvbSBhIFdBVkVmaWxlLiBIb3N0IGVuZGlhbmVzcyBpcyBoYW5kbGVkIGFjY29yZGluZ2x5LgogKiAgXHdhdi0+ZnAgZmlsZXBvaW50ZXIgb2YgdHlwZSBGSUxFKi4KICogIFx3YXZpbmZvIFNXYXZJbmZvIHN0cnVjdCB3aGVyZSB0aGUgZGVjb2RlZCBoZWFkZXIgaW5mbyBpcyBzdG9yZWQgaW50by4KICogIFxyZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCBub24temVybyBvbiBmYWlsdXJlLgogKgogKi8KSU5UIFdBVl9JbnB1dE9wZW4gKEhBTkRMRV9XQVYgKnBXYXYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQp7CiAgICBIQU5ETEVfV0FWIHdhdiA9IChIQU5ETEVfV0FWKUZES2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IFdBVikpOwogICAgSU5UIG9mZnNldDsKCiAgICBpZiAod2F2ID09IE5VTEwpIHsKICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFVuYWJsZSB0byBhbGxvY2F0ZSBXQVYgc3RydWN0LlxuIik7CiAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgd2F2LT5mcCA9IEZES2ZvcGVuKGZpbGVuYW1lLCAicmIiKTsKICAgIGlmICh3YXYtPmZwID09IE5VTEwpIHsKICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFVuYWJsZSB0byBvcGVuIHdhdiBmaWxlLiAlc1xuIiwgZmlsZW5hbWUpOwogICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIC8qIHJlYWQgUklGRi1jaHVuayAqLwogICAgaWYgKEZES2ZyZWFkKCYod2F2LT5oZWFkZXIucmlmZlR5cGUpLCAxLCA0LCB3YXYtPmZwKSAhPSA0KSB7CiAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBjb3VsZG4ndCByZWFkIFJJRkZfSURcbiIpOwogICAgICBnb3RvIGVycm9yOyAgLyogYmFkIGVycm9yICJjb3VsZG4ndCByZWFkIFJJRkZfSUQiICovCiAgICB9CiAgICBpZiAoRkRLc3RybmNtcCgiUklGRiIsIHdhdi0+aGVhZGVyLnJpZmZUeXBlLCA0KSkgewogICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogUklGRiBkZXNjcmlwdG9yIG5vdCBmb3VuZC5cbiIpIDsKICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICAvKiBSZWFkIFJJRkYgc2l6ZS4gSWdub3JlZC4gKi8KICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIucmlmZlNpemUpLCA0LCAxLCB3YXYtPmZwKTsKCiAgICAvKiByZWFkIFdBVkUtY2h1bmsgKi8KICAgIGlmIChGREtmcmVhZCgmd2F2LT5oZWFkZXIud2F2ZVR5cGUsIDEsIDQsIHdhdi0+ZnApICE9NCkgewogICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogY291bGRuJ3QgcmVhZCBmb3JtYXRcbiIpOwogICAgICBnb3RvIGVycm9yOyAgLyogYmFkIGVycm9yICJjb3VsZG4ndCByZWFkIGZvcm1hdCIgKi8KICAgIH0KICAgIGlmIChGREtzdHJuY21wKCJXQVZFIiwgd2F2LT5oZWFkZXIud2F2ZVR5cGUsIDQpKSB7CiAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBXQVZFIGNodW5rIElEIG5vdCBmb3VuZC5cbiIpIDsKICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICAvKiByZWFkIGZvcm1hdC1jaHVuayAqLwogICAgaWYgKEZES2ZyZWFkKCYod2F2LT5oZWFkZXIuZm9ybWF0VHlwZSksIDEsIDQsIHdhdi0+ZnApICE9IDQpIHsKICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IGNvdWxkbid0IHJlYWQgZm9ybWF0X0lEXG4iKTsKICAgICAgZ290byBlcnJvcjsgIC8qIGJhZCBlcnJvciAiY291bGRuJ3QgcmVhZCBmb3JtYXRfSUQiICovCiAgICB9CiAgICBpZiAoRkRLc3RybmNtcCgiZm10Iiwgd2F2LT5oZWFkZXIuZm9ybWF0VHlwZSwgMykpIHsKICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IGZtdCBjaHVuayBmb3JtYXQgbm90IGZvdW5kLlxuIikgOwogICAgIGdvdG8gZXJyb3I7CiAgICB9CgoKICAgIEZES2ZyZWFkX0VMKCZ3YXYtPmhlYWRlci5mb3JtYXRTaXplLCA0LCAxLCB3YXYtPmZwKTsgICAvKiBzaG91bGQgYmUgMTYgZm9yIFBDTS1mb3JtYXQgKHVuY29tcHJlc3NlZCkgKi8KCgogICAgLyogcmVhZCAgaW5mbyAqLwogICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5jb21wcmVzc2lvbkNvZGUpLCAyLCAxLCB3YXYtPmZwKTsKICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIubnVtQ2hhbm5lbHMpLCAyLCAxLCB3YXYtPmZwKTsKICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIuc2FtcGxlUmF0ZSksIDQsIDEsIHdhdi0+ZnApOwogICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5ieXRlc1BlclNlY29uZCksIDQsIDEsIHdhdi0+ZnApOwogICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5ibG9ja0FsaWduKSwgMiwgMSwgd2F2LT5mcCk7CiAgICBGREtmcmVhZF9FTCgmKHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUpLCAyLCAxLCB3YXYtPmZwKTsKCiAgICBvZmZzZXQgPSB3YXYtPmhlYWRlci5mb3JtYXRTaXplIC0gMTY7CgogICAgLyogV2F2ZSBmb3JtYXQgZXh0ZW5zaWJsZSAqLwogICAgaWYgKHdhdi0+aGVhZGVyLmNvbXByZXNzaW9uQ29kZSA9PSAweEZGRkUpIHsKICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIGd1aWRQQ01bMTZdID0gewogICAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwKICAgICAgICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4MDAsIDB4MzgsIDB4OWIsIDB4NzEKICAgICAgfTsKICAgICAgVVNIT1JUIGV4dHJhRm9ybWF0Qnl0ZXMsIHZhbGlkQml0c1BlclNhbXBsZTsKICAgICAgVUlOVCBjaGFubmVsTWFzazsKICAgICAgVUNIQVIgZ3VpZFsxNl07CiAgICAgIElOVCBpOwoKICAgICAgLyogcmVhZCBleHRyYSBieXRlcyAqLwogICAgICBGREtmcmVhZF9FTCgmKGV4dHJhRm9ybWF0Qnl0ZXMpLCAyLCAxLCB3YXYtPmZwKTsKICAgICAgb2Zmc2V0IC09IDI7CgogICAgICBpZiAoZXh0cmFGb3JtYXRCeXRlcyA+PSAyMikgewogICAgICAgIEZES2ZyZWFkX0VMKCYodmFsaWRCaXRzUGVyU2FtcGxlKSwgMiwgMSwgd2F2LT5mcCk7CiAgICAgICAgRkRLZnJlYWRfRUwoJihjaGFubmVsTWFzayksIDQsIDEsIHdhdi0+ZnApOwogICAgICAgIEZES2ZyZWFkX0VMKCYoZ3VpZCksIDE2LCAxLCB3YXYtPmZwKTsKCiAgICAgICAgLyogY2hlY2sgZm9yIFBDTSBHVUlEICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIGlmIChndWlkW2ldICE9IGd1aWRQQ01baV0pIGJyZWFrOwogICAgICAgIGlmIChpID09IDE2KSB3YXYtPmhlYWRlci5jb21wcmVzc2lvbkNvZGUgPSAweDAxOwoKICAgICAgICBvZmZzZXQgLT0gMjI7CiAgICAgIH0KICAgIH0KCiAgICAvKiBTa2lwIHJlc3Qgb2YgZm10IGhlYWRlciBpZiBhbnkuICovCiAgICBmb3IgKDtvZmZzZXQgPiAwOyBvZmZzZXQtLSkgewogICAgICBGREtmcmVhZCgmd2F2LT5oZWFkZXIuZm9ybWF0U2l6ZSwgMSwgMSwgd2F2LT5mcCk7CiAgICB9CgogICAgZG8gewogICAgICAvKiBSZWFkIGRhdGEgY2h1bmsgSUQgKi8KICAgICAgaWYgKEZES2ZyZWFkKHdhdi0+aGVhZGVyLmRhdGFUeXBlLCAxLCA0LCB3YXYtPmZwKSAhPSA0KSB7CiAgICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFVuYWJsZSB0byByZWFkIGRhdGEgY2h1bmsgSUQuXG4iKTsKICAgICAgICBGREtmcmVlKHdhdik7CiAgICAgICAgZ290byBlcnJvcjsKICAgICAgfQoKICAgICAgLyogUmVhZCBjaHVuayBsZW5ndGguICovCiAgICAgIEZES2ZyZWFkX0VMKCZvZmZzZXQsIDQsIDEsIHdhdi0+ZnApOwoKICAgICAgLyogQ2hlY2sgZm9yIGRhdGEgY2h1bmsgc2lnbmF0dXJlLiAqLwogICAgICBpZiAoRkRLc3RybmNtcCgiZGF0YSIsIHdhdi0+aGVhZGVyLmRhdGFUeXBlLCA0KSA9PSAwKSB7CiAgICAgICAgd2F2LT5oZWFkZXIuZGF0YVNpemUgPSBvZmZzZXQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLyogSnVtcCBvdmVyIG5vbiBkYXRhIGNodW5rLiAqLwogICAgICBmb3IgKDtvZmZzZXQgPiAwOyBvZmZzZXQtLSkgewogICAgICAgIEZES2ZyZWFkKCYod2F2LT5oZWFkZXIuZGF0YVNpemUpLCAxLCAxLCB3YXYtPmZwKTsKICAgICAgfQogICAgfSB3aGlsZSAoIUZES2Zlb2Yod2F2LT5mcCkpOwoKICAgIC8qIHJldHVybiBzdWNjZXNzICovCiAgICAqcFdhdiA9IHdhdjsKICAgIHJldHVybiAwOwoKICAgIC8qIEVycm9yIHBhdGggKi8KZXJyb3I6CiAgICBpZiAod2F2LT5mcCkgewogICAgICBGREtmY2xvc2Uod2F2LT5mcCk7CiAgICAgIHdhdi0+ZnAgPSBOVUxMOwogICAgfQoKICAgIGlmICh3YXYpIHsKICAgICAgRkRLZnJlZSh3YXYpOwogICAgfQoKICAgICpwV2F2ID0gTlVMTDsKCiAgICByZXR1cm4gLTE7Cn0KCi8qIQogKgogKiAgXGJyaWVmIFJlYWQgc2FtcGxlcyBmcm9tIGEgV0FWRWZpbGUuIFRoZSBzYW1wbGVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlb3JkZXIgdG8gdGhlIG5hdGl2ZQogKiAgICBob3N0IGVuZGlhbmVzcyBhbmQgc2NhbGVkIHRvIGZ1bGwgc2NhbGUgb2YgdGhlIElOVF9QQ00gdHlwZSwgZnJvbSB3aGF0ZXZlciBicHMgdGhlIFdBVkVmaWxlCiAqICAgIGhhZCBzcGVjaWZpZWQgaW4gaXRzIGhhYWRlciBkYXRhLgogKgogKiAgXHdhdiBIQU5ETEVfV0FWIG9mIHRoZSB3YXYgZmlsZS4KICogIFxidWZmZXIgUG9pbnRlciB0byBzdG9yZSByZWFkIGRhdGEuCiAqICBcbnVtU2FtcGxlcyBEZXNpcmVkIG51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQuCiAqICBcbkJpdHMgc2FtcGxlIHNpemUgaW4gYml0cyB0byBiZSB1c2VkIGZvciB0aGUgYnVmZmVyCiAqCiAqICBccmV0dXJuIE51bWJlciBvZiBzYW1wbGVzIGFjdHVhbGx5IHJlYWQuCiAqCiAqLwoKSU5UIFdBVl9JbnB1dFJlYWQgKEhBTkRMRV9XQVYgd2F2LCB2b2lkICpidWZmZXIsIFVJTlQgbnVtU2FtcGxlcywgaW50IG5CaXRzKQp7CiAgVUlOVCByZXN1bHQgPSAwIDsKICBVSU5UIGk7CiAgU0NIQVIgKmJwdHIgPSAoU0NIQVIqKWJ1ZmZlcjsKICBMT05HICAqbHB0ciA9IChMT05HKilidWZmZXI7CiAgU0hPUlQgKnNwdHIgPSAoU0hPUlQqKWJ1ZmZlcjsKCiAgc3dpdGNoICh3YXYtPmhlYWRlci5jb21wcmVzc2lvbkNvZGUpCiAgewogICAgY2FzZSAweDAxOiAgLyogUENNIHVuY29tcHJlc3NlZCAqLwogICAgICBpZiAobkJpdHMgPT0gd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSkgewogICAgICAgIHJlc3VsdCA9IEZES2ZyZWFkX0VMKGJ1ZmZlciwgd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSA+PiAzLCBudW1TYW1wbGVzLCB3YXYtPmZwKSA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gMDsKICAgICAgICBmb3IgKGk9MDsgaTxudW1TYW1wbGVzOyBpKyspCiAgICAgICAgewogICAgICAgICAgTE9ORyB0bXAgPSAwOwogICAgICAgICAgcmVzdWx0ICs9IEZES2ZyZWFkX0VMKCZ0bXAsIHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgPj4gMywgMSwgd2F2LT5mcCkgOwoKICAgICAgICAgIC8qIE1vdmUgcmVhZCBiaXRzIHRvIGxvd2VyIGJpdHMgb2YgTE9ORy4gKi8KICAgICAgICAgIGlmICggIUlTX0xJVFRMRV9FTkRJQU4oKSAmJiB3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlICE9IDI0ICYmIHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgPCAzMikgewogICAgICAgICAgICB0bXAgPj49ICgzMi13YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvKiBGdWxsIHNjYWxlICovCiAgICAgICAgICBpZiAod2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSA+IG5CaXRzKQogICAgICAgICAgICB0bXAgPj49ICh3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlLW5CaXRzKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgdG1wIDw8PSAobkJpdHMtd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSk7CiAgICAgICAgICAgIAogICAgICAgICAgaWYgKG5CaXRzID09IDgpCiAgICAgICAgICAgICpicHRyKysgPSAoU0NIQVIpIHRtcDsKICAgICAgICAgIGlmIChuQml0cyA9PSAxNikKICAgICAgICAgICAgKnNwdHIrKyA9IChTSE9SVCkgdG1wOwogICAgICAgICAgaWYgKG5CaXRzID09IDMyKQogICAgICAgICAgICAqbHB0cisrID0gKExPTkcpIHRtcDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA3OiAgLyogdS1MYXcgY29tcHJlc3Npb24gKi8KICAgICAgZm9yIChpPTA7IGk8bnVtU2FtcGxlczsgaSsrKSB7CiAgICAgICAgcmVzdWx0ICs9IEZES2ZyZWFkKCYoYnB0cltpPDwxXSksIDEsIDEsIHdhdi0+ZnApIDsKICAgICAgICBzcHRyW2ldID0gdWxhdzJwY20oYnB0cltpPDwxXSkgOwogICAgICB9CiAgICAgIGJyZWFrIDsKCiAgICBkZWZhdWx0OgogICAgICBGREtwcmludGYoIldBVl9JbnB1dFJlYWQoKTogdW5zdXBwb3J0ZWQgZGF0YS1jb21wcmVzc2lvbiEhIikgOwogICAgICBicmVhayA7CiAgfQogIHJldHVybiByZXN1bHQgOwp9Cgp2b2lkIFdBVl9JbnB1dENsb3NlKEhBTkRMRV9XQVYgKnBXYXYpCnsKICBIQU5ETEVfV0FWIHdhdiA9ICpwV2F2OwoKICBpZiAod2F2ICE9IE5VTEwpIHsKICAgIGlmICh3YXYtPmZwICE9IE5VTEwpIHsKICAgICAgIEZES2ZjbG9zZSh3YXYtPmZwKTsKICAgICAgIHdhdi0+ZnAgPSBOVUxMOwogICAgfQogICAgaWYgKHdhdikgewogICAgICAgRkRLZnJlZSh3YXYpOwogICAgfQogIH0KICAqcFdhdiA9IE5VTEw7Cn0KCi8qIGNvbnZlcnNpb24gb2YgdS1sYXcgdG8gbGluZWFyIGNvZGluZyAqLwpzdGF0aWMgSU5UX1BDTSB1bGF3MnBjbSAoVUNIQVIgdWxhd2J5dGUpCnsKICBzdGF0aWMgY29uc3QgSU5UIGV4cF9sdXRbOF0gPSB7IDAsIDEzMiwgMzk2LCA5MjQsIDE5ODAsIDQwOTIsIDgzMTYsIDE2NzY0IH0gOwogIElOVCBzaWduLCBleHBvbmVudCwgbWFudGlzc2EsIHNhbXBsZSA7CgogIHVsYXdieXRlID0gKFVDSEFSKX51bGF3Ynl0ZSA7CiAgc2lnbiA9ICh1bGF3Ynl0ZSAmIDB4ODApIDsKICBleHBvbmVudCA9ICh1bGF3Ynl0ZSA+PiA0KSAmIDB4MDcgOwogIG1hbnRpc3NhID0gdWxhd2J5dGUgJiAweDBGIDsKCiAgc2FtcGxlID0gZXhwX2x1dFtleHBvbmVudF0gKyAobWFudGlzc2EgPDwgKGV4cG9uZW50ICsgMykpIDsKICBpZiAoc2lnbiAhPSAwKQogICAgc2FtcGxlID0gLXNhbXBsZSA7CgogIHJldHVybiAoSU5UX1BDTSlzYW1wbGUgOwp9CgovKioqKioqKioqKioqKiogV3JpdGVyICoqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIFVJTlQgTGl0dGxlRW5kaWFuMzIoVUlOVCB2KQp7CiAgICBpZiAoSVNfTElUVExFX0VORElBTigpKQogICAgICAgIHJldHVybiB2IDsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKHYgJiAweDAwMDAwMEZGKSA8PCAyNCB8ICh2ICYgMHgwMDAwRkYwMCkgPDwgIDggfCAodiAmIDB4MDBGRjAwMDApID4+ICA4IHwgKHYgJiAweEZGMDAwMDAwKSA+PiAyNDsKfQoKc3RhdGljIFNIT1JUIExpdHRsZUVuZGlhbjE2KFNIT1JUIHYpCnsKICAgIGlmIChJU19MSVRUTEVfRU5ESUFOKCkpCiAgICAgICAgcmV0dXJuIHY7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIChTSE9SVCkoKCh2IDw8IDgpICYgMHhGRjAwKSB8ICgodiA+PiA4KSAmIDB4MDBGRikpOwp9CgpzdGF0aWMgVVNIT1JUIFVucGFjayhVU0hPUlQgdikKewogICAgaWYgKElTX0xJVFRMRV9FTkRJQU4oKSkKICAgICAgcmV0dXJuIHY7CiAgICBlbHNlCiAgICAgIHJldHVybiAoU0hPUlQpKCgodiA8PCA4KSAmIDB4RkYwMCkgfCAoKHYgPj4gOCkgJiAweDAwRkYpKTsKfQoKLyoqCiAqIFdBVl9PdXRwdXRPcGVuCiAqIFxicmllZiBPcGVuIFdBViBvdXRwdXQvd3JpdGVyIGhhbmRsZQogKiBccGFyYW0gcFdhdiBwb2ludGVyIHRvIFdBViBoYW5kbGUgdG8gYmUgcmV0dXJuZWQKICogXHBhcmFtIHNhbXBsZVJhdGUgZGVzaXJlZCBzYW1wbGVyYXRlIG9mIHRoZSByZXN1bHRpbmcgV0FWIGZpbGUKICogXHBhcmFtIG51bUNoYW5uZWxzIGRlc2lyZWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIG9mIHRoZSByZXN1bHRpbmcgV0FWIGZpbGUKICogXHBhcmFtIGJpdHNQZXJTYW1wbGUgZGVzaXJlZCBudW1iZXIgb2YgYml0cyBwZXIgYXVkaW8gc2FtcGxlIG9mIHRoZSByZXN1bHRpbmcgV0FWIGZpbGUKICoKICogXHJldHVybiB2YWx1ZTogICAwOiBvawogKiAgICAgICAgICAgICAgICAgLTE6IGVycm9yCiAqLwpJTlQgV0FWX091dHB1dE9wZW4oSEFORExFX1dBViAqcFdhdiwgY29uc3QgY2hhciAqb3V0cHV0RmlsZW5hbWUsIElOVCBzYW1wbGVSYXRlLCBJTlQgbnVtQ2hhbm5lbHMsIElOVCBiaXRzUGVyU2FtcGxlKQp7CiAgSEFORExFX1dBViB3YXYgPSAoSEFORExFX1dBVilGREtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBXQVYpKTsKICBVSU5UIHNpemUgPSAwOwoKICBpZiAoYml0c1BlclNhbXBsZSAhPSAxNiAmJiBiaXRzUGVyU2FtcGxlICE9IDI0ICYmIGJpdHNQZXJTYW1wbGUgIT0gMzIpCiAgewogICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRPcGVuKCk6IEludmFsaWQgYXJndW1lbnQgKGJpdHNQZXJTYW1wbGUpLlxuIik7CiAgICAgIGdvdG8gYmFpbDsKICB9CgogIHdhdi0+ZnAgPSBGREtmb3BlbihvdXRwdXRGaWxlbmFtZSwgIndiIik7CiAgaWYgKHdhdi0+ZnAgPT0gTlVMTCkKICB7CiAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dE9wZW4oKTogdW5hYmxlIHRvIGNyZWF0ZSBmaWxlICVzXG4iLCBvdXRwdXRGaWxlbmFtZSk7CiAgICAgIGdvdG8gYmFpbDsKICB9CgogIEZES3N0cmNweSh3YXYtPmhlYWRlci5yaWZmVHlwZSwgIlJJRkYiKTsKICB3YXYtPmhlYWRlci5yaWZmU2l6ZSA9IExpdHRsZUVuZGlhbjMyKDB4N2ZmZmZmZmYpOyAgLyogaW4gY2FzZSBmc2VlaygpIGRvZXNuJ3Qgd29yayBsYXRlciBpbiBXQVZfT3V0cHV0Q2xvc2UoKSAqLwogIEZES3N0cmNweSh3YXYtPmhlYWRlci53YXZlVHlwZSwgIldBVkUiKTsKCiAgRkRLc3RyY3B5KHdhdi0+aGVhZGVyLmZvcm1hdFR5cGUsICJmbXQgIik7CiAgd2F2LT5oZWFkZXIuZm9ybWF0U2l6ZSA9IExpdHRsZUVuZGlhbjMyKDE2KTsKCiAgd2F2LT5oZWFkZXIuY29tcHJlc3Npb25Db2RlID0gTGl0dGxlRW5kaWFuMTYoMHgwMSk7CiAgd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSAgID0gTGl0dGxlRW5kaWFuMTYoKFNIT1JUKWJpdHNQZXJTYW1wbGUpOwogIHdhdi0+aGVhZGVyLm51bUNoYW5uZWxzICAgICA9IExpdHRsZUVuZGlhbjE2KChTSE9SVCludW1DaGFubmVscyk7CiAgd2F2LT5oZWFkZXIuYmxvY2tBbGlnbiAgICAgID0gTGl0dGxlRW5kaWFuMTYoKFNIT1JUKShudW1DaGFubmVscyAqIChiaXRzUGVyU2FtcGxlID4+IDMpKSk7CiAgd2F2LT5oZWFkZXIuc2FtcGxlUmF0ZSAgICAgID0gTGl0dGxlRW5kaWFuMzIoc2FtcGxlUmF0ZSk7CiAgd2F2LT5oZWFkZXIuYnl0ZXNQZXJTZWNvbmQgID0gTGl0dGxlRW5kaWFuMzIoc2FtcGxlUmF0ZSAqIHdhdi0+aGVhZGVyLmJsb2NrQWxpZ24pOwogIEZES3N0cmNweSh3YXYtPmhlYWRlci5kYXRhVHlwZSwgImRhdGEiKTsKICB3YXYtPmhlYWRlci5kYXRhU2l6ZSAgICAgICAgPSBMaXR0bGVFbmRpYW4zMigweDdmZmZmZmZmIC0gMzYpOwoKCiAgc2l6ZSA9IHNpemVvZihXQVZfSEVBREVSKTsKICBpZiAoRkRLZndyaXRlKCZ3YXYtPmhlYWRlciwgMSwgc2l6ZSwgd2F2LT5mcCkgIT0gc2l6ZSkKICB7CiAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dE9wZW4oKTogZXJyb3Igd3JpdGluZyB0byBvdXRwdXQgZmlsZSAlc1xuIiwgb3V0cHV0RmlsZW5hbWUpOwogICAgICBnb3RvIGJhaWw7CiAgfQoKCiAgd2F2LT5oZWFkZXIuZGF0YVNpemUgPSB3YXYtPmhlYWRlci5yaWZmU2l6ZSA9IDA7CgogICpwV2F2ID0gd2F2OwoKICByZXR1cm4gMDsKCmJhaWw6CiAgaWYgKHdhdi0+ZnApCiAgICBGREtmY2xvc2Uod2F2LT5mcCk7CiAgaWYgKHdhdikKICAgIEZES2ZyZWUod2F2KTsKCiAgcFdhdiA9IE5VTEw7CgogIHJldHVybiAtMTsKfQoKCi8qKgogKiBXQVZfT3V0cHV0V3JpdGUKICogXGJyaWVmIFdyaXRlIGRhdGEgdG8gV0FWIGZpbGUgYXNvY2lhdGVkIHRvIFdBViBoYW5kbGUKICoKICogXHBhcmFtIHdhdiBoYW5kbGUgb2Ygd2F2ZSBmaWxlCiAqIFxwYXJhbSBzYW1wbGVCdWZmZXIgcG9pbnRlciB0byBhdWRpbyBzYW1wbGVzLCByaWdodCBqdXN0aWZpZWQgaW50ZWdlciB2YWx1ZXMKICogXHBhcmFtIG5CdWZCaXRzIHNpemUgaW4gYml0cyBvZiBlYWNoIGF1ZGlvIHNhbXBsZSBpbiBzYW1wbGVCdWZmZXIKICogXHBhcmFtIG5TaWdCaXRzIGFtb3VudCBvZiBzaWduaWZpY2FudCBiaXRzIG9mIGVhY2ggbkJ1ZkJpdHMgaW4gc2FtcGxlQnVmZmVyCiAqCiAqIFxyZXR1cm4gdmFsdWU6ICAgIDA6IG9rCiAqICAgICAgICAgICAgICAgICAgLTE6IGVycm9yCiAqLwpJTlQgV0FWX091dHB1dFdyaXRlKEhBTkRMRV9XQVYgd2F2LCB2b2lkICpzYW1wbGVCdWZmZXIsIFVJTlQgbnVtYmVyT2ZTYW1wbGVzLCBpbnQgbkJ1ZkJpdHMsIGludCBuU2lnQml0cykKewogICAgU0NIQVIgKmJwdHIgPSAoU0NIQVIqKXNhbXBsZUJ1ZmZlcjsKICAgIFNIT1JUICpzcHRyID0gKFNIT1JUKilzYW1wbGVCdWZmZXI7CiAgICBMT05HICAqbHB0ciA9IChMT05HKilzYW1wbGVCdWZmZXI7CiAgICBMT05HIHRtcDsKICAgIAogICAgaW50IGJwcyA9IFVucGFjayh3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlKTsKICAgIFVJTlQgaTsKCiAgICAvKiBQYWNrIHNhbXBsZXMgaWYgcmVxdWlyZWQgKi8KICAgIGlmIChicHMgPT0gbkJ1ZkJpdHMgJiYgYnBzID09IG5TaWdCaXRzKSB7CiAgICAgIGlmIChGREtmd3JpdGVfRUwoc2FtcGxlQnVmZmVyLCAoYnBzPj4zKSwgbnVtYmVyT2ZTYW1wbGVzLCB3YXYtPmZwKSAhPSBudW1iZXJPZlNhbXBsZXMpCiAgICAgIHsKICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRXcml0ZSgpOiBlcnJvcjogdW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgJWRcbiIsIHdhdi0+ZnApOwogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgfSBlbHNlICB7CiAgICAgIGZvciAoaT0wOyBpPG51bWJlck9mU2FtcGxlczsgaSsrKQogICAgICB7CiAgICAgICAgaW50IHJlc3VsdDsKICAgICAgICBpbnQgc2hpZnQ7CiAgICAgICAgCiAgICAgICAgc3dpdGNoIChuQnVmQml0cykgewogICAgICAgICAgY2FzZSA4OiAgdG1wID0gKmJwdHIrKzsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE2OiB0bXAgPSAqc3B0cisrOyBicmVhazsKICAgICAgICAgIGNhc2UgMzI6IHRtcCA9ICpscHRyKys7IGJyZWFrOwogICAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICAvKiBBZGFwdCBzYW1wbGUgc2l6ZSAqLwogICAgICAgIHNoaWZ0ID0gKG5CdWZCaXRzLW5TaWdCaXRzKS0oMzItYnBzKTsKCiAgICAgICAgLyogQ29ycmVjdCBhbGlnbm1lbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIDMyIGJpdCBkYXRhIGJ1ZmZlciAidG1wIiBhbmQgMjQgYml0cyB0byBiZSB3cml0dGVuLiAqLwogICAgICAgIGlmICggIUlTX0xJVFRMRV9FTkRJQU4oKSAmJiBicHMgPT0gMjQpIHsKICAgICAgICAgIHNoaWZ0ICs9IDg7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2hpZnQgPCAwKQogICAgICAgICAgdG1wID4+PSAtc2hpZnQ7CiAgICAgICAgZWxzZQogICAgICAgICAgdG1wIDw8PSBzaGlmdDsKCiAgICAgICAgLyogV3JpdGUgc2FtcGxlICovICAgICAgICAKICAgICAgICByZXN1bHQ9RkRLZndyaXRlX0VMKCZ0bXAsIGJwcz4+MywgMSwgd2F2LT5mcCk7CiAgICAgICAgaWYgKHJlc3VsdCA8PSAwKSB7CiAgICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRXcml0ZSgpOiBlcnJvcjogdW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgJWRcbiIsIHdhdi0+ZnApOwogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgfQogICAgfSAKCiAgICB3YXYtPmhlYWRlci5kYXRhU2l6ZSArPSAobnVtYmVyT2ZTYW1wbGVzICogKGJwcz4+MykpOwogICAgcmV0dXJuIDA7Cn0KCgovKioKICogV0FWX091dHB1dENsb3NlCiAqIFxicmllZiBDbG9zZSBXQVYgT3V0cHV0IGhhbmRsZQogKiBccGFyYW0gcFdhdiBwb2ludGVyIHRvIFdBViBoYW5kbGUuICpwV2F2IGlzIHNldCB0byBOVUxMLgogKi8Kdm9pZCBXQVZfT3V0cHV0Q2xvc2UoSEFORExFX1dBViAqcFdhdikKewogIEhBTkRMRV9XQVYgd2F2ID0gKnBXYXY7CiAgVUlOVCBzaXplID0gMDsKCiAgaWYgKCB3YXYgPT0gTlVMTCApIHsKICAgICAgcmV0dXJuOwogIH0KCiAgd2F2LT5oZWFkZXIuZGF0YVNpemUgPSBMaXR0bGVFbmRpYW4zMih3YXYtPmhlYWRlci5kYXRhU2l6ZSk7CiAgd2F2LT5oZWFkZXIucmlmZlNpemUgPSBMaXR0bGVFbmRpYW4zMih3YXYtPmhlYWRlci5kYXRhU2l6ZSArIDM2KTsKCiAgaWYgKHdhdi0+ZnAgIT0gTlVMTCkKICB7CiAgICBpZiAoRkRLZnNlZWsod2F2LT5mcCwgMCwgRkRLU0VFS19TRVQpKSB7CiAgICAgICBGREtwcmludGYoIldBVl9PdXRwdXRDbG9zZSgpOiBmc2VlaygpIGZhaWxlZC5cbiIpOwogICAgfQoKICBzaXplID0gc2l6ZW9mKFdBVl9IRUFERVIpOwogICAgaWYgKEZES2Z3cml0ZSgmd2F2LT5oZWFkZXIucmlmZlR5cGUsIDEsIHNpemUsIHdhdi0+ZnApICE9IHNpemUpCiAgICB7CiAgICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0Q2xvc2UoKTogdW5hYmxlIHRvIHdyaXRlIGhlYWRlclxuIik7Cgl9CgogICAgaWYgKEZES2ZjbG9zZSh3YXYtPmZwKSkKICAgIHsKICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRDbG9zZSgpOiB1bmFibGUgdG8gY2xvc2Ugd2F2IGZpbGVcbiIpOwogICAgfQogICAgd2F2LT5mcCA9IE5VTEw7CiAgfQoKICBGREtmcmVlKHdhdik7CiAgKnBXYXYgPSBOVUxMOwp9Cgo=