LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk2LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRmlsZSBtZXJnZWNvbC5oCi8vCi8vIAovLwovLyBDcmVhdGVkIGJ5OiBIZWxlbmEgU2hpaAovLwovLyBNb2RpZmljYXRpb24gSGlzdG9yeToKLy8KLy8gIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCi8vICAzLzUvOTcgICAgICBtYXJrICAgICAgICBDbGVhbmVkIHVwIGZpeEVudHJ5KCkuICBBZGRlZCBjb25zdGFudHMgQllURVBPV0VSCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQllURU1BU0sgdG8gcmVwbGFjZSBCWVRFU0laRS4KLy8gIDYvMTcvOTcgICAgIGhlbGVuYSAgICAgIEluIGdldFBhdHRlcm4sIGFkZGVkIHRoZSBxdWV1ZS11cCBsaXN0IGZvciBlbnRyaWVzIAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBleHRlbnNpb24gY2hhcnMuCi8vICA4LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpbnRlcm5hbCBBUEkgZG9jdW1lbnRhdGlvbi4KLy8gIDgvMTMvOTggICAgIGVybSAgICAgICAgIFN5bmNoZWQgdXAgd2l0aCAxLjIgdmVyc2lvbiBvZiBNZXJnZUNvbGxhdGlvbi5qYXZhCi8vIDA0LzIzLzk5ICAgICBzdGVwaGVuICAgICBSZW1vdmVkIEVEZWNvbXBvc2l0aW9uTW9kZSwgbWVyZ2VkIHdpdGgKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZXI6OkVNb2RlCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgTUVSR0VDT0xfSAojZGVmaW5lIE1FUkdFQ09MX0gKCiNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgojaW5jbHVkZSAicHRuZW50cnkuaCIKI2luY2x1ZGUgInRhYmxlcy5oIgojaW5jbHVkZSAidW5pY29kZS9jb2xsLmgiCiNpbmNsdWRlICJ1bmljb2RlL25vcm1senIuaCIKCgovKioKICogVXRpbGl0eSBjbGFzcyBmb3Igbm9ybWFsaXppbmcgYW5kIG1lcmdpbmcgcGF0dGVybnMgZm9yIGNvbGxhdGlvbi4KICogUGF0dGVybnMgYXJlIHN0cmluZ3Mgb2YgdGhlIGZvcm0gPGVudHJ5PiosIHdoZXJlIDxlbnRyeT4gaGFzIHRoZQogKiBmb3JtOgogKiA8cHJlPgogKiA8cGF0dGVybj4gOj0gPGVudHJ5PioKICogPGVudHJ5PiA6PSA8c2VwYXJhdG9yPjxjaGFycz57Ii8iPGV4dGVuc2lvbj59CiAqIDxzZXBhcmF0b3I+IDo9ICI9IiwgIiwiLCAiOyIsICI8IiwgIiYiCiAqIDxjaGFycz4sIGFuZCA8ZXh0ZW5zaW9uPiBhcmUgYm90aCBhcmJpdHJhcnkgc3RyaW5ncy4KICogPC9wcmU+CiAqIDxQPlVucXVvdGVkIHdoaXRlc3BhY2VzIGFyZSBpZ25vcmVkLgogKiAneHh4JyBjYW4gYmUgdXNlZCB0byBxdW90ZSBjaGFyYWN0ZXJzLgogKiA8UD4KICogT25lIGRpZmZlcmVuY2UgZnJvbSBDb2xsYXRpb24gaXMgdGhhdCAmIGlzIHVzZWQgdG8gcmVzZXQgdG8gYSBjdXJyZW50CiAqIHBvaW50LiBPciwgaW4gb3RoZXIgd29yZHMsIGl0IGludHJvZHVjZXMgYSBuZXcgc2VxdWVuY2Ugd2hpY2ggaXMgdG8KICogYmUgYWRkZWQgdG8gdGhlIG9sZC4KICogPFA+CiAqIFRoYXQgaXM6ICJhIDwgYiA8IGMgPCBkIiBpcyB0aGUgc2FtZSBhcyAiYSA8IGIgJiBiIDwgYyAmIGMgPCBkIiBPUgogKiAiYSA8IGIgPCBkICYgYiA8IGMiCiAqIFhYWDogbWFrZSAnJyBiZSBhIHNpbmdsZSBxdW90ZS4KICogQHNlZSAgICAgICAgUGF0dGVybkVudHJ5CiAqIEB2ZXJzaW9uICAgIDEuNCAxLzcvOTcKICogQGF1dGhvciAgICAgTWFyayBEYXZpcywgSGVsZW5hIFNoaWgKICovCgpjbGFzcyBNZXJnZUNvbGxhdGlvbiAKewpwdWJsaWM6CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbWVyZ2VkIGNvbGxhdGlvbiB0YWJsZSBmcm9tIGEgcGF0dGVybiBzdHJpbmcuCiAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiBzdHJpbmcuCiAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4gIElmIHRoZSBpbnB1dCBwYXR0ZXJuIGlzIGluY29ycmVjdCwKICAgICAqIHRoaXMgd2lsbCBiZSBzZXQgdG8gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUi4KICAgICAqLwogIE1lcmdlQ29sbGF0aW9uKCBjb25zdCAgIFVuaWNvZGVTdHJpbmcmICBwYXR0ZXJuLAogICAgICAgICAgTm9ybWFsaXplcjo6RU1vZGUgZGVjb21wTW9kZSwKICAgICAgICAgIFVFcnJvckNvZGUmICAgICAgc3VjY2Vzcyk7CiAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICovCiAgTWVyZ2VDb2xsYXRpb24oIGNvbnN0ICAgTWVyZ2VDb2xsYXRpb24mIG90aGVyKTsKCiAgLyoqCiAgICAgKiBEZXN0cnVjdG9yLgogICAgICovCiAgfk1lcmdlQ29sbGF0aW9uKCk7CgogIC8qKiBBc3NpZ25tZW50IG9wZXJhdG9yCiAgICAgKi8KICBjb25zdCAgIE1lcmdlQ29sbGF0aW9uJiAgICAgb3BlcmF0b3I9KGNvbnN0IE1lcmdlQ29sbGF0aW9uJiBvdGhlcik7CiAgLyoqCiAgICAgKiBSZWNvdmVycyBjdXJyZW50IHBhdHRlcm4gZnJvbSB0aGlzIG1lcmdlZCBjb2xsYXRpb24gb2JqZWN0LgogICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHJlc3VsdCBidWZmZXIuCiAgICAgKiBAcmV0dXJuIHRoZSByZWNvdmVyZWQgcmVzdWx0LgogICAgICovCiAgVW5pY29kZVN0cmluZyYgZ2V0UGF0dGVybihVbmljb2RlU3RyaW5nJiBwYXR0ZXJuKSBjb25zdDsKCiAgLyoqCiAgICAgKiBSZWNvdmVycyBjdXJyZW50IHBhdHRlcm4gd2l0aCB3aGl0ZSBzcGFjZXMuCiAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcmVzdWx0IGJ1ZmZlci4KICAgICAqIEBwYXJhbSB3aXRoV2hpdGVTcGFjZSBwdXRzIHNwYWNpbmcgYXJvdW5kIHRoZSBlbnRyaWVzLCBhbmQgXG4KICAgICAqIGJlZm9yZSAmIGFuZCA8CiAgICAgKiBAcmV0dXJuIHRoZSByZWNvdmVyZWQgcmVzdWx0LgogICAgICovCiAgVW5pY29kZVN0cmluZyYgZ2V0UGF0dGVybihVbmljb2RlU3RyaW5nJiBwYXR0ZXJuLCBib29sX3Qgd2l0aFdoaXRlU3BhY2UpIGNvbnN0OwoKICAvKioKICAgICAqIEVtaXRzIHRoZSBwYXR0ZXJuIGZvciBjb2xsYXRpb24gYnVpbGRlci4KICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSByZXN1bHQgYnVmZmVyLgogICAgICogQHJldHVybiBFbWl0cyB0aGUgc3RyaW5nIGluIHRoZSBmb3JtYXQgdW5kZXJzdGFibGUgdG8gdGhlIGNvbGxhdGlvbgogICAgICogYnVpbGRlci4KICAgICAqLwogIFVuaWNvZGVTdHJpbmcmIGVtaXRQYXR0ZXJuKFVuaWNvZGVTdHJpbmcmIHBhdHRlcm4pIGNvbnN0OwoKICAvKioKICAgICAqIEVtaXRzIHRoZSBwYXR0ZXJuIGZvciBjb2xsYXRpb24gYnVpbGRlci4KICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSByZXN1bHQgYnVmZmVyLgogICAgICogQHBhcmFtIHdpdGhXaGl0ZVNwYWNlIHB1dHMgc3BhY2luZyBhcm91bmQgdGhlIGVudHJpZXMsIGFuZCBcbgogICAgICogYmVmb3JlICYgYW5kIDwKICAgICAqIEByZXR1cm4gRW1pdHMgdGhlIHN0cmluZyBpbiB0aGUgZm9ybWF0IHVuZGVyc3RhYmxlIHRvIHRoZSBjb2xsYXRpb24KICAgICAqIGJ1aWxkZXIuCiAgICAgKi8KICBVbmljb2RlU3RyaW5nJiBlbWl0UGF0dGVybihVbmljb2RlU3RyaW5nJiBwYXR0ZXJuLCBib29sX3Qgd2l0aFdoaXRlU3BhY2UpIGNvbnN0OwoKICAvKioKICAgICAqIFNldHMgdGhlIHBhdHRlcm4uCiAgICAgKiBAcGFyYW0gcGF0dGVybiBzdHJpbmcuCiAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cywgaXQgd2lsbCBiZSBzZXQgdG8gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUgogICAgICogaWYgdGhlIHBhdHRlcm4gaXMgaW5jb3JyZWN0LgogICAgICovCiAgdm9pZCBzZXRQYXR0ZXJuKGNvbnN0ICAgVW5pY29kZVN0cmluZyYgIHBhdHRlcm4sCiAgICAgICAgICBOb3JtYWxpemVyOjpFTW9kZSBkZWNvbXBNb2RlLAogICAgICAgICAgVUVycm9yQ29kZSYgICAgICBzdGF0dXMpOwoKICAvKioKICAgICAqIEFkZHMgYSBwYXR0ZXJuIHRvIHRoZSBjdXJyZW50IG1lcmdlIGNvbGxhdGlvbiBvYmplY3QuCiAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgbmV3IHBhdHRlcm4gdG8gYmUgYWRkZWQuCiAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cywgaXQgd2lsbCBiZSBzZXQgdG8gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUgogICAgICogaWYgdGhlIHBhdHRlcm4gaXMgaW5jb3JyZWN0LgogICAgICovCiAgdm9pZCBhZGRQYXR0ZXJuKGNvbnN0ICAgVW5pY29kZVN0cmluZyYgIHBhdHRlcm4sCiAgICAgICAgICBOb3JtYWxpemVyOjpFTW9kZSBkZWNvbXBNb2RlLAogICAgICAgICAgVUVycm9yQ29kZSYgICAgICBzdGF0dXMpOwoKICAvKioKICAgICAqIEdldHMgY291bnQgb2Ygc2VwYXJhdGUgZW50cmllcyBpbiB0aGUgbWVyZ2UgY29sbGF0aW9uIG9iamVjdC4KICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXR0ZXJuIGVudHJpZXMKICAgICAqLwogIGludDMyX3QgZ2V0Q291bnQodm9pZCkgY29uc3Q7CgogIC8qKgogICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gZW50cnkgb3V0IG9mIHRoZSBtZXJnZSBjb2xsYXRpb24gb2JqZWN0LgogICAgICogQHBhcmFtIGluZGV4IHRoZSBvZmZzZXQgb2YgdGhlIGRlc2lyZWQgcGF0dGVybiBlbnRyeQogICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHBhdHRlcm4gZW50cnkKICAgICAqLwogIGNvbnN0IFBhdHRlcm5FbnRyeSogZ2V0SXRlbUF0KFVUZXh0T2Zmc2V0IGluZGV4KSBjb25zdDsKCnByaXZhdGU6CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIHByaXZhdGVzCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnkqIHBhdHRlcm5zOyAvLyBhIHZlY3RvciBvZiBQYXR0ZXJuRW50cmllcwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgQklUQVJSQVlTSVpFOwogIHN0YXRpYyAgY29uc3QgICB1aW50OF90ICAgICAgICAgQklUQVJSQVlNQVNLOwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgQllURVBPV0VSOwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgQllURU1BU0s7CgogIFBhdHRlcm5FbnRyeSogICBsYXN0RW50cnk7CiAgUGF0dGVybkVudHJ5KiAgIHNhdmVFbnRyeTsKICB1aW50OF90KiAgICAgICAgc3RhdHVzQXJyYXk7CgoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGxhc3QgcGF0dGVybiBlbnRyeSBiZWZvcmUgdGhlIHNwZWNpZmllZCBvZmZzZXQgdGhhdCBkb2VzIG5vdCBoYXZlIAogICAgICogZXh0ZW5zaW9uIGNoYXJzLgogICAgICogQHBhcmFtIGkgdGhlIG9mZnNldC4KICAgICAqIEByZXR1cm4gdGhlIHBhdHRlcm4gZW50cnkuCiAgICAgKi8KICBjb25zdCBQYXR0ZXJuRW50cnkqIGZpbmRMYXN0V2l0aE5vRXh0ZW5zaW9uKGludDMyX3QgaSkgY29uc3Q7CgogIC8qKiAKICAgICAqIEZpeGVzIHRoZSBuZXcgcGF0dGVybiBlbnRyeSBpbiB0aGUgbWVyZ2UgY29sbGF0aW9uIHRhYmxlLgogICAgICogSWYgdGhlIHN0cmVuZ3RoIGlzIFJFU0VULCB0aGVuIGp1c3QgY2hhbmdlIHRoZSBsYXN0RW50cnkgdG8KICAgICAqIGJlIHRoZSBjdXJyZW50LiAoSWYgdGhlIGN1cnJlbnQgaXMgbm90IGluIHBhdHRlcm5zLCBzaWduYWwgYW4gZXJyb3IpLgogICAgICogSWYgbm90LCB0aGVuIHJlbW92ZSB0aGUgY3VycmVudCBlbnRyeSwgYW5kIGFkZCBpdCBhZnRlciBsYXN0RW50cnkKICAgICAqICh3aGljaCBpcyB1c3VhbGx5IGF0IHRoZSBlbmQpLiAgU3RyZW5ndGggaW5kaWNhdGVzIHRoZSB0ZXh0IG9yZGVyCiAgICAgKiB3ZWlnaHQgZm9yIGFuIGVudHJ5LgogICAgICogQHBhcmFtIG5ld0VudHJ5IHRoZSBuZXcgcGF0dGVybiBlbnRyeQogICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMsIGl0IHdpbGwgYmUgc2V0IHRvIFVfSU5WQUxJRF9GT1JNQVRfRVJST1IKICAgICAqIGlmIHRoZSBzdHJlbmd0aCBpcyBSRVNFVCBhbmQgYSBwcmV2aW91cyBlbnRyeSBjYW4ndCBiZSBmb3VuZC4KICAgICAqLwogIHZvaWQgZml4RW50cnkoICBQYXR0ZXJuRW50cnkqICAgbmV3RW50cnksCiAgICAgICAgICBVRXJyb3JDb2RlJiAgICAgIHN0YXR1cyk7CgogIC8qKgogICAgICogRmluZHMgdGhlIG9mZnNldCBvZiB0aGUgc3BlY2lmaWVkIGVudHJ5IHRoYXQgd2FzIHByZXZpb3VzbHkgaW5zdGFsbGVkIGluIHRoZQogICAgICogbWVyZ2UgY29sbGF0aW9uIG9iamVjdC4KICAgICAqIEBwYXJhbSBsYXN0RW50cnkgdGhlIGVudHJ5IHRoYXQgd2FzIHByZXZpb3VzbHkgaW5zdGFsbGVkLgogICAgICogQHBhcmFtIGV4Y2VzcyB0aGUgZXh0cmEgY2hhcmFjdGVycyAKICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLCBpdCB3aWxsIGJlIHNldCB0byBVX0lOVkFMSURfRk9STUFUX0VSUk9SCiAgICAgKiBpZiB0aGUgc3RyZW5ndGggaXMgUkVTRVQgYW5kIGEgcHJldmlvdXMgZW50cnkgY2FuJ3QgYmUgZm91bmQuCiAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZvdW5kIGVudHJ5CiAgICAgKi8KICBpbnQzMl90IGZpbmRMYXN0RW50cnkoICBjb25zdCBQYXR0ZXJuRW50cnkqIGxhc3RFbnRyeSwgCiAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgIGV4Y2VzcywKICAgICAgICAgICAgICBVRXJyb3JDb2RlJiAgICAgIHN1Y2Nlc3MpIGNvbnN0Owp9OwoKaW5saW5lIFVuaWNvZGVTdHJpbmcmIE1lcmdlQ29sbGF0aW9uOjpnZXRQYXR0ZXJuKFVuaWNvZGVTdHJpbmcmIHJlc3VsdCkgY29uc3QKewogIHJldHVybiBnZXRQYXR0ZXJuKHJlc3VsdCwgVFJVRSk7Cn0KCmlubGluZSBVbmljb2RlU3RyaW5nJiBNZXJnZUNvbGxhdGlvbjo6ZW1pdFBhdHRlcm4oVW5pY29kZVN0cmluZyYgcmVzdWx0KSBjb25zdAp7CiAgcmV0dXJuIGVtaXRQYXR0ZXJuKHJlc3VsdCwgVFJVRSk7Cn0KCgojZW5kaWYgLy8gX01FUkdFQ09MCg==