Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqICBGREsgUENNIHVwL2Rvd25taXhpbmcgbW9kdWxlICAqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAogICBEZXNjcmlwdGlvbjogRGVjbGFyZXMgZnVuY3Rpb25zIHRvIGludGVyZmFjZSB3aXRoIHRoZSBQQ00gZG93bm1peCBwcm9jZXNzaW5nCiAgICAgICAgICAgICAgICBtb2R1bGUuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfUENNVVRJTFNfTElCX0hfCiNkZWZpbmUgX1BDTVVUSUxTX0xJQl9IXwoKI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgojaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgojaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICogICAgIEVSUk9SIENPREVTOiAgICAgICAgICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnR5cGVkZWYgZW51bQp7CiAgUENNRE1YX09LICAgICAgICAgICAgICA9IDB4MCwgICAvKiE8IE5vIGVycm9yIGhhcHBlbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICBwY21fZG14X2ZhdGFsX2Vycm9yX3N0YXJ0LAogIFBDTURNWF9PVVRfT0ZfTUVNT1JZICAgPSAweDIsICAgLyohPCBOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXQgdXAgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZS4gICAgKi8KICBQQ01ETVhfVU5LTk9XTiAgICAgICAgID0gMHg1LCAgIC8qITwgRXJyb3IgY29uZGl0aW9uIGlzIG9mIHVua25vd24gcmVhc29uLCBvciBmcm9tIGEgdGhpcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHkgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgcGNtX2RteF9mYXRhbF9lcnJvcl9lbmQsCgogIFBDTURNWF9JTlZBTElEX0hBTkRMRSwgICAgICAgICAgLyohPCBUaGUgZ2l2ZW4gaW5zdGFuY2UgaGFuZGxlIGlzIG5vdCB2YWxpZC4gICAgICAgICAgICAgICAgICAgKi8KICBQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVCwgICAgICAgIC8qITwgT25lIG9mIHRoZSBwYXJhbWV0ZXJzIGhhbmRlZCBvdmVyIGlzIGludmFsaWQuICAgICAgICAgICAgICovCiAgUENNRE1YX0lOVkFMSURfQ0hfQ09ORklHLCAgICAgICAvKiE8IFRoZSBnaXZlbiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBhbmQgdGh1cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBwcm9jZXNzaW5nIHdhcyBwZXJmb3JtZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBQQ01ETVhfSU5WQUxJRF9NT0RFLCAgICAgICAgICAgIC8qITwgVGhlIHNldCBjb25maWd1cmF0aW9uL21vZGUgaXMgbm90IGFwcGxpY2FibGUuICAgICAgICAgICAgICovCiAgUENNRE1YX1VOS05PV05fUEFSQU0sICAgICAgICAgICAvKiE8IFRoZSBoYW5kZWQgcGFyYW1ldGVyIGlzIG5vdCBrbm93bi9zdXBwb3J0ZWQuICAgICAgICAgICAgICAqLwogIFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNLCAgICAgLyohPCBVbmFibGUgdG8gc2V0IHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXIuIE1vc3QgcHJvYmFibHkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzdCBvdXQgb2YgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBICAgICAgICAgLyohPCBUaGUgcmVhZCBhbmNpbGxhcnkgZGF0YSB3YXMgY29ycnVwdC4gICAgICAgICAgICAgICAgICAgICAgKi8KCn0gUENNRE1YX0VSUk9SOwoKLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGZhdGFsIGVycm9ycy4gKi8KI2RlZmluZSBQQ01ETVhfSVNfRkFUQUxfRVJST1IoZXJyKSAgICggKCgoZXJyKT49cGNtX2RteF9mYXRhbF9lcnJvcl9zdGFydCkgICAmJiAoKGVycik8PXBjbV9kbXhfZmF0YWxfZXJyb3JfZW5kKSkgICA/IDEgOiAwKQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICogICAgIFJVTlRJTUUgUEFSQU1TOiAgICAgICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnR5cGVkZWYgZW51bQp7CiAgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FLCAgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgZnJhbWVzIHdpdGhvdXQgbmV3IG1ldGFkYXRhIHRoYXQgaGF2ZSB0byBnbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBiZWZvcmUgdGhlIGJpdHN0cmVhbSBkYXRhIGV4cGlyZXMuIFRoZSB2YWx1ZSAwIGRpc2FibGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIERNWF9CU19EQVRBX0RFTEFZLCAgICAgICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGRlbGF5IGZyYW1lcyBvZiB0aGUgb3V0cHV0IHNhbXBsZXMgY29tcGFyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGJpdHN0cmVhbSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsICAvKiE8IFRoZSBtaW5pbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIEZvciBhbGwgaW5wdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gY2hhbm5lbHMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSB3aWxsIG1vZGlmeSB0aGUgb3V0cHV0IGF1dG9tYXRpY2FsbHkgdG8gb2J0YWluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBNb25vIHNpZ25hbHMgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkLiBJZiBtb3JlIHRoYW4gdHdvIG91dHB1dCBjaGFubmVscyBhcmUgZGVzaXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbW9kdWxlIGp1c3QgYWRkcyBlbXB0eSBjaGFubmVscy4gVGhlIHBhcmFtZXRlciB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGVpdGhlciAtMSwgMCwgMSwgMiwgNiBvciA4LiBJZiB0aGUgdmFsdWUgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGV4Y2VlZHMgdGhlIHZhbHVlIG9mIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyB0aGUgbGF0dGVyIHdpbGwgYmUgc2V0IHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHZhbHVlLiBCb3RoIHZhbHVlcyAtMSBhbmQgMCBkaXNhYmxlIHRoZSBmZWF0dXJlLiAqLwogIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLCAgLyohPCBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBGb3IgYWxsIGlucHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBtb3JlIHRoYW4gdGhlIGdpdmVuIGNoYW5uZWxzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgd2lsbCBhcHBseSBhIG1peGRvd24gYXV0b21hdGljYWxseSB0byBvYnRhaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIFRoZSB2YWx1ZSBtdXN0IGJlIGVpdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgMSwgMiwgNiBvciA4LiBJZiBpdCBpcyBncmVhdGVyIHRoYW4gemVybyBhbmQgbG93ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZXF1YWwgdGhhbiB0aGUgdmFsdWUgb2YgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHRoZSBsYXR0ZXIgd2lsbCBiZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgLTEgYW5kIDAgZGlzYWJsZSB0aGUgZmVhdHVyZS4gICAgICAgICAgICAgICAgICAqLwogIERNWF9EVUFMX0NIQU5ORUxfTU9ERSwgICAgICAgICAgLyohPCBEb3dubWl4IG1vZGUgZm9yIHR3byBjaGFubmVsIGF1ZGlvIGRhdGEuICAgICAgICAgICAgICAgICAgKi8KICBETVhfUFNFVURPX1NVUlJPVU5EX01PREUgICAgICAgIC8qITwgRGVmaW5lcyBob3cgbW9kdWxlIGhhbmRsZXMgcHNldWRvIHN1cnJvdW5kIGNvbXBhdGlibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFscy4gU2VlIFBTRVVET19TVVJST1VORF9NT0RFIHR5cGUgZm9yIGRldGFpbHMuICAgICAgICovCn0gUENNRE1YX1BBUkFNOwoKLyogUGFyYW1ldGVyIHZhbHVlIHR5cGVzICovCnR5cGVkZWYgZW51bQp7CiAgTkVWRVJfRE9fUFNfRE1YID0gLTEsICAgICAgICAgICAvKiE8IE5ldmVyIGNyZWF0ZSBhIHBzZXVkbyBzdXJyb3VuZCBjb21wYXRpYmxlIGRvd25taXguICAgICAgICAqLwogIEFVVE9fUFNfRE1YICAgICA9ICAwLCAgICAgICAgICAgLyohPCBDcmVhdGUgYSBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZSBkb3dubWl4IG9ubHkgaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsbGVkIGluIGJpdHN0cmVhbXMgbWV0YSBkYXRhLiAoRGVmYXVsdCkgICAgICAgICAgICAgICovCiAgRk9SQ0VfUFNfRE1YICAgID0gIDEgICAgICAgICAgICAvKiE8IEFsd2F5cyBjcmVhdGUgYSBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZSBkb3dubWl4LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVVUSU9OOiBUaGlzIGNhbiBsZWFkIHRvIGV4Y2Vzc2l2ZSBzaWduYWwgY2FuY2VsbGF0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2lnbmFsIGxldmVsIGRpZmZlcmVuY2VzIGZvciBub24tY29tcGF0aWJsZSBzaWduYWxzLiAgKi8KfSBQU0VVRE9fU1VSUk9VTkRfTU9ERTsKCnR5cGVkZWYgZW51bQp7CiAgU1RFUkVPX01PREUgPSAweDAsICAgICAgICAgICAgICAvKiE8IExlYXZlIHN0ZXJlbyBzaWduYWxzIGFzIHRoZXkgYXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIENIMV9NT0RFICAgID0gMHgxLCAgICAgICAgICAgICAgLyohPCBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMS4gICAgICAgICAgKi8KICBDSDJfTU9ERSAgICA9IDB4MiwgICAgICAgICAgICAgIC8qITwgQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDIuICAgICAgICAgICovCiAgTUlYRURfTU9ERSAgPSAweDMgICAgICAgICAgICAgICAvKiE8IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGJ5IG1peGluZyB0aGUgdHdvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwp9IERVQUxfQ0hBTk5FTF9NT0RFOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAqICAgICBNT0RVTEVTIElOVEVSRkFDRTogICAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwp0eXBlZGVmIHN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFICpIQU5ETEVfUENNX0RPV05NSVg7CgovKiBNb2R1bGVzIHJlc2V0IGZsYWdzICovCiNkZWZpbmUgUENNRE1YX1JFU0VUX1BBUkFNUyAgICggMSApCiNkZWZpbmUgUENNRE1YX1JFU0VUX0JTX0RBVEEgICggMiApCiNkZWZpbmUgUENNRE1YX1JFU0VUX0ZVTEwgICAgICggUENNRE1YX1JFU0VUX1BBUkFNUyB8IFBDTURNWF9SRVNFVF9CU19EQVRBICkKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiCnsKI2VuZGlmCgovKiogT3BlbiBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlCiAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgaGFuZGxlIG9mIHRoZSBuZXcgaW5zdGFuY2UuCiAqIEByZXR1cm5zICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9PcGVuICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYKICApOwoKLyoqIFNldCBvbmUgcGFyYW1ldGVyIGZvciBvbmUgaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdG8gYmUgc2V0LgogKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdmFsdWUuCiAqIEByZXR1cm5zICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X1NldFBhcmFtICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIGNvbnN0IFBDTURNWF9QQVJBTSAgcGFyYW0sCiAgICBjb25zdCBJTlQgICAgICAgICAgIHZhbHVlCiAgKTsKCi8qKiBHZXQgb25lIHBhcmFtZXRlciB2YWx1ZSBvZiBvbmUgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdG8gYmUgc2V0LgogKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBidWZmZXIgcmVjZWl2aW5nIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X0dldFBhcmFtICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIGNvbnN0IFBDTURNWF9QQVJBTSAgcGFyYW0sCiAgICBJTlQgKiBjb25zdCAgICAgICAgIHBWYWx1ZQogICk7CgovKiogUmVhZCBkb3dubWl4IG1ldGEtZGF0YSBkaXJlY3RseSBmcm9tIGEgZ2l2ZW4gYml0c3RyZWFtLgogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBGREsgYml0c3RyZWFtIGJ1ZmZlci4KICogQHBhcmFtIFtpbl0gTGVuZ3RoIG9mIGFuY2lsbGFyeSBkYXRhIGluIGJpdHMuCiAqIEBwYXJhbSBbaW5dIEZsYWcgaW5kaWNhdGluZyB3aGV0ZXIgdGhlIGFuY2lsbGFyeSBkYXRhIGlzIGZyb20gYSBNUEVHLTEvMiBvciBhbiBNUEVHLTQgc3RyZWFtLgogKiBAcmV0dXJucyAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9QYXJzZSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSwKICAgIFVJTlQgICBhbmNEYXRhQml0cywKICAgIGludCAgICBpc01wZWcyCiAgKTsKCi8qKiBSZWFkIGRvd25taXggbWV0YS1kYXRhIGZyb20gYSBnaXZlbiBkYXRhIGJ1ZmZlci4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBQb2ludGVyIHRvIGFuY2lsbGFyeSBkYXRhIGJ1ZmZlci4KICogQHBhcmFtIFtpbl0gU2l6ZSBvZiBhbmNpbGxhcnkgZGF0YSBpbiBieXRlcy4KICogQHBhcmFtIFtpbl0gRmxhZyBpbmRpY2F0aW5nIHdoZXRlciB0aGUgYW5jaWxsYXJ5IGRhdGEgaXMgZnJvbSBhIE1QRUctMS8yIG9yIGFuIE1QRUctNCBzdHJlYW0uCiAqIEByZXR1cm5zICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X1JlYWREdmJBbmNEYXRhICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIFVDSEFSICpwQW5jRGF0YUJ1ZiwKICAgIFVJTlQgICBhbmNEYXRhQnl0ZXMsCiAgICBpbnQgICAgaXNNcGVnMgogICk7CgovKiogU2V0IHRoZSBtYXRyaXggbWl4ZG93biBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSB0aGUgUENFIG9mIGFuIEFBQyBiaXRzdHJlYW0uCiAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gTWF0cml4IG1peGRvd24gaW5kZXggcHJlc2VudCBmbGFnIGV4dHJhY3RlZCBmcm9tIFBDRS4KICogQHBhcmFtIFtpbl0gVGhlIDIgYml0IG1hdHJpeCBtaXhkb3duIGluZGV4IGV4dHJhY3RlZCBmcm9tIFBDRS4KICogQHBhcmFtIFtpbl0gVGhlIHBzZXVkbyBzdXJyb3VuZCBlbmFibGUgZmxhZyBleHRyYWN0ZWQgZnJvbSBQQ0UuCiAqIEByZXR1cm5zICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X1NldE1hdHJpeE1peGRvd25Gcm9tUGNlICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIGludCAgICAgICAgICAgICAgICAgbWF0cml4TWl4ZG93blByZXNlbnQsCiAgICBpbnQgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25JZHgsCiAgICBpbnQgICAgICAgICAgICAgICAgIHBzZXVkb1N1cnJvdW5kRW5hYmxlCiAgKTsKCi8qKiBSZXNldCB0aGUgbW9kdWxlLgogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIEZsYWdzIHRlbGxpbmcgd2hpY2ggcGFydHMgb2YgdGhlIG1vZHVsZSBzaGFsbCBiZSByZXNldC4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfUmVzZXQgKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgVUlOVCAgICAgICAgICAgICAgICBmbGFncwogICk7CgovKiogQ3JlYXRlIGEgbWl4ZG93biwgYnlwYXNzIG9yIGV4dGVuZCB0aGUgb3V0cHV0IHNpZ25hbCBkZXBlbmRpbmcgb24gdGhlIG1vZHVsZXMgc2V0dGluZ3MgYW5kIHRoZQogKiAgcmVzcGVjdGl2ZSBnaXZlbiBpbnB1dCBjb25maWd1cmF0aW9uLgogKgogKiBccGFyYW0gW2luXSAgICBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBccGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHRpbWUgYnVmZmVyIHdpdGggZGVjb2RlZCBQQ00gc2FtcGxlcy4KICogXHBhcmFtIFtpbl0gICAgVGhlIEkvTyBibG9jayBzaXplIHdoaWNoIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbC4KICogXHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBidWZmZXIgdGhhdCBob2xkcyB0aGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIGFuZCB3aGVyZSB0aGUKICogICAgICAgICAgICAgICAgYW1vdW50IG9mIG91dHB1dCBjaGFubmVscyBpcyB3cml0dGVuIHRvLgogKiBccGFyYW0gW2luXSAgICBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiBvdXRwdXQgdGltZSBkYXRhIGlzIHdyaXR0ZXJuIGludGVybGVhdmVkIG9yIGFzCiAqICAgICAgICAgICAgICAgIHN1YnNlcXVlbnQgYmxvY2tzLgogKiBccGFyYW0gW2lub3V0XSBBcnJheSB3ZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCBpcwogKiAgICAgICAgICAgICAgICBzdG9yZWQgaW50by4KICogXHBhcmFtIFtpbm91dF0gQXJyYXkgd2VyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kZXggZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwKICogICAgICAgICAgICAgICAgaXMgc3RvcmVkIGludG8uCiAqIFxwYXJhbSBbaW5dICAgIEFycmF5IGNvbnRhaW5pbmcgdGhlIG91dHB1dCBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZCAoZnJvbSBNUEVHIFBDRSBvcmRlcmluZwogKiAgICAgICAgICAgICAgICB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCiAqIFxwYXJhbSBbb3V0XSAgIFBvaW50ZXIgb24gYSBmaWVsZCByZWNlaXZpbmcgdGhlIHNjYWxlIGZhY3RvciB0aGF0IGhhcyB0byBiZSBhcHBsaWVkIG9uIGFsbAogKiAgICAgICAgICAgICAgICBzYW1wbGVzIGFmdGVyd2FyZHMuIElmIHRoZSBoYW5kZWQgcG9pbnRlciBpcyBOVUxMIHRoZSBmaW5hbCBzY2FsaW5nIGlzIGRvbmUKICogICAgICAgICAgICAgICAgaW50ZXJuYWxseS4KICogQHJldHVybnMgICAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfQXBwbHlGcmFtZSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggICAgICBzZWxmLAogICAgSU5UX1BDTSAgICAgICAgICAgICAgICAqcFBjbUJ1ZiwKICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKICAgIElOVCAgICAgICAgICAgICAgICAgICAgKm5DaGFubmVscywKICAgIGludCAgICAgICAgICAgICAgICAgICAgIGZJbnRlcmxlYXZlZCwKICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgICAgIGNoYW5uZWxUeXBlW10sCiAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tdLAogICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmdbXVs4XSwKICAgIElOVCAgICAgICAgICAgICAgICAgICAgKnBEbXhPdXRTY2FsZQogICk7CgovKiogQ2xvc2UgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBoYW5kbGUgb2YgdGhlIGluc3RhbmNlLgogKiBAcmV0dXJucyAgICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9DbG9zZSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmCiAgKTsKCi8qKiBHZXQgbGlicmFyeSBpbmZvIGZvciB0aGlzIG1vZHVsZS4KICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdHVyZS4KICogQHJldHVybnMgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICovClBDTURNWF9FUlJPUiBwY21EbXhfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsKCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAgLyogX1BDTVVUSUxTX0xJQl9IXyAqLwo=