LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIENvcHlyaWdodCAoYykgMjAxMCwgQXRtZWwgQ29ycG9yYXRpb24NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogKg0KICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGRpc2NsYWltZXIgYmVsb3cuDQogKg0KICogQXRtZWwncyBuYW1lIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIERJU0NMQUlNRVI6IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVRNRUwgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1INCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQogKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBVE1FTCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQogKiBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KDQovKiogXGZpbGUNCiAqDQogKiAgRGVmaW5pdGlvbnMgYW5kIGNsYXNzZXMgZm9yIFVTQiBDREMgY2xhc3MgcmVxdWVzdHMNCiAqICAobW9zdGx5IGZvciBBQ00pLg0KICoNCiAqIFxzZWN0aW9uIENEQ0xpbmVDb2RpbmcNCiAqDQogKiAtIyBJbml0aWFsaXplIGEgQ0RDTGluZUNvZGluZyBpbnN0YW5jZSB1c2luZyBDRENMaW5lQ29kaW5nX0luaXRpYWxpemUuDQogKiAtIyBTZW5kIGEgQ0RDTGluZUNvZGluZyBvYmplY3QgdG8gdGhlIGhvc3QgaW4gcmVzcG9uc2UgdG8gYSBHZXRMaW5lQ29kaW5nDQogKiAgICByZXF1ZXN0Lg0KICogLSMgUmVjZWl2ZSBhIENEQ0xpbmVDb2Rpbmcgb2JqZWN0IGZyb20gdGhlIGhvc3QgYWZ0ZXIgYSBTZXRMaW5lQ29kaW5nDQogKiAgICByZXF1ZXN0Lg0KICogIA0KICovDQoNCiNpZm5kZWYgX0NEQ1JFUVVFU1RTX0hfDQojZGVmaW5lIF9DRENSRVFVRVNUU19IXw0KLyoqIFxhZGR0b2dyb3VwIHVzYl9jZGMNCiAqQHsNCiAqLw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgSW5jbHVkZXMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCiNpbmNsdWRlIDxzdGRpbnQuaD4NCg0KI2luY2x1ZGUgPFVTQlJlcXVlc3RzLmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBEZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIFxhZGR0b2dyb3VwIHVzYl9jZGNfcmVxdWVzdCBVU0IgQ0RDIFJlcXVlc3QgQ29kZXMNCiAqICAgICAgQHsNCiAqIFRoaXMgc2VjdGlvbiBsaXN0cyBVU0IgQ0RDIFJlcXVlc3QgQ29kZXMuDQogKiAtIFxyZWYgQ0RDR2VuZXJpY1JlcXVlc3RfU0VUTElORUNPRElORw0KICogLSBccmVmIENEQ0dlbmVyaWNSZXF1ZXN0X0dFVExJTkVDT0RJTkcNCiAqIC0gXHJlZiBDRENHZW5lcmljUmVxdWVzdF9TRVRDT05UUk9MTElORVNUQVRFDQogKi8NCg0KLyoqIFNldExpbmVDb2RpbmcgcmVxdWVzdCBjb2RlLiAqLw0KI2RlZmluZSBDRENHZW5lcmljUmVxdWVzdF9TRVRMSU5FQ09ESU5HICAgICAgICAgICAgIDB4MjANCi8qKiBHZXRMaW5lQ29kaW5nIHJlcXVlc3QgY29kZS4gKi8NCiNkZWZpbmUgQ0RDR2VuZXJpY1JlcXVlc3RfR0VUTElORUNPRElORyAgICAgICAgICAgICAweDIxDQovKiogU2V0Q29udHJvbExpbmVTdGF0ZSByZXF1ZXN0IGNvZGUuICovDQojZGVmaW5lIENEQ0dlbmVyaWNSZXF1ZXN0X1NFVENPTlRST0xMSU5FU1RBVEUgICAgICAgMHgyMg0KLyoqICAgICBAfSovDQoNCi8qKiBcYWRkdG9ncm91cCB1c2JfY2RjX2N0cmxfbGluZV9zdGF0ZSBVU0IgQ0RDIENvbnRyb2xMaW5lU3RhdGUgYml0bWFwDQogKiAgICAgIEB7DQogKiBUaGlzIHNlY3Rpb24gbGlzdHMgQ0RDIENvbnRyb2xMaW5lU3RhdGUgYml0bWFwLg0KICogLSBccmVmIENEQ0NvbnRyb2xMaW5lU3RhdGVfRFRSLCBDRENDb250cm9sTGluZVN0YXRlX0RURV9QUkVTRU5UDQogKiAtIFxyZWYgQ0RDQ29udHJvbExpbmVTdGF0ZV9SVFMsIENEQ0NvbnRyb2xMaW5lU3RhdGVfQ0FSUklFUl9PTg0KICovDQovKiogSW5kaWNhdGVzIHRvIERDRSBpZiBEVEUgaXMgcHJlc2VudCBvciBub3QuICovDQojZGVmaW5lIENEQ0NvbnRyb2xMaW5lU3RhdGVfRFRFX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQ0KLyoqIFJTMjMyIHNpZ25hbCBEVFI6IERhdGEgVGVybWluYWwgUmVhZHkuICovDQojZGVmaW5lIENEQ0NvbnRyb2xMaW5lU3RhdGVfRFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQ0KLyoqIENhcnJpZXIgY29udHJvbCBmb3IgaGFsZiBkdXBsZXggbW9kZW1zLiAqLw0KI2RlZmluZSBDRENDb250cm9sTGluZVN0YXRlX0NBUlJJRVJfT04gICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkNCi8qKiBSUzIzMiBzaWduYWwgUlRTOiBSZXF1ZXN0IHRvIHNlbmQuICovDQojZGVmaW5lIENEQ0NvbnRyb2xMaW5lU3RhdGVfUlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxKQ0KLyoqICAgICBAfSovDQoNCi8qKiBcYWRkdG9ncm91cCB1c2JfY2RjX3N0b3AgVVNCIENEQyBMaW5lQ29kaW5nIFN0b3BCaXRzDQogKiAgICAgIEB7DQogKiBUaGlzIHNlY3Rpb24gbGlzdHMgU3RvcCBCaXRzIGZvciBDREMgTGluZSBDb2RpbmcuDQogKiAtIFxyZWYgQ0RDTGluZUNvZGluZ19PTkVTVE9QQklUDQogKiAtIFxyZWYgQ0RDTGluZUNvZGluZ19PTkU1U1RPUEJJVA0KICogLSBccmVmIENEQ0xpbmVDb2RpbmdfVFdPU1RPUEJJVFMNCiAqLw0KLyoqIFRoZSB0cmFuc21pc3Npb24gcHJvdG9jb2wgdXNlcyBvbmUgc3RvcCBiaXQuICovDQojZGVmaW5lIENEQ0xpbmVDb2RpbmdfT05FU1RPUEJJVCAgICAgICAgICAgIDANCi8qKiBUaGUgdHJhbnNtaXNzaW9uIHByb3RvY29sIHVzZXMgMS41IHN0b3AgYml0LiAqLw0KI2RlZmluZSBDRENMaW5lQ29kaW5nX09ORTVTVE9QQklUICAgICAgICAgICAxDQovKiogVGhlIHRyYW5zbWlzc2luIHByb3RvY29sIHVzZXMgdHdvIHN0b3AgYml0cy4gKi8NCiNkZWZpbmUgQ0RDTGluZUNvZGluZ19UV09TVE9QQklUUyAgICAgICAgICAgMg0KLyoqICAgICBAfSovDQoNCi8qKiBcYWRkdG9ncm91cCB1c2JfY2RjX3Bhcml0eSBVU0IgQ0RDIExpbmVDb2RpbmcgUGFyaXR5Q2hlY2tpbmdzDQogKiAgICAgIEB7DQogKiBUaGlzIHNlY3Rpb24gbGlzdHMgUGFyaXR5IGNoZWNraW5ncyBmb3IgQ0RDIExpbmUgQ29kaW5nLg0KICogLSBccmVmIENEQ0xpbmVDb2RpbmdfTk9QQVJJVFkNCiAqIC0gXHJlZiBDRENMaW5lQ29kaW5nX09ERFBBUklUWQ0KICogLSBccmVmIENEQ0xpbmVDb2RpbmdfRVZFTlBBUklUWQ0KICogLSBccmVmIENEQ0xpbmVDb2RpbmdfTUFSS1BBUklUWQ0KICogLSBccmVmIENEQ0xpbmVDb2RpbmdfU1BBQ0VQQVJJVFkNCiAqLw0KLyoqIE5vIHBhcml0eSBjaGVja2luZy4gKi8NCiNkZWZpbmUgQ0RDTGluZUNvZGluZ19OT1BBUklUWSAgICAgICAgICAgICAgMA0KLyoqIE9kZCBwYXJpdHkgY2hlY2tpbmcuICovDQojZGVmaW5lIENEQ0xpbmVDb2RpbmdfT0REUEFSSVRZICAgICAgICAgICAgIDENCi8qKiBFdmVuIHBhcml0eSBjaGVja2luZy4gKi8NCiNkZWZpbmUgQ0RDTGluZUNvZGluZ19FVkVOUEFSSVRZICAgICAgICAgICAgMg0KLyoqIE1hcmsgcGFyaXR5IGNoZWNraW5nLiAqLw0KI2RlZmluZSBDRENMaW5lQ29kaW5nX01BUktQQVJJVFkgICAgICAgICAgICAzDQovKiogU3BhY2UgcGFyaXR5IGNoZWNraW5nLiAqLw0KI2RlZmluZSBDRENMaW5lQ29kaW5nX1NQQUNFUEFSSVRZICAgICAgICAgICA0DQovKiogICAgIEB9Ki8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgIFR5cGVzDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI3ByYWdtYSBwYWNrKDEpDQojaWYgZGVmaW5lZCAgICggX19DQ19BUk0gICApIC8qIEtlaWwgpsxWaXNpb24gNCAqLw0KI2VsaWYgZGVmaW5lZCAoIF9fSUNDQVJNX18gKSAvKiBJQVIgRXdhcm0gKi8NCiNkZWZpbmUgX19hdHRyaWJ1dGVfXyguLi4pDQojZGVmaW5lIF9fcGFja2VkX18gIHBhY2tlZA0KI2VsaWYgZGVmaW5lZCAoICBfX0dOVUNfXyAgKSAvKiBHQ0MgQ1MzICovDQojZGVmaW5lIF9fcGFja2VkX18gIGFsaWduZWQoMSkNCiNlbmRpZg0KDQovKioNCiAqIFx0eXBlZGVmIENEQ0xpbmVDb2RpbmcNCiAqIFxicmllZiBGb3JtYXQgb2YgdGhlIGRhdGEgcmV0dXJuZWQgd2hlbiBhIEdldExpbmVDb2RpbmcgcmVxdWVzdCBpcyByZWNlaXZlZC4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgX0NEQ0xpbmVDb2Rpbmcgew0KDQogICAgLyoqIERhdGEgdGVybWluYWwgcmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuICovDQogICAgdWludDMyX3QgZHdEVEVSYXRlOw0KICAgIC8qKiBOdW1iZXIgb2Ygc3RvcCBiaXRzLg0KICAgICAgICBcc2EgdXNiX2NkY19zdG9wIENEQyBMaW5lQ29kaW5nIFN0b3BCaXRzLiAqLw0KICAgIHVpbnQ4X3QgYkNoYXJGb3JtYXQ7DQogICAgLyoqIFR5cGUgb2YgcGFyaXR5IGNoZWNraW5nIHVzZWQuDQogICAgICAgIFxzYSB1c2JfY2RjX3Bhcml0eSBDREMgTGluZUNvZGluZyBQYXJpdHlDaGVja2luZ3MuICovDQogICAgdWludDhfdCBiUGFyaXR5VHlwZTsNCiAgICAvKiogTnVtYmVyIG9mIGRhdGEgYml0cyAoNSwgNiwgNywgOCBvciAxNikuICovDQogICAgdWludDhfdCBiRGF0YUJpdHM7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBDRENMaW5lQ29kaW5nOyAvKiBHQ0MgKi8NCg0KI3ByYWdtYSBwYWNrKCkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgIEZ1bmN0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KZXh0ZXJuIHVpbnQ4X3QgQ0RDU2V0Q29udHJvbExpbmVTdGF0ZVJlcXVlc3RfSXNEdGVQcmVzZW50KA0KICAgIGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KTsNCg0KZXh0ZXJuIHVpbnQ4X3QgQ0RDU2V0Q29udHJvbExpbmVTdGF0ZVJlcXVlc3RfQWN0aXZhdGVDYXJyaWVyKA0KICAgIGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KTsNCg0KZXh0ZXJuIHZvaWQgQ0RDTGluZUNvZGluZ19Jbml0aWFsaXplKENEQ0xpbmVDb2RpbmcgKmxpbmVDb2RpbmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYml0cmF0ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0b3BiaXRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFyaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YWJpdHMpOw0KDQoNCi8qKkB9Ki8NCiNlbmRpZiAvKiAjZGVmaW5lIF9DRENSRVFVRVNUU19IXyAqLw0KDQo=