LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfbnZyYW0uaCAgJA0KICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQogKiBPcmlnaW5hbCBBdXRob3I6IFlhbmcgSHl1biBVayAkDQogKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KICogRGF0ZToJCQkkRGF0ZTogMjAxMS4xMS4wNw0KICogRmlsZSBEZXNjcmlwdGlvbjoJVXBncmFkZSBBUElzDQogKiBNb2R1bGU6DQogKiBSZW1hcmtzOg0KICovDQoNCg0KLyoqDQogKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQ0KICogQGRhdGUgMDcgTm92IDIwMTENCiAqLw0KDQovKioNCiAqIEBub3RlDQogKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCiAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24NCiAqIG9mIEh1bWF4IENvcnBvcmF0aW9uLiBZb3UgbWF5IG5vdCB1c2Ugb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlDQogKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQogKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuDQogKi8NCg0KIC8qQHsqLw0KDQovKioNCiAqIEBmaWxlIGhteF91cGdyYWRlX252cmFtLmgNCiAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBGaWxlcyoqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovDQovKiBFbmQgSW5jbHVkaW5nIEhlYWRlcnMqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKiogRXh0ZXJuIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBTdGFydCBFeHRlcm4gdmFyaWFibGVlICovDQpleHRlcm4gaW50IGxpYnVwZ3JhZGVfdmVyYm9zZTsNCg0KLyogRW5kIEV4dGVybiB2YXJpYWJsZSAqLw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKiBNYWNybyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIFN0YXJ0IE1hY3JvIGRlZmluaXRpb24gKi8NCg0KLyogRW5kIE1hY3JvIGRlZmluaXRpb24gKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogU3RhcnQgdHlwZWRlZiAqLw0KDQp0eXBlZGVmIGVudW0NCnsNCglOVlJBTV9PU0RfT04gPSAwLA0KCU5WUkFNX09TRF9PRkYNCn1OVlJBTV9PU0RfRElTUExBWV9FOw0KDQp0eXBlZGVmIGVudW0NCnsNCglOVlJBTV9GUk9OVFBBTkVMX0RJU1BMQVlfT04gPSAwLA0KCU5WUkFNX0ZST05UUEFORUxfRElTUExBWV9PRkYNCn1OVlJBTV9GUk9OVFBBTkVMX0RJU1BMQVlfRTsNCg0KdHlwZWRlZiBlbnVtDQp7DQoJTlZSQU1fQVNQRUNUX1JBVElPXzRfMyA9IDAsDQoJTlZSQU1fQVNQRUNUX1JBVElPXzE2XzkNCn1OVlJBTV9BU1BFQ1RfUkFUSU9fRTsNCg0KdHlwZWRlZiBlbnVtDQp7DQoJTlZSQU1fT1RBX1NTVSA9IDEsDQoJTlZSQU1fT1RBX0RURyA9IDIsDQoJTlZSQU1fT1RBX0hVTUFYID0gMywNCglOVlJBTV9PVEFfTk9SRElHID0gNCwNCglOVlJBTV9PVEFfRklMRSA9IDUsDQoJTlZSQU1fT1RBX1NLWUQgPSA2LA0KCU5WUkFNX09UQV9NQVgNCn1OVlJBTV9PVEFfVFlQRV9FOw0KDQoNCnR5cGVkZWYgZW51bQ0Kew0KCU5WUkFNX09UQV9DSEFOTkVMX1NBVAkJPSAxLA0KCU5WUkFNX09UQV9DSEFOTkVMX0NBQgkJPSAyLA0KCU5WUkFNX09UQV9DSEFOTkVMX1RFUgkJPSAzLA0KCU5WUkFNX09UQV9DSEFOTkVMX0ZMQVNICQk9IDQsDQoJTlZSQU1fT1RBX0NIQU5ORUxfRlRQCQk9IDUNCn1OVlJBTV9PVEFfQ0hBTk5FTF9FOw0KDQp0eXBlZGVmIGVudW0NCnsNCglOVlJBTV9SRVNPTFVUSU9OX1Vua25vd24JCQk9MHgwMDAwMDAwMCwNCglOVlJBTV9SRVNPTFVUSU9OXzcyMHgyNDBQCQk9MHgwMDAwMDAwMSwNCglOVlJBTV9SRVNPTFVUSU9OXzI4ODB4MjQwUAkJPTB4MDAwMDAwMDIsDQoJTlZSQU1fUkVTT0xVVElPTl82NDB4NDgwUAkJPTB4MDAwMDAwMDQsDQoJTlZSQU1fUkVTT0xVVElPTl83MjB4NDgwSQkJPTB4MDAwMDAwMDgsDQoJTlZSQU1fUkVTT0xVVElPTl83MjB4NDgwUAkJPTB4MDAwMDAwMTAsDQoJTlZSQU1fUkVTT0xVVElPTl8xNDQweDQ4MFAJCT0weDAwMDAwMDIwLA0KCU5WUkFNX1JFU09MVVRJT05fMjg4MHg0ODBJCQk9MHgwMDAwMDA0MCwNCglOVlJBTV9SRVNPTFVUSU9OXzI4ODB4NDgwUAkJPTB4MDAwMDAwODAsDQoJTlZSQU1fUkVTT0xVVElPTl83MjB4Mjg4UAkJPTB4MDAwMDAxMDAsDQoJTlZSQU1fUkVTT0xVVElPTl8yODgweDI4OFAgCQk9MHgwMDAwMDIwMCwNCglOVlJBTV9SRVNPTFVUSU9OXzcyMHg1NzZJCQk9MHgwMDAwMDQwMCwNCglOVlJBTV9SRVNPTFVUSU9OXzcyMHg1NzZQCQk9MHgwMDAwMDgwMCwNCglOVlJBTV9SRVNPTFVUSU9OXzE0NDB4NTc2UAkJPTB4MDAwMDEwMDAsDQoJTlZSQU1fUkVTT0xVVElPTl8yODgweDU3NkkgCQk9MHgwMDAwMjAwMCwNCglOVlJBTV9SRVNPTFVUSU9OXzI4ODB4NTc2UAkJPTB4MDAwMDQwMDAsDQoJTlZSQU1fUkVTT0xVVElPTl8xMDgweDcyMFAJCT0weDAwMDA4MDAwLA0KCU5WUkFNX1JFU09MVVRJT05fMTI4MHg3MjBQCQk9MHgwMDAxMDAwMCwNCglOVlJBTV9SRVNPTFVUSU9OXzE5MjB4MTA4MEkJCT0weDAwMDIwMDAwLA0KCU5WUkFNX1JFU09MVVRJT05fMTkyMHgxMDgwUAkJPTB4MDAwNDAwMDAsDQoJTlZSQU1fUkVTT0xVVElPTl9EVU1NWQkJCT0weDAwMEZGRkZGDQp9IE5WUkFNX1ZJREVPX1JFU09MVVRJT05fRTsNCg0KdHlwZWRlZiBlbnVtDQp7DQoJTlZSQU1fSERNSV9GSUVMRF9SQVRFX1Vua25vd24JPTB4MDAwMCwNCglOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMjRIWgkJPTB4MDAwMSwNCglOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMjVIWiAJCT0weDAwMDIsDQoJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzMwSFogCQk9MHgwMDA0LA0KCU5WUkFNX0hETUlfRklFTERfUkFURV81MEhaIAkJPTB4MDAwOCwNCglOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfNjBIWiAJCT0weDAwMTAsDQoJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzEwMEhaIAkJPTB4MDAyMCwNCglOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMTIwSFogCQk9MHgwMDQwLA0KCU5WUkFNX0hETUlfRklFTERfUkFURV8yMDBIWgkJPTB4MDA4MCwNCglOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMjQwSFoJCT0weDAxMDAsDQoJTlZSQU1fSERNSV9GSUVMRF9SQVRFX0RVTU1ZCQk9MHhGRkZGDQp9IE5WUkFNX0hETUlfVklERU9fRklFTERfUkFURV9FOw0KDQoNCnR5cGVkZWYgZW51bQ0Kew0KCU5WUkFNX0hETUlfVklERU9fQVJfZU5vRGF0YSA9IDAsDQoJTlZSQU1fSERNSV9WSURFT19BUl9lNF8zLA0KCU5WUkFNX0hETUlfVklERU9fQVJfZTE2XzkNCn1OVlJBTV9IRE1JX1ZJREVPX0FSX0U7DQoNCg0KdHlwZWRlZiBlbnVtDQp7DQoJTlZSQU1fU0NBUlRfT1VUUFVUX0NWQlM9MywNCglOVlJBTV9TQ0FSVF9PVVRQVVRfUkdCLA0KCU5WUkFNX1NDQVJUX09VVFBVVF9TVklERU8sDQoNCglOVlJBTV9TQ0FSVF9NQVgNCn0gTlZSQU1fU0NBUlRfU0VUVElOR19WQUxVRTsNCg0KdHlwZWRlZiBlbnVtIHRhZ05WUkFNX0ZJRUxEDQp7DQoJTlZSQU1fRklFTERfU1lTVEVNX0lEID0gMCwJCQkJCS8vIHVuc2lnbmVkIGludAkJCQkvLyA0CQkJCS8vIFN5c3RlbSBJZA0KCU5WUkFNX0ZJRUxEX1NGTEFTSCwNCglOVlJBTV9GSUVMRF9TRVJJQUxfTk8sDQoJTlZSQU1fRklFTERfTUFDX0FERFIsDQoJTlZSQU1fRklFTERfSERDUF9LRVksDQoJTlZSQU1fRklFTERfRFRDUF9LRVksDQoJTlZSQU1fRklFTERfQ0lfUExVU19LRVksDQoJTlZSQU1fRklFTERfUEFSSU5HX0RBVEEsDQoJTlZSQU1fRklFTERfUFJJVkFURSwNCglOVlJBTV9GSUVMRF9DU0NfS0VZLA0KCU5WUkFNX0ZJRUxEX0NNX1NFUklBTF9OTywNCglOVlJBTV9GSUVMRF9DTV9NQUNfQUREUiwNCglOVlJBTV9GSUVMRF9DTV9NQUNfQUREUl9BTk9USEVSLA0KCU5WUkFNX0ZJRUxEX0lSREVUT19CQkNCLA0KDQoJTlZSQU1fRklFTERfT1RBX1RZUEUxID0gMHgxMDAsCQkJCS8vIE5WUkFNX09UQV9UWVBFX0UNCglOVlJBTV9GSUVMRF9PVEFfVFlQRTIsIAkJCQkJCS8vIE5WUkFNX09UQV9UWVBFX0UNCglOVlJBTV9GSUVMRF9PVEFfVFlQRTMsCQkJCQkJLy8gTlZSQU1fT1RBX1RZUEVfRQ0KCU5WUkFNX0ZJRUxEX0NIX1RZUEUxLAkJCQkJCS8vIE5WUkFNX09UQV9DSEFOTkVMX0UNCglOVlJBTV9GSUVMRF9DSF9UWVBFMiwJCQkJCQkvLyBOVlJBTV9PVEFfQ0hBTk5FTF9FDQoJTlZSQU1fRklFTERfQ0hfVFlQRTMsCQkJCQkJLy8gTlZSQU1fT1RBX0NIQU5ORUxfRQ0KCU5WUkFNX0ZJRUxEX09UQV9GTEFHMSwJCQkJCQkvLyBOVlJBTV9PVEFfRkxBR19FDQoJTlZSQU1fRklFTERfT1RBX0ZMQUcyLAkJCQkJCS8vIE5WUkFNX09UQV9GTEFHX0UNCglOVlJBTV9GSUVMRF9PVEFfRkxBRzMsCQkJCQkJLy8gTlZSQU1fT1RBX0ZMQUdfRQ0KCU5WUkFNX0ZJRUxEX1RVTkVSX0lEMSwJCQkJCQkvLyBUdW5lciBJZA0KCU5WUkFNX0ZJRUxEX1RVTkVSX0lEMiwJCQkJCQkvLyBUdW5lciBJZA0KCU5WUkFNX0ZJRUxEX1RVTkVSX0lEMywJCQkJCQkvLyBUdW5lciBJZA0KCU5WUkFNX0ZJRUxEX0FOVEVOQV9QT1dFUjEsCQkJCQkvLyBFeHRlcm5hbCBBbnRlbmEgUG93ZXIgZm9yIFRlciwgMDpPZmYvMTpPbg0KCU5WUkFNX0ZJRUxEX0FOVEVOQV9QT1dFUjIsCQkJCQkvLyBFeHRlcm5hbCBBbnRlbmEgUG93ZXIgZm9yIFRlciwgMDpPZmYvMTpPbg0KCU5WUkFNX0ZJRUxEX0FOVEVOQV9QT1dFUjMsCQkJCQkvLyBFeHRlcm5hbCBBbnRlbmEgUG93ZXIgZm9yIFRlciwgMDpPZmYvMTpPbg0KCU5WUkFNX0ZJRUxEX0VTX1BJRDEsCQkJCQkJCS8vIEVsZW1lbnQgU3RyZWFtIFBJRCBmb3IgT1RBDQoJTlZSQU1fRklFTERfRVNfUElEMiwJCQkJCQkJLy8gRWxlbWVudCBTdHJlYW0gUElEIGZvciBPVEENCglOVlJBTV9GSUVMRF9FU19QSUQzLAkJCQkJCQkvLyBFbGVtZW50IFN0cmVhbSBQSUQgZm9yIE9UQQ0KCU5WUkFNX0ZJRUxEX1RSQU5TQUNUSU9OX0lEMSwJCQkJCS8vIFRyYW5zYWN0aW9uIElkIGZvciBOb3JkaWMgT1RBDQoJTlZSQU1fRklFTERfVFJBTlNBQ1RJT05fSUQyLAkJCQkJLy8gVHJhbnNhY3Rpb24gSWQgZm9yIE5vcmRpYyBPVEENCglOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDMsCQkJCQkvLyBUcmFuc2FjdGlvbiBJZCBmb3IgTm9yZGljIE9UQQ0KCU5WUkFNX0ZJRUxEX0NIX0lORk9fUywJCQkJCQkvLyBESV9DSEFOTkVMX1BBUkFNDQoJTlZSQU1fRklFTERfQ0hfSU5GT19ULAkJCQkJCS8vIERJX0NIQU5ORUxfUEFSQU0NCglOVlJBTV9GSUVMRF9DSF9JTkZPX0MsCQkJCQkJLy8gRElfQ0hBTk5FTF9QQVJBTQ0KCU5WUkFNX0ZJRUxEX05FVF9QT1JUQUxfSVAsCQkJCQkvLyBwb3J0YWwgaXAgYWRkcmVzcw0KCU5WUkFNX0ZJRUxEX05FVF9ET1dOX1BBVEgsCQkJCQkvLyBOZXR3b3JrIERvd25sb2FkIFBhdGgNCglOVlJBTV9GSUVMRF9ORVRfREVWSUNFX0lELAkJCQkJLy8gZXRoZXJuZXQgZGV2aWNlIGlkIDAgPSBldGgwDQoJTlZSQU1fRklFTERfTkVUX0lQX0NPTkZJRywJCQkJCS8vIERIQ1AvTWFudWFsDQoJTlZSQU1fRklFTERfTkVUX0lQX1NFVFRJTkcsCQkJCQkvLyBNYW51YWwgSVAgc2V0dGluZw0KCU5WUkFNX0ZJRUxEX09UQV9GVFBfSU5GTywJCQkJCS8vIE5WUkFNX0ZUUF9PVEFfU0VUVElOR19UDQoJTlZSQU1fRklFTERfRklMRV9TSVpFLAkJCQkJCS8vIGZpbGUgc2l6ZSBvZiBiYWNrZ3JvdWxkIG90YQ0KDQoJTlZSQU1fRklFTERfTE9BREVSX1ZFUlNJT04sCQkJCQkvLyBWZXJzaW9uIG9mIGJvb3QgTG9hZGVyDQoJTlZSQU1fRklFTERfQVBQX1ZFUlNJT04sCQkJCQkJLy8gVmVyc2lvbiBudW1iZXIgb2YgQXBwbGljYXRpb24NCglOVlJBTV9GSUVMRF9PVEFMRFJfVkVSU0lPTiwJCQkJCS8vIFZlcnNpb24gb2YgT1RBIExvYWRlcg0KCU5WUkFNX0ZJRUxEX0NVUl9PVEFJTUFHRV9WRVJTSU9OLAkJCS8vIFZlcnNpb24gbnVtYmVyIG9mIE9UQSBpbWFnZQ0KCU5WUkFNX0ZJRUxEX0xPQURFUl9WRVIsDQoJTlZSQU1fRklFTERfQVBQX1ZFUiwNCg0KCU5WUkFNX0ZJRUxEX0xBTkdVQUdFLAkJCQkJCS8vIE9TRCBsYW5ndWFnZSBjb2RlIGluIElTTyA2MzkgY29kZQ0KCU5WUkFNX0ZJRUxEX0NPVU5UUllfQ09ERSwJCQkJCS8vIHVuc2lnbmVkIGNoYXIgYVszXQ0KCU5WUkFNX0ZJRUxEX1RWX1NUQU5EQVJELAkJCQkJCS8vIERJX1ZJREVPX1NEX1NUQU5EQVJEDQoJTlZSQU1fRklFTERfU0NBUlRfUkdCLAkJCQkJCS8vIE5WUkFNX1NDQVJUX1NFVFRJTkdfVkFMVUUNCglOVlJBTV9GSUVMRF9IRF9SRVNPVUxUSU9OLAkJCQkJLy8gTlZSQU1fVklERU9fUkVTT0xVVElPTl9FDQoJTlZSQU1fRklFTERfRklFTERfUkFURSwJCQkJCQkvLyBOVlJBTV9IRE1JX1ZJREVPX0ZJRUxEX1JBVEVfRQ0KCU5WUkFNX0ZJRUxEX09BRF9WRVJTSU9OLAkJCQkJCS8vIGZvciBNSEVHID8/Pw0KCU5WUkFNX0ZJRUxEX1JDVV9DVVNUT01fQ09ERSwJCQkJCS8vIGZvciBSQ1UgY3VzdG9tIGNvZGUNCglOVlJBTV9GSUVMRF9SQ1VfQ1VTVE9NX0NPREUyLAkJCQkvLyBmb3IgYWx0ZXJuYXRpdmUgUkNVIGN1c3RvbSBjb2RlDQoJTlZSQU1fRklFTERfUEFORUxfRElTUExBWSwJCQkJCS8vIERJX09UQV9QQU5FTERJU1BMQVlfdA0KCU5WUkFNX0ZJRUxEX1BBTkVMX0RJTU1JTkcsCQkJCQkvLyB1bnNpZ25lZCBjaGFyDQoJTlZSQU1fRklFTERfT1NEX0RJU1BMQVksCQkJCQkJLy8gTlZSQU1fT1NEX0RJU1BMQVlfRQ0KCU5WUkFNX0ZJRUxEX1NUQVJUX0JBTktfRkxBRywJCQkJCS8vILXOILCzwMcgYmFua8HfIL7utfC3ziC6zsbDIMfSIMH2ILDhwaQNCglOVlJBTV9GSUVMRF9DSEVDS19VU0IsCQkJCQkJLy8gus7GwyC9wyBVU0IguLa/7saux9i8rSBoZGa4piCwy7vnx9LB9iC4u8H2ILDhwaQNCglOVlJBTV9GSUVMRF9DSEVDS19VU0JfQ09VTlQsCQkJCQkvLyDApyC1v8DbIL3HxtAgvcMguO4gufggwOcgvcO1tSDH0sH2IGNvdW50uKYgwPrA5Q0KCU5WUkFNX0ZJRUxEX0FTUEVDVF9SQVRJTywJCQkJCS8vIE5WUkFNX0FTUEVDVF9SQVRJT19FDQoJTlZSQU1fRklFTERfVVNBR0VfSUQsCQkJCQkJLy8gZm9yIFVQQyBPVEENCglOVlJBTV9GSUVMRF9CSU44SywJCQkJCQkJLy8gZm9yIGVlcHJvbSBlbXVsYXRpb24NCglOVlJBTV9GSUVMRF9JUkRFVE9fQ1BDQiwJCQkJCQkvLyBmb3IgSVJERVRPIENQQ0INCglOVlJBTV9GSUVMRF9JUkRFVE9fQ1BDQl9FTkNSWVBURUQsIAkJCS8vIGZvciBJUkRFVE8gQ1BDQiAoZW5jcnlwdGVkKQ0KDQoJTlZSQU1fRklFTERfQUNUSVZBVEVEX0tFUk5FTF9OVU0sIAkJCS8vIEFDVElWQVRFRF9LRVJORUxfTlVNDQoJTlZSQU1fRklFTERfQUNUSVZBVEVEX1JPT1RGU19OVU0sIAkJCS8vIEFDVElWQVRFRF9ST09URlNfTlVNDQoJTlZSQU1fRklFTERfTVREX1RZUEVfRk9SX0tFUk5FTCwgCQkJLy8gTVREX1RZUEVfRk9SX0tFUk5FTA0KCU5WUkFNX0ZJRUxEX1RZUEVfT0ZfRklMRVNZU1RFTSwgCQkJCS8vIFRZUEVfT0ZfRklMRVNZU1RFTQ0KCU5WUkFNX0ZJRUxEX0xfVFlQRV9PRl9GSUxFU1lTVEVNLAkJCQkvLyBMZW5ndGggVFlQRV9PRl9GSUxFU1lTVEVNDQoJTlZSQU1fRklFTERfTkFNRV9PRl9CT0FSRCwgCQkJCQkvLyBOQU1FX09GX0JPQVJEDQoJTlZSQU1fRklFTERfTF9OQU1FX09GX0JPQVJELCAJCQkJCS8vIExlbmd0aCBOQU1FX09GX0JPQVJEDQoNCg0KCU5WUkFNX0ZJRUxEX1JBV0ZTID0gMHgxMDAwLA0KCU5WUkFNX0ZJRUxEX0RVTU1ZID0gMHhGRkZGDQp9IE5WUkFNX0ZJRUxEX1Q7DQoNCnR5cGVkZWYgZW51bQ0Kew0KCU5WUkFNX09UQV9GTEFHX05PX09UQQkJCT0gMHgwMCwNCglOVlJBTV9PVEFfRkxBR19ERVRFQ1RFRAkJCT0gMHgwMSwNCglOVlJBTV9PVEFfRkxBR19DT01QTEVURUQJCQk9IDB4MDIsDQoJTlZSQU1fT1RBX0ZMQUdfRk9SQ0VfVVBHUkFERQkJPSAweDA0LA0KCU5WUkFNX09UQV9GTEFHX05BR1JBX1JFQ09WRVJZCT0gMHgwOCwNCglOVlJBTV9PVEFfRkxBR19ET1dOTE9BRElORwkJPSAweDEwLA0KCU5WUkFNX09UQV9GTEFHX1dSSVRJTkcJCQk9IDB4MjAsDQoJTlZSQU1fT1RBX0ZMQUdfRVJST1IJCQkJPSAweDgwDQp9IE5WUkFNX09UQV9GTEFHX0U7DQoNCnR5cGVkZWYgc3RydWN0IE5WUkFNX05FVF9JUF9TRVRUSU5HX1RhZw0Kew0KI2RlZmluZSBORVRfQUREUl9MRU5HVEggNA0KCXVuc2lnbmVkIGNoYXIJCWlwW05FVF9BRERSX0xFTkdUSF07DQoJdW5zaWduZWQgY2hhcgkJbWFza1tORVRfQUREUl9MRU5HVEhdOw0KCXVuc2lnbmVkIGNoYXIgCQlnYXRld2F5W05FVF9BRERSX0xFTkdUSF07DQoJdW5zaWduZWQgY2hhcgkJZG5zW05FVF9BRERSX0xFTkdUSF07DQp9IE5WUkFNX05FVF9JUF9TRVRUSU5HX1Q7DQoNCnR5cGVkZWYgc3RydWN0IE5WUkFNX0ZUUF9PVEFfU0VUVElOR19UYWcNCnsNCiNkZWZpbmUgTlZSQU1fRlRQX1VTRVJfTEVOR1RIIAkJMjANCiNkZWZpbmUgTlZSQU1fRlRQX1BBU1NXRF9MRU5HVEggCQkyMA0KI2RlZmluZSBOVlJBTV9GVFBfRElSX1BBVEhfTEVOR1RIIAkyMDANCiNkZWZpbmUgTlZSQU1fRlRQX0ZJTEVfTkFNRV9MRU5HVEggCTUwDQoJdW5zaWduZWQgY2hhcgkJYVNlcnZlcklwW05FVF9BRERSX0xFTkdUSF07DQoJdW5zaWduZWQgY2hhciAJCWFVc2VyTmFtZVtOVlJBTV9GVFBfVVNFUl9MRU5HVEhdOw0KCXVuc2lnbmVkIGNoYXIgCQlhUGFzc3dkW05WUkFNX0ZUUF9QQVNTV0RfTEVOR1RIXTsNCgl1bnNpZ25lZCBjaGFyIAkJYURpclBhdGhbTlZSQU1fRlRQX0RJUl9QQVRIX0xFTkdUSF07DQoJdW5zaWduZWQgY2hhciAJCWFGaWxlTmFtZVtOVlJBTV9GVFBfRklMRV9OQU1FX0xFTkdUSF07DQp9IE5WUkFNX0ZUUF9PVEFfU0VUVElOR19UOw0KDQp0eXBlZGVmIGVudW0NCnsNCglOVlJBTV9JUF9ESENQID0gMCwNCglOVlJBTV9JUF9NQU5VQUwNCn0gTlZSQU1fTkVUX0lQX0NPTkZJR19FOw0KDQovKiBTdGFydCBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLw0KdHlwZWRlZiBlbnVtIEhNWF9OVlJBTV9QQVJUSVRJT05fZQ0Kew0KCUhNWF9OVlJBTV9QQVJUSVRJT05fUk8sDQoJSE1YX05WUkFNX1BBUlRJVElPTl9SVywNCglITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlMsDQoJSE1YX05WUkFNX1BBUlRJVElPTl9NQVgNCn1ITVhfTlZSQU1fUEFSVElUSU9OX0U7DQoNCg0KdHlwZWRlZiBlbnVtDQp7DQoJRFJWX09LCQkJPQkwLA0KIAlEUlZfRVJSLA0KDQoJRFJWX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwNCglEUlZfRVJSX0lOSVRJQUxJWkFUSU9OLA0KCURSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT04sDQoJRFJWX0VSUl9PVVRPRk1FTU9SWSwNCglEUlZfRVJSX0VYVEVSTkFMX0VSUk9SDQoNCn1EUlZfRXJyb3I7DQoNCi8qIEVuZCB0eXBlZGVmICovDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZSAqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KZXh0ZXJuIGludCBITVhfVVBHUkFERV9OVlJBTV9Xcml0ZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplICk7DQpleHRlcm4gaW50IEhNWF9VUEdSQURFX05WUkFNX1JlYWQodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSApOw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGUgKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkRSVl9FcnJvcglITVhfTlZSQU1fSW5pdCh2b2lkKTsNCkRSVl9FcnJvcglITVhfTlZSQU1fV3JpdGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSk7DQpEUlZfRXJyb3IJSE1YX05WUkFNX1JlYWQoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSk7DQpEUlZfRXJyb3IJSE1YX05WUkFNX0dldEZpZWxkKE5WUkFNX0ZJRUxEX1QgZmllbGQsIHVuc2lnbmVkIGludCBvZmZzZXQsIHZvaWQgKmRhdGEsIGludCBuRGF0YVNpemUpOw0KRFJWX0Vycm9yCUhNWF9OVlJBTV9TZXRGaWVsZChOVlJBTV9GSUVMRF9UIGZpZWxkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICpkYXRhLCBpbnQgbkRhdGFTaXplKTsNCkRSVl9FcnJvcglITVhfTlZSQU1fR2V0TGVuZ3RoKE5WUkFNX0ZJRUxEX1QgZmllbGQsIGludCAqcExlbik7DQpEUlZfRXJyb3IJSE1YX05WUkFNX1JlbW92ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCB1bnNpZ25lZCBjaGFyICpwTmFtZSk7DQpEUlZfRXJyb3IJSE1YX05WUkFNX0Rpcih2b2lkKTsNCg0KDQovKiBFbmQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8NCg0KDQovKkB9Ki8NCg==