cGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgpBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKoApDb250cmlidXRvcnM6CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLio7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CmltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlLio7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7CgovKioKICogQSBwYWdlIHRvIHNldCB0aGUgcHJlZmVyZW5jZXMgZm9yIHRoZSBjb25zb2xlCiAqIAogKiBAZGVwcmVjYXRlZCBUaGlzIHByZWZlcmVuY2UgcGFnZSBzaG91bGQgbm90IGJlIHVzZWQuIFRvIGJlIHJlbW92ZWQgYnkgbmV4dCByZWxlYXNlLgogKi8KcHVibGljIGNsYXNzIExvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZQoJZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCglpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7CgoJLyoqCgkgKiBDcmVhdGUgdGhlIGNvbnNvbGUgcGFnZS4KCSAqLwoJcHVibGljIExvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZSgpIHsKCQlzdXBlcihHUklEKTsKCgkJc2V0RGVzY3JpcHRpb24oVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiTG9nQ29uc29sZVByZWZlcmVuY2VQYWdlLmRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCgoJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPQoJCQlFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKCQlzZXRQcmVmZXJlbmNlU3RvcmUoc3RvcmUpOwoJfQoJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CgkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwoJCVdvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksIElIZWxwQ29udGV4dElkcy5MT0dfQ09OU09MRV9QUkVGRVJFTkNFX1BBR0UpOwoJfQoJLyoqCgkgKiBDcmVhdGUgYWxsIGZpZWxkIGVkaXRvcnMgZm9yIHRoaXMgcGFnZQoJICovCglwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7CgoJCUNvbG9yRmllbGRFZGl0b3IgZXJyT3V0ID0KCQkJbmV3IENvbG9yRmllbGRFZGl0b3IoCgkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0VSUk9SX1JHQiwKCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkxvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZS5lcnJvckNvbG9yIiksIC8vJE5PTi1OTFMtMSQKCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwoJCUNvbG9yRmllbGRFZGl0b3Igd2Fybk91dCA9CgkJCW5ldyBDb2xvckZpZWxkRWRpdG9yKAoJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9XQVJOSU5HX1JHQiwKCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkxvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZS53YXJuaW5nQ29sb3IiKSwgLy8kTk9OLU5MUy0xJAoJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CgkJQ29sb3JGaWVsZEVkaXRvciBpbmZvT3V0ID0KCQkJbmV3IENvbG9yRmllbGRFZGl0b3IoCgkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0lORk9fUkdCLAoJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiTG9nQ29uc29sZVByZWZlcmVuY2VQYWdlLmluZm9Db2xvciIpLCAvLyROT04tTkxTLTEkCgkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKCQlDb2xvckZpZWxkRWRpdG9yIHZlcmJPdXQgPQoJCQluZXcgQ29sb3JGaWVsZEVkaXRvcigKCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfVkVSQk9TRV9SR0IsCgkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJMb2dDb25zb2xlUHJlZmVyZW5jZVBhZ2UudmVyYm9zZUNvbG9yIiksIC8vJE5PTi1OTFMtMSQKCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwoJCUNvbG9yRmllbGRFZGl0b3IgZGVidWdPdXQgPQoJCQluZXcgQ29sb3JGaWVsZEVkaXRvcigKCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfREVCVUdfUkdCLAoJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiTG9nQ29uc29sZVByZWZlcmVuY2VQYWdlLmRlYnVnQ29sb3IiKSwgLy8kTk9OLU5MUy0xJAoJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CgoJCUZvbnRGaWVsZEVkaXRvciBmb250ID0KCQkJbmV3IEZvbnRGaWVsZEVkaXRvcigKCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfRk9OVCwKCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkxvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZS5mb250IiksIC8vJE5PTi1OTFMtMSQKCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwoKCQlhZGRGaWVsZChlcnJPdXQpOwoJCWFkZEZpZWxkKHdhcm5PdXQpOwoJCWFkZEZpZWxkKGluZm9PdXQpOwoJCWFkZEZpZWxkKHZlcmJPdXQpOwoJCWFkZEZpZWxkKGRlYnVnT3V0KTsKCQlhZGRGaWVsZChmb250KTsKCX0KCS8qKgoJICogUmV0dXJucyB0aGUgZm9udCBkYXRhIHRoYXQgZGVzY3JpYmVzIHRoZSBmb250IHRvIHVzZSBmb3IgdGhlIGNvbnNvbGUKCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyBGb250RGF0YSBnZXRDb25zb2xlRm9udERhdGEoKSB7CgkJSVByZWZlcmVuY2VTdG9yZSBwc3RvcmUgPQoJCQlFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKCQlGb250RGF0YSBmb250RGF0YSA9CgkJCVByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEoCgkJCQlwc3RvcmUsCgkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0ZPTlQpOwoJCXJldHVybiBmb250RGF0YTsKCX0KCS8qKgoJICogUmV0dXJucyB0aGUgYSBjb2xvciBiYXNlZCBvbiB0aGUgdHlwZS4KCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyBDb2xvciBnZXRQcmVmZXJlbmNlQ29sb3IoU3RyaW5nIHR5cGUpIHsKCQlJUHJlZmVyZW5jZVN0b3JlIHBzdG9yZSA9CgkJCUV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwoJCVJHQiBvdXRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHBzdG9yZSwgdHlwZSk7CgkJcmV0dXJuIG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgb3V0UkdCKTsKCX0KCS8qKgoJICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdAoJICovCglwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Cgl9Cgp9