LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRyYWNlIFJlY29yZGVyIExpYnJhcnkgZm9yIFRyYWNlYWx5emVyIHYzLjAuMg0KICogUGVyY2VwaW8gQUIsIHd3dy5wZXJjZXBpby5jb20NCiAqDQogKiB0cmNSZWNvcmRlci5jDQogKg0KICogUHVibGljIGludGVyZmFjZSBhbmQgY29uZmlndXJhdGlvbnMgZm9yIHRoZSB0cmFjZSByZWNvcmRlciBsaWJyYXJ5Lg0KICoNCiAqIFRlcm1zIG9mIFVzZQ0KICogVGhpcyBzb2Z0d2FyZSAodGhlICJUcmFjZWFseXplciBSZWNvcmRlciBMaWJyYXJ5IikgaXMgdGhlIGludGVsbGVjdHVhbA0KICogcHJvcGVydHkgb2YgUGVyY2VwaW8gQUIgYW5kIG1heSBub3QgYmUgc29sZCBvciBpbiBvdGhlciB3YXlzIGNvbW1lcmNpYWxseQ0KICogcmVkaXN0cmlidXRlZCB3aXRob3V0IGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBieSBQZXJjZXBpbyBBQi4NCiAqDQogKiBTZXBhcmF0ZSBjb25kaXRpb25zIGFwcGxpZXMgZm9yIHRoZSBTRUdHRVIgYnJhbmRlZCBzb3VyY2UgY29kZSBpbmNsdWRlZC4NCiAqDQogKiBUaGUgcmVjb3JkZXIgbGlicmFyeSBpcyBmcmVlIGZvciB1c2UgdG9nZXRoZXIgd2l0aCBQZXJjZXBpbyBwcm9kdWN0cy4NCiAqIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgcmVjb3JkZXIgbGlicmFyeSBpbiBpdHMgb3JpZ2luYWwgZm9ybSwgYnV0IHB1YmxpYw0KICogZGlzdHJpYnV0aW9uIG9mIG1vZGlmaWVkIHZlcnNpb25zIHJlcXVpcmUgYXBwcm92YWwgYnkgUGVyY2VwaW8gQUIuDQogKg0KICogRGlzY2xhaW1lcg0KICogVGhlIHRyYWNlIHRvb2wgYW5kIHJlY29yZGVyIGxpYnJhcnkgaXMgYmVpbmcgZGVsaXZlcmVkIHRvIHlvdSBBUyBJUyBhbmQNCiAqIFBlcmNlcGlvIEFCIG1ha2VzIG5vIHdhcnJhbnR5IGFzIHRvIGl0cyB1c2Ugb3IgcGVyZm9ybWFuY2UuIFBlcmNlcGlvIEFCIGRvZXMNCiAqIG5vdCBhbmQgY2Fubm90IHdhcnJhbnQgdGhlIHBlcmZvcm1hbmNlIG9yIHJlc3VsdHMgeW91IG1heSBvYnRhaW4gYnkgdXNpbmcgdGhlDQogKiBzb2Z0d2FyZSBvciBkb2N1bWVudGF0aW9uLiBQZXJjZXBpbyBBQiBtYWtlIG5vIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3INCiAqIGltcGxpZWQsIGFzIHRvIG5vbmluZnJpbmdlbWVudCBvZiB0aGlyZCBwYXJ0eSByaWdodHMsIG1lcmNoYW50YWJpbGl0eSwgb3INCiAqIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEluIG5vIGV2ZW50IHdpbGwgUGVyY2VwaW8gQUIsIGl0cw0KICogdGVjaG5vbG9neSBwYXJ0bmVycywgb3IgZGlzdHJpYnV0b3JzIGJlIGxpYWJsZSB0byB5b3UgZm9yIGFueSBjb25zZXF1ZW50aWFsLA0KICogaW5jaWRlbnRhbCBvciBzcGVjaWFsIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgbG9zdCBwcm9maXRzIG9yIGxvc3Qgc2F2aW5ncywNCiAqIGV2ZW4gaWYgYSByZXByZXNlbnRhdGl2ZSBvZiBQZXJjZXBpbyBBQiBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eQ0KICogb2Ygc3VjaCBkYW1hZ2VzLCBvciBmb3IgYW55IGNsYWltIGJ5IGFueSB0aGlyZCBwYXJ0eS4gU29tZSBqdXJpc2RpY3Rpb25zIGRvDQogKiBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvciBsaW1pdGF0aW9uIG9mIGluY2lkZW50YWwsIGNvbnNlcXVlbnRpYWwgb3Igc3BlY2lhbA0KICogZGFtYWdlcywgb3IgdGhlIGV4Y2x1c2lvbiBvZiBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgbGltaXRhdGlvbnMgb24gaG93IGxvbmcgYW4NCiAqIGltcGxpZWQgd2FycmFudHkgbWF5IGxhc3QsIHNvIHRoZSBhYm92ZSBsaW1pdGF0aW9ucyBtYXkgbm90IGFwcGx5IHRvIHlvdS4NCiAqDQogKiBUYWJzIGFyZSB1c2VkIGZvciBpbmRlbnQgaW4gdGhpcyBmaWxlICgxIHRhYiA9IDQgc3BhY2VzKQ0KICoNCiAqIENvcHlyaWdodCBQZXJjZXBpbyBBQiwgMjAxNS4NCiAqIHd3dy5wZXJjZXBpby5jb20NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpZm5kZWYgX1RSQ19SRUNPUkRFUl9IDQojZGVmaW5lIF9UUkNfUkVDT1JERVJfSA0KDQojaWZkZWYgX19jcGx1c3BsdXMNCmV4dGVybiCTQ5Qgew0KI2VuZGlmDQoNCiNpbmNsdWRlICJ0cmNDb25maWcuaCINCiNpbmNsdWRlICJ0cmNLZXJuZWxQb3J0LmgiDQojaW5jbHVkZSAidHJjSGFyZHdhcmVQb3J0LmgiDQoNCiNpZiAoVVNFX1RSQUNFQUxZWkVSX1JFQ09SREVSID09IDEpDQoNCi8qKiogVXNlciBBUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVByaW50DQogKg0KICogR2VuZXJhdGVzICJVc2VyIEV2ZW50cyIsIHdpdGggdW5mb3JtYXR0ZWQgdGV4dC4NCiAqDQogKiBVc2VyIEV2ZW50cyBjYW4gYmUgdXNlZCBmb3IgdmVyeSBlZmZpY2llbnQgYXBwbGljYXRpb24gbG9nZ2luZywgYW5kIGFyZSBzaG93bg0KICogYXMgeWVsbG93IGxhYmVscyBpbiB0aGUgbWFpbiB0cmFjZSB2aWV3Lg0KICoNCiAqIFlvdSBtYXkgZ3JvdXAgVXNlciBFdmVudHMgaW50byBVc2VyIEV2ZW50IENoYW5uZWxzLiBUaGUgeWVsbG93IFVzZXIgRXZlbnQgDQogKiBsYWJlbHMgc2hvd3MgdGhlIGxvZ2dlZCBzdHJpbmcsIHByZWNlZWRlZCBieSB0aGUgY2hhbm5lbCAgbmFtZSB3aXRoaW4gDQogKiBicmFja2V0cy4gRm9yIGV4YW1wbGU6DQogKg0KICogICJbTXlDaGFubmVsXSBIZWxsbyBXb3JsZCEiDQogKg0KICogVGhlIFVzZXIgRXZlbnQgQ2hhbm5lbHMgYXJlIHNob3duIGluIHRoZSBWaWV3IEZpbHRlciwgd2hpY2ggbWFrZXMgaXQgZWFzeSB0bw0KICogc2VsZWN0IHdoYXQgVXNlciBFdmVudHMgeW91IHdpc2ggdG8gZGlzcGxheS4gVXNlciBFdmVudCBDaGFubmVscyBhcmUgY3JlYXRlZA0KICogdXNpbmcgdlRyYWNlU3RvcmVVc2VyRXZlbnRDaGFubmVsTmFtZSgpLg0KICoNCiAqIEV4YW1wbGU6DQogKg0KICoJIGNoYXIqIGVycm9yX3VlY2hhbm5lbCA9IHZUcmFjZVN0b3JlVXNlckV2ZW50Q2hhbm5lbE5hbWUoIkVycm9ycyIpOw0KICoJIC4uLg0KICoJIHZUcmFjZVByaW50KGVycm9yX3VlY2hhbm5lbCwgIlNob3VsZG4ndCByZWFjaCB0aGlzIGNvZGUhIik7DQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlUHJpbnQoY29uc3QgY2hhciogY2huLCBjb25zdCBjaGFyKiBzdHIpOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VQcmludEYNCiAqDQogKiBHZW5lcmF0ZXMgIlVzZXIgRXZlbnRzIiwgd2l0aCBmb3JtYXR0ZWQgdGV4dCBhbmQgZGF0YSwgc2ltaWxhciB0byBhICJwcmludGYiLg0KICogSXQgaXMgdmVyeSBmYXN0IHNpbmNlIHRoZSBhY3R1YWwgZm9ybWF0dGluZyBpcyBkb25lIG9uIHRoZSBob3N0IHNpZGUgd2hlbiB0aGUNCiAqIHRyYWNlIGlzIGRpc3BsYXllZC4NCiAqDQogKiBVc2VyIEV2ZW50cyBjYW4gYmUgdXNlZCBmb3IgdmVyeSBlZmZpY2llbnQgYXBwbGljYXRpb24gbG9nZ2luZywgYW5kIGFyZSBzaG93bg0KICogYXMgeWVsbG93IGxhYmVscyBpbiB0aGUgbWFpbiB0cmFjZSB2aWV3Lg0KICogQW4gYWR2YW50YWdlIG9mIFVzZXIgRXZlbnRzIGlzIHRoYXQgZGF0YSBjYW4gYmUgcGxvdHRlZCBpbiB0aGUgIlVzZXIgRXZlbnQNCiAqIFNpZ25hbCBQbG90IiB2aWV3LCB2aXN1YWxpemluZyBhbnkgZGF0YSB5b3UgbG9nIGFzIFVzZXIgRXZlbnRzLCBkaXNjcmV0ZQ0KICogc3RhdGVzIG9yIGNvbnRyb2wgc3lzdGVtIHNpZ25hbHMgKGUuZy4gc3lzdGVtIGlucHV0cyBvciBvdXRwdXRzKS4NCiAqDQogKiBZb3UgbWF5IGdyb3VwIFVzZXIgRXZlbnRzIGludG8gVXNlciBFdmVudCBDaGFubmVscy4gVGhlIHllbGxvdyBVc2VyIEV2ZW50IA0KICogbGFiZWxzIHNob3cgdGhlIGxvZ2dlZCBzdHJpbmcsIHByZWNlZWRlZCBieSB0aGUgY2hhbm5lbCBuYW1lIHdpdGhpbiBicmFja2V0cy4NCiAqIA0KICogRXhhbXBsZToNCiAqDQogKiAgIltNeUNoYW5uZWxdIEhlbGxvIFdvcmxkISINCiAqDQogKiBUaGUgVXNlciBFdmVudCBDaGFubmVscyBhcmUgc2hvd24gaW4gdGhlIFZpZXcgRmlsdGVyLCB3aGljaCBtYWtlcyBpdCBlYXN5IHRvDQogKiBzZWxlY3Qgd2hhdCBVc2VyIEV2ZW50cyB5b3Ugd2lzaCB0byBkaXNwbGF5LiBVc2VyIEV2ZW50IENoYW5uZWxzIGFyZSBjcmVhdGVkDQogKiB1c2luZyB2VHJhY2VTdG9yZVVzZXJFdmVudENoYW5uZWxOYW1lKCkuDQogKg0KICogRXhhbXBsZToNCiAqDQogKgkgY2hhciogYWRjX3VlY2hhbm5lbCA9IHZUcmFjZVN0b3JlVXNlckV2ZW50Q2hhbm5lbE5hbWUoIkFEQyBVc2VyIEV2ZW50cyIpOw0KICoJIC4uLg0KICoJIHZUcmFjZVByaW50KGFkY191ZWNoYW5uZWwsDQogKgkJCQkgIkFEQyBjaGFubmVsICVkOiAlbGYgdm9sdHMiLA0KICoJCQkJIGNoLCAoZG91YmxlKWFkY19yZWFkaW5nLyhkb3VibGUpc2NhbGUpOw0KICoNCiAqIEFsbCBkYXRhIGFyZ3VtZW50cyBhcmUgYXNzdW1lZCB0byBiZSAzMiBidCB3aWRlLiBUaGUgZm9sbG93aW5nIGZvcm1hdHMgYXJlDQogKiBzdXBwb3J0ZWQgaW4gdjIuODoNCiAqICVkIC0gc2lnbmVkIGludGVnZXINCiAqICV1IC0gdW5zaWduZWQgaW50ZWdlcg0KICogJVggLSBoZXhhZGVjaW1hbCAodXBwZXJjYXNlKQ0KICogJXggLSBoZXhhZGVjaW1hbCAobG93ZXJjYXNlKQ0KICogJXMgLSBzdHJpbmcgKGN1cnJlbnRseSwgdGhpcyBtdXN0IGJlIGFuIGVhcmxpZXIgc3RvcmVkIHN5bWJvbCBuYW1lKQ0KICoNCiAqIFVwIHRvIDE1IGRhdGEgYXJndW1lbnRzIGFyZSBhbGxvd2VkLCB3aXRoIGEgdG90YWwgc2l6ZSBvZiBtYXhpbXVtIDYwIGJ5dGUNCiAqIGluY2x1ZGluZyA4IGJ5dGUgZm9yIHRoZSBiYXNlIGV2ZW50IGZpZWxkcyBhbmQgdGhlIGZvcm1hdCBzdHJpbmcuIFNvIHdpdGgNCiAqIG9uZSBkYXRhIGFyZ3VtZW50LCB0aGUgbWF4aW11bSBzdHJpbmcgbGVuZ3RoIGlzIDQ4IGNoYXJzLiBJZiB0aGlzIGlzIGV4Y2VlZGVkDQogKiB0aGUgc3RyaW5nIGlzIHRydW5jYXRlZCAoNCBieXRlcyBhdCBhIHRpbWUpLg0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVByaW50Rihjb25zdCBjaGFyKiBjaG4sIGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3JlVXNlckV2ZW50Q2hhbm5lbE5hbWUoY29uc3QgY2hhciogbmFtZSkNCiAqDQogKiBQYXJhbWV0ZXIgbmFtZTogdGhlIGNoYW5uZWwgbmFtZSB0byBzdG9yZSAoY29uc3Qgc3RyaW5nIGxpdGVyYWwpDQogKg0KICogU3RvcmVzIGEgbmFtZSBmb3IgYSB1c2VyIGV2ZW50IGNoYW5uZWwsIHJldHVybnMgdGhlIGhhbmRsZSAoanVzdCBhIHBvaW50ZXINCiAqIHRvIHRoZSBwcm92aWRlZCBzdHJpbmcpLiBUeXBpY2FsbHkgYXNzaWduZWQgdG8gYSAiY2hhbm5lbCIgdmFyaWFibGUgdGhhdA0KICoga2VlcHMgaXQgZm9yIGxhdGVyIGNhbGxzIHRvIHZUcmFjZVByaW50RigpOw0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmNoYXIqIHZUcmFjZVN0b3JlVXNlckV2ZW50Q2hhbm5lbE5hbWUoY29uc3QgY2hhciogbmFtZSk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9yZUtlcm5lbE9iamVjdE5hbWUodm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBuYW1lKQ0KICoNCiAqIFBhcmFtZXRlciBvYmplY3Q6IHBvaW50ZXIgdG8gdGhlIGtlcm5lbCBvYmplY3QgdGhhdCBzaGFsbCBiZSBuYW1lZA0KICogUGFyYW1ldGVyIG5hbWU6IHRoZSBuYW1lIHRvIHN0b3JlIChjb25zdCBzdHJpbmcgbGl0ZXJhbCkNCiAqDQogKiBTdG9yZXMgYSBuYW1lIGZvciBrZXJuZWwgb2JqZWN0cyAoU2VtYXBob3JlLCBNYWlsYm94LCBldGMuKS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0b3JlS2VybmVsT2JqZWN0TmFtZSh2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIG5hbWUpOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU2V0SVNSUHJvcGVydGllcyhjb25zdCBjaGFyKiBuYW1lLCBjaGFyIHByaW9yaXR5KQ0KICoNCiAqIFBhcmFtZXRlciBuYW1lOiB0aGUgbmFtZSB0byBnaXZlIHRoZSB0aGUgSVNSLCBhbHNvIHNlcnZlcyBhcyBoYW5kbGUuDQogKiBQYXJhbWV0ZXIgcHJpb3JpdHk6IHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGUgSVNSLg0KICoNCiAqIFN0b3JlcyBhIG5hbWUgYW5kIHByaW9yaXR5IGxldmVsIGZvciBhbiBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lLCB0byBhbGxvdw0KICogZm9yIGJldHRlciB2aXN1YWxpemF0aW9uLiBUaGUgc3RyaW5nIGFkZHJlc3MgaXMgdXNlZCBhcyBhIHVuaXF1ZSBoYW5kbGUuDQogKg0KICogRXhhbXBsZToNCiAqDQogKgkgdlRyYWNlU2V0SVNSUHJvcGVydGllcygiSVNSVGltZXIxIiwgSVNSUHJpb3JpdHlUaW1lcjEpOw0KICoJIC4uLg0KICoJIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICoJIHsNCiAqCQkgdlRyYWNlU3RvcmVJU1JCZWdpbigiSVNSVGltZXIxIik7DQogKgkJIC4uLg0KICoJCSB2VHJhY2VTdG9yZUlTUkVuZCgwKTsNCiAqCSB9DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKGNvbnN0IGNoYXIqIG5hbWUsIGNoYXIgcHJpb3JpdHkpOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU3RvcmVJU1JCZWdpbih2b2lkKiBoYW5kbGUpOw0KICoNCiAqIFBhcmFtZXRlciBoYW5kbGU6IElEIG9mIHRoZSBJU1IsIHdoaWNoIGlzICJuYW1lIiBpbiB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzDQogKg0KICogUmVnaXN0ZXJzIHRoZSBiZWdpbm5pbmcgb2YgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSAoSVNSKSwgaS5lLiwgb3IgYW4NCiAqIGV4Y2VwdGlvbiBoYW5kbGVyLg0KICoNCiAqIEV4YW1wbGU6DQogKg0KICoJIHZUcmFjZVNldElTUlByb3BlcnRpZXMoIklTUlRpbWVyMSIsIElTUlByaW9yaXR5VGltZXIxKTsNCiAqCSAuLi4NCiAqCSB2b2lkIElTUl9oYW5kbGVyKCkNCiAqCSB7DQogKgkJIHZUcmFjZVN0b3JlSVNSQmVnaW4oIklTUlRpbWVyMSIpOw0KICoJCSAuLi4NCiAqCQkgdlRyYWNlU3RvcmVJU1JFbmQoMCk7DQogKgkgfQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcmVJU1JCZWdpbih2b2lkKiBoYW5kbGUpOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU3RvcmVJU1JFbmQNCiAqDQogKiBSZWdpc3RlcnMgdGhlIGVuZCBvZiBhbiBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lLg0KICoNCiAqIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgaWYgYSB0YXNrIHN3aXRjaCB3aWxsIHRha2UNCiAqIHBsYWNlIHdoZW4gaW50ZXJydXB0IGVuZHMuIElmIHRoaXMgaXMgcG9zc2libGUgZGVwZW5kcyBvbiB0aGUga2VybmVsIHBvcnQuDQogKg0KICogRXhhbXBsZToNCiAqCSAjZGVmaW5lIFBSSU9fSVNSX1RJTUVSMSAzIC8vIHRoZSBoYXJkd2FyZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0DQogKgkgLi4uDQogKgkgdlRyYWNlU2V0SVNSUHJvcGVydGllcygiSVNSVGltZXIxIiwgUFJJT19JU1JfVElNRVIxKTsNCiAqCSAuLi4NCiAqCSB2b2lkIElTUl9oYW5kbGVyKCkNCiAqCSB7DQogKgkJIHZUcmFjZVN0b3JlSVNSQmVnaW4oIklTUlRpbWVyMSIpOw0KICoJCSAuLi4NCiAqCQkgdlRyYWNlU3RvcmVJU1JFbmQoKTsNCiAqCSB9DQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcmVJU1JFbmQodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9yZUlTUkVuZE1hbnVhbA0KICoNCiAqIFJlZ2lzdGVycyB0aGUgZW5kIG9mIGFuIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuDQogKg0KICogVGhlIHBhcmFtZXRlciBpc1Rhc2tTd2l0Y2hSZXF1aXJlZCBpbmRpY2F0ZXMgaWYgdGhlIGludGVycnVwdCBoYXMgcmVxdWVzdGVkIGENCiAqIHRhc2stc3dpdGNoICg9IDEpIG9yIGlmIHRoZSBpbnRlcnJ1cHQgcmV0dXJucyB0byB0aGUgZWFybGllciBjb250ZXh0ICg9IDApDQogKg0KICogRXhhbXBsZToNCiAqCSAjZGVmaW5lIFBSSU9fSVNSX1RJTUVSMSAzIC8vIHRoZSBoYXJkd2FyZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0DQogKgkgLi4uDQogKgkgdlRyYWNlU2V0SVNSUHJvcGVydGllcygiSVNSVGltZXIxIiwgUFJJT19JU1JfVElNRVIxKTsNCiAqCSAuLi4NCiAqCSB2b2lkIElTUl9oYW5kbGVyKCkNCiAqCSB7DQogKgkJIHZUcmFjZVN0b3JlSVNSQmVnaW4oIklTUlRpbWVyMSIpOw0KICoJCSAuLi4NCiAqCQkgdlRyYWNlU3RvcmVJU1JFbmRNYW51YWwoMCk7DQogKgkgfQ0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0b3JlSVNSRW5kTWFudWFsKGludCBpc1Rhc2tTd2l0Y2hSZXF1aXJlZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VJbnN0YW5jZUZpbmlzaE5vdw0KICoNCiAqIENyZWF0ZXMgYW4gZXZlbnQgdGhhdCBlbmRzIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgYXQgdGhpcyB2ZXJ5IGluc3RhbnQuDQogKiBUaGlzIG1ha2VzIHRoZSB2aWV3ZXIgdG8gc3BsaXRzIHRoZSBjdXJyZW50IGZyYWdtZW50IGF0IHRoaXMgcG9pbnQgYW5kIGJlZ2luDQogKiBhIG5ldyBhY3RvciBpbnN0YW5jZSwgZXZlbiBpZiBubyB0YXNrLXN3aXRjaCBoYXMgb2NjdXJyZWQuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUluc3RhbmNlRmluaXNoZWROb3codm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VJbnN0YW5jZUZpbmlzaGVkTmV4dA0KICoNCiAqIE1hcmtzIHRoZSBjdXJyZW50ICJ0YXNrIGluc3RhbmNlIiBhcyBmaW5pc2hlZCBvbiB0aGUgbmV4dCBrZXJuZWwgY2FsbC4NCiAqDQogKiBJZiB0aGF0IGtlcm5lbCBjYWxsIGlzIGJsb2NraW5nLCB0aGUgaW5zdGFuY2UgZW5kcyBhZnRlciB0aGUgYmxvY2tpbmcgZXZlbnQNCiAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyByZXR1cm4gZXZlbnQgaXMgdGhlbiB0aGUgc3RhcnQgb2YgdGhlIG5leHQgaW5zdGFuY2UuDQogKiBJZiB0aGUga2VybmVsIGNhbGwgaXMgbm90IGJsb2NraW5nLCB0aGUgdmlld2VyIGluc3RlYWQgc3BsaXRzIHRoZSBjdXJyZW50DQogKiBmcmFnbWVudCByaWdodCBiZWZvcmUgdGhlIGtlcm5lbCBjYWxsLCB3aGljaCBtYWtlcyB0aGlzIGNhbGwgdGhlIGZpcnN0IGV2ZW50DQogKiBvZiB0aGUgbmV4dCBpbnN0YW5jZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlSW5zdGFuY2VGaW5pc2hlZE5leHQodm9pZCk7DQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKiogSU5URVJOQUwgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKiBTYXZlcyBhIHN5bWJvbCBuYW1lICh0YXNrIG5hbWUgZXRjLikgaW4gc3ltYm9sIHRhYmxlICovDQp2b2lkIHZUcmFjZVNhdmVTeW1ib2wodm9pZCAqYWRkcmVzcywgY29uc3QgY2hhciAqbmFtZSk7DQoNCi8qIERlbGV0ZXMgYSBzeW1ib2wgbmFtZSAodGFzayBuYW1lIGV0Yy4pIGZyb20gc3ltYm9sIHRhYmxlICovDQp2b2lkIHZUcmFjZURlbGV0ZVN5bWJvbCh2b2lkICphZGRyZXNzKTsNCg0KLyogU2F2ZXMgYW4gb2JqZWN0IGRhdGEgZW50cnkgKHRhc2sgYmFzZSBwcmlvcml0eSkgaW4gb2JqZWN0IGRhdGEgdGFibGUgKi8NCnZvaWQgdlRyYWNlU2F2ZU9iamVjdERhdGEodm9pZCAqYWRkcmVzcywgdWludDMyX3QgZGF0YSk7DQoNCi8qIFJlbW92ZXMgYW4gb2JqZWN0IGRhdGEgZW50cnkgKHRhc2sgYmFzZSBwcmlvcml0eSkgZnJvbSBvYmplY3QgZGF0YSB0YWJsZSAqLw0Kdm9pZCB2VHJhY2VEZWxldGVPYmplY3REYXRhKHZvaWQgKmFkZHJlc3MpOw0KDQovKiBTdG9yZSBhbiBldmVudCB3aXRoIHplcm8gcGFyYW1ldGVycyAoZXZlbnQgSUQgb25seSkgKi8NCnZvaWQgdlRyYWNlU3RvcmVFdmVudDAodWludDE2X3QgZXZlbnRJRCk7DQoNCi8qIFN0b3JlIGFuIGV2ZW50IHdpdGggb25lIDMyLWJpdCBwYXJhbWV0ZXIgKHBvaW50ZXIgYWRkcmVzcyBvciBhbiBpbnQpICovDQp2b2lkIHZUcmFjZVN0b3JlRXZlbnQxKHVpbnQxNl90IGV2ZW50SUQsIHVpbnQzMl90IHBhcmFtMSk7DQoNCi8qIFN0b3JlIGFuIGV2ZW50IHdpdGggdHdvIDMyLWJpdCBwYXJhbWV0ZXJzICovDQp2b2lkIHZUcmFjZVN0b3JlRXZlbnQyKHVpbnQxNl90IGV2ZW50SUQsIHVpbnQzMl90IHBhcmFtMSwgdWludDMyX3QgcGFyYW0yKTsNCg0KLyogU3RvcmUgYW4gZXZlbnQgd2l0aCB0aHJlZSAzMi1iaXQgcGFyYW1ldGVycyAqLw0Kdm9pZCB2VHJhY2VTdG9yZUV2ZW50MygJdWludDE2X3QgZXZlbnRJRCwNCgkJCQkJCXVpbnQzMl90IHBhcmFtMSwNCgkJCQkJCXVpbnQzMl90IHBhcmFtMiwNCgkJCQkJCXVpbnQzMl90IHBhcmFtMyk7DQoNCi8qIFN0b3JlcyBhbiBldmVudCB3aXRoIDxuUGFyYW0+IDMyLWJpdCBpbnRlZ2VyIHBhcmFtZXRlcnMgKi8NCnZvaWQgdlRyYWNlU3RvcmVFdmVudChpbnQgblBhcmFtLCB1aW50MTZfdCBFdmVudElELCAuLi4pOw0KDQovKiBTdG9yaWVzIGFuIGV2ZW50IHdpdGggYSBzdHJpbmcgYW5kIDxuUGFyYW0+IDMyLWJpdCBpbnRlZ2VyIHBhcmFtZXRlcnMgKi8NCnZvaWQgdlRyYWNlU3RvcmVTdHJpbmdFdmVudChpbnQgbkFyZ3MsIHVpbnQxNl90IGV2ZW50SUQsIGNvbnN0IGNoYXIqIHN0ciwgLi4uKTsNCg0KLyogVGhlIGRhdGEgc3RydWN0dXJlIGZvciBjb21tYW5kcyAoYSBiaXQgb3ZlcmtpbGwpICovDQp0eXBlZGVmIHN0cnVjdA0Kew0KICB1bnNpZ25lZCBjaGFyIGNtZENvZGU7DQogIHVuc2lnbmVkIGNoYXIgcGFyYW0xOw0KICB1bnNpZ25lZCBjaGFyIHBhcmFtMjsNCiAgdW5zaWduZWQgY2hhciBwYXJhbTM7DQogIHVuc2lnbmVkIGNoYXIgcGFyYW00Ow0KICB1bnNpZ25lZCBjaGFyIHBhcmFtNTsNCiAgdW5zaWduZWQgY2hhciBjaGVja3N1bUxTQjsNCiAgdW5zaWduZWQgY2hhciBjaGVja3N1bU1TQjsNCn0gVHJhY2VhbHl6ZXJDb21tYW5kVHlwZTsNCg0KLyogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBjb21tYW5kIGlzIGEgdmFsaWQgY29tbWFuZCAqLw0KaW50IGlzVmFsaWRDb21tYW5kKFRyYWNlYWx5emVyQ29tbWFuZFR5cGUqIGNtZCk7DQoNCi8qIEV4ZWN1dGVkIHRoZSByZWNlaXZlZCBjb21tYW5kIChTdGFydCBvciBTdG9wKSAqLw0Kdm9pZCBwcm9jZXNzQ29tbWFuZChUcmFjZWFseXplckNvbW1hbmRUeXBlKiBjbWQpOw0KDQovKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBtYWNyb3Mgd2l0aCBvbGQgcmVjb3JkZXIgKi8NCiNkZWZpbmUgdlRyYWNlSW5pdFRyYWNlRGF0YSgpIFRyYWNlX0luaXQoKQ0KI2RlZmluZSB1aVRyYWNlU3RhcnQoKSAoMSkNCiNkZWZpbmUgdlRyYWNlU3RhcnQoKQ0KI2RlZmluZSB2VHJhY2VTdG9wKCkNCg0KI2Vsc2UgLyooVVNFX1RSQUNFQUxZWkVSX1JFQ09SREVSID09IDEpKi8NCg0KI2RlZmluZSB2VHJhY2VTdG9yZUV2ZW50MChlKQ0KI2RlZmluZSB2VHJhY2VTdG9yZUV2ZW50MShlLCBwYXJhbTEpDQojZGVmaW5lIHZUcmFjZVN0b3JlRXZlbnQyKGUsIHBhcmFtMSwgcGFyYW0yKQ0KI2RlZmluZSB2VHJhY2VTdG9yZUV2ZW50MyhlLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQ0KI2RlZmluZSB2VHJhY2VTdG9yZVVzZXJFdmVudENoYW5uZWxOYW1lKHgpIDANCiNkZWZpbmUgdlRyYWNlUHJpbnQoY2huLCAuLi4pIA0KI2RlZmluZSB2VHJhY2VQcmludEYoY2huLCAuLi4pIA0KI2RlZmluZSB2VHJhY2VJbnN0YW5jZUZpbmlzaGVkTm93KCkNCiNkZWZpbmUgdlRyYWNlSW5zdGFuY2VGaW5pc2hlZE5leHQoKQ0KI2RlZmluZSB2VHJhY2VTdG9yZUlTUkJlZ2luKHgpDQojZGVmaW5lIHZUcmFjZVN0b3JlSVNSRW5kKCkNCiNkZWZpbmUgdlRyYWNlU3RvcmVJU1JFbmRNYW51YWwoeCkNCiNkZWZpbmUgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhhLCBiKSANCiNkZWZpbmUgdlRyYWNlU3RvcmVLZXJuZWxPYmplY3ROYW1lKGEsIGIpIA0KDQovKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBtYWNyb3Mgd2l0aCBvbGQgcmVjb3JkZXIgKi8NCiNkZWZpbmUgdlRyYWNlSW5pdFRyYWNlRGF0YSgpCQ0KI2RlZmluZSB1aVRyYWNlU3RhcnQoKSAoMSkNCiNkZWZpbmUgdlRyYWNlU3RhcnQoKQ0KI2RlZmluZSB2VHJhY2VTdG9wKCkNCg0KI2VuZGlmIC8qKFVTRV9UUkFDRUFMWVpFUl9SRUNPUkRFUiA9PSAxKSovDQoNCmV4dGVybiB2b2lkIHBzZkVycm9yKGludCBlcnJDb2RlKTsNCg0KI2RlZmluZSBQU0ZfQVNTRVJUKF9hc3NlcnQsIF9lcnIpIGlmICghIChfYXNzZXJ0KSl7IHBzZkVycm9yKF9lcnIpOyByZXR1cm47IH0NCg0KI2RlZmluZSBQU0ZfRVJST1JfTk9ORSAwDQojZGVmaW5lIFBTRl9FUlJPUl9FVkVOVF9DT0RFX1RPT19MQVJHRSAxDQojZGVmaW5lIFBTRl9FUlJPUl9JU1JfTkVTVElOR19PVkVSRkxPVyAyDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KfQ0KI2VuZGlmDQoNCiNlbmRpZiAvKiBfVFJDX1JFQ09SREVSX0ggKi8NCg==