LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIENvcHlyaWdodCAoYykgMjAxMCwgQXRtZWwgQ29ycG9yYXRpb24NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogKg0KICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGRpc2NsYWltZXIgYmVsb3cuDQogKg0KICogQXRtZWwncyBuYW1lIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIERJU0NMQUlNRVI6IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVRNRUwgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1INCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQogKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBVE1FTCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQogKiBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KDQovKioNCiAqIFxmaWxlDQogKg0KICogXHNlY3Rpb24gUHVycG9zZQ0KICoNCiAqICAgRGVmaW5pdGlvbnMgYW5kIG1ldGhvZHMgZm9yIFVTQiBjb21wb3NpdGUgZGV2aWNlIGltcGxlbWVudC4NCiAqIA0KICovDQoNCiNpZm5kZWYgQ0RDQVVERERSSVZFUl9IDQojZGVmaW5lIENEQ0FVREREUklWRVJfSA0KLyoqIFxhZGR0b2dyb3VwIHVzYmRfY29tcG9zaXRlX2NkY2F1ZA0KICpAew0KICovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgIEhlYWRlcnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2luY2x1ZGUgPFVTQlJlcXVlc3RzLmg+DQojaW5jbHVkZSA8Q0RDRGVzY3JpcHRvcnMuaD4NCiNpbmNsdWRlIDxBVUREZXNjcmlwdG9ycy5oPg0KI2luY2x1ZGUgIlVTQkQuaCINCiNpbmNsdWRlIDxVU0JERHJpdmVyLmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgIERlZmluaXRpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKiBcYWRkdG9ncm91cCB1c2JkX2NkY19hdWRfZGVzYyBVU0IgQ0RDKFNlcmlhbCkgKyBBVUQoU3BlYWtlcikgRGVmaW5pdGlvbnMNCiAqICAgICAgQHsNCiAqLw0KLyoqIE51bWJlciBvZiBpbnRlcmZhY2VzIG9mIHRoZSBkZXZpY2UgKDUsIGNhbiBiZSA0IGlmIG5vIG1pYyBzdXBwb3J0ICovDQojZGVmaW5lIENEQ0FVREREcml2ZXJEZXNjcmlwdG9yc19NYXhOdW1JbnRlcmZhY2VzICAgNQ0KLyoqIE51bWJlciBvZiB0aGUgQ0RDIGludGVyZmFjZS4gKi8NCiNkZWZpbmUgQ0RDQVVERERyaXZlckRlc2NyaXB0b3JzX0NEQ19JTlRFUkZBQ0UgICAgICAwDQovKiogTnVtYmVyIG9mIHRoZSBBdWRpbyBpbnRlcmZhY2UuICovDQojZGVmaW5lIENEQ0FVREREcml2ZXJEZXNjcmlwdG9yc19BVURfSU5URVJGQUNFICAgICAgMg0KLyoqIE51bWJlciBvZiBBdWRpbyBmdW5jdGlvbiBjaGFubmVscyAoTSxMLFIpICovDQojZGVmaW5lIEFVRERfTnVtQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMw0KLyoqICAgICBAfSovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgIFR5cGVzDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojcHJhZ21hIHBhY2soMSkNCiNpZiBkZWZpbmVkICAgKCBfX0NDX0FSTSAgICkgLyogS2VpbCCmzFZpc2lvbiA0ICovDQojZWxpZiBkZWZpbmVkICggX19JQ0NBUk1fXyApIC8qIElBUiBFd2FybSAqLw0KI2RlZmluZSBfX2F0dHJpYnV0ZV9fKC4uLikNCiNkZWZpbmUgX19wYWNrZWRfXyAgcGFja2VkDQojZWxpZiBkZWZpbmVkICggIF9fR05VQ19fICApIC8qIEdDQyBDUzMgKi8NCiNkZWZpbmUgX19wYWNrZWRfXyAgYWxpZ25lZCgxKQ0KI2VuZGlmDQoNCi8qKiBBdWRpbyBoZWFkZXIgZGVzY3JpcHRvciB3aXRoIDEgaW50ZXJmYWNlICovDQp0eXBlZGVmIHN0cnVjdCBfQVVESGVhZGVyRGVzY3JpcHRvcjF7DQoNCiAgICAvKiogSGVhZGVyIGRlc2NyaXB0b3IuKi8NCiAgICBBVURIZWFkZXJEZXNjcmlwdG9yIGhlYWRlcjsNCiAgICAvKiogSWQgb2YgdGhlIGZpcnN0IGdyb3VwZWQgaW50ZXJmYWNlLiovDQogICAgdWludDhfdCBiSW50ZXJmYWNlMDsNCg0KfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEFVREhlYWRlckRlc2NyaXB0b3IxOw0KDQovKiogQXVkaW8gaGVhZGVyIGRlc2NyaXB0b3Igd2l0aCAyIGludGVyZmFjZSAqLw0KdHlwZWRlZiBzdHJ1Y3QgX0FVREhlYWRlckRlc2NyaXB0b3IyIHsNCg0KICAgIC8qKiBIZWFkZXIgZGVzY3JpcHRvci4gKi8NCiAgICBBVURIZWFkZXJEZXNjcmlwdG9yIGhlYWRlcjsNCiAgICAvKiogSWQgb2YgdGhlIGZpcnN0IGdyb3VwZWQgaW50ZXJmYWNlIC0gU3BlYWtlci4gKi8NCiAgICB1aW50OF90IGJJbnRlcmZhY2UwOw0KICAgIC8qKiBJZCBvZiB0aGUgc2Vjb25kIGdyb3VwZWQgaW50ZXJmYWNlIC0gU3BlYWtlcnBob25lLiAqLw0KICAgIHVpbnQ4X3QgYkludGVyZmFjZTE7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBBVURIZWFkZXJEZXNjcmlwdG9yMjsgLyogR0NDICovDQoNCi8qKg0KICogRmVhdHVyZSB1bml0IGRlc2NyaXB0b3Igd2l0aCAzIGNoYW5uZWwgY29udHJvbHMgKG1hc3RlciwgcmlnaHQsIGxlZnQpLg0KICovDQp0eXBlZGVmIHN0cnVjdCBfQVVERmVhdHVyZVVuaXREZXNjcmlwdG9yM3sNCg0KICAgIC8qKiBGZWF0dXJlIHVuaXQgZGVzY3JpcHRvci4qLw0KICAgIEFVREZlYXR1cmVVbml0RGVzY3JpcHRvciBmZWF0dXJlOw0KICAgIC8qKiBBdmFpbGFibGUgY29udHJvbHMgZm9yIGVhY2ggY2hhbm5lbC4qLw0KICAgIHVpbnQ4X3QgYm1hQ29udHJvbHNbQVVERF9OdW1DaGFubmVsc107DQogICAgLyoqIEluZGV4IG9mIGEgc3RyaW5nIGRlc2NyaXB0b3IgZm9yIHRoZSBmZWF0dXJlIHVuaXQuKi8NCiAgICB1aW50OF90IGlGZWF0dXJlOw0KDQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQVVERmVhdHVyZVVuaXREZXNjcmlwdG9yMzsNCg0KLyoqDQogKiBMaXN0IG9mIGRlc2NyaXB0b3JzIGZvciBkZXRhaWxsaW5nIHRoZSBhdWRpbyBjb250cm9sIGludGVyZmFjZSBvZiBhDQogKiBkZXZpY2UgdXNpbmcgYSBVU0IgYXVkaW8gc3BlYWtlciBmdW5jdGlvbi4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgX0FVRERTcGVha2VyQWNEZXNjcmlwdG9yc3sNCg0KICAgIC8qKiBIZWFkZXIgZGVzY3JpcHRvciAod2l0aCBvbmUgc2xhdmUgaW50ZXJmYWNlKS4qLw0KICAgIEFVREhlYWRlckRlc2NyaXB0b3IxIGhlYWRlcjsNCiAgICAvKiogSW5wdXQgdGVybWluYWwgZGVzY3JpcHRvci4qLw0KICAgIEFVRElucHV0VGVybWluYWxEZXNjcmlwdG9yIGlucHV0Ow0KICAgIC8qKiBPdXRwdXQgdGVybWluYWwgZGVzY3JpcHRvci4qLw0KICAgIEFVRE91dHB1dFRlcm1pbmFsRGVzY3JpcHRvciBvdXRwdXQ7DQogICAgLyoqIEZlYXR1cmUgdW5pdCBkZXNjcmlwdG9yLiovDQogICAgQVVERmVhdHVyZVVuaXREZXNjcmlwdG9yMyBmZWF0dXJlOw0KDQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQVVERFNwZWFrZXJBY0Rlc2NyaXB0b3JzOw0KDQovKioNCiAqIExpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIGRldGFpbGxpbmcgdGhlIGF1ZGlvIGNvbnRyb2wgaW50ZXJmYWNlIG9mIGENCiAqIGRldmljZSB1c2luZyBhIFVTQiBBdWRpbyBTcGVha2VycGhvbmVlciBmdW5jdGlvbi4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgX0FVRERTcGVha2VyUGhvbmVBY0Rlc2NyaXB0b3JzIHsNCg0KICAgIC8qKiBIZWFkZXIgZGVzY3JpcHRvciAod2l0aCBvbmUgc2xhdmUgaW50ZXJmYWNlKS4gKi8NCiAgICBBVURIZWFkZXJEZXNjcmlwdG9yMiBoZWFkZXI7DQogICAgLyoqIElucHV0IHRlcm1pbmFsIGRlc2NyaXB0b3IuICovDQogICAgQVVESW5wdXRUZXJtaW5hbERlc2NyaXB0b3IgaW5wdXRTcGVha2VyUGhvbmU7DQogICAgLyoqIE91dHB1dCB0ZXJtaW5hbCBkZXNjcmlwdG9yLiAqLw0KICAgIEFVRE91dHB1dFRlcm1pbmFsRGVzY3JpcHRvciBvdXRwdXRTcGVha2VyUGhvbmU7DQogICAgLyoqIEZlYXR1cmUgdW5pdCBkZXNjcmlwdG9yIC0gU3BlYWtlclBob25lLiAqLw0KICAgIEFVREZlYXR1cmVVbml0RGVzY3JpcHRvcjMgZmVhdHVyZVNwZWFrZXJQaG9uZTsNCiAgICAvKiogSW5wdXQgdGVybWluYWwgZGVzY3JpcHRvci4gKi8NCiAgICBBVURJbnB1dFRlcm1pbmFsRGVzY3JpcHRvciBpbnB1dFJlYzsNCiAgICAvKiogT3V0cHV0IHRlcm1pbmFsIGRlc2NyaXB0b3IuICovDQogICAgQVVET3V0cHV0VGVybWluYWxEZXNjcmlwdG9yIG91dHB1dFJlYzsNCiAgICAvKiogRmVhdHVyZSB1bml0IGRlc2NyaXB0b3IgLSBTcGVha2VyUGhvbmVwaG9uZS4gKi8NCiAgICBBVURGZWF0dXJlVW5pdERlc2NyaXB0b3IzIGZlYXR1cmVSZWM7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBBVUREU3BlYWtlclBob25lQWNEZXNjcmlwdG9yczsNCg0KLyoqDQogKiBGb3JtYXQgdHlwZSBJIGRlc2NyaXB0b3Igd2l0aCBvbmUgZGlzY3JldGUgc2FtcGxpbmcgZnJlcXVlbmN5Lg0KICovDQp0eXBlZGVmIHN0cnVjdCBfQVVERm9ybWF0VHlwZU9uZURlc2NyaXB0b3Ixew0KDQogICAgLyoqIEZvcm1hdCB0eXBlIEkgZGVzY3JpcHRvci4qLw0KICAgIEFVREZvcm1hdFR5cGVPbmVEZXNjcmlwdG9yIGZvcm1hdFR5cGU7DQogICAgLyoqIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIei4qLw0KICAgIHVpbnQ4X3QgdFNhbUZyZXFbM107DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBBVURGb3JtYXRUeXBlT25lRGVzY3JpcHRvcjE7DQoNCi8qKg0KICogQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGxpc3QgZm9yIGEgZGV2aWNlIGltcGxlbWVudGluZw0KICogQ0RDKFNlcmlhbCkgKyBBdWRpbyhTcGVha2VyKSBjb21wb3NpdGUgZHJpdmVyLg0KICovDQp0eXBlZGVmIHN0cnVjdCBfQ2RjQXVkc3BrZERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9ycyB7DQoNCiAgICAvKiogU3RhbmRhcmQgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb247DQoNCiAgICAvKiAtLS0gQ0RDIDAgKi8NCiAgICAvKiogSUFEIDAgKi8NCiAgICBVU0JJbnRlcmZhY2VBc3NvY2lhdGlvbkRlc2NyaXB0b3IgY2RjSUFEMDsNCiAgICAvKiogQ29tbXVuaWNhdGlvbiBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLw0KICAgIFVTQkludGVyZmFjZURlc2NyaXB0b3IgY2RjQ29tbXVuaWNhdGlvbjA7DQogICAgLyoqIENEQyBoZWFkZXIgZnVuY3Rpb25hbCBkZXNjcmlwdG9yLiAqLw0KICAgIENEQ0hlYWRlckRlc2NyaXB0b3IgY2RjSGVhZGVyMDsNCiAgICAvKiogQ0RDIGNhbGwgbWFuYWdlbWVudCBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDQ2FsbE1hbmFnZW1lbnREZXNjcmlwdG9yIGNkY0NhbGxNYW5hZ2VtZW50MDsNCiAgICAvKiogQ0RDIGFic3RyYWN0IGNvbnRyb2wgbWFuYWdlbWVudCBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDQWJzdHJhY3RDb250cm9sTWFuYWdlbWVudERlc2NyaXB0b3IgY2RjQWJzdHJhY3RDb250cm9sTWFuYWdlbWVudDA7DQogICAgLyoqIENEQyB1bmlvbiBmdW5jdGlvbmFsIGRlc2NyaXB0b3IgKHdpdGggb25lIHNsYXZlIGludGVyZmFjZSkuICovDQogICAgQ0RDVW5pb25EZXNjcmlwdG9yIGNkY1VuaW9uMDsNCiAgICAvKiogTm90aWZpY2F0aW9uIGVuZHBvaW50IGRlc2NyaXB0b3IuICovDQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIGNkY05vdGlmaWNhdGlvbjA7DQogICAgLyoqIERhdGEgaW50ZXJmYWNlIGRlc2NyaXB0b3IuICovDQogICAgVVNCSW50ZXJmYWNlRGVzY3JpcHRvciBjZGNEYXRhMDsNCiAgICAvKiogRGF0YSBPVVQgZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgY2RjRGF0YU91dDA7DQogICAgLyoqIERhdGEgSU4gZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgY2RjRGF0YUluMDsNCg0KICAgIC8qIC0tLSBBVURJTyAoQUMpICovDQogICAgLyoqIElBRCAxKi8NCiAgICBVU0JJbnRlcmZhY2VBc3NvY2lhdGlvbkRlc2NyaXB0b3IgYXVkSUFEOw0KICAgIC8qKiBBdWRpbyBjb250cm9sIGludGVyZmFjZS4qLw0KICAgIFVTQkludGVyZmFjZURlc2NyaXB0b3IgYXVkSW50ZXJmYWNlOw0KICAgIC8qKiBEZXNjcmlwdG9ycyBmb3IgdGhlIGF1ZGlvIGNvbnRyb2wgaW50ZXJmYWNlLiovDQogICAgQVVERFNwZWFrZXJBY0Rlc2NyaXB0b3JzIGF1ZENvbnRyb2w7DQogICAgLyogLS0gQVVESU8gb3V0IChBUykgKi8NCiAgICAvKiogU3RyZWFtaW5nIG91dCBpbnRlcmZhY2UgZGVzY3JpcHRvciAod2l0aCBubyBlbmRwb2ludCwgcmVxdWlyZWQpLiovDQogICAgVVNCSW50ZXJmYWNlRGVzY3JpcHRvciBhdWRTdHJlYW1pbmdPdXROb0lzb2Nocm9ub3VzOw0KICAgIC8qKiBTdHJlYW1pbmcgb3V0IGludGVyZmFjZSBkZXNjcmlwdG9yLiovDQogICAgVVNCSW50ZXJmYWNlRGVzY3JpcHRvciBhdWRTdHJlYW1pbmdPdXQ7DQogICAgLyoqIEF1ZGlvIGNsYXNzIGRlc2NyaXB0b3IgZm9yIHRoZSBzdHJlYW1pbmcgb3V0IGludGVyZmFjZS4qLw0KICAgIEFVRFN0cmVhbWluZ0ludGVyZmFjZURlc2NyaXB0b3IgYXVkU3RyZWFtaW5nT3V0Q2xhc3M7DQogICAgLyoqIFN0cmVhbSBmb3JtYXQgZGVzY3JpcHRvci4qLw0KICAgIEFVREZvcm1hdFR5cGVPbmVEZXNjcmlwdG9yMSBhdWRTdHJlYW1pbmdPdXRGb3JtYXRUeXBlOw0KICAgIC8qKiBTdHJlYW1pbmcgb3V0IGVuZHBvaW50IGRlc2NyaXB0b3IuKi8NCiAgICBBVURFbmRwb2ludERlc2NyaXB0b3IgYXVkU3RyZWFtaW5nT3V0RW5kcG9pbnQ7DQogICAgLyoqIEF1ZGlvIGNsYXNzIGRlc2NyaXB0b3IgZm9yIHRoZSBzdHJlYW1pbmcgb3V0IGVuZHBvaW50LiovDQogICAgQVVERGF0YUVuZHBvaW50RGVzY3JpcHRvciBhdWRTdHJlYW1pbmdPdXREYXRhRW5kcG9pbnQ7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBDZGNBdWRzcGtkRHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzOw0KDQovKioNCiAqIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciBsaXN0IGZvciBhIGRldmljZSBpbXBsZW1lbnRpbmcNCiAqIENEQyhTZXJpYWwpICsgQXVkaW8oU3BlYWtlclBob25lKSBjb21wb3NpdGUgZHJpdmVyLg0KICovDQp0eXBlZGVmIHN0cnVjdCBfQ2RjQXVkZERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9ycyB7DQoNCiAgICAvKiogU3RhbmRhcmQgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb247DQoNCiAgICAvKiAtLS0gQ0RDIDAgKi8NCiAgICAvKiogSUFEIDAgKi8NCiAgICBVU0JJbnRlcmZhY2VBc3NvY2lhdGlvbkRlc2NyaXB0b3IgY2RjSUFEMDsNCiAgICAvKiogQ29tbXVuaWNhdGlvbiBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLw0KICAgIFVTQkludGVyZmFjZURlc2NyaXB0b3IgY2RjQ29tbXVuaWNhdGlvbjA7DQogICAgLyoqIENEQyBoZWFkZXIgZnVuY3Rpb25hbCBkZXNjcmlwdG9yLiAqLw0KICAgIENEQ0hlYWRlckRlc2NyaXB0b3IgY2RjSGVhZGVyMDsNCiAgICAvKiogQ0RDIGNhbGwgbWFuYWdlbWVudCBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDQ2FsbE1hbmFnZW1lbnREZXNjcmlwdG9yIGNkY0NhbGxNYW5hZ2VtZW50MDsNCiAgICAvKiogQ0RDIGFic3RyYWN0IGNvbnRyb2wgbWFuYWdlbWVudCBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDQWJzdHJhY3RDb250cm9sTWFuYWdlbWVudERlc2NyaXB0b3IgY2RjQWJzdHJhY3RDb250cm9sTWFuYWdlbWVudDA7DQogICAgLyoqIENEQyB1bmlvbiBmdW5jdGlvbmFsIGRlc2NyaXB0b3IgKHdpdGggb25lIHNsYXZlIGludGVyZmFjZSkuICovDQogICAgQ0RDVW5pb25EZXNjcmlwdG9yIGNkY1VuaW9uMDsNCiAgICAvKiogTm90aWZpY2F0aW9uIGVuZHBvaW50IGRlc2NyaXB0b3IuICovDQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIGNkY05vdGlmaWNhdGlvbjA7DQogICAgLyoqIERhdGEgaW50ZXJmYWNlIGRlc2NyaXB0b3IuICovDQogICAgVVNCSW50ZXJmYWNlRGVzY3JpcHRvciBjZGNEYXRhMDsNCiAgICAvKiogRGF0YSBPVVQgZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgY2RjRGF0YU91dDA7DQogICAgLyoqIERhdGEgSU4gZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgY2RjRGF0YUluMDsNCg0KICAgIC8qIC0tLSBBVURJTyAoQUMpICovDQogICAgLyoqIElBRCAxKi8NCiAgICBVU0JJbnRlcmZhY2VBc3NvY2lhdGlvbkRlc2NyaXB0b3IgYXVkSUFEOw0KICAgIC8qKiBBdWRpbyBjb250cm9sIGludGVyZmFjZS4qLw0KICAgIFVTQkludGVyZmFjZURlc2NyaXB0b3IgYXVkSW50ZXJmYWNlOw0KICAgIC8qKiBEZXNjcmlwdG9ycyBmb3IgdGhlIGF1ZGlvIGNvbnRyb2wgaW50ZXJmYWNlLiovDQogICAgQVVERFNwZWFrZXJQaG9uZUFjRGVzY3JpcHRvcnMgYXVkQ29udHJvbDsNCiAgICAvKiAtLSBBVURJTyBvdXQgKEFTKSAqLw0KICAgIC8qKiBTdHJlYW1pbmcgb3V0IGludGVyZmFjZSBkZXNjcmlwdG9yICh3aXRoIG5vIGVuZHBvaW50LCByZXF1aXJlZCkuKi8NCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yIGF1ZFN0cmVhbWluZ091dE5vSXNvY2hyb25vdXM7DQogICAgLyoqIFN0cmVhbWluZyBvdXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IuKi8NCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yIGF1ZFN0cmVhbWluZ091dDsNCiAgICAvKiogQXVkaW8gY2xhc3MgZGVzY3JpcHRvciBmb3IgdGhlIHN0cmVhbWluZyBvdXQgaW50ZXJmYWNlLiovDQogICAgQVVEU3RyZWFtaW5nSW50ZXJmYWNlRGVzY3JpcHRvciBhdWRTdHJlYW1pbmdPdXRDbGFzczsNCiAgICAvKiogU3RyZWFtIGZvcm1hdCBkZXNjcmlwdG9yLiovDQogICAgQVVERm9ybWF0VHlwZU9uZURlc2NyaXB0b3IxIGF1ZFN0cmVhbWluZ091dEZvcm1hdFR5cGU7DQogICAgLyoqIFN0cmVhbWluZyBvdXQgZW5kcG9pbnQgZGVzY3JpcHRvci4qLw0KICAgIEFVREVuZHBvaW50RGVzY3JpcHRvciBhdWRTdHJlYW1pbmdPdXRFbmRwb2ludDsNCiAgICAvKiogQXVkaW8gY2xhc3MgZGVzY3JpcHRvciBmb3IgdGhlIHN0cmVhbWluZyBvdXQgZW5kcG9pbnQuKi8NCiAgICBBVUREYXRhRW5kcG9pbnREZXNjcmlwdG9yIGF1ZFN0cmVhbWluZ091dERhdGFFbmRwb2ludDsNCiAgICAvKi0gQVVESU8gSU4gKi8NCiAgICAvKiogU3RyZWFtaW5nIGluIGludGVyZmFjZSBkZXNjcmlwdG9yICh3aXRoIG5vIGVuZHBvaW50LCByZXF1aXJlZCkuICovDQogICAgVVNCSW50ZXJmYWNlRGVzY3JpcHRvciBzdHJlYW1pbmdJbk5vSXNvY2hyb25vdXM7DQogICAgLyoqIFN0cmVhbWluZyBpbiBpbnRlcmZhY2UgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yIHN0cmVhbWluZ0luOw0KICAgIC8qKiBBdWRpbyBjbGFzcyBkZXNjcmlwdG9yIGZvciB0aGUgc3RyZWFtaW5nIGluIGludGVyZmFjZS4gKi8NCiAgICBBVURTdHJlYW1pbmdJbnRlcmZhY2VEZXNjcmlwdG9yIHN0cmVhbWluZ0luQ2xhc3M7DQogICAgLyoqIFN0cmVhbSBmb3JtYXQgZGVzY3JpcHRvci4gKi8NCiAgICBBVURGb3JtYXRUeXBlT25lRGVzY3JpcHRvcjEgc3RyZWFtaW5nSW5Gb3JtYXRUeXBlOw0KICAgIC8qKiBTdHJlYW1pbmcgaW4gZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBBVURFbmRwb2ludERlc2NyaXB0b3Igc3RyZWFtaW5nSW5FbmRwb2ludDsNCiAgICAvKiogQXVkaW8gY2xhc3MgZGVzY3JpcHRvciBmb3IgdGhlIHN0cmVhbWluZyBpbiBlbmRwb2ludC4gKi8NCiAgICBBVUREYXRhRW5kcG9pbnREZXNjcmlwdG9yIHN0cmVhbWluZ0luRGF0YUVuZHBvaW50Ow0KDQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQ2RjQXVkZERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yczsNCg0KI3ByYWdtYSBwYWNrKCkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCmV4dGVybiB2b2lkIENEQ0FVREREcml2ZXJfSW5pdGlhbGl6ZShjb25zdCBVU0JERHJpdmVyRGVzY3JpcHRvcnMgKiBwRGVzY3JpcHRvcnMpOw0KZXh0ZXJuIHZvaWQgQ0RDQVVERERyaXZlcl9Db25maWd1cmF0aW9uQ2hhbmdlZEhhbmRsZXIodWludDhfdCBjZmdudW0pOw0KZXh0ZXJuIHZvaWQgQ0RDQVVERERyaXZlcl9JbnRlcmZhY2VTZXR0aW5nQ2hhbmdlZEhhbmRsZXIoDQogICAgdWludDhfdCBpbnRlcmZhY2UsIHVpbnQ4X3Qgc2V0dGluZyk7DQpleHRlcm4gdm9pZCBDRENBVURERHJpdmVyX1JlcXVlc3RIYW5kbGVyKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KTsNCg0KLyoqQH0qLw0KI2VuZGlmIC8vI2lmbmRlZiBDRENISURERFJJVkVSX0gNCg0K