Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgRW52ZWxvcGUgZXh0cmFjdGlvbiBwcm90b3R5cGVzICAKKi8KCiNpZm5kZWYgX19FTlZFTE9QRV9FWFRSQUNUSU9OX0gKI2RlZmluZSBfX0VOVkVMT1BFX0VYVFJBQ1RJT05fSAoKI2luY2x1ZGUgInNicmRlY29kZXIuaCIKCiNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiNpbmNsdWRlICJscHBfdHJhbi5oIgoKI2luY2x1ZGUgInBzZGVjLmgiCgojZGVmaW5lIEVOVl9FWFBfRlJBQ1QgMAovKiE8IFNoaWZ0IHJhdyBlbnZlbG9wZSBkYXRhIHRvIHN1cHBvcnQgZnJhY3Rpb25hbCBudW1iZXJzLgogIENhbiBiZSBzZXQgdG8gOCBpbnN0ZWFkIG9mIDAgdG8gZW5oYW5jZSBhY2N1cmFjeSBkdXJpbmcgY29uY2VhbG1lbnQuCiAgVGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIGNvbmZvcm1hbmNlIGFuZCAjcmVxdWFudGl6ZUVudmVsb3BlRGF0YSgpIHdpbGwKICBiZWNvbWUgbW9yZSBleHBlbnNpdmUuCiovCgojZGVmaW5lIEVYUF9CSVRTIDYKLyohPCBTaXplIG9mIGV4cG9uZW50LXBhcnQgb2YgYSBwc2V1ZG8gZmxvYXQgZW52ZWxvcGUgdmFsdWUgKHNob3VsZCBiZSBhdCBsZWFzdCA2KS4KICBUaGUgcmVtYWluaW5nIGJpdHMgaW4gZWFjaCB3b3JkIGFyZSB1c2VkIGZvciB0aGUgbWFudGlzc2EgKHNob3VsZCBiZSBhdCBsZWFzdCAxMCkuCiAgVGhpcyBmb3JtYXQgaXMgdXNlZCBpbiB0aGUgYXJyYXlzIGlFbnZlbG9wZVtdIGFuZCBzYnJOb2lzZUZsb29yTGV2ZWxbXQogIGluIHRoZSBGUkFNRV9EQVRBIHN0cnVjdCB3aGljaCBtdXN0IGZpdCBpbiBhIGNlcnRhaW4gcGFydCBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgogIChTZWUgYnVmZmVyIG1hbmFnZW1lbnQgaW4gc2JyX2RlYy5jcHApLgogIEV4cG9uZW50cyBhbmQgbWFudGlzc2FzIGNvdWxkIGFsc28gYmUgc3RvcmVkIGluIHNlcGFyYXRlIGFycmF5cy4KICBBY2Nlc3NpbmcgdGhlIGV4cG9uZW50IG9yIHRoZSBtYW50aXNzYSB3b3VsZCBiZSBzaW1wbGlmaWVkIGFuZCB0aGUgbWFza3MgI01BU0tfRQogIHJlc3AuICNNQVNLX00gd291bGQgICBubyBsb25nZXIgYmUgcmVxdWlyZWQuCiovCgojZGVmaW5lIE1BU0tfTSAoKCgxIDw8IChGUkFDVF9CSVRTIC0gRVhQX0JJVFMpKSAtIDEpIDw8IEVYUF9CSVRTKSAgLyohPCBNYXNrIGZvciBleHRyYWN0aW5nIHRoZSBtYW50aXNzYSBvZiBhIHBzZXVkbyBmbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLwojZGVmaW5lIE1BU0tfRSAoKDEgPDwgRVhQX0JJVFMpIC0gMSkgICAgICAgICAgIC8qITwgTWFzayBmb3IgZXh0cmFjdGluZyB0aGUgZXhwb25lbnQgb2YgYSBwc2V1ZG8gZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KCiNkZWZpbmUgU0lHTl9FWFQgKCAoKFNDSEFSKS0xKSBeIE1BU0tfRSkgICAgICAgIC8qITwgYSBDSEFSLWNvbnN0YW50IHdpdGggYWxsIGJpdHMgYWJvdmUgb3VyIHNpZ24tYml0IHNldCAqLwojZGVmaW5lIFJPVU5ESU5HICggKEZJWFBfU0dMKSgxPDwoRVhQX0JJVFMtMSkpICkgLyohPCAwLjUtb2Zmc2V0IGZvciByb3VuZGluZyB0aGUgbWFudGlzc2Egb2YgYSBwc2V1ZG8tZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KI2RlZmluZSBOUkdfRVhQX09GRlNFVCAgMTYgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlZmVyZW5jZSBlbmVyZ3kncyBleHBvbmVudCB0byBwcmV2ZW50IG5lZ2F0aXZlIG51bWJlcnMgKi8KI2RlZmluZSBOT0lTRV9FWFBfT0ZGU0VUICAzOCAgICAgICAgICAgICAgICAgICAvKiE8IFdpbGwgYmUgYWRkZWQgdG8gdGhlIG5vaXNlIGxldmVsIGV4cG9uZW50IHRvIHByZXZlbnQgbmVnYXRpdmUgbnVtYmVycyAqLwoKdHlwZWRlZiBlbnVtCnsKICBIRUFERVJfTk9UX1BSRVNFTlQsCiAgSEVBREVSX09LLAogIEhFQURFUl9SRVNFVAp9ClNCUl9IRUFERVJfU1RBVFVTOwoKdHlwZWRlZiBlbnVtCnsKICBTQlJfTk9UX0lOSVRJQUxJWkVELAogIFVQU0FNUExJTkcsCiAgU0JSX0hFQURFUiwKICBTQlJfQUNUSVZFCn0KU0JSX1NZTkNfU1RBVEU7CgoKdHlwZWRlZiBlbnVtCnsKICBDT1VQTElOR19PRkYgPSAwLAogIENPVVBMSU5HX0xFVkVMLAogIENPVVBMSU5HX0JBTAp9CkNPVVBMSU5HX01PREU7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgVUNIQVIgblNmYlsyXTsgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFNCUi1iYW5kcyBmb3IgbG93IGFuZCBoaWdoIGZyZXEtcmVzb2x1dGlvbiAqLwogIFVDSEFSIG5OZmI7ICAgICAgICAgICAgICAvKiE8IEFjdHVhbCBudW1iZXIgb2Ygbm9pc2UgYmFuZHMgdG8gcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0qLwogIFVDSEFSIG51bU1hc3RlcjsgICAgICAgICAvKiE8IE51bWJlciBvZiBTQlItYmFuZHMgaW4gdl9rX21hc3RlciAqLwogIFVDSEFSIGxvd1N1YmJhbmQ7ICAgICAgICAvKiE8IFFNRi1iYW5kIHdoZXJlIFNCUiBmcmVxdWVuY3kgcmFuZ2Ugc3RhcnRzICovCiAgVUNIQVIgaGlnaFN1YmJhbmQ7ICAgICAgIC8qITwgUU1GLWJhbmQgd2hlcmUgU0JSIGZyZXF1ZW5jeSByYW5nZSBlbmRzICovCiAgVUNIQVIgbGltaXRlckJhbmRUYWJsZVtNQVhfTlVNX0xJTUlURVJTKzFdOyAvKiE8IExpbWl0ZXIgYmFuZCB0YWJsZS4gKi8KICBVQ0hBUiBub0xpbWl0ZXJCYW5kczsgICAgLyohPCBOdW1iZXIgb2YgbGltaXRlciBiYW5kcy4gKi8KICBVQ0hBUiBuSW52ZkJhbmRzOyAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCiAgVUNIQVIgKmZyZXFCYW5kVGFibGVbMl07IC8qITwgUG9pbnRlcnMgdG8gZnJlcUJhbmRUYWJsZUxvIGFuZCBmcmVxQmFuZFRhYmxlSGkgKi8KICBVQ0hBUiBmcmVxQmFuZFRhYmxlTG9bTUFYX0ZSRVFfQ09FRkZTLzIrMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBiYW5kcyB0byBRTUYgYmFuZHMgZm9yIGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLwogIFVDSEFSIGZyZXFCYW5kVGFibGVIaVtNQVhfRlJFUV9DT0VGRlMrMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBiYW5kcyB0byBRTUYgYmFuZHMgZm9yIGhpZ2ggZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KICBVQ0hBUiBmcmVxQmFuZFRhYmxlTm9pc2VbTUFYX05PSVNFX0NPRUZGUysxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIG5vaXNlIGJhbmRzIHRvIFFNRiBiYW5kcyAqLwogIFVDSEFSIHZfa19tYXN0ZXJbTUFYX0ZSRVFfQ09FRkZTKzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFzdGVyIEJhbmRUYWJsZSB3aGljaCBmcmVxQmFuZFRhYmxlIGlzIGRlcml2ZWQgZnJvbSAqLwp9CkZSRVFfQkFORF9EQVRBOwoKdHlwZWRlZiBGUkVRX0JBTkRfREFUQSAqSEFORExFX0ZSRVFfQkFORF9EQVRBOwoKI2RlZmluZSBTQlJERUNfRUxEX0dSSUQgICAgICAgIDEKI2RlZmluZSBTQlJERUNfU1lOVEFYX1NDQUwgICAgIDIKI2RlZmluZSBTQlJERUNfU1lOVEFYX1VTQUMgICAgIDQKI2RlZmluZSBTQlJERUNfU1lOVEFYX1JTVkQ1MCAgIDgKI2RlZmluZSBTQlJERUNfTE9XX1BPV0VSICAgICAgMTYgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IExvdyBQb3dlciBRTUYgbW9kZSBzaGFsbCBiZSB1c2VkLiAqLwojZGVmaW5lIFNCUkRFQ19QU19ERUNPREVEICAgICAzMiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgUFMgd2FzIGRlY29kZWQgYW5kIHJlbmRlcmVkLiAqLwojZGVmaW5lIFNCUkRFQ19MRF9NUFNfUU1GICAgIDUxMiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIExELU1QUyBRTUYgc2hhbGwgYmUgdXNlZC4gKi8KI2RlZmluZSBTQlJERUNfRE9XTlNBTVBMRSAgIDgxOTIgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBkb3duc2FtcGxpbmcgbW9kZSBpcyB1c2VkLiAqLwojZGVmaW5lIFNCUkRFQ19GTFVTSCAgICAgICAxNjM4NCAgLyogRmxhZyBpcyB1c2VkIHRvIGZsdXNoIGFsbCBlbGVtZW50cyBpbiB1c2UuICovCiNkZWZpbmUgU0JSREVDX0ZPUkNFX1JFU0VUIDMyNzY4ICAvKiBGbGFnIGlzIHVzZWQgdG8gZm9yY2UgYSByZXNldCBvZiBhbGwgZWxlbWVudHMgaW4gdXNlLiAqLwoKI2RlZmluZSBTQlJERUNfSERSX1NUQVRfUkVTRVQgIDEKI2RlZmluZSBTQlJERUNfSERSX1NUQVRfVVBEQVRFIDIKCnR5cGVkZWYgc3RydWN0IHsKICBVQ0hBUiBhbXBSZXNvbHV0aW9uOyAgICAgICAvKiE8IEFtcGxpdHVkZSByZXNvbHV0aW9uIG9mIGVudmVsb3BlIHZhbHVlcyAoMDogMS41ZEIsIDE6IDNkQikgKi8KICBVQ0hBUiB4b3Zlcl9iYW5kOyAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4IGluICN2X2tfbWFzdGVyW10gdXNlZCBmb3IgZHluYW1pYyBjcm9zc292ZXIgZnJlcXVlbmN5ICovCiAgVUNIQVIgc2JyX3ByZXByb2Nlc3Npbmc7ICAgLyohPCBTQlIgcHJld2hpdGVuaW5nIGZsYWcuICovCn0gU0JSX0hFQURFUl9EQVRBX0JTX0lORk87Cgp0eXBlZGVmIHN0cnVjdCB7CiAgLyogQ2hhbmdlcyBpbiB0aGVzZSB2YXJpYWJsZXMgY2F1c2VzIGEgcmVzZXQgb2YgdGhlIGRlY29kZXIgKi8KICBVQ0hBUiBzdGFydEZyZXE7ICAgICAgICAgICAvKiE8IEluZGV4IGZvciBTQlIgc3RhcnQgZnJlcXVlbmN5ICovCiAgVUNIQVIgc3RvcEZyZXE7ICAgICAgICAgICAgLyohPCBJbmRleCBmb3IgU0JSIGhpZ2hlc3QgZnJlcXVlbmN5ICovCiAgVUNIQVIgZnJlcVNjYWxlOyAgICAgICAgICAgLyohPCAwOiBsaW5lYXIgc2NhbGUsICAxLTMgbG9nYXJpdGhtaWMgc2NhbGVzICovCiAgVUNIQVIgYWx0ZXJTY2FsZTsgICAgICAgICAgLyohPCBGbGFnIGZvciBjb2Fyc2VyIGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCiAgVUNIQVIgbm9pc2VfYmFuZHM7ICAgICAgICAgLyohPCBOb2lzZSBiYW5kcyBwZXIgb2N0YXZlLCByZWFkIGZyb20gYml0c3RyZWFtKi8KCiAgLyogZG9uJ3QgcmVxdWlyZSByZXNldCAqLwogIFVDSEFSIGxpbWl0ZXJCYW5kczsgICAgICAgIC8qITwgSW5kZXggZm9yIG51bWJlciBvZiBsaW1pdGVyIGJhbmRzIHBlciBvY3RhdmUgKi8KICBVQ0hBUiBsaW1pdGVyR2FpbnM7ICAgICAgICAvKiE8IEluZGV4IHRvIHNlbGVjdCBnYWluIGxpbWl0ICovCiAgVUNIQVIgaW50ZXJwb2xGcmVxOyAgICAgICAgLyohPCBTZWxlY3QgZ2FpbiBjYWxjdWxhdGlvbiBtZXRob2QgKDE6IHBlciBRTUYgY2hhbm5lbCwgMDogcGVyIFNCUiBiYW5kKSAqLwogIFVDSEFSIHNtb290aGluZ0xlbmd0aDsgICAgIC8qITwgU21vb3RoaW5nIG9mIGdhaW5zIG92ZXIgdGltZSAoMDogb24gIDE6IG9mZikgKi8KCn0gU0JSX0hFQURFUl9EQVRBX0JTOwoKdHlwZWRlZiBzdHJ1Y3QKewogIFNCUl9TWU5DX1NUQVRFIHN5bmNTdGF0ZTsgICAgLyohPCBUaGUgY3VycmVudCBpbml0aWFsaXphdGlvbiBzdGF0dXMgb2YgdGhlIGhlYWRlciAqLwoKICBVQ0hBUiBzdGF0dXM7ICAgICAgICAgICAgICAgIC8qITwgRmxhZ3MgZmllbGQgdXNlZCBmb3Igc2lnbmFsaW5nIGEgcmVzZXQgcmlnaHQgYmVmb3JlIHRoZSBwcm9jZXNzaW5nIHN0YXJ0cyBhbmQgYW4gdXBkYXRlIGZyb20gY29uZmlnIChlLmcuIEFTQykuICovCiAgVUNIQVIgZnJhbWVFcnJvckZsYWc7ICAgICAgICAvKiE8IEZyYW1lIGRhdGEgdmFsaWQgZmxhZy4gQ0FVVElPTjogVGhpcyB2YXJpYWJsZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBmbGFnIHN0b3JlZCBpbiB0aGUgZWxlbWVudCBzdHJ1Y3R1cmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlIGZyYW1lIGRlbGF5LiBUaGVyZSBpdCBtaWdodCBoYXBwZW4gdGhhdCBkaWZmZXJlbnQgc2xvdHMgdXNlIHRoZSBzYW1lIGhlYWRlci4gKi8KICBVQ0hBUiBudW1iZXJUaW1lU2xvdHM7ICAgICAgIC8qITwgQUFDOiAxNiwxNSAqLwogIFVDSEFSIG51bWJlck9mQW5hbHlzaXNCYW5kczsgLyohPCBOdW1iZXIgb2YgUU1GIGFuYWx5c2lzIGJhbmRzICovCiAgVUNIQVIgdGltZVN0ZXA7ICAgICAgICAgICAgICAvKiE8IFRpbWUgcmVzb2x1dGlvbiBvZiBTQlIgaW4gUU1GLXNsb3RzICovCiAgVUlOVCAgc2JyUHJvY1NtcGxSYXRlOyAgICAgICAvKiE8IFNCUiBwcm9jZXNzaW5nIHNhbXBsaW5nIGZyZXF1ZW5jeSAoIT0gT3V0cHV0U2FtcGxpbmdSYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsd2F5czogQ29yZVNhbXBsaW5nUmF0ZSAqIFVwU2FtcGxpbmdGYWN0b3I7IGV2ZW4gaW4gc2luZ2xlIHJhdGUgbW9kZSkgKi8KCiAgU0JSX0hFQURFUl9EQVRBX0JTICAgICAgYnNfZGF0YTsgIC8qITwgY3VycmVudCBTQlIgaGVhZGVyLiAqLwogIFNCUl9IRUFERVJfREFUQV9CU19JTkZPIGJzX2luZm87ICAvKiE8IFNCUiBpbmZvLiAqLwoKICBGUkVRX0JBTkRfREFUQSBmcmVxQmFuZERhdGE7ICAvKiE8IFBvaW50ZXIgdG8gc3RydWN0ICNGUkVRX0JBTkRfREFUQSAqLwp9ClNCUl9IRUFERVJfREFUQTsKCnR5cGVkZWYgU0JSX0hFQURFUl9EQVRBICpIQU5ETEVfU0JSX0hFQURFUl9EQVRBOwoKCnR5cGVkZWYgc3RydWN0CnsKICBVQ0hBUiBmcmFtZUNsYXNzOyAgICAgICAgICAgICAgIC8qITwgU2VsZWN0IGdyaWQgdHlwZSAqLwogIFVDSEFSIG5FbnZlbG9wZXM7ICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZW52ZWxvcGVzICovCiAgVUNIQVIgYm9yZGVyc1tNQVhfRU5WRUxPUEVTKzFdOyAvKiE8IEVudmVsb3BlIGJvcmRlcnMgKGluIFNCUi10aW1lc2xvdHMsIGUuZy4gbXAzUFJPOiAwLi4xMSkgKi8KICBVQ0hBUiBmcmVxUmVzW01BWF9FTlZFTE9QRVNdOyAgIC8qITwgRnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIGVhY2ggZW52ZWxvcGUgKDA9bG93LCAxPWhpZ2gpICovCiAgU0NIQVIgIHRyYW5FbnY7ICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zaWVudCBlbnZlbG9wZSwgLTEgaWYgbm9uZSAqLwogIFVDSEFSIG5Ob2lzZUVudmVsb3BlczsgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgZW52ZWxvcGVzICovCiAgVUNIQVIgYm9yZGVyc05vaXNlW01BWF9OT0lTRV9FTlZFTE9QRVMrMV07LyohPCBib3JkZXJzIG9mIG5vaXNlIGVudmVsb3BlcyAqLwp9CkZSQU1FX0lORk87CgoKdHlwZWRlZiBzdHJ1Y3QKewogIEZJWFBfU0dMIHNmYl9ucmdfcHJldltNQVhfRlJFUV9DT0VGRlNdOyAgICAvKiE8IFByZXZpb3VzIGVudmVsb3BlIChyZXF1aXJlZCBmb3IgZGlmZmVyZW50aWFsLWNvZGVkIHZhbHVlcykgKi8KICBGSVhQX1NHTCBwcmV2Tm9pc2VMZXZlbFtNQVhfTk9JU0VfQ09FRkZTXTsgLyohPCBQcmV2aW91cyBub2lzZSBlbnZlbG9wZSAocmVxdWlyZWQgZm9yIGRpZmZlcmVudGlhbC1jb2RlZCB2YWx1ZXMpICovCiAgQ09VUExJTkdfTU9ERSBjb3VwbGluZzsgICAgICAgICAgICAgICAgICAgIC8qITwgU3RlcmVvLW1vZGUgb2YgcHJldmlvdXMgZnJhbWUgKi8KICBJTlZGX01PREUgc2JyX2ludmZfbW9kZVtNQVhfSU5WRl9CQU5EU107ICAgLyohPCBQcmV2aW91cyBzdHJlbmd0aCBvZiBmaWx0ZXJpbmcgaW4gdHJhbnNwb3NlciAqLwogIFVDSEFSIGFtcFJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFByZXZpb3VzIGFtcGxpdHVkZSByZXNvbHV0aW9uICgwOiAxLjVkQiwgMTogM2RCKSAqLwogIFVDSEFSIHN0b3BQb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBvc2l0aW9uIGluIHRpbWUgd2hlcmUgbGFzdCBlbnZlbG9wZSBlbmRlZCAqLwogIFVDSEFSIGZyYW1lRXJyb3JGbGFnOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFByZXZpb3VzIGZyYW1lIHN0YXR1cyAqLwp9ClNCUl9QUkVWX0ZSQU1FX0RBVEE7Cgp0eXBlZGVmIFNCUl9QUkVWX0ZSQU1FX0RBVEEgKkhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBOwoKCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgblNjYWxlRmFjdG9yczsgICAgICAgICAgICAgICAgICAgIC8qITwgdG90YWwgbnVtYmVyIG9mIHNjYWxlZmFjdG9ycyBpbiBmcmFtZSAqLwoKICBGUkFNRV9JTkZPIGZyYW1lSW5mbzsgICAgICAgICAgICAgICAgIC8qITwgdGltZSBncmlkIGZvciBjdXJyZW50IGZyYW1lICovCiAgVUNIQVIgZG9tYWluX3ZlY1tNQVhfRU5WRUxPUEVTXTsgICAgICAvKiE8IEJpdGZpZWxkIGNvbnRhaW5pbmcgZGlyZWN0aW9uIG9mIGRlbHRhLWNvZGluZyBmb3IgZWFjaCBlbnZlbG9wZSAoMDpmcmVxdWVuY3ksIDE6dGltZSkgKi8KICBVQ0hBUiBkb21haW5fdmVjX25vaXNlW01BWF9OT0lTRV9FTlZFTE9QRVNdOyAvKiE8IFNhbWUgYXMgYWJvdmUsIGJ1dCBmb3Igbm9pc2UgZW52ZWxvcGVzICovCgogIElOVkZfTU9ERSBzYnJfaW52Zl9tb2RlW01BWF9JTlZGX0JBTkRTXTsgLyohPCBTdHJlbmd0aCBvZiBmaWx0ZXJpbmcgaW4gdHJhbnNwb3NlciAqLwogIENPVVBMSU5HX01PREUgY291cGxpbmc7ICAgICAgICAgICAgICAgICAgLyohPCBTdGVyZW8tbW9kZSAqLwogIGludCBhbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lOyAgICAgICAgICAgLyohPCBBbXBsaXR1ZGUgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZSB2YWx1ZXMgKDA6IDEuNWRCLCAxOiAzZEIpICovCgogIFVDSEFSIGFkZEhhcm1vbmljc1tNQVhfRlJFUV9DT0VGRlNdOyAgICAgLyohPCBGbGFncyBmb3Igc3ludGhldGljIHNpbmUgYWRkaXRpb24gKi8KCiAgRklYUF9TR0wgaUVudmVsb3BlW01BWF9OVU1fRU5WRUxPUEVfVkFMVUVTXTsgICAgICAgLyohPCBFbnZlbG9wZSBkYXRhICovCiAgRklYUF9TR0wgc2JyTm9pc2VGbG9vckxldmVsW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsgLyohPCBOb2lzZSBlbnZlbG9wZSBkYXRhICovCn0KU0JSX0ZSQU1FX0RBVEE7Cgp0eXBlZGVmIFNCUl9GUkFNRV9EQVRBICpIQU5ETEVfU0JSX0ZSQU1FX0RBVEE7Cgp2b2lkIGluaXRTYnJQcmV2RnJhbWVEYXRhIChIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTbG90cyk7CgoKaW50IHNickdldFNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BTX0RFQyBoUGFyYW1ldHJpY1N0ZXJlb0RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgb3ZlcmxhcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCmludCBzYnJHZXRDaGFubmVsUGFpckVsZW1lbnQgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgb3ZlcmxhcCk7CgpTQlJfSEVBREVSX1NUQVRVUwpzYnJHZXRIZWFkZXJEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdEJ1ZiwKICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBmSXNTYnJEYXRhKTsKCi8qIQogIFxicmllZiAgICAgSW5pdGlhbGl6ZSBTQlIgaGVhZGVyIGRhdGEKCiAgQ29weSBkZWZhdWx0IHZhbHVlcyB0byB0aGUgaGVhZGVyIGRhdGEgc3RydWN0IGFuZCBwYXRjaCBzb21lIGVudHJpZXMKICBkZXBlbmRpbmcgb24gdGhlIGNvcmUgY29kZWMuCiovClNCUl9FUlJPUgppbml0SGVhZGVyRGF0YSAoCiAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSAgaEhlYWRlckRhdGEsCiAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZVJhdGVPdXQsCiAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgIGZsYWdzCiAgICAgICAgKTsKI2VuZGlmCg==