LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIEZyZWVSVE9TK1RyYWNlIHYyLjMuMCBSZWNvcmRlciBMaWJyYXJ5DQogKiBQZXJjZXBpbyBBQiwgd3d3LnBlcmNlcGlvLmNvbQ0KICoNCiAqIHRyY1VzZXIuaA0KICogVGhlIHB1YmxpYyBBUEkgb2YgdGhlIHRyYWNlIHJlY29yZGVyIGxpYnJhcnkuDQogKg0KICogVGVybXMgb2YgVXNlDQogKiBUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCBQZXJjZXBpbyBBQi4gVGhlIHJlY29yZGVyIGxpYnJhcnkgaXMgZnJlZSBmb3INCiAqIHVzZSB0b2dldGhlciB3aXRoIFBlcmNlcGlvIHByb2R1Y3RzLiBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIHJlY29yZGVyIGxpYnJhcnkNCiAqIGluIGl0cyBvcmlnaW5hbCBmb3JtLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucyBpbiB0cmNQb3J0LmMgYW5kIHRyY1BvcnQuaA0KICogZ2l2ZW4gdGhhdCB0aGVzZSBtb2RpZmljYXRpb24gYXJlIGNsZWFybHkgbWFya2VkIGFzIHlvdXIgb3duIG1vZGlmaWNhdGlvbnMNCiAqIGFuZCBkb2N1bWVudGVkIGluIHRoZSBpbml0aWFsIGNvbW1lbnQgc2VjdGlvbiBvZiB0aGVzZSBzb3VyY2UgZmlsZXMuIA0KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIFBlcmNlcGlvIEFCIGFuZCBtYXkgbm90IGJlIA0KICogc29sZCBvciBpbiBvdGhlciB3YXlzIGNvbW1lcmNpYWxseSByZWRpc3RyaWJ1dGVkIHdpdGhvdXQgZXhwbGljaXQgd3JpdHRlbiANCiAqIHBlcm1pc3Npb24gYnkgUGVyY2VwaW8gQUIuDQogKg0KICogRGlzY2xhaW1lciANCiAqIFRoZSB0cmFjZSB0b29sIGFuZCByZWNvcmRlciBsaWJyYXJ5IGlzIGJlaW5nIGRlbGl2ZXJlZCB0byB5b3UgQVMgSVMgYW5kIA0KICogUGVyY2VwaW8gQUIgbWFrZXMgbm8gd2FycmFudHkgYXMgdG8gaXRzIHVzZSBvciBwZXJmb3JtYW5jZS4gUGVyY2VwaW8gQUIgZG9lcyANCiAqIG5vdCBhbmQgY2Fubm90IHdhcnJhbnQgdGhlIHBlcmZvcm1hbmNlIG9yIHJlc3VsdHMgeW91IG1heSBvYnRhaW4gYnkgdXNpbmcgdGhlIA0KICogc29mdHdhcmUgb3IgZG9jdW1lbnRhdGlvbi4gUGVyY2VwaW8gQUIgbWFrZSBubyB3YXJyYW50aWVzLCBleHByZXNzIG9yIA0KICogaW1wbGllZCwgYXMgdG8gbm9uaW5mcmluZ2VtZW50IG9mIHRoaXJkIHBhcnR5IHJpZ2h0cywgbWVyY2hhbnRhYmlsaXR5LCBvciANCiAqIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEluIG5vIGV2ZW50IHdpbGwgUGVyY2VwaW8gQUIsIGl0cyANCiAqIHRlY2hub2xvZ3kgcGFydG5lcnMsIG9yIGRpc3RyaWJ1dG9ycyBiZSBsaWFibGUgdG8geW91IGZvciBhbnkgY29uc2VxdWVudGlhbCwgDQogKiBpbmNpZGVudGFsIG9yIHNwZWNpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBsb3N0IHByb2ZpdHMgb3IgbG9zdCBzYXZpbmdzLCANCiAqIGV2ZW4gaWYgYSByZXByZXNlbnRhdGl2ZSBvZiBQZXJjZXBpbyBBQiBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSANCiAqIG9mIHN1Y2ggZGFtYWdlcywgb3IgZm9yIGFueSBjbGFpbSBieSBhbnkgdGhpcmQgcGFydHkuIFNvbWUganVyaXNkaWN0aW9ucyBkbyANCiAqIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yIGxpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCwgY29uc2VxdWVudGlhbCBvciBzcGVjaWFsIA0KICogZGFtYWdlcywgb3IgdGhlIGV4Y2x1c2lvbiBvZiBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgbGltaXRhdGlvbnMgb24gaG93IGxvbmcgYW4gDQogKiBpbXBsaWVkIHdhcnJhbnR5IG1heSBsYXN0LCBzbyB0aGUgYWJvdmUgbGltaXRhdGlvbnMgbWF5IG5vdCBhcHBseSB0byB5b3UuDQogKg0KICogRnJlZVJUT1MrVHJhY2UgaXMgYXZhaWxhYmxlIGFzIEZyZWUgRWRpdGlvbiBhbmQgaW4gdHdvIHByZW1pdW0gZWRpdGlvbnMuDQogKiBZb3UgbWF5IHVzZSB0aGUgcHJlbWl1bSBmZWF0dXJlcyBkdXJpbmcgMzAgZGF5cyBmb3IgZXZhbHVhdGlvbi4NCiAqIERvd25sb2FkIEZyZWVSVE9TK1RyYWNlIGF0IGh0dHA6Ly93d3cucGVyY2VwaW8uY29tL3Byb2R1Y3RzL2Rvd25sb2Fkcy8NCiAqDQogKiBDb3B5cmlnaHQgUGVyY2VwaW8gQUIsIDIwMTIuDQogKiB3d3cucGVyY2VwaW8uY29tDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWZuZGVmIFRSQ1VTRVJfSA0KI2RlZmluZSBUUkNVU0VSX0gNCg0KI2luY2x1ZGUgIkZyZWVSVE9TLmgiDQoNCiNpbmNsdWRlICJ0cmNLZXJuZWwuaCINCg0KI2lmIChjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSkNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQpleHRlcm4gIkMiIHsNCiNlbmRpZg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdWlUcmFjZVN0YXJ0DQogKg0KICogU3RhcnRzIHRoZSByZWNvcmRlci4gVGhlIHJlY29yZGVyIHdpbGwgbm90IGJlIHN0YXJ0ZWQgaWYgYW4gZXJyb3IgaGFzIGJlZW4NCiAqIGluZGljYXRlZCB1c2luZyB2VHJhY2VFcnJvciwgZS5nLiBpZiBhbnkgb2YgdGhlIE54IGNvbnN0YW50cyBpbiB0cmNDb25maWcuaCANCiAqIGhhcyBhIHRvbyBzbWFsbCB2YWx1ZSAoTlRBU0ssIE5RVUVVRSwgZXRjKS4NCiAqIA0KICogUmV0dXJucyAxIGlmIHRoZSByZWNvcmRlciB3YXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkuDQogKiBSZXR1cm5zIDAgaWYgdGhlIHJlY29yZGVyIHN0YXJ0IHdhcyBwcmV2ZW50ZWQgZHVlIHRvIGEgcHJldmlvdXMgaW50ZXJuYWwgDQogKiBlcnJvci4gSW4gdGhhdCBjYXNlLCBjaGVjayB2VHJhY2VHZXRMYXN0RXJyb3IgdG8gZ2V0IHRoZSBlcnJvciBtZXNzYWdlLg0KICogQW55IGVycm9yIG1lc3NhZ2UgaXMgYWxzbyBwcmVzZW50ZWQgd2hlbiBvcGVuaW5nIGEgdHJhY2UgZmlsZSBpbiANCiAqIEZyZWVSVE9TK1RyYWNlIHYyLjIuMiBvciBsYXRlci4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1aW50MzJfdCB1aVRyYWNlU3RhcnQodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdGFydCANCiAqDQogKiBTdGFydHMgdGhlIHJlY29yZGVyLiBUaGUgcmVjb3JkZXIgd2lsbCBub3QgYmUgc3RhcnRlZCBpZiBhbiBlcnJvciBoYXMgYmVlbg0KICogaW5kaWNhdGVkIHVzaW5nIHZUcmFjZUVycm9yLCBlLmcuIGlmIGFueSBvZiB0aGUgTnggY29uc3RhbnRzIGluIHRyY0NvbmZpZy5oIA0KICogaGFzIGEgdG9vIHNtYWxsIHZhbHVlIChOVEFTSywgTlFVRVVFLCBldGMpLg0KICogDQogKiBUaGlzIGZ1bmN0aW9uIGlzIG9ic29sZXRlLCBidXQgaGFzIGJlZW4gc2F2ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiANCiAqIFdlIHJlY29tbWVuZCB1c2luZyB1aVRyYWNlU3RhcnQgaW5zdGVhZC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0YXJ0KHZvaWQpOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU3RhcnRTdGF0dXNNb25pdG9yDQogKg0KICogVGhpcyBzdGFydHMgYSB0YXNrIHRvIG1vbml0b3IgdGhlIHN0YXR1cyBvZiB0aGUgcmVjb3JkZXIgbW9kdWxlLiANCiAqIFRoaXMgdGFzayBwZXJpb2RpY2FsbHkgcHJpbnRzIGEgbGluZSB0byB0aGUgY29uc29sZSB3aW5kb3csIHdoaWNoIHNob3dzIHRoZSANCiAqIHJlY29yZGVyIHN0YXR1cywgdGhlIG51bWJlciBvZiBldmVudHMgcmVjb3JkZWQgYW5kIHRoZSBsYXRlc3QgdGltZXN0YW1wLiANCiAqIFRoaXMgdGFzayBjYWxscyB2VHJhY2VQb3J0RW5kICh0cmNQb3J0LmMpIHdoZW4gaXQgZGV0ZWN0cyB0aGF0IHRoZSByZWNvcmRlciANCiAqIGhhcyBiZWVuIHN0b3BwZWQuIFRoaXMgYWxsb3dzIGZvciBhZGRpbmcgY3VzdG9tIGFjdGlvbnMsIGUuZy4sIHRvIHN0b3JlIHRoZQ0KICogdHJhY2UgdG8gYSBmaWxlIGluIGNhc2UgYSBmaWxlIHN5c3RlbSBpcyBhdmFpbGFibGUgb24gdGhlIGRldmljZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0YXJ0U3RhdHVzTW9uaXRvcih2b2lkKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3ANCiAqDQogKiBTdG9wcyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRpbmcgY2FuIGJlIHJlc3VtZWQgYnkgY2FsbGluZyB2VHJhY2VTdGFydC4NCiAqIFRoaXMgZG9lcyBub3QgcmVzZXQgdGhlIHJlY29yZGVyLiBVc2UgdlRyYWNlQ2xlYXIgaXMgdGhhdCBpcyBkZXNpcmVkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcCh2b2lkKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZUNsZWFyDQogKg0KICogUmVzZXRzIHRoZSByZWNvcmRlci4gT25seSBuZWNlc3NhcnkgaWYgYSByZXN0YXJ0IGlzIGRlc2lyZWQgLSB0aGlzIGlzIG5vdCANCiAqIG5lZWRlZCBpbiB0aGUgc3RhcnR1cCBpbml0aWFsaXphdGlvbi4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUNsZWFyKHZvaWQpOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU2V0UXVldWVOYW1lDQogKg0KICogQXNzaWducyBhIG5hbWUgdG8gYSBGcmVlUlRPUyBRdWV1ZSwgU2VtYXBob3JlIG9yIE11dGV4LiBUaGlzIGZ1bmN0aW9uIHNob3VsZA0KICogYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBxdWV1ZS9tdXRleC9zZW1hcGhvcmUuIElmIG5vdCB1c2luZyANCiAqIHRoaXMgZnVuY3Rpb24sIHRoZSBxdWV1ZXMvbXV0ZXhlcy9zZW1hcGhvcmVzIHdpbGwgYmUgcHJlc2VudGVkIGJ5IHRoZWlyDQogKiBudW1lcmljIGhhbmRsZSBvbmx5Lg0KICoNCiAqIEV4YW1wbGU6DQogKiAgICAgYWN0dWF0b3JRID0geFF1ZXVlQ3JlYXRlKDMsIHNpemVvZihRdWV1ZU1lc3NhZ2UpKTsNCiAqICAgICB2VHJhY2VTZXRRdWV1ZU5hbWUoYWN0dWF0b3JRLCAiQWN0dWF0b3JRdWV1ZSIpOw0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU2V0UXVldWVOYW1lKHZvaWQqIHF1ZXVlLCBjb25zdCBjaGFyKiBuYW1lKTsNCg0KI2lmIChJTkNMVURFX0lTUl9UUkFDSU5HID09IDEpDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzDQogKiANCiAqIFJlZ2lzdGVycyBhbiBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lIGluIHRoZSByZWNvcmRlciBsaWJyYXJ5LCBUaGlzIG11c3QgYmUNCiAqIGNhbGxlZCBiZWZvcmUgdXNpbmcgdlRyYWNlU3RvcmVJU1JCZWdpbiB0byBzdG9yZSBJU1IgZXZlbnRzLiBUaGlzIGlzIA0KICogdHlwaWNhbGx5IGNhbGxlZCBpbiB0aGUgc3RhcnR1cCBvZiB0aGUgc3lzdGVtLCBiZWZvcmUgdGhlIHNjaGVkdWxlciBpcyANCiAqIHN0YXJ0ZWQuDQogKg0KICogRXhhbXBsZToNCiAqICAgICAjZGVmaW5lIElEX0lTUl9USU1FUjEgMSAgICAgICAvLyBsb3dlc3QgdmFsaWQgSUQgaXMgMQ0KICogICAgICNkZWZpbmUgUFJJT19PRl9JU1JfVElNRVIxIDMgIC8vIHRoZSBoYXJkd2FyZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0DQogKiAgICAgLi4uDQogKiAgICAgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhJRF9JU1JfVElNRVIxLCAiSVNSVGltZXIxIiwgUFJJT19PRl9JU1JfVElNRVIxKTsNCiAqICAgICAuLi4NCiAqICAgICB2b2lkIElTUl9oYW5kbGVyKCkNCiAqICAgICB7DQogKiAgICAgICAgIHBvcnRFTlRFUl9DUklUSUNBTCgpOyAvLyBSZXF1aXJlZCBpZiBuZXN0ZWQgSVNScyBhcmUgYWxsb3dlZA0KICogICAgICAgICB2VHJhY2VTdG9yZUlTUkJlZ2luKElEX09GX0lTUl9USU1FUjEpOw0KICogICAgICAgICBwb3J0RVhJVF9DUklUSUNBTCgpOw0KICogICAgICAgICAuLi4NCiAqICAgICAgICAgcG9ydEVOVEVSX0NSSVRJQ0FMKCk7IC8vIFJlcXVpcmVkIGlmIG5lc3RlZCBJU1JzIGFyZSBhbGxvd2VkDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSRW5kKCk7DQogKiAgICAgICAgIHBvcnRFWElUX0NSSVRJQ0FMKCk7DQogKiAgICAgfQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhvYmplY3RIYW5kbGVUeXBlIGhhbmRsZSwgY29uc3QgY2hhciogbmFtZSwgY2hhciBwcmlvcml0eSk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9yZUlTUkJlZ2luDQogKiANCiAqIFJlZ2lzdGVycyB0aGUgYmVnaW5uaW5nIG9mIGFuIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuDQogKg0KICogTm90ZSEgVGhpcyBtYXkgb25seSBiZSB1c2VkIGZvciBpbnRlcnJ1cHRzIGFmZmVjdGVkIGJ5IHBvcnRFTlRFUl9DUklUSUNBTC4NCiAqIEluIHNvbWUgRnJlZVJUT1MgcG9ydHMsIHN1Y2ggYXMgQVJNIENvcnRleCBNMywgdGhpcyBkb2VzIG5vdCBkaXNhYmxlIGFsbA0KICogaW50ZXJydXB0cy4gSW50ZXJydXB0cyBhYm92ZSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgYXJlIHN0aWxsIA0KICogZW5hYmxlZCwgYnV0IG1heSBub3QgY2FsbCB0aGUgRnJlZVJUT1MgQVBJLiBTdWNoIG1heSBub3QgY2FsbCB0aGUgcmVjb3JkZXIgDQogKiBBUEksIGluY2x1ZGluZyB0aGlzIGZ1bmN0aW9uLg0KICoNCiAqIFNlZSBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTAuaHRtbA0KICogDQogKiBJZiBhbGxvd2luZyBuZXN0ZWQgSVNScywgdGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuIA0KICoNCiAqIEV4YW1wbGU6DQogKiAgICAgI2RlZmluZSBJRF9JU1JfVElNRVIxIDEgICAgICAgLy8gbG93ZXN0IHZhbGlkIElEIGlzIDENCiAqICAgICAjZGVmaW5lIFBSSU9fT0ZfSVNSX1RJTUVSMSAzICAvLyB0aGUgaGFyZHdhcmUgcHJpb3JpdHkgb2YgdGhlIGludGVycnVwdA0KICogICAgIC4uLg0KICogICAgIHZUcmFjZVNldElTUlByb3BlcnRpZXMoSURfSVNSX1RJTUVSMSwgIklTUlRpbWVyMSIsIFBSSU9fT0ZfSVNSX1RJTUVSMSk7DQogKiAgICAgLi4uDQogKiAgICAgdm9pZCBJU1JfaGFuZGxlcigpDQogKiAgICAgew0KICogICAgICAgICBwb3J0RU5URVJfQ1JJVElDQUwoKTsgLy8gUmVxdWlyZWQgaWYgbmVzdGVkIElTUnMgYXJlIGFsbG93ZWQNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JCZWdpbihJRF9PRl9JU1JfVElNRVIxKTsNCiAqICAgICAgICAgcG9ydEVYSVRfQ1JJVElDQUwoKTsNCiAqICAgICAgICAgLi4uDQogKiAgICAgICAgIHBvcnRFTlRFUl9DUklUSUNBTCgpOyAvLyBSZXF1aXJlZCBpZiBuZXN0ZWQgSVNScyBhcmUgYWxsb3dlZA0KICogICAgICAgICB2VHJhY2VTdG9yZUlTUkVuZCgpOw0KICogICAgICAgICBwb3J0RVhJVF9DUklUSUNBTCgpOw0KICogICAgIH0NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0b3JlSVNSQmVnaW4ob2JqZWN0SGFuZGxlVHlwZSBpZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9yZUlTUkVuZA0KICogDQogKiBSZWdpc3RlcnMgdGhlIGVuZCBvZiBhbiBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lLg0KICoNCiAqIE5vdGUhIFRoaXMgbWF5IG9ubHkgYmUgdXNlZCBmb3IgaW50ZXJydXB0cyBhZmZlY3RlZCBieSBwb3J0RU5URVJfQ1JJVElDQUwuDQogKiBJbiBzb21lIEZyZWVSVE9TIHBvcnRzLCBzdWNoIGFzIEFSTSBDb3J0ZXggTTMsIHRoaXMgZG9lcyBub3QgZGlzYWJsZSBhbGwNCiAqIGludGVycnVwdHMuIEludGVycnVwdHMgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIGFyZSBzdGlsbCANCiAqIGVuYWJsZWQsIGJ1dCBtYXkgbm90IGNhbGwgdGhlIEZyZWVSVE9TIEFQSS4gU3VjaCBtYXkgbm90IGNhbGwgdGhlIHJlY29yZGVyIA0KICogQVBJLCBpbmNsdWRpbmcgdGhpcyBmdW5jdGlvbi4NCiAqDQogKiBTZWUgaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTEwLmh0bWwNCiAqIA0KICogSWYgYWxsb3dpbmcgbmVzdGVkIElTUnMsIHRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLiANCiAqDQogKiBFeGFtcGxlOg0KICogICAgICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxICAgICAgIC8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKiAgICAgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICogICAgIC4uLg0KICogICAgIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICogICAgIHsNCiAqICAgICAgICAgcG9ydEVOVEVSX0NSSVRJQ0FMKCk7IC8vIFJlcXVpcmVkIGlmIG5lc3RlZCBJU1JzIGFyZSBhbGxvd2VkDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSQmVnaW4oSURfT0ZfSVNSX1RJTUVSMSk7DQogKiAgICAgICAgIHBvcnRFWElUX0NSSVRJQ0FMKCk7DQogKiAgICAgICAgIC4uLg0KICogICAgICAgICBwb3J0RU5URVJfQ1JJVElDQUwoKTsgLy8gUmVxdWlyZWQgaWYgbmVzdGVkIElTUnMgYXJlIGFsbG93ZWQNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JFbmQoKTsNCiAqICAgICAgICAgcG9ydEVYSVRfQ1JJVElDQUwoKTsNCiAqICAgICB9DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTdG9yZUlTUkVuZCh2b2lkKTsNCg0KI2Vsc2UNCiAgIC8qIElmIG5vdCBpbmNsdWRpbmcgdGhlIElTUiByZWNvcmRpbmcgKi8NCg0Kdm9pZCB2VHJhY2VJbmNyZWFzZUlTUkFjdGl2ZSh2b2lkKTsNCg0Kdm9pZCB2VHJhY2VEZWNyZWFzZUlTUkFjdGl2ZSh2b2lkKTsNCg0KI2RlZmluZSB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKGhhbmRsZSwgbmFtZSwgcHJpb3JpdHkpDQojZGVmaW5lIHZUcmFjZVN0b3JlSVNSQmVnaW4oaWQpIHZUcmFjZUluY3JlYXNlSVNSQWN0aXZlKCkNCiNkZWZpbmUgdlRyYWNlU3RvcmVJU1JFbmQoKSB2VHJhY2VEZWNyZWFzZUlTUkFjdGl2ZSgpDQoNCiNlbmRpZg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdnZUcmFjZVRhc2tTa2lwRGVmYXVsdEluc3RhbmNlRmluaXNoZWRFdmVudHMNCiAqDQogKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGVyZSBhcmUgaW1wbGljaXQgSW5zdGFuY2UgRmluaXNoIEV2ZW50cywgc3VjaCBhcyANCiAqIHZUYXNrRGVsYXlVbnRpbCBvciB4UXVldWVSZWNlaXZlLCBpbiBhIHRhc2sgd2hlcmUgYW4gZXhwbGljaXQgSW5zdGFuY2UgRmluaXNoIA0KICogRXZlbnQgaGFzIGJlZW4gZGVmaW5lZC4gVGhpcyBmdW5jdGlvbiB0ZWxscyB0aGUgcmVjb3JkZXIgdGhhdCBvbmx5IHRoZSANCiAqIGV4cGxpY2l0bHkgZGVmaW5lZCBmdW5jdGlvbnMgKHVzaW5nIHZUcmFjZVRhc2tJbnN0YW5jZUlzRmluaXNoZWQpIHNob3VsZCBiZQ0KICogdHJlYXRlZCBhcyBJbnN0YW5jZSBGaW5pc2ggRXZlbnRzIGZvciB0aGlzIHRhc2suIFRoZSBpbXBsaWNpdCBJbnN0YW5jZSBGaW5pc2ggDQogKiBFdmVudHMgYXJlIHRodXMgZGlzcmVnYXJkZWQgZm9yIHRoaXMgdGFzay4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVRhc2tTa2lwRGVmYXVsdEluc3RhbmNlRmluaXNoZWRFdmVudHModm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VUYXNrSW5zdGFuY2VJc0ZpbmlzaGVkDQogKiANCiAqIFRoaXMgZGVmaW5lcyBhbiBleHBsaWNpdCBJbnN0YW5jZSBGaW5pc2ggRXZlbnQgZm9yIHRoZSBjdXJyZW50IHRhc2suIEl0IHRlbGxzIA0KICogdGhlIHJlY29yZGVyIHRoYXQgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhpcyB0YXNrIGlzIGZpbmlzaGVkIGF0IHRoZSBuZXh0IA0KICoga2VybmVsIGNhbGwgb2YgdGhlIHRhc2ssIGUuZy4sIGEgdGFza0RlbGF5IG9yIGEgcXVldWUgcmVjZWl2ZS4gVGhpcyBmdW5jdGlvbiANCiAqIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYmVmb3JlIHRoZSBhcGkgZnVuY3Rpb24gY2FsbCBjb25zaWRlcmVkIHRvIGJlIHRoZSBlbmQgDQogKiBvZiB0aGUgdGFzayBpbnN0YW1jZSwgaS5lLiwgdGhlIEluc3RhbmNlIEZpbmlzaCBFdmVudC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVRhc2tJbnN0YW5jZUlzRmluaXNoZWQodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VHZXRUcmFjZUJ1ZmZlcg0KICogDQogKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcmVjb3JkZXIgZGF0YSBzdHJ1Y3R1cmUuIFVzZSB0aGlzIHRvZ2V0aGVyIHdpdGggDQogKiB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplIGlmIHlvdSB3aXNoIHRvIGltcGxlbWVudCBhbiBvd24gc3RvcmUvdXBsb2FkIA0KICogc29sdXRpb24sIGUuZy4sIGluIGNhc2UgYSBkZWJ1Z2dlciBjb25uZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIHVwbG9hZGluZyANCiAqIHRoZSBkYXRhLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQqIHZUcmFjZUdldFRyYWNlQnVmZmVyKHZvaWQpOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdWlUcmFjZUdldFRyYWNlQnVmZmVyU2l6ZQ0KICogDQogKiBHZXRzIHRoZSBzaXplIG9mIHRoZSByZWNvcmRlciBkYXRhIHN0cnVjdHVyZS4gRm9yIHVzZSB0b2dldGhlciB3aXRoIA0KICogdlRyYWNlR2V0VHJhY2VCdWZmZXIgaWYgeW91IHdpc2ggdG8gaW1wbGVtZW50IGFuIG93biBzdG9yZS91cGxvYWQgc29sdXRpb24sIA0KICogZS5nLiwgaW4gY2FzZSBhIGRlYnVnZ2VyIGNvbm5lY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgdXBsb2FkaW5nIHRoZSBkYXRhLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnVpbnQzMl90IHVpVHJhY2VHZXRUcmFjZUJ1ZmZlclNpemUodm9pZCk7DQoNCiNpZiAoSU5DTFVERV9VU0VSX0VWRU5UUyA9PSAxKQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogeFRyYWNlT3BlbkxhYmVsDQogKiANCiAqIENyZWF0ZXMgdXNlciBldmVudCBsYWJlbHMgZm9yIHVzZXIgZXZlbnQgY2hhbm5lbHMgb3IgZm9yIGluZGl2aWR1YWwgZXZlbnRzLg0KICogVXNlciBldmVudHMgY2FuIGJlIHVzZWQgdG8gbG9nIGFwcGxpY2F0aW9uIGV2ZW50cyBhbmQgZGF0YSBmb3IgZGlzcGxheSBpbg0KICogdGhlIHZpc3VhbGl6YXRpb24gdG9vbC4gQSB1c2VyIGV2ZW50IGlzIGlkZW50aWZpZWQgYnkgYSBsYWJlbCwgaS5lLiwgYSBzdHJpbmcsDQogKiB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIHJlY29yZGVyJ3Mgc3ltYm9sIHRhYmxlLg0KICogV2hlbiBsb2dnaW5nIGEgdXNlciBldmVudCwgYSBudW1lcmljIGhhbmRsZSAocmVmZXJlbmNlKSB0byB0aGlzIHN0cmluZyBpcw0KICogdXNlZCB0byBpZGVudGlmeSB0aGUgZXZlbnQuIFRoaXMgaXMgb2J0YWluZWQgYnkgY2FsbGluZyANCiAqIA0KICogICAgIHhUcmFjZU9wZW5MYWJlbCgpDQogKg0KICogd2hpaGMgYWRkcyB0aGUgc3RyaW5nIHRvIHRoZSBzeW1ib2wgdGFibGUgKGlmIG5vdCBhbHJlYWR5IHByZXNlbnQpDQogKiBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGUuDQogKg0KICogVGhpcyBjYW4gYmUgdXNlZCBpbiB0d28gd2F5czoNCiAqDQogKiAxLiBUaGUgaGFuZGxlIGlzIGxvb2tlZCB1cCBldmVyeSB0aW1lLCB3aGVuIHN0b3JpbmcgdGhlIHVzZXIgZXZlbnQuDQogKg0KICogRXhhbXBsZToNCiAqICAgICB2VHJhY2VVc2VyRXZlbnQoeFRyYWNlT3BlbkxhYmVsKCJNeVVzZXJFdmVudCIpKTsNCiAqDQogKiAyLiBUaGUgbGFiZWwgaXMgcmVnaXN0ZXJlZCBqdXN0IG9uY2UsIHdpdGggdGhlIGhhbmRsZSBzdG9yZWQgaW4gYW4NCiAqICBhcHBsaWNhdGlvbiB2YXJpYWJsZSAtIG11Y2ggbGlrZSB1c2luZyBhIGZpbGUgaGFuZGxlLg0KICoNCiAqIEV4YW1wbGU6DQogKiAgICAgbXlFdmVudEhhbmRsZSA9IHhUcmFjZU9wZW5MYWJlbCgiTXlVc2VyRXZlbnQiKTsNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VVc2VyRXZlbnQobXlFdmVudEhhbmRsZSk7DQogKg0KICogVGhlIHNlY29uZCBvcHRpb24gaXMgZmFzdGVyIHNpbmNlIG5vIGxvb2t1cCBpcyByZXF1aXJlZCBvbiBlYWNoIGV2ZW50LCBhbmQgDQogKiB0aGVyZWZvcmUgcmVjb21tZW5kZWQgZm9yIHVzZXIgZXZlbnRzIHRoYXQgYXJlIGZyZXF1ZW50bHkNCiAqIGV4ZWN1dGVkIGFuZC9vciBsb2NhdGVkIGluIHRpbWUtY3JpdGljYWwgY29kZS4gVGhlIGxvb2t1cCBvcGVyYXRpb24gaXMNCiAqIGhvd2V2ZXIgZmFpcmx5IGZhc3QgZHVlIHRvIHRoZSBkZXNpZ24gb2YgdGhlIHN5bWJvbCB0YWJsZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp0cmFjZUxhYmVsIHhUcmFjZU9wZW5MYWJlbChjb25zdCBjaGFyKiBsYWJlbCk7DQoNCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VVc2VyRXZlbnQNCiAqDQogKiBCYXNpYyB1c2VyIGV2ZW50IChTdGFuZGFyZCBhbmQgUHJvZmVzc2lvbmFsIEVkaXRpb24gb25seSkNCiAqIA0KICogR2VuZXJhdGVzIGEgVXNlciBFdmVudCB3aXRoIGEgdGV4dCBsYWJlbC4gVGhlIGxhYmVsIGlzIGNyZWF0ZWQvbG9va2VkIHVwDQogKiBpbiB0aGUgc3ltYm9sIHRhYmxlIHVzaW5nIHhUcmFjZU9wZW5MYWJlbC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVVzZXJFdmVudCh0cmFjZUxhYmVsIGV2ZW50TGFiZWwpOw0KDQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlUHJpbnRGIA0KICogDQogKiBBZHZhbmNlZCB1c2VyIGV2ZW50cyAoUHJvZmVzc2lvbmFsIEVkaXRpb24gb25seSkNCiAqDQogKiBHZW5lcmF0ZXMgVXNlciBFdmVudCB3aXRoIGZvcm1hdHRlZCB0ZXh0IGFuZCBkYXRhLCBzaW1pbGFyIHRvIGEgInByaW50ZiIuDQogKiBJdCBpcyB2ZXJ5IGZhc3QgY29tcGFyZWQgdG8gYSBub3JtYWwgInByaW50ZiIgc2luY2UgdGhpcyBmdW5jdGlvbiBvbmx5IA0KICogc3RvcmVzIHRoZSBhcmd1bWVudHMuIFRoZSBhY3R1YWwgZm9ybWF0dGluZyBpcyBkb25lDQogKiBvbiB0aGUgaG9zdCBQQyB3aGVuIHRoZSB0cmFjZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIHZpZXdlciB0b29sLiANCiAqDQogKiBVc2VyIEV2ZW50IGxhYmVscyBhcmUgY3JlYXRlZCB1c2luZyB4VHJhY2VPcGVuTGFiZWwuDQogKiBFeGFtcGxlOg0KICoNCiAqICAgICB0cmFjZUxhYmVsIGFkY191ZWNoYW5uZWwgPSB4VHJhY2VPcGVuTGFiZWwoIkFEQyBVc2VyIEV2ZW50cyIpOw0KICogICAgIC4uLg0KICogICAgIHZUcmFjZVByaW50KGFkY191ZWNoYW5uZWwsIA0KICogICAgICAgICAgICAgICAgICJBREMgY2hhbm5lbCAlZDogJWxmIHZvbHRzIiwgDQogKiAgICAgICAgICAgICAgICAgY2gsIChkb3VibGUpYWRjX3JlYWRpbmcvKGRvdWJsZSlzY2FsZSk7DQogKg0KICogVGhpcyBjYW4gYmUgY29tYmluZWQgaW50byBvbmUgbGluZSwgaWYgZGVzaXJlZCwgYnV0IHRoaXMgaXMgc2xvd2VyOg0KICoNCiAqICAgICB2VHJhY2VQcmludCh4VHJhY2VPcGVuTGFiZWwoIkFEQyBVc2VyIEV2ZW50cyIpLCANCiAqICAgICAgICAgICAgICAgICAiQURDIGNoYW5uZWwgJWQ6ICVsZiB2b2x0cyIsIA0KICogICAgICAgICAgICAgICAgIGNoLCAoZG91YmxlKWFkY19yZWFkaW5nLyhkb3VibGUpc2NhbGUpOw0KICoNCiAqIENhbGxpbmcgeFRyYWNlT3BlbkxhYmVsIG11bHRpcGxlIHRpbWVzIHdpbGwgbm90IGNyZWF0ZSBkdXBsaWNhdGUgZW50cmllcywgYnV0DQogKiBpdCBpcyBvZiBjb3Vyc2UgZmFzdGVyIHRvIGp1c3QgZG8gaXQgb25jZSwgYW5kIHRoZW4ga2VlcCB0aGUgaGFuZGxlIGZvciBsYXRlciANCiAqIHVzZS4gSWYgeW91IGRvbrR0IGhhdmUgYW55IGRhdGEgYXJndW1lbnRzLCBvbmx5IGEgdGV4dCBsYWJlbC9zdHJpbmcsIGl0IGlzIA0KICogYmV0dGVyIHRvIHVzZSB2VHJhY2VVc2VyRXZlbnQgLSBpdCBpcyBmYXN0ZXIuDQogKg0KICogRm9ybWF0IHNwZWNpZmllcnMgc3VwcG9ydGVkOg0KICogICVkIC0gMzIgYml0IHNpZ25lZCBpbnRlZ2VyDQogKiAgJXUgLSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlcg0KICogICVmIC0gMzIgYml0IGZsb2F0DQogKiAgJXMgLSBzdHJpbmcgKGlzIGNvcGllZCB0byB0aGUgcmVjb3JkZXIgc3ltYm9sIHRhYmxlKQ0KICogICVoZCAtIDE2IGJpdCBzaWduZWQgaW50ZWdlcg0KICogICVodSAtIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyDQogKiAgJWJkIC0gOCBiaXQgc2lnbmVkIGludGVnZXINCiAqICAlYnUgLSA4IGJpdCB1bnNpZ25lZCBpbnRlZ2VyDQogKiAgJWxmIC0gZG91YmxlLXByZWNpc2lvbiBmbG9hdCAoTm90ZSEgU2VlIGJlbG93Li4uKQ0KICogDQogKiBVcCB0byAxNSBkYXRhIGFyZ3VtZW50cyBhcmUgYWxsb3dlZCwgd2l0aCBhIHRvdGFsIHNpemUgb2YgbWF4aW11bSAzMiBieXRlLg0KICogSW4gY2FzZSB0aGlzIGlzIGV4Y2VlZGVkLCB0aGUgdXNlciBldmVudCBpcyBjaGFuZ2VkIGludG8gYW4gZXJyb3IgbWVzc2FnZS4NCiAqIA0KICogVGhlIGRhdGEgaXMgc3RvcmVkIGluIHRyYWNlIGJ1ZmZlciwgYW5kIGlzIHBhY2tlZCB0byBhbGxvdyBzdG9yaW5nIG11bHRpcGxlIA0KICogc21hbGxlciBkYXRhIGVudHJpZXMgaW4gdGhlIHNhbWUgNC1ieXRlIHJlY29yZCwgZS5nLiwgZm91ciA4LWJpdCB2YWx1ZXMuDQogKiBBIHN0cmluZyByZXF1aXJlcyB0d28gYnl0ZXMsIGFzIHRoZSBzeW1ib2wgdGFibGUgaXMgbGltaXRlZCB0byA2NEsuIFN0b3JpbmcgDQogKiBhIGRvdWJsZSAoJWxmKSB1c2VzIHR3byByZWNvcmRzLCBzbyB0aGlzIGlzIHF1aXRlIGNvc3RseS4gVXNlIGZsb2F0ICglZikgDQogKiB1bmxlc3MgdGhlIGhpZ2hlciBwcmVjaXNpb24gaXMgcmVhbGx5IG5lY2Vzc2FyeS4NCiAqIA0KICogTm90ZSB0aGF0IHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0ICglbGYpIGFzc3VtZXMgYSA2NCBiaXQgZG91YmxlIA0KICogcmVwcmVzZW50YXRpb24uIFRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSB0aGUgY2FzZSBvbiBlLmcuIFBJQzI0Ri4gDQogKiBCZWZvcmUgdXNpbmcgYSAlbGYgYXJndW1lbnQgb24gYSAxNi1iaXQgTUNVLCBwbGVhc2UgdmVyaWZ5IHRoYXQgDQogKiAic2l6ZW9mKGRvdWJsZSkiIGFjdHVhbGx5IGdpdmVzIDggYXMgZXhwZWN0ZWQuIElmIG5vdCwgdXNlICVmIGluc3RlYWQuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyANCnZvaWQgdlRyYWNlUHJpbnRGKHRyYWNlTGFiZWwgZXZlbnRMYWJlbCwgY29uc3QgY2hhciogZm9ybWF0U3RyLCAuLi4pOw0KDQojZWxzZQ0KDQojZGVmaW5lIHZUcmFjZVByaW50RihldmVudExhYmVsLCBmb3JtYXRTdHIsIC4uLik7DQojZGVmaW5lIHhUcmFjZU9wZW5MYWJlbChsYWJlbCkgMA0KI2RlZmluZSB2VHJhY2VVc2VyRXZlbnQoZXZlbnRMYWJlbCkgDQoNCiNlbmRpZg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VFeGNsdWRlX19fX19fRnJvbVRyYWNlDQogKg0KICogRXhjbHVkZXMgYSB0YXNrIG9yIG9iamVjdCBmcm9tIHRoZSB0cmFjZS4NCiAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBzb21lIGlycmVsZXZhbnQgdGFzayBpcyB2ZXJ5IGZyZXF1ZW50IGFuZCBpcyAiZWF0aW5nDQogKiB1cCB0aGUgYnVmZmVyIi4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSB0YXNrIGhhcyBiZWVuIGNyZWF0ZWQsIGJ1dCANCiAqIGJlZm9yZSBzdGFydGluZyB0aGUgRnJlZVJUT1Mgc2NoZWR1bGVyLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VFeGNsdWRlUXVldWVGcm9tVHJhY2Uodm9pZCogaGFuZGxlKTsNCnZvaWQgdlRyYWNlRXhjbHVkZVNlbWFwaG9yZUZyb21UcmFjZSh2b2lkKiBoYW5kbGUpOw0Kdm9pZCB2VHJhY2VFeGNsdWRlTXV0ZXhGcm9tVHJhY2Uodm9pZCogaGFuZGxlKTsNCnZvaWQgdlRyYWNlRXhjbHVkZVRhc2tGcm9tVHJhY2Uodm9pZCogaGFuZGxlKTsNCnZvaWQgdlRyYWNlRXhjbHVkZUtlcm5lbFNlcnZpY2VGcm9tVHJhY2UodHJhY2VLZXJuZWxTZXJ2aWNlIGtlcm5lbFNlcnZpY2UpOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VJbmNsdWRlX19fX19fSW5UcmFjZQ0KICoNCiAqIEluY2x1ZGVzIGEgdGFzaywgb2JqZWN0IG9yIGtlcm5lbCBzZXJ2aWNlIGluIHRoZSB0cmFjZS4gVGhpcyBpcyBvbmx5DQogKiBuZWNlc3NhcnkgaWYgdGhlIHRhc2sgb3Igb2JqZWN0IGhhcyBiZWVuIHByZXZpb3VzbHkgZXhsdWRlZC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlSW5jbHVkZVF1ZXVlSW5UcmFjZSh2b2lkKiBoYW5kbGUpOw0Kdm9pZCB2VHJhY2VJbmNsdWRlU2VtYXBob3JlSW5UcmFjZSh2b2lkKiBoYW5kbGUpOw0Kdm9pZCB2VHJhY2VJbmNsdWRlTXV0ZXhJblRyYWNlKHZvaWQqIGhhbmRsZSk7DQp2b2lkIHZUcmFjZUluY2x1ZGVUYXNrSW5UcmFjZSh2b2lkKiBoYW5kbGUpOw0Kdm9pZCB2VHJhY2VJbmNsdWRlS2VybmVsU2VydmljZUluVHJhY2UodHJhY2VLZXJuZWxTZXJ2aWNlIGtlcm5lbFNlcnZpY2UpOw0KDQojaWZkZWYgX19jcGx1c3BsdXMNCn0NCiNlbmRpZg0KDQojZWxzZQ0KDQojaW5jbHVkZSAidHJjUG9ydC5oIg0KDQojZGVmaW5lIHZUcmFjZUluaXQoKQ0KI2RlZmluZSB1aVRyYWNlU3RhcnQoKSAoMSkNCiNkZWZpbmUgdlRyYWNlU3RhcnQoKQ0KI2RlZmluZSB2VHJhY2VTdG9wKCkNCiNkZWZpbmUgdlRyYWNlQ2xlYXIoKQ0KI2RlZmluZSB2VHJhY2VTdGFydFN0YXR1c01vbml0b3IoKQ0KI2RlZmluZSB2VHJhY2VQb3J0U2V0T3V0RmlsZShmKQ0KI2RlZmluZSB2VHJhY2VHZXRUcmFjZUJ1ZmZlcigpICgodm9pZCopMCkNCiNkZWZpbmUgdWlUcmFjZUdldFRyYWNlQnVmZmVyU2l6ZSgpIDANCiNkZWZpbmUgeFRyYWNlT3BlbkxhYmVsKGxhYmVsKSAwDQojZGVmaW5lIHZUcmFjZVVzZXJFdmVudChldmVudExhYmVsKQ0KI2RlZmluZSB2VHJhY2VQcmludEYoZXZlbnRMYWJlbCxmb3JtYXRTdHIsLi4uKQ0KI2RlZmluZSB2VHJhY2VFeGNsdWRlVGFza0Zyb21TY2hlZHVsaW5nVHJhY2UobmFtZSkNCiNkZWZpbmUgdlRyYWNlU2V0UXVldWVOYW1lKHF1ZXVlLCBuYW1lKQ0KDQojZGVmaW5lIHZUcmFjZVRhc2tTa2lwRGVmYXVsdEluc3RhbmNlRmluaXNoZWRFdmVudHMoKQ0KI2RlZmluZSB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKGhhbmRsZSwgbmFtZSwgcHJpb3JpdHkpDQojZGVmaW5lIHZUcmFjZVN0b3JlSVNSQmVnaW4oaWQpDQojZGVmaW5lIHZUcmFjZVN0b3JlSVNSRW5kKCkNCiNlbmRpZg0KI2VuZGlmDQoNCg==