cGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5mcmFtZWxpc3Q7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycCBhbmQgb3RoZXJzLgpBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKoApDb250cmlidXRvcnM6CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7CgovKioKICogR2VuZXJpYyAiQmFjayIgYWN0aW9uIHdoaWNoIGdvZXMgYmFjayBvbmUgZnJhbWUsCiAqLwpwdWJsaWMgY2xhc3MgQmFja0FjdGlvbiBleHRlbmRzIEZyYW1lQWN0aW9uIHsKCQoJLyoqCgkgKiBDb25zdHJ1Y3RzIGEgbmV3IGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZSBsaXN0LgoJICogCgkgKiBAcGFyYW0gZnJhbWVMaXN0IHRoZSBmcmFtZSBsaXN0CgkgKi8KCXB1YmxpYyBCYWNrQWN0aW9uKEZyYW1lTGlzdCBmcmFtZUxpc3QpIHsKCQlzdXBlcihmcmFtZUxpc3QpOwoJCXNldFRleHQoRnJhbWVMaXN0TWVzc2FnZXMuZ2V0U3RyaW5nKCJCYWNrLnRleHQiKSk7IC8vJE5PTi1OTFMtMSQKCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IoImNsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIikpOyAvLyROT04tTkxTLTEkCgkJc2V0SW1hZ2VEZXNjcmlwdG9yKGdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2JhY2t3YXJkX25hdi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IoImRsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIikpOyAvLyROT04tTkxTLTEkCgkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHRoaXMsIElGcmFtZUxpc3RIZWxwQ29udGV4dElkcy5CQUNLX0FDVElPTik7CgkJdXBkYXRlKCk7Cgl9CgkKCXByaXZhdGUgRnJhbWUgZ2V0UHJldmlvdXNGcmFtZSgpIHsKCQlGcmFtZUxpc3QgbGlzdCA9IGdldEZyYW1lTGlzdCgpOwoJCXJldHVybiBsaXN0LmdldEZyYW1lKGxpc3QuZ2V0Q3VycmVudEluZGV4KCkgLSAxKTsKCX0KCQoJcHJpdmF0ZSBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoRnJhbWUgcHJldmlvdXNGcmFtZSkgewoJCWlmIChwcmV2aW91c0ZyYW1lICE9IG51bGwpIHsKCQkJU3RyaW5nIHRleHQgPSBwcmV2aW91c0ZyYW1lLmdldFRvb2xUaXBUZXh0KCk7CgkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKCQkJCXJldHVybiBGcmFtZUxpc3RNZXNzYWdlcy5mb3JtYXQoIkJhY2sudG9vbFRpcE9uZUFyZyIsIG5ldyBPYmplY3RbXSB7IHRleHQgfSk7IC8vJE5PTi1OTFMtMSQKCQkJfQoJCX0KCQlyZXR1cm4gRnJhbWVMaXN0TWVzc2FnZXMuZ2V0U3RyaW5nKCJCYWNrLnRvb2xUaXAiKTsgLy8kTk9OLU5MUy0xJAoJfQoJCgkvKioKCSAqIENhbGxzIDxjb2RlPmJhY2soKTwvY29kZT4gb24gdGhlIGZyYW1lIGxpc3QuCgkgKi8KCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQlnZXRGcmFtZUxpc3QoKS5iYWNrKCk7Cgl9CgkKCS8qKgoJICogVXBkYXRlcyB0aGlzIGFjdGlvbidzIGVuYWJsZWQgc3RhdGUgYW5kIHRvb2wgdGlwIHRleHQuCgkgKiBUaGlzIGFjdGlvbiBpcyBlbmFibGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIHByZXZpb3VzIGZyYW1lIGluIHRoZSBmcmFtZSBsaXN0LgoJICogVGhlIHRvb2wgdGlwIHRleHQgaXMgIkJhY2sgdG8gIiBwbHVzIHRoZSB0b29sIHRpcCB0ZXh0IGZvciB0aGUgcHJldmlvdXMgZnJhbWUuCgkgKi8KCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKCQlzdXBlci51cGRhdGUoKTsKCQlGcmFtZSBwcmV2aW91c0ZyYW1lID0gZ2V0UHJldmlvdXNGcmFtZSgpOwoJCXNldEVuYWJsZWQocHJldmlvdXNGcmFtZSAhPSBudWxsKTsKCQlzZXRUb29sVGlwVGV4dChnZXRUb29sVGlwVGV4dChwcmV2aW91c0ZyYW1lKSk7Cgl9Cgp9