Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAicHNiaXRkZWMuaCIKCgojaW5jbHVkZSAic2JyX3JvbS5oIgojaW5jbHVkZSAiaHVmZl9kZWMuaCIKCi8qIFBTIGRlYyBwcml2YXQgZnVuY3Rpb25zICovClNCUl9FUlJPUiBSZXNldFBzRGVjKEhBTkRMRV9QU19ERUMgaF9wc19kKTsKdm9pZCBSZXNldFBzRGVDb3IgICAoSEFORExFX1BTX0RFQyBoX3BzX2QpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICBodWZmbWFuIGRlY29kaW5nIGJ5IGNvZGVib29rIHRhYmxlCgogIFxyZXR1cm4gaW5kZXggb2YgaHVmZm1hbiBjb2RlYm9vayB0YWJsZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFNDSEFSCmRlY29kZV9odWZmX2N3IChIdWZmbWFuIGgsICAgICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBodWZmbWFuIGNvZGVib29rIHRhYmxlICovCiAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCAgIC8qITwgSGFuZGxlIHRvIEJpdGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgaW50ICpsZW5ndGgpICAgICAgICAgICAgICAgICAgICAvKiE8IGxlbmd0aCBvZiBodWZmbWFuIGNvZGV3b3JkIChvciBOVUxMKSAqLwp7CiAgVUNIQVIgYml0ID0gMDsKICBTQ0hBUiBpbmRleCA9IDA7CiAgVUNIQVIgYml0Q291bnQgPSAwOwoKICB3aGlsZSAoaW5kZXggPj0gMCkgewogICAgYml0ID0gRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOwogICAgYml0Q291bnQrKzsKICAgIGluZGV4ID0gaFtpbmRleF1bYml0XTsKICB9CiAgaWYgKGxlbmd0aCkgewogICAgKmxlbmd0aCA9IGJpdENvdW50OwogIH0KICByZXR1cm4oIGluZGV4KzY0ICk7IC8qIEFkZCBvZmZzZXQgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICBoZWxwZXIgZnVuY3Rpb24gLSBsaW1pdGluZyBvZiB2YWx1ZSB0byBtaW4vbWF4IHZhbHVlcwoKICBccmV0dXJuIGxpbWl0ZWQgdmFsdWUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgU0NIQVIKbGltaXRNaW5NYXgoU0NIQVIgaSwKICAgICAgICAgICAgU0NIQVIgbWluLAogICAgICAgICAgICBTQ0hBUiBtYXgpCnsKICBpZiAoaTxtaW4pCiAgICByZXR1cm4gbWluOwogIGVsc2UgaWYgKGk+bWF4KQogICAgcmV0dXJuIG1heDsKICBlbHNlCiAgICByZXR1cm4gaTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICBEZWNvZGVzIGRlbHRhIHZhbHVlcyBpbi1wbGFjZSBhbmQgdXBkYXRlcwogICAgICAgICAgZGF0YSBidWZmZXJzIGFjY29yZGluZyB0byBxdWFudGl6YXRpb24gY2xhc3Nlcy4KCiAgV2hlbiBkZWx0YSBjb2RlZCBpbiBmcmVxdWVuY3kgdGhlIGZpcnN0IGVsZW1lbnQgaXMgZGVsdGFjb2RlIGZyb20gemVyby4KICBhSW5kZXggYnVmZmVyIGlzIGRlY29kZWQgZnJvbSBkZWx0YSB2YWx1ZXMgdG8gYWN0dWFsIHZhbHVlcy4KCiAgXHJldHVybiBub25lCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApkZWx0YURlY29kZUFycmF5KFNDSEFSIGVuYWJsZSwKICAgICAgICAgICAgICAgICBTQ0hBUiAqYUluZGV4LCAgICAgICAgICAvKiE8IElDQy9JSUQgcGFyYW1ldGVycyAqLwogICAgICAgICAgICAgICAgIFNDSEFSICphUHJldkZyYW1lSW5kZXgsIC8qITwgSUNDL0lJRCBwYXJhbWV0ZXJzICBvZiBwcmV2aW91cyBmcmFtZSAqLwogICAgICAgICAgICAgICAgIFNDSEFSIER0RGYsCiAgICAgICAgICAgICAgICAgVUNIQVIgbnJFbGVtZW50cywgICAgICAgLyohPCBhcyBjb252ZXllZCBpbiBiaXRzdHJlYW0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG91dHB1dCBhcnJheSBzaXplOiBuckVsZW1lbnRzKnN0cmlkZSAqLwogICAgICAgICAgICAgICAgIFVDSEFSIHN0cmlkZSwgICAgICAgICAgIC8qITwgMT1kZmx0LCAyPWhhbGYgZnJlcS4gcmVzb2x1dGlvbiAqLwogICAgICAgICAgICAgICAgIFNDSEFSIG1pbklkeCwKICAgICAgICAgICAgICAgICBTQ0hBUiBtYXhJZHgpCnsKICBpbnQgaTsKCiAgLyogRGVsdGEgZGVjb2RlICovCiAgaWYgKCBlbmFibGU9PTEgKSB7CiAgICBpZiAoRHREZiA9PSAwKSAgeyAgIC8qIERlbHRhIGNvZGVkIGluIGZyZXEgKi8KICAgICAgYUluZGV4WzBdID0gMCArIGFJbmRleFswXTsKICAgICAgYUluZGV4WzBdID0gbGltaXRNaW5NYXgoYUluZGV4WzBdLG1pbklkeCxtYXhJZHgpOwogICAgICBmb3IgKGkgPSAxOyBpIDwgbnJFbGVtZW50czsgaSsrKSB7CiAgICAgICAgYUluZGV4W2ldID0gYUluZGV4W2ktMV0gKyBhSW5kZXhbaV07CiAgICAgICAgYUluZGV4W2ldID0gbGltaXRNaW5NYXgoYUluZGV4W2ldLG1pbklkeCxtYXhJZHgpOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsgLyogRGVsdGEgdGltZSAqLwogICAgICBmb3IgKGkgPSAwOyBpIDwgbnJFbGVtZW50czsgaSsrKSB7CiAgICAgICAgYUluZGV4W2ldID0gYVByZXZGcmFtZUluZGV4W2kqc3RyaWRlXSArIGFJbmRleFtpXTsKICAgICAgICBhSW5kZXhbaV0gPSBsaW1pdE1pbk1heChhSW5kZXhbaV0sbWluSWR4LG1heElkeCk7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZSB7IC8qIE5vIGRhdGEgaXMgc2VudCwgc2V0IGluZGV4IHRvIHplcm8gKi8KICAgIGZvciAoaSA9IDA7IGkgPCBuckVsZW1lbnRzOyBpKyspIHsKICAgICAgYUluZGV4W2ldID0gMDsKICAgIH0KICB9CiAgaWYgKHN0cmlkZT09MikgewogICAgZm9yIChpPW5yRWxlbWVudHMqc3RyaWRlLTE7IGk+MDsgaS0tKSB7CiAgICAgIGFJbmRleFtpXSA9IGFJbmRleFtpPj4xXTsKICAgIH0KICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQogIFxicmllZiBNYXBwaW5nIG9mIElDQy9JSUQgcGFyYW1ldGVycyB0byAyMCBzdGVyZW8gYmFuZHMKCiAgXHJldHVybiBub25lCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBtYXAzNEluZGV4VG8yMCAoU0NIQVIgKmFJbmRleCwgLyohPCBkZWNvZGVkIElDQy9JSUQgcGFyYW1ldGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbm9CaW5zKSAgLyohPCBudW1iZXIgb2Ygc3RlcmVvIGJhbmRzICAgICAqLwp7CiAgYUluZGV4WzBdICA9ICgyKmFJbmRleFswXSthSW5kZXhbMV0pLzM7CiAgYUluZGV4WzFdICA9IChhSW5kZXhbMV0rMiphSW5kZXhbMl0pLzM7CiAgYUluZGV4WzJdICA9ICgyKmFJbmRleFszXSthSW5kZXhbNF0pLzM7CiAgYUluZGV4WzNdICA9IChhSW5kZXhbNF0rMiphSW5kZXhbNV0pLzM7CiAgYUluZGV4WzRdICA9IChhSW5kZXhbNl0rYUluZGV4WzddKS8yOwogIGFJbmRleFs1XSAgPSAoYUluZGV4WzhdK2FJbmRleFs5XSkvMjsKICBhSW5kZXhbNl0gID0gYUluZGV4WzEwXTsKICBhSW5kZXhbN10gID0gYUluZGV4WzExXTsKICBhSW5kZXhbOF0gID0gKGFJbmRleFsxMl0rYUluZGV4WzEzXSkvMjsKICBhSW5kZXhbOV0gID0gKGFJbmRleFsxNF0rYUluZGV4WzE1XSkvMjsKICBhSW5kZXhbMTBdID0gYUluZGV4WzE2XTsKICAvKiBGb3IgSVBEL09QRCBpdCBzdG9wcyBoZXJlICovCgogIGlmIChub0JpbnMgPT0gTk9fSElfUkVTX0JJTlMpCiAgewogICAgYUluZGV4WzExXSA9IGFJbmRleFsxN107CiAgICBhSW5kZXhbMTJdID0gYUluZGV4WzE4XTsKICAgIGFJbmRleFsxM10gPSBhSW5kZXhbMTldOwogICAgYUluZGV4WzE0XSA9IChhSW5kZXhbMjBdK2FJbmRleFsyMV0pLzI7CiAgICBhSW5kZXhbMTVdID0gKGFJbmRleFsyMl0rYUluZGV4WzIzXSkvMjsKICAgIGFJbmRleFsxNl0gPSAoYUluZGV4WzI0XSthSW5kZXhbMjVdKS8yOwogICAgYUluZGV4WzE3XSA9IChhSW5kZXhbMjZdK2FJbmRleFsyN10pLzI7CiAgICBhSW5kZXhbMThdID0gKGFJbmRleFsyOF0rYUluZGV4WzI5XSthSW5kZXhbMzBdK2FJbmRleFszMV0pLzQ7CiAgICBhSW5kZXhbMTldID0gKGFJbmRleFszMl0rYUluZGV4WzMzXSkvMjsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQogIFxicmllZiAgRGVjb2RlcyBkZWx0YSBjb2RlZCBJSUQsIElDQywgSVBEIGFuZCBPUEQgaW5kaWNlcwoKICBccmV0dXJuIFBTIHByb2Nlc3NpbmcgZmxhZy4gSWYgc2V0IHRvIDEKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApEZWNvZGVQcyggc3RydWN0IFBTX0RFQyAqaF9wc19kLCAgICAgIC8qITwgUFMgaGFuZGxlICovCiAgICAgICAgICBjb25zdCBVQ0hBUiAgICBmcmFtZUVycm9yICkgLyohPCBGbGFnIHRlbGxpbmcgdGhhdCBmcmFtZSBoYWQgZXJyb3JzICovCnsKICBNUEVHX1BTX0JTX0RBVEEgKnBCc0RhdGE7CiAgVUNIQVIgZ3IsIGVudjsKICBpbnQgICBiUHNIZWFkZXJWYWxpZCwgYlBzRGF0YUF2YWlsOwoKICAvKiBTaG9ydGN1dHMgdG8gYXZvaWQgZGVmZXJlbmNpbmcgYW5kIGtlZXAgdGhlIGNvZGUgcmVhZGFibGUgKi8KICBwQnNEYXRhID0gJmhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdLm1wZWc7CiAgYlBzSGVhZGVyVmFsaWQgPSBwQnNEYXRhLT5iUHNIZWFkZXJWYWxpZDsKICBiUHNEYXRhQXZhaWwgPSAoaF9wc19kLT5iUHNEYXRhQXZhaWxbaF9wc19kLT5wcm9jZXNzU2xvdF0gPT0gcHB0X21wZWcpID8gMSA6IDA7CgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRGVjaWRlIHdoZXRoZXIgdG8gcHJvY2VzcyBvciB0byBjb25jZWFsIFBTIGRhdGEgb3Igbm90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgaWYgKCAoIGhfcHNfZC0+cHNEZWNvZGVkUHJ2ICYmICFmcmFtZUVycm9yICYmICFiUHNEYXRhQXZhaWwpCiAgICB8fCAoIWhfcHNfZC0+cHNEZWNvZGVkUHJ2ICYmIChmcmFtZUVycm9yIHx8ICFiUHNEYXRhQXZhaWwgfHwgIWJQc0hlYWRlclZhbGlkKSkgKSB7CiAgICAvKiBEb24ndCBhcHBseSBQUyBwcm9jZXNzaW5nLgogICAgICogRGVjbGFyZSBjdXJyZW50IFBTIGhlYWRlciBhbmQgYml0c3RyZWFtIGRhdGEgaW52YWxpZC4gKi8KICAgIHBCc0RhdGEtPmJQc0hlYWRlclZhbGlkID0gMDsKICAgIGhfcHNfZC0+YlBzRGF0YUF2YWlsW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdID0gcHB0X25vbmU7CiAgICByZXR1cm4gKDApOwogIH0KCiAgaWYgKGZyYW1lRXJyb3IgfHwgIWJQc0hlYWRlclZhbGlkKQogIHsgLyogbm8gbmV3IFBTIGRhdGEgYXZhaWxhYmxlIChlLmcuIGZyYW1lIGxvc3MpICovCiAgICAvKiA9PiBrZWVwIGxhdGVzdCBkYXRhIGNvbnN0YW50IChpLmUuIEZJWCB3aXRoIG5vRW52PTApICovCiAgICBwQnNEYXRhLT5ub0VudiA9IDA7CiAgfQoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERlY29kZSBiaXRzdHJlYW0gcGF5bG9hZCBvciBwcmVwYXJlIHBhcmFtZXRlciBmb3IgY29uY2VhbG1lbnQ6CiAgKi8KICBmb3IgKGVudj0wOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CiAgICBTQ0hBUiAqYVByZXZJaWRJbmRleDsKICAgIFNDSEFSICphUHJldkljY0luZGV4OwoKICAgIFVDSEFSIG5vSWlkU3RlcHMgPSBwQnNEYXRhLT5iRmluZUlpZFE/Tk9fSUlEX1NURVBTX0ZJTkU6Tk9fSUlEX1NURVBTOwoKICAgIGlmIChlbnY9PTApIHsKICAgICAgYVByZXZJaWRJbmRleCA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJaWRQcmV2RnJhbWVJbmRleDsKICAgICAgYVByZXZJY2NJbmRleCA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJY2NQcmV2RnJhbWVJbmRleDsKICAgIH0KICAgIGVsc2UgewogICAgICBhUHJldklpZEluZGV4ID0gcEJzRGF0YS0+YWFJaWRJbmRleFtlbnYtMV07CiAgICAgIGFQcmV2SWNjSW5kZXggPSBwQnNEYXRhLT5hYUljY0luZGV4W2Vudi0xXTsKICAgIH0KCiAgICBkZWx0YURlY29kZUFycmF5KHBCc0RhdGEtPmJFbmFibGVJaWQsCiAgICAgICAgICAgICAgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52XSwKICAgICAgICAgICAgICAgICAgICAgYVByZXZJaWRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgcEJzRGF0YS0+YWJJaWREdEZsYWdbZW52XSwKICAgICAgICAgICAgICAgICAgICAgRkRLX3NickRlY29kZXJfYU5vSWlkQmluc1twQnNEYXRhLT5mcmVxUmVzSWlkXSwKICAgICAgICAgICAgICAgICAgICAgKHBCc0RhdGEtPmZyZXFSZXNJaWQpPzE6MiwKICAgICAgICAgICAgICAgICAgICAgLW5vSWlkU3RlcHMsCiAgICAgICAgICAgICAgICAgICAgIG5vSWlkU3RlcHMpOwoKICAgIGRlbHRhRGVjb2RlQXJyYXkocEJzRGF0YS0+YkVuYWJsZUljYywKICAgICAgICAgICAgICAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtlbnZdLAogICAgICAgICAgICAgICAgICAgICBhUHJldkljY0luZGV4LAogICAgICAgICAgICAgICAgICAgICBwQnNEYXRhLT5hYkljY0R0RmxhZ1tlbnZdLAogICAgICAgICAgICAgICAgICAgICBGREtfc2JyRGVjb2Rlcl9hTm9JY2NCaW5zW3BCc0RhdGEtPmZyZXFSZXNJY2NdLAogICAgICAgICAgICAgICAgICAgICAocEJzRGF0YS0+ZnJlcVJlc0ljYyk/MToyLAogICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICBOT19JQ0NfU1RFUFMtMSk7CiAgfSAgIC8qIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspICovCgogIC8qIGhhbmRsaW5nIG9mIEZJWCBub0Vudj0wICovCiAgaWYgKHBCc0RhdGEtPm5vRW52PT0wKSB7CiAgICAvKiBzZXQgbm9FbnY9MSwga2VlcCBsYXN0IHBhcmFtZXRlcnMgb3IgZm9yY2UgMCBpZiBub3QgZW5hYmxlZCAqLwogICAgcEJzRGF0YS0+bm9FbnYgPSAxOwoKICAgIGlmIChwQnNEYXRhLT5iRW5hYmxlSWlkKSB7CiAgICAgIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JSURfQklOUzsgZ3IrKykgewogICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdID0KICAgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJaWRQcmV2RnJhbWVJbmRleFtncl07CiAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUlEX0JJTlM7IGdyKyspIHsKICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXSA9IDA7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocEJzRGF0YS0+YkVuYWJsZUljYykgewogICAgICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUNDX0JJTlM7IGdyKyspIHsKICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXSA9CiAgICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWNjUHJldkZyYW1lSW5kZXhbZ3JdOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lDQ19CSU5TOyBncisrKSB7CiAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0Vudi0xXVtncl0gPSAwOwogICAgICB9CiAgICB9CiAgfQoKICAvKiBVcGRhdGUgcHJldmlvdXMgZnJhbWUgaW5kZXggYnVmZmVycyAqLwogIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JSURfQklOUzsgZ3IrKykgewogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYUlpZFByZXZGcmFtZUluZGV4W2dyXSA9CiAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdOwogIH0KICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUNDX0JJTlM7IGdyKyspIHsKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJY2NQcmV2RnJhbWVJbmRleFtncl0gPQogICAgICBwQnNEYXRhLT5hYUljY0luZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXTsKICB9CgogIC8qIFBTIGRhdGEgZnJvbSBiaXRzdHJlYW0gKGlmIGF2YWlsKSB3YXMgZGVjb2RlZCBub3cgKi8KICBoX3BzX2QtPmJQc0RhdGFBdmFpbFtoX3BzX2QtPnByb2Nlc3NTbG90XSA9IHBwdF9ub25lOwoKICAvKiBoYW5kbGluZyBvZiBlbnYgYm9yZGVycyBmb3IgRklYICYgVkFSICovCiAgaWYgKHBCc0RhdGEtPmJGcmFtZUNsYXNzID09IDApIHsKICAgIC8qIEZJWF9CT1JERVJTIE5vRW52PTAsMSwyLDQgKi8KICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbMF0gPSAwOwogICAgZm9yIChlbnY9MTsgZW52PHBCc0RhdGEtPm5vRW52OyBlbnYrKykgewogICAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPQogICAgICAgIChlbnYgKiBoX3BzX2QtPm5vU3ViU2FtcGxlcykgLyBwQnNEYXRhLT5ub0VudjsKICAgIH0KICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbcEJzRGF0YS0+bm9FbnZdID0gaF9wc19kLT5ub1N1YlNhbXBsZXM7CiAgICAvKiAxMDI0ICgzMiBzbG90cykgZW52IGJvcmRlcnM6ICAwLCA4LCAxNiwgMjQsIDMyICovCiAgICAvKiAgOTYwICgzMCBzbG90cykgZW52IGJvcmRlcnM6ICAwLCA3LCAxNSwgMjIsIDMwICovCiAgfQogIGVsc2UgeyAgIC8qIGlmIChoX3BzX2QtPmJGcmFtZUNsYXNzID09IDApICovCiAgICAvKiBWQVJfQk9SREVSUyBOb0Vudj0xLDIsMyw0ICovCiAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wWzBdID0gMDsKCiAgICAvKiBoYW5kbGUgY2FzZSBhRW52U3RhcnRTdG9wW25vRW52XTxub1N1YlNhbXBsZSBmb3IgVkFSX0JPUkRFUlMgYnkKICAgICAgIGR1cGxpY2F0aW5nIGxhc3QgUFMgcGFyYW1ldGVycyBhbmQgaW5jcmVtZW50aW5nIG5vRW52ICovCiAgICBpZiAocEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtwQnNEYXRhLT5ub0Vudl0gPCBoX3BzX2QtPm5vU3ViU2FtcGxlcykgewogICAgICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUlEX0JJTlM7IGdyKyspIHsKICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52XVtncl0gPQogICAgICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtwQnNEYXRhLT5ub0Vudi0xXVtncl07CiAgICAgIH0KICAgICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lDQ19CSU5TOyBncisrKSB7CiAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0Vudl1bZ3JdID0KICAgICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdOwogICAgICB9CiAgICAgIHBCc0RhdGEtPm5vRW52Kys7CiAgICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbcEJzRGF0YS0+bm9FbnZdID0gaF9wc19kLT5ub1N1YlNhbXBsZXM7CiAgICB9CgogICAgLyogZW5mb3JjZSBzdHJpY3RseSBtb25vdG9uaWMgaW5jcmVhc2luZyBib3JkZXJzICovCiAgICBmb3IgKGVudj0xOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CiAgICAgIFVDSEFSIHRocjsKICAgICAgdGhyID0gKFVDSEFSKWhfcHNfZC0+bm9TdWJTYW1wbGVzIC0gKHBCc0RhdGEtPm5vRW52IC0gZW52KTsKICAgICAgaWYgKHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA+IHRocikgewogICAgICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA9IHRocjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICB0aHIgPSBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudi0xXSsxOwogICAgICAgIGlmIChwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPCB0aHIpIHsKICAgICAgICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA9IHRocjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9ICAgLyogaWYgKGhfcHNfZC0+YkZyYW1lQ2xhc3MgPT0gMCkgLi4uIGVsc2UgKi8KCiAgLyogY29weSBkYXRhIHByaW9yIHRvIHBvc3NpYmxlIDIwPC0+MzQgaW4tcGxhY2UgbWFwcGluZyAqLwogIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKICAgIFVDSEFSIGk7CiAgICBmb3IgKGk9MDsgaTxOT19ISV9SRVNfSUlEX0JJTlM7IGkrKykgewogICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWlkSW5kZXhNYXBwZWRbZW52XVtpXSA9IHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52XVtpXTsKICAgIH0KICAgIGZvciAoaT0wOyBpPE5PX0hJX1JFU19JQ0NfQklOUzsgaSsrKSB7CiAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJY2NJbmRleE1hcHBlZFtlbnZdW2ldID0gcEJzRGF0YS0+YWFJY2NJbmRleFtlbnZdW2ldOwogICAgfQogIH0KCgogIC8qIE1QRUcgYmFzZWxpbmUgUFMgKi8KICAvKiBCYXNlbGluZSB2ZXJzaW9uIG9mIFBTIGFsd2F5cyB1c2VzIHRoZSBoeWJyaWQgZmlsdGVyIHN0cnVjdHVyZSB3aXRoIDIwIHN0ZXJlbyBiYW5kcy4gKi8KICAvKiBJZiBJQ0MvSUlEIHBhcmFtZXRlcnMgZm9yIDM0IHN0ZXJlbyBiYW5kcyBhcmUgZGVjb2RlZCB0aGV5IGhhdmUgdG8gYmUgbWFwcGVkIHRvIDIwICAgKi8KICAvKiBzdGVyZW8gYmFuZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBBZGRpdGlvbmFseSB0aGUgSVBEL09QRCBwYXJhbWV0ZXJzIHdvbid0IGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgZm9yIChlbnY9MDsgZW52PHBCc0RhdGEtPm5vRW52OyBlbnYrKykgewogICAgaWYgKHBCc0RhdGEtPmZyZXFSZXNJaWQgPT0gMikKICAgICAgbWFwMzRJbmRleFRvMjAgKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJaWRJbmRleE1hcHBlZFtlbnZdLCBOT19ISV9SRVNfSUlEX0JJTlMpOwogICAgaWYgKHBCc0RhdGEtPmZyZXFSZXNJY2MgPT0gMikKICAgICAgbWFwMzRJbmRleFRvMjAgKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJY2NJbmRleE1hcHBlZFtlbnZdLCBOT19ISV9SRVNfSUNDX0JJTlMpOwoKICAgIC8qIElQRC9PUEQgaXMgZGlzYWJsZWQgaW4gYmFzZWxpbmUgdmVyc2lvbiBhbmQgdGh1cyB3YXMgcmVtb3ZlZCBoZXJlICovCiAgfQoKICByZXR1cm4gKDEpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCgogIFxicmllZiAgUmVhZHMgcGFyYW1ldHJpYyBzdGVyZW8gZGF0YSBmcm9tIGJpdHN0cmVhbQoKICBccmV0dXJuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1bnNpZ25lZCBpbnQKUmVhZFBzRGF0YSAoSEFORExFX1BTX0RFQyBoX3BzX2QsICAgICAgICAgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBQU19ERUMgKi8KICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCiAgICAgICAgICAgIGludCBuQml0c0xlZnQgICAgICAgICAgICAgICAgICAvKiE8IG1heCBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgKi8KICAgICAgICAgICApCnsKICBNUEVHX1BTX0JTX0RBVEEgKnBCc0RhdGE7CgogIFVDSEFSICAgICBnciwgZW52OwogIFNDSEFSICAgICBkdEZsYWc7CiAgSU5UICAgICAgIHN0YXJ0Yml0czsKICBIdWZmbWFuICAgQ3VycmVudFRhYmxlOwogIFNDSEFSICAgICBiRW5hYmxlSGVhZGVyOwoKICBpZiAoIWhfcHNfZCkKICAgIHJldHVybiAwOwoKICBwQnNEYXRhID0gJmhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+YnNSZWFkU2xvdF0ubXBlZzsKCiAgaWYgKGhfcHNfZC0+YnNSZWFkU2xvdCAhPSBoX3BzX2QtPmJzTGFzdFNsb3QpIHsKICAgIC8qIENvcHkgbGFzdCBoZWFkZXIgZGF0YSAqLwogICAgRkRLbWVtY3B5KHBCc0RhdGEsICZoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPmJzTGFzdFNsb3RdLm1wZWcsIHNpemVvZihNUEVHX1BTX0JTX0RBVEEpKTsKICB9CgoKICBzdGFydGJpdHMgPSAoSU5UKSBGREtnZXRWYWxpZEJpdHMoaEJpdEJ1Zik7CgogIGJFbmFibGVIZWFkZXIgPSAoU0NIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsKCiAgLyogUmVhZCBoZWFkZXIgKi8KICBpZiAoYkVuYWJsZUhlYWRlcikgewogICAgcEJzRGF0YS0+YlBzSGVhZGVyVmFsaWQgPSAxOwogICAgcEJzRGF0YS0+YkVuYWJsZUlpZCA9IChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOwogICAgaWYgKHBCc0RhdGEtPmJFbmFibGVJaWQpIHsKICAgICAgcEJzRGF0YS0+bW9kZUlpZCA9IChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDMpOwogICAgfQoKICAgIHBCc0RhdGEtPmJFbmFibGVJY2MgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsKICAgIGlmIChwQnNEYXRhLT5iRW5hYmxlSWNjKSB7CiAgICAgIHBCc0RhdGEtPm1vZGVJY2MgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAzKTsKICAgIH0KCiAgICBwQnNEYXRhLT5iRW5hYmxlRXh0ID0gKFVDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7CiAgfQoKICBwQnNEYXRhLT5iRnJhbWVDbGFzcyA9IChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOwogIGlmIChwQnNEYXRhLT5iRnJhbWVDbGFzcyA9PSAwKSB7CiAgICAvKiBGSVhfQk9SREVSUyBOb0Vudj0wLDEsMiw0ICovCiAgICBwQnNEYXRhLT5ub0VudiA9IEZES19zYnJEZWNvZGVyX2FGaXhOb0VudkRlY29kZVsoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAyKV07CiAgICAvKiBhbGwgYWRkaXRpb25hbCBoYW5kbGluZyBvZiBlbnYgYm9yZGVycyBpcyBub3cgaW4gRGVjb2RlUHMoKSAqLwogIH0KICBlbHNlIHsKICAgIC8qIFZBUl9CT1JERVJTIE5vRW52PTEsMiwzLDQgKi8KICAgIHBCc0RhdGEtPm5vRW52ID0gMSsoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAyKTsKICAgIGZvciAoZW52PTE7IGVudjxwQnNEYXRhLT5ub0VudisxOyBlbnYrKykKICAgICAgcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtlbnZdID0gKChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDUpKSArIDE7CiAgICAvKiBhbGwgYWRkaXRpb25hbCBoYW5kbGluZyBvZiBlbnYgYm9yZGVycyBpcyBub3cgaW4gRGVjb2RlUHMoKSAqLwogIH0KCiAgLyogdmVyaWZ5IHRoYXQgSUlEICYgSUNDIG1vZGVzIChxdWFudCBncmlkLCBmcmVxIHJlcykgYXJlIHN1cHBvcnRlZCAqLwogIGlmICgocEJzRGF0YS0+bW9kZUlpZCA+IDUpIHx8IChwQnNEYXRhLT5tb2RlSWNjID4gNSkpIHsKICAgIC8qIG5vIHVzZWZ1bCBQUyBkYXRhIGNvdWxkIGJlIHJlYWQgZnJvbSBiaXRzdHJlYW0gKi8KICAgIGhfcHNfZC0+YlBzRGF0YUF2YWlsW2hfcHNfZC0+YnNSZWFkU2xvdF0gPSBwcHRfbm9uZTsKICAgIC8qIGRpc2NhcmQgYWxsIHJlbWFpbmluZyBiaXRzICovCiAgICBuQml0c0xlZnQgLT0gc3RhcnRiaXRzIC0gRkRLZ2V0VmFsaWRCaXRzKGhCaXRCdWYpOwogICAgd2hpbGUgKG5CaXRzTGVmdCkgewogICAgICBpbnQgaSA9IG5CaXRzTGVmdDsKICAgICAgaWYgKGk+OCkgewogICAgICAgIGkgPSA4OwogICAgICB9CiAgICAgIEZES3JlYWRCaXRzIChoQml0QnVmLCBpKTsKICAgICAgbkJpdHNMZWZ0IC09IGk7CiAgICB9CiAgICByZXR1cm4gKHN0YXJ0Yml0cyAtIEZES2dldFZhbGlkQml0cyhoQml0QnVmKSk7CiAgfQoKICBpZiAocEJzRGF0YS0+bW9kZUlpZCA+IDIpewogICAgcEJzRGF0YS0+ZnJlcVJlc0lpZCA9IHBCc0RhdGEtPm1vZGVJaWQtMzsKICAgIHBCc0RhdGEtPmJGaW5lSWlkUSA9IDE7CiAgfQogIGVsc2V7CiAgICBwQnNEYXRhLT5mcmVxUmVzSWlkID0gcEJzRGF0YS0+bW9kZUlpZDsKICAgIHBCc0RhdGEtPmJGaW5lSWlkUSA9IDA7CiAgfQoKICBpZiAocEJzRGF0YS0+bW9kZUljYyA+IDIpewogICAgcEJzRGF0YS0+ZnJlcVJlc0ljYyA9IHBCc0RhdGEtPm1vZGVJY2MtMzsKICB9CiAgZWxzZXsKICAgIHBCc0RhdGEtPmZyZXFSZXNJY2MgPSBwQnNEYXRhLT5tb2RlSWNjOwogIH0KCgogIC8qIEV4dHJhY3QgSUlEIGRhdGEgKi8KICBpZiAocEJzRGF0YS0+YkVuYWJsZUlpZCkgewogICAgZm9yIChlbnY9MDsgZW52PHBCc0RhdGEtPm5vRW52OyBlbnYrKykgewogICAgICBkdEZsYWcgPSAoU0NIQVIpRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOwogICAgICBpZiAoIWR0RmxhZykKICAgICAgewogICAgICAgIGlmIChwQnNEYXRhLT5iRmluZUlpZFEpCiAgICAgICAgICBDdXJyZW50VGFibGUgPSAoSHVmZm1hbikmYUJvb2tQc0lpZEZpbmVGcmVxRGVjb2RlOwogICAgICAgIGVsc2UKICAgICAgICAgIEN1cnJlbnRUYWJsZSA9IChIdWZmbWFuKSZhQm9va1BzSWlkRnJlcURlY29kZTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiAocEJzRGF0YS0+YkZpbmVJaWRRKQogICAgICAgICBDdXJyZW50VGFibGUgPSAoSHVmZm1hbikmYUJvb2tQc0lpZEZpbmVUaW1lRGVjb2RlOwogICAgICAgIGVsc2UKICAgICAgICAgIEN1cnJlbnRUYWJsZSA9IChIdWZmbWFuKSZhQm9va1BzSWlkVGltZURlY29kZTsKICAgICAgfQoKICAgICAgZm9yIChnciA9IDA7IGdyIDwgRkRLX3NickRlY29kZXJfYU5vSWlkQmluc1twQnNEYXRhLT5mcmVxUmVzSWlkXTsgZ3IrKykKICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W2Vudl1bZ3JdID0gZGVjb2RlX2h1ZmZfY3coQ3VycmVudFRhYmxlLGhCaXRCdWYsTlVMTCk7CiAgICAgIHBCc0RhdGEtPmFiSWlkRHRGbGFnW2Vudl0gPSBkdEZsYWc7CiAgICB9CiAgfQoKICAvKiBFeHRyYWN0IElDQyBkYXRhICovCiAgaWYgKHBCc0RhdGEtPmJFbmFibGVJY2MpIHsKICAgIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKICAgICAgZHRGbGFnID0gKFNDSEFSKUZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsKICAgICAgaWYgKCFkdEZsYWcpCiAgICAgICAgQ3VycmVudFRhYmxlID0gKEh1ZmZtYW4pJmFCb29rUHNJY2NGcmVxRGVjb2RlOwogICAgICBlbHNlCiAgICAgICAgQ3VycmVudFRhYmxlID0gKEh1ZmZtYW4pJmFCb29rUHNJY2NUaW1lRGVjb2RlOwoKICAgICAgZm9yIChnciA9IDA7IGdyIDwgRkRLX3NickRlY29kZXJfYU5vSWNjQmluc1twQnNEYXRhLT5mcmVxUmVzSWNjXTsgZ3IrKykKICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W2Vudl1bZ3JdID0gZGVjb2RlX2h1ZmZfY3coQ3VycmVudFRhYmxlLGhCaXRCdWYsTlVMTCk7CiAgICAgIHBCc0RhdGEtPmFiSWNjRHRGbGFnW2Vudl0gPSBkdEZsYWc7CiAgICB9CiAgfQoKICBpZiAocEJzRGF0YS0+YkVuYWJsZUV4dCkgewoKICAgIC8qIQogICAgRGVjb2RlcnMgdGhhdCBzdXBwb3J0IG9ubHkgdGhlIGJhc2VsaW5lIHZlcnNpb24gb2YgdGhlIFBTIHRvb2wgYXJlIGFsbG93ZWQKICAgIHRvIGlnbm9yZSB0aGUgSVBEL09QRCBkYXRhLCBidXQgYWNjb3JkaW5nIGhlYWRlciBkYXRhIGhhcyB0byBiZSBwYXJzZWQuCiAgICBJU08vSUVDIDE0NDk2LTMgU3VicGFydCA4IEFubmV4IDQKICAgICovCgogICAgaW50IGNudCA9IEZES3JlYWRCaXRzKGhCaXRCdWYsIFBTX0VYVEVOU0lPTl9TSVpFX0JJVFMpOwogICAgaWYgKGNudCA9PSAoMTw8UFNfRVhURU5TSU9OX1NJWkVfQklUUyktMSkgewogICAgICBjbnQgKz0gRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgUFNfRVhURU5TSU9OX0VTQ19DT1VOVF9CSVRTKTsKICAgIH0KICAgIHdoaWxlIChjbnQtLSkKICAgICAgRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgOCk7CiAgfQoKCiAgLyogbmV3IFBTIGRhdGEgd2FzIHJlYWQgZnJvbSBiaXRzdHJlYW0gKi8KICBoX3BzX2QtPmJQc0RhdGFBdmFpbFtoX3BzX2QtPmJzUmVhZFNsb3RdID0gcHB0X21wZWc7CgoKCiAgcmV0dXJuIChzdGFydGJpdHMgLSBGREtnZXRWYWxpZEJpdHMoaEJpdEJ1ZikpOwp9Cgo=