Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLTQgSEUtQUFDIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioKICogXGZpbGUgICBhYWNlbmNfbGliLmgKICogXGJyaWVmICBGREsgQUFDIEVuY29kZXIgbGlicmFyeSBpbnRlcmZhY2UgaGVhZGVyIGZpbGUuCiAqClxtYWlucGFnZSAgSW50cm9kdWN0aW9uCgpcc2VjdGlvbiBTY29wZQoKVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGFuZCB1c2FnZSBvZiB0aGUgSVNPL01QRUctMi80IEFBQyBFbmNvZGVyCmxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4KClRoZSBsaWJyYXJ5IGltcGxlbWVudHMgZW5jb2Rpbmcgb24gdGhlIGJhc2lzIG9mIHRoZSBNUEVHLTIgYW5kIE1QRUctNCBBQUMgTG93LUNvbXBsZXhpdHkKc3RhbmRhcmQsIGFuZCBkZXBlbmRpbmcgb24gdGhlIGxpYnJhcnkncyBjb25maWd1cmF0aW9uLCBNUEVHLTQgSGlnaC1FZmZpY2llbmN5IEFBQyB2MiBhbmQvb3IgQUFDLUVMRCBzdGFuZGFyZC4KCkFsbCByZWZlcmVuY2VzIHRvIFNCUiAoU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbikgYXJlIG9ubHkgYXBwbGljYWJsZSB0byBIRS1BQUMgb3IgQUFDLUVMRCB2ZXJzaW9ucwpvZiB0aGUgbGlicmFyeS4gQWxsIHJlZmVyZW5jZXMgdG8gUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFLUFBQyB2Mgp2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4KClxzZWN0aW9uIGVuY0Jhc2ljcyBFbmNvZGVyIEJhc2ljcwoKVGhpcyBkb2N1bWVudCBjYW4gb25seSBnaXZlIGEgcm91Z2ggb3ZlcnZpZXcgYWJvdXQgdGhlIElTTy9NUEVHLTIgYW5kIElTTy9NUEVHLTQgQUFDIGF1ZGlvIGNvZGluZwpzdGFuZGFyZC4gVG8gdW5kZXJzdGFuZCBhbGwgdGhlIHRlcm1zIGluIHRoaXMgZG9jdW1lbnQsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byByZWFkIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzLgoKLSBJU08vSUVDIDEzODE4LTcgKE1QRUctMiBBQUMpLCB3aGljaCBkZWZpbmVzIHRoZSBzeW50YXggb2YgTVBFRy0yIEFBQyBhdWRpbyBiaXRzdHJlYW1zLgotIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IEFBQywgc3VicGFydHMgMSBhbmQgNCksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCi0gTHV0emt5LCBTY2h1bGxlciwgR2F5ZXIsIEtyJmF1bWw7bWVyLCBXYWJuaWssICJBIGd1aWRlbGluZSB0byBhdWRpbyBjb2RlYyBkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAoKTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgaXMgYmFzZWQgb24gYSB0aW1lLXRvLWZyZXF1ZW5jeSBtYXBwaW5nIG9mIHRoZSBzaWduYWwuIFRoZSBzaWduYWwgaXMKcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwgY29tcG9uZW50cwphcmUgdGhlbiBxdWFudGl6ZWQgYW5kIGNvZGVkLiBcbgpBbiBNUEVHLTIgb3IgTVBFRy00IEFBQyBhdWRpbyBiaXRzdHJlYW0gaXMgY29tcG9zZWQgb2YgZnJhbWVzLiBDb250cmFyeSB0byBNUEVHLTEvMiBMYXllci0zIChtcDMpLCB0aGUKbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24gYW55IGxlbmd0aApiZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KCgpccGFnZSBMSUJVU0UgTGlicmFyeSBVc2FnZQoKXHNlY3Rpb24gSW50ZXJmYWNlRGVzY3JpcHRpb24gQVBJIEZpbGVzCgpBbGwgQVBJIGhlYWRlciBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgZm9sZGVyIC9pbmNsdWRlIG9mIHRoZSByZWxlYXNlIHBhY2thZ2UuIEFsbCBoZWFkZXIgZmlsZXMKYXJlIHByb3ZpZGVkIGZvciB1c2FnZSBpbiBDL0MrKyBwcm9ncmFtcy4gVGhlIEFBQyBlbmNvZGVyIGxpYnJhcnkgQVBJIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBhdAphYWNlbmNfbGliLmguCgpJbiBiaW5hcnkgcmVsZWFzZXMgdGhlIGVuY29kZXIgY29yZSByZXNpZGVzIGluIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyaWVzIGNhbGxlZCBmb3IgZXhhbXBsZQpsaWJBQUNlbmMuYS9saWJGREsuYSAoTElOVVgpIG9yIEZES19mYXN0YWFjbGliLmxpYiAoTVMgVmlzdWFsIEMrKykgZm9yIHRoZSBwbGFpbiBBQUMtTEMgY29yZSBlbmNvZGVyCmFuZCBsaWJTQlJlbmMuYSAoTElOVVgpIG9yIEZES19zYnJFbmNMaWIubGliIChNUyBWaXN1YWwgQysrKSBmb3IgdGhlIFNCUiAoU3BlY3RyYWwgQmFuZApSZXBsaWNhdGlvbikgYW5kIFBTIChQYXJhbWV0cmljIFN0ZXJlbykgbW9kdWxlcy4KClxzZWN0aW9uIENhbGxpbmdTZXF1ZW5jZSBDYWxsaW5nIFNlcXVlbmNlCgpGb3IgZW5jb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBiaXRzdHJlYW1zIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgbWFuZGF0b3J5LiBJbnB1dCByZWFkIGFuZCBvdXRwdXQKd3JpdGUgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgb3BlbiBhbmQgY2xvc2UgZnVuY3Rpb25zIGFyZSBsZWZ0IG91dCwgc2luY2UgdGhleSBtYXkgYmUKaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBUaGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBpbgptYWluLmNwcCB1c2VzIGZpbGUtYmFzZWQgaW5wdXQvb3V0cHV0LgoKLSMgQ2FsbCBhYWNFbmNPcGVuKCkgdG8gYWxsb2NhdGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIHJlcXVpcmVkIFxyZWYgZW5jT3BlbiAiY29uZmlndXJhdGlvbiIuXG4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBoQWFjRW5jb2RlciA9Clxza2lwbGluZSBhYWNFbmNPcGVuCi0jIENhbGwgYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGZvciBlYWNoIHBhcmFtZXRlciB0byBiZSBzZXQuIEFPVCwgc2FtcGxpbmdyYXRlLCBjaGFubmVsTW9kZSwgYml0cmF0ZSBhbmQgdHJhbnNwb3J0IHR5cGUgYXJlIFxyZWYgZW5jUGFyYW1zICJtYW5kYXRvcnkiLgpcY29kZQogICAgRXJyb3JTdGF0dXMgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBwYXJhbWV0ZXIsIHZhbHVlKTsKXGVuZGNvZGUKLSMgQ2FsbCBhYWNFbmNFbmNvZGUoKSB3aXRoIE5VTEwgcGFyYW1ldGVycyB0byBccmVmIGVuY1JlY29uZiAiaW5pdGlhbGl6ZSIgZW5jb2RlciBpbnN0YW5jZSB3aXRoIHByZXNlbnQgcGFyYW1ldGVyIHNldC4KXHNraXBsaW5lIGFhY0VuY0VuY29kZQotIyBDYWxsIGFhY0VuY0luZm8oKSB0byByZXRyaWV2ZSBhIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9jayB0byBiZSB0cmFuc21pdHRlZCBvdXQgb2YgYmFuZC4gVGhpcyBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIFJGQzM2NDAgb3IgUkZDMzAxNiBsaWtlIHRyYW5zcG9ydC4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBlbmNJbmZvClxza2lwbGluZSBhYWNFbmNJbmZvCi0jIEVuY29kZSBpbnB1dCBhdWRpbyBkYXRhIGluIGxvb3AuClxza2lwIEVuY29kZSBhcyBsb25nIGFzClxza2lwbGluZSBkbwpcdW50aWwgewpGZWVkIFxyZWYgZmVlZEluQnVmICJpbnB1dCBidWZmZXIiIHdpdGggbmV3IGF1ZGlvIGRhdGEgYW5kIHByb3ZpZGUgaW5wdXQvb3V0cHV0IFxyZWYgYnVmRGVzICJhcmd1bWVudHMiIHRvIGFhY0VuY0VuY29kZSgpLgpcc2tpcGxpbmUgYWFjRW5jRW5jb2RlClx1bnRpbCA7CldyaXRlIFxyZWYgd3JpdGVPdXREYXRhICJvdXRwdXQgZGF0YSIgdG8gZmlsZSBvciBhdWRpbyBkZXZpY2UuIFxza2lwbGluZSB3aGlsZQotIyBDYWxsIGFhY0VuY0Nsb3NlKCkgYW5kIGRlc3Ryb3kgZW5jb2RlciBpbnN0YW5jZS4KXHNraXBsaW5lIGFhY0VuY0Nsb3NlCgpcc2VjdGlvbiBlbmNPcGVuIEVuY29kZXIgSW5zdGFuY2UgQWxsb2NhdGlvbgoKVGhlIGFzc2lnbm1lbnQgb2YgdGhlIGFhY0VuY09wZW4oKSBmdW5jdGlvbiBpcyB2ZXJ5IGZsZXhpYmxlIGFuZCBjYW4gYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheS4KLSBJZiB0aGUgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1wdGlvbiBpcyBub3QgYW4gaXNzdWUsIHRoZSBlbmNvZGVyIGluc3RhbmNlIGNhbiBiZSBhbGxvY2F0ZWQKZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBhdWRpbyBjaGFubmVscyAoZm9yIGV4YW1wbGUgNiBvciA4KSB3aXRoIHRoZSBmdWxsIGZ1bmN0aW9uYWwgcmFuZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgpUaGlzIGlzIHRoZSBkZWZhdWx0IG9wZW4gcHJvY2VkdXJlIGZvciB0aGUgQUFDIGVuY29kZXIgaWYgbWVtb3J5IGNvbnN1bXB0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgbWluaW1pemVkLgpcY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDApIFxlbmRjb2RlCi0gSWYgdGhlIHJlcXVpcmVkIE1QRUctNCBBT1RzIGRvIG5vdCBjYWxsIGZvciB0aGUgZnVsbCBmdW5jdGlvbmFsIHJhbmdlIG9mIHRoZSBsaWJyYXJ5LCBlbmNvZGVyIG1vZHVsZXMgY2FuIGJlIGFsbG9jYXRlZCBzZWxlY3RpdmVseS4KXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQUFDIHwgU0JSIHwgIFBTIHwgTUQgfCAgICAgICAgIEZMQUdTICAgICAgICAgfCB2YWx1ZQotLS0tLSstLS0tLSstLS0tLSstLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0KICBYICB8ICAtICB8ICAtICB8ICAtIHwgKDB4MDEpICAgICAgICAgICAgICAgIHwgIDB4MDEKICBYICB8ICBYICB8ICAtICB8ICAtIHwgKDB4MDF8MHgwMikgICAgICAgICAgIHwgIDB4MDMKICBYICB8ICBYICB8ICBYICB8ICAtIHwgKDB4MDF8MHgwMnwweDA0KSAgICAgIHwgIDB4MDcKICBYICB8ICAtICB8ICAtICB8ICBYIHwgKDB4MDEgICAgICAgICAgfDB4MTApIHwgIDB4MTEKICBYICB8ICBYICB8ICAtICB8ICBYIHwgKDB4MDF8MHgwMiAgICAgfDB4MTApIHwgIDB4MTMKICBYICB8ICBYICB8ICBYICB8ICBYIHwgKDB4MDF8MHgwMnwweDA0fDB4MTApIHwgIDB4MTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAtIEFBQzogQWxsb2NhdGUgQUFDIENvcmUgRW5jb2RlciBtb2R1bGUuCiAtIFNCUjogQWxsb2NhdGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBtb2R1bGUuCiAtIFBTOiBBbGxvY2F0ZSBQYXJhbWV0cmljIFN0ZXJlbyBtb2R1bGUuCiAtIE1EOiBBbGxvY2F0ZSBNZXRhIERhdGEgbW9kdWxlIHdpdGhpbiBBQUMgZW5jb2Rlci4KXGVuZHZlcmJhdGltClxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLHZhbHVlLDApIFxlbmRjb2RlCi0gU3BlY2lmeWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgc3VwcG9ydGVkIGluIHRoZSBlbmNvZGVyIGluc3RhbmNlIGNhbiBiZSBkb25lIGFzIGZvbGxvd3MuCiAtIEZvciBleGFtcGxlIGFsbG9jYXRlIGFuIGVuY29kZXIgaW5zdGFuY2Ugd2hpY2ggc3VwcG9ydHMgMiBjaGFubmVscyBmb3IgYWxsIHN1cHBvcnRlZCBBT1RzLgogICBUaGUgbGlicmFyeSBpdHNlbGYgbWF5IGJlIGNhcGFibGUgb2YgZW5jb2RpbmcgdXAgdG8gNiBvciA4IGNoYW5uZWxzIGJ1dCBpbiB0aGlzIGV4YW1wbGUgb25seSAyIGNoYW5uZWwgZW5jb2RpbmcgaXMgcmVxdWlyZWQgYW5kIHRodXMgb25seSBidWZmZXJzIGZvciAyIGNoYW5uZWxzIGFyZSBhbGxvY2F0ZWQgdG8gc2F2ZSBkYXRhIG1lbW9yeS4KXGNvZGUgYWFjRW5jT3BlbigmaEFhY0VuY29kZXIsMCwyKSBcZW5kY29kZQogLSBBZGRpdGlvbmFsbHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBjaGFubmVscyBpbiB0aGUgU0JSIG1vZHVsZSBjYW4gYmUgZGVub3RlZCBzZXBhcmF0ZWx5LlxuCiAgIEluIHRoaXMgZXhhbXBsZSB0aGUgZW5jb2RlciBpbnN0YW5jZSBwcm92aWRlcyBhIG1heGltdW0gb2YgNiBjaGFubmVscyBvdXQgb2Ygd2hpY2ggdXAgdG8gMiBjaGFubmVscyBzdXBwb3J0IFNCUi4KICAgVGhpcyBlbmNvZGVyIGluc3RhbmNlIGNhbiBwcm9kdWNlIGZvciBleGFtcGxlIDUuMSBjaGFubmVsIEFBQy1MQyBzdHJlYW1zIG9yIHN0ZXJlbyBIRS1BQUMgKHYyKSBzdHJlYW1zLgogICBIRS1BQUMgNS4xIG11bHRpIGNoYW5uZWwgaXMgbm90IHBvc3NpYmxlIHNpbmNlIG9ubHkgMiBvdXQgb2YgNiBjaGFubmVscyBzdXBwb3J0IFNCUiwgd2hpY2ggc2F2ZXMgZGF0YSBtZW1vcnkuClxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLDAsNnwoMjw8OCkpIFxlbmRjb2RlClxuCgpcc2VjdGlvbiBidWZEZXMgSW5wdXQvT3V0cHV0IEFyZ3VtZW50cwoKXHN1YnNlY3Rpb24gYWxsb2NJT0J1ZnMgUHJvdmlkZSBCdWZmZXIgRGVzY3JpcHRvcnMKSW4gdGhlIHByZXNlbnQgZW5jb2RlciBBUEksIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGRlc2NyaWJlZCB3aXRoIFxyZWYgQUFDRU5DX0J1ZkRlc2MgImJ1ZmZlciBkZXNjcmlwdG9ycyIuIFRoaXMgbWVjaGFuaXNtIGFsbG93cyBhIGZsZXhpYmxlIGhhbmRsaW5nCm9mIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB3aXRob3V0IGltcGFjdCB0byB0aGUgYWN0dWFsIGVuY29kaW5nIGNhbGwuIE9wdGlvbmFsIGJ1ZmZlcnMgYXJlIG5lY2Vzc2FyeSBlLmcuIGZvciBhbmNpbGxhcnkgZGF0YSwgbWV0YSBkYXRhIGlucHV0IG9yIGFkZGl0aW9uYWwgb3V0cHV0CmJ1ZmZlcnMgZGVzY3JpYmluZyBzdXBlcmZyYW1pbmcgZGF0YSBpbiBEQUIrIG9yIERSTSsuXG4KQXQgbGVhc3Qgb25lIGlucHV0IGJ1ZmZlciBmb3IgYXVkaW8gaW5wdXQgZGF0YSBhbmQgb25lIG91dHB1dCBidWZmZXIgZm9yIGJpdHN0cmVhbSBkYXRhIG11c3QgYmUgYWxsb2NhdGVkLiBUaGUgaW5wdXQgYnVmZmVyIHNpemUgY2FuIGJlIGEgdXNlciBkZWZpbmVkIG11bHRpcGxlCm9mIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuIFBDTSBpbnB1dCBkYXRhIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIHVzZXIgZGVmaW5lZCBQQ00gYnVmZmVyIHRvIGFuIGludGVybmFsIGlucHV0IGJ1ZmZlciBhbmQgc28gaW5wdXQgZGF0YSBjYW4gYmUgbGVzcyB0aGFuIG9uZSBBQUMgYXVkaW8gZnJhbWUuClRoZSBvdXRwdXQgYnVmZmVyIHNpemUgc2hvdWxkIGJlIDYxNDQgYml0cyBwZXIgY2hhbm5lbCBleGNsdWRpbmcgdGhlIExGRSBjaGFubmVsLgpJZiB0aGUgb3V0cHV0IGRhdGEgZG9lcyBub3QgZml0IGludG8gdGhlIHByb3ZpZGVkIGJ1ZmZlciwgYW4gQUFDRU5DX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQgYnkgYWFjRW5jRW5jb2RlKCkuClxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcGxpbmUgaW5wdXRCdWZmZXIKXHVudGlsIG91dHB1dEJ1ZmZlcgpBbGwgaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgbXVzdCBiZSBjbHVzdGVyZWQgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgYXJyYXlzLgpcc2tpcGxpbmUgaW5CdWZmZXIKXHVudGlsIG91dEJ1ZmZlckVsU2l6ZQpBbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnMKXHNraXBsaW5lIEFBQ0VOQ19CdWZEZXNjClxza2lwbGluZSBBQUNFTkNfQnVmRGVzYwpJbml0aWFsaXplIGlucHV0IGJ1ZmZlciBkZXNjcmlwdG9yClxza2lwbGluZSBpbkJ1ZkRlc2MKXHVudGlsIGJ1ZkVsU2l6ZXMKSW5pdGlhbGl6ZSBvdXRwdXQgYnVmZmVyIGRlc2NyaXB0b3IKXHNraXBsaW5lIG91dEJ1ZkRlc2MKXHVudGlsIGJ1ZkVsU2l6ZXMKClxzdWJzZWN0aW9uIGFyZ0xpc3RzIFByb3ZpZGUgSW5wdXQvT3V0cHV0IEFyZ3VtZW50IExpc3RzClRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cyBvZiBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsIGFyZSBkZXNjcmliZWQgaW4gYXJndW1lbnQgc3RydWN0dXJlcy4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBBQUNFTkNfSW5BcmdzClxza2lwbGluZSBBQUNFTkNfT3V0QXJncwoKXHNlY3Rpb24gZmVlZEluQnVmIEZlZWQgSW5wdXQgQnVmZmVyClRoZSBpbnB1dCBidWZmZXIgc2hvdWxkIGJlIGhhbmRsZWQgYXMgYSBtb2R1bG8gYnVmZmVyLiBOZXcgYXVkaW8gZGF0YSBpbiB0aGUgZm9ybSBvZiBwdWxzZS1jb2RlLQptb2R1bGF0ZWQgc2FtcGxlcyAoUENNKSBtdXN0IGJlIHJlYWQgZnJvbSBleHRlcm5hbCBhbmQgYmUgZmVkIHRvIHRoZSBpbnB1dCBidWZmZXIgZGVwZW5kaW5nIG9uIGl0cwpmaWxsIGxldmVsLiBUaGUgcmVxdWlyZWQgc2FtcGxlIGJpdHJhdGUgKHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRhIHR5cGUgSU5UX1BDTSB3aGljaCBpcyAxNiwgMjQgb3IgMzIKYml0cyB3aWRlKSBpcyBmaXhlZCBhbmQgZGVwZW5kcyBvbiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gKHVzdWFsbHkgMTYgYml0KS4KClxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcGxpbmUgV0FWX0lucHV0UmVhZApcdW50aWwgOwpBZnRlciB0aGUgZW5jb2RlcidzIGludGVybmFsIGJ1ZmZlciBpcyBmZWQgd2l0aCBpbmNvbWluZyBhdWRpbyBzYW1wbGVzLCBhbmQgYWFjRW5jRW5jb2RlKCkKcHJvY2Vzc2VkIHRoZSBuZXcgaW5wdXQgZGF0YSwgdXBkYXRlL21vdmUgcmVtYWluaW5nIHNhbXBsZXMgaW4gaW5wdXQgYnVmZmVyLCBzaW11bGF0aW5nIGEgbW9kdWxvIGJ1ZmZlcjoKXHNraXBsaW5lIG91dGFyZ3MubnVtSW5TYW1wbGVzPjAKXHVudGlsIH0KClxzZWN0aW9uIHdyaXRlT3V0RGF0YSBPdXRwdXQgQml0c3RyZWFtIERhdGEKSWYgYW55IEFBQyBiaXRzdHJlYW0gZGF0YSBpcyBhdmFpbGFibGUsIHdyaXRlIGl0IHRvIG91dHB1dCBmaWxlIG9yIGRldmljZS4gVGhpcyBjYW4gYmUgZG9uZSBvbmNlIHRoZQpmb2xsb3dpbmcgY29uZGl0aW9uIGlzIHRydWU6Clxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcCBWYWxpZCBiaXRzdHJlYW0gYXZhaWxhYmxlClxza2lwbGluZSBvdXRhcmdzCgpcc2tpcGxpbmUgb3V0Qnl0ZXM+MAoKSWYgeW91IHVzZSBmaWxlIEkvTyB0aGVuIGZvciBleGFtcGxlIGNhbGwgbXBlZ0ZpbGVXcml0ZV9Xcml0ZSgpIGZyb20gdGhlIGxpYnJhcnkgbGliTXBlZ0ZpbGVXcml0ZQoKXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBtcGVnRmlsZVdyaXRlX1dyaXRlCgpcc2VjdGlvbiBjZmdNZXRhRGF0YSBNZXRhIERhdGEgQ29uZmlndXJhdGlvbgoKSWYgdGhlIHByZXNlbnQgbGlicmFyeSBpcyBjb25maWd1cmVkIHdpdGggTWV0YWRhdGEgc3VwcG9ydCwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IG1ldGEgZGF0YSBzaWRlIGluZm8gaW50byB0aGUgZ2VuZXJhdGVkCmF1ZGlvIGJpdHN0cmVhbSB3aGlsZSBlbmNvZGluZy4KClRvIHdvcmsgd2l0aCBtZXRhIGRhdGEgdGhlIGVuY29kZXIgaW5zdGFuY2UgaGFzIHRvIGJlIFxyZWYgZW5jT3BlbiAiYWxsb2NhdGVkIiB3aXRoIG1ldGEgZGF0YSBzdXBwb3J0LiBUaGUgbWV0YSBkYXRhIG1vZGUgbXVzdCBiZSBiZSBjb25maWd1cmVkIHdpdGgKdGhlIDo6QUFDRU5DX01FVEFEQVRBX01PREUgcGFyYW1ldGVyIGFuZCBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZnVuY3Rpb24uClxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19NRVRBREFUQV9NT0RFLCAwLTIpOyBcZW5kY29kZQoKVGhpcyBjb25maWd1cmF0aW9uIGluZGljYXRlcyBob3cgdG8gZW1iZWQgbWV0YSBkYXRhIGludG8gYml0c3RyZW0uIEVpdGhlciBubyBpbnNlcnRpb24sIE1QRUcgb3IgRVRTSSBzdHlsZS4KVGhlIG1ldGEgZGF0YSBpdHNlbGYgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aGluIHRoZSBtZXRhIGRhdGEgc2V0dXAgc3RydWN0dXJlIEFBQ0VOQ19NZXRhRGF0YS4KCkNoYW5naW5nIG9uZSBvZiB0aGUgQUFDRU5DX01ldGFEYXRhIHNldHVwIHBhcmFtZXRlcnMgY2FuIGJlIGFjaGlldmVkIGZyb20gb3V0c2lkZSB0aGUgbGlicmFyeSB3aXRoaW4gOjpJTl9NRVRBREFUQV9TRVRVUCBpbnB1dApidWZmZXIuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IG1ldGEgZGF0YSBzZXR1cCBzdHJ1Y3R1cmUgZXZlcnkgZnJhbWUuIElmIHRoZXJlIGlzIG5vIG5ldyBtZXRhIHNldHVwIGRhdGEgYXZhaWxhYmxlLCB0aGUKZW5jb2RlciB1c2VzIHRoZSBwcmV2aW91cyBzZXR1cCBvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIGluaXRpYWwgc3RhdGUuCgpJbiBnZW5lcmFsIHRoZSBhdWRpbyBjb21wcmVzc29yIGFuZCBsaW1pdGVyIHdpdGhpbiB0aGUgZW5jb2RlciBsaWJyYXJ5IGNhbiBiZSBjb25maWd1cmVkIHdpdGggdGhlIDo6QUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIHBhcmFtZXRlcgpBQUNFTkNfTWV0YURhdGE6OmRyY19wcm9maWxlIGFuZCBhbmQgQUFDRU5DX01ldGFEYXRhOjpjb21wX3Byb2ZpbGUuClxuCgpcc2VjdGlvbiBlbmNSZWNvbmYgRW5jb2RlciBSZWNvbmZpZ3VyYXRpb24KClRoZSBlbmNvZGVyIGxpYnJhcnkgYWxsb3dzIHJlY29uZmlndXJhdGlvbiBvZiB0aGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIG5ldyBzZXR0aW5ncwpjb250aW51b3VzbHkgYmV0d2VlbiBlbmNvZGluZyBmcmFtZXMuIEVhY2ggcGFyYW1ldGVyIHRvIGJlIGNoYW5nZWQgbXVzdCBiZSBzZXQgd2l0aAphIHNpbmdsZSBhYWNFbmNvZGVyX1NldFBhcmFtKCkgY2FsbC4gVGhlIGludGVybmFsIHN0YXR1cyBvZiBlYWNoIHBhcmFtZXRlciBjYW4gYmUKcmV0cmlldmVkIHdpdGggYW4gYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGNhbGwuXG4KVGhlcmUgaXMgbm8gc3RhbmQtYWxvbmUgcmVjb25maWd1cmF0aW9uIGZ1bmN0aW9uIGF2YWlsYWJsZS4gV2hlbiBwYXJhbWV0ZXJzIHdlcmUKbW9kaWZpZWQgZnJvbSBvdXRzaWRlIHRoZSBsaWJyYXJ5LCBhbiBpbnRlcm5hbCBjb250cm9sIG1lY2hhbmlzbSB0cmlnZ2VycyB0aGUgbmVjZXNzYXJ5CnJlY29uZmlndXJhdGlvbiBwcm9jZXNzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb2xsb3dpbmcKYWFjRW5jRW5jb2RlKCkgY2FsbC4gVGhpcyBzdGF0ZSBjYW4gYmUgb2JzZXJ2ZWQgZnJvbSBleHRlcm5hbCB2aWEgdGhlIEFBQ0VOQ19JTklUX1NUQVRVUwphbmQgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGZ1bmN0aW9uLiBUaGUgcmVjb25maWd1cmF0aW9uIHByb2Nlc3MgY2FuIGFsc28gYmUgYXBwbGllZAppbW1lZGlhdGVseSB3aGVuIGFsbCBwYXJhbWV0ZXJzIG9mIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwgYXJlIE5VTEwgd2l0aCBhIHZhbGlkIGVuY29kZXIKaGFuZGxlLlxuXG4KVGhlIGludGVybmFsIHJlY29uZmlndXJhdGlvbiBwcm9jZXNzIGNhbiBiZSBjb250cm9sbGVkIGZyb20gZXh0ZXJuIHdpdGggdGhlIGZvbGxvd2luZyBhY2Nlc3MuClxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DT05UUk9MX1NUQVRFLCBBQUNFTkNfQ1RSTEZMQUdTKTsgXGVuZGNvZGUKCgpcc2VjdGlvbiBlbmNQYXJhbXMgRW5jb2RlciBQYXJhbWV0cml6YXRpb24KCkFsbCBwYXJhbWV0ZXJlcyBsaXN0ZWQgaW4gOjpBQUNFTkNfUEFSQU0gY2FuIGJlIG1vZGlmaWVkIHdpdGhpbiBhbiBlbmNvZGVyIGluc3RhbmNlLgoKXHN1YnNlY3Rpb24gZW5jTWFuZGF0b3J5IE1hbmRhdG9yeSBFbmNvZGVyIFBhcmFtZXRlcnMKVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlIGVuY29kZXIgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQuClxjb2RlCmFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19BT1QsIHZhbHVlKTsKYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUsIHZhbHVlKTsKYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX1NBTVBMRVJBVEUsIHZhbHVlKTsKYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0NIQU5ORUxNT0RFLCB2YWx1ZSk7ClxlbmRjb2RlCkJleW9uZCB0aGF0IGlzIGFuIGludGVybmFsIGF1dG8gbW9kZSB3aGljaCBwcmVpbml0aXppYWxpemVzIHRoZSA6OkFBQ0VOQ19CSVRSQVRFIHBhcmFtZXRlcgppZiB0aGUgcGFyYW1ldGVyIHdhcyBub3Qgc2V0IGZyb20gZXh0ZXJuLiBUaGUgYml0cmF0ZSBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgZWZmZWN0aXZlCmNoYW5uZWxzIGFuZCBzYW1wbGluZyByYXRlIGFuZCBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3MuClxjb2RlCkFBQy1MQyAoQU9UX0FBQ19MQyk6IDEuNSBiaXRzIHBlciBzYW1wbGUKSEUtQUFDIChBT1RfU0JSKTogMC42MjUgYml0cyBwZXIgc2FtcGxlCkhFLUFBQyB2MiAoQU9UX1BTKTogMC41IGJpdHMgcGVyIHNhbXBsZQpcZW5kY29kZQoKXHN1YnNlY3Rpb24gY2hhbm5lbE1vZGUgQ2hhbm5lbCBNb2RlIENvbmZpZ3VyYXRpb24KVGhlIGlucHV0IGF1ZGlvIGRhdGEgaXMgZGVzY3JpYmVkIHdpdGggdGhlIDo6QUFDRU5DX0NIQU5ORUxNT0RFIHBhcmFtZXRlciBpbiB0aGUKYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGNhbGwuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBhICdudW1iZXIgb2YKaW5wdXQgY2hhbm5lbHMnIGFyZ3VtZW50LiBJbnN0ZWFkLCB0aGUgY2hhbm5lbE1vZGUgbXVzdCBiZSBzZXQgYXMgZm9sbG93cy4KXGNvZGUgYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0NIQU5ORUxNT0RFLCB2YWx1ZSk7IFxlbmRjb2RlClRoZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIGluIDo6Q0hBTk5FTF9NT0RFIGFuZCBjYW4gYmUgbWFwcGVkIGZyb20gdGhlIG51bWJlciBvZiBpbnB1dCBjaGFubmVscwppbiB0aGUgZm9sbG93aW5nIHdheS4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwIENIQU5ORUxfTU9ERSBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7Clx1bnRpbCByZXR1cm4KClxzdWJzZWN0aW9uIGVuY1F1YWwgQXVkaW8gUXVhbGl0eSBDb25zaWRlcmF0aW9ucwpUaGUgZGVmYXVsdCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gaXMgc3VnZ2VzdGVkIHRvIGJlIHVzZWQuIEVuY29kZXIgdG9vbHMgc3VjaCBhcyBUTlMgYW5kIFBOUwphcmUgYWN0aXZhdGVkIGJ5IGRlZmF1bHQgYW5kIGFyZSBpbnRlcm5hbGx5IGNvbnRyb2xsZWQgKHNlZSBccmVmIEJFSEFWSU9VUl9UT09MUykuCgpUaGVyZSBpcyBhbiBhZGRpdGlvbmFsIHF1YWxpdHkgcGFyYW1ldGVyIGNhbGxlZCA6OkFBQ0VOQ19BRlRFUkJVUk5FUi4gSW4gdGhlIGRlZmF1bHQKY29uZmlndXJhdGlvbiB0aGlzIHF1YWxpdHkgc3dpdGNoIGlzIGRlYWN0aXZhdGVkIGJlY2F1c2UgaXQgd291bGQgY2F1c2UgYSB3b3JrbG9hZAppbmNyZWFzZSB3aGljaCBtaWdodCBiZSBzaWduaWZpY2FudC4gSWYgd29ya2xvYWQgaXMgbm90IGFuIGlzc3VlIGluIHRoZSBhcHBsaWNhdGlvbgp3ZSByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSB0aGlzIGZlYXR1cmUuClxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19BRlRFUkJVUk5FUiwgMSk7IFxlbmRjb2RlCgoKXHNlY3Rpb24gYXVkaW9jaENmZyBBdWRpbyBDaGFubmVsIENvbmZpZ3VyYXRpb24KVGhlIE1QRUcgc3RhbmRhcmQgcmVmZXJzIG9mdGVuIHRvIHRoZSBzby1jYWxsZWQgQ2hhbm5lbCBDb25maWd1cmF0aW9uLiBUaGlzIENoYW5uZWwgQ29uZmlndXJhdGlvbiBpcyB1c2VkIGZvciBhIGZpeGVkIENoYW5uZWwKTWFwcGluZy4gVGhlIGNvbmZpZ3VyYXRpb25zIDEtNyBhcmUgcHJlZGVmaW5lZCBpbiBNUEVHIHN0YW5kYXJkIGFuZCB1c2VkIGZvciBpbXBsaWNpdCBzaWduYWxsaW5nIHdpdGhpbiB0aGUgZW5jb2RlZCBiaXRzdHJlYW0uCkZvciB1c2VyIGRlZmluZWQgQ29uZmlndXJhdGlvbnMgdGhlIENoYW5uZWwgQ29uZmlndXJhdGlvbiBpcyBzZXQgdG8gMCBhbmQgdGhlIENoYW5uZWwgTWFwcGluZyBtdXN0IGJlIGV4cGxlY2l0bHkgZGVzY3JpYmVkIHdpdGggYW4gYXBwcm9wcmlhdGUKUHJvZ3JhbSBDb25maWcgRWxlbWVudC4gVGhlIHByZXNlbnQgRW5jb2RlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyB0aGUgdXNlciB0byBjb25maWd1cmUgdGhpcyBDaGFubmVsIENvbmZpZ3VyYXRpb24gZnJvbQpleHRlcm4uIFRoZSBFbmNvZGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZpeGVkIENoYW5uZWwgTW9kZXMgd2hpY2ggYXJlIG1hcHBlZCB0byBDaGFubmVsIENvbmZpZ3VyYXRpb24gYXMgZm9sbG93LgpcdmVyYmF0aW0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENoYW5uZWxNb2RlICAgICB8IENoQ2ZnICB8IGZyb250X0VsIHwgc2lkZV9FbCAgfCBiYWNrX0VsICB8IGxmZV9FbAotLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLQpNT0RFXzEgICAgICAgICAgIHwgICAgICAxIHwgU0NFICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKTU9ERV8yICAgICAgICAgICB8ICAgICAgMiB8IENQRSAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8Ck1PREVfMV8yICAgICAgICAgfCAgICAgIDMgfCBTQ0UsIENQRSB8ICAgICAgICAgIHwgICAgICAgICAgfApNT0RFXzFfMl8xICAgICAgIHwgICAgICA0IHwgU0NFLCBDUEUgfCAgICAgICAgICB8IFNDRSAgICAgIHwKTU9ERV8xXzJfMiAgICAgICB8ICAgICAgNSB8IFNDRSwgQ1BFIHwgICAgICAgICAgfCBDUEUgICAgICB8Ck1PREVfMV8yXzJfMSAgICAgfCAgICAgIDYgfCBTQ0UsIENQRSB8ICAgICAgICAgIHwgQ1BFICAgICAgfCBMRkUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC0gU0NFOiBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50LgogLSBDUEU6IENoYW5uZWwgUGFpci4KIC0gU0NFOiBMb3cgRnJlcXVlbmN5IEVsZW1lbnQuClxlbmR2ZXJiYXRpbQoKTW9yZW92ZXIsIHRoZSBUYWJsZSBkZXNjcmliZXMgYWxsIGZpeGVkIENoYW5uZWwgRWxlbWVudHMgZm9yIGVhY2ggQ2hhbm5lbCBNb2RlIHdoaWNoIGFyZSBhc3NpZ25lZCB0byBhIHNwZWFrZXIgYXJyYW5nZW1lbnQuIFRoZQphcnJhbmdlbWVudCBpbmNsdWRlcyBmcm9udCwgc2lkZSwgYmFjayBhbmQgbGZlIEF1ZGlvIENoYW5uZWwgRWxlbWVudHMuXG4KVGhpcyBtYXBwaW5nIG9mIEF1ZGlvIENoYW5uZWwgRWxlbWVudHMgaXMgZGVmaW5lZCBpbiBNUEVHIHN0YW5kYXJkIGZvciBDaGFubmVsIENvbmZpZyAxLTcuIFRoZSBDaGFubmVsIGFzc2lnbm1lbnQgZm9yIE1PREVfMV8xLApNT0RFXzJfMiBhbmQgTU9ERV8yXzEgaXMgdXNlZCBmcm9tIHRoZSBBUklCIHN0YW5kYXJkLiBBbGwgb3RoZXIgY29uZmlndXJhdGlvbnMgYXJlIGRlZmluZWQgYXMgc3VnZ2VzdGVkIGluIE1QRUcuXG4KSW4gY2FzZSBvZiBDaGFubmVsIENvbmZpZyAwIG9yIHdyaXRpbmcgbWF0cml4IG1peGRvd24gY29lZmZpY2llbnRzLCB0aGUgZW5jb2RlciBlbmFibGVzIHRoZSB3cml0aW5nIG9mIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQKaXRzZWxmIGFzIGRlc2NyaWJlZCBpbiBccmVmIGVuY1BDRS4gVGhlIGNvbmZpZ3VyYXRpb24gdXNlZCBpbiBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHJlZmVycyB0byB0aGUgZGVub3RlZCBUYWJsZS5cbgpCZXNpZGUgdGhlIENoYW5uZWwgRWxlbWVudCBhc3NpZ25tZW50IHRoZSBDaGFubmVsIE1vZGVzIGFyZSByZXNwb3NpYmxlIGZvciBhdWRpbyBpbnB1dCBkYXRhIGNoYW5uZWwgbWFwcGluZy4gVGhlIENoYW5uZWwgTWFwcGluZwpvZiB0aGUgYXVkaW8gZGF0YSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCA6OkFBQ0VOQ19DSEFOTkVMT1JERVIgd2hpY2ggY2FuIGJlIE1QRUcgb3IgV0FWIGxpa2Ugb3JkZXIuXG4KRm9sbG93aW5nIFRhYmxlIGRlc2NyaWJlcyB0aGUgY29tcGxldGUgY2hhbm5lbCBtYXBwaW5nIGZvciBib3RoIENoYW5uZWwgT3JkZXIgY29uZmlndXJhdGlvbnMuClx2ZXJiYXRpbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQ2hhbm5lbE1vZGUgICAgICB8ICBNUEVHLUNoYW5uZWxvcmRlciAgICAgICAgICAgIHwgIFdBVi1DaGFubmVsb3JkZXIKLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCk1PREVfMSAgICAgICAgICAgfCAwIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8IDAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfApNT0RFXzIgICAgICAgICAgIHwgMCB8IDEgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCAwIHwgMSB8ICAgfCAgIHwgICB8ICAgfCAgIHwKTU9ERV8xXzIgICAgICAgICB8IDAgfCAxIHwgMiB8ICAgfCAgIHwgICB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgICB8ICAgfCAgIHwgICB8Ck1PREVfMV8yXzEgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgICB8ICAgfCAgIHwgICB8IDIgfCAwIHwgMSB8IDMgfCAgIHwgICB8ICAgfApNT0RFXzFfMl8yICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCAgIHwgICB8ICAgfCAyIHwgMCB8IDEgfCAzIHwgNCB8ICAgfCAgIHwKTU9ERV8xXzJfMl8xICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgNCB8IDUgfCAzIHwgICB8Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcZW5kdmVyYmF0aW0KClRoZSBkZW5vdGVkIG1hcHBpbmcgaXMgaW1wb3J0YW50IGZvciBjb3JyZWN0IGF1ZGlvIGNoYW5uZWwgYXNzaWdubWVudCB3aGVuIHVzaW5nIE1QRUcgb3IgV0FWIG9yZGVyaW5nLiBUaGUgaW5jb21pbmcgYXVkaW8KY2hhbm5lbHMgYXJlIGRpc3RyaWJ1dGVkIE1QRUcgbGlrZSBzdGFydGluZyBhdCB0aGUgZnJvbnQgY2hhbm5lbHMgYW5kIGVuZGluZyBhdCB0aGUgYmFjayBjaGFubmVscy4gVGhlIGRpc3RyaWJ1dGlvbiBpcyB1c2VkIGFzCmRlc2NyaWJlZCBpbiBUYWJsZSBjb25jZXJpbmcgQ2hhbm5lbCBDb25maWcgYW5kIGZpeCBjaGFubmVsIGVsZW1lbnRzLiBQbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmb3IgY2xhcmlmaWNhdGlvbi4KClx2ZXJiYXRpbQpFeGFtcGxlOiBNT0RFXzFfMl8yXzEgLSBXQVYtQ2hhbm5lbG9yZGVyIDUuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIElucHV0IENoYW5uZWwgICAgICB8IENvZGVyIENoYW5uZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAyIChmcm9udCBjZW50ZXIpICAgfCAwIChTQ0UgY2hhbm5lbCkKIDAgKGxlZnQgY2VudGVyKSAgICB8IDEgKDFzdCBvZiAxc3QgQ1BFKQogMSAocmlnaHQgY2VudGVyKSAgIHwgMiAoMm5kIG9mIDFzdCBDUEUpCiA0IChsZWZ0IHN1cnJvdW5kKSAgfCAzICgxc3Qgb2YgMm5kIENQRSkKIDUgKHJpZ2h0IHN1cnJvdW5kKSB8IDQgKDJuZCBvZiAybmQgQ1BFKQogMyAoTEZFKSAgICAgICAgICAgIHwgNSAoTEZFKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXGVuZHZlcmJhdGltCgoKXHNlY3Rpb24gc3VwcEJpdHJhdGVzIFN1cHBvcnRlZCBCaXRyYXRlcwoKVGhlIEZESyBBQUMgRW5jb2RlciBwcm92aWRlcyBhIHdpZGUgcmFuZ2Ugb2Ygc3VwcG9ydGVkIGJpdHJhdGVzLgpUaGUgbWluaW11bSBhbmQgbWF4aW11bSBhbGxvd2VkIGJpdHJhdGUgZGVwZW5kcyBvbiB0aGUgQXVkaW8gT2JqZWN0IFR5cGUuIEZvciBBQUMtTEMgdGhlIG1pbmltdW0KYml0cmF0ZSBpcyB0aGUgYml0cmF0ZSB0aGF0IGlzIHJlcXVpcmVkIHRvIHdyaXRlIHRoZSBtb3N0IGJhc2ljIGFuZCBtaW5pbWFsIHZhbGlkIGJpdHN0cmVhbS4KSXQgY29uc2lzdHMgb2YgdGhlIGJpdHN0cmVhbSBmb3JtYXQgaGVhZGVyIGluZm9ybWF0aW9uIGFuZCBvdGhlciBzdGF0aWMvbWFuZGF0b3J5IGluZm9ybWF0aW9uCndpdGhpbiB0aGUgQUFDIHBheWxvYWQuIFRoZSBtYXhpbXVtIEFBQyBmcmFtZXNpemUgYWxsb3dlZCBieSB0aGUgTVBFRy00IHN0YW5kYXJkCmRldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBiaXRyYXRlIGZvciBBQUMtTEMuIEZvciBIRS1BQUMgYW5kIEhFLUFBQyB2MiBhIGxpYnJhcnkgaW50ZXJuYWwKbG9vay11cCB0YWJsZSBpcyB1c2VkLgoKQSBnb29kIHdvcmtpbmcgcG9pbnQgaW4gdGVybXMgb2YgYXVkaW8gcXVhbGl0eSwgc2FtcGxpbmcgcmF0ZSBhbmQgYml0cmF0ZSwgaXMgYXQgMSB0byAxLjUKYml0cy9hdWRpbyBzYW1wbGUgZm9yIEFBQy1MQywgMC42MjUgYml0cy9hdWRpbyBzYW1wbGUgZm9yIEhFLUFBQyBhbmQgMC41IGJpdHMvYXVkaW8gc2FtcGxlCmZvciBIRS1BQUMgdjIuIEZvciBleGFtcGxlIGZvciBvbmUgY2hhbm5lbCB3aXRoIGEgc2FtcGxpbmcgZnJlcXVlbmN5IG9mIDQ4IGtIeiwgdGhlIHJhbmdlIGZyb20KNDgga2JpdC9zIHRvIDcyIGtiaXQvcyBhY2hpZXZlcyByZWFzb25hYmxlIGF1ZGlvIHF1YWxpdHkgZm9yIEFBQy1MQy4KCkZvciBIRS1BQUMgYW5kIEhFLUFBQyB2MiB0aGUgbG93ZXN0IHBvc3NpYmxlIGF1ZGlvIGlucHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSBpcyAxNiBrSHogYmVjYXVzZSB0aGVuIHRoZQpBQUMtTEMgY29yZSBlbmNvZGVyIG9wZXJhdGVzIGluIGR1YWwgcmF0ZSBtb2RlIGF0IGl0cyBsb3dlc3QgcG9zc2libGUgc2FtcGxpbmcgZnJlcXVlbmN5LCB3aGljaCBpcyA4IGtIei4KSEUtQUFDIHYyIHJlcXVpcmVzIHN0ZXJlbyBpbnB1dCBhdWRpbyBkYXRhLgoKUGxlYXNlIG5vdGUgdGhhdCBpbiBIRS1BQUMgb3IgSEUtQUFDIHYyIG1vZGUgdGhlIGVuY29kZXIgc3VwcG9ydHMgbXVjaCBoaWdoZXIgYml0cmF0ZXMgdGhhbiBhcmUKYXBwcm9wcmlhdGUgZm9yIEhFLUFBQyBvciBIRS1BQUMgdjIuIEZvciBleGFtcGxlLCBhdCBhIGJpdHJhdGUgb2YgbW9yZSB0aGFuIDY0IGtiaXQvcyBmb3IgYSBzdGVyZW8KYXVkaW8gc2lnbmFsIGF0IDQ0LjEga0h6IGl0IHVzdWFsbHkgbWFrZXMgc2Vuc2UgdG8gdXNlIEFBQy1MQywgd2hpY2ggd2lsbCBwcm9kdWNlIGJldHRlciBhdWRpbwpxdWFsaXR5IGF0IHRoYXQgYml0cmF0ZSB0aGFuIEhFLUFBQyBvciBIRS1BQUMgdjIuCgpcc2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnIFJlY29tbWVuZGVkIFNhbXBsaW5nIFJhdGUgYW5kIEJpdHJhdGUgQ29tYmluYXRpb25zCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHJlY29tbWVuZGVkIGVuY29kZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCndoaWNoIHdlIGRldGVybWluZWQgYnkgdmlydHVlIG9mIG51bWVyb3VzIGxpc3RlbmluZyB0ZXN0cy4KClxzdWJzZWN0aW9uIHJlb21tZW5kZWRDb25maWdMQyBBQUMtTEMsIEhFLUFBQywgSEUtQUFDdjIuClx2ZXJiYXRpbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpBdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLiBvZgogICAgICAgICAgICAgICAgICAgfCAgICAgICAgIFtiaXQvc10gIHwgICAgICAgU2FtcGxpbmcgUmF0ZXMgIHwgICAgU2FtcGwuICB8ICBDaGFuLgogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW2tIel0gIHwgICAgICBSYXRlICB8CiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgW2tIel0gIHwKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICsgU0JSICsgUFMgIHwgICA4MDAwIC0gIDExOTk5ICB8ICAgICAgICAgMjIuMDUsIDI0LjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICsgUFMgIHwgIDEyMDAwIC0gIDE3OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICsgUFMgIHwgIDE4MDAwIC0gIDM5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICsgUFMgIHwgIDQwMDAwIC0gIDU2MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICsgU0JSICAgICAgIHwgICA4MDAwIC0gIDExOTk5ICB8ICAgICAgICAgMjIuMDUsIDI0LjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDEKQUFDIExDICsgU0JSICAgICAgIHwgIDEyMDAwIC0gIDE3OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKQUFDIExDICsgU0JSICAgICAgIHwgIDE4MDAwIC0gIDM5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDEKQUFDIExDICsgU0JSICAgICAgIHwgIDQwMDAwIC0gIDU2MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDEKQUFDIExDICsgU0JSICAgICAgIHwgIDE2MDAwIC0gIDI3OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICAgICAgIHwgIDI4MDAwIC0gIDYzOTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICAgICAgIHwgIDY0MDAwIC0gMTI4MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICsgU0JSICAgICAgIHwgIDY0MDAwIC0gIDY5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKQUFDIExDICsgU0JSICAgICAgIHwgIDcwMDAwIC0gMTU5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCA1LCA1LjEKQUFDIExDICsgU0JSICAgICAgIHwgMTYwMDAwIC0gMzE5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCA1LCA1LjEKQUFDIExDICsgU0JSICAgICAgIHwgMzIwMDAwIC0gNjQwMDAwICB8ICA2NC4wMCwgODguMjAsIDk2LjAwICB8ICAgICA5Ni4wMCAgfCA1LCA1LjEKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICAgICAgICAgICAgIHwgICA4MDAwIC0gIDE1OTk5ICB8IDExLjAyNSwgMTIuMDAsIDE2LjAwICB8ICAgICAxMi4wMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgIDE2MDAwIC0gIDIzOTk5ICB8ICAgICAgICAgICAgICAgIDE2LjAwICB8ICAgICAxNi4wMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgIDI0MDAwIC0gIDMxOTk5ICB8ICAxNi4wMCwgMjIuMDUsIDI0LjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDU1OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgIDU2MDAwIC0gMTYwMDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgMTYwMDAxIC0gMjg4MDAwICB8ICAgICAgICAgICAgICAgIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDEKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICAgICAgICAgICAgIHwgIDE2MDAwIC0gIDIzOTk5ICB8IDExLjAyNSwgMTIuMDAsIDE2LjAwICB8ICAgICAxMi4wMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgIDI0MDAwIC0gIDMxOTk5ICB8ICAgICAgICAgICAgICAgIDE2LjAwICB8ICAgICAxNi4wMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDM5OTk5ICB8ICAxNi4wMCwgMjIuMDUsIDI0LjAwICB8ICAgICAyMi4wNSAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgIDQwMDAwIC0gIDk1OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgIDk2MDAwIC0gMTExOTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgMTEyMDAwIC0gMzIwMDAxICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgMzIwMDAyIC0gNTc2MDAwICB8ICAgICAgICAgICAgICAgIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICAgICAgICAgICAgIHwgMTYwMDAwIC0gMjM5OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKQUFDIExDICAgICAgICAgICAgIHwgMjQwMDAwIC0gMjc5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKQUFDIExDICAgICAgICAgICAgIHwgMjgwMDAwIC0gODAwMDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCA1LCA1LjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXGVuZHZlcmJhdGltIFxuCgpcc3Vic2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnTEQgQUFDLUxELCBBQUMtRUxELCBBQUMtRUxEIHdpdGggU0JSLgpcdmVyYmF0aW0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQXVkaW8gT2JqZWN0IFR5cGUgIHwgIEJpdCBSYXRlIFJhbmdlICB8ICAgICAgICAgICAgU3VwcG9ydGVkICB8IFByZWZlcnJlZCAgfCBOby4gb2YKICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4KICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtrSHpdICB8ICAgICAgUmF0ZSAgfAogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFtrSHpdICB8Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8ICAxNjAwMCAtICAyNDk5OSAgfCAgICAgICAgMzIuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkVMRCArIFNCUiAgICAgICAgICB8ICAyNTAwMCAtICAzMTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkVMRCArIFNCUiAgICAgICAgICB8ICAzMjAwMCAtICA2NDAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8ICAzMjAwMCAtICA1MTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCkVMRCArIFNCUiAgICAgICAgICB8ICA1MjAwMCAtIDEyODAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8ICA3MjAwMCAtIDE5MjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAzCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8ICA5NjAwMCAtIDI1NjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA0Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8IDEyMDAwMCAtIDMyMDAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA1Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8ICAxNjAwMCAtICAxOTk5OSAgfCAgICAgICAgMTYuMDAgLSAyNC4wMCAgfCAgICAgMTYuMDAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICAyMDAwMCAtICAzOTk5OSAgfCAgICAgICAgMTYuMDAgLSAzMi4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICA0MDAwMCAtICA0OTk5OSAgfCAgICAgICAgMjIuMDUgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICA1MDAwMCAtICA2MTk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICA2MjAwMCAtICA4NDk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICA4NTAwMCAtIDE5MjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8ICA2NDAwMCAtICA3NTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCkxELCBFTEQgICAgICAgICAgICB8ICA3NjAwMCAtICA5Nzk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCkxELCBFTEQgICAgICAgICAgICB8ICA5ODAwMCAtIDEzNTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCkxELCBFTEQgICAgICAgICAgICB8IDEzNjAwMCAtIDM4NDAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8ICA5NjAwMCAtIDExMzk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAzCkxELCBFTEQgICAgICAgICAgICB8IDExNDAwMCAtIDE0Njk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAzCkxELCBFTEQgICAgICAgICAgICB8IDE0NzAwMCAtIDIwMzk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAzCkxELCBFTEQgICAgICAgICAgICB8IDIwNDAwMCAtIDU3NjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAzCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8IDEyODAwMCAtIDE1MTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICA0CkxELCBFTEQgICAgICAgICAgICB8IDE1MjAwMCAtIDE5NTk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICA0CkxELCBFTEQgICAgICAgICAgICB8IDE5NjAwMCAtIDI3MTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICA0CkxELCBFTEQgICAgICAgICAgICB8IDI3MjAwMCAtIDc2ODAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA0Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8IDE2MDAwMCAtIDE4OTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICA1CkxELCBFTEQgICAgICAgICAgICB8IDE5MDAwMCAtIDI0NDk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICA1CkxELCBFTEQgICAgICAgICAgICB8IDI0NTAwMCAtIDMzOTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICA1CkxELCBFTEQgICAgICAgICAgICB8IDM0MDAwMCAtIDk2MDAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClxlbmR2ZXJiYXRpbSBcbgoKXHBhZ2UgRU5DT0RFUkJFSEFWSU9VUiBFbmNvZGVyIEJlaGF2aW91cgoKXHNlY3Rpb24gQkVIQVZJT1VSX0JBTkRXSURUSCBCYW5kd2lkdGgKClRoZSBGREsgQUFDIGVuY29kZXIgdXN1YWxseSBkb2VzIG5vdCB1c2UgdGhlIGZ1bGwgZnJlcXVlbmN5IHJhbmdlIG9mIHRoZSBpbnB1dCBzaWduYWwsIGJ1dCByZXN0cmljdHMgdGhlIGJhbmR3aWR0aAphY2NvcmRpbmcgdG8gY2VydGFpbiBsaWJyYXJ5LWludGVybmFsIHNldHRpbmdzLiBUaGV5IGNhbiBiZSBjaGFuZ2VkIGluIHRoZSB0YWJsZSAiYmFuZFdpZHRoVGFibGUiIGluIHRoZQpmaWxlIGJhbmR3aWR0aC5jcHAgKGlmIGF2YWlsYWJsZSksIG9yIHZpYSBjb21tYW5kLWxpbmUgYXJndW1lbnQgIi13IiAoc2VlIGNoYXB0ZXIgXHJlZiBDb21tYW5kTGluZVVzYWdlKS4KCkhvd2V2ZXIgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGVzZSBzZXR0aW5ncywgYmVjYXVzZSB0aGV5IGFyZSBiYXNlZCBvbiBudW1lcmlvdXMgbGlzdGVuaW5nCnRlc3RzIGFuZCBjYXJlZnVsIHR3ZWFrcyB0byBlbnN1cmUgdGhlIGJlc3Qgb3ZlcmFsbCBlbmNvZGluZyBxdWFsaXR5LgoKVGhlb3JldGljYWxseSBhIHNpZ25hbCBvZiBmb3IgZXhhbXBsZSA0OCBrSHogY2FuIGNvbnRhaW4gZnJlcXVlbmNpZXMgdXAgdG8gMjQga0h6LCBidXQgdG8gdXNlIHRoaXMgZnVsbCByYW5nZQppbiBhbiBhdWRpbyBlbmNvZGVyIHVzdWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZS4gVXN1YWxseSB0aGUgZW5jb2RlciBoYXMgYSB2ZXJ5IGxpbWl0ZWQgYW1vdW50IG9mCmJpdHMgdG8gc3BlbmQgKHR5cGljYWxseSAxMjgga2JpdC9zIGZvciBzdGVyZW8gNDgga0h6IGNvbnRlbnQpIGFuZCB0byBhbGxvdyBmdWxsIHJhbmdlIGJhbmR3aWR0aCB3b3VsZAp3YXN0ZSBhIGxvdCBvZiB0aGVzZSBiaXRzIGZvciBmcmVxdWVuY2llcyB0aGUgaHVtYW4gZWFyIGlzIGhhcmRseSBhYmxlIHRvIHBlcmNlaXZlIGFueXdheSwgaWYgYXQgYWxsLiBIZW5jZSBpdAppcyB3aXNlIHRvIHVzZSB0aGUgYXZhaWxhYmxlIGJpdHMgZm9yIHRoZSByZWFsbHkgaW1wb3J0YW50IGZyZXF1ZW5jeSByYW5nZSBhbmQganVzdCBza2lwIHRoZSByZXN0LgpBdCBsb3dlciBiaXRyYXRlcyAoZS4gZy4gPD0gODAga2JpdC9zIGZvciBzdGVyZW8gNDgga0h6IGNvbnRlbnQpIHRoZSBlbmNvZGVyIHdpbGwgY2hvb3NlIGFuIGV2ZW4gc21hbGxlcgpiYW5kd2lkdGgsIGJlY2F1c2UgYW4gZW5jb2RlZCBzaWduYWwgd2l0aCBzbWFsbGVyIGJhbmR3aWR0aCBhbmQgaGVuY2UgbGVzcyBhcnRpZmFjdHMgc291bmRzIGJldHRlciB0aGFuIGEgc2lnbmFsCndpdGggaGlnaGVyIGJhbmR3aWR0aCBidXQgdGhlbiBtb3JlIGNvZGluZyBhcnRlZmFjdHMgYWNyb3NzIGFsbCBmcmVxdWVuY2llcy4gVGhlc2UgYXJ0ZWZhY3RzIHdvdWxkIG9jY3VyIGlmCnNtYWxsIGJpdHJhdGVzIGFuZCBoaWdoIGJhbmR3aWR0aHMgYXJlIGNob3NlbiBiZWNhdXNlIHRoZSBhdmFpbGFibGUgYml0cyBhcmUganVzdCBub3QgZW5vdWdoIHRvIGVuY29kZSBhbGwKZnJlcXVlbmNpZXMgd2VsbC4KClVuZm9ydHVuYXRlbHkgc29tZSBwZW9wbGUgZXZhbHVhdGUgZW5jb2RpbmcgcXVhbGl0eSBiYXNlZCBvbiBwb3NzaWJsZSBiYW5kd2lkdGggYXMgd2VsbCwgYnV0IGl0IGlzIGEgdHdvLXNpZGVkCnN3b3JkIGNvbnNpZGVyaW5nIHRoZSB0cmFkZS1vZmYgZGVzY3JpYmVkIGFib3ZlLgoKQW5vdGhlciBhc3BlY3QgaXMgd29ya2xvYWQgY29uc3VtcHRpb24uIFRoZSBoaWdoZXIgdGhlIGFsbG93ZWQgYmFuZHdpZHRoLCB0aGUgbW9yZSBmcmVxdWVuY3kgbGluZXMgaGF2ZSB0byBiZQpwcm9jZXNzZWQsIHdoaWNoIGluIHR1cm4gaW5jcmVhc2VzIHRoZSB3b3JrbG9hZC4KClxzZWN0aW9uIEZSQU1FU0laRVNfQU5EX0JJVF9SRVNFUlZPSVIgRnJhbWUgU2l6ZXMgJiBCaXQgUmVzZXJ2b2lyCgpGb3IgQUFDIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbnN0YW50IGJpdCByYXRlIGFuZCBjb25zdGFudCBmcmFtZQpsZW5ndGggZHVlIHRvIHRoZSBzby1jYWxsZWQgYml0IHJlc2Vydm9pciB0ZWNobmlxdWUsIHdoaWNoIGFsbG93cyB0aGUgZW5jb2RlciB0byB1c2UgbGVzcwpiaXRzIGluIGFuIEFBQyBmcmFtZSBmb3IgdGhvc2UgYXVkaW8gc2lnbmFsIHNlY3Rpb25zIHdoaWNoIGFyZSBlYXN5IHRvIGVuY29kZSwKYW5kIHRoZW4gc3BlbmQgdGhlbSBhdCBhIGxhdGVyIHBvaW50IGluCnRpbWUgZm9yIG1vcmUgY29tcGxleCBhdWRpbyBzZWN0aW9ucy4gVGhlIGV4dGVudCB0byB3aGljaCB0aGlzICJiaXQgZXhjaGFuZ2UiCmlzIGRvbmUgaXMgbGltaXRlZCB0byBhbGxvdyBmb3IgcmVsaWFibGUgYW5kIHJlbGF0aXZlbHkgbG93IGRlbGF5IHJlYWwgdGltZQpzdHJlYW1pbmcuCk92ZXIgYSBsb25nZXIgcGVyaW9kIGluIHRpbWUgdGhlIGJpdHJhdGUgd2lsbCBiZSBjb25zdGFudCBpbiB0aGUgQUFDIGNvbnN0YW50CmJpdHJhdGUgbW9kZSwgZS5nLiBmb3IgSVNETiB0cmFuc21pc3Npb24uIFRoaXMgbWVhbnMgdGhhdCBpbiBBQUMgZWFjaCBiaXRzdHJlYW0KZnJhbWUgd2lsbCBpbiBnZW5lcmFsIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIGluIGJ5dGVzIGJ1dCBvdmVyIHRpbWUgaXQKd2lsbCByZWFjaCB0aGUgdGFyZ2V0IGJpdHJhdGUuIE9uZSBjb3VsZCBhbHNvIG1ha2UgYW4gTVBFRyBjb21wbGlhbnQKQUFDIGVuY29kZXIgd2hpY2ggYWx3YXlzIHByb2R1Y2VzIGNvbnN0YW50IGxlbmd0aCBwYWNrYWdlcyBmb3IgZWFjaCBBQUMgZnJhbWUsCmJ1dCB0aGUgYXVkaW8gcXVhbGl0eSB3b3VsZCBiZSBjb25zaWRlcmFibHkgd29yc2Ugc2luY2UgdGhlIGJpdCByZXNlcnZvaXIKdGVjaG5pcXVlIHdvdWxkIGhhdmUgdG8gYmUgc3dpdGNoZWQgb2ZmIGNvbXBsZXRlbHkuIEEgaGlnaGVyIGJpdCByYXRlIHdvdWxkIGhhdmUKdG8gYmUgdXNlZCB0byBnZXQgdGhlIHNhbWUgYXVkaW8gcXVhbGl0eSBhcyB3aXRoIGFuIGVuYWJsZWQgYml0IHJlc2Vydm9pci4KClRoZSBtYXhpbXVtIEFBQyBmcmFtZSBsZW5ndGgsIHJlZ2FyZGxlc3Mgb2YgdGhlIGF2YWlsYWJsZSBiaXQgcmVzZXJ2b2lyLCBpcyBkZWZpbmVkCmFzIDYxNDQgYml0cyBwZXIgY2hhbm5lbC4KCkZvciBtcDMgYnkgdGhlIHdheSwgdGhlIHNhbWUgYml0IHJlc2Vydm9pciB0ZWNobmlxdWUgZXhpc3RzLCBidXQgdGhlcmUgZWFjaCBiaXQKc3RyZWFtIGZyYW1lIGhhcyBhIGNvbnN0YW50IGxlbmd0aCBmb3IgYSBnaXZlbiBiaXQgcmF0ZSAoaWdub3JpbmcgdGhlCnBhZGRpbmcgYnl0ZSkuIEluIG1wMyB0aGVyZSBpcyBhIHNvLWNhbGxlZCAiYmFjayBwb2ludGVyIiB3aGljaCB0ZWxscwp0aGUgZGVjb2RlciB3aGljaCBiaXRzIGJlbG9uZyB0byB0aGUgY3VycmVudCBtcDMgZnJhbWUgLSBhbmQgaW4gZ2VuZXJhbCBzb21lIG9yCm1hbnkgYml0cyBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQgaW4gYW4gZWFybGllciBtcDMgZnJhbWUuIEJhc2ljYWxseSB0aGlzIGxlYWRzIHRvCnRoZSBzYW1lICJiaXQgZXhjaGFuZ2UgYmV0d2VlbiBtcDMgZnJhbWVzIiBhcyBpbiBBQUMgYnV0IHdpdGggdmlydHVhbGx5IGNvbnN0YW50Cmxlbmd0aCBmcmFtZXMuCgpUaGlzIHZhcmlhYmxlIGZyYW1lIGxlbmd0aCBhdCAiY29uc3RhbnQgYml0IHJhdGUiIGlzIG5vdCBzb21ldGhpbmcgc3BlY2lhbAppbiB0aGlzIEZyYXVuaG9mZXIgSUlTIEFBQyBlbmNvZGVyLiBBQUMgaGFzIGJlZW4gZGVzaWduZWQgaW4gdGhhdCB3YXkuCgpcc3Vic2VjdGlvbiBCRUhBVklPVVJfRVNUSU1fQVZHX0ZSQU1FU0laRVMgRXN0aW1hdGluZyBBdmVyYWdlIEZyYW1lIFNpemVzCgpBIEhFLUFBQyB2MSBvciB2MiBhdWRpbyBmcmFtZSBjb250YWlucyAyMDQ4IFBDTSBzYW1wbGVzIHBlciBjaGFubmVsICh0aGVyZSBpcwphbHNvIG9uZSBtb2RlIHdpdGggMTkyMCBzYW1wbGVzIHBlciBjaGFubmVsIGJ1dCB0aGlzIGlzIG9ubHkgZm9yIHNwZWNpYWwgcHVycG9zZXMKc3VjaCBhcyBEQUIrIGRpZ2l0YWwgcmFkaW8pLgoKVGhlIG51bWJlciBvZiBIRS1BQUMgZnJhbWVzIFxmJE5cX0ZSQU1FU1xmJCBwZXIgc2Vjb25kIGF0IDQ0LjEga0h6IGlzOgoKXGZbCk5cX0ZSQU1FUyA9IDQ0MTAwIC8gMjA0OCA9IDIxLjUzMzIKXGZdCgpBdCBhIGJpdCByYXRlIG9mIDgga2JwcyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYml0cyBwZXIgZnJhbWUgXGYkTlxfQklUU1xfUEVSXF9GUkFNRVxmJCBpczoKClxmWwpOXF9CSVRTXF9QRVJcX0ZSQU1FID0gODAwMCAvIDIxLjUzMzIgPSAzNzEuNTIKXGZdCgp3aGljaCBpcyBhYm91dCA0Ni40NCBieXRlcyBwZXIgZW5jb2RlZCBmcmFtZS4KCkF0IGEgYml0IHJhdGUgb2YgMzIga2Jwcywgd2hpY2ggaXMgcXVpdGUgaGlnaCBmb3Igc2luZ2xlIGNoYW5uZWwgSEUtQUFDIHYxLCBpdCBpczoKClxmWwpOXF9CSVRTXF9QRVJcX0ZSQU1FID0gMzIwMDAgLyAyMS41MzMyID0gMTQ4NgpcZl0KCndoaWNoIGlzIGFib3V0IDE4NS43NiBieXRlcyBwZXIgZW5jb2RlZCBmcmFtZS4KClRoZXNlIGJpdHMvZnJhbWUgZmlndXJlcyBhcmUgYXZlcmFnZSBmaWd1cmVzIHdoZXJlIGVhY2ggQUFDIGZyYW1lIGdlbmVyYWxseSBoYXMgYSBkaWZmZXJlbnQKc2l6ZSBpbiBieXRlcy4gVG8gY2FsY3VsYXRlIHRoZSBzYW1lIGZvciBBQUMtTEMganVzdCB1c2UgMTAyNCBpbnN0ZWFkIG9mIDIwNDggUENNIHNhbXBsZXMgcGVyCmZyYW1lIGFuZCBjaGFubmVsLgpGb3IgQUFDLUxEL0VMRCBpdCBpcyBlaXRoZXIgNDgwIG9yIDUxMiBQQ00gc2FtcGxlcyBwZXIgZnJhbWUgYW5kIGNoYW5uZWwuCgoKXHNlY3Rpb24gQkVIQVZJT1VSX1RPT0xTIEVuY29kZXIgVG9vbHMKClRoZSBBQUMgZW5jb2RlciBzdXBwb3J0cyBUTlMsIFBOUywgTVMsIEludGVuc2l0eSBhbmQgYWN0aXZhdGVzIHRoZXNlIHRvb2xzIGRlcGVuZGluZyBvbiB0aGUgYXVkaW8gc2lnbmFsIGFuZAp0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIChpLmUuIGJpdHJhdGUgb3IgQU9UKS4gSXQgaXMgbm90IHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGVzZSB0b29scyBtYW51YWxseS4KClBOUyBpbXByb3ZlcyBlbmNvZGluZyBxdWFsaXR5IG9ubHkgZm9yIGNlcnRhaW4gYml0cmF0ZXMuIFRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBhY3RpdmF0ZSBQTlMgb25seSBmb3IKdGhlc2UgYml0cmF0ZXMgYW5kIHNhdmUgdGhlIHByb2Nlc3NpbmcgcG93ZXIgcmVxdWlyZWQgZm9yIFBOUyAoYWJvdXQgMTAgJSBvZiB0aGUgZW5jb2Rlcikgd2hlbiB1c2luZyBvdGhlcgpiaXRyYXRlcy4gVGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW5zaWRlIHRoZSBlbmNvZGVyIGxpYnJhcnkuIFBOUyBpcyBkaXNhYmxlZCBpbnNpZGUgdGhlIGVuY29kZXIgbGlicmFyeSBpZgphbiBNUEVHLTIgQU9UIGlzIGNob29zZW4gc2luY2UgUE5TIGlzIGFuIE1QRUctNCBBQUMgZmVhdHVyZS4KCklmIFNCUiBpcyBhY3RpdmF0ZWQsIHRoZSBlbmNvZGVyIGF1dG9tYXRpY2FsbHkgZGVhY3RpdmF0ZXMgUE5TIGludGVybmFsbHkuIElmIFROUyBpcyBkaXNhYmxlZCBidXQgUE5TIGlzIGFsbG93ZWQsCnRoZSBlbmNvZGVyIGRlYWN0aXZhdGVzIFBOUyBjYWxjdWxhdGlvbiBpbnRlcm5hbGx5LgoKCiovCgojaWZuZGVmIF9BQUNfRU5DX0xJQl9IXwojZGVmaW5lIF9BQUNfRU5DX0xJQl9IXwoKI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgojaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCgoKLyoqCiAqICBBQUMgZW5jb2RlciBlcnJvciBjb2Rlcy4KICovCnR5cGVkZWYgZW51bSB7CiAgICBBQUNFTkNfT0sgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMCwgIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLwoKICAgIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSAgICAgICAgID0gMHgwMDIwLCAgLyohPCBIYW5kbGUgcGFzc2VkIHRvIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQuICovCiAgICBBQUNFTkNfTUVNT1JZX0VSUk9SICAgICAgICAgICA9IDB4MDAyMSwgIC8qITwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwogICAgQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUiAgPSAweDAwMjIsICAvKiE8IFBhcmFtZXRlciBub3QgYXZhaWxhYmxlLiAqLwogICAgQUFDRU5DX0lOVkFMSURfQ09ORklHICAgICAgICAgPSAweDAwMjMsICAvKiE8IENvbmZpZ3VyYXRpb24gbm90IHByb3ZpZGVkLiAqLwoKICAgIEFBQ0VOQ19JTklUX0VSUk9SICAgICAgICAgICAgID0gMHgwMDQwLCAgLyohPCBHZW5lcmFsIGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwogICAgQUFDRU5DX0lOSVRfQUFDX0VSUk9SICAgICAgICAgPSAweDAwNDEsICAvKiE8IEFBQyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwogICAgQUFDRU5DX0lOSVRfU0JSX0VSUk9SICAgICAgICAgPSAweDAwNDIsICAvKiE8IFNCUiBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwogICAgQUFDRU5DX0lOSVRfVFBfRVJST1IgICAgICAgICAgPSAweDAwNDMsICAvKiE8IFRyYW5zcG9ydCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwogICAgQUFDRU5DX0lOSVRfTUVUQV9FUlJPUiAgICAgICAgPSAweDAwNDQsICAvKiE8IE1ldGEgZGF0YSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwoKICAgIEFBQ0VOQ19FTkNPREVfRVJST1IgICAgICAgICAgID0gMHgwMDYwLCAgLyohPCBUaGUgZW5jb2RpbmcgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnkgYW4gdW5leHBlY3RlZCBlcnJvci4gKi8KCiAgICBBQUNFTkNfRU5DT0RFX0VPRiAgICAgICAgICAgICA9IDB4MDA4MCAgIC8qITwgRW5kIG9mIGZpbGUgcmVhY2hlZC4gKi8KCn0gQUFDRU5DX0VSUk9SOwoKCi8qKgogKiAgQUFDIGVuY29kZXIgYnVmZmVyIGRlc2NyaXB0b3JzIGlkZW50aWZpZXIuCiAqICBUaGlzIGlkZW50aWZpZXIgYXJlIHVzZWQgd2l0aGluIGJ1ZmZlciBkZXNjcmlwdG9ycyBBQUNFTkNfQnVmRGVzYzo6YnVmZmVySWRlbnRpZmllcnMuCiAqLwp0eXBlZGVmIGVudW0gewogICAgLyogSW5wdXQgYnVmZmVyIGlkZW50aWZpZXIuICovCiAgICBJTl9BVURJT19EQVRBICAgICAgPSAwLCAgICAgICAgICAgICAgICAgIC8qITwgQXVkaW8gaW5wdXQgYnVmZmVyLCBpbnRlcmxlYXZlZCBJTlRfUENNIHNhbXBsZXMuICovCiAgICBJTl9BTkNJTExSWV9EQVRBICAgPSAxLCAgICAgICAgICAgICAgICAgIC8qITwgQW5jaWxsYXJ5IGRhdGEgdG8gYmUgZW1iZWRkZWQgaW50byBiaXRzdHJlYW0uICovCiAgICBJTl9NRVRBREFUQV9TRVRVUCAgPSAyLCAgICAgICAgICAgICAgICAgIC8qITwgU2V0dXAgc3RydWN0dXJlIGZvciBlbWJlZGRpbmcgbWV0YSBkYXRhLiAqLwoKICAgIC8qIE91dHB1dCBidWZmZXIgaWRlbnRpZmllci4gKi8KICAgIE9VVF9CSVRTVFJFQU1fREFUQSA9IDMsICAgICAgICAgICAgICAgICAgLyohPCBCdWZmZXIgaG9sZHMgYml0c3RyZWFtIG91dHB1dCBkYXRhLiAqLwogICAgT1VUX0FVX1NJWkVTICAgICAgID0gNCAgICAgICAgICAgICAgICAgICAvKiE8IEJ1ZmZlciBjb250YWlucyBzaXplcyBvZiBlYWNoIGFjY2VzcyB1bml0LiBUaGlzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbmVjZXNzYXJ5IGZvciBzdXBlcmZyYW1pbmcuICovCgp9IEFBQ0VOQ19CdWZmZXJJZGVudGlmaWVyOwoKCi8qKgogKiAgQUFDIGVuY29kZXIgaGFuZGxlLgogKi8KdHlwZWRlZiBzdHJ1Y3QgQUFDRU5DT0RFUiAqSEFORExFX0FBQ0VOQ09ERVI7CgoKLyoqCiAqICBQcm92aWRlcyBzb21lIGluZm8gYWJvdXQgdGhlIGVuY29kZXIgY29uZmlndXJhdGlvbi4KICovCnR5cGVkZWYgc3RydWN0IHsKCiAgICBVSU5UICAgICAgICAgICAgICAgIG1heE91dEJ1ZkJ5dGVzOyAgICAgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgZW5jb2RlciBiaXRzdHJlYW0gYnl0ZXMgd2l0aGluIG9uZSBmcmFtZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplIGRlcGVuZHMgb24gbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzIGluIGVuY29kZXIgaW5zdGFuY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHN1cGVyZnJhbWluZyAoYXMgdXNlZCBmb3IgZXhhbXBsZSBpbiBEQUIrKSwgc2l6ZSBoYXMgdG8gYmUgYSBtdWx0aXBsZSBhY2NvcmRpbmdseS4gKi8KCiAgICBVSU5UICAgICAgICAgICAgICAgIG1heEFuY0J5dGVzOyAgICAgICAgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgd2hpY2ggY2FuIGJlIGluc2VydGVkIGludG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gd2l0aGluIG9uZSBmcmFtZS4gKi8KCiAgICBVSU5UICAgICAgICAgICAgICAgIGluQnVmRmlsbExldmVsOyAgICAgIC8qITwgSW50ZXJuYWwgaW5wdXQgYnVmZmVyIGZpbGwgbGV2ZWwgaW4gc2FtcGxlcyBwZXIgY2hhbm5lbC4gVGhpcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBpZiBzYW1wbGluZ3JhdGUgb3IgY2hhbm5lbChNb2RlL09yZGVyKSBjaGFuZ2VzLiAqLwoKICAgIFVJTlQgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsczsgICAgICAgLyohPCBOdW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgZXhwZWN0ZWQgaW4gZW5jb2RpbmcgcHJvY2Vzcy4gKi8KCiAgICBVSU5UICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOyAgICAgICAgIC8qITwgQW1vdW50IG9mIGlucHV0IGF1ZGlvIHNhbXBsZXMgY29uc3VtZWQgZWFjaCBmcmFtZSBwZXIgY2hhbm5lbCwgZGVwZW5kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gYXVkaW8gb2JqZWN0IHR5cGUgY29uZmlndXJhdGlvbi4gKi8KCiAgICBVSU5UICAgICAgICAgICAgICAgIGVuY29kZXJEZWxheTsgICAgICAgIC8qITwgQ29kZWMgZGVsYXkgaW4gUENNIHNhbXBsZXMvY2hhbm5lbC4gRGVwZW5kcyBvbiBmcmFtZWxlbmd0aCBhbmQgQU9ULiBEb2VzIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZnJhbWluZyBkZWxheSBmb3IgZmlsbGluZyB1cCBlbmNvZGVyIFBDTSBpbnB1dCBidWZmZXIuICovCgogICAgVUNIQVIgICAgICAgICAgICAgICBjb25mQnVmWzY0XTsgICAgICAgICAvKiE8IENvbmZpZ3VyYXRpb24gYnVmZmVyIGluIGJpbmFyeSBmb3JtYXQgYXMgYW4gQXVkaW9TcGVjaWZpY0NvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFN0cmVhbU11eENvbmZpZyBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIHRyYW5zcG9ydCB0eXBlLiAqLwoKICAgIFVJTlQgICAgICAgICAgICAgICAgY29uZlNpemU7ICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gY29uZkJ1Zi4gKi8KCn0gQUFDRU5DX0luZm9TdHJ1Y3Q7CgoKLyoqCiAqICBEZXNjcmliZXMgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBmb3IgYW4gYWFjRW5jRW5jb2RlKCkgY2FsbC4KICovCnR5cGVkZWYgc3RydWN0IHsKICAgIElOVCAgICAgICAgICAgICAgICAgbnVtQnVmczsgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYnVmZmVycy4gKi8KICAgIHZvaWQgICAgICAgICAgICAgICoqYnVmczsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHZlY3RvciBjb250YWluaW5nIGJ1ZmZlciBhZGRyZXNzZXMuICovCiAgICBJTlQgICAgICAgICAgICAgICAgKmJ1ZmZlcklkZW50aWZpZXJzOyAgIC8qITwgSWRlbnRpZmllciBvZiBlYWNoIGJ1ZmZlciBlbGVtZW50LiBTZWUgOjpBQUNFTkNfQnVmZmVySWRlbnRpZmllci4gKi8KICAgIElOVCAgICAgICAgICAgICAgICAqYnVmU2l6ZXM7ICAgICAgICAgICAgLyohPCBTaXplIG9mIGVhY2ggYnVmZmVyIGluIDgtYml0IGJ5dGVzLiAqLwogICAgSU5UICAgICAgICAgICAgICAgICpidWZFbFNpemVzOyAgICAgICAgICAvKiE8IFNpemUgb2YgZWFjaCBidWZmZXIgZWxlbWVudCBpbiBieXRlcy4gKi8KCn0gQUFDRU5DX0J1ZkRlc2M7CgoKLyoqCiAqICBEZWZpbmVzIHRoZSBpbnB1dCBhcmd1bWVudHMgZm9yIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwuCiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgICBJTlQgICAgICAgICAgICAgICAgIG51bUluU2FtcGxlczsgICAgICAgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGlucHV0IGF1ZGlvIHNhbXBsZXMgKG11bHRpcGxlIG9mIGlucHV0IGNoYW5uZWxzKS4gKi8KICAgIElOVCAgICAgICAgICAgICAgICAgbnVtQW5jQnl0ZXM7ICAgICAgICAgLyohPCBOdW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgdG8gYmUgZW5jb2RlZC4gKi8KCn0gQUFDRU5DX0luQXJnczsKCgovKioKICogIERlZmluZXMgdGhlIG91dHB1dCBhcmd1bWVudHMgZm9yIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwuCiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgICBJTlQgICAgICAgICAgICAgICAgIG51bU91dEJ5dGVzOyAgICAgICAgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGJpdHN0cmVhbSBieXRlcyBnZW5lcmF0ZWQgZHVyaW5nIGFhY0VuY0VuY29kZSgpLiAqLwogICAgSU5UICAgICAgICAgICAgICAgICBudW1JblNhbXBsZXM7ICAgICAgICAvKiE8IE51bWJlciBvZiBpbnB1dCBhdWRpbyBzYW1wbGVzIGNvbnN1bWVkIGJ5IHRoZSBlbmNvZGVyLiAqLwogICAgSU5UICAgICAgICAgICAgICAgICBudW1BbmNCeXRlczsgICAgICAgICAvKiE8IE51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyBjb25zdW1lZCBieSB0aGUgZW5jb2Rlci4gKi8KCn0gQUFDRU5DX091dEFyZ3M7CgoKLyoqCiAqICBNZXRhIERhdGEgQ29tcHJlc3Npb24gUHJvZmlsZXMuCiAqLwp0eXBlZGVmIGVudW0gewogICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT05FICAgICAgICAgID0gMCwgICAvKiE8IE5vbmUuICovCiAgICBBQUNFTkNfTUVUQURBVEFfRFJDX0ZJTE1TVEFOREFSRCAgPSAxLCAgIC8qITwgRmlsbSBzdGFuZGFyZC4gKi8KICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfRklMTUxJR0hUICAgICA9IDIsICAgLyohPCBGaWxtIGxpZ2h0LiAqLwogICAgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ1NUQU5EQVJEID0gMywgICAvKiE8IE11c2ljIHN0YW5kYXJkLiAqLwogICAgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ0xJR0hUICAgID0gNCwgICAvKiE8IE11c2ljIGxpZ2h0LiAqLwogICAgQUFDRU5DX01FVEFEQVRBX0RSQ19TUEVFQ0ggICAgICAgID0gNSAgICAvKiE8IFNwZWVjaC4gKi8KCn0gQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFOwoKCi8qKgogKiAgTWV0YSBEYXRhIHNldHVwIHN0cnVjdHVyZS4KICovCnR5cGVkZWYgc3RydWN0IHsKCiAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIGRyY19wcm9maWxlOyAgICAgICAgICAgICAvKiE8IE1QRUcgRFJDIGNvbXByZXNzaW9uIHByb2ZpbGUuIFNlZSA6OkFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRS4gKi8KICBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgY29tcF9wcm9maWxlOyAgICAgICAgICAgIC8qITwgRVRTSSBoZWF2eSBjb21wcmVzc2lvbiBwcm9maWxlLiBTZWUgOjpBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUuICovCgogIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBkcmNfVGFyZ2V0UmVmTGV2ZWw7ICAgICAgLyohPCBVc2VkIHRvIGRlZmluZSBleHBlY3RlZCBsZXZlbCB0bzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuICovCiAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfVGFyZ2V0UmVmTGV2ZWw7ICAgICAvKiE8IEFkanVzdCBsaW1pdGVyIHRvIGF2b2lkIG92ZXJsb2FkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4gKi8KCiAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dfcmVmX2xldmVsX3ByZXNlbnQ7ICAvKiE8IEZsYWcsIGlmIHByb2dfcmVmX2xldmVsIGlzIHByZXNlbnQgKi8KICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ19yZWZfbGV2ZWw7ICAgICAgICAgIC8qITwgUHJvZ3JhbW1lIFJlZmVyZW5jZSBMZXZlbCA9IERpYWxvZ3VlIExldmVsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzEuNzVkQiAuLiAwIGRCIDsgc3RlcHNpemU6IDAuMjVkQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4qLwoKICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgUENFX21peGRvd25faWR4X3ByZXNlbnQ7IC8qITwgRmxhZywgaWYgZG14LWlkeCBzaG91bGQgYmUgd3JpdHRlbiBpbiBwcm9ncmFtbWUgY29uZmlnIGVsZW1lbnQgKi8KICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgRVRTSV9EbXhMdmxfcHJlc2VudDsgICAgIC8qITwgRmxhZywgaWYgZG14LWx2bCBzaG91bGQgYmUgd3JpdHRlbiBpbiBFVFNJLWFuY0RhdGEgKi8KCiAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlck1peExldmVsOyAgICAgICAgICAvKiE8IENlbnRlciBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLwogIFNDSEFSICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZE1peExldmVsOyAgICAgICAgLyohPCBTdXJyb3VuZCBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLwoKICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgZG9sYnlTdXJyb3VuZE1vZGU7ICAgICAgIC8qITwgSW5kaWNhdGlvbiBmb3IgRG9sYnkgU3Vycm91bmQgRW5jb2RpbmcgTW9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEb2xieSBTdXJyb3VuZCBtb2RlIG5vdCBpbmRpY2F0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiAyLWNoIGF1ZGlvIHBhcnQgaXMgbm90IERvbGJ5IHN1cnJvdW5kIGVuY29kZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiAyLWNoIGF1ZGlvIHBhcnQgaXMgRG9sYnkgc3Vycm91bmQgZW5jb2RlZCAqLwp9IEFBQ0VOQ19NZXRhRGF0YTsKCgovKioKICogQUFDIGVuY29kZXIgY29udHJvbCBmbGFncy4KICoKICogSW4gaW50ZXJhY3Rpb24gd2l0aCB0aGUgOjpBQUNFTkNfQ09OVFJPTF9TVEFURSBwYXJhbWV0ZXIgaXQgaXMgcG9zc2libGUgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbAogKiBpbml0aWFsaXphdGlvbiBwcm9jZXNzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgZnJvbSBleHRlcm4gd2hlbiBuZWNlc3NhcnkuCiAqLwp0eXBlZGVmIGVudW0KewogICAgQUFDRU5DX0lOSVRfTk9ORSAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IERvIG5vdCB0cmlnZ2VyIGluaXRpYWxpemF0aW9uLiAqLwogICAgQUFDRU5DX0lOSVRfQ09ORklHICAgICAgICAgICAgPSAweDAwMDEsICAvKiE8IEluaXRpYWxpemUgYWxsIGVuY29kZXIgbW9kdWxlcyBjb25maWd1cmF0aW9uLiAqLwogICAgQUFDRU5DX0lOSVRfU1RBVEVTICAgICAgICAgICAgPSAweDAwMDIsICAvKiE8IFJlc2V0IGFsbCBlbmNvZGVyIG1vZHVsZXMgaGlzdG9yeSBidWZmZXIuICovCiAgICBBQUNFTkNfSU5JVF9UUkFOU1BPUlQgICAgICAgICA9IDB4MTAwMCwgIC8qITwgSW5pdGlhbGl6ZSB0cmFuc3BvcnQgbGliIHdpdGggbmV3IHBhcmFtZXRlcnMuICovCiAgICBBQUNFTkNfUkVTRVRfSU5CVUZGRVIgICAgICAgICA9IDB4MjAwMCwgIC8qITwgUmVzZXQgZmlsbCBsZXZlbCBvZiBpbnRlcm5hbCBpbnB1dCBidWZmZXIuICovCiAgICBBQUNFTkNfSU5JVF9BTEwgICAgICAgICAgICAgICA9IDB4RkZGRiAgIC8qITwgSW5pdGlhbGl6ZSBhbGwuICovCn0KQUFDRU5DX0NUUkxGTEFHUzsKCgovKioKICogXGJyaWVmICBBQUMgZW5jb2RlciBzZXR0aW5nIHBhcmFtZXRlcnMuCiAqCiAqIFVzZSBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZnVuY3Rpb24gdG8gY29uZmlndXJlLCBvciB1c2UgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGZ1bmN0aW9uIHRvIHJlYWQKICogdGhlIGludGVybmFsIHN0YXR1cyBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMuCiAqLwp0eXBlZGVmIGVudW0KewogIEFBQ0VOQ19BT1QgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDAsICAvKiE8IEF1ZGlvIG9iamVjdCB0eXBlLiBTZWUgOjpBVURJT19PQkpFQ1RfVFlQRSBpbiBGREtfYXVkaW8uaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IE1QRUctNCBBQUMgTG93IENvbXBsZXhpdHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA1OiBNUEVHLTQgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiAoSEUtQUFDKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI5OiBNUEVHLTQgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBhbmQgUGFyYW1ldHJpYyBTdGVyZW8gKEhFLUFBQyB2MikuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb25maWd1cmF0aW9uIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBzdGVyZW8gaW5wdXQgYXVkaW8gZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDIzOiBNUEVHLTQgQUFDIExvdy1EZWxheS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDM5OiBNUEVHLTQgQUFDIEVuaGFuY2VkIExvdy1EZWxheS4gU2luY2UgdGhlcmUgaXMgbm8gOjpBVURJT19PQkpFQ1RfVFlQRSBmb3IgRUxEIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gd2l0aCBTQlIgZGVmaW5lZCwgZW5hYmxlIFNCUiBleHBsaWNpdGVseSBieSA6OkFBQ0VOQ19TQlJfTU9ERSBwYXJhbWV0ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMjk6IE1QRUctMiBBQUMgTG93IENvbXBsZXhpdHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMzI6IE1QRUctMiBBQUMgTG93IENvbXBsZXhpdHkgd2l0aCBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIChIRS1BQUMpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTU2OiBNUEVHLTIgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBhbmQgUGFyYW1ldHJpYyBTdGVyZW8gKEhFLUFBQyB2MikuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCBvbmx5IHdpdGggc3RlcmVvIGlucHV0IGF1ZGlvIGRhdGEuICovCgogIEFBQ0VOQ19CSVRSQVRFICAgICAgICAgICAgICAgICAgPSAweDAxMDEsICAvKiE8IFRvdGFsIGVuY29kZXIgYml0cmF0ZS4gVGhpcyBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5IGFuZCBpbnRlcmFjdHMgd2l0aCA6OkFBQ0VOQ19CSVRSQVRFTU9ERS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIENCUjogQml0cmF0ZSBpbiBiaXRzL3NlY29uZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBccmVmIHN1cHBCaXRyYXRlcyBmb3IgZGV0YWlscy4gKi8KCiAgQUFDRU5DX0JJVFJBVEVNT0RFICAgICAgICAgICAgICA9IDB4MDEwMiwgIC8qITwgQml0cmF0ZSBtb2RlLiBDb25maWd1cmF0aW9uIGNhbiBiZSBkaWZmZXJlbnQga2luZCBvZiBiaXRyYXRlIGNvbmZpZ3VyYXRpb25zOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogQ29uc3RhbnQgYml0cmF0ZSwgdXNlIGJpdHJhdGUgYWNjb3JkaW5nIHRvIDo6QUFDRU5DX0JJVFJBVEUuIChkZWZhdWx0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l0aGluIG5vbmUgTEQvRUxEIDo6QVVESU9fT0JKRUNUX1RZUEUsIHRoZSBDQlIgbW9kZSBtYWtlcyB1c2Ugb2YgZnVsbCBhbGxvd2VkIGJpdHJlc2Vydm9pci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGNvbnRyYXN0LCBhdCBMb3ctRGVsYXkgOjpBVURJT19PQkpFQ1RfVFlQRSB0aGUgYml0cmVzZXJ2b2lyIGlzIGtlcHQgdmVyeSBzbWFsbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDg6IExEL0VMRCBmdWxsIGJpdHJlc2Vydm9pciBmb3IgcGFja2V0IGJhc2VkIHRyYW5zbWlzc2lvbi4gKi8KCiAgQUFDRU5DX1NBTVBMRVJBVEUgICAgICAgICAgICAgICA9IDB4MDEwMywgIC8qITwgQXVkaW8gaW5wdXQgZGF0YSBzYW1wbGluZyByYXRlLiBFbmNvZGVyIHN1cHBvcnRzIGZvbGxvd2luZyBzYW1wbGluZyByYXRlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDY0MDAwLCA4ODIwMCwgOTYwMDAgKi8KCiAgQUFDRU5DX1NCUl9NT0RFICAgICAgICAgICAgICAgICA9IDB4MDEwNCwgIC8qITwgQ29uZmlndXJlIFNCUiBpbmRlcGVuZGVudGx5IG9mIHRoZSBjaG9zZW4gQXVkaW8gT2JqZWN0IFR5cGUgOjpBVURJT19PQkpFQ1RfVFlQRTouCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBhdmFpbGFibGUgZm9yIEVMRC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERpc2FibGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uLiAqLwoKICBBQUNFTkNfR1JBTlVMRV9MRU5HVEggICAgICAgICAgID0gMHgwMTA1LCAgLyohPCBDb3JlIGVuY29kZXIgKEFBQykgYXVkaW8gZnJhbWUgbGVuZ3RoIGluIHNhbXBsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMDI0OiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA1MTI6IERlZmF1bHQgTEQvRUxEIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA0ODA6IE9wdGlvbmFsIGxlbmd0aCBpbiBMRC9FTEQgY29uZmlndXJhdGlvbi4gKi8KCiAgQUFDRU5DX0NIQU5ORUxNT0RFICAgICAgICAgICAgICA9IDB4MDEwNiwgIC8qITwgU2V0IGV4cGxpY2l0IGNoYW5uZWwgbW9kZS4gQ2hhbm5lbCBtb2RlIG11c3QgbWF0Y2ggd2l0aCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxLTY6IE1QRUcgY2hhbm5lbCBtb2RlcyBzdXBwb3J0ZWQsIHNlZSA6OkNIQU5ORUxfTU9ERSBpbiBGREtfYXVkaW8uaC4gKi8KCiAgQUFDRU5DX0NIQU5ORUxPUkRFUiAgICAgICAgICAgICA9IDB4MDEwNywgIC8qITwgSW5wdXQgYXVkaW8gZGF0YSBjaGFubmVsIG9yZGVyaW5nIHNjaGVtZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE1QRUcgY2hhbm5lbCBvcmRlcmluZyAoZS4gZy4gNS4xOiBDLCBMLCBSLCBTTCwgU1IsIExGRSkuIChkZWZhdWx0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogV0FWRSBmaWxlIGZvcm1hdCBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEwsIFIsIEMsIExGRSwgU0wsIFNSKS4gKi8KCiAgQUFDRU5DX0FGVEVSQlVSTkVSICAgICAgICAgICAgICA9IDB4MDIwMCwgIC8qITwgVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHVzZSBvZiB0aGUgYWZ0ZXJidXJuZXIgZmVhdHVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYWZ0ZXJidXJuZXIgaXMgYSB0eXBlIG9mIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcyBhbGdvcml0aG0gd2hpY2ggaW5jcmVhc2VzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHF1YWxpdHkgYnV0IGFsc28gdGhlIHJlcXVpcmVkIHByb2Nlc3NpbmcgcG93ZXIuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGFsd2F5cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlIHRoaXMgaWYgYWRkaXRpb25hbCBtZW1vcnkgY29uc3VtcHRpb24gYW5kIHByb2Nlc3NpbmcgcG93ZXIgY29uc3VtcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgYSBwcm9ibGVtLiBJZiBpbmNyZWFzZWQgTUh6IGFuZCBtZW1vcnkgY29uc3VtcHRpb24gYXJlIGFuIGlzc3VlIHRoZW4gdGhlIE1IegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBtZW1vcnkgY29zdCBvZiB0aGlzIG9wdGlvbmFsIG1vZHVsZSBuZWVkIHRvIGJlIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZSBpbXByb3ZlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGF1ZGlvIHF1YWxpdHkgb24gYSBjYXNlIGJ5IGNhc2UgYmFzaXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEaXNhYmxlIGFmdGVyYnVybmVyIChkZWZhdWx0KS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBhZnRlcmJ1cm5lci4gKi8KCiAgQUFDRU5DX0JBTkRXSURUSCAgICAgICAgICAgICAgICA9IDB4MDIwMywgIC8qITwgQ29yZSBlbmNvZGVyIGF1ZGlvIGJhbmR3aWR0aDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERldGVybWluZSBiYW5kd2lkdGggaW50ZXJuYWxseSAoZGVmYXVsdCwgc2VlIGNoYXB0ZXIgXHJlZiBCRUhBVklPVVJfQkFORFdJRFRIKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgdG8gZnMvMjogRnJlcXVlbmN5IGJhbmR3aWR0aCBpbiBIZXJ0ei4gKEV4cGVydHMgb25seSwgYmV0dGVyIGRvIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VjaCB0aGlzIHZhbHVlIHRvIGF2b2lkIGRlZ3JhZGVkIGF1ZGlvIHF1YWxpdHkpICovCgogIEFBQ0VOQ19UUkFOU01VWCAgICAgICAgICAgICAgICAgPSAweDAzMDAsICAvKiE8IFRyYW5zcG9ydCB0eXBlIHRvIGJlIHVzZWQuIFNlZSA6OlRSQU5TUE9SVF9UWVBFIGluIEZES19hdWRpby5oLiBGb2xsb3dpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyBjYW4gYmUgY29uZmlndXJlZCBpbiBlbmNvZGVyIGxpYnJhcnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiByYXcgYWNjZXNzIHVuaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBBRElGIGJpdHN0cmVhbSBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEFEVFMgYml0c3RyZWFtIGZvcm1hdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNjogQXVkaW8gTXV4IEVsZW1lbnRzIChMQVRNKSB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA3OiBBdWRpbyBNdXggRWxlbWVudHMgKExBVE0pIHdpdGggbXV4Q29uZmlnUHJlc2VudCA9IDAsIG91dCBvZiBiYW5kIFN0cmVhbU11eENvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTA6IEF1ZGlvIFN5bmMgU3RyZWFtIChMT0FTKSAqLwoKICBBQUNFTkNfSEVBREVSX1BFUklPRCAgICAgICAgICAgID0gMHgwMzAxLCAgLyohPCBGcmFtZSBjb3VudCBwZXJpb2QgZm9yIHNlbmRpbmcgaW4tYmFuZCBjb25maWd1cmF0aW9uIGJ1ZmZlcnMgd2l0aGluIExBVE0vTE9BUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBsYXllci4gQWRkaXRpb25hbGx5IHRoaXMgcGFyYW1ldGVyIGNvbmZpZ3VyZXMgdGhlIFBDRSByZXBldGl0aW9uIHBlcmlvZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHJhd19kYXRhX2Jsb2NrKCkuIFNlZSBccmVmIGVuY1BDRS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4RkY6IGF1dG8tbW9kZSBkZWZhdWx0IDEwIGZvciBUVF9NUDRfQURUUywgVFRfTVA0X0xPQVMgYW5kIFRUX01QNF9MQVRNX01DUDEsIG90aGVyd2lzZSAwLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbjogRnJhbWUgY291bnQgcGVyaW9kLiAqLwoKICBBQUNFTkNfU0lHTkFMSU5HX01PREUgICAgICAgICAgID0gMHgwMzAyLCAgLyohPCBTaWduYWxpbmcgbW9kZSBvZiB0aGUgZXh0ZW5zaW9uIEFPVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IEltcGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgc2lnbmFsaW5nLiAoZGVmYXVsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEV4cGxpY2l0IFNCUiBhbmQgaW1wbGljaXQgUFMgc2lnbmFsaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogRXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZy4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHVzZSBvZiBiYWNrd2FyZC1jb21wYXRpYmxlIGltcGxpY2l0IHNpZ25hbGluZyBpcyByZWNvbW1lbmRlZCBpZiB0aGUgdXNlciBzcGVjaWNhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWltcyBhdCBwcmVzZXJ2aW5nIGNvbXBhdGliaWxpdHkgd2l0aCBkZWNvZGVycyBvbmx5IGNhcGFibGUgb2YgZGVjb2RpbmcgQUFDLUxDLiBPdGhlcndpc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Ugbm9uLWJhY2t3YXJkLWNvbXBhdGlibGUgZXhwbGljaXQgc2lnbmFsaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbSBmb3JtYXRzIEFEVFMgYW5kIEFESUYgY2FuIG9ubHkgZG8gaW1wbGljaXQgc2lnbmFsaW5nLiAqLwoKICBBQUNFTkNfVFBTVUJGUkFNRVMgICAgICAgICAgICAgID0gMHgwMzAzLCAgLyohPCBOdW1iZXIgb2Ygc3ViIGZyYW1lcyBpbiBhIHRyYW5zcG9ydCBmcmFtZSBmb3IgTE9BUy9MQVRNIG9yIEFEVFMgKGRlZmF1bHQgMSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBRFRTOiBNYXhpbXVtIG51bWJlciBvZiBzdWIgZnJhbWVzIHJlc3RyaWN0ZWQgdG8gNC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIExPQVMvTEFUTTogTWF4aW11bSBudW1iZXIgb2Ygc3ViIGZyYW1lcyByZXN0cmljdGVkIHRvIDIuKi8KCiAgQUFDRU5DX1BST1RFQ1RJT04gICAgICAgICAgICAgICA9IDB4MDMwNiwgIC8qITwgQ29uZmlndXJlIHByb3RlY3Rpb24gaW4gdHJhbnBzb3J0IGxheWVyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogTm8gcHJvdGVjdGlvbi4gKGRlZmF1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBDUkMgYWN0aXZlIGZvciBBRFRTIGJpdHN0cmVhbSBmb3JtYXQuICovCgogIEFBQ0VOQ19BTkNJTExBUllfQklUUkFURSAgICAgICAgPSAweDA1MDAsICAvKiE8IENvbnN0YW50IGFuY2lsbGFyeSBkYXRhIGJpdHJhdGUgaW4gYml0cy9zZWNvbmQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBFaXRoZXIgbm8gYW5jaWxsYXJ5IGRhdGEgb3IgaW5zZXJ0IGV4YWN0IG51bWJlciBvZiBieXRlcywgZGVub3RlZCB2aWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IHBhcmFtZXRlciwgbnVtQW5jQnl0ZXMgaW4gQUFDRU5DX0luQXJncy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGVsc2U6IEluc2VydCBhbmNpbGxhcnkgZGF0YSB3aXRoIHNwZWNpZmllZCBiaXRyYXRlLiAqLwoKICBBQUNFTkNfTUVUQURBVEFfTU9ERSAgICAgICAgICAgID0gMHgwNjAwLCAgLyohPCBDb25maWd1cmUgTWV0YSBEYXRhLiBTZWUgOjpBQUNFTkNfTWV0YURhdGEgZm9yIGZ1cnRoZXIgZGV0YWlsczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERvIG5vdCBlbWJlZCBhbnkgbWV0YWRhdGEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFbWJlZCBNUEVHIGRlZmluZWQgbWV0YWRhdGEgb25seS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEVtYmVkIGFsbCBtZXRhZGF0YS4gKi8KCiAgQUFDRU5DX0NPTlRST0xfU1RBVEUgICAgICAgICAgICA9IDB4RkYwMCwgIC8qITwgVGhlcmUgaXMgYW4gYXV0b21hdGljIHByb2Nlc3Mgd2hpY2ggaW50ZXJuYWxseSByZWNvbmZpZ3VyZXMgdGhlIGVuY29kZXIgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgY2hhbmdlZCBvciBhbiBlcnJvciBvY2N1cmVkLiBUaGlzIHBhcmFtZXJ0ZXIgYWxsb3dzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRpbmcgb3IgZ2V0dGluZyB0aGUgY29udHJvbCBzdGF0dXMgb2YgdGhpcyBwcm9jZXNzLiBTZWUgOjpBQUNFTkNfQ1RSTEZMQUdTLiAqLwoKICBBQUNFTkNfTk9ORSAgICAgICAgICAgICAgICAgICAgID0gMHhGRkZGICAgLyohPCAtLS0tLS0gKi8KCn0gQUFDRU5DX1BBUkFNOwoKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmCgovKioKICogXGJyaWVmICBPcGVuIGFuIGluc3RhbmNlIG9mIHRoZSBlbmNvZGVyLgogKgogKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBhIGZ1bmN0aW9uYWwgcmFuZ2UgZGVub3RlZCBieSB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy4KICogUHJlaW5pdGlhbGl6ZSBlbmNvZGVyIGluc3RhbmNlIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLgogKgogKiBccGFyYW0gcGhBYWNFbmNvZGVyICBBIHBvaW50ZXIgdG8gYW4gZW5jb2RlciBoYW5kbGUuIEluaXRpYWxpemVkIG9uIHJldHVybi4KICogXHBhcmFtIGVuY01vZHVsZXMgICAgU3BlY2lmeSBlbmNvZGVyIG1vZHVsZXMgdG8gYmUgc3VwcG9ydGVkIGluIHRoaXMgZW5jb2RlciBpbnN0YW5jZToKICogICAgICAgICAgICAgICAgICAgICAgLSAweDA6IEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIGF2YWlsYWJsZSBlbmNvZGVyIG1vZHVsZXMuCiAqICAgICAgICAgICAgICAgICAgICAgIC0gZWxzZTogU2VsZWN0IG1lbW9yeSBhbGxvY2F0aW9uIHJlZ2FyZGluZyBlbmNvZGVyIG1vZHVsZXMuIEZvbGxvd2luZyBmbGFncyBhcmUgcG9zc2libGUgYW5kIGNhbiBiZSBjb21iaW5lZC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MDE6IEFBQyBtb2R1bGUuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDAyOiBTQlIgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMHgwNDogUFMgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMHgxMDogTWV0YWRhdGEgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZXhhbXBsZTogKDB4MDF8MHgwMnwweDA0fDB4MTApIGFsbG9jYXRlcyBhbGwgbW9kdWxlcyBhbmQgaXMgZXF1aXZhbGVudCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZGVub3RldCBieSAweDAuCiAqIFxwYXJhbSBtYXhDaGFubmVscyAgIE51bWJlciBvZiBjaGFubmVscyB0byBiZSBhbGxvY2F0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzOgogKiAgICAgICAgICAgICAgICAgICAgICAtIDA6IEFsbG9jYXRlIG1heGltdW0gbnVtYmVyIG9mIEFBQyBhbmQgU0JSIGNoYW5uZWxzIGFzIHN1cHBvcnRlZCBieSB0aGUgbGlicmFyeS4KICogICAgICAgICAgICAgICAgICAgICAgLSBuQ2hhbm5lbHM6IFVzZSBzYW1lIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBpbiBBQUMgYW5kIFNCUiBtb2R1bGUuCiAqICAgICAgICAgICAgICAgICAgICAgIC0gbkNoYW5uZWxzIHwgKG5TYnJDaDw8OCk6IE51bWJlciBvZiBTQlIgY2hhbm5lbHMgY2FuIGJlIGRpZmZlcmVudCB0byBBQUMgY2hhbm5lbHMgdG8gc2F2ZSBkYXRhIG1lbW9yeS4KICoKICogXHJldHVybgogKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2VzLgogKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX01FTU9SWV9FUlJPUiwgQUFDRU5DX0lOVkFMSURfQ09ORklHLCBvbiBmYWlsdXJlLgogKi8KQUFDRU5DX0VSUk9SIGFhY0VuY09wZW4oCiAgICAgICAgSEFORExFX0FBQ0VOQ09ERVIgICAgICAgICpwaEFhY0VuY29kZXIsCiAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICBlbmNNb2R1bGVzLAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgbWF4Q2hhbm5lbHMKICAgICAgICApOwoKCi8qKgogKiBcYnJpZWYgIENsb3NlIHRoZSBlbmNvZGVyIGluc3RhbmNlLgogKgogKiBEZWFsbG9jYXRlIGVuY29kZXIgaW5zdGFuY2UgYW5kIGZyZWUgd2hvbGUgbWVtb3J5LgogKgogKiBccGFyYW0gcGhBYWNFbmNvZGVyICBQb2ludGVyIHRvIHRoZSBlbmNvZGVyIGhhbmRsZSB0byBiZSBkZWFsbG9jYXRlZC4KICoKICogXHJldHVybgogKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2Vzcy4KICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIG9uIGZhaWx1cmUuCiAqLwpBQUNFTkNfRVJST1IgYWFjRW5jQ2xvc2UoCiAgICAgICAgSEFORExFX0FBQ0VOQ09ERVIgICAgICAgICpwaEFhY0VuY29kZXIKICAgICAgICApOwoKCi8qKgogKiBcYnJpZWYgRW5jb2RlIGF1ZGlvIGRhdGEuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IGZvciBlbmNvZGluZyBhdWRpbyBkYXRhLiBJbiBhZGRpdGlvbiB0aGUgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFuIGVuY29kZXIgKHJlKWNvbmZpZ3VyYXRpb24KICogcHJvY2Vzcy4KICogLSBQQ00gaW5wdXQgZGF0YSB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIGV4dGVybmFsIGlucHV0IGJ1ZmZlciB1bnRpbCB0aGUgZmlsbCBsZXZlbCBhbGxvd3MgZW5jb2RpbmcgYSBzaW5nbGUgZnJhbWUuCiAqICAgVGhpcyBmdW5jdGlvbmFsaXR5IGFsbG93cyBhbiBleHRlcm5hbCBidWZmZXIgd2l0aCByZWR1Y2VkIHNpemUgaW4gY29tcGFyaXNvbiB0byB0aGUgQUFDIG9yIEhFLUFBQyBhdWRpbyBmcmFtZSBsZW5ndGguCiAqIC0gSWYgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBzYW1wbGVzIGFyZ3VtZW50IGlzIHplcm8sIGp1c3QgaW50ZXJuYWwgcmVpbml0aWFsaXphdGlvbiB3aWxsIGJlIGFwcGxpZWQgaWYgaXQgaXMKICogICByZXF1ZXN0ZWQuCiAqIC0gQXQgdGhlIGVuZCBvZiBhIGZpbGUgdGhlIGZsdXNoaW5nIHByb2Nlc3MgY2FuIGJlIHRyaWdnZXJkIHZpYSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmd1bWVudCB0byAtMS4KICogICBUaGUgZW5jb2RlciBkZWxheSBsaW5lcyBhcmUgZnVsbHkgZmx1c2hlZCB3aGVuIHRoZSBlbmNvZGVyIHJldHVybnMgbm8gdmFsaWQgYml0c3RyZWFtIGRhdGEgQUFDRU5DX091dEFyZ3M6Om51bU91dEJ5dGVzLgogKiAgIEZ1cnRoZXJtb3JlIHRoZSBlbmQgb2YgZmlsZSBpcyBzaWduYWxlZCBieSB0aGUgcmV0dXJuIHZhbHVlIEFBQ0VOQ19FTkNPREVfRU9GLgogKiAtIElmIGFuIGVycm9yIG9jY3VyZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lIG9yIGFueSBvZiB0aGUgZW5jb2RlciBwYXJhbWV0ZXJzIGNoYW5nZWQsIGFuIGludGVybmFsIHJlaW5pdGlhbGl6YXRpb24KICogICBwcm9jZXNzIHdpbGwgYmUgYXBwbGllZCBiZWZvcmUgZW5jb2RpbmcgdGhlIGluY29taW5nIGF1ZGlvIHNhbXBsZXMuCiAqIC0gVGhlIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgZm9yIGFuIGluZGVwZW5kZW50IHJlY29uZmlndXJhdGlvbiBwcm9jZXNzIHdpdGhvdXQgZW5jb2RpbmcuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzIHRvIGJlIGEKICogICB2YWxpZCBlbmNvZGVyIGhhbmRsZSBhbmQgYWxsIG90aGVyIHBhcmFtZXRlcnMgY2FuIGJlIHNldCB0byBOVUxMLgogKiAtIElmIHRoZSBzaXplIG9mIHRoZSBleHRlcm5hbCBiaXRidWZmZXIgaW4gb3V0QnVmRGVzYyBpcyBub3Qgc3VmZmljaWVudCBmb3Igd3JpdGluZyB0aGUgd2hvbGUgYml0c3RyZWFtLCBhbiBpbnRlcm5hbAogKiAgIGVycm9yIHdpbGwgYmUgdGhlIHJldHVybiB2YWx1ZSBhbmQgYSByZWNvbmZpZ3VyYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQuCiAqCiAqIFxwYXJhbSBoQWFjRW5jb2RlciAgICAgICAgICAgQSB2YWxpZCBBQUMgZW5jb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBpbkJ1ZkRlc2MgICAgICAgICAgICAgSW5wdXQgYnVmZmVyIGRlc2NyaXB0b3IsIHNlZSBBQUNFTkNfQnVmRGVzYzoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEF0IGxlYXN0IG9uZSBpbnB1dCBidWZmZXIgd2l0aCBhdWRpbyBkYXRhIGlzIGV4cGVjdGVkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gT3B0aW9uYWxseSBhIHNlY29uZCBpbnB1dCBidWZmZXIgd2l0aCBhbmNpbGxhcnkgZGF0YSBjYW4gYmUgZmVkLgogKiBccGFyYW0gb3V0QnVmRGVzYyAgICAgICAgICAgIE91dHB1dCBidWZmZXIgZGVzY3JpcHRvciwgc2VlIEFBQ0VOQ19CdWZEZXNjOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBvbmUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIGVuY29kZWQgYml0c3RyZWFtLgogKiBccGFyYW0gaW5hcmdzICAgICAgICAgICAgICAgIElucHV0IGFyZ3VtZW50cywgc2VlIEFBQ0VOQ19JbkFyZ3MuCiAqIFxwYXJhbSBvdXRhcmdzICAgICAgICAgICAgICAgT3V0cHV0IGFyZ3VtZW50cywgQUFDRU5DX091dEFyZ3MuCiAqCiAqIFxyZXR1cm4KICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCiAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfRU5DT0RFX0VSUk9SLCBvbiBmYWlsdXJlIGluIGVuY29kaW5nIHByb2Nlc3MuCiAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfQ09ORklHLCBBQUNFTkNfSU5JVF9FUlJPUiwgQUFDRU5DX0lOSVRfQUFDX0VSUk9SLCBBQUNFTkNfSU5JVF9TQlJfRVJST1IsIEFBQ0VOQ19JTklUX1RQX0VSUk9SLAogKiAgICAgICAgICAgIEFBQ0VOQ19JTklUX01FVEFfRVJST1IsIG9uIGZhaWx1cmUgaW4gZW5jb2RlciBpbml0aWFsaXphdGlvbi4KICogICAgICAgICAgLSBBQUNFTkNfRU5DT0RFX0VPRiwgd2hlbiBmbHVzaGluZyBmdWxseSBjb25jbHVkZWQuCiAqLwpBQUNFTkNfRVJST1IgYWFjRW5jRW5jb2RlKAogICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCiAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgICAgICppbkJ1ZkRlc2MsCiAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgICAgICpvdXRCdWZEZXNjLAogICAgICAgIGNvbnN0IEFBQ0VOQ19JbkFyZ3MgICAgICAqaW5hcmdzLAogICAgICAgIEFBQ0VOQ19PdXRBcmdzICAgICAgICAgICAqb3V0YXJncwogICAgICAgICk7CgoKLyoqCiAqIFxicmllZiAgQWNxdWlyZSBpbmZvIGFib3V0IHByZXNlbnQgZW5jb2RlciBpbnN0YW5jZS4KICoKICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgaW5mb3JtYXRpb24gb2YgdGhlIGVuY29kZXIgY29uZmlndXJhdGlvbi4gSW4gYWRkaXRpb24gdG8gaW5mb3JtYXRpdmUgaW50ZXJuYWwgc3RhdGVzLAogKiBhIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9jayBvZiB0aGUgY3VycmVudCBlbmNvZGVyIHNldHRpbmdzIHdpbGwgYmUgcmV0dXJuZWQuIFRoZSBmb3JtYXQgaXMgZWl0aGVyIEF1ZGlvIFNwZWNpZmljIENvbmZpZwogKiBpbiBjYXNlIG9mIFJhdyBQYWNrZXRzIHRyYW5zcG9ydCBmb3JtYXQgb3IgU3RyZWFtTXV4Q29uZmlnIGluIGNhc2Ugb2YgTE9BUy9MQVRNIHRyYW5zcG9ydCBmb3JtYXQuIFRoZSBjb25maWd1cmF0aW9uCiAqIGRhdGEgYmxvY2sgaXMgYmluYXJ5IGNvZGVkIGFzIHNwZWNpZmllZCBpbiBJU08vSUVDIDE0NDk2LTMgKE1QRUctNCBhdWRpbyksIHRvIGJlIHVzZWQgZGlyZWN0bHkgZm9yIE1QRUctNCBGaWxlIEZvcm1hdAogKiBvciBSRkMzMDE2IG9yIFJGQzM2NDAgYXBwbGljYXRpb25zLgogKgogKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgogKiBccGFyYW0gcEluZm8gICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gQUFDRU5DX0luZm9TdHJ1Y3QuIEZpbGxlZCBvbiByZXR1cm4uCiAqCiAqIFxyZXR1cm4KICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlcy4KICogICAgICAgICAgLSBBQUNFTkNfSU5JVF9FUlJPUiwgb24gZmFpbHVyZS4KICovCkFBQ0VOQ19FUlJPUiBhYWNFbmNJbmZvKAogICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCiAgICAgICAgQUFDRU5DX0luZm9TdHJ1Y3QgICAgICAgICpwSW5mbwogICAgICAgICk7CgoKLyoqCiAqIFxicmllZiAgU2V0IG9uZSBzaW5nbGUgQUFDIGVuY29kZXIgcGFyYW1ldGVyLgogKgogKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjb25maWd1cmF0aW9uIG9mIGFsbCBlbmNvZGVyIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIDo6QUFDRU5DX1BBUkFNLiBFYWNoIHBhcmFtZXRlciBtdXN0IGJlCiAqIHNldCB3aXRoIGEgc2VwYXJhdGUgZnVuY3Rpb24gY2FsbC4gQW4gaW50ZXJuYWwgdmFsaWRhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSByYW5nZSB3aWxsIGJlIGRvbmUgYW5kIGFuCiAqIGludGVybmFsIHJlY29uZmlndXJhdGlvbiB3aWxsIGJlIHNpZ25hbGVkLiBUaGUgYWN0dWFsIGNvbmZpZ3VyYXRpb24gYWRvcHRpb24gaXMgcGFydCBvZiB0aGUgc3Vic2VxdWVudCBhYWNFbmNFbmNvZGUoKSBjYWxsLgogKgogKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgogKiBccGFyYW0gcGFyYW0gICAgICAgICAgICAgICAgIFBhcmFtZXRlciB0byBiZSBzZXQuIFNlZSA6OkFBQ0VOQ19QQVJBTS4KICogXHBhcmFtIHZhbHVlICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgdmFsdWUuIFNlZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gaW4gOjpBQUNFTkNfUEFSQU0uCiAqCiAqIFxyZXR1cm4KICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCiAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSLCBBQUNFTkNfSU5WQUxJRF9DT05GSUcsIG9uIGZhaWx1cmUuCiAqLwpBQUNFTkNfRVJST1IgYWFjRW5jb2Rlcl9TZXRQYXJhbSgKICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAogICAgICAgIGNvbnN0IEFBQ0VOQ19QQVJBTSAgICAgICAgcGFyYW0sCiAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICB2YWx1ZQogICAgICAgICk7CgoKLyoqCiAqIFxicmllZiAgR2V0IG9uZSBzaW5nbGUgQUFDIGVuY29kZXIgcGFyYW1ldGVyLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjb21wbGVtZW50IHRvIGFhY0VuY29kZXJfU2V0UGFyYW0oKS4gQWZ0ZXIgZW5jb2RlciByZWluaXRpYWxpemF0aW9uIHdpdGggdXNlciBkZWZpbmVkIHNldHRpbmdzLAogKiB0aGUgaW50ZXJuYWwgc3RhdHVzIGNhbiBiZSBvYnRhaW5lZCBvZiBlYWNoIHBhcmFtZXRlciwgc3BlY2lmaWVkIHdpdGggOjpBQUNFTkNfUEFSQU0uCiAqCiAqIFxwYXJhbSBoQWFjRW5jb2RlciAgICAgICAgICAgQSB2YWxpZCBBQUMgZW5jb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBwYXJhbSAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHRvIGJlIHJldHVybmVkLiBTZWUgOjpBQUNFTkNfUEFSQU0uCiAqCiAqIFxyZXR1cm4gIEludGVybmFsIGNvbmZpZ3VyYXRpb24gdmFsdWUgb2Ygc3BlY2lmZWQgcGFyYW1ldGVyIDo6QUFDRU5DX1BBUkFNLgogKi8KVUlOVCBhYWNFbmNvZGVyX0dldFBhcmFtKAogICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCiAgICAgICAgY29uc3QgQUFDRU5DX1BBUkFNICAgICAgICBwYXJhbQogICAgICAgICk7CgoKLyoqCiAqIFxicmllZiAgR2V0IGluZm9ybWF0aW9uIGFib3V0IGVuY29kZXIgbGlicmFyeSBidWlsZC4KICoKICogRmlsbCBhIGdpdmVuIExJQl9JTkZPIHN0cnVjdHVyZSB3aXRoIGxpYnJhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbi4KICoKICogXHBhcmFtIGluZm8gIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdC4KICoKICogXHJldHVybgogKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2Vzcy4KICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIEFBQ0VOQ19JTklUX0VSUk9SLCBvbiBmYWlsdXJlLgogKi8KQUFDRU5DX0VSUk9SIGFhY0VuY0dldExpYkluZm8oCiAgICAgICAgTElCX0lORk8gICAgICAgICAgICAgICAgICppbmZvCiAgICAgICAgKTsKCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAgIC8qIF9BQUNfRU5DX0xJQl9IXyAqLwo=