LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogKg0KICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGRpc2NsYWltZXIgYmVsb3cuDQogKg0KICogQXRtZWwncyBuYW1lIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIERJU0NMQUlNRVI6IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVRNRUwgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1INCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQogKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBVE1FTCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQogKiBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KDQovKioNCiAqIFxmaWxlDQogKg0KICogXHNlY3Rpb24gUHVycG9zZQ0KICoNCiAqICAgRGVmaW5pdGlvbnMgYW5kIG1ldGhvZHMgZm9yIFVTQiBjb21wb3NpdGUgZGV2aWNlIGltcGxlbWVudC4NCiAqIA0KICogXHNlY3Rpb24gVXNhZ2UNCiAqIA0KICogLSMgSW5pdGlhbGl6ZSBVU0IgZnVuY3Rpb24gc3BlY2lmaWVkIGRyaXZlciAoIGZvciBNU0QgY3VycmVudGx5ICkNCiAqICAtIE1TRERGdW5jdGlvbkRyaXZlcl9Jbml0aWFsaXplKCkNCiAqDQogKiAtIyBJbml0aWFsaXplIFVTQiBjb21wb3NpdGUgZHJpdmVyIGFuZCBVU0IgZHJpdmVyDQogKiAgLSBDRENISURERHJpdmVyX0luaXRpYWxpemUoKQ0KICoNCiAqIC0jIEhhbmRsZSBhbmQgZGlzcGFjaCBVU0IgcmVxdWVzdHMNCiAqICAtIENEQ0hJREREcml2ZXJfUmVxdWVzdEhhbmRsZXIoKQ0KICoNCiAqIC0jIFRyeSBzdGFydGluZyBhIHJlbW90ZSB3YWtlLXVwIHNlcXVlbmNlDQogKiAgLSBDRENISURERHJpdmVyX1JlbW90ZVdha2VVcCgpDQogKi8NCg0KI2lmbmRlZiBDRENISURERFJJVkVSX0gNCiNkZWZpbmUgQ0RDSElERERSSVZFUl9IDQovKiogXGFkZHRvZ3JvdXAgdXNiZF9jb21wb3NpdGVfY2RjaGlkDQogKkB7DQogKi8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgSGVhZGVycw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQojaW5jbHVkZSA8VVNCUmVxdWVzdHMuaD4NCiNpbmNsdWRlIDxDRENEZXNjcmlwdG9ycy5oPg0KI2luY2x1ZGUgPEhJRERlc2NyaXB0b3JzLmg+DQojaW5jbHVkZSAiVVNCRC5oIg0KI2luY2x1ZGUgPFVTQkREcml2ZXIuaD4NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgRGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIFxhZGR0b2dyb3VwIHVzYmRfY2RjX2hpZF9kZXNjIFVTQiBDREMoU2VyaWFsKSArIEhJRChLYmQpIERlc2NyaXB0b3JzIGRlZmluZQ0KICogICAgICBAew0KICovDQovKiogTnVtYmVyIG9mIGludGVyZmFjZXMgb2YgdGhlIGRldmljZSAqLw0KI2RlZmluZSBDRENISURERHJpdmVyRGVzY3JpcHRvcnNfTlVNSU5URVJGQUNFICAgICAgIDMNCi8qKiBOdW1iZXIgb2YgdGhlIENEQyBpbnRlcmZhY2UuICovDQojZGVmaW5lIENEQ0hJREREcml2ZXJEZXNjcmlwdG9yc19DRENfSU5URVJGQUNFICAgICAgMA0KLyoqIE51bWJlciBvZiB0aGUgSElEIGludGVyZmFjZS4gKi8NCiNkZWZpbmUgQ0RDSElERERyaXZlckRlc2NyaXB0b3JzX0hJRF9JTlRFUkZBQ0UgICAgICAyDQovKiogICAgIEB9Ki8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgVHlwZXMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNwcmFnbWEgcGFjaygxKQ0KI2lmIGRlZmluZWQgICAoIF9fQ0NfQVJNICAgKSAvKiBLZWlsIKbMVmlzaW9uIDQgKi8NCiNlbGlmIGRlZmluZWQgKCBfX0lDQ0FSTV9fICkgLyogSUFSIEV3YXJtICovDQojZGVmaW5lIF9fYXR0cmlidXRlX18oLi4uKQ0KI2RlZmluZSBfX3BhY2tlZF9fICBwYWNrZWQNCiNlbGlmIGRlZmluZWQgKCAgX19HTlVDX18gICkgLyogR0NDIENTMyAqLw0KI2RlZmluZSBfX3BhY2tlZF9fICBhbGlnbmVkKDEpDQojZW5kaWYNCi8qKg0KICogXHR5cGVkZWYgQ2RjSGlkRHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzDQogKiBcYnJpZWYgQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGxpc3QgZm9yIGEgZGV2aWNlIGltcGxlbWVudGluZyBhDQogKiAgICAgICAgY29tcG9zaXRlIGRyaXZlci4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgX0NkY0hpZERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9ycyB7DQoNCiAgICAvKiogU3RhbmRhcmQgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb247DQoNCiAgICAvKiAtLS0gQ0RDIDAgKi8NCiAgICAvKiogSUFEIDAgKi8NCiAgICBVU0JJbnRlcmZhY2VBc3NvY2lhdGlvbkRlc2NyaXB0b3IgY2RjSUFEMDsNCiAgICAvKiogQ29tbXVuaWNhdGlvbiBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLw0KICAgIFVTQkludGVyZmFjZURlc2NyaXB0b3IgY2RjQ29tbXVuaWNhdGlvbjA7DQogICAgLyoqIENEQyBoZWFkZXIgZnVuY3Rpb25hbCBkZXNjcmlwdG9yLiAqLw0KICAgIENEQ0hlYWRlckRlc2NyaXB0b3IgY2RjSGVhZGVyMDsNCiAgICAvKiogQ0RDIGNhbGwgbWFuYWdlbWVudCBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDQ2FsbE1hbmFnZW1lbnREZXNjcmlwdG9yIGNkY0NhbGxNYW5hZ2VtZW50MDsNCiAgICAvKiogQ0RDIGFic3RyYWN0IGNvbnRyb2wgbWFuYWdlbWVudCBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDQWJzdHJhY3RDb250cm9sTWFuYWdlbWVudERlc2NyaXB0b3IgY2RjQWJzdHJhY3RDb250cm9sTWFuYWdlbWVudDA7DQogICAgLyoqIENEQyB1bmlvbiBmdW5jdGlvbmFsIGRlc2NyaXB0b3IgKHdpdGggb25lIHNsYXZlIGludGVyZmFjZSkuICovDQogICAgQ0RDVW5pb25EZXNjcmlwdG9yIGNkY1VuaW9uMDsNCiAgICAvKiogTm90aWZpY2F0aW9uIGVuZHBvaW50IGRlc2NyaXB0b3IuICovDQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIGNkY05vdGlmaWNhdGlvbjA7DQogICAgLyoqIERhdGEgaW50ZXJmYWNlIGRlc2NyaXB0b3IuICovDQogICAgVVNCSW50ZXJmYWNlRGVzY3JpcHRvciBjZGNEYXRhMDsNCiAgICAvKiogRGF0YSBPVVQgZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgY2RjRGF0YU91dDA7DQogICAgLyoqIERhdGEgSU4gZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgY2RjRGF0YUluMDsNCg0KICAgIC8qIC0tLSBISUQgKi8NCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yIGhpZEludGVyZmFjZTsNCiAgICBISUREZXNjcmlwdG9yMSBoaWQ7DQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIGhpZEludGVycnVwdEluOw0KICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciBoaWRJbnRlcnJ1cHRPdXQ7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBDZGNIaWREcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnM7DQoNCiNwcmFnbWEgcGFjaygpDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgIEV4cG9ydGVkIGZ1bmN0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiAtQ0RDSElEICovDQpleHRlcm4gdm9pZCBDRENISURERHJpdmVyX0luaXRpYWxpemUoDQogICAgY29uc3QgVVNCRERyaXZlckRlc2NyaXB0b3JzICogcERlc2NyaXB0b3JzKTsNCg0KZXh0ZXJuIHZvaWQgQ0RDSElERERyaXZlcl9Db25maWd1cmF0aW9uQ2hhbmdlZEhhbmRsZXIodWludDhfdCBjZmdudW0pOw0KDQpleHRlcm4gdm9pZCBDRENISURERHJpdmVyX1JlcXVlc3RIYW5kbGVyKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KTsNCg0KZXh0ZXJuIHZvaWQgQ0RDSElERERyaXZlcl9SZW1vdGVXYWtlVXAodm9pZCk7DQoNCi8qKkB9Ki8NCiNlbmRpZiAvLyNpZm5kZWYgQ0RDSElERERSSVZFUl9IDQoNCg==