Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioKICogXGZpbGUgICBhYWNkZWNvZGVyX2xpYi5oCiAqIFxicmllZiAgRkRLIEFBQyBkZWNvZGVyIGxpYnJhcnkgaW50ZXJmYWNlIGhlYWRlciBmaWxlLgogKgoKXHBhZ2UgSU5UUk8gSW50cm9kdWN0aW9uCgpcc2VjdGlvbiBTQ09QRSBTY29wZQoKVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGFuZCB1c2FnZSBvZiB0aGUgSVNPL01QRUctMi80IEFBQyBEZWNvZGVyCmxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4KRGVwZW5kaW5nIG9uIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24sIGl0IGltcGxlbWVudHMgZGVjb2Rpbmcgb2YgQUFDLUxDIChMb3ctQ29tcGxleGl0eSksCkhFLUFBQyAoSGlnaC1FZmZpY2llbmN5IEFBQywgdjEgYW5kIHYyKSwgQUFDLUxEIChMb3ctRGVsYXkpIGFuZCBBQUMtRUxEIChFbmhhbmNlZCBMb3ctRGVsYXkpLgoKQWxsIHJlZmVyZW5jZXMgdG8gU0JSIChTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFLUFBQyBhbmQgQUFDLUVMRAp2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4gQWxsIHJlZmVyZW5jZXMgdG8gUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvCkhFLUFBQyB2MiB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4KClxzZWN0aW9uIERlY29kZXJCYXNpY3MgRGVjb2RlciBCYXNpY3MKClRoaXMgZG9jdW1lbnQgY2FuIG9ubHkgZ2l2ZSBhIHJvdWdoIG92ZXJ2aWV3IGFib3V0IHRoZSBJU08vTVBFRy0yIGFuZCBJU08vTVBFRy00IEFBQyBhdWRpbwpjb2Rpbmcgc3RhbmRhcmQuIFRvIHVuZGVyc3RhbmQgYWxsIHRoZSB0ZXJtcyBpbiB0aGlzIGRvY3VtZW50LCB5b3UgYXJlIGVuY291cmFnZWQgdG8gcmVhZAp0aGUgZm9sbG93aW5nIGRvY3VtZW50cy4KCi0gSVNPL0lFQyAxMzgxOC03IChNUEVHLTIgQUFDKSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctMiBBQUMgYXVkaW8gYml0c3RyZWFtcy4KLSBJU08vSUVDIDE0NDk2LTMgKE1QRUctNCBBQUMsIHN1YnBhcnQgMSBhbmQgNCksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCi0gTHV0emt5LCBTY2h1bGxlciwgR2F5ZXIsIEtyJmF1bWw7bWVyLCBXYWJuaWssICJBIGd1aWRlbGluZSB0byBhdWRpbyBjb2RlYyBkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAoKTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgaXMgYmFzZWQgb24gYSB0aW1lLXRvLWZyZXF1ZW5jeSBtYXBwaW5nIG9mIHRoZSBzaWduYWwuIFRoZSBzaWduYWwKaXMgcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwKY29tcG9uZW50cyBhcmUgdGhlbiBxdWFudGl6ZWQgYW5kIGNvZGVkLlxuCkFuIE1QRUcyIG9yIE1QRUc0IEFBQyBhdWRpbyBiaXRzdHJlYW0gaXMgY29tcG9zZWQgb2YgZnJhbWVzLiBDb250cmFyeSB0byBNUEVHLTEvMiBMYXllci0zIChtcDMpLAp0aGUgbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24KYW55IGxlbmd0aCBiZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KCgpccGFnZSBMSUJVU0UgTGlicmFyeSBVc2FnZQoKXHNlY3Rpb24gSW50ZXJmYWNlRGVzY3JpdHBpb24gQVBJIERlc2NyaXB0aW9uCgpBbGwgQVBJIGhlYWRlciBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgZm9sZGVyIC9pbmNsdWRlIG9mIHRoZSByZWxlYXNlIHBhY2thZ2UuIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgpkZXRhaWwgaW4gdGhpcyBkb2N1bWVudC4gQWxsIGhlYWRlciBmaWxlcyBhcmUgcHJvdmlkZWQgZm9yIHVzYWdlIGluIEMvQysrIHByb2dyYW1zLiBUaGUgQUFDIGRlY29kZXIgbGlicmFyeQpBUEkgZnVuY3Rpb25zIGFyZSBsb2NhdGVkIGF0IGFhY2RlY29kZXJfbGliLmguCgpJbiBiaW5hcnkgcmVsZWFzZXMgdGhlIGRlY29kZXIgY29yZSByZXNpZGVzIGluIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyaWVzIGNhbGxlZCBmb3IgZXhhbXBsZSBsaWJBQUNkZWMuYSwKKExpbnV4KSBvciBGREtfYWFjRGVjX2xpYiAoTWljcm9zb2Z0IFZpc3VhbCBDKyspLgoKXHNlY3Rpb24gQ2FsbGluZ19TZXF1ZW5jZSBDYWxsaW5nIFNlcXVlbmNlCgpGb3IgZGVjb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBvciBIRS1BQUMgdjIgYml0c3RyZWFtcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIG1hbmRhdG9yeS4gSW5wdXQgcmVhZAphbmQgb3V0cHV0IHdyaXRlIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIG9wZW4gYW5kIGNsb3NlIGZ1bmN0aW9ucyBhcmUgbGVmdCBvdXQsIHNpbmNlIHRoZXkKbWF5IGJlIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IGFjY29yZGluZyB0byB0aGUgdXNlcidzIHNwZWNpZmljIHJlcXVpcmVtZW50cy4gVGhlIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gaW4KbWFpbi5jcHAgdXNlcyBmaWxlLWJhc2VkIGlucHV0L291dHB1dCwgYW5kIGluIHN1Y2ggY2FzZSBjYWxsIG1wZWdGaWxlUmVhZF9PcGVuKCkgdG8gb3BlbiBhbiBpbnB1dCBmaWxlIGFuZAp0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByZXF1aXJlZCBzdHJ1Y3R1cmVzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbXBlZ0ZpbGVSZWFkX0Nsb3NlKCkgdG8gY2xvc2Ugb3BlbmVkCmZpbGVzIGFuZCB0byBkZS1hbGxvY2F0ZSBhc3NvY2lhdGVkIHN0cnVjdHVyZXMuIG1wZWdGaWxlUmVhZF9PcGVuKCkgdHJpZXMgdG8gZGV0ZWN0IHRoZSBiaXRzdHJlYW0gZm9ybWF0IGFuZAppbiBjYXNlIG9mIE1QRUctNCBmaWxlIGZvcm1hdCBvciBSYXcgUGFja2V0cyBmaWxlIGZvcm1hdCAoYSBGcmF1bmhvZmVyIElJUyBwcm9wcmlldGFyeSBmb3JtYXQpIHJlYWRzIHRoZSBBdWRpbwpTcGVjaWZpYyBDb25maWcgZGF0YSAoQVNDKS4gQW4gdW5zdWNjZXNzZnVsIGF0dGVtcHQgdG8gcmVjb2duaXplIHRoZSBiaXRzdHJlYW0gZm9ybWF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvCnByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBtYW51YWxseS4gRm9yIGFueSBvdGhlciBiaXRzdHJlYW0gZm9ybWF0cyB0aGF0IGFyZSB1c3VhbGx5IGFwcGxpY2FibGUgaW4gc3RyZWFtaW5nCmFwcGxpY2F0aW9ucywgdGhlIGRlY29kZXIgaXRzZWxmIHdpbGwgdHJ5IHRvIHN5bmNocm9uaXplIGFuZCBwYXJzZSB0aGUgZ2l2ZW4gYml0c3RyZWFtIGZyYWdtZW50IHVzaW5nIHRoZQpGREsgdHJhbnNwb3J0IGxpYnJhcnkuIEhlbmNlLCBmb3Igc3RyZWFtaW5nIGFwcGxpY2F0aW9ucyAod2l0aG91dCBmaWxlIGFjY2VzcykgdGhpcyBzdGVwIGlzIG5vdCBuZWNlc3NhcnkuCgotIyBDYWxsIGFhY0RlY29kZXJfT3BlbigpIHRvIG9wZW4gYW5kIHJldHJpZXZlIGEgaGFuZGxlIHRvIGEgbmV3IEFBQyBkZWNvZGVyIGluc3RhbmNlLgpcZG9udGluY2x1ZGUgbWFpbi5jcHAKXHNraXBsaW5lIGFhY0RlY29kZXJfT3BlbgotIyBJZiBvdXQtb2YtYmFuZCBjb25maWcgZGF0YSAoQXVkaW8gU3BlY2lmaWMgQ29uZmlnIChBU0MpIG9yIFN0cmVhbSBNdXggQ29uZmlnIChTTUMpKSBpcyBhdmFpbGFibGUsIGNhbGwKYWFjRGVjb2Rlcl9Db25maWdSYXcoKSB0byBwYXNzIGl0IHRvIHRoZSBkZWNvZGVyIGFuZCBiZWZvcmUgdGhlIGRlY29kaW5nIHByb2Nlc3Mgc3RhcnRzLiBJZiB0aGlzIGRhdGEgaXMKbm90IGF2YWlsYWJsZSBpbiBhZHZhbmNlLCB0aGUgZGVjb2RlciB3aWxsIGdldCBpdCBmcm9tIHRoZSBiaXRzdHJlYW0gIGFuZCBjb25maWd1cmUgaXRzZWxmIHdoaWxlIGRlY29kaW5nCndpdGggYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpLgotIyBCZWdpbiBkZWNvZGluZyBsb29wLgpcc2tpcGxpbmUgZG8gewotIyBSZWFkIGRhdGEgZnJvbSBiaXRzdHJlYW0gZmlsZSBvciBzdHJlYW0gaW50byBhIGNsaWVudC1zdXBwbGllZCBpbnB1dCBidWZmZXIgKCJpbkJ1ZmZlciIgaW4gbWFpbi5jcHApLgpJZiBpdCBpcyB2ZXJ5IHNtYWxsIGxpa2UganVzdCA0LCBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgd2lsbApyZXBlYXRlZGx5IHJldHVybiA6OkFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTIHVudGlsIGVub3VnaCBiaXRzIHdlcmUgZmVkIGJ5IGFhY0RlY29kZXJfRmlsbCgpLiBPbmx5IHJlYWQgZGF0YQp3aGVuIHRoaXMgYnVmZmVyIGhhcyBjb21wbGV0ZWx5IGJlZW4gcHJvY2Vzc2VkIGFuZCBpcyB0aGVuIGVtcHR5LiBGb3IgZmlsZS1iYXNlZCBpbnB1dCBleGVjdXRlCm1wZWdGaWxlUmVhZF9SZWFkKCkgb3IgYW55IG90aGVyIGltcGxlbWVudGF0aW9uIHdpdGggc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotIyBDYWxsIGFhY0RlY29kZXJfRmlsbCgpIHRvIGZpbGwgdGhlIGRlY29kZXIncyBpbnRlcm5hbCBiaXRzdHJlYW0gaW5wdXQgYnVmZmVyIHdpdGggdGhlIGNsaWVudC1zdXBwbGllZApleHRlcm5hbCBiaXRzdHJlYW0gaW5wdXQgYnVmZmVyLgpcc2tpcGxpbmUgYWFjRGVjb2Rlcl9GaWxsCi0jIENhbGwgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIHdoaWNoIHdyaXRlcyBkZWNvZGVkIFBDTSBhdWRpbyBkYXRhIHRvIGEgY2xpZW50LXN1cHBsaWVkIGJ1ZmZlci4gSXQgaXMgdGhlCmNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFsbG9jYXRlIGEgYnVmZmVyIHdoaWNoIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoaXMgb3V0cHV0IGRhdGEuClxza2lwbGluZSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lCklmIHRoZSBiaXRzdHJlYW0ncyBjb25maWd1cmF0aW9uIChudW1iZXIgb2YgY2hhbm5lbHMsIHNhbXBsZSByYXRlLCBmcmFtZSBzaXplKSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSwgeW91IG1heQpjYWxsIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbygpIHRvIHJldHJpZXZlIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhpcyBpbmZvcm1hdGlvbiBhbmQgdGhlbiBpbml0aWFsaXplIGFuIGF1ZGlvCm91dHB1dCBkZXZpY2UuIEluIHRoZSBleGFtcGxlIG1haW4uY3BwLCBpZiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCBzaW5jZSBwcm9ncmFtCnN0YXJ0IG9yIHNpbmNlIHRoZSBwcmV2aW91c2x5IGRlY29kZWQgZnJhbWUsIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlIHdpbGwgYmUgcmUtaW5pdGlhbGl6ZWQuIElmIFdBVkUgZmlsZSBvdXRwdXQKaXMgY2hvc2VuLCBhIG5ldyBXQVZFIGZpbGUgZm9yIGVhY2ggbmV3IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBjcmVhdGVkLgpcc2tpcGxpbmUgYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvCi0jIFJlcGVhdCBzdGVwcyA1IHRvIDcgdW50aWwgbm8gZGF0YSB0byBkZWNvZGUgaXMgYXZhaWxhYmxlIGFueW1vcmUsIG9yIGlmIGFuIGVycm9yIG9jY3VyZWQuClxza2lwbGluZSB9IHdoaWxlCi0jIENhbGwgYWFjRGVjb2Rlcl9DbG9zZSgpIHRvIGRlLWFsbG9jYXRlIGFsbCBBQUMgZGVjb2RlciBhbmQgdHJhbnNwb3J0IGxheWVyIHN0cnVjdHVyZXMuClxza2lwbGluZSBhYWNEZWNvZGVyX0Nsb3NlCgpcc2VjdGlvbiBCdWZmZXJTeXN0ZW0gQnVmZmVyIFN5c3RlbQoKVGhlcmUgYXJlIHRocmVlIG1haW4gYnVmZmVycyBpbiBhbiBBQUMgZGVjb2RlciBhcHBsaWNhdGlvbi4gT25lIGV4dGVybmFsIGlucHV0IGJ1ZmZlciB0byBob2xkIGJpdHN0cmVhbQpkYXRhIGZyb20gZmlsZSBJL08gb3IgZWxzZXdoZXJlLCBvbmUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIsIGFuZCBvbmUgdG8gaG9sZCB0aGUgZGVjb2RlZCBvdXRwdXQKUENNIHNhbXBsZSBkYXRhLCB3aGVyZWFzIHRoaXMgb3V0cHV0IGJ1ZmZlciBtYXkgb3ZlcmxhcCB3aXRoIHRoZSBleHRlcm5hbCBpbnB1dCBidWZmZXIuCgpUaGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIGlzIHNldCBpbiB0aGUgZXhhbXBsZSBmcmFtZXdvcmsgbWFpbi5jcHAgYW5kIGl0cyBzaXplIGlzIGRlZmluZWQgYnkgOjpJTl9CVUZfU0laRS4KWW91IG1heSBmcmVlbHkgY2hvb3NlIGRpZmZlcmVudCBzaXplcyBoZXJlLiBUbyBmZWVkIHRoZSBkYXRhIHRvIHRoZSBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciwgdXNlIHRoZQpmdW5jdGlvbiBhYWNEZWNvZGVyX0ZpbGwoKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCBob3cgbWFueSBieXRlcyBpbiB0aGUKZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIGhhdmUgbm90IHlldCBiZWVuIGNvcGllZCBpbnRvIHRoZSBpbnRlcm5hbCBpbnB1dCBidWZmZXIgKHZhcmlhYmxlIGJ5dGVzVmFsaWQpLgpPbmNlIHRoZSBleHRlcm5hbCBidWZmZXIgaGFzIGJlZW4gZnVsbHkgY29waWVkLCBpdCBjYW4gYmUgcmUtZmlsbGVkIGFnYWluLgpJbiBjYXNlIHlvdSB3YW50IHRvIHJlLWZpbGwgaXQgd2hlbiB0aGVyZSBhcmUgc3RpbGwgdW5wcm9jZXNzZWQgYnl0ZXMgKGJ5dGVzVmFsaWQgaXMgdW5lcXVhbCAwKSwgeW91CndvdWxkIGhhdmUgdG8gYWRkaXRpb25hbGx5IHBlcmZvcm0gYSBtZW1jcHkoKSwgc28gdGhhdCBqdXN0IG1lYW5zIHVubmVjZXNzYXJ5IGNvbXB1dGF0aW9uYWwgb3ZlcmhlYWQKYW5kIHRoZXJlZm9yZSB3ZSByZWNvbW1lbmQgdG8gcmUtZmlsbCB0aGUgYnVmZmVyIG9ubHkgd2hlbiBieXRlc1ZhbGlkIGlzIDAuCgpcaW1hZ2UgbGF0ZXggZGVjX2J1ZmZlci5wbmcgIkxpZmVjeWNsZSBvZiB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIiB3aWR0aD05Y20KClRoZSBzaXplIG9mIHRoZSBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciBpcyBzZXQgaW4gdHBkZWNfbGliLmggKHNlZSBkZWZpbmUgOjpUUkFOU1BPUlRERUNfSU5CVUZfU0laRSkuCllvdSBtYXkgY2hvb3NlIGEgc21hbGxlciBzaXplIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uc2lkZXJhdGlvbnM6CgotIGVhY2ggaW5wdXQgY2hhbm5lbCByZXF1aXJlcyA3NjggYnl0ZXMKLSB0aGUgd2hvbGUgYnVmZmVyIG11c3QgYmUgb2Ygc2l6ZSAyXm4KClNvIGZvciBleGFtcGxlIGEgc3RlcmVvIGRlY29kZXI6CgpcZlsKVFJBTlNQT1JUREVDXF9JTkJVRlxfU0laRSA9IDIgKiA3NjggPSAxNTM2ID0+IDIwNDgKXGZdCgp0cGRlY19saWIuaCBhbmQgVFJBTlNQT1JUREVDX0lOQlVGX1NJWkUgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkZWNvZGVyJ3MgbGlicmFyeSBpbnRlcmZhY2UuIFRoZXJlZm9yZQpvbmx5IHNvdXJjZS1jb2RlIGNsaWVudHMgbWF5IGNoYW5nZSB0aGlzIHNldHRpbmcuIElmIHlvdSByZWNlaXZlZCBhIGxpYnJhcnkgcmVsZWFzZSwgcGxlYXNlIGFzayB1cyBhbmQKd2UgY2FuIGNoYW5nZSB0aGlzIGluIG9yZGVyIHRvIG1lZXQgeW91ciBtZW1vcnkgcmVxdWlyZW1lbnRzLgoKXHBhZ2UgT3V0cHV0Rm9ybWF0IERlY29kZXIgYXVkaW8gb3V0cHV0Cgpcc2VjdGlvbiBPdXRwdXRGb3JtYXRPYnRhaW5pbmcgT2J0YWluaW5nIGNoYW5uZWwgbWFwcGluZyBpbmZvcm1hdGlvbgoKVGhlIGRlY29kZWQgYXVkaW8gb3V0cHV0IGZvcm1hdCBpcyBpbmRpY2F0ZWQgYnkgYSBzZXQgb2YgdmFyaWFibGVzIG9mIHRoZSBDU3RyZWFtSW5mbyBzdHJ1Y3R1cmUuCldoaWxlIHRoZSBtZW1iZXJzIHNhbXBsZVJhdGUsIGZyYW1lU2l6ZSBhbmQgbnVtQ2hhbm5lbHMgbWlnaHQgYmUgcXVpdGUgc2VsZiBleHBsYWluaW5nLApwQ2hhbm5lbFR5cGUgYW5kIHBDaGFubmVsSW5kaWNlcyBtaWdodCByZXF1aXJlIHNvbWUgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbi4KClRoZXNlIHR3byBhcnJheXMgaW5kaWNhdGUgd2hhdCBpcyBlYWNoIG91dHB1dCBjaGFubmVsIHN1cHBvc2VkIHRvIGJlLiBCb3RoIGFycmF5IGhhdmUKQ1N0cmVhbUluZm86Om51bUNoYW5uZWxzIGNlbGxzLiBFYWNoIGNlbGwgb2YgcENoYW5uZWxUeXBlIGluZGljYXRlcyB0aGUgY2hhbm5lbCB0eXBlLCBkZXNjcmliZWQgaW4KdGhlIGVudW0gOjpBVURJT19DSEFOTkVMX1RZUEUgZGVmaW5lZCBpbiBGREtfYXVkaW8uaC4gVGhlIGNlbGxzIG9mIHBDaGFubmVsSW5kaWNlcyBpbmRpY2F0ZSB0aGUgc3ViIGluZGV4CmFtb25nIHRoZSBjaGFubmVscyBzdGFydGluZyB3aXRoIDAgYW1vbmcgYWxsIGNoYW5uZWxzIG9mIHRoZSBzYW1lIGF1ZGlvIGNoYW5uZWwgdHlwZS4KClRoZSBpbmRleGluZyBzY2hlbWUgaXMgdGhlIHNhbWUgYXMgZm9yIE1QRUctMi80LiBUaHVzIGluZGljZXMgYXJlIGNvdW50ZWQgdXB3YXJkcyBzdGFydGluZyBmcm9tIHRoZSBmcm9udApkaXJlY3Rpb24gKHRodXMgYSBjZW50ZXIgY2hhbm5lbCBpZiBhbnksIHdpbGwgYWx3YXlzIGJlIGluZGV4IDApLiBUaGVuIHRoZSBpbmRpY2VzIGNvdW50IHVwLCBzdGFydGluZyBhbHdheXMKd2l0aCB0aGUgbGVmdCBzaWRlLCBwYWlyd2lzZSBmcm9tIGZyb250IHRvd2FyZCBiYWNrLiBGb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24sIHBsZWFzZSByZWZlciB0bwpJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgY2hhcHRlciA4LjUuMy4yLgoKSW4gY2FzZSBhIFByb2dyYW0gQ29uZmlnIGlzIGluY2x1ZGVkIGluIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uLCB0aGUgY2hhbm5lbCBtYXBwaW5nIGRlc2NyaWJlZCB3aXRoaW4KaXQgd2lsbCBiZSBhZG9wdGVkLgoKSW4gY2FzZSBvZiBNUEVHLUQgU3Vycm91bmQgdGhlIGNoYW5uZWwgbWFwcGluZyB3aWxsIGZvbGxvdyB0aGUgc2FtZSBjcml0ZXJpYSBkZXNjcmliZWQgaW4gSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksCmJ1dCBhZGRpbmcgY29ycmVzcG9uZGluZyB0b3AgY2hhbm5lbHMgdG8gdGhlIGNoYW5uZWwgdHlwZXMgZnJvbnQsIHNpZGUgYW5kIGJhY2ssIGluIG9yZGVyIHRvIGF2b2lkIGFueQpsb3NzIG9mIGluZm9ybWF0aW9uLgoKXHNlY3Rpb24gT3V0cHV0Rm9ybWF0Q2hhbmdlIENoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZm9ybWF0CgpUaGUgY2hhbm5lbCBpbnRlcmxlYXZpbmcgc2NoZW1lIGFuZCB0aGUgYWN0dWFsIGNoYW5uZWwgb3JkZXIgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSB0aHJvdWdoIHRoZQpwYXJhbWV0ZXJzIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgYW5kIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HLiBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRob3NlCnBhcmFtZXRlcnMgYW5kIHRoZSBkZWNvZGVyIGxpYnJhcnkgZnVuY3Rpb24gYWFjRGVjb2Rlcl9TZXRQYXJhbSgpIGZvciBtb3JlIGRldGFpbC4KClxzZWN0aW9uIE91dHB1dEZvcm1hdEV4YW1wbGUgQ2hhbm5lbCBtYXBwaW5nIGV4YW1wbGVzCgpUaGUgZm9sbG93aW5nIGV4YW1wbGVzIGlsbHVzdHJhdGUgdGhlIGxvY2F0aW9uIG9mIGluZGl2aWR1YWwgYXVkaW8gc2FtcGxlcyBpbiB0aGUgYXVkaW8gYnVmZmVyIHRoYXQKaXMgcGFzc2VkIHRvIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKSBhbmQgdGhlIGV4cGVjdGVkIGRhdGEgaW4gdGhlIENTdHJlYW1JbmZvIHN0cnVjdHVyZSB3aGljaCBjYW4gYmUgb2J0YWluZWQKYnkgY2FsbGluZyBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oKS4KClxzdWJzZWN0aW9uIEV4YW1wbGVzU3RlcmVvIFN0ZXJlbwoKSW4gY2FzZSBvZiA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIHNldCB0byAwIGFuZCA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBzZXQgdG8gMSwKYSBBQUMtTEMgYml0IHN0cmVhbSB3aGljaCBoYXMgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSAyIGluIGl0cyBhdWRpbyBzcGVjaWZpYyBjb25maWcgd291bGQgbGVhZAp0byB0aGUgZm9sbG93aW5nIHZhbHVlcyBpbiBDU3RyZWFtSW5mbzoKCkNTdHJlYW1JbmZvOjpudW1DaGFubmVscyA9IDIKCkNTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCB9CgpDU3RyZWFtSW5mbzo6cENoYW5uZWxJbmRpY2VzID0geyAwLCAxIH0KClNpbmNlIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgaXMgc2V0IHRvIDAsIHRoZSBhdWRpbyBjaGFubmVscyB3aWxsIGJlIGxvY2F0ZWQgYXMgY29udGlndW91cyBibG9ja3MKaW4gdGhlIG91dHB1dCBidWZmZXIgYXMgZm9sbG93czoKClx2ZXJiYXRpbQogIDxsZWZ0IHNhbXBsZSAwPiAgPGxlZnQgc2FtcGxlIDE+ICA8bGVmdCBzYW1wbGUgMj4gIC4uLiA8bGVmdCBzYW1wbGUgTj4KICA8cmlnaHQgc2FtcGxlIDA+IDxyaWdodCBzYW1wbGUgMT4gPHJpZ2h0IHNhbXBsZSAyPiAuLi4gPHJpZ2h0IHNhbXBsZSBOPgpcZW5kdmVyYmF0aW0KCldoZXJlIE4gZXF1YWxzIHRvIENTdHJlYW1JbmZvOjpmcmFtZVNpemUgLgoKXHN1YnNlY3Rpb24gRXhhbXBsZXNTdXJyb3VuZCBTdXJyb3VuZCA1LjEKCkluIGNhc2Ugb2YgOjpBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCBzZXQgdG8gMSBhbmQgOjpBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkcgc2V0IHRvIDEsCmEgQUFDLUxDIGJpdCBzdHJlYW0gd2hpY2ggaGFzIGNoYW5uZWxDb25maWd1cmF0aW9uID0gNiBpbiBpdHMgYXVkaW8gc3BlY2lmaWMgY29uZmlnLCB3b3VsZCBsZWFkCnRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgoKQ1N0cmVhbUluZm86Om51bUNoYW5uZWxzID0gNgoKQ1N0cmVhbUluZm86OnBDaGFubmVsVHlwZSA9IHsgOjpBQ1RfRlJPTlQsIDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCwgOjpBQ1RfTEZFLCA6OkFDVF9CQUNLLCA6OkFDVF9CQUNLIH0KCkNTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDEsIDIsIDAsIDAsIDAsIDEgfQoKU2luY2UgOjpBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkcgaXMgMSwgV0FWIGZpbGUgY2hhbm5lbCBvcmRlcmluZyB3aWxsIGJlIHVzZWQuIEZvciBhIDUuMSBjaGFubmVsCnNjaGVtZSwgdGh1cyB0aGUgY2hhbm5lbHMgd291bGQgYmU6IGZyb250IGxlZnQsIGZyb250IHJpZ2h0LCBjZW50ZXIsIExGRSwgc3Vycm91bmQgbGVmdCwgc3Vycm91bmQgcmlnaHQuClRodXMgdGhlIHRoaXJkIGNoYW5uZWwgaXMgdGhlIGNlbnRlciBjaGFubmVsLCByZWNlaXZpbmcgdGhlIGluZGV4IDAuIFRoZSBvdGhlciBmcm9udCBjaGFubmVscyBhcmUKZnJvbnQgbGVmdCwgZnJvbnQgcmlnaHQgYmVpbmcgcGxhY2VkIGFzIGZpcnN0IGFuZCBzZWNvbmQgY2hhbm5lbHMgd2l0aCBpbmRpY2VzIDEgYW5kIDIgY29ycmVzcG9uZGluZ2x5LgpUaGVyZSBpcyBvbmx5IG9uZSBMRkUsIHBsYWNlZCBhcyB0aGUgZm91cnRoIGNoYW5uZWwgYW5kIGluZGV4IDAuIEZpbmFsbHkgYm90aCBzdXJyb3VuZApjaGFubmVscyBnZXQgdGhlIHR5cGUgZGVmaW5pdGlvbiBBQ1RfQkFDSywgYW5kIHRoZSBpbmRpY2VzIDAgYW5kIDEuCgpTaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGlzIHNldCB0byAxLCB0aGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIG91dHB1dCBidWZmZXIKYXMgZm9sbG93czoKClx2ZXJiYXRpbQo8ZnJvbnQgbGVmdCBzYW1wbGUgMD4gPGZyb250IHJpZ2h0IHNhbXBsZSAwPgo8Y2VudGVyIHNhbXBsZSAwPiA8TEZFIHNhbXBsZSAwPgo8c3Vycm91bmQgbGVmdCBzYW1wbGUgMD4gPHN1cnJvdW5kIHJpZ2h0IHNhbXBsZSAwPgoKPGZyb250IGxlZnQgc2FtcGxlIDE+IDxmcm9udCByaWdodCBzYW1wbGUgMT4KPGNlbnRlciBzYW1wbGUgMT4gPExGRSBzYW1wbGUgMT4KPHN1cnJvdW5kIGxlZnQgc2FtcGxlIDE+IDxzdXJyb3VuZCByaWdodCBzYW1wbGUgMT4KCi4uLgoKPGZyb250IGxlZnQgc2FtcGxlIE4+IDxmcm9udCByaWdodCBzYW1wbGUgTj4KPGNlbnRlciBzYW1wbGUgTj4gPExGRSBzYW1wbGUgTj4KPHN1cnJvdW5kIGxlZnQgc2FtcGxlIE4+IDxzdXJyb3VuZCByaWdodCBzYW1wbGUgTj4KXGVuZHZlcmJhdGltCgpXaGVyZSBOIGVxdWFscyB0byBDU3RyZWFtSW5mbzo6ZnJhbWVTaXplIC4KClxzdWJzZWN0aW9uIEV4YW1wbGVzQXJpYiBBUklCIGNvZGluZyBtb2RlIDIvMQoKSW4gY2FzZSBvZiA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIHNldCB0byAxIGFuZCA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBzZXQgdG8gMSwKaW4gY2FzZSBvZiBhIEFSSUIgYml0IHN0cmVhbSB1c2luZyBjb2RpbmcgbW9kZSAyLzEgYXMgZGVzY3JpYmVkIGluIEFSSUIgU1RELUIzMiBQYXJ0IDIgVmVyc2lvbiAyLjEtRTEsIHBhZ2UgNjEsCndvdWxkIGxlYWQgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gQ1N0cmVhbUluZm86CgpDU3RyZWFtSW5mbzo6bnVtQ2hhbm5lbHMgPSAzCgpDU3RyZWFtSW5mbzo6cENoYW5uZWxUeXBlID0geyA6OkFDVF9GUk9OVCwgOjpBQ1RfRlJPTlQsOjogQUNUX0JBQ0sgfQoKQ1N0cmVhbUluZm86OnBDaGFubmVsSW5kaWNlcyA9IHsgMCwgMSwgMCB9CgpUaGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBwbGFjZWQgYXMgZm9sbG93cyBpbiB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlcjoKClx2ZXJiYXRpbQo8ZnJvbnQgbGVmdCBzYW1wbGUgMD4gPGZyb250IHJpZ2h0IHNhbXBsZSAwPiAgPG1pZCBzdXJyb3VuZCBzYW1wbGUgMD4KCjxmcm9udCBsZWZ0IHNhbXBsZSAxPiA8ZnJvbnQgcmlnaHQgc2FtcGxlIDE+IDxtaWQgc3Vycm91bmQgc2FtcGxlIDE+CgouLi4KCjxmcm9udCBsZWZ0IHNhbXBsZSBOPiA8ZnJvbnQgcmlnaHQgc2FtcGxlIE4+IDxtaWQgc3Vycm91bmQgc2FtcGxlIE4+CgpXaGVyZSBOIGVxdWFscyB0byBDU3RyZWFtSW5mbzo6ZnJhbWVTaXplIC4KClxlbmR2ZXJiYXRpbQoKKi8KCiNpZm5kZWYgQUFDREVDT0RFUl9MSUJfSAojZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0gKCiNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKI2luY2x1ZGUgIkZES19hdWRpby5oIgoKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCgovKioKICogXGJyaWVmICBBQUMgZGVjb2RlciBlcnJvciBjb2Rlcy4KICovCnR5cGVkZWYgZW51bSB7CiAgQUFDX0RFQ19PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IE5vIGVycm9yIG9jY3VyZWQuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQgYW5kIGVycm9yIGZyZWUuICovCiAgQUFDX0RFQ19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAvKiE8IEhlYXAgcmV0dXJuZWQgTlVMTCBwb2ludGVyLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCiAgQUFDX0RFQ19VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDUsICAvKiE8IEVycm9yIGNvbmRpdGlvbiBpcyBvZiB1bmtub3duIHJlYXNvbiwgb3IgZnJvbSBhIGFub3RoZXIgbW9kdWxlLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCgogIC8qIFN5bmNocm9uaXphdGlvbiBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KICBhYWNfZGVjX3N5bmNfZXJyb3Jfc3RhcnQgICAgICAgICAgICAgICA9IDB4MTAwMCwKICBBQUNfREVDX1RSQU5TUE9SVF9TWU5DX0VSUk9SICAgICAgICAgICA9IDB4MTAwMSwgIC8qITwgVGhlIHRyYW5zcG9ydCBkZWNvZGVyIGhhZCBzeW5jcm9uaXNhdGlvbiBwcm9ibGVtcy4gRG8gbm90IGV4aXQgZGVjb2RpbmcuIEp1c3QgZmVlZCBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtIGRhdGEuICovCiAgQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMgICAgICAgICAgICAgICAgPSAweDEwMDIsICAvKiE8IFRoZSBpbnB1dCBidWZmZXIgcmFuIG91dCBvZiBiaXRzLiAqLwogIGFhY19kZWNfc3luY19lcnJvcl9lbmQgICAgICAgICAgICAgICAgID0gMHgxRkZGLAoKICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KICBhYWNfZGVjX2luaXRfZXJyb3Jfc3RhcnQgICAgICAgICAgICAgICA9IDB4MjAwMCwKICBBQUNfREVDX0lOVkFMSURfSEFORExFICAgICAgICAgICAgICAgICA9IDB4MjAwMSwgIC8qITwgVGhlIGhhbmRsZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQgKE5VTEwpLiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfQU9UICAgICAgICAgICAgICAgID0gMHgyMDAyLCAgLyohPCBUaGUgQU9UIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQgICAgICAgICAgICAgPSAweDIwMDMsICAvKiE8IFRoZSBiaXRzdHJlYW0gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfRVJfRk9STUFUICAgICAgICAgID0gMHgyMDA0LCAgLyohPCBUaGUgZXJyb3IgcmVzaWxpZW5jZSB0b29sIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfRVBDT05GSUcgICAgICAgICAgID0gMHgyMDA1LCAgLyohPCBUaGUgZXJyb3IgcHJvdGVjdGlvbiBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX01VTFRJTEFZRVIgICAgICAgICA9IDB4MjAwNiwgIC8qITwgTW9yZSB0aGFuIG9uZSBsYXllciBmb3IgQUFDIHNjYWxhYmxlIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHICAgICAgPSAweDIwMDcsICAvKiE8IFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGVpdGhlciBudW1iZXIgb3IgYXJyYW5nZW1lbnQpIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9TQU1QTElOR1JBVEUgICAgICAgPSAweDIwMDgsICAvKiE8IFRoZSBzYW1wbGUgcmF0ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KICBBQUNfREVDX0lOVkFMSURfU0JSX0NPTkZJRyAgICAgICAgICAgICA9IDB4MjAwOSwgIC8qITwgVGhlIFNCUiBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19TRVRfUEFSQU1fRkFJTCAgICAgICAgICAgICAgICAgPSAweDIwMEEsICAvKiE8IFRoZSBwYXJhbWV0ZXIgY291bGQgbm90IGJlIHNldC4gRWl0aGVyIHRoZSB2YWx1ZSB3YXMgb3V0IG9mIHJhbmdlIG9yIHRoZSBwYXJhbWV0ZXIgZG9lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgZXhpc3QuICovCiAgQUFDX0RFQ19ORUVEX1RPX1JFU1RBUlQgICAgICAgICAgICAgICAgPSAweDIwMEIsICAvKiE8IFRoZSBkZWNvZGVyIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwgc2luY2UgdGhlIHJlcXVpZXJlZCBjb25maWd1cmF0aW9uIGNoYW5nZSBjYW5ub3QgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiAqLwogIGFhY19kZWNfaW5pdF9lcnJvcl9lbmQgICAgICAgICAgICAgICAgID0gMHgyRkZGLAoKICAvKiBEZWNvZGUgZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIHZhbGlkIGJ1dCBjb25jZWFsZWQuICovCiAgYWFjX2RlY19kZWNvZGVfZXJyb3Jfc3RhcnQgICAgICAgICAgICAgPSAweDQwMDAsCiAgQUFDX0RFQ19UUkFOU1BPUlRfRVJST1IgICAgICAgICAgICAgICAgPSAweDQwMDEsICAvKiE8IFRoZSB0cmFuc3BvcnQgZGVjb2RlciBlbmNvdW50ZXJlZCBhbiB1bmV4cGVjdGVkIGVycm9yLiAqLwogIEFBQ19ERUNfUEFSU0VfRVJST1IgICAgICAgICAgICAgICAgICAgID0gMHg0MDAyLCAgLyohPCBFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBiaXRzdHJlYW0uIE1vc3QgcHJvYmFibHkgaXQgaXMgY29ycnVwdGVkLCBvciB0aGUgc3lzdGVtIGNyYXNoZWQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9FWFRFTlNJT05fUEFZTE9BRCAgPSAweDQwMDMsICAvKiE8IEVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGV4dGVuc2lvbiBwYXlsb2FkIG9mIHRoZSBiaXRzdHJlYW0uIFRoZSBleHRlbnNpb24gcGF5bG9hZCB0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1IgICAgICAgICAgICAgPSAweDQwMDQsICAvKiE8IFRoZSBwYXJzZWQgYml0c3RyZWFtIHZhbHVlIGlzIG91dCBvZiByYW5nZS4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzeXN0ZW0gY3Jhc2hlZC4gKi8KICBBQUNfREVDX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNSwgIC8qITwgVGhlIGVtYmVkZGVkIENSQyBkaWQgbm90IG1hdGNoLiAqLwogIEFBQ19ERUNfSU5WQUxJRF9DT0RFX0JPT0sgICAgICAgICAgICAgID0gMHg0MDA2LCAgLyohPCBBbiBpbnZhbGlkIGNvZGVib29rIHdhcyBzaWduYWxsZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvciB0aGUgc3lzdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXNoZWQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9QUkVESUNUSU9OICAgICAgICAgPSAweDQwMDcsICAvKiE8IFByZWRpY3RvciBmb3VuZCwgYnV0IG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEFBQyBMb3cgQ29tcGxleGl0eSBwcm9maWxlLiBNb3N0IHByb2JhYmx5IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfQ0NFICAgICAgICAgICAgICAgID0gMHg0MDA4LCAgLyohPCBBIENDRSBlbGVtZW50IHdhcyBmb3VuZCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfTEZFICAgICAgICAgICAgICAgID0gMHg0MDA5LCAgLyohPCBBIExGRSBlbGVtZW50IHdhcyBmb3VuZCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfR0FJTl9DT05UUk9MX0RBVEEgID0gMHg0MDBBLCAgLyohPCBHYWluIGNvbnRyb2wgZGF0YSBmb3VuZCBidXQgbm90IHN1cHBvcnRlZC4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yIGhhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHdyb25nIGZvcm1hdC4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX1NCQSAgICAgICAgICAgICAgICA9IDB4NDAwQiwgIC8qITwgU0JBIGZvdW5kLCBidXQgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEJTQUMgcHJvZmlsZS4gKi8KICBBQUNfREVDX1ROU19SRUFEX0VSUk9SICAgICAgICAgICAgICAgICA9IDB4NDAwQywgIC8qITwgRXJyb3Igd2hpbGUgcmVhZGluZyBUTlMgZGF0YS4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQgb3IgdGhlIHN5c3RlbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmFzaGVkLiAqLwogIEFBQ19ERUNfUlZMQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgID0gMHg0MDBELCAgLyohPCBFcnJvciB3aGlsZSBkZWNvZGluZyBlcnJvciByZXNpbGxpZW50IGRhdGEuICovCiAgYWFjX2RlY19kZWNvZGVfZXJyb3JfZW5kICAgICAgICAgICAgICAgPSAweDRGRkYsCgogIC8qIEFuY2lsbGFyeSBkYXRhIGVycm9ycy4gT3V0cHV0IGJ1ZmZlciBpcyB2YWxpZC4gKi8KICBhYWNfZGVjX2FuY19kYXRhX2Vycm9yX3N0YXJ0ICAgICAgICAgICA9IDB4ODAwMCwKICBBQUNfREVDX0FOQ19EQVRBX0VSUk9SICAgICAgICAgICAgICAgICA9IDB4ODAwMSwgIC8qITwgTm9uIHNldmVyZSBlcnJvciBjb25jZXJuaW5nIHRoZSBhbmNpbGxhcnkgZGF0YSBoYW5kbGluZy4gKi8KICBBQUNfREVDX1RPT19TTUFMTF9BTkNfQlVGRkVSICAgICAgICAgICA9IDB4ODAwMiwgIC8qITwgVGhlIHJlZ2lzdGVyZWQgYW5jaWxsYXJ5IGRhdGEgYnVmZmVyIGlzIHRvbyBzbWFsbCB0byByZWNlaXZlIHRoZSBwYXJzZWQgZGF0YS4gKi8KICBBQUNfREVDX1RPT19NQU5ZX0FOQ19FTEVNRU5UUyAgICAgICAgICA9IDB4ODAwMywgIC8qITwgTW9yZSB0aGFuIHRoZSBhbGxvd2VkIG51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBlbGVtZW50cyBzaG91bGQgYmUgd3JpdHRlbiB0byBidWZmZXIuICovCiAgYWFjX2RlY19hbmNfZGF0YV9lcnJvcl9lbmQgICAgICAgICAgICAgPSAweDhGRkYKCgp9IEFBQ19ERUNPREVSX0VSUk9SOwoKCi8qKiBNYWNybyB0byBpZGVudGlmeSBpbml0aWFsaXphdGlvbiBlcnJvcnMuICovCiNkZWZpbmUgSVNfSU5JVF9FUlJPUihlcnIpICAgKCAoKChlcnIpPj1hYWNfZGVjX2luaXRfZXJyb3Jfc3RhcnQpICAgJiYgKChlcnIpPD1hYWNfZGVjX2luaXRfZXJyb3JfZW5kKSkgICA/IDEgOiAwKQovKiogTWFjcm8gdG8gaWRlbnRpZnkgZGVjb2RlIGVycm9ycy4gKi8KI2RlZmluZSBJU19ERUNPREVfRVJST1IoZXJyKSAoICgoKGVycik+PWFhY19kZWNfZGVjb2RlX2Vycm9yX3N0YXJ0KSAmJiAoKGVycik8PWFhY19kZWNfZGVjb2RlX2Vycm9yX2VuZCkpID8gMSA6IDApCi8qKiBNYWNybyB0byBpZGVudGlmeSBpZiB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlciBjb250YWlucyB2YWxpZCBzYW1wbGVzIGFmdGVyIGNhbGxpbmcgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpLiAqLwojZGVmaW5lIElTX09VVFBVVF9WQUxJRChlcnIpICggKChlcnIpID09IEFBQ19ERUNfT0spIHx8IElTX0RFQ09ERV9FUlJPUihlcnIpICkKCi8qKgogKiBcYnJpZWYgQUFDIGRlY29kZXIgc2V0dGluZyBwYXJhbWV0ZXJzCiAqLwp0eXBlZGVmIGVudW0KewogIEFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEICAgICAgICAgICAgICA9IDB4MDAwMCwgIC8qITwgUENNIG91dHB1dCBtb2RlICgxOiBpbnRlcmxlYXZlZCAoZGVmYXVsdCk7IDA6IG5vdCBpbnRlcmxlYXZlZCkuICovCiAgQUFDX1BDTV9EVUFMX0NIQU5ORUxfT1VUUFVUX01PREUgICAgICAgID0gMHgwMDAyLCAgLyohPCBEZWZpbmVzIGhvdyB0aGUgZGVjb2RlciBwcm9jZXNzZXMgdHdvIGNoYW5uZWwgc2lnbmFsczogXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IExlYXZlIGJvdGggc2lnbmFscyBhcyB0aGV5IGFyZSAoZGVmYXVsdCkuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGZyb20gY2hhbm5lbCAyLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgYnkgbWl4aW5nIGJvdGggY2hhbm5lbHMgKEwnID0gUicgPSAwLjUqQ2gxICsgMC41KkNoMikuICovCiAgQUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HICAgICAgICAgID0gMHgwMDAzLCAgLyohPCBPdXRwdXQgYnVmZmVyIGNoYW5uZWwgb3JkZXJpbmcuIDA6IE1QRUcgUENFIHN0eWxlIG9yZGVyLCAxOiBXQVYgZmlsZSBjaGFubmVsIG9yZGVyIChkZWZhdWx0KS4gKi8KICBBQUNfUENNX0xJTUlURVJfRU5BQkxFICAgICAgICAgICAgICAgICAgPSAweDAwMDQsICAvKiE8IEVuYWJsZSBzaWduYWwgbGV2ZWwgbGltaXRpbmcuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTogQXV0by1jb25maWcuIEVuYWJsZSBsaW1pdGVyIGZvciBhbGwgbm9uLWxvd2RlbGF5IGNvbmZpZ3VyYXRpb25zIGJ5IGRlZmF1bHQuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogRGlzYWJsZSBsaW1pdGVyIGluIGdlbmVyYWwuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRW5hYmxlIGxpbWl0ZXIgYWx3YXlzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gY2FsbCB0aGUgZGVjb2RlciB3aXRoIGEgQUFDREVDX0NMUkhJU1QgZmxhZyB0byByZXNldCBhbGwgc3RhdGVzIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW1pdGVyIHN3aXRjaCBpcyBjaGFuZ2VkIGV4cGxpY2l0bHkuICovCiAgQUFDX1BDTV9MSU1JVEVSX0FUVEFDS19USU1FICAgICAgICAgICAgID0gMHgwMDA1LCAgLyohPCBTaWduYWwgbGV2ZWwgbGltaXRpbmcgYXR0YWNrIHRpbWUgaW4gbXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGNvbmZndXJhdGlvbiBpcyAxNSBtcy4gQWRqdXN0YWJsZSByYW5nZSBmcm9tIDEgbXMgdG8gMTUgbXMuICovCiAgQUFDX1BDTV9MSU1JVEVSX1JFTEVBU19USU1FICAgICAgICAgICAgID0gMHgwMDA2LCAgLyohPCBTaWduYWwgbGV2ZWwgbGltaXRpbmcgcmVsZWFzZSB0aW1lIGluIG1zLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIDUwIG1zLiBBZGp1c3RhYmxlIHRpbWUgbXVzdCBiZSBsYXJnZXIgdGhhbiAwIG1zLiAqLwogIEFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUyAgICAgICAgICAgICA9IDB4MDAxMSwgIC8qITwgTWluaW11bSBudW1iZXIgb2YgUENNIG91dHB1dCBjaGFubmVscy4gSWYgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZiBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW1wbGUgY2hhbm5lbCBleHRlbnNpb24gaXMgYXBwbGllZC4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAwOiBEaXNhYmxlIGNoYW5uZWwgZXh0ZW5zdGlvbiBmZWF0dXJlLiBUaGUgZGVjb2RlciBvdXRwdXQgY29udGFpbnMgdGhlIHNhbWUgbnVtYmVyIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXMgdGhlIGVuY29kZWQgYml0c3RyZWFtLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6ICAgIFRoaXMgdmFsdWUgaXMgY3VycmVudGx5IG5lZWRlZCBvbmx5IHRvZ2V0aGVyIHdpdGggdGhlIG1peC1kb3duIGZlYXR1cmUuIFNlZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTIGFuZCBub3RlIDIgYmVsb3cuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogICAgRW5jb2RlZCBtb25vIHNpZ25hbHMgd2lsbCBiZSBkdXBsaWNhdGVkIHRvIGFjaGlldmUgYSAyLzAvMC4wIGNoYW5uZWwgb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OiAgICBUaGUgZGVjb2RlciB0cnlzIHRvIHJlb3JkZXIgZW5jb2RlZCBzaWduYWxzIHdpdGggbGVzcyB0aGFuIHNpeCBjaGFubmVscyB0byBhY2hpZXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAzLzAvMi4xIGNoYW5uZWwgb3V0cHV0IHNpZ25hbC4gTWlzc2luZyBjaGFubmVscyB3aWxsIGJlIGZpbGxlZCB3aXRoIGEgemVybyBzaWduYWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcmVvcmRlcmluZyBpcyBub3QgcG9zc2libGUgdGhlIGVtcHR5IGNoYW5uZWxzIHdpbGwgc2ltcGx5IGJlIGFwcGVuZGVkLiBPbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6ICAgIFRoZSBkZWNvZGVyIHRyeXMgdG8gcmVvcmRlciBlbmNvZGVkIHNpZ25hbHMgd2l0aCBsZXNzIHRoYW4gZWlnaHQgY2hhbm5lbHMgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2hpZXZlIGEgMy8wLzQuMSBjaGFubmVsIG91dHB1dCBzaWduYWwuIE1pc3NpbmcgY2hhbm5lbHMgd2lsbCBiZSBmaWxsZWQgd2l0aCBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyBzaWduYWwuIElmIHJlb3JkZXJpbmcgaXMgbm90IHBvc3NpYmxlIHRoZSBlbXB0eSBjaGFubmVscyB3aWxsIHNpbXBseSBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkLiBPbmx5IGF2YWlsYWJsZSBpZiBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgbXVsdGljaGFubmVsIG91dHB1dC5cbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gVGhlIGNoYW5uZWwgc2lnbmFsbGluZyAoQ1N0cmVhbUluZm86OnBDaGFubmVsVHlwZSBhbmQgQ1N0cmVhbUluZm86OnBDaGFubmVsSW5kaWNlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgbW9kaWZpZWQuIEFkZGVkIGVtcHR5IGNoYW5uZWxzIHdpbGwgYmUgc2lnbmFsbGVkIHdpdGggY2hhbm5lbCB0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRTo6QUNUX05PTkUuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIElmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoYXQgb2YgOjpBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMgYm90aCB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4gVGhpcyBwYXJhbWV0ZXIgZG9lcyBub3QgYWZmZWN0IE1QRUcgU3Vycm91bmQgcHJvY2Vzc2luZy4gKi8KICBBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMgICAgICAgICAgICAgPSAweDAwMTIsICAvKiE8IE1heGltdW0gbnVtYmVyIG9mIFBDTSBvdXRwdXQgY2hhbm5lbHMuIElmIGxvd2VyIHRoYW4gdGhlIG51bWJlciBvZiBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peGluZyBpcyBhcHBsaWVkIGFjY29yZGluZ2x5LiBJZiBkZWRpY2F0ZWQgbWV0YWRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSBzdHJlYW0gaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCB0byBhY2hpZXZlIGJldHRlciBtaXhpbmcgcmVzdWx0cy4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAwOiBEaXNhYmxlIGRvd25taXhpbmcgZmVhdHVyZS4gVGhlIGRlY29kZXIgb3V0cHV0IGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBlbmNvZGVkIGJpdHN0cmVhbS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiAgICBBbGwgZW5jb2RlZCBhdWRpbyBjb25maWd1cmF0aW9ucyB3aXRoIG1vcmUgdGhhbiBvbmUgY2hhbm5lbCB3aWxsIGJlIG1peGVkIGRvd24gdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgbW9ubyBvdXRwdXQgc2lnbmFsLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6ICAgIFRoZSBkZWNvZGVyIHBlcmZvcm1zIGEgc3RlcmVvIG1peC1kb3duIGlmIHRoZSBudW1iZXIgZW5jb2RlZCBhdWRpbyBjaGFubmVscyBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB0d28uIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjogICAgSWYgdGhlIG51bWJlciBvZiBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzIGlzIGdyZWF0ZXIgdGhhbiBzaXggdGhlIGRlY29kZXIgcGVyZm9ybXMgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC1kb3duIHRvIG1lZXQgdGhlIHRhcmdldCBvdXRwdXQgY29uZmlndXJhdGlvbiBvZiAzLzAvMi4xIGNoYW5uZWxzLiBPbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6ICAgIFRoaXMgdmFsdWUgaXMgY3VycmVudGx5IG5lZWRlZCBvbmx5IHRvZ2V0aGVyIHdpdGggdGhlIGNoYW5uZWwgZXh0ZW5zaW9uIGZlYXR1cmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDo6QUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTIGFuZCBub3RlIDIgYmVsb3cuIE9ubHkgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCB0byBzdXBwb3J0IG11bHRpY2hhbm5lbCBvdXRwdXQuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBEb3duLW1peGluZyBvZiBhbnkgc2V2ZW4gb3IgZWlnaHQgY2hhbm5lbCBjb25maWd1cmF0aW9uIG5vdCBkZWZpbmVkIGluIElTTy9JRUMgMTQ0OTYtMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREFNIDQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHNvZnR3YXJlIHZlcnNpb24uIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIElmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHplcm8gYnV0IHNtYWxsZXIgdGhhbiA6OkFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoIHdpbGwgYmUgc2V0IHRvIHNhbWUgdmFsdWUuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuIFRoZSBvcGVyYXRpbmcgbW9kZSBvZiB0aGUgTVBFRyBTdXJyb3VuZCBtb2R1bGUgd2lsbCBiZSBzZXQgYWNjb3JkaW5nbHkuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuIFNldHRpbmcgdGhpcyBwYXJhbSB3aXRoIGFueSB2YWx1ZSB3aWxsIGRpc2FibGUgdGhlIGJpbmF1cmFsIHByb2Nlc3Npbmcgb2YgdGhlIE1QRUcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vycm91bmQgbW9kdWxlICg6OkFBQ19NUEVHU19CSU5BVVJBTF9FTkFCTEU9MCkuICovCgogIEFBQ19DT05DRUFMX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDEwMCwgIC8qITwgRXJyb3IgY29uY2VhbG1lbnQ6IFByb2Nlc3NpbmcgbWV0aG9kLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogU3BlY3RyYWwgbXV0aW5nLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogTm9pc2Ugc3Vic3RpdHV0aW9uIChzZWUgOjpDT05DRUFMX05PSVNFKS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6IEVuZXJneSBpbnRlcnBvbGF0aW9uIChhZGRzIGFkZGl0aW9uYWwgc2lnbmFsIGRlbGF5IG9mIG9uZSBmcmFtZSwgc2VlIDo6Q09OQ0VBTF9JTlRFUikuIFxuICovCgogIEFBQ19EUkNfQk9PU1RfRkFDVE9SICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMCwgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBTY2FsaW5nIGZhY3RvciBmb3IgYm9vc3RpbmcgZ2FpbiB2YWx1ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIGhvdyB0aGUgYm9vc3RpbmcgRFJDIGZhY3RvcnMgKGNvbnZleWVkIGluIHRoZSBiaXRzdHJlYW0pIHdpbGwgYmUgYXBwbGllZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgc2lnbmFsLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoZG9uJ3QgYXBwbHkgYm9vc3QgZmFjdG9ycykgdG8gMTI3IChmdWxseQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHkgYWxsIGJvb3N0aW5nIGZhY3RvcnMpLiAqLwogIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SICAgICAgICAgICAgICA9IDB4MDIwMSwgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBTY2FsaW5nIGZhY3RvciBmb3IgYXR0ZW51YXRpbmcgZ2FpbiB2YWx1ZXMuIFNhbWUgYXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ19EUkNfQk9PU1RfRkFDVE9SIGJ1dCBmb3IgYXR0ZW51YXRpbmcgRFJDIGZhY3RvcnMuICovCiAgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwgICAgICAgICAgICAgICAgID0gMHgwMjAyLCAgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IFRhcmdldCByZWZlcmVuY2UgbGV2ZWwuIERlZmluZXMgdGhlIGxldmVsIGJlbG93IGZ1bGwtc2NhbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxdWFudGl6ZWQgaW4gc3RlcHMgb2YgMC4yNWRCKSB0byB3aGljaCB0aGUgb3V0cHV0IGF1ZGlvIHNpZ25hbCB3aWxsIGJlIG5vcm1hbGl6ZWQgdG8gYnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBEUkMgbW9kdWxlLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoZnVsbC1zY2FsZSkgdG8gMTI3ICgzMS43NSBkQiBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbC1zY2FsZSkuIFRoZSB2YWx1ZSBzbWFsbGVyIHRoYW4gMCBzd2l0Y2hlcyBvZmYgbm9ybWFsaXphdGlvbi4gKi8KICBBQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OICAgICAgICAgICAgICAgPSAweDAyMDMsICAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogRW4tL0Rpc2FibGUgRFZCIHNwZWNpZmljIGhlYXZ5IGNvbXByZXNzaW9uIChha2EgUkYgbW9kZSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gMSwgdGhlIGRlY29kZXIgd2lsbCBhcHBseSB0aGUgY29tcHJlc3Npb24gdmFsdWVzIGZyb20gdGhlIERWQiBzcGVjaWZpYyBhbmNpbGxhcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgZmllbGQuIEF0IHRoZSBzYW1lIHRpbWUgdGhlIE1QRUctNCBEeW5hbWljIFJhbmdlIENvbnRyb2wgdG9vbCB3aWxsIGJlIGRpc2FibGVkLiBCeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBoZWF2eSBjb21wcmVzc2lvbiBpcyBkaXNhYmxlZC4gKi8KCiAgQUFDX1FNRl9MT1dQT1dFUiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAwLCAgLyohPCBRdWFkcmF0dXJlIE1pcnJvciBGaWx0ZXIgKFFNRikgQmFuayBwcm9jZXNzaW5nIG1vZGUuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTogVXNlIGludGVybmFsIGRlZmF1bHQuIEltcGxpZXMgTVBFRyBTdXJyb3VuZCBwYXJ0aWFsbHkgY29tcGxleCBhY2NvcmRpbmdseS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBVc2UgY29tcGxleCBRTUYgZGF0YSBtb2RlLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFVzZSByZWFsIChsb3cgcG93ZXIpIFFNRiBkYXRhIG1vZGUuIFxuICovCgogIEFBQ19NUEVHU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMCwgIC8qITwgTVBFRyBTdXJyb3VuZDogQWxsb3cvRGlzYWJsZSBkZWNvZGluZyBvZiBNUFMgY29udGVudC4gQXZhaWxhYmxlIG9ubHkgZm9yIGRlY29kZXJzIHdpdGggTVBFRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vycm91bmQgc3VwcG9ydC4gKi8KCiAgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiAgICAgICAgICAgICAgICAgID0gMHgwNjAzICAgLyohPCBDbGVhciBpbnRlcm5hbCBiaXQgc3RyZWFtIGJ1ZmZlciBvZiB0cmFuc3BvcnQgbGF5ZXJzLiBUaGUgZGVjb2RlciB3aWxsIHN0YXJ0IGRlY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBuZXcgZGF0YSBwYXNzZWQgYWZ0ZXIgdGhpcyBldmVudCBhbmQgYW55IHByZXZpb3VzIGRhdGEgaXMgZGlzY2FyZGVkLiAqLwoKfSBBQUNERUNfUEFSQU07CgovKioKICogXGJyaWVmIFRoaXMgc3RydWN0dXJlIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgZGVjb2RlZCBhdWRpbyBkYXRhLgogKiAgICAgICAgQWxsIGZpZWxkcyBhcmUgcmVhZC1vbmx5LgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogIC8qIFRoZXNlIGZpdmUgbWVtYmVycyBhcmUgdGhlIG9ubHkgcmVhbGx5IHJlbGV2YW50IG9uZXMgZm9yIHRoZSB1c2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgSU5UICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTsgICAgICAgICAgLyohPCBUaGUgc2FtcGxlcmF0ZSBpbiBIeiBvZiB0aGUgZnVsbHkgZGVjb2RlZCBQQ00gYXVkaW8gc2lnbmFsIChhZnRlciBTQlIgcHJvY2Vzc2luZykuICAgKi8KICBJTlQgICAgICAgICAgICAgICBmcmFtZVNpemU7ICAgICAgICAgICAvKiE8IFRoZSBmcmFtZSBzaXplIG9mIHRoZSBkZWNvZGVkIFBDTSBhdWRpbyBzaWduYWwuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0IG9yIDk2MCBmb3IgQUFDLUxDIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4IG9yIDE5MjAgZm9yIEhFLUFBQyAodjIpIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIgb3IgNDgwIGZvciBBQUMtTEQgYW5kIEFBQy1FTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBJTlQgICAgICAgICAgICAgICBudW1DaGFubmVsczsgICAgICAgICAvKiE8IFRoZSBudW1iZXIgb2Ygb3V0cHV0IGF1ZGlvIGNoYW5uZWxzIGluIHRoZSBkZWNvZGVkIGFuZCBpbnRlcmxlYXZlZCBQQ00gYXVkaW8gc2lnbmFsLiAqLwogIEFVRElPX0NIQU5ORUxfVFlQRSAqcENoYW5uZWxUeXBlOyAgICAgIC8qITwgQXVkaW8gY2hhbm5lbCB0eXBlIG9mIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgVUNIQVIgICAgICAgICAgICAgKnBDaGFubmVsSW5kaWNlczsgICAgLyohPCBBdWRpbyBjaGFubmVsIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgOC41LjMuMiBFeHBsaWNpdCBjaGFubmVsIG1hcHBpbmcgdXNpbmcgYSBwcm9ncmFtX2NvbmZpZ19lbGVtZW50KCkgKi8KICAvKiBEZWNvZGVyIGludGVybmFsIG1lbWJlcnMuICovCiAgSU5UICAgICAgICAgICAgICAgYWFjU2FtcGxlUmF0ZTsgICAgICAgLyohPCBTYW1wbGluZyByYXRlIGluIEh6IHdpdGhvdXQgU0JSIChmcm9tIGNvbmZpZ3VyYXRpb24gaW5mbykuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBJTlQgICAgICAgICAgICAgICBwcm9maWxlOyAgICAgICAgICAgICAvKiE8IE1QRUctMiBwcm9maWxlIChmcm9tIGZpbGUgaGVhZGVyKSAoLTE6IG5vdCBhcHBsaWNhYmxlIChlLiBnLiBNUEVHLTQpKS4gICAgICAgICAgICAgICAqLwogIEFVRElPX09CSkVDVF9UWVBFIGFvdDsgICAgICAgICAgICAgICAgIC8qITwgQXVkaW8gT2JqZWN0IFR5cGUgKGZyb20gQVNDKTogaXMgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgTVBFRy0yIGJpdHN0cmVhbXMgKGUuIGcuIDIgZm9yIEFBQy1MQykuICovCiAgSU5UICAgICAgICAgICAgICAgY2hhbm5lbENvbmZpZzsgICAgICAgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKDA6IFBDRSBkZWZpbmVkLCAxOiBtb25vLCAyOiBzdGVyZW8sIC4uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KICBJTlQgICAgICAgICAgICAgICBiaXRSYXRlOyAgICAgICAgICAgICAvKiE8IEluc3RhbnRhbmVvdXMgYml0IHJhdGUuICAgICAgICAgICAgICAgICAgICovCiAgSU5UICAgICAgICAgICAgICAgYWFjU2FtcGxlc1BlckZyYW1lOyAgLyohPCBTYW1wbGVzIHBlciBmcmFtZSBmb3IgdGhlIEFBQyBjb3JlIChmcm9tIEFTQykuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0IG9yIDk2MCBmb3IgQUFDLUxDIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIgb3IgNDgwIGZvciBBQUMtTEQgYW5kIEFBQy1FTEQgICAgICAgICAqLwogIElOVCAgICAgICAgICAgICAgIGFhY051bUNoYW5uZWxzOyAgICAgIC8qITwgVGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBhZnRlciBBQUMgY29yZSBwcm9jZXNzaW5nIChiZWZvcmUgUFMgb3IgTVBTIHByb2Nlc3NpbmcpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FVVElPTjogVGhpcyBhcmUgbm90IHRoZSBmaW5hbCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzISAqLwogIEFVRElPX09CSkVDVF9UWVBFIGV4dEFvdDsgICAgICAgICAgICAgIC8qITwgRXh0ZW5zaW9uIEF1ZGlvIE9iamVjdCBUeXBlIChmcm9tIEFTQykgICAqLwogIElOVCAgICAgICAgICAgICAgIGV4dFNhbXBsaW5nUmF0ZTsgICAgIC8qITwgRXh0ZW5zaW9uIHNhbXBsaW5nIHJhdGUgaW4gSHogKGZyb20gQVNDKSAqLwoKICBVSU5UICAgICAgICAgICAgICBvdXRwdXREZWxheTsgICAgICAgICAvKiE8IFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGUgb3V0cHV0IGlzIGFkZGl0aW9uYWxseSBkZWxheWVkIGJ5IHRoZSBkZWNvZGVyLiAqLwoKICBVSU5UICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAgICAvKiE8IENvcHkgb2YgaW50ZXJuYWwgZmxhZ3MuIE9ubHkgdG8gYmUgd3JpdHRlbiBieSB0aGUgZGVjb2RlciwgYW5kIG9ubHkgdG8gYmUgcmVhZCBleHRlcm5hbGx5LiAqLwoKICBTQ0hBUiAgICAgICAgICAgICBlcENvbmZpZzsgICAgICAgICAgICAvKiE8IGVwQ29uZmlnIGxldmVsIChmcm9tIEFTQyk6IG9ubHkgbGV2ZWwgMCBzdXBwb3J0ZWQsIC0xIG1lYW5zIG5vIEVSIChlLiBnLiBBT1Q9MiwgTVBFRy0yIEFBQywgZXRjLikgICovCgogIC8qIFN0YXRpc3RpY3MgKi8KICBJTlQgICAgICAgICAgICAgICBudW1Mb3N0QWNjZXNzVW5pdHM7ICAvKiE8IFRoaXMgaW50ZWdlciB3aWxsIHJlZmxlY3QgdGhlIGVzdGltYXRlZCBhbW91bnQgb2YgbG9zdCBhY2Nlc3MgdW5pdHMgaW4gY2FzZSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgQUFDX0RFQ19UUkFOU1BPUlRfU1lOQ19FUlJPUi4gSXQgd2lsbCBiZSA8IDAgaWYgdGhlIGVzdGltYXRpb24gZmFpbGVkLiAqLwoKICBVSU5UICAgICAgICAgICAgICBudW1Ub3RhbEJ5dGVzOyAgICAgICAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBieXRlcyB0aGF0IGhhdmUgcGFzc2VkIHRocm91Z2ggdGhlIGRlY29kZXIuICovCiAgVUlOVCAgICAgICAgICAgICAgbnVtQmFkQnl0ZXM7ICAgICAgICAgLyohPCBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMgdGhhdCB3ZXJlIGNvbnNpZGVyZWQgd2l0aCBlcnJvcnMgZnJvbSBudW1Ub3RhbEJ5dGVzLiAqLwogIFVJTlQgICAgICAgICAgICAgIG51bVRvdGFsQWNjZXNzVW5pdHM7IC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGFjY2VzcyB1bml0cyB0aGF0IGhhdmUgcGFzc2VkIHRocm91Z2ggdGhlIGRlY29kZXIuICovCiAgVUlOVCAgICAgICAgICAgICAgbnVtQmFkQWNjZXNzVW5pdHM7ICAgLyohPCBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdG90YWwgYWNjZXNzIHVuaXRzIHRoYXQgd2VyZSBjb25zaWRlcmVkIHdpdGggZXJyb3JzIGZyb20gbnVtVG90YWxCeXRlcy4gKi8KCiAgLyogTWV0YWRhdGEgKi8KICBTQ0hBUiAgICAgICAgICAgICBkcmNQcm9nUmVmTGV2OyAgICAgICAvKiE8IERSQyBwcm9ncmFtIHJlZmVyZW5jZSBsZXZlbC4gRGVmaW5lcyB0aGUgcmVmZXJlbmNlIGxldmVsIGJlbG93IGZ1bGwtc2NhbGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBxdWFudGl6ZWQgaW4gc3RlcHMgb2YgMC4yNWRCLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoMCBkQkZTKSB0byAxMjcgKC0zMS43NSBkQkZTKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHVzZWQgdG8gcmVmbGVjdCB0aGUgYXZlcmFnZSBsb3VkbmVzcyBvZiB0aGUgYXVkaW8gaW4gTEtGUyBhY2NvcmluZyB0byBJVFUtUiBCUyAxNzcwLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm8gbGV2ZWwgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGJpdHN0cmVhbSB0aGUgdmFsdWUgaXMgLTEuICovCiAgU0NIQVIgICAgICAgICAgICAgZHJjUHJlc01vZGU7ICAgICAgICAgLyohPCBEUkMgcHJlc2VudGF0aW9uIG1vZGUuIEFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHdoZXRoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0IChNUEVHLTQgRHluYW1pYyBSYW5nZSBDb250cm9sIHRvb2wpIG9yIGhlYXZ5IGNvbXByZXNzaW9uIChEVkIgaGVhdnkgY29tcHJlc3Npb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljIHJhbmdlIGNvbnRyb2wgc2hhbGwgdGFrZSBwcmlvcml0eSBvbiB0aGUgb3V0cHV0cy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgRVRTSSBUUyAxMDEgMTU0LCB0YWJsZSBDLjMzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE6IE5vIGNvcnJlc3BvbmRpbmcgbWV0YWRhdGEgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IERSQyBwcmVzZW50YXRpb24gbW9kZSBub3QgaW5kaWNhdGVkIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRFJDIHByZXNlbnRhdGlvbiBtb2RlIDEgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgMiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6IFJlc2VydmVkICovCgp9IENTdHJlYW1JbmZvOwoKCnR5cGVkZWYgc3RydWN0IEFBQ19ERUNPREVSX0lOU1RBTkNFICpIQU5ETEVfQUFDREVDT0RFUjsgIC8qITwgUG9pbnRlciB0byBhIEFBQyBkZWNvZGVyIGluc3RhbmNlLiAqLwoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKewojZW5kaWYKCi8qKgogKiBcYnJpZWYgSW5pdGlhbGl6ZSBhbmNpbGxhcnkgZGF0YSBidWZmZXIuCiAqCiAqIFxwYXJhbSBzZWxmICAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KICogXHBhcmFtIGJ1ZmZlciAgUG9pbnRlciB0byAoZXh0ZXJuYWwpIGFuY2lsbGFyeSBkYXRhIGJ1ZmZlci4KICogXHBhcmFtIHNpemUgICAgU2l6ZSBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYnVmZmVyLgogKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgogKi8KTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX0FuY0RhdGFJbml0ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHNpemUgKTsKCi8qKgogKiBcYnJpZWYgR2V0IG9uZSBhbmNpbGxhcnkgZGF0YSBlbGVtZW50LgogKgogKiBccGFyYW0gc2VsZiAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KICogXHBhcmFtIGluZGV4ICBJbmRleCBvZiB0aGUgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudCB0byBnZXQuCiAqIFxwYXJhbSBwdHIgICAgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgYSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KICogXHBhcmFtIHNpemUgICBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0ZWQgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgogKi8KTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX0FuY0RhdGFHZXQgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICoqcHRyLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpzaXplICk7CgovKioKICogXGJyaWVmIFNldCBvbmUgc2luZ2xlIGRlY29kZXIgcGFyYW1ldGVyLgogKgogKiBccGFyYW0gc2VsZiAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KICogXHBhcmFtIHBhcmFtICBQYXJhbWV0ZXIgdG8gYmUgc2V0LgogKiBccGFyYW0gdmFsdWUgIFBhcmFtZXRlciB2YWx1ZS4KICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgogKi8KTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX1NldFBhcmFtICggY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNERUNfUEFSQU0gICAgICAgcGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgdmFsdWUgKTsKCgovKioKICogXGJyaWVmICAgICAgICAgICAgICBHZXQgZnJlZSBieXRlcyBpbnNpZGUgZGVjb2RlciBpbnRlcm5hbCBidWZmZXIKICogXHBhcmFtIHNlbGYgICAgSGFuZGxlIG9mIEFBQyBkZWNvZGVyIGluc3RhbmNlCiAqIFxwYXJhbSBwRnJlZUJ5dGVzIFBvaW50ZXIgdG8gdmFyaWFibGUgcmVjZXZpbmcgYW1vdW50IG9mIGZyZWUgYnl0ZXMgaW5zaWRlIGRlY29kZXIgaW50ZXJuYWwgYnVmZmVyCiAqIFxyZXR1cm4gICAgICAgICAgICAgRXJyb3IgY29kZQogKi8KTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX0dldEZyZWVCeXRlcyAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBGcmVlQnl0ZXMpOwoKLyoqCiAqIFxicmllZiAgICAgICAgICAgICAgIE9wZW4gYW4gQUFDIGRlY29kZXIgaW5zdGFuY2UKICogXHBhcmFtIHRyYW5zcG9ydEZtdCAgVGhlIHRyYW5zcG9ydCB0eXBlIHRvIGJlIHVzZWQKICogXHJldHVybiAgICAgICAgICAgICAgQUFDIGRlY29kZXIgaGFuZGxlCiAqLwpMSU5LU1BFQ19IIEhBTkRMRV9BQUNERUNPREVSCmFhY0RlY29kZXJfT3BlbiAoIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdCwgVUlOVCBuck9mTGF5ZXJzICk7CgovKioKICogXGJyaWVmIEV4cGxpY2l0bHkgY29uZmlndXJlIHRoZSBkZWNvZGVyIGJ5IHBhc3NpbmcgYSByYXcgQXVkaW9TcGVjaWZpY0NvbmZpZyAoQVNDKSBvciBhIFN0cmVhbU11eENvbmZpZyAoU01DKSwKICogIGNvbnRhaW5lZCBpbiBhIGJpbmFyeSBidWZmZXIuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIE1QRUctNCBhbmQgUmF3IFBhY2tldHMgZmlsZSBmb3JtYXQgYml0c3RyZWFtcwogKiAgYXMgd2VsbCBhcyBmb3IgTEFUTSBiaXRzdHJlYW1zIHdpdGggbm8gaW4tYmFuZCBTTUMuIElmIHRoZSB0cmFuc3BvcnQgZm9ybWF0IGlzIExBVE0gd2l0aCBvciB3aXRob3V0CiAqICBMT0FTLCBjb25maWd1cmF0aW9uIGlzIGFzc3VtZWQgdG8gYmUgYW4gU01DLCBmb3IgYWxsIG90aGVyIGZpbGUgZm9ybWF0cyBhbiBBU0MuCiAqCiAqIFxwYXJhbSBzZWxmICAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KICogXHBhcmFtIGNvbmYgICAgUG9pbnRlciB0byBhbiB1bnNpZ25lZCBjaGFyIGJ1ZmZlciBjb250YWluaW5nIHRoZSBiaW5hcnkgY29uZmlndXJhdGlvbiBidWZmZXIgKGVpdGhlciBBU0Mgb3IgU01DKS4KICogXHBhcmFtIGxlbmd0aCAgTGVuZ3RoIG9mIHRoZSBjb25maWd1cmF0aW9uIGJ1ZmZlciBpbiBieXRlcy4KICogXHJldHVybiAgICAgICAgRXJyb3IgY29kZS4KICovCkxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKYWFjRGVjb2Rlcl9Db25maWdSYXcgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgKmNvbmZbXSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICBsZW5ndGhbXSApOwoKCi8qKgogKiBcYnJpZWYgRmlsbCBBQUMgZGVjb2RlcidzIGludGVybmFsIGlucHV0IGJ1ZmZlciB3aXRoIGJpdHN0cmVhbSBkYXRhIGZyb20gdGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4KICogIFRoZSBmdW5jdGlvbiBvbmx5IGNvcGllcyBzdWNoIGRhdGEgYXMgbG9uZyBhcyB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIgaXMgbm90IGZ1bGwuCiAqICBTbyBpdCBncmFicyB3aGF0ZXZlciBpdCBjYW4gZnJvbSBwQnVmZmVyIGFuZCByZXR1cm5zIGluZm9ybWF0aW9uIChieXRlc1ZhbGlkKSBzbyB0aGF0IGF0IGEKICogIHN1YnNlcXVlbnQgY2FsbCBvZiAlYWFjRGVjb2Rlcl9GaWxsKCksIHRoZSByaWdodCBwb3NpdGlvbiBpbiBwQnVmZmVyIGNhbiBiZSBkZXRlcm1pbmVkIHRvCiAqICBncmFiIHRoZSBuZXh0IGRhdGEuCiAqCiAqIFxwYXJhbSBzZWxmICAgICAgICBBQUMgZGVjb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBwQnVmZmVyICAgICBQb2ludGVyIHRvIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4KICogXHBhcmFtIGJ1ZmZlclNpemUgIFNpemUgb2YgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGJlY2F1c2UgZGVjb2Rlci1pbnRlcm5hbGx5CiAqICAgICAgICAgICAgICAgICAgICB3ZSBuZWVkIHRoZSBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCB0byBwQnVmZmVyLCB3aGVyZSB0aGUgbmV4dAogKiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGRhdGEgaXMsIHdoaWNoIGlzIHRoZW4gZmVkIGludG8gdGhlIGRlY29kZXItaW50ZXJuYWwgYnVmZmVyIChhcyBtdWNoCiAqICAgICAgICAgICAgICAgICAgICBhcyBwb3NzaWJsZSkuIE91ciBleGFtcGxlIGZyYW1ld29yayBpbXBsZW1lbnRhdGlvbiBmaWxscyB0aGUgYnVmZmVyIGF0IHBCdWZmZXIKICogICAgICAgICAgICAgICAgICAgIGFnYWluLCBvbmNlIGl0IGNvbnRhaW5zIG5vIGF2YWlsYWJsZSB2YWxpZCBieXRlcyBhbnltb3JlIChtZWFuaW5nIGJ5dGVzVmFsaWQgZXF1YWwgMCkuCiAqIFxwYXJhbSBieXRlc1ZhbGlkICBOdW1iZXIgb2YgYml0c3RyZWFtIGJ5dGVzIGluIHRoZSBleHRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4KICogICAgICAgICAgICAgICAgICAgIGNvcGllZCBpbnRvIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAqICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFtb3VudCBvZiBuZXdseSBjb3BpZWQgYnl0ZXMuCiAqIFxyZXR1cm4gICAgICAgICAgICBFcnJvciBjb2RlLgogKi8KTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX0ZpbGwgKCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwKICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgKnBCdWZmZXJbXSwKICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgIGJ1ZmZlclNpemVbXSwKICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgKmJ5dGVzVmFsaWQgKTsKCiNkZWZpbmUgQUFDREVDX0NPTkNFQUwgIDEgLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IFRyaWdnZXIgdGhlIGJ1aWx0LWluIGVycm9yIGNvbmNlYWxtZW50IG1vZHVsZSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGdlbmVyYXRlIGEgc3Vic3RpdHV0ZSBzaWduYWwgZm9yIG9uZSBsb3N0IGZyYW1lLiBOZXcgaW5wdXQgZGF0YSB3aWxsIG5vdCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zaWRlcmVkLiAqLwojZGVmaW5lIEFBQ0RFQ19GTFVTSCAgICAyIC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBGbHVzaCBhbGwgZmlsdGVyYmFua3MgdG8gZ2V0IGFsbCBkZWxheWVkIGF1ZGlvIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBoYXZpbmcgbmV3IGlucHV0IGRhdGEuIFRodXMgbmV3IGlucHV0IGRhdGEgd2lsbCBub3QgYmUgY29uc2lkZXJlZC4qLwojZGVmaW5lIEFBQ0RFQ19JTlRSICAgICA0IC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBTaWduYWwgYW4gaW5wdXQgYml0IHN0cmVhbSBkYXRhIGRpc2NvbnRpbnVpdHkuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzeW5jIGFueSBpbnRlcm5hbHMgYXMgbmVjZXNzYXJ5LiAqLwojZGVmaW5lIEFBQ0RFQ19DTFJISVNUICA4IC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBDbGVhciBhbGwgc2lnbmFsIGRlbGF5IGxpbmVzIGFuZCBoaXN0b3J5IGJ1ZmZlcnMuXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVVUSU9OOiBUaGlzIGNhbiBjYXVzZSBkaXNjb250aW51aXRpZXMgaW4gdGhlIG91dHB1dCBzaWduYWwuICovCgovKioKICogXGJyaWVmICAgICAgICAgICAgRGVjb2RlIG9uZSBhdWRpbyBmcmFtZQogKgogKiBccGFyYW0gc2VsZiAgICAgICBBQUMgZGVjb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBwVGltZURhdGEgIFBvaW50ZXIgdG8gZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlciB3aGVyZSB0aGUgZGVjb2RlZCBQQ00gc2FtcGxlcyB3aWxsIGJlIHN0b3JlZCBpbnRvLgogKiBccGFyYW0gZmxhZ3MgICAgICBCaXQgZmllbGQgd2l0aCBmbGFncyBmb3IgdGhlIGRlY29kZXI6IFxuCiAqICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSA9PSAxOiBEbyBjb25jZWFsbWVudC4gXG4KICogICAgICAgICAgICAgICAgICAgKGZsYWdzICYgQUFDREVDX0ZMVVNIKSA9PSAyOiBEaXNjYXJkIGlucHV0IGRhdGEuIEZsdXNoIGZpbHRlciBiYW5rcyAob3V0cHV0IGRlbGF5ZWQgYXVkaW8pLiBcbgogKiAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfSU5UUikgPT0gNDogSW5wdXQgZGF0YSBpcyBkaXNjb250aW51b3VzLiBSZXN5bmNocm9uaXplIGFueSBpbnRlcm5hbHMgYXMgbmVjZXNzYXJ5LgogKiBccmV0dXJuICAgICAgICAgICBFcnJvciBjb2RlLgogKi8KTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX0RlY29kZUZyYW1lICggSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAqcFRpbWVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgIHRpbWVEYXRhU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncyApOwoKLyoqCiAqIFxicmllZiAgICAgICBEZS1hbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIG9mIGFuIEFBQyBkZWNvZGVyIGluc3RhbmNlLgogKgogKiBccGFyYW0gc2VsZiAgQUFDIGRlY29kZXIgaGFuZGxlLgogKiBccmV0dXJuICAgICAgdm9pZAogKi8KTElOS1NQRUNfSCB2b2lkIGFhY0RlY29kZXJfQ2xvc2UgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICk7CgovKioKICogXGJyaWVmICAgICAgIEdldCBDU3RyZWFtSW5mbyBoYW5kbGUgZnJvbSBkZWNvZGVyLgogKgogKiBccGFyYW0gc2VsZiAgQUFDIGRlY29kZXIgaGFuZGxlLgogKiBccmV0dXJuICAgICAgUmVmZXJlbmNlIHRvIHJlcXVlc3RlZCBDU3RyZWFtSW5mby4KICovCkxJTktTUEVDX0ggQ1N0cmVhbUluZm8qIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApOwoKLyoqCiAqIFxicmllZiAgICAgICBHZXQgZGVjb2RlciBsaWJyYXJ5IGluZm8uCiAqCiAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3R1cmUuCiAqIFxyZXR1cm4gICAgICAwIG9uIHN1Y2Nlc3MKICovCkxJTktTUEVDX0ggSU5UIGFhY0RlY29kZXJfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsKCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAvKiBBQUNERUNPREVSX0xJQl9IICovCg==