LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk2LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRmlsZSBtZXJnZWNvbC5oCi8vCi8vIAovLwovLyBDcmVhdGVkIGJ5OiBIZWxlbmEgU2hpaAovLwovLyBNb2RpZmljYXRpb24gSGlzdG9yeToKLy8KLy8gIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCi8vICAzLzUvOTcgICAgICBtYXJrICAgICAgICBDbGVhbmVkIHVwIGZpeEVudHJ5KCkuICBBZGRlZCBjb25zdGFudHMgQllURVBPV0VSCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQllURU1BU0sgdG8gcmVwbGFjZSBCWVRFU0laRS4KLy8gIDYvMTcvOTcgICAgIGhlbGVuYSAgICAgIEluIGdldFBhdHRlcm4sIGFkZGVkIHRoZSBxdWV1ZS11cCBsaXN0IGZvciBlbnRyaWVzIAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBleHRlbnNpb24gY2hhcnMuCi8vICA4LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpbnRlcm5hbCBBUEkgZG9jdW1lbnRhdGlvbi4KLy8gIDgvMTMvOTggICAgIGVybSAgICAgICAgIFN5bmNoZWQgdXAgd2l0aCAxLjIgdmVyc2lvbiBvZiBNZXJnZUNvbGxhdGlvbi5qYXZhCi8vIDA0LzIzLzk5ICAgICBzdGVwaGVuICAgICBSZW1vdmVkIEVEZWNvbXBvc2l0aW9uTW9kZSwgbWVyZ2VkIHdpdGgKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZXI6OkVNb2RlCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgTUVSR0VDT0xfSAojZGVmaW5lIE1FUkdFQ09MX0gKCiNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgojaW5jbHVkZSAicHRuZW50cnkuaCIKI2luY2x1ZGUgInRhYmxlcy5oIgojaW5jbHVkZSAidW5pY29kZS9jb2xsLmgiCiNpbmNsdWRlICJ1bmljb2RlL25vcm1senIuaCIKCgovKioKICogVXRpbGl0eSBjbGFzcyBmb3Igbm9ybWFsaXppbmcgYW5kIG1lcmdpbmcgcGF0dGVybnMgZm9yIGNvbGxhdGlvbi4KICogUGF0dGVybnMgYXJlIHN0cmluZ3Mgb2YgdGhlIGZvcm0gPGVudHJ5PiosIHdoZXJlIDxlbnRyeT4gaGFzIHRoZQogKiBmb3JtOgogKiA8cHJlPgogKiA8cGF0dGVybj4gOj0gPGVudHJ5PioKICogPGVudHJ5PiA6PSA8c2VwYXJhdG9yPjxjaGFycz57Ii8iPGV4dGVuc2lvbj59CiAqIDxzZXBhcmF0b3I+IDo9ICI9IiwgIiwiLCAiOyIsICI8IiwgIiYiCiAqIDxjaGFycz4sIGFuZCA8ZXh0ZW5zaW9uPiBhcmUgYm90aCBhcmJpdHJhcnkgc3RyaW5ncy4KICogPC9wcmU+CiAqIDxQPlVucXVvdGVkIHdoaXRlc3BhY2VzIGFyZSBpZ25vcmVkLgogKiAneHh4JyBjYW4gYmUgdXNlZCB0byBxdW90ZSBjaGFyYWN0ZXJzLgogKiA8UD4KICogT25lIGRpZmZlcmVuY2UgZnJvbSBDb2xsYXRpb24gaXMgdGhhdCAmIGlzIHVzZWQgdG8gcmVzZXQgdG8gYSBjdXJyZW50CiAqIHBvaW50LiBPciwgaW4gb3RoZXIgd29yZHMsIGl0IGludHJvZHVjZXMgYSBuZXcgc2VxdWVuY2Ugd2hpY2ggaXMgdG8KICogYmUgYWRkZWQgdG8gdGhlIG9sZC4KICogPFA+CiAqIFRoYXQgaXM6ICJhIDwgYiA8IGMgPCBkIiBpcyB0aGUgc2FtZSBhcyAiYSA8IGIgJiBiIDwgYyAmIGMgPCBkIiBPUgogKiAiYSA8IGIgPCBkICYgYiA8IGMiCiAqIFhYWDogbWFrZSAnJyBiZSBhIHNpbmdsZSBxdW90ZS4KICogQHNlZSAgICAgICAgUGF0dGVybkVudHJ5CiAqIEB2ZXJzaW9uICAgIDEuNCAxLzcvOTcKICogQGF1dGhvciAgICAgTWFyayBEYXZpcywgSGVsZW5hIFNoaWgKICovCgpjbGFzcyBNZXJnZUNvbGxhdGlvbiAKewpwdWJsaWM6CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbWVyZ2VkIGNvbGxhdGlvbiB0YWJsZSBmcm9tIGEgcGF0dGVybiBzdHJpbmcuCiAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiBzdHJpbmcuCiAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4gIElmIHRoZSBpbnB1dCBwYXR0ZXJuIGlzIGluY29ycmVjdCwKICAgICAqIHRoaXMgd2lsbCBiZSBzZXQgdG8gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUi4KICAgICAqLwogIE1lcmdlQ29sbGF0aW9uKCBjb25zdCAgIFVuaWNvZGVTdHJpbmcmICBwYXR0ZXJuLAogICAgICAgICAgTm9ybWFsaXplcjo6RU1vZGUgZGVjb21wTW9kZSwKICAgICAgICAgIFVFcnJvckNvZGUmICAgICAgc3VjY2Vzcyk7CiAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICovCiAgTWVyZ2VDb2xsYXRpb24oIGNvbnN0ICAgTWVyZ2VDb2xsYXRpb24mIG90aGVyKTsKCiAgLyoqCiAgICAgKiBEZXN0cnVjdG9yLgogICAgICovCiAgfk1lcmdlQ29sbGF0aW9uKCk7CgogIC8qKiBBc3NpZ25tZW50IG9wZXJhdG9yCiAgICAgKi8KICBjb25zdCAgIE1lcmdlQ29sbGF0aW9uJiAgICAgb3BlcmF0b3I9KGNvbnN0IE1lcmdlQ29sbGF0aW9uJiBvdGhlcik7CiAgLyoqCiAgICAgKiBSZWNvdmVycyBjdXJyZW50IHBhdHRlcm4gZnJvbSB0aGlzIG1lcmdlZCBjb2xsYXRpb24gb2JqZWN0LgogICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHJlc3VsdCBidWZmZXIuCiAgICAgKiBAcmV0dXJuIHRoZSByZWNvdmVyZWQgcmVzdWx0LgogICAgICovCiAgVW5pY29kZVN0cmluZyYgZ2V0UGF0dGVybihVbmljb2RlU3RyaW5nJiBwYXR0ZXJuKSBjb25zdDsKCiAgLyoqCiAgICAgKiBSZWNvdmVycyBjdXJyZW50IHBhdHRlcm4gd2l0aCB3aGl0ZSBzcGFjZXMuCiAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcmVzdWx0IGJ1ZmZlci4KICAgICAqIEBwYXJhbSB3aXRoV2hpdGVTcGFjZSBwdXRzIHNwYWNpbmcgYXJvdW5kIHRoZSBlbnRyaWVzLCBhbmQgXG4KICAgICAqIGJlZm9yZSAmIGFuZCA8CiAgICAgKiBAcmV0dXJuIHRoZSByZWNvdmVyZWQgcmVzdWx0LgogICAgICovCiAgVW5pY29kZVN0cmluZyYgZ2V0UGF0dGVybihVbmljb2RlU3RyaW5nJiBwYXR0ZXJuLCBVQm9vbCB3aXRoV2hpdGVTcGFjZSkgY29uc3Q7CgogIC8qKgogICAgICogRW1pdHMgdGhlIHBhdHRlcm4gZm9yIGNvbGxhdGlvbiBidWlsZGVyLgogICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHJlc3VsdCBidWZmZXIuCiAgICAgKiBAcmV0dXJuIEVtaXRzIHRoZSBzdHJpbmcgaW4gdGhlIGZvcm1hdCB1bmRlcnN0YWJsZSB0byB0aGUgY29sbGF0aW9uCiAgICAgKiBidWlsZGVyLgogICAgICovCiAgVW5pY29kZVN0cmluZyYgZW1pdFBhdHRlcm4oVW5pY29kZVN0cmluZyYgcGF0dGVybikgY29uc3Q7CgogIC8qKgogICAgICogRW1pdHMgdGhlIHBhdHRlcm4gZm9yIGNvbGxhdGlvbiBidWlsZGVyLgogICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHJlc3VsdCBidWZmZXIuCiAgICAgKiBAcGFyYW0gd2l0aFdoaXRlU3BhY2UgcHV0cyBzcGFjaW5nIGFyb3VuZCB0aGUgZW50cmllcywgYW5kIFxuCiAgICAgKiBiZWZvcmUgJiBhbmQgPAogICAgICogQHJldHVybiBFbWl0cyB0aGUgc3RyaW5nIGluIHRoZSBmb3JtYXQgdW5kZXJzdGFibGUgdG8gdGhlIGNvbGxhdGlvbgogICAgICogYnVpbGRlci4KICAgICAqLwogIFVuaWNvZGVTdHJpbmcmIGVtaXRQYXR0ZXJuKFVuaWNvZGVTdHJpbmcmIHBhdHRlcm4sIFVCb29sIHdpdGhXaGl0ZVNwYWNlKSBjb25zdDsKCiAgLyoqCiAgICAgKiBTZXRzIHRoZSBwYXR0ZXJuLgogICAgICogQHBhcmFtIHBhdHRlcm4gc3RyaW5nLgogICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMsIGl0IHdpbGwgYmUgc2V0IHRvIFVfSU5WQUxJRF9GT1JNQVRfRVJST1IKICAgICAqIGlmIHRoZSBwYXR0ZXJuIGlzIGluY29ycmVjdC4KICAgICAqLwogIHZvaWQgc2V0UGF0dGVybihjb25zdCAgIFVuaWNvZGVTdHJpbmcmICBwYXR0ZXJuLAogICAgICAgICAgTm9ybWFsaXplcjo6RU1vZGUgZGVjb21wTW9kZSwKICAgICAgICAgIFVFcnJvckNvZGUmICAgICAgc3RhdHVzKTsKCiAgLyoqCiAgICAgKiBBZGRzIGEgcGF0dGVybiB0byB0aGUgY3VycmVudCBtZXJnZSBjb2xsYXRpb24gb2JqZWN0LgogICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIG5ldyBwYXR0ZXJuIHRvIGJlIGFkZGVkLgogICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMsIGl0IHdpbGwgYmUgc2V0IHRvIFVfSU5WQUxJRF9GT1JNQVRfRVJST1IKICAgICAqIGlmIHRoZSBwYXR0ZXJuIGlzIGluY29ycmVjdC4KICAgICAqLwogIHZvaWQgYWRkUGF0dGVybihjb25zdCAgIFVuaWNvZGVTdHJpbmcmICBwYXR0ZXJuLAogICAgICAgICAgTm9ybWFsaXplcjo6RU1vZGUgZGVjb21wTW9kZSwKICAgICAgICAgIFVFcnJvckNvZGUmICAgICAgc3RhdHVzKTsKCiAgLyoqCiAgICAgKiBHZXRzIGNvdW50IG9mIHNlcGFyYXRlIGVudHJpZXMgaW4gdGhlIG1lcmdlIGNvbGxhdGlvbiBvYmplY3QuCiAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGF0dGVybiBlbnRyaWVzCiAgICAgKi8KICBpbnQzMl90IGdldENvdW50KHZvaWQpIGNvbnN0OwoKICAvKioKICAgICAqIEdldHMgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGVudHJ5IG91dCBvZiB0aGUgbWVyZ2UgY29sbGF0aW9uIG9iamVjdC4KICAgICAqIEBwYXJhbSBpbmRleCB0aGUgb2Zmc2V0IG9mIHRoZSBkZXNpcmVkIHBhdHRlcm4gZW50cnkKICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBwYXR0ZXJuIGVudHJ5CiAgICAgKi8KICBjb25zdCBQYXR0ZXJuRW50cnkqIGdldEl0ZW1BdChVVGV4dE9mZnNldCBpbmRleCkgY29uc3Q7Cgpwcml2YXRlOgoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBwcml2YXRlcwogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5KiBwYXR0ZXJuczsgLy8gYSB2ZWN0b3Igb2YgUGF0dGVybkVudHJpZXMKICBzdGF0aWMgIGNvbnN0ICAgaW50MzJfdCAgICAgICAgIEJJVEFSUkFZU0laRTsKICBzdGF0aWMgIGNvbnN0ICAgdWludDhfdCAgICAgICAgIEJJVEFSUkFZTUFTSzsKICBzdGF0aWMgIGNvbnN0ICAgaW50MzJfdCAgICAgICAgIEJZVEVQT1dFUjsKICBzdGF0aWMgIGNvbnN0ICAgaW50MzJfdCAgICAgICAgIEJZVEVNQVNLOwoKICBQYXR0ZXJuRW50cnkqICAgbGFzdEVudHJ5OwogIFBhdHRlcm5FbnRyeSogICBzYXZlRW50cnk7CiAgdWludDhfdCogICAgICAgIHN0YXR1c0FycmF5OwoKCiAgICAvKioKICAgICAqIEZpbmRzIHRoZSBsYXN0IHBhdHRlcm4gZW50cnkgYmVmb3JlIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IHRoYXQgZG9lcyBub3QgaGF2ZSAKICAgICAqIGV4dGVuc2lvbiBjaGFycy4KICAgICAqIEBwYXJhbSBpIHRoZSBvZmZzZXQuCiAgICAgKiBAcmV0dXJuIHRoZSBwYXR0ZXJuIGVudHJ5LgogICAgICovCiAgY29uc3QgUGF0dGVybkVudHJ5KiBmaW5kTGFzdFdpdGhOb0V4dGVuc2lvbihpbnQzMl90IGkpIGNvbnN0OwoKICAvKiogCiAgICAgKiBGaXhlcyB0aGUgbmV3IHBhdHRlcm4gZW50cnkgaW4gdGhlIG1lcmdlIGNvbGxhdGlvbiB0YWJsZS4KICAgICAqIElmIHRoZSBzdHJlbmd0aCBpcyBSRVNFVCwgdGhlbiBqdXN0IGNoYW5nZSB0aGUgbGFzdEVudHJ5IHRvCiAgICAgKiBiZSB0aGUgY3VycmVudC4gKElmIHRoZSBjdXJyZW50IGlzIG5vdCBpbiBwYXR0ZXJucywgc2lnbmFsIGFuIGVycm9yKS4KICAgICAqIElmIG5vdCwgdGhlbiByZW1vdmUgdGhlIGN1cnJlbnQgZW50cnksIGFuZCBhZGQgaXQgYWZ0ZXIgbGFzdEVudHJ5CiAgICAgKiAod2hpY2ggaXMgdXN1YWxseSBhdCB0aGUgZW5kKS4gIFN0cmVuZ3RoIGluZGljYXRlcyB0aGUgdGV4dCBvcmRlcgogICAgICogd2VpZ2h0IGZvciBhbiBlbnRyeS4KICAgICAqIEBwYXJhbSBuZXdFbnRyeSB0aGUgbmV3IHBhdHRlcm4gZW50cnkKICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLCBpdCB3aWxsIGJlIHNldCB0byBVX0lOVkFMSURfRk9STUFUX0VSUk9SCiAgICAgKiBpZiB0aGUgc3RyZW5ndGggaXMgUkVTRVQgYW5kIGEgcHJldmlvdXMgZW50cnkgY2FuJ3QgYmUgZm91bmQuCiAgICAgKi8KICB2b2lkIGZpeEVudHJ5KCAgUGF0dGVybkVudHJ5KiAgIG5ld0VudHJ5LAogICAgICAgICAgVUVycm9yQ29kZSYgICAgICBzdGF0dXMpOwoKICAvKioKICAgICAqIEZpbmRzIHRoZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCBlbnRyeSB0aGF0IHdhcyBwcmV2aW91c2x5IGluc3RhbGxlZCBpbiB0aGUKICAgICAqIG1lcmdlIGNvbGxhdGlvbiBvYmplY3QuCiAgICAgKiBAcGFyYW0gbGFzdEVudHJ5IHRoZSBlbnRyeSB0aGF0IHdhcyBwcmV2aW91c2x5IGluc3RhbGxlZC4KICAgICAqIEBwYXJhbSBleGNlc3MgdGhlIGV4dHJhIGNoYXJhY3RlcnMgCiAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cywgaXQgd2lsbCBiZSBzZXQgdG8gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUgogICAgICogaWYgdGhlIHN0cmVuZ3RoIGlzIFJFU0VUIGFuZCBhIHByZXZpb3VzIGVudHJ5IGNhbid0IGJlIGZvdW5kLgogICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmb3VuZCBlbnRyeQogICAgICovCiAgaW50MzJfdCBmaW5kTGFzdEVudHJ5KCAgY29uc3QgUGF0dGVybkVudHJ5KiBsYXN0RW50cnksIAogICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmICBleGNlc3MsCiAgICAgICAgICAgICAgVUVycm9yQ29kZSYgICAgICBzdWNjZXNzKSBjb25zdDsKfTsKCmlubGluZSBVbmljb2RlU3RyaW5nJiBNZXJnZUNvbGxhdGlvbjo6Z2V0UGF0dGVybihVbmljb2RlU3RyaW5nJiByZXN1bHQpIGNvbnN0CnsKICByZXR1cm4gZ2V0UGF0dGVybihyZXN1bHQsIFRSVUUpOwp9CgppbmxpbmUgVW5pY29kZVN0cmluZyYgTWVyZ2VDb2xsYXRpb246OmVtaXRQYXR0ZXJuKFVuaWNvZGVTdHJpbmcmIHJlc3VsdCkgY29uc3QKewogIHJldHVybiBlbWl0UGF0dGVybihyZXN1bHQsIFRSVUUpOwp9CgoKI2VuZGlmIC8vIF9NRVJHRUNPTAo=