Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCiAgIERlc2NyaXB0aW9uOiBjb21tb24gYml0YnVmZmVyIHJlYWQvd3JpdGUgcm91dGluZXMKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJGREtfYml0YnVmZmVyLmgiCgoKCgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKI2luY2x1ZGUgImNvbW1vbl9maXguaCIKI2luY2x1ZGUgImZpeG1pbm1heC5oIgoKY29uc3QgVUlOVCBCaXRNYXNrIFszMisxXSA9CnsKICAgICAgICAgMHgwLCAgICAgICAgMHgxLCAgICAgICAgMHgzLCAgICAgICAgMHg3LAogICAgICAgICAweGYsICAgICAgIDB4MWYsICAgICAgIDB4M2YsICAgICAgIDB4N2YsCiAgICAgICAgMHhmZiwgICAgICAweDFmZiwgICAgICAweDNmZiwgICAgICAweDdmZiwKICAgICAgIDB4ZmZmLCAgICAgMHgxZmZmLCAgICAgMHgzZmZmLCAgICAgMHg3ZmZmLAogICAgICAweGZmZmYsICAgIDB4MWZmZmYsICAgIDB4M2ZmZmYsICAgIDB4N2ZmZmYsCiAgICAgMHhmZmZmZiwgICAweDFmZmZmZiwgICAweDNmZmZmZiwgICAweDdmZmZmZiwKICAgIDB4ZmZmZmZmLCAgMHgxZmZmZmZmLCAgMHgzZmZmZmZmLCAgMHg3ZmZmZmZmLAogICAweGZmZmZmZmYsIDB4MWZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4N2ZmZmZmZmYsCiAgMHhmZmZmZmZmZgp9OwoKY29uc3QgVUlOVCAqY29uc3QgUkVTVFJJQ1QgcEJpdE1hc2sgPSBCaXRNYXNrOwoKdm9pZCBGREtfQ3JlYXRlQml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiAqaEJpdEJ1ZiwgVUNIQVIgKnBCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBidWZTaXplKQp7CiAgIEZES19Jbml0Qml0QnVmZmVyICgqaEJpdEJ1ZiwgcEJ1ZmZlciwgYnVmU2l6ZSwgMCk7CgogICBGREttZW1jbGVhcigoKmhCaXRCdWYpLT5CdWZmZXIsIGJ1ZlNpemUqc2l6ZW9mKFVDSEFSKSk7Cn0KCnZvaWQgRkRLX0RlbGV0ZUJpdEJ1ZmZlciAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeyA7IH0KCnZvaWQgRkRLX0luaXRCaXRCdWZmZXIgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIFVDSEFSICpwQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGJ1ZlNpemUsIFVJTlQgdmFsaWRCaXRzKQp7CiAgIGhCaXRCdWYtPlZhbGlkQml0cyAgID0gdmFsaWRCaXRzIDsKICAgaEJpdEJ1Zi0+UmVhZE9mZnNldCAgPSAwIDsKICAgaEJpdEJ1Zi0+V3JpdGVPZmZzZXQgPSAwIDsKICAgaEJpdEJ1Zi0+Qml0Q250ICAgICAgPSAwIDsKICAgaEJpdEJ1Zi0+Qml0TmR4ICAgICAgPSAwIDsKCiAgIGhCaXRCdWYtPkJ1ZmZlciAgICAgID0gcEJ1ZmZlciA7CiAgIGhCaXRCdWYtPmJ1ZlNpemUgICAgID0gYnVmU2l6ZSA7CiAgIGhCaXRCdWYtPmJ1ZkJpdHMgICAgID0gKGJ1ZlNpemUgPDwgMykgOwojaWYgZGVmaW5lZChGREtfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCiAgIC8qYXNzdXJlIGJ1ZnNpemUgKDJebikgKi8KICAgaWYgKGJ1ZlNpemUhPTApIHsKICAgICBVSU5UIHggPSAwLCBuPWJ1ZlNpemU7CiAgICAgZm9yICh4PTA7IG4+MDsgeCsrLG4+Pj0xKSB7fQogICAgIGlmICggYnVmU2l6ZSAhPSAoMTw8KHgtMSkpICkgewogICAgICAgRkRLcHJpbnRmRXJyKCJFcnJvcjogYnVmU2l6ZWluIEZES19Jbml0Qml0QnVmZmVyKCkgIT0gKDJebiksICVkXG4iLCBidWZTaXplKTsKICAgICB9CiAgIH0KI2VuZGlmCn0KCnZvaWQgRkRLX1Jlc2V0Qml0QnVmZmVyICggSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiApCnsKICAgaEJpdEJ1Zi0+VmFsaWRCaXRzICAgPSAwIDsKICAgaEJpdEJ1Zi0+UmVhZE9mZnNldCAgPSAwIDsKICAgaEJpdEJ1Zi0+V3JpdGVPZmZzZXQgPSAwIDsKICAgaEJpdEJ1Zi0+Qml0Q250ICAgICAgPSAwIDsKICAgaEJpdEJ1Zi0+Qml0TmR4ICAgICAgPSAwIDsKfQoKSU5UICBGREtfZ2V0IChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykKewogIFVJTlQgYnl0ZU9mZnNldCA9IGhCaXRCdWYtPkJpdE5keCA+PiAzIDsKICBVSU5UIGJpdE9mZnNldCAgPSBoQml0QnVmLT5CaXROZHggJiAweDA3IDsKCiAgaEJpdEJ1Zi0+Qml0TmR4ICAgICA9IChoQml0QnVmLT5CaXROZHggKyBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKSA7CiAgaEJpdEJ1Zi0+Qml0Q250ICAgICs9ICBudW1iZXJPZkJpdHMgOwogIGhCaXRCdWYtPlZhbGlkQml0cyAtPSAgbnVtYmVyT2ZCaXRzIDsKCiAgVUlOVCBieXRlTWFzayA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxIDsKCiAgVUlOVCB0eCA9IChoQml0QnVmLT5CdWZmZXIgWyBieXRlT2Zmc2V0ICAgICYgYnl0ZU1hc2tdIDw8IDI0KSB8CiAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzEpICYgYnl0ZU1hc2tdIDw8IDE2KSB8CiAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzIpICYgYnl0ZU1hc2tdIDw8ICA4KSB8CiAgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzMpICYgYnl0ZU1hc2tdOwoKICBpZiAoYml0T2Zmc2V0KQogIHsKICAgIHR4IDw8PSBiaXRPZmZzZXQ7CiAgICB0eCB8PSBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzQpICYgYnl0ZU1hc2tdID4+ICg4LWJpdE9mZnNldCk7CiAgfQoKICByZXR1cm4gKHR4ID4+ICgzMiAtIG51bWJlck9mQml0cykpIDsKfQoKSU5UIEZES19nZXQzMiAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikKewogIFVJTlQgQml0TmR4ID0gaEJpdEJ1Zi0+Qml0TmR4ICsgMzI7CiAgaWYgKEJpdE5keCA8PSBoQml0QnVmLT5idWZCaXRzKQogIHsKICAgIGhCaXRCdWYtPkJpdE5keCA9IEJpdE5keDsKICAgIGhCaXRCdWYtPkJpdENudCArPSAgMzI7CiAgICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gMzI7CgogICAgVUlOVCBieXRlT2Zmc2V0ID0gKEJpdE5keC0xKSA+PiAzOwogICAgVUlOVCBjYWNoZSA9IChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMyldIDw8IDI0KSB8CiAgICAgICAgICAgICAgICAgKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldC0yKV0gPDwgMTYpIHwKICAgICAgICAgICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0LTEpXSA8PCAgOCkgfAogICAgICAgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMCldOwoKICAgIGlmICggKEJpdE5keCA9IChCaXROZHgmNykpICE9IDAgKSB7CiAgICAgIGNhY2hlID0gKGNhY2hlID4+ICg4LUJpdE5keCkpIHwgKChVSU5UKWhCaXRCdWYtPkJ1ZmZlciBbYnl0ZU9mZnNldC00XSA8PCAoMjQrQml0TmR4KSk7CiAgICB9CiAgICByZXR1cm4gKGNhY2hlKSA7CiAgfQogIGVsc2UKICB7CiAgICAvKiBleG90aWMgcGF0aCwgdXNlZCBvbmx5IGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgd2hlbiB3cmFwcGluZyBhcm91bmQgKi8KICAgIGludCBuQml0cyA9IChJTlQpaEJpdEJ1Zi0+YnVmQml0cy0oSU5UKWhCaXRCdWYtPkJpdE5keDsKCiAgICBVSU5UIGNhY2hlID0gRkRLX2dldCAoaEJpdEJ1ZixuQml0cyk8PCAoMzItbkJpdHMpOwogICAgY2FjaGUgfD0gKEZES19nZXQgKGhCaXRCdWYsMzItbkJpdHMpKTsKICAgIHJldHVybiAoY2FjaGUpOwogIH0KfQoKSU5UIEZES19nZXRCd2QgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQp7CiAgVUlOVCBieXRlT2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ID4+IDMgOwogIFVJTlQgYml0T2Zmc2V0ICA9IGhCaXRCdWYtPkJpdE5keCAmIDB4MDcgOwogIFVJTlQgYnl0ZU1hc2sgICA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxIDsKICBpbnQgaTsKCiAgaEJpdEJ1Zi0+Qml0TmR4ICAgICA9IChoQml0QnVmLT5CaXROZHggLSBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKSA7CiAgaEJpdEJ1Zi0+Qml0Q250ICAgIC09ICBudW1iZXJPZkJpdHMgOwogIGhCaXRCdWYtPlZhbGlkQml0cyArPSAgbnVtYmVyT2ZCaXRzIDsKCiAgVUlOVCB0eCA9IGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMykgJiBieXRlTWFza10gPDwgMjQgfAogICAgICAgICAgICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTIpICYgYnl0ZU1hc2tdIDw8IDE2IHwKICAgICAgICAgICAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0xKSAmIGJ5dGVNYXNrXSA8PCAgOCB8CiAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlciBbIGJ5dGVPZmZzZXQgICAgJiBieXRlTWFza10gOwogIFVJTlQgdHhhID0gMHgwOwoKICB0eCA+Pj0gKDggLSBiaXRPZmZzZXQpIDsKCiAgaWYgKGJpdE9mZnNldCAmJiBudW1iZXJPZkJpdHMgPiAyNCkKICB7CiAgICB0eCB8PSBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTQpICYgYnl0ZU1hc2tdIDw8ICgyNCArIGJpdE9mZnNldCkgOwogIH0KCiAgLyogaW4gcGxhY2UgdHVybiBhcm91bmQgKi8KICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgVUlOVCBiaXRNYXNrUiA9IDB4MDAwMDAwMDEgPDwgaTsKICAgIFVJTlQgYml0TWFza0wgPSAweDgwMDAwMDAwID4+IGk7CgogICAgdHhhIHw9ICh0eCAmIGJpdE1hc2tSKSA8PCAoMzEgLSAoaTw8MSkpOwogICAgdHhhIHw9ICh0eCAmIGJpdE1hc2tMKSA+PiAoMzEgLSAoaTw8MSkpOwogIH0KCiAgcmV0dXJuICh0eGEgPj4gKDMyIC0gbnVtYmVyT2ZCaXRzKSkgOwp9Cgp2b2lkIEZES19wdXQgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIFVJTlQgdmFsdWUsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQp7CiAgVUlOVCBieXRlT2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ID4+IDMgOwogIFVJTlQgYml0T2Zmc2V0ICA9IGhCaXRCdWYtPkJpdE5keCAmIDB4MDcgOwoKICBoQml0QnVmLT5CaXROZHggICAgID0gKGhCaXRCdWYtPkJpdE5keCArIG51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpIDsKICBoQml0QnVmLT5CaXRDbnQgICAgKz0gIG51bWJlck9mQml0cyA7CiAgaEJpdEJ1Zi0+VmFsaWRCaXRzICs9ICBudW1iZXJPZkJpdHMgOwoKICBVSU5UIGJ5dGVNYXNrID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDEgOwoKICBVSU5UIHRtcCAgPSB2YWx1ZTw8KDMyLW51bWJlck9mQml0cyk+PmJpdE9mZnNldDsKICBVSU5UIG1hc2sgPSB+Qml0TWFza1soMzItYml0T2Zmc2V0KV0gfCAoQml0TWFzayBbKDMyLW51bWJlck9mQml0cyldID4+IGJpdE9mZnNldCkgOwoKICBoQml0QnVmLT5CdWZmZXIgWyBieXRlT2Zmc2V0ICAgICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyBieXRlT2Zmc2V0ICAgICYgYnl0ZU1hc2tdJihtYXNrPj4yNCkpIHwgKFVDSEFSKSh0bXA+PjI0KTsKICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzEpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzEpICYgYnl0ZU1hc2tdJihtYXNrPj4xNikpIHwgKFVDSEFSKSh0bXA+PjE2KTsKICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzIpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzIpICYgYnl0ZU1hc2tdJihtYXNrPj44KSkgIHwgKFVDSEFSKSh0bXA+PjgpOwogIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrMykgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrMykgJiBieXRlTWFza10mKG1hc2spKSAgICAgfCAoVUNIQVIpKHRtcCk7CgogIGlmIChiaXRPZmZzZXQgJiYgbnVtYmVyT2ZCaXRzID4gMjQpCiAgewogICAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCs0KSAmIGJ5dGVNYXNrXSAgPSAoVUNIQVIpKHZhbHVlPDwoNDAtbnVtYmVyT2ZCaXRzKT4+Yml0T2Zmc2V0KSB8CiAgICAgICAgICAgICAgICggaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCs0KSAmIGJ5dGVNYXNrXSAmIEJpdE1hc2tbKDQwLW51bWJlck9mQml0cy1iaXRPZmZzZXQpXSApIDsKICB9Cn0KCnZvaWQgRkRLX3B1dEJ3ZCAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgVUlOVCB2YWx1ZSwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpCnsKICBVSU5UIGJ5dGVPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggPj4gMyA7CiAgVUlOVCBiaXRPZmZzZXQgID0gNyAtIChoQml0QnVmLT5CaXROZHggJiAweDA3KSA7CiAgVUlOVCBieXRlTWFzayAgID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDEgOwoKICBVSU5UIG1hc2sgPSB+KEJpdE1hc2tbbnVtYmVyT2ZCaXRzXSA8PCBiaXRPZmZzZXQpIDsKICBVSU5UIHRtcCA9IDB4MDAwMDsKICBpbnQgIGk7CgogIGhCaXRCdWYtPkJpdE5keCAgICAgPSAoaEJpdEJ1Zi0+Qml0TmR4IC0gbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSkgOwogIGhCaXRCdWYtPkJpdENudCAgICAtPSAgbnVtYmVyT2ZCaXRzIDsKICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gIG51bWJlck9mQml0cyA7CgogIC8qIGluIHBsYWNlIHR1cm4gYXJvdW5kICovCiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKICAgIFVJTlQgYml0TWFza1IgPSAweDAwMDAwMDAxIDw8IGk7CiAgICBVSU5UIGJpdE1hc2tMID0gMHg4MDAwMDAwMCA+PiBpOwoKICAgIHRtcCB8PSAodmFsdWUgJiBiaXRNYXNrUikgPDwgKDMxIC0gKGk8PDEpKTsKICAgIHRtcCB8PSAodmFsdWUgJiBiaXRNYXNrTCkgPj4gKDMxIC0gKGk8PDEpKTsKICB9CiAgdmFsdWUgPSB0bXA7CiAgdG1wICAgPSB2YWx1ZT4+KDMyLW51bWJlck9mQml0cyk8PGJpdE9mZnNldDsKCiAgaEJpdEJ1Zi0+QnVmZmVyIFsgYnl0ZU9mZnNldCAgICAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsgYnl0ZU9mZnNldCAgICAmIGJ5dGVNYXNrXSYobWFzaykpICAgICB8IChVQ0hBUikodG1wKTsKICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTEpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTEpICYgYnl0ZU1hc2tdJihtYXNrPj44KSkgIHwgKFVDSEFSKSh0bXA+PjgpOwogIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMikgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMikgJiBieXRlTWFza10mKG1hc2s+PjE2KSkgfCAoVUNIQVIpKHRtcD4+MTYpOwogIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMykgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMykgJiBieXRlTWFza10mKG1hc2s+PjI0KSkgfCAoVUNIQVIpKHRtcD4+MjQpOwoKICBpZiAoKGJpdE9mZnNldCArIG51bWJlck9mQml0cykgPiAzMikKICB7CiAgICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTQpICYgYnl0ZU1hc2tdICA9IChVQ0hBUikodmFsdWU+Pig2NC1udW1iZXJPZkJpdHMtYml0T2Zmc2V0KSkgfAogICAgICAgICAgICAgICAoIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtNCkgJiBieXRlTWFza10gJiB+KEJpdE1hc2tbYml0T2Zmc2V0XSA+PiAoMzItbnVtYmVyT2ZCaXRzKSkgKSA7CiAgfQp9CgoKdm9pZCBGREtfcHVzaEJhY2sgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzLCBVQ0hBUiBjb25maWcpCnsKICBoQml0QnVmLT5CaXRDbnQgICAgLT0gbnVtYmVyT2ZCaXRzIDsKICBoQml0QnVmLT5WYWxpZEJpdHMgKz0gKGNvbmZpZz09MCkgPyBudW1iZXJPZkJpdHMgOiAoLShJTlQpbnVtYmVyT2ZCaXRzKSA7CiAgaEJpdEJ1Zi0+Qml0TmR4ICAgICA9IChoQml0QnVmLT5CaXROZHggLSBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKSA7Cn0KCnZvaWQgRkRLX3B1c2hGb3J3YXJkIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cywgVUNIQVIgY29uZmlnKQp7CiAgaEJpdEJ1Zi0+Qml0Q250ICAgICs9IG51bWJlck9mQml0cyA7CiAgaEJpdEJ1Zi0+VmFsaWRCaXRzIC09IChjb25maWc9PTApID8gbnVtYmVyT2ZCaXRzIDogKC0oSU5UKW51bWJlck9mQml0cykgOwogIGhCaXRCdWYtPkJpdE5keCAgICAgPSAoaEJpdEJ1Zi0+Qml0TmR4ICsgbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSkgOwp9CgoKdm9pZCBGREtfYnl0ZUFsaWduIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVQ0hBUiBjb25maWcpCnsKICBJTlQgYWxpZ25tZW50ID0gaEJpdEJ1Zi0+Qml0Q250ICYgMHgwNyA7CgogIGlmIChhbGlnbm1lbnQpCiAgewogICAgaWYgKGNvbmZpZz09MCkKICAgICAgRkRLX3B1c2hGb3J3YXJkIChoQml0QnVmLCA4IC0gYWxpZ25tZW50LCBjb25maWcpIDsgLyogQlNfUkVBREVSICovCiAgICBlbHNlCiAgICAgIEZES19wdXQgKGhCaXRCdWYsMCAsIDggLSBhbGlnbm1lbnQpIDsgICAgICAgICAgICAgIC8qIEJTX1dSSVRFUiAqLwogIH0KCiAgaEJpdEJ1Zi0+Qml0Q250ID0gMCA7Cn0KClVJTlQgRkRLX2dldFZhbGlkQml0cyAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikKewogICAgcmV0dXJuIGhCaXRCdWYtPlZhbGlkQml0czsKfQoKSU5UIEZES19nZXRGcmVlQml0cyAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikKewogICAgcmV0dXJuIChoQml0QnVmLT5idWZCaXRzIC0gaEJpdEJ1Zi0+VmFsaWRCaXRzKSA7Cn0KCnZvaWQgRkRLX3NldEJpdENudCAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgY29uc3QgVUlOVCB2YWx1ZSkKewogIGhCaXRCdWYtPkJpdENudCA9IHZhbHVlIDsKfQoKSU5UIEZES19nZXRCaXRDbnQgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYpCnsKICByZXR1cm4gaEJpdEJ1Zi0+Qml0Q250IDsKfQoKdm9pZCBGREtfRmVlZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLAogICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgKlJFU1RSSUNUIGlucHV0QnVmZmVyLAogICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgIGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAqYnl0ZXNWYWxpZCkKewogIGlucHV0QnVmZmVyID0gJmlucHV0QnVmZmVyIFtidWZmZXJTaXplIC0gKmJ5dGVzVmFsaWRdIDsKCiAgVUlOVCBiVG90YWwgPSAwIDsKCiAgVUlOVCBiVG9SZWFkICAgPSAoaEJpdEJ1Zi0+YnVmQml0cyAtIGhCaXRCdWYtPlZhbGlkQml0cykgPj4gMyA7CiAgVUlOVCBub09mQnl0ZXMgPSBmTWluKGJUb1JlYWQsICpieXRlc1ZhbGlkKTsgLy8oYlRvUmVhZCA8ICpieXRlc1ZhbGlkKSA/IGJUb1JlYWQgOiAqYnl0ZXNWYWxpZCA7CgogIHdoaWxlIChub09mQnl0ZXMgPiAwKQogIHsKICAgIC8qIHNwbGl0IHJlYWQgdG8gYnVmZmVyIHNpemUgKi8KICAgIGJUb1JlYWQgPSBoQml0QnVmLT5idWZTaXplIC0gaEJpdEJ1Zi0+UmVhZE9mZnNldCA7CiAgICBiVG9SZWFkID0gZk1pbihiVG9SZWFkLCBub09mQnl0ZXMpOyAvLyhiVG9SZWFkIDwgbm9PZkJ5dGVzKSA/IGJUb1JlYWQgOiBub09mQnl0ZXMgOwoKICAgIC8qIGNvcHkgJ2JUb1JlYWQnIGJ5dGVzIGZyb20gJ3B0cicgdG8gaW5wdXRidWZmZXIgKi8KICAgIEZES21lbWNweSgmaEJpdEJ1Zi0+QnVmZmVyW2hCaXRCdWYtPlJlYWRPZmZzZXRdLCBpbnB1dEJ1ZmZlciwgYlRvUmVhZCpzaXplb2YoVUNIQVIpKTsKCiAgICAvKiBhZGQgbm9PZkJpdHMgdG8gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYnVmZmVyICovCiAgICBoQml0QnVmLT5WYWxpZEJpdHMgICs9IGJUb1JlYWQgPDwgMyA7CiAgICBiVG90YWwgICAgICAgKz0gYlRvUmVhZCA7CiAgICBpbnB1dEJ1ZmZlciAgKz0gYlRvUmVhZCA7CgogICAgaEJpdEJ1Zi0+UmVhZE9mZnNldCAgPSAoaEJpdEJ1Zi0+UmVhZE9mZnNldCArIGJUb1JlYWQpICYgKGhCaXRCdWYtPmJ1ZlNpemUgLSAxKSA7CiAgICBub09mQnl0ZXMgICAgLT0gYlRvUmVhZCA7CiAgfQoKICAqYnl0ZXNWYWxpZCAtPSBiVG90YWwgOwp9Cgp2b2lkIENvcHlBbGlnbmVkQmxvY2sgKEhBTkRMRV9GREtfQklUQlVGIGhfQml0QnVmU3JjLCBVQ0hBUiAqUkVTVFJJQ1QgZHN0QnVmZmVyLCBVSU5UIGJUb1JlYWQpCnsKICBVSU5UIGJ5dGVPZmZzZXQgPSBoX0JpdEJ1ZlNyYy0+Qml0TmR4ID4+IDMgOwogIGNvbnN0IFVJTlQgYnl0ZU1hc2sgPSBoX0JpdEJ1ZlNyYy0+YnVmU2l6ZSAtIDEgOwoKICBVQ0hBUiAqUkVTVFJJQ1QgcEJCQiA9IGhfQml0QnVmU3JjLT5CdWZmZXI7CiAgZm9yIChVSU5UIGkgPSAwIDsgaSA8IGJUb1JlYWQgOyBpKyspCiAgewogICAgZHN0QnVmZmVyW2ldID0gcEJCQlsoYnl0ZU9mZnNldCtpKSAmIGJ5dGVNYXNrXSA7CiAgfQoKICBiVG9SZWFkIDw8PSAzIDsKCiAgaF9CaXRCdWZTcmMtPkJpdE5keCA9IChoX0JpdEJ1ZlNyYy0+Qml0TmR4ICsgYlRvUmVhZCkgJiAoaF9CaXRCdWZTcmMtPmJ1ZkJpdHMgLSAxKSA7CiAgaF9CaXRCdWZTcmMtPkJpdENudCArPSBiVG9SZWFkIDsKICBoX0JpdEJ1ZlNyYy0+VmFsaWRCaXRzIC09IGJUb1JlYWQgOwp9Cgp2b2lkIEZES19Db3B5IChIQU5ETEVfRkRLX0JJVEJVRiBoX0JpdEJ1ZkRzdCwgSEFORExFX0ZES19CSVRCVUYgaF9CaXRCdWZTcmMsIFVJTlQgKmJ5dGVzVmFsaWQpCnsKICBJTlQgYlRvdGFsID0gMDsKCiAgLyogbGltaXQgbm9PZkJ5dGVzIHRvIHZhbGlkIGJ5dGVzIGluIHNyYyBidWZmZXIgYW5kIGF2YWlsYWJsZSBieXRlcyBpbiBkc3QgYnVmZmVyICovCiAgVUlOVCBiVG9SZWFkICAgPSBoX0JpdEJ1ZlNyYy0+VmFsaWRCaXRzID4+IDMgOwogIFVJTlQgbm9PZkJ5dGVzID0gZk1pbihiVG9SZWFkLCAqYnl0ZXNWYWxpZCk7IC8vKCpieXRlc1ZhbGlkIDwgYlRvUmVhZCkgPyAqYnl0ZXNWYWxpZCA6IGJUb1JlYWQgOwogIGJUb1JlYWQgICA9IEZES19nZXRGcmVlQml0cyhoX0JpdEJ1ZkRzdCk7CiAgbm9PZkJ5dGVzID0gZk1pbihiVG9SZWFkLCBub09mQnl0ZXMpOyAvLyhiVG9SZWFkIDwgbm9PZkJ5dGVzKSA/IGJUb1JlYWQgOiBub09mQnl0ZXM7CgogIHdoaWxlIChub09mQnl0ZXMgPiAwKQogIHsKICAgIC8qIFNwbGl0IFJlYWQgdG8gYnVmZmVyIHNpemUgKi8KICAgIGJUb1JlYWQgPSBoX0JpdEJ1ZkRzdC0+YnVmU2l6ZSAtIGhfQml0QnVmRHN0LT5SZWFkT2Zmc2V0IDsKICAgIGJUb1JlYWQgPSBmTWluKG5vT2ZCeXRlcywgYlRvUmVhZCk7IC8vKG5vT2ZCeXRlcyA8IGJUb1JlYWQpID8gbm9PZkJ5dGVzIDogYlRvUmVhZCA7CgogICAgLyogY29weSAnYlRvUmVhZCcgYnl0ZXMgZnJvbSBidWZmZXIgdG8gYnVmZmVyICovCiAgICBpZiAoIShoX0JpdEJ1ZlNyYy0+Qml0TmR4ICYgMHgwNykpIHsKICAgICAgQ29weUFsaWduZWRCbG9jayAoaF9CaXRCdWZTcmMsIGhfQml0QnVmRHN0LT5CdWZmZXIgKyBoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCwgYlRvUmVhZCkgOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChVSU5UIGkgPSAwOyBpIDwgYlRvUmVhZDsgaSsrKQogICAgICB7CiAgICAgICAgaF9CaXRCdWZEc3QtPkJ1ZmZlciBbaF9CaXRCdWZEc3QtPlJlYWRPZmZzZXQgKyBpXSA9IChVQ0hBUilGREtfZ2V0KGhfQml0QnVmU3JjLDgpOwogICAgICB9CiAgICB9CgogICAgLyogYWRkIG5vT2ZCaXRzIHRvIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJ1ZmZlciAqLwogICAgaF9CaXRCdWZEc3QtPlZhbGlkQml0cyAgKz0gYlRvUmVhZCA8PCAzIDsKICAgIGJUb3RhbCAgICAgICArPSBiVG9SZWFkOwoKICAgIGhfQml0QnVmRHN0LT5SZWFkT2Zmc2V0ICA9IChoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCArIGJUb1JlYWQpICYgKGhfQml0QnVmRHN0LT5idWZTaXplLTEpOwogICAgbm9PZkJ5dGVzICAgIC09IGJUb1JlYWQ7CiAgfQoKICAqYnl0ZXNWYWxpZCAtPWJUb3RhbDsKfQoKdm9pZCBGREtfRmV0Y2ggKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIFVDSEFSICpvdXRCdWYsIFVJTlQgKndyaXRlQnl0ZXMpCnsKICBVQ0hBUiAqUkVTVFJJQ1Qgb3V0cHV0QnVmZmVyID0gb3V0QnVmOwogIFVJTlQgYlRvdGFsID0gMCA7CgogIFVJTlQgYlRvV3JpdGUgID0gKGhCaXRCdWYtPlZhbGlkQml0cykgPj4gMyA7CiAgVUlOVCBub09mQnl0ZXMgPSBmTWluKGJUb1dyaXRlLCAqd3JpdGVCeXRlcyk7IC8vKGJUb1dyaXRlIDwgKndyaXRlQnl0ZXMpID8gYlRvV3JpdGUgOiAqd3JpdGVCeXRlcyA7CgogIHdoaWxlIChub09mQnl0ZXMgPiAwKQogIHsKICAgIC8qIHNwbGl0IHdyaXRlIHRvIGJ1ZmZlciBzaXplICovCiAgICBiVG9Xcml0ZSA9IGhCaXRCdWYtPmJ1ZlNpemUgLSBoQml0QnVmLT5Xcml0ZU9mZnNldCA7CiAgICBiVG9Xcml0ZSA9IGZNaW4oYlRvV3JpdGUsIG5vT2ZCeXRlcyk7IC8vKGJUb1dyaXRlIDwgbm9PZkJ5dGVzKSA/IGJUb1dyaXRlIDogbm9PZkJ5dGVzIDsKCiAgICAvKiBjb3B5ICdiVG9Xcml0ZScgYnl0ZXMgZnJvbSBiaXRidWZmZXIgdG8gb3V0cHV0YnVmZmVyICovCiAgICBGREttZW1jcHkob3V0cHV0QnVmZmVyLCAmaEJpdEJ1Zi0+QnVmZmVyW2hCaXRCdWYtPldyaXRlT2Zmc2V0XSwgYlRvV3JpdGUqc2l6ZW9mKFVDSEFSKSk7CgogICAgLyogc3ViIG5vT2ZCaXRzIGZyb20gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYnVmZmVyICovCiAgICBoQml0QnVmLT5WYWxpZEJpdHMgIC09IGJUb1dyaXRlIDw8IDMgOwogICAgYlRvdGFsICAgICAgICs9IGJUb1dyaXRlIDsKICAgIG91dHB1dEJ1ZmZlciArPSBiVG9Xcml0ZSA7CgogICAgaEJpdEJ1Zi0+V3JpdGVPZmZzZXQgID0gKGhCaXRCdWYtPldyaXRlT2Zmc2V0ICsgYlRvV3JpdGUpICYgKGhCaXRCdWYtPmJ1ZlNpemUgLSAxKSA7CiAgICBub09mQnl0ZXMgICAgLT0gYlRvV3JpdGUgOwogIH0KCiAgKndyaXRlQnl0ZXMgPSBiVG90YWwgOwp9Cgo=