LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk2LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENyZWF0ZWQgYnk6ICAgICBNYXJrIERhdmlzLCBIZWxlbmEgU2hpaAoqCiogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CiogRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKgoqICA4LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpbnRlcm5hbCBBUEkgZG9jdW1lbnRhdGlvbi4KKiAgOC8xNC85OCAgICAgZXJtICAgICAgICAgU3luY2hlZCB3aXRoIDEuMiB2ZXJzaW9uIG9mIFBhdHRlcm5FbnRyeS5qYXZhCiogMDQvMjMvOTkgICAgIHN0ZXBoZW4gICAgIFJlbW92ZWQgRURlY29tcG9zaXRpb25Nb2RlLCBtZXJnZWQgd2l0aAoqICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVyOjpFTW9kZQoqLwoKI2lmbmRlZiBQVE5FTlRSWV9ICiNkZWZpbmUgUFRORU5UUllfSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgojaW5jbHVkZSAidW5pY29kZS9jb2xsLmgiCiNpbmNsdWRlICJ1bmljb2RlL25vcm1senIuaCIKCi8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCmNsYXNzIE1lcmdlQ29sbGF0aW9uOwpjbGFzcyBQb2ludGVyVG9QYXR0ZXJuRW50cnk7CmNsYXNzIFZlY3Rvck9mUG9pbnRlcnNUb1BhdHRlcm5FbnRyeTsKCi8qKgogKgogKiBVdGlsaXR5IGNsYXNzIGZvciBub3JtYWxpemluZyBhbmQgbWVyZ2luZyBwYXR0ZXJucyBmb3IgY29sbGF0aW9uLgogKiBUaGlzIGlzIHRvIGJlIHVzZWQgd2l0aCBNZXJnZUNvbGxhdGlvbiBmb3IgYWRkaW5nIHBhdHRlcm5zIHRvIGFuCiAqIGV4aXN0aW5nIHJ1bGUgdGFibGUuCiAqLwpjbGFzcyBQYXR0ZXJuRW50cnkgCnsKCiAgZnJpZW5kIGNsYXNzIE1lcmdlQ29sbGF0aW9uOwogIGZyaWVuZCBjbGFzcyBQb2ludGVyVG9QYXR0ZXJuRW50cnk7CiAgZnJpZW5kIGNsYXNzIFZlY3Rvck9mUG9pbnRlcnNUb1BhdHRlcm5FbnRyeTsKCiBwdWJsaWM6CgogIC8qKgogICAgICogR2V0cyB0aGUgZXh0ZW5zaW9uLCBxdW90ZWQgaWYgbmVjZXNzYXJ5LCBvZiB0aGlzIHBhdHRlcm4gZW50cnkuCiAgICAgKiBAcGFyYW0gdG9BZGRUbyB0aGUgcmVzdWx0IHN0cmluZyBidWZmZXIuCiAgICAgKi8KICB2b2lkIGFwcGVuZFF1b3RlZEV4dGVuc2lvbihVbmljb2RlU3RyaW5nJiB0b0FkZFRvKSBjb25zdDsKCiAgLyoqCiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGNoYXJzLCBxdW90ZWQgaWYgbmVjZXNzYXJ5LCBvZiB0aGlzIHBhdHRlcm4gZW50cnkuCiAgICAgKi8KICB2b2lkIGFwcGVuZFF1b3RlZENoYXJzKFVuaWNvZGVTdHJpbmcmIHRvQWRkVG8pIGNvbnN0OwoKICAvKioKICAgICAqIENvbXBhcmVzIHR3byBwYXR0ZXJuIGVudHJ5IG9iamVjdHMuCiAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIHBhdHRlcm4gZW50cnkgb2JqZWN0LgogICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBwYXR0ZXJuIGVudHJ5IG9iamVjdHMgYXJlIHRoZSBzYW1lLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgKi8KICBib29sX3QgZXF1YWxzKGNvbnN0IFBhdHRlcm5FbnRyeSYgb3RoZXIpIGNvbnN0OwoKICAvKioKICAgICAqIEdldHMgdGhlIHN0cmVuZ3RoIG9mIHRoaXMgZW50cnkuCiAgICAgKiBAcmV0dXJuIHRoZSBzdHJlbmd0aCBvZiB0aGlzIHBhdHRlcm4gZW50cnkuCiAgICAgKi8KCiAgaW50MzJfdCBnZXRTdHJlbmd0aCh2b2lkKSAgIGNvbnN0OwoKICAvKioKICAgICAqIEdldHMgdGhlIGV4dGVuc2lvbiBjaGFyYWN0ZXJzLgogICAgICogQHBhcmFtIHRoZSBleHRlbnNpb24gc3RyaW5nIHJlZmVyZW5jZS4KICAgICAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbiBjaGFycyBvZiB0aGlzIHBhdHRlcm4gZW50cnkuCiAgICAgKi8KICBjb25zdCAgIFVuaWNvZGVTdHJpbmcmICBnZXRFeHRlbnNpb24oVW5pY29kZVN0cmluZyYgZXh0KSBjb25zdDsKCiAgLyoqCiAgICAgKiBHZXRzIHRoZSBjb3JlIGNoYXJhY3RlcnMuCiAgICAgKiBAcGFyYW0gdGhlIGNoYXIgc3RyaW5nIHJlZmVyZW5jZS4KICAgICAqIEByZXR1cm4gdGhlIGNoYXIgc3RyaW5nIG9mIHRoaXMgcGF0dGVybiBlbnRyeS4KICAgICAqLwogIGNvbnN0ICAgVW5pY29kZVN0cmluZyYgIGdldENoYXJzKFVuaWNvZGVTdHJpbmcmIGNoYXJzKSBjb25zdDsKCiAgLyoqCiAgICAgKiBVc2VkIHRvIHBhcnNlIGEgcGF0dGVybiBpbnRvIGEgbGlzdAogICAgICogb2YgUGF0dGVybkVudHJ5J3MuCiAgICAgKi8KCiAgY2xhc3MgUGFyc2VyCiAgICB7CiAgICBwdWJsaWM6CiAgICAgIFBhcnNlcihjb25zdCBVbmljb2RlU3RyaW5nICZwYXR0ZXJuLCBOb3JtYWxpemVyOjpFTW9kZSBkZWNvbXBNb2RlKTsKICAgICAgCiAgICAgIFBhcnNlcihjb25zdCBQYXJzZXIgJnRoYXQpOwogICAgICAKICAgICAgUGFyc2VyICZvcGVyYXRvcj0oY29uc3QgUGFyc2VyICZ0aGF0KTsKICAgICAgCiAgICAgIH5QYXJzZXIoKTsKICAgICAgCiAgICAgIFBhdHRlcm5FbnRyeSAqbmV4dChVRXJyb3JDb2RlICZzdGF0dXMpOwoKICAgIHByaXZhdGU6CiAgICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKICAgICAgaW50MzJfdCBpbmRleDsKICAgICAgTm9ybWFsaXplcjo6RU1vZGUgZkRlY29tcE1vZGU7CgogICAgICBVbmljb2RlU3RyaW5nIG5ld0NoYXJzOwogICAgICBVbmljb2RlU3RyaW5nIG5ld0V4dGVuc2lvbnM7CiAgICB9OwoKICBmcmllbmQgY2xhc3MgUGFyc2VyOwoKCiAgICAvKioKICAgICAqIEZvciBkZWJ1Z2dpbmcgb25seS4KICAgICAqLwogIFVuaWNvZGVTdHJpbmcmIHRvU3RyaW5nKFVuaWNvZGVTdHJpbmcmKSBjb25zdDsKCiBwcml2YXRlOgoKICAgIC8qKiBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcgogICAgICovCiAgUGF0dGVybkVudHJ5KCk7CgogIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBwYXR0ZXJuIGVudHJ5IG9iamVjdC4KICAgICAqLwogIFBhdHRlcm5FbnRyeShpbnQzMl90IHN0cmVuZ3RoLAogICAgICAgICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIGNoYXJzLAogICAgICAgICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIGV4dGVuc2lvbiwKICAgICAgICAgICBOb3JtYWxpemVyOjpFTW9kZSBkZWNvbXBNb2RlKTsKICAvKioKICAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAgKi8KICBQYXR0ZXJuRW50cnkoY29uc3QgIFBhdHRlcm5FbnRyeSYgb3RoZXIpOwogIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqLwogIH5QYXR0ZXJuRW50cnkoKTsKCiAgLyoqIGFzc2lnbm1lbnQgCiAgICAgKi8KICBjb25zdCAgIFBhdHRlcm5FbnRyeSYgICAgICAgb3BlcmF0b3I9KGNvbnN0IFBhdHRlcm5FbnRyeSYgICBvdGhlcik7CgogIC8qKgogICAgICogVHJhbnNmb3JtcyB0aGUgcGF0dGVybiBlbnRyeSBpbnRvIGRpc3BsYXlhYmxlIHRleHQgYW5kIGFkZHMKICAgICAqIHRoZSB0ZXh0IHRvIHRoZSBidWZmZXIsIHRvQWRkVG8uCiAgICAgKiBAcGFyYW0gdG9BZGRUbyB0aGUgcmVzdWx0IGJ1ZmZlci4KICAgICAqIEBwYXJhbSBzaG93RXh0ZW5zaW9uIHdoZXRoZXIgdG8gYWRkIHRoZSBleHRlbnNpb24gY2hhcnMgb3Igbm90LgogICAgICogQHBhcmFtIHNob3dXaGl0ZVNwYWNlIHdoZXRoZXIgdG8gYWRkIHRoZSB3aGl0ZSBzcGFjZXMgb3Igbm90LgogICAgICogQHBhcmFtIGxhc3RFbnRyeSB0aGUgbGFzdCBwYXR0ZXJuIGVudHJ5IHRoYXQgd2FzIHJlZmVyZW5jZWQuCiAgICAgKi8KICB2b2lkIGFkZFRvQnVmZmVyKFVuaWNvZGVTdHJpbmcmIHRvQWRkVG8sCiAgICAgICAgICAgYm9vbF90IHNob3dFeHRlbnNpb24sCiAgICAgICAgICAgYm9vbF90IHNob3dXaGl0ZVNwYWNlLAogICAgICAgICAgIGNvbnN0IFBhdHRlcm5FbnRyeSogbGFzdEVudHJ5KSBjb25zdDsKCiAgLyoqCiAgICAgKiBHZXRzIHRoZSBleHRlbnNpb24sIHF1b3RlZCBpZiBuZWNlc3NhcnksIG9mIHRoaXMgcGF0dGVybiBlbnRyeS4KICAgICAqIEBwYXJhbSBjaGFycyB0aGUgY2hhcnMgc3RyaW5nCiAgICAgKiBAcGFyYW0gdG9BZGRUbyB0aGUgcmVzdWx0IHN0cmluZyBidWZmZXIuCiAgICAgKi8KICBzdGF0aWMgdm9pZCBhcHBlbmRRdW90ZWQoY29uc3QgVW5pY29kZVN0cmluZyYgY2hhcnMsIFVuaWNvZGVTdHJpbmcmIHRvQWRkVG8pOwoKICAvKioKICAgICAqIENoZWNrcyBpZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgaXMgYSBzcGVjaWFsIGNoYXJhY3RlciwgZm9yIGV4YW1wbGUsICdAJwogICAgICogaXMgY29uc2lkZXJlZCBhIHNwZWNpYWwgY2hhcmFjdGVyLiAgVGhlIHZhbHVlcyBvZiBhIHNwZWNpYWwgY2hhcmFjdGVyIGlzCiAgICAgKiBvZiB0aGUgZm9sbG93aW5nIHJhbmdlLAogICAgICogPHByZT5wdW5jdHVhdGlvbiBzeW1ib2xzIDoKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgLSAweDAwMkYKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwM0EgLSAweDAwM0YgCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDVCIC0gMHgwMDYwCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdCIC0gMHgwMDdFCiAgICAgKiA8L3ByZT4KICAgICAqIEBwYXJhbSB0aGUgVW5pY29kZSBjaGFyYWN0ZXIKICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIEZBTFNFIG90aGVyd2lzZS4KICAgICAqLwogIHN0YXRpYyBib29sX3QgaXNTcGVjaWFsQ2hhcihVQ2hhciBjaCk7CgogIGludDMyX3Qgc3RyZW5ndGg7CiAgVW5pY29kZVN0cmluZyBjaGFyczsKICBVbmljb2RlU3RyaW5nIGV4dGVuc2lvbjsKCiAgc3RhdGljIGNvbnN0IGludDMyX3QgUkVTRVQ7CiAgc3RhdGljIGNvbnN0IGludDMyX3QgVU5TRVQ7Cn07CgoKI2VuZGlmIC8vIF9QVE5FTlRSWQo=