ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDQ4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK2J1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc0YTUzCi0tLSAvZGV2L251bGwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2g8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFmOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDEwIEBACitiaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCisgICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCitzcmMuaW5jbHVkZXMgPSBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAorICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkZmZkNwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2guaHRtbApAQCAtMCwwICsxLDE3IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+CisKKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgorICAgPHRpdGxlPldUUCAxLjUuNSBQYXRjaGVzPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMT5XVFAgMS41LjUgUGF0Y2hlczwvaDE+CisKKzxoMj5vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZTwvaDI+CisKKzxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc0NjQ0Jz4yNzQ2NDQ8L2E+LiBKQVJzIGRlcGxveWVkIHdyb25nbHkgd2l0aGluIEVBUjwvcD4KKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkZjcwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Y3ZTRlCi0tLSAvZGV2L251bGwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTUwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBmZWF0dXJlLnByb3BlcnRpZXMKKyMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCisjICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQorIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisKKyMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKK2ZlYXR1cmVOYW1lPVdUUCBQYXRjaCBmb3Igb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gKKworIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQorcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCisKKyMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKK3VwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCisKKyMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCitkZXNjcmlwdGlvbj1cCitDb250YWlucyBmaXhlcyBmb3IgdGhlIGZvbGxvd2luZyBwbHVnaW4ocyk6XG5cCisgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZVxuXAorXG5cCitUaGUgZml4ZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIGJ1Z3ppbGxhIGVudHJpZXM6XG5cCitcblwKK0J1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc0NjQ0IEpBUnMgZGVwbG95ZWQgd3JvbmdseSB3aXRoaW4gRUFSXG5cCitcblwKKyMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgorY29weXJpZ2h0PVwKK0NvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitcblwKK0NvbnRyaWJ1dG9yczpcblwKKyAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgorIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKKyMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQorbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKKworIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKKyMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgorbGljZW5zZT1cCitFQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKK1NlcHRlbWJlciAyNywgMjAwN1xuXAorXG5cCitVc2FnZSBPZiBDb250ZW50XG5cCitcblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKK09USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAorVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCitBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKK05PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKK0FHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKK0FORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCitPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAorT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1xuXAorQXBwbGljYWJsZSBMaWNlbnNlc1xuXAorXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKK0xpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCitDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAorcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKK2FzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorXG5cCisgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCisgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKKyAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKyAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAorICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCisgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAorICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAorICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKKyAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKKyAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCitcblwKK0ZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAorImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKK0luY2x1ZGVkIEZlYXR1cmVzLlxuXAorXG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCitjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCitpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCitMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1xuXAorICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKyAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKyAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCisgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKK1xuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAorRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKK0xpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAorSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCit5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCit0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKK0ZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCit1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK1xuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCitUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKK1NPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1xuXAorICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCisgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKyAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKKyAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKK1xuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAorVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKK2lzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCitnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitcblwKK0NyeXB0b2dyYXBoeVxuXAorXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKK2N1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKK2FuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKK3VzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAorcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAorYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitcblwKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyZmQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZmVhdHVyZQorICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoIgorICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICAgIHZlcnNpb249IjEuNS41LnF1YWxpZmllciIKKyAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgorCisgICA8ZGVzY3JpcHRpb24+CisgICAgICAlZGVzY3JpcHRpb24KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxjb3B5cmlnaHQ+CisgICAgICAlY29weXJpZ2h0CisgICA8L2NvcHlyaWdodD4KKworICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+CisgICAgICAlbGljZW5zZQorICAgPC9saWNlbnNlPgorCisgICA8cmVxdWlyZXM+CisgICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjUuNC52MjAwNzA0MTUwMjQxLS0yUEQ4OFE4UENINzc4NyIgcGF0Y2g9InRydWUiLz4KKyAgIDwvcmVxdWlyZXM+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNDcwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw5MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Cis8IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgorPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KKzxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgorPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgorPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Cis8UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgorPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgorPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgorPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgorPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAorRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAorQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCitocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KKzxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAorKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKK2FyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgorPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAorKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAorUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCitjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKK2Fzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCituYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgorPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAorImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCitGZWF0dXJlcy48L1A+Cis8UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKK2luIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAorRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAorbG9jYXRpb25zOjwvUD4KKzxVTD4KKyAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKKyAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAorICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAorICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Cis8UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCit1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCitMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCitGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKK2FuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAorbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAorZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAorVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCithbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAorZGlyZWN0b3J5LjwvUD4KKzxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Cis8VUw+CisgIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKKyAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCisKKyAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAorICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKKworICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCisgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCisKKyAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKKyAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCisKKyAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAorICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKKworICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAorICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAorICA8L0xJPjwvVUw+Cis8UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAorVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Cis8SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KKzxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKK2N1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAorcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKK2VuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKK2NvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAordG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sCmluZGV4IDYyZDQzZGMuLmVhZmI4MzYgMTAwNjQ0Ci0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2guaHRtbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoLmh0bWwKQEAgLTQsMTcgKzQsMTggQEAKIDxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CiAgICA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotICAgPHRpdGxlPldUUCAyLjAuMiBQYXRjaGVzPC90aXRsZT4KKyAgIDx0aXRsZT5XVFAgMy4wLjQgUGF0Y2hlczwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDE+V1RQIDIuMC4yIFBhdGNoZXM8L2gxPgorPGgxPldUUCAzLjAuNCBQYXRjaGVzPC9oMT4KIAogPGgyPkZlYXR1cmUgUGF0Y2hlZDogb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2g8L2gyPgogPGgzPlBsdWdpbihzKSByZXBsYWNlZDo8L2gzPgotPHVsPjxsaT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU8L2xpPjwvdWw+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzIxOTg4OSc+MjE5ODg5PC9hPi4gTW9kdWxlUHVibGlzaEluZm8gbG9hZFJlc291cmNlIGFuZCBzYXZlUmVzb3VyY2UgYXJlIG5vdCBzeW1tZXRyaWNhbC48L3A+Cis8dWw+PGxpPm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU8L2xpPjwvdWw+Cis8cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI2NzEyNSc+MjY3MTI1PC9hPi4gVENQL0lQIG1vbml0b3IgY2F1c2VzIGNvbm5lY3Rpb25zIHRvIGhhbmc8L3A+Cis8cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI2NzQ3Mic+MjY3NDcyPC9hPi4gVENQL0lQIG1vbml0b3IgZG9lcyBub3QgZGlzcGxheSByZXF1ZXN0IG1lc3NhZ2VzIHByb3Blcmx5PC9wPgogCiAKIDwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IGVlOTU5NzQuLjBmZmM3ZDAgMTAwNjQ0Ci0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTE1LDcgKzE1LDcgQEAKICMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgogCiAjICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgU2VydmVyIENvcmUKK2ZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgQ29yZSBQYXRjaGVzCiAKICMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKIHByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpAQCAtMjUsOSArMjUsMTEgQEAKIAogIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKIGRlc2NyaXB0aW9uPVwKLVBhdGNoKHMpIGZvciBTZXJ2ZXIgdG9vbHMgZnJhbWV3b3JrIGNvcmUuIFxuXAotU2VlIGJ1ZyAyMTk4ODkgKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzLzIxOTg4OSkgTW9kdWxlUHVibGlzaEluZm8gbG9hZFJlc291cmNlIGFuZCBzYXZlUmVzb3VyY2UgYXJlIG5vdCBzeW1tZXRyaWNhbCBcblwKLQorQ29udGFpbnMgZml4ZXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgYnVnaWxsaWEocyk6XG5cCitcblwKK0J1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjY3MTI1IFRDUC9JUCBtb25pdG9yIGNhdXNlcyBjb25uZWN0aW9ucyB0byBoYW5nXG5cCitCdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI2NzQ3MiBUQ1AvSVAgbW9uaXRvciBkb2VzIG5vdCBkaXNwbGF5IHJlcXVlc3QgbWVzc2FnZXMgcHJvcGVybHlcblwKK1xuXAogCiAjICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKIGNvcHlyaWdodD1cCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmluZGV4IDUwNTM2NWYuLjRmZmUyZGQgMTAwNjQ0Ci0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCkBAIC0xLDI4ICsxLDIyIEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaCIKLSAgICAgIGxhYmVsPSJQYXRjaCBGZWF0dXJlIGZvciBTZXJ2ZXIgQ29yZSIKLSAgICAgIHZlcnNpb249IjIuMC4yLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIj4KKyAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgorICAgIHZlcnNpb249IjMuMC40LnF1YWxpZmllciIKKyAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgorICAgIDxkZXNjcmlwdGlvbj4lZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgogCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+CisgICAgPGNvcHlyaWdodD4lY29weXJpZ2h0PC9jb3B5cmlnaHQ+CiAKLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KKyAgICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4lbGljZW5zZTwvbGljZW5zZT4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMi4wLjIudjIwMDgwMjE1MDEwMC0yLUNOOHM3MzNIM18zSWMiIHBhdGNoPSJ0cnVlIi8+CisgICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjAuNC52MjAwOTAxMTUtMjBBbThzNzMzSjNfNEYxMjU2IiBwYXRjaD0idHJ1ZSIvPgogICAgPC9yZXF1aXJlcz4KIAogICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIgogICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKICAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKICAgICAgICAgIHZlcnNpb249IjAuMC4wIgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNTA1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsOCBAQAorYmluCitidWlsZC54bWwKK29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZV8zLjAuMC5qYXIKK3NyYy5qYXIKK3RlbXAuZm9sZGVyCitAZG90CitzcmMuemlwCitqYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZWYwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucwpAQCAtMCwwICsxLDcgQEAKKyMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUgcGx1Z2luCisKKyMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZworb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2RlYnVnPXRydWUKKworIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCitvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcHVibGlzaGluZz1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1ZTE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiZTQzMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTIwODUwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzcgQEAKKyNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQoraW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTg0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI0ZyaSBGZWIgMjMgMjE6MTU6MzggRVNUIDIwMDcKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGE2MGU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpAQCAtMCwwICsxLDE0IEBACisjU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgorY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCitjb21waWxlcnMucC5idWlsZD0wCitjb21waWxlcnMucC5kZXByZWNhdGVkPTEKK2NvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCitjb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCitjb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCitjb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKK2NvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKK2NvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNkOTcyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyMiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsgc2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMS4xLjMucXVhbGlmaWVyCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSmF2YVNlcnZlclBsdWdpbgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLAorIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpIiwKKyBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkiCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCisgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTk5ZGYzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvYWJvdXQuaHRtbApAQCAtMCwwICsxLDM0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8SFRNTD4KKworPGhlYWQ+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPC9oZWFkPgorCis8Qk9EWSBsYW5nPSJFTi1VUyI+CisKKzxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgorCis8UD5KdW5lLCAyMDA4PC9QPgorCis8SDM+TGljZW5zZTwvSDM+CisKKzxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKKygiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAordW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAorKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Cis8QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgorCis8UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKK0NvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCit0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKK0NoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAorbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCit0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAorPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2E0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2Jpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbAorYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKKyAgICAgICAgICAgICAgIEBkb3QvKiosXAorICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKK3NyYy5pbmNsdWRlcyA9IHNjaGVtYS8KK3NvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjQwYjcxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3BsdWdpbk5hbWU9SmF2YSBTZXJ2ZXIgU3VwcG9ydAorcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCisKK2V4dGVuc2lvblBvaW50UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycz1SdW50aW1lIENsYXNzcGF0aCBQcm92aWRlcnMKK2V4dGVuc2lvblBvaW50UnVudGltZUZhY2V0TWFwcGluZz1SdW50aW1lIEZhY2V0IE1hcHBpbmdzCitleHRlbnNpb25Qb2ludFNlcnZlclByb2ZpbGVycz1TZXJ2ZXIgUHJvZmlsZXJzCisKK3J1bnRpbWVUeXBlTmFtZT1KMkVFIFJ1bnRpbWUgTGlicmFyeQorcnVudGltZVR5cGVEZXNjcmlwdGlvbj1BIHJ1bnRpbWUgdGhhdCByZXByZXNlbnRzIGEgc2V0IG9mIEoyRUUgcnVudGltZSBsaWJyYXJpZXMuCisKK21vZHVsZVR5cGVKMkVFV2ViTmFtZT1KMkVFIFdlYiBtb2R1bGUKK21vZHVsZVR5cGVKMkVFRUpCTmFtZT1KMkVFIEVKQiBtb2R1bGUKK21vZHVsZVR5cGVKMkVFUkFSTmFtZT1KMkVFIENvbm5lY3RvciBtb2R1bGUKK21vZHVsZVR5cGVKMkVFQ2xpZW50TmFtZT1KMkVFIEFwcGxpY2F0aW9uIENsaWVudCBtb2R1bGUKK21vZHVsZVR5cGVKMkVFRUFSTmFtZT1KMkVFIEVudGVycHJpc2UgYXBwbGljYXRpb24KK21vZHVsZVR5cGVKMkVFVXRpbGl0eU5hbWU9SjJFRSBVdGlsaXR5IGphcgorCitsYXVuY2hhYmxlSm5kaT1KTkRJIE9iamVjdAorbGF1bmNoYWJsZUpuZGlEZXNjcmlwdGlvbj1TaWxlbnRseSBzdGFydCBhbiBvYmplY3QgbG9jYXRhYmxlIGJ5IEpOREkuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2IxNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnhtbApAQCAtMCwwICsxLDE1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKyAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyIgc2NoZW1hPSJzY2hlbWEvcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5leHNkIi8+CisgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVGYWNldE1hcHBpbmdzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lRmFjZXRNYXBwaW5ncyIgc2NoZW1hPSJzY2hlbWEvcnVudGltZUZhY2V0TWFwcGluZ3MuZXhzZCIvPgorICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJQcm9maWxlcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlclByb2ZpbGVycyIgc2NoZW1hPSJzY2hlbWEvc2VydmVyUHJvZmlsZXJzLmV4c2QiLz4KKyAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzIiBuYW1lPSJpbnRlcm5hbFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL2ludGVybmFsUnVudGltZUNvbXBvbmVudFByb3ZpZGVycy5leHNkIi8+CisKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiPgorICAgIDxjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgorICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5jb250YWluZXIiCisgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIvPgorICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlVHlwZXMiPgorICAgIDxtb2R1bGVUeXBlCisgICAgICAgaWQ9ImpzdC53ZWIiCisgICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFV2ViTmFtZSIvPgorICAgIDxtb2R1bGVUeXBlCisgICAgICAgaWQ9ImpzdC5lamIiCisgICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFRUpCTmFtZSIvPgorICAgIDxtb2R1bGVUeXBlCisgICAgICAgaWQ9ImpzdC5hcHBjbGllbnQiCisgICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFQ2xpZW50TmFtZSIvPgorICAgIDxtb2R1bGVUeXBlCisgICAgICAgaWQ9ImpzdC5jb25uZWN0b3IiCisgICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFUkFSTmFtZSIvPgorICAgIDxtb2R1bGVUeXBlCisgICAgICAgaWQ9ImpzdC5lYXIiCisgICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFRUFSTmFtZSIvPgorICAgIDxtb2R1bGVUeXBlCisgICAgICAgaWQ9ImpzdC51dGlsaXR5IgorICAgICAgIG5hbWU9IiVtb2R1bGVUeXBlSjJFRVV0aWxpdHlOYW1lIi8+CisgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiPgorICAgIDxydW50aW1lVHlwZQorICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCisgICAgICAgbmFtZT0iJXJ1bnRpbWVUeXBlTmFtZSIKKyAgICAgICBkZXNjcmlwdGlvbj0iJXJ1bnRpbWVUeXBlRGVzY3JpcHRpb24iCisgICAgICAgZmFjZXRSdW50aW1lQ29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCisgICAgICAgZmFjZXRSdW50aW1lVmVyc2lvbj0iMS4wIgorICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1J1bnRpbWUiPgorICAgICAgIDxtb2R1bGVUeXBlCisgICAgICAgICB0eXBlcz0ianN0LioiCisgICAgICAgICB2ZXJzaW9ucz0iKiIvPgorICAgIDwvcnVudGltZVR5cGU+CisgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzIj4KKyAgICA8cnVudGltZUNsYXNzcGF0aFByb3ZpZGVyCisgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUYXJnZXQiCisgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIgorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5HZW5lcmljUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyIi8+CisgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KKyAgICA8cHJvcGVydHlUZXN0ZXIKKyAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmNhY3R1cy5leHByZXNzaW9ucyIKKyAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlIgorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuU2VydmxldFRlc3RDYXNlUHJvcGVydHlUZXN0ZXIiCisgICAgICBwcm9wZXJ0aWVzPSJpc1NlcnZsZXRUZXN0Q2FzZSIKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNhY3R1cy5leHByZXNzaW9uIi8+CisgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIj4KKyAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCisgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jYWN0dXMubW9kdWxlQXJ0aWZhY3RBZGFwdGVyIgorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUiCisgICAgICBwcmlvcml0eT0iMTAiPgorICAgICAgPGVuYWJsZW1lbnQ+CisgICAgICAgICA8b3I+CisgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIvPgorICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiLz4KKyAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIvPgorICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIi8+CisgICAgICAgICA8L29yPgorICAgICAgPC9lbmFibGVtZW50PgorICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgorICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KKyAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKKyAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jYWN0dXMubGF1bmNoYWJsZUFkYXB0ZXIiCisgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIvPgorICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyI+CisgICAgPGNsaWVudAorICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuam5kaSIKKyAgICAgIG5hbWU9IiVsYXVuY2hhYmxlSm5kaSIKKyAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoYWJsZUpuZGlEZXNjcmlwdGlvbiIKKyAgICAgIHByaW9yaXR5PSItMTAwIgorICAgICAgbGF1bmNoYWJsZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpuZGlMYXVuY2hhYmxlIgorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KMkVFTGF1bmNoYWJsZUNsaWVudCIvPgorICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+CisgICAgPHJ1bnRpbWUtY29tcG9uZW50LXR5cGUKKyAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIi8+CisKKyAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgorICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKKyAgICAgICB2ZXJzaW9uPSIxLjAiLz4KKworICAgIDxhZGFwdGVyPgorICAgICAgPHJ1bnRpbWUtY29tcG9uZW50CisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIi8+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIvPgorICAgICAgPHR5cGUKKyAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KKyAgICA8L2FkYXB0ZXI+CisKKyAgICA8c3VwcG9ydGVkPgorICAgICAgPHJ1bnRpbWUtY29tcG9uZW50CisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIgorICAgICAgICAgdmVyc2lvbj0iMS4wIi8+CisgICAgICA8ZmFjZXQKKyAgICAgICAgIGlkPSJqc3Qud2ViIgorICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQsMi41Ii8+CisgICAgICA8ZmFjZXQKKyAgICAgICAgIGlkPSJqc3QuZWpiIgorICAgICAgICAgdmVyc2lvbj0iMS4xLDIuMCwyLjEsMy4wIi8+CisgICAgICA8ZmFjZXQKKyAgICAgICAgIGlkPSJqc3QuZWFyIgorICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQsNS4wIi8+CisgICAgICA8ZmFjZXQKKyAgICAgICAgIGlkPSJqc3QuY29ubmVjdG9yIgorICAgICAgICAgdmVyc2lvbj0iMS4wLDEuNSIvPgorICAgICAgPGZhY2V0CisgICAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKKyAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40LDUuMCIvPgorICAgICAgPGZhY2V0CisgICAgICAgICBpZD0ianN0LnV0aWxpdHkiCisgICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KKyAgICA8L3N1cHBvcnRlZD4KKyAgPC9leHRlbnNpb24+CisKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+CisgICAgPGRlZmF1bHQtZmFjZXRzPgorICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiLz4KKyAgICAgIDxmYWNldCBpZD0id3N0LmpzZHQud2ViIiB2ZXJzaW9uPSIxLjAiLz4KKyAgICA8L2RlZmF1bHQtZmFjZXRzPgorICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzIj4KKyAgICA8cnVudGltZUNvbXBvbmVudFByb3ZpZGVyCisgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpSRVJ1bnRpbWVDb21wb25lbnRQcm92aWRlciIKKyAgICAgIHJ1bnRpbWVUeXBlSWRzPSIqIgorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KUkVSdW50aW1lQ29tcG9uZW50UHJvdmlkZXIiLz4KKyAgPC9leHRlbnNpb24+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0ODFiZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnRlcm5hbFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMuZXhzZApAQCAtMCwwICsxLDEzNiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lQ29tcG9uZW50UHJvdmlkZXJzIiBuYW1lPSJSdW50aW1lIENvbXBvbmVudCBQcm92aWRlcnMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIGV4cGVyaW1lbnRhbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGRvd25zdHJlYW0gY29tcG9uZW50cy4KK1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBuZXcgcnVudGltZSBjb21wb25lbnRzIHRvIGFuIGV4aXN0aW5nIGZhY2V0IHJ1bnRpbWUuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWVDb21wb25lbnRQcm92aWRlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWVDb21wb25lbnRQcm92aWRlciI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgorICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lVHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHJ1bnRpbWUgdHlwZSBpZHMgdGhhdCB0aGlzIHByb3ZpZGVyIG1heSBzdXBwb3J0LiBVc2VkIGZvciBtZW1vcnkgJmFtcDsgcGVyZm9ybWFuY2UgcmVhc29ucworICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4KK1J1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAxLjUuMQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBydW50aW1lIGNvbXBvbmVudCBwcm92aWRlciBleHRlbnNpb24gcG9pbnQ6CisKKyZsdDtwcmUmZ3Q7CisgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMmcXVvdDsmZ3Q7CisgICAgICZsdDtydW50aW1lQ29tcG9uZW50UHJvdmlkZXIKKyAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZUNvbXBvbmVudFByb3ZpZGVyJnF1b3Q7CisgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUsIGNvbS5leGFtcGxlMi4qJnF1b3Q7CisgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVSdW50aW1lQ29tcG9uZW50UHJvdmlkZXImcXVvdDsvJmd0OworICAgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7YiZndDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUmbHQ7L2ImZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGRlMGMxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuZXhzZApAQCAtMCwwICsxLDEzNSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzIiBuYW1lPSJSdW50aW1lIENsYXNzcGF0aCBQcm92aWRlcnMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGEgbmV3IHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyLiBSdW50aW1lIGNsYXNzcGF0aCBwcm92aWRlcnMgcHJvdmlkZSB0aGUgY2xhc3NwYXRoIGZvciBKYXZhIHNlcnZlciBydW50aW1lcy4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZUNsYXNzcGF0aFByb3ZpZGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0icnVudGltZUNsYXNzcGF0aFByb3ZpZGVyIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+CisgICAgICAgICA8L2FwcEluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVUeXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcnVudGltZSB0eXBlIGlkcyB0aGF0IHRoaXMgcHJvdmlkZXIgbWF5IHN1cHBvcnQuIFVzZWQgZm9yIG1lbW9yeSAmYW1wOyBwZXJmb3JtYW5jZSByZWFzb25zCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7LgorUnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIDEuMAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBleHRlbnNpb24gcG9pbnQ6CisKKyZsdDtwcmUmZ3Q7CisgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMmcXVvdDsmZ3Q7CisgICAgICZsdDtydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIKKyAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVyJnF1b3Q7CisgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUsIGNvbS5leGFtcGxlMi4qJnF1b3Q7CisgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXImcXVvdDsvJmd0OworICAgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7YiZndDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUmbHQ7L2ImZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUZhY2V0TWFwcGluZ3MuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lRmFjZXRNYXBwaW5ncy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDMzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUZhY2V0TWFwcGluZ3MuZXhzZApAQCAtMCwwICsxLDEzOSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lRmFjZXRNYXBwaW5ncyIgbmFtZT0iUnVudGltZSBGYWNldCBNYXBwaW5ncyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIG1hcCBiZXR3ZWVuIGEgZmFjZXQgcnVudGltZSBjb21wb25lbnQgYW5kIGEgc2VydmVyIHJ1bnRpbWUgdHlwZS4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZUZhY2V0TWFwcGluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWVGYWNldE1hcHBpbmciPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KKyAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIHJ1bnRpbWUgdHlwZSBpZAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWUtY29tcG9uZW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgZmFjZXQgcnVudGltZSBjb21wb25lbnQgaWQKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgZmFjZXQgcnVudGltZSBjb21wb25lbnQgdmVyc2lvbgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAxLjAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcnVudGltZSBmYWNldCBtYXBwaW5nIGV4dGVuc2lvbiBwb2ludDoKKworJmx0O3ByZSZndDsKKyAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0TWFwcGluZ3MmcXVvdDsmZ3Q7CisgICAgICZsdDtydW50aW1lRmFjZXRNYXBwaW5nCisgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciZxdW90OworICAgICAgICBydW50aW1lVHlwZUlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUuMzImcXVvdDsKKyAgICAgICAgcnVudGltZS1jb21wb25lbnQ9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciZxdW90OworICAgICAgICB2ZXJzaW9uPSZxdW90OzMuMiZxdW90Oy8mZ3Q7CisgICZsdDsvZXh0ZW5zaW9uJmd0OworJmx0Oy9wcmUmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCit0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclByb2ZpbGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclByb2ZpbGVycy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMGI0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyUHJvZmlsZXJzLmV4c2QKQEAgLTAsMCArMSwxMzQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIiBpZD0ic2VydmVyUHJvZmlsZXJzIiBuYW1lPSJTZXJ2ZXIgUHJvZmlsZXIiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHByb2ZpbGluZyBzZXJ2ZXJzLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZXJ2ZXJQcm9maWxlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9InNlcnZlclByb2ZpbGVyIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+CisgICAgICAgICA8L2FwcEluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGVkIG5hbWUKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZlclByb2ZpbGVyRGVsZWdhdGUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgMS41CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHNlcnZlciBwcm9maWxlciBleHRlbnNpb24gcG9pbnQ6CisKKyZsdDtwcmUmZ3Q7CisgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnNlcnZlclByb2ZpbGVycyZxdW90OyZndDsKKyAgICAgJmx0O3NlcnZlclByb2ZpbGVyCisgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLm15UHJvZmlsZXImcXVvdDsKKyAgICAgICAgbmFtZT0mcXVvdDtNeSBQcm9maWxlciZxdW90OworICAgICAgICB2bUFyZ3M9JnF1b3Q7LVhwaUFnZW50JnF1b3Q7LyZndDsKKyAgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0NsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0NsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiYjAxNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlOworLyoqCisgKiBBIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgdGhhdCBzdXBwb3J0cyBjaGFuZ2luZyB0aGUgY2xhc3NwYXRoIG9mIHRoZQorICogcHJvamVjdCBieSBhZGRpbmcgb25lIG9yIG1vcmUgY2xhc3NwYXRoIGNvbnRhaW5lcnMuIFJ1bnRpbWUgcHJvdmlkZXJzCisgKiBjYW4gZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIGltcGxlbWVudCB0aGUgYWJzdHJhY3QgbWV0aG9kcyB0byBwcm92aWRlCisgKiB0aGUgY29ycmVjdCBidWlsZCBwYXRoIGZvciB0aGVpciBydW50aW1lIHR5cGUuCisgKiAKKyAqIEBkZXByZWNhdGVkIFNob3VsZCB1c2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMKKyAqICAgIGV4dGVuc2lvbiBwb2ludCBpbnN0ZWFkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlciBleHRlbmRzIFJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUgeworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBSdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlI3NldFJ1bnRpbWVUYXJnZXQoSVByb2plY3QsIElSdW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVUYXJnZXQoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZSNyZW1vdmVSdW50aW1lVGFyZ2V0KElQcm9qZWN0LCBJUnVudGltZSwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVSdW50aW1lVGFyZ2V0KElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byB1c2UgZGVwcmVjYXRlZCBjb2RlIik7CisJfQorCisJLyoqCisJICogQWRkIGxpYnJhcnkgZW50cmllcyB0byB0aGUgZ2l2ZW4gbGlzdCBmb3IgZXZlcnkgamFyIGZpbGUgZm91bmQgaW4gdGhlCisJICogZ2l2ZW4gZGlyZWN0b3J5LiBPcHRpb25hbGx5IHNlYXJjaCBzdWJkaXJlY3RvcmllcyBhcyB3ZWxsLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0IGEgbGlzdAorCSAqIEBwYXJhbSBkaXIgYSBkaXJlY3RvcnkKKwkgKiBAcGFyYW0gaW5jbHVkZVN1YmRpcmVjdG9yaWVzIDxjb2RlPnRydWU8L2NvZGU+IHRvIGluY2x1ZGUgc3ViZGlyZWN0b3JpZXMsIGFuZAorCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkTGlicmFyeUVudHJpZXMoTGlzdCBsaXN0LCBGaWxlIGRpciwgYm9vbGVhbiBpbmNsdWRlU3ViZGlyZWN0b3JpZXMpIHsKKwkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gcnVudGltZS4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcworCSAqLworCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXREZWxlZ2F0ZUNsYXNzcGF0aEVudHJpZXMoSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggZW50cnkgaWRzIGZvciB0aGlzIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIuIFRoZXNlCisJICogaWRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNsYXNzcGF0aCBjb250YWluZXIgaWQgdG8gY3JlYXRlIGEgbmV3IGZ1bGx5CisJICogcXVhbGlmaWVkIGNsYXNzcGF0aCBjb250YWluZXIgaWQuCisJICogPHA+CisJICogQnkgZGVmYXVsdCwgdGhlcmUgaXMgYSBzaW5nbGUgY2xhc3NwYXRoIGVudHJ5IGZvciB0aGUgcnVudGltZSwgd2l0aCBubworCSAqIGV4dHJhIGlkICg8Y29kZT5uZXcgU3RyaW5nWzFdPC9jb2RlPikuIFRvIGNyZWF0ZSBtdWx0aXBsZSBpZHMsIGp1c3QKKwkgKiByZXR1cm4gYSBzdHJpbmcgYXJyYXkgY29udGFpbmluZyB0aGUgaWRzLiBGb3IgaW5zdGFuY2UsIHRvIGhhdmUgdHdvCisJICogY2xhc3NwYXRoIGNvbnRhaW5lcnMgd2l0aCBpZHMgImlkMSIgYW5kICJpZDIiLCB1c2UKKwkgKiA8Y29kZT5uZXcgU3RyaW5nW10geyAiaWQxIiwgImlkMiIgfTwvY29kZT4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cnkgaWRzCisJICovCisJcHVibGljIFN0cmluZ1tdIGdldENsYXNzcGF0aEVudHJ5SWRzKCkgeworCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byB1c2UgZGVwcmVjYXRlZCBjb2RlIik7CisJfQorCisJLyoqCisJICogUmVxdWVzdCB0aGF0IHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGZvciB0aGUgZ2l2ZW4gcnVudGltZSBhbmQgaWQgYmUgdXBkYXRlZAorCSAqIHdpdGggdGhlIGdpdmVuIGNsYXNzcGF0aCBjb250YWluZXIgZW50cmllcy4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKKwkgKiBAcGFyYW0gaWQgYW4gaWQKKwkgKiBAcGFyYW0gZW50cmllcyBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcworCSAqLworCXB1YmxpYyB2b2lkIHJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIGlkLCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKSB7CisJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGxhYmVsIGZvciB0aGUgZ2l2ZW4gcnVudGltZSBhbmQgdGhlIGdpdmVuCisJICogY2xhc3NwYXRoIGNvbnRhaW5lciBpZCAocmV0dXJuZWQgZnJvbSBnZXRDbGFzc3BhdGhFbnRyeUlkcygpKS4gVGhpcyBtZXRob2QKKwkgKiBtdXN0IG5vdCByZXR1cm4gbnVsbC4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0byByZXNvbHZlIHRoZSBjb250YWluZXIgbGFiZWwgZm9yCisJICogQHBhcmFtIGlkIHRoZSBjbGFzc3BhdGggZW50cnkgaWQKKwkgKiBAcmV0dXJuIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBsYWJlbAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NwYXRoQ29udGFpbmVyTGFiZWwoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIGlkKTsKKworCS8qKgorCSAqIFJlc29sdmUgdGhlIGNsYXNzcGF0aCBjb250YWluZXIuCisJICogCisJICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCisJICogQHBhcmFtIGlkIGEgY29udGFpbmVyIGlkCisJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBpZCkgeworCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byB1c2UgZGVwcmVjYXRlZCBjb2RlIik7CisJfQorCisJLyoqCisJICogUmVzb2x2ZXMgKGNyZWF0ZXMgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGZvcikgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgd2l0aAorCSAqIHRoZSBnaXZlbiBydW50aW1lIGFuZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIGNvbnRhaW5lciBpZCAocmV0dXJuZWQgZnJvbQorCSAqIGdldENsYXNzcGF0aEVudHJ5SWRzKCkpLiBJZiB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBjYW5ub3QgYmUgcmVzb2x2ZWQKKwkgKiAoZm9yIGluc3RhbmNlLCBpZiB0aGUgcnVudGltZSBkb2VzIG5vdCBleGlzdCksIHJldHVybiBudWxsLgorCSAqIAorCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIHJlc29sdmUgdGhlIGNvbnRhaW5lciBmb3IKKwkgKiBAcGFyYW0gaWQgdGhlIGNsYXNzcGF0aCBlbnRyeSBpZAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBjb250YWluZXIsIG9yIG51bGwgaWYgdGhlCisJICogICBjb250YWluZXIgY291bGQgbm90IGJlIHJlc29sdmVkCisJICovCisJcHVibGljIGFic3RyYWN0IElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIGlkKTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvRUpCQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9FSkJCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2ZTg3ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvRUpCQmVhbi5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOworLyoqCisgKiBBbiBFSkIgYmVhbi4KKyAqIDxwPgorICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKKyAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKKyAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAorICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwvcD4KKyAqIEBwbGFubmVkZm9yIDMuMAorICovCitwdWJsaWMgY2xhc3MgRUpCQmVhbiBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgeworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8xMSA9ICIxLjEiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8yMCA9ICIyLjAiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8yMSA9ICIyLjEiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8zMCA9ICIzLjAiOworCQorCXByaXZhdGUgU3RyaW5nIGpuZGlOYW1lOworCXByaXZhdGUgU3RyaW5nIGludGVyZmFjZU5hbWU7CisJcHJpdmF0ZSBib29sZWFuIGxvY2FsOworCXByaXZhdGUgYm9vbGVhbiByZW1vdGU7CisJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBFSkJCZWFuLgorCSAqIAorCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IHRoZSBFSkIgaXMgY29udGFpbmVkIGluCisJICogQHBhcmFtIGpuZGlOYW1lIHRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQgorCSAqIEBwYXJhbSByZW1vdGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEVKQiBoYXMgYSByZW1vdGUgaW50ZXJmYWNlLCBhbmQKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICogQHBhcmFtIGxvY2FsIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgbG9jYWwgaW50ZXJmYWNlLCBhbmQKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIEVKQkJlYW4oSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBqbmRpTmFtZSwgYm9vbGVhbiByZW1vdGUsIGJvb2xlYW4gbG9jYWwpIHsKKwkJc3VwZXIobW9kdWxlKTsKKwkJdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOworCQl0aGlzLnJlbW90ZSA9IHJlbW90ZTsKKwkJdGhpcy5sb2NhbCA9IGxvY2FsOworCQl0aGlzLnZlcnNpb24gPSAiMi4xIjsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IEVKQkJlYW4gd2l0aCBhIHNwZWNpZmljIHZlcnNpb24KKwkgKiAKKwkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdGhhdCB0aGUgRUpCIGlzIGNvbnRhaW5lZCBpbgorCSAqIEBwYXJhbSBqbmRpTmFtZSB0aGUgSk5ESSBuYW1lIG9mIHRoZSBFSkIKKwkgKiBAcGFyYW0gcmVtb3RlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgcmVtb3RlIGludGVyZmFjZSwgYW5kCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqIEBwYXJhbSBsb2NhbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgRUpCIGhhcyBhIGxvY2FsIGludGVyZmFjZSwgYW5kCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBsZXZlbCBvZiB0aGUgRUpCIHNwZWNpZmljYXRpb24gdGhhdCB0aGlzIEVKQiB1c2VzLiBVc2Ugb25lIG9mIHRoZSA8Y29kZT5FSkJfeHg8L2NvZGU+IGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgRUpCQmVhbn0KKwkgKi8KKwlwdWJsaWMgRUpCQmVhbihJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGpuZGlOYW1lLCBib29sZWFuIHJlbW90ZSwgYm9vbGVhbiBsb2NhbCwgU3RyaW5nIHZlcnNpb24pIHsKKwkJc3VwZXIobW9kdWxlKTsKKwkJdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOworCQl0aGlzLnJlbW90ZSA9IHJlbW90ZTsKKwkJdGhpcy5sb2NhbCA9IGxvY2FsOworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgRUpCQmVhbiB3aXRoIGl0cyBpbnRlcmZhY2UgbmFtZS4gVGhpcyBBUEkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlIGJ5IEVKQiAzLjAuCisJICogCisJICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRoYXQgdGhlIEVKQiBpcyBjb250YWluZWQgaW4KKwkgKiBAcGFyYW0gam5kaU5hbWUgdGhlIEpOREkgbmFtZSBvZiB0aGUgRUpCCisJICogQHBhcmFtIHJlbW90ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgRUpCIGhhcyBhIHJlbW90ZSBpbnRlcmZhY2UsIGFuZAorCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKiBAcGFyYW0gbG9jYWwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEVKQiBoYXMgYSBsb2NhbCBpbnRlcmZhY2UsIGFuZAorCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UgICAgCisJICogQHBhcmFtIHZlcnNpb24gdGhlIGxldmVsIG9mIHRoZSBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoaXMgRUpCIHVzZXMuIFVzZSBvbmUgb2YgdGhlIDxjb2RlPkVKQl94eDwvY29kZT4gY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBFSkJCZWFufQorCSAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIHRoZSBpbnRlcmZhY2UgbmFtZSBvZiB0aGUgRUpCCisJICovCisKKwlwdWJsaWMgRUpCQmVhbihJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGpuZGlOYW1lLCBib29sZWFuIHJlbW90ZSwgYm9vbGVhbiBsb2NhbCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CisJCXN1cGVyKG1vZHVsZSk7CisJCXRoaXMuam5kaU5hbWUgPSBqbmRpTmFtZTsKKwkJdGhpcy5yZW1vdGUgPSByZW1vdGU7CisJCXRoaXMubG9jYWwgPSBsb2NhbDsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwkJdGhpcy5pbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgZW1wdHkgRUpCQmVhbi4KKwkgKi8KKwlwdWJsaWMgRUpCQmVhbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Sm5kaU5hbWUoKSB7CisJCXJldHVybiBqbmRpTmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEVKQiBoYXMgYSByZW1vdGUgaW50ZXJmYWNlLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEVKQiBoYXMgYSByZW1vdGUgaW50ZXJmYWNlLCBhbmQKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzUmVtb3RlSW50ZXJmYWNlKCkgeworCQlyZXR1cm4gcmVtb3RlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgRUpCIGhhcyBhIGxvY2FsIGludGVyZmFjZS4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgbG9jYWwgaW50ZXJmYWNlLCBhbmQKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzTG9jYWxJbnRlcmZhY2UoKSB7CisJCXJldHVybiBsb2NhbDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbGV2ZWwgb2YgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIEVKQgorCSAqCisJICogQHJldHVybiB0aGUgbGV2ZWwgb2YgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIEVKQgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKwkJcmV0dXJuIHZlcnNpb247CisJfQorCisJLyoKKwkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlTdHJpbmcgZWpiTmFtZTsKKwkJLy8gRUpCIDIuMCBkb24ndCBoYXZlIGFuIGludGVmYWNlIG5hbWUsIGJ1dCB0aGV5IHNldCB0aGUgam5kaSBuYW1lCisJCWlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIShpbnRlcmZhY2VOYW1lLmxlbmd0aCgpPD0wKSl7CisJCQllamJOYW1lID0gaW50ZXJmYWNlTmFtZTsKKwkJfQorCQllbHNleworCQkJZWpiTmFtZSA9IGpuZGlOYW1lOworCQl9CisJCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdEVKQiwgZWpiTmFtZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZGVzZXJpYWxpemUoU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFN0cmluZyBzKSB7CisJCWludCBpbmQgPSBzLmluZGV4T2YoIi8vIik7CisJCXN1cGVyLmRlc2VyaWFsaXplKHMuc3Vic3RyaW5nKDAsIGluZCkpOworCQlpZiAoJ1QnID09IHMuY2hhckF0KGluZCsyKSkKKwkJCWxvY2FsID0gdHJ1ZTsKKwkJZWxzZQorCQkJbG9jYWwgPSBmYWxzZTsKKwkJaWYgKCdUJyA9PSBzLmNoYXJBdChpbmQrMykpCisJCQlyZW1vdGUgPSB0cnVlOworCQllbHNlCisJCQlyZW1vdGUgPSBmYWxzZTsKKwkJam5kaU5hbWUgPSBzLnN1YnN0cmluZyhpbmQrNCk7CisJfQorCisJLyoKKwkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjc2VyaWFsaXplKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZSgpIHsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5zZXJpYWxpemUoKSk7CisJCXNiLmFwcGVuZCgiLy8iKTsKKwkJaWYgKGxvY2FsKQorCQkJc2IuYXBwZW5kKCJUIik7CisJCWVsc2UKKwkJCXNiLmFwcGVuZCgiRiIpOworCQlpZiAocmVtb3RlKQorCQkJc2IuYXBwZW5kKCJUIik7CisJCWVsc2UKKwkJCXNiLmFwcGVuZCgiRiIpOworCQlzYi5hcHBlbmQoam5kaU5hbWUpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBHZXRzIHRoZSBuYW1lIG9mIGludGVyZmFjZSByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCAKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCkgeworCQlyZXR1cm4gaW50ZXJmYWNlTmFtZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9GYWNldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvRmFjZXRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxZGM3OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvRmFjZXRVdGlsLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBmYWNldCBydW50aW1lcyBhbmQgc2VydmVyIHJ1bnRpbWVzLgorICogPHA+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgorICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgorICogPC9wPgorICogPHA+CisgKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAorICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAorICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCisgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRVdGlsIHsKKwkvKioKKwkgKiBTdGF0aWMgdXRpbGl0eSBjbGFzcyAtIGNhbm5vdCBjcmVhdGUgYW4gaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBGYWNldFV0aWwoKSB7CisJCS8vIGNhbid0IGNyZWF0ZQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNlcnZlciBydW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBmYWNldCBydW50aW1lLCBvciBudWxsCisJICogaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZSBhIGZhY2V0IHJ1bnRpbWUKKwkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgcnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBmYWNldCBydW50aW1lLCBvcgorCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY291bGQgYmUgZm91bmQuCisJICovCisJcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRSdW50aW1lKG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgcnVudGltZSkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0cy5GYWNldFV0aWwuZ2V0UnVudGltZShydW50aW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWNldCBydW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzZXJ2ZXIgcnVudGltZSwgb3IgbnVsbAorCSAqIGlmIG5vbmUgY291bGQgYmUgZm91bmQuCisJICogCisJICogQHBhcmFtIHJ1bnRpbWUgYSBzZXJ2ZXIgcnVudGltZQorCSAqIEByZXR1cm4gdGhlIGZhY2V0IHJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc2VydmVyIHJ1bnRpbWUsIG9yCisJICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgZ2V0UnVudGltZShJUnVudGltZSBydW50aW1lKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzLkZhY2V0VXRpbC5nZXRSdW50aW1lKHJ1bnRpbWUpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHdoZXRoZXIgdGhlIGZhY2V0cyBvbiBhIHByb2plY3QgYXJlIHN1cHBvcnRlZCBieSBhIGdpdmVuIHNlcnZlci4gUmV0dXJucworCSAqIGFuIE9LIHN0YXR1cyBpZiB0aGUgc2VydmVyJ3MgcnVudGltZSBzdXBwb3J0cyB0aGUgcHJvamVjdCdzIGZhY2V0cywgYW5kIGFuCisJICogRVJST1Igc3RhdHVzICh3aXRoIG1lc3NhZ2UpIGlmIGl0IGRvZXNuJ3QuCisJICogCisJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CisJICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgorCSAqIEByZXR1cm4gT0sgc3RhdHVzIGlmIHRoZSBzZXJ2ZXIncyBydW50aW1lIHN1cHBvcnRzIHRoZSBwcm9qZWN0J3MgZmFjZXRzLCBhbmQgYW4KKwkgKiAgICBFUlJPUiBzdGF0dXMgKHdpdGggbWVzc2FnZSkgaWYgaXQgZG9lc24ndAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyB2ZXJpZnlGYWNldHMoSVByb2plY3QgcHJvamVjdCwgSVNlcnZlciBzZXJ2ZXIpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5mYWNldHMuRmFjZXRVdGlsLnZlcmlmeUZhY2V0cyhwcm9qZWN0LCBzZXJ2ZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lBcHBsaWNhdGlvbkNsaWVudE1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JQXBwbGljYXRpb25DbGllbnRNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzU3MGUxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JQXBwbGljYXRpb25DbGllbnRNb2R1bGUuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOworLyoqCisgKiBBIEoyRUUgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZS4KKyAqIDxwPgorICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKKyAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKKyAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAorICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwvcD4KKyAqIEBwbGFubmVkZm9yIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElBcHBsaWNhdGlvbkNsaWVudE1vZHVsZSBleHRlbmRzIElKMkVFTW9kdWxlIHsKKwkvLyBpbnRlbnRpb25hbGx5IGVtcHR5Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JQ29ubmVjdG9yTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lDb25uZWN0b3JNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODM2NzI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JQ29ubmVjdG9yTW9kdWxlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKKy8qKgorICogQSBKMkVFIGNvbm5lY3RvciBtb2R1bGUuCisgKiA8cD4KKyAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCisgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCisgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKKyAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiA8L3A+CisgKiBAcGxhbm5lZGZvciAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29ubmVjdG9yTW9kdWxlIGV4dGVuZHMgSUoyRUVNb2R1bGUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBhcyBhbiBhcnJheSBvZiBhYnNvbHV0ZSBJUGF0aHMuCisJICogCisJICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcworCSAqLworCXB1YmxpYyBJUGF0aFtdIGdldENsYXNzcGF0aCgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVKQk1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JRUpCTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxMDY1NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVKQk1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7CisvKioKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIEVKQiBtb2R1bGUuCisgKiA8cD4KKyAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCisgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCisgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKKyAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiA8L3A+CisgKiBAcGxhbm5lZGZvciAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJRUpCTW9kdWxlIGV4dGVuZHMgSUoyRUVNb2R1bGUgeworCS8vIGludGVudGlvbmFsbHkgZW1wdHkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lFbnRlcnByaXNlQXBwbGljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVudGVycHJpc2VBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTFkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lFbnRlcnByaXNlQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKKy8qKgorICogQSByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiAoRUFSIGZpbGUpLgorICogPHA+CisgKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAorICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAorICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCisgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPC9wPgorICogQHBsYW5uZWRmb3IgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUVudGVycHJpc2VBcHBsaWNhdGlvbiB7CisJLyoqCisJICogUmV0dXJucyB0aGUgbW9kdWxlcyBjb250YWluZWQgd2l0aGluIHRoaXMgRUFSLiBUaGUgcmV0dXJuZWQgbW9kdWxlcyB3aWxsCisJICogZWl0aGVyIGJlIEoyRUUgbW9kdWxlcyAod2hpY2ggd2lsbCBiZSBhZGFwdGFibGUgdG8gSUoyRUVNb2R1bGUpIG9yCisJICogdXRpbGl0eSBqYXJzIGNvbnRhaW5lZCBpbiB0aGUgRUFSLgorCSAqIAorCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbgorCSAqLworCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgVVJJIG9mIHRoZSBnaXZlbiBtb2R1bGUgd2l0aGluIHRoaXMgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uCisJICogQHJldHVybiB0aGUgVVJJIG9mIHRoZSBnaXZlbiBtb2R1bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBVUkkgY291bGQKKwkgKiAgICBub3QgYmUgZm91bmQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVSSShJTW9kdWxlIG1vZHVsZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlcnMgZm9yIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBtb2R1bGUuCisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJlc291cmNlIGZvbGRlcnMKKwkgKi8KKwlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFJlc291cmNlRm9sZGVycygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUoyRUVNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUoyRUVNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQ5NzRiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JSjJFRU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworLyoqCisgKiBBIEoyRUUgbW9kdWxlIHRoYXQgY2FuIGJlIGRlcGxveWVkIHRvIGEgc2VydmVyLgorICogCisgKiA8cD4KKyAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCisgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCisgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKKyAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiA8L3A+CisgKiBAcGxhbm5lZGZvciAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJSjJFRU1vZHVsZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGZvciB0aGUgcmVzb3VyY2VzIGluIHRoaXMgbW9kdWxlLiBSZXR1cm5zIGFuIGVtcHR5CisJICogYXJyYXkgaWYgdGhpcyBpcyBhIGJpbmFyeSBtb2R1bGUuCisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJlc291cmNlIGZvbGRlcnMKKwkgKi8KKwlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFJlc291cmNlRm9sZGVycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGNvbnRhaW5pbmcgSmF2YSBvdXRwdXQgaW4gdGhpcyBtb2R1bGUuIFJldHVybnMgYW4KKwkgKiBlbXB0eSBhcnJheSBpZiB0aGlzIGlzIGEgYmluYXJ5IG1vZHVsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgSmF2YSBvdXRwdXQgZm9sZGVycworCSAqLworCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgYmluYXJ5ICh6aXBwZWQpIG1vZHVsZSwgYW5kCisJICogZmFsc2UgaWYgaXQgaXMgZXhwYW5kZWQuCisJICogCisJICogPHA+SWYgdHJ1ZSwgbWVtYmVycygpIHNob3VsZCByZXR1cm4gb25seSBhIHNpbmdsZSBlbGVtZW50IC0KKwkgKiB0aGUgYmluYXJ5IChqYXIgb3IgemlwIGZpbGUpIHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mCisJICogdGhpcyBtb2R1bGUuIChhIHNpbmdsZSBJTW9kdWxlUmVzb3VyY2UsIGUuZy4KKwkgKiBteWVqYi5qYXIpIEFsc28sIGdldExvY2F0aW9uKCkgc2hvdWxkIHJldHVybiB0aGUgZnVsbCBwYXRoCisJICogdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgYmluYXJ5IGl0c2VsZi4gKGUuZy4KKwkgKiBjOlx0ZW1wXG15ZWpiLmphcik8L3A+CisJICogCisJICogPHA+SWYgZmFsc2UsIG1lbWJlcnMoKSBzaG91bGQgcmV0dXJuIHRoZSBlbnRpcmUgY29udGVudHMKKwkgKiBvZiB0aGUgbW9kdWxlLCBzdGFydGluZyBhdCB0aGUgcm9vdC4gVGhlcmUgc2hvdWxkIGJlIG5vCisJICogcHJlY2VlZGluZyBkaXJlY3Rvcnkgc3RydWN0dXJlLiAoYW4gYXJyYXkgb2YKKwkgKiBJTW9kdWxlUmVzb3VyY2VzLCBlLmcuIGluZGV4Lmh0bWwsIFdFQi1JTkYvd2ViLnhtbCwKKwkgKiAuLi4pIEluIHRoaXMgY2FzZSwgZ2V0TG9jYXRpb24oKSBzaG91bGQgcmV0dXJuIHRoZSBwYXRoIHRvCisJICogdGhlIHJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgdGhlc2UgcmVzb3VyY2VzLjwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUphdmFSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKYXZhUnVudGltZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTE2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKYXZhUnVudGltZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7CisvKioKKyAqIEFuIGludGVyZmFjZSBmb3IgYSBzZXJ2ZXIgdGhhdCBjb250YWlucyBhIEphdmEgcnVudGltZS4KKyAqIDxwPgorICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KKyAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaworICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KKyAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiA8L3A+CisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFSdW50aW1lIHsKKwkvKioKKwkgKiBSZXR1cm4gdGhlIFZNIGluc3RhbGwgKGluc3RhbGxlZCBKUkUpIHRoYXQgdGhpcyBydW50aW1lIGlzIHVzaW5nLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgVk0gaW5zdGFsbAorCSAqLworCXB1YmxpYyBJVk1JbnN0YWxsIGdldFZNSW5zdGFsbCgpOworCisJLyoqCisJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcnVudGltZSBpcyB1c2luZyB0aGUgZGVmYXVsdCBKUkUuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcnVudGltZSBpcyB1c2luZyB0aGUgZGVmYXVsdCBKUkUsCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNVc2luZ0RlZmF1bHRKUkUoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKYXZhUnVudGltZVdvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKYXZhUnVudGltZVdvcmtpbmdDb3B5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjNjI3YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUphdmFSdW50aW1lV29ya2luZ0NvcHkuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOworLyoqCisgKiBBbiBpbnRlcmZhY2UgZm9yIGEgc2VydmVyIHRoYXQgY29udGFpbnMgYSBKYXZhIHJ1bnRpbWUuCisgKiA8cD4KKyAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCisgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKKyAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCisgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPC9wPgorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElKYXZhUnVudGltZVdvcmtpbmdDb3B5IGV4dGVuZHMgSUphdmFSdW50aW1lIHsKKwkvKioKKwkgKiBTZXQgdGhlIFZNIGluc3RhbGwgKGluc3RhbGxlZCBKUkUpIHRoYXQgdGhpcyBydW50aW1lIGlzIHVzaW5nLgorCSAqIFVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIEVjbGlwc2UgZGVmYXVsdCBKUkUuCisJICogCisJICogQHBhcmFtIHZtSW5zdGFsbCB0aGUgVk0gaW5zdGFsbCB0byB1c2UKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWTUluc3RhbGwoSVZNSW5zdGFsbCB2bUluc3RhbGwpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSVV0aWxpdHlNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSVV0aWxpdHlNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDEzZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JVXRpbGl0eU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworLyoqCisgKiBBIEoyRUUgdXRpbGl0eSBtb2R1bGUgdGhhdCBjYW4gYmUgZGVwbG95ZWQgdG8gYSBzZXJ2ZXIuCisgKiAKKyAqIDxwPgorICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKKyAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKKyAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAorICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwvcD4KKyAqIEBwbGFubmVkZm9yIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElVdGlsaXR5TW9kdWxlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlcnMgZm9yIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBtb2R1bGUuCisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJlc291cmNlIGZvbGRlcnMKKwkgKi8KKwlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFJlc291cmNlRm9sZGVycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGNvbnRhaW5pbmcgSmF2YSBvdXRwdXQgaW4gdGhpcyBtb2R1bGUuCisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIEphdmEgb3V0cHV0IGZvbGRlcnMKKwkgKi8KKwlwdWJsaWMgSUNvbnRhaW5lcltdIGdldEphdmFPdXRwdXRGb2xkZXJzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGJpbmFyeSAoemlwcGVkKSBtb2R1bGUsIGFuZAorCSAqIGZhbHNlIGlmIGl0IGlzIGV4cGFuZGVkLgorCSAqIAorCSAqIDxwPklmIHRydWUsIG1lbWJlcnMoKSBzaG91bGQgcmV0dXJuIG9ubHkgYSBzaW5nbGUgZWxlbWVudCAtCisJICogdGhlIGJpbmFyeSAoamFyIG9yIHppcCBmaWxlKSB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZgorCSAqIHRoaXMgbW9kdWxlLiAoYSBzaW5nbGUgSU1vZHVsZVJlc291cmNlLCBlLmcuCisJICogbXllamIuamFyKSBBbHNvLCBnZXRMb2NhdGlvbigpIHNob3VsZCByZXR1cm4gdGhlIGZ1bGwgcGF0aAorCSAqIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGJpbmFyeSBpdHNlbGYuIChlLmcuCisJICogYzpcdGVtcFxteWVqYi5qYXIpPC9wPgorCSAqIAorCSAqIDxwPklmIGZhbHNlLCBtZW1iZXJzKCkgc2hvdWxkIHJldHVybiB0aGUgZW50aXJlIGNvbnRlbnRzCisJICogb2YgdGhlIG1vZHVsZSwgc3RhcnRpbmcgYXQgdGhlIHJvb3QuIFRoZXJlIHNob3VsZCBiZSBubworCSAqIHByZWNlZWRpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZS4gKGFuIGFycmF5IG9mCisJICogSU1vZHVsZVJlc291cmNlcywgZS5nLiBpbmRleC5odG1sLCBXRUItSU5GL3dlYi54bWwsCisJICogLi4uKSBJbiB0aGlzIGNhc2UsIGdldExvY2F0aW9uKCkgc2hvdWxkIHJldHVybiB0aGUgcGF0aCB0bworCSAqIHRoZSByb290IGZvbGRlciBjb250YWluaW5nIHRoZXNlIHJlc291cmNlcy48L3A+CisJICogCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCaW5hcnkoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lXZWJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSVdlYk1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjIwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lXZWJNb2R1bGUuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CisvKioKKyAqIEEgSjJFRSB3ZWIgbW9kdWxlLgorICogPHA+CisgKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAorICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAorICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCisgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPC9wPgorICogQHBsYW5uZWRmb3IgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVdlYk1vZHVsZSBleHRlbmRzIElKMkVFTW9kdWxlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb250ZXh0IHJvb3Qgb2YgdGhlIG1vZHVsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbnRleHRSb290KCk7CisJCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbnRleHQgcm9vdCBvZiB0aGUgbW9kdWxlLiBJZiB0aGUgdGhlIHdlYk1vZHVsZSBiZWxvbmdzIHRvIGFuIGVhck1vZHVsZSwgdGhlIGNvbnRleHQgcm9vdCB3aXRoIGhpZ2hlcgorCSAqIHByZXNlZGVuY2Ugd2lsbCBiZSByZXR1cm5lZC4gICAKKwkgKiAKKwkgKiBAcGFyYW0gZWFyTW9kdWxlIFRoZSBFQVJNb2R1bGUgaWYgZXhpc3QsIGlmIG5vdCBudWxsCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250ZXh0Um9vdChJTW9kdWxlIGVhck1vZHVsZSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdXRpbGl0eSBtb2R1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBXQVIuCisJICoKKwkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgbW9kdWxlcyBjb250YWluZWQgd2l0aGluIHRoaXMgYXBwbGljYXRpb24KKwkgKi8KKwlwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIFVSSSBvZiB0aGUgZ2l2ZW4gY29udGFpbmVkIG1vZHVsZS4KKwkgKgorCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKKwkgKiBAcmV0dXJuIHRoZSBVUkkgb2YgdGhlIGdpdmVuIG1vZHVsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIFVSSSBjb3VsZAorCSAqICAgIG5vdCBiZSBmb3VuZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKElNb2R1bGUgbW9kdWxlKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0puZGlMYXVuY2hhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0puZGlMYXVuY2hhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1MzA0YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaUxhdW5jaGFibGUuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisvKioKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGluIEpOREkgdGhhdCBjYW4gYmUgdGVzdGVkIG9uIGEgc2VydmVyLgorICogPHA+CisgKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAorICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAorICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCisgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPC9wPgorICogQHBsYW5uZWRmb3IgMy4wCisgKi8KK3B1YmxpYyBjbGFzcyBKbmRpTGF1bmNoYWJsZSB7CisJcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzOworCXByaXZhdGUgU3RyaW5nIGpuZGlOYW1lOworCisJLyoqCisJICogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB0aGF0IGlzIGxhdW5jaGFibGUgdmlhIEpOREkuCisJICogCisJICogQHBhcmFtIHByb3BzIHRoZSBKTkRJIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gY29ubmVjdCB0byB0aGUgb2JqZWN0CisJICogQHBhcmFtIGpuZGlOYW1lIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdAorCSAqLworCXB1YmxpYyBKbmRpTGF1bmNoYWJsZShQcm9wZXJ0aWVzIHByb3BzLCBTdHJpbmcgam5kaU5hbWUpIHsKKwkJdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOworCQl0aGlzLnByb3BzID0gcHJvcHM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgSk5ESSBwcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIGNvbm5lY3QgdG8gdGhlIG9iamVjdC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBKTkRJIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gY29ubmVjdCB0byB0aGUgb2JqZWN0CisJICovCisJcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHByb3BzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIEpOREkgbmFtZSBvZiB0aGUgb2JqZWN0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIEpOREkgbmFtZSBvZiB0aGUgb2JqZWN0CisJICovCisJcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZSgpIHsKKwkJcmV0dXJuIGpuZGlOYW1lOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0puZGlPYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaU9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMmU5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0puZGlPYmplY3QuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOworLyoqCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCBpbiBKTkRJIHRoYXQgY2FuIGJlIHRlc3RlZCBvbiBhIHNlcnZlci4KKyAqIDxwPgorICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKKyAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKKyAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAorICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwvcD4KKyAqIEBwbGFubmVkZm9yIDMuMAorICovCitwdWJsaWMgY2xhc3MgSm5kaU9iamVjdCBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgeworCXByaXZhdGUgU3RyaW5nIGpuZGlOYW1lOworCisJLyoqCisJICogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBpbiBKTkRJLgorCSAqIAorCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IHRoZSBvYmplY3QgaXMgY29udGFpbmVkIGluCisJICogQHBhcmFtIGpuZGlOYW1lIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdAorCSAqLworCXB1YmxpYyBKbmRpT2JqZWN0KElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgam5kaU5hbWUpIHsKKwkJc3VwZXIobW9kdWxlKTsKKwkJdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhbiBlbXB0eSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGluIEpOREkuCisJICovCisJcHVibGljIEpuZGlPYmplY3QoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Sm5kaU5hbWUoKSB7CisJCXJldHVybiBqbmRpTmFtZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNnZXROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdEpOREksIGpuZGlOYW1lKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNkZXNlcmlhbGl6ZShTdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHMpIHsKKwkJaW50IGluZCA9IHMuaW5kZXhPZigiLy8iKTsKKwkJc3VwZXIuZGVzZXJpYWxpemUocy5zdWJzdHJpbmcoMCwgaW5kKSk7CisJCWpuZGlOYW1lID0gcy5zdWJzdHJpbmcoaW5kKzIpOworCX0KKworCS8qCisJICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI3NlcmlhbGl6ZSgpCisJICovCisJcHVibGljIFN0cmluZyBzZXJpYWxpemUoKSB7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuc2VyaWFsaXplKCkpOworCQlzYi5hcHBlbmQoIi8vIik7CisJCXNiLmFwcGVuZChqbmRpTmFtZSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1B1Ymxpc2hVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1B1Ymxpc2hVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0YTE1YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvUHVibGlzaFV0aWwuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSmF2YVNlcnZlclBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHdpdGggYW4gYXNzb3J0bWVudCBvZiB1c2VmdWwgZmlsZSBtZXRob2RzLgorICogPHA+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgorICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgorICogPC9wPgorICogPHA+CisgKiA8Yj5Ob3RlOjwvYj4gQWRvcHRlcnMgc2hvdWxkIHVzZSB0aGUgZXF1aXZhbGVudCBjbGFzcyBpbgorICogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwgaW5zdGVhZC4gVGhpcyBjbGFzcyB3aWxsIGV2ZW50dWFsbHkKKyAqIGJlIGRlcHJlY2F0ZWQuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoVXRpbCB7CisJLy8gc2l6ZSBvZiB0aGUgYnVmZmVyCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUiA9IDY1NTM2OworCisJLy8gdGhlIGJ1ZmZlcgorCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJdOworCisJLyoqCisJICogUHVibGlzaFV0aWwgY2Fubm90IGJlIGNyZWF0ZWQuIFVzZSBzdGF0aWMgbWV0aG9kcy4KKwkgKi8KKwlwcml2YXRlIFB1Ymxpc2hVdGlsKCkgeworCQkvLyBjYW4ndCBjcmVhdGUKKwl9CisKKwkvKioKKwkgKiBDb3B5IGEgZmlsZSBmcm9tIGEgdG8gYi4gQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgdXNlLgorCSAqCisJICogQHBhcmFtIGluIGphdmEuaW8uSW5wdXRTdHJlYW0KKwkgKiBAcGFyYW0gdG8gamF2YS5sYW5nLlN0cmluZworCSAqIEBkZXByZWNhdGVkIFVudXNlZCAtIHdpbGwgYmUgcmVtb3ZlZC4KKwkgKiBAcmV0dXJuIGEgc3RhdHVzCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgdG8pIHsKKwkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisJCQorCQl0cnkgeworCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG8pOworCQkJCisJCQlpbnQgYXZhaWwgPSBpbi5yZWFkKGJ1Zik7CisJCQl3aGlsZSAoYXZhaWwgPiAwKSB7CisJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgYXZhaWwpOworCQkJCWF2YWlsID0gaW4ucmVhZChidWYpOworCQkJfQorCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb3B5aW5nIGZpbGUiLCBlKTsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvcHlpbmdGaWxlLCBuZXcgU3RyaW5nW10ge3RvLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJaWYgKGluICE9IG51bGwpCisJCQkJCWluLmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJCXRyeSB7CisJCQkJaWYgKG91dCAhPSBudWxsKQorCQkJCQlvdXQuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogU21hcnQgY29weSB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcyB0byB0aGUgZ2l2ZW4gcGF0aC4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICogQHBhcmFtIHBhdGgKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgb25seSByZXR1cm5zIGEgc2luZ2xlIGVycm9yIGluIHRoZSBjYXNlIG9mIGZhaWx1cmUuIFVzZSBwdWJsaXNoU21hcnQoKSBpbnN0ZWFkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzbWFydENvcHkoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVN0YXR1c1tdIHN0YXR1cyA9IFB1Ymxpc2hVdGlsLnB1Ymxpc2hTbWFydChyZXNvdXJjZXMsIHBhdGgsIG1vbml0b3IpOworCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmxlbmd0aCA+IDApCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXNbMF0pOworCX0KKworCS8qKgorCSAqIEhhbmRsZSBhIGRlbHRhIHB1Ymxpc2guCisJICogCisJICogQHBhcmFtIGtpbmQKKwkgKiBAcGFyYW0gcGF0aAorCSAqIEBwYXJhbSBkZWx0YQorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIG9ubHkgcmV0dXJucyBhIHNpbmdsZSBlcnJvciBpbiB0aGUgY2FzZSBvZiBmYWlsdXJlLiBVc2UgcHVibGlzaERlbHRhKCkgaW5zdGVhZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlRGVsdGEoaW50IGtpbmQsIElQYXRoIHBhdGgsIElNb2R1bGVSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5wdWJsaXNoRGVsdGEoZGVsdGEsIHBhdGgsIG51bGwpOworCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmxlbmd0aCA+IDApCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXNbMF0pOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXRoCisJICogQHBhcmFtIGZpbGUKKwkgKiBAZGVwcmVjYXRlZCBkb2VzIG5vdCBmYWlsIG9yIHJldHVybiBzdGF0dXMgaWYgZGVsZXRlIGRvZXNuJ3Qgd29yaworCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkZWxldGVGaWxlKElQYXRoIHBhdGgsIElNb2R1bGVGaWxlIGZpbGUpIHsKKwkJVHJhY2UudHJhY2UoVHJhY2UuUFVCTElTSElORywgIkRlbGV0aW5nOiAiICsgZmlsZS5nZXROYW1lKCkgKyAiIGZyb20gIiArIHBhdGgudG9TdHJpbmcoKSk7CisJCUlQYXRoIHBhdGgyID0gcGF0aC5hcHBlbmQoZmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkuYXBwZW5kKGZpbGUuZ2V0TmFtZSgpKTsKKwkJcGF0aDIudG9GaWxlKCkuZGVsZXRlKCk7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIHJlc291cmNlcworCSAqIEBwYXJhbSBwYXRoCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgb25seSByZXR1cm5zIGEgc2luZ2xlIGVycm9yIGluIHRoZSBjYXNlIG9mIGZhaWx1cmUuIFVzZSBwdWJsaXNoRnVsbCgpIGluc3RlYWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY29weShJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVN0YXR1c1tdIHN0YXR1cyA9IFB1Ymxpc2hVdGlsLnB1Ymxpc2hGdWxsKHJlc291cmNlcywgcGF0aCwgbnVsbCk7CisJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMubGVuZ3RoID4gMCkKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1c1swXSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB6aXAgZmlsZSBjb250YWluaW5nIHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzLiBEZWxldGVzIHRoZSBleGlzdGluZyBmaWxlCisJICogKGFuZCBkb2Vzbid0IGNyZWF0ZSBhIG5ldyBvbmUpIGlmIHJlc291cmNlcyBpcyBudWxsIG9yIGVtcHR5LgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkgKiBAcGFyYW0gemlwUGF0aAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVaaXBGaWxlKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggemlwUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJU3RhdHVzW10gc3RhdHVzID0gUHVibGlzaFV0aWwucHVibGlzaFppcChyZXNvdXJjZXMsIHppcFBhdGgsIG51bGwpOworCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmxlbmd0aCA+IDApCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXNbMF0pOworCX0KKworCS8qKgorCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeS4KKwkgKgorCSAqIEBwYXJhbSBkaXIgYSBkaXJlY3RvcnkKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cworCSAqLworCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoVXRpbC5kZWxldGVEaXJlY3RvcnkoZGlyLCBtb25pdG9yKTsKKwl9CisKKwkvKioKKwkgKiBTbWFydCBjb3B5IHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzIHRvIHRoZSBnaXZlbiBwYXRoLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcworCSAqIEBwYXJhbSBwYXRoIGFuIGV4dGVybmFsIHBhdGggdG8gY29weSB0bworCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzIAorCSAqLworCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIHB1Ymxpc2hTbWFydChJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaFV0aWwucHVibGlzaFNtYXJ0KHJlc291cmNlcywgcGF0aCwgbW9uaXRvcik7CisJfQorCisJLyoqCisJICogSGFuZGxlIGEgZGVsdGEgcHVibGlzaC4KKwkgKiAKKwkgKiBAcGFyYW0gZGVsdGEgYSBtb2R1bGUgcmVzb3VyY2UgZGVsdGEKKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBwdWJsaXNoIHRvCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcworCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAorCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoRGVsdGEoSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoVXRpbC5wdWJsaXNoRGVsdGEoZGVsdGEsIHBhdGgsIG1vbml0b3IpOworCX0KKworCS8qKgorCSAqIEhhbmRsZSBhIGRlbHRhIHB1Ymxpc2guCisJICogCisJICogQHBhcmFtIGRlbHRhIGEgbW9kdWxlIHJlc291cmNlIGRlbHRhCisJICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gcHVibGlzaCB0bworCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzW10gcHVibGlzaERlbHRhKElNb2R1bGVSZXNvdXJjZURlbHRhIGRlbHRhLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsLnB1Ymxpc2hEZWx0YShkZWx0YSwgcGF0aCwgbW9uaXRvcik7CisJfQorCisJLyoqCisJICogUHVibGlzaCB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcyB0byB0aGUgZ2l2ZW4gcGF0aC4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKKwkgKiBAcGFyYW0gcGF0aCBhIHBhdGggdG8gcHVibGlzaCB0bworCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzW10gcHVibGlzaEZ1bGwoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsLnB1Ymxpc2hGdWxsKHJlc291cmNlcywgcGF0aCwgbW9uaXRvcik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB6aXAgZmlsZSBjb250YWluaW5nIHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzLiBEZWxldGVzIHRoZSBleGlzdGluZyBmaWxlCisJICogKGFuZCBkb2Vzbid0IGNyZWF0ZSBhIG5ldyBvbmUpIGlmIHJlc291cmNlcyBpcyBudWxsIG9yIGVtcHR5LgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcworCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHdoZXJlIHRoZSB6aXAgZmlsZSBzaG91bGQgYmUgY3JlYXRlZCAKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cworCSAqLworCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIHB1Ymxpc2haaXAoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsLnB1Ymxpc2haaXAocmVzb3VyY2VzLCBwYXRoLCBtb25pdG9yKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjQwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlLmphdmEKQEAgLTAsMCArMSwzNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1lbWVudG87CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLkphdmFTZXJ2ZXJQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5YTUxNZW1lbnRvOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKKy8qKgorICogQSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBwcm92aWRlcyB0aGUgY2xhc3NwYXRoIGZvciBhIEphdmEgc2VydmVyIHJ1bnRpbWUuCisgKiBUaGlzIHByb3ZpZGVyIGlzIHNjb3BlZCBieSBydW50aW1lIHR5cGUgYW5kIG1heSBwcm92aWRlIHRoZSBjbGFzc3BhdGggZm9yIG11bHRpcGxlCisgKiBydW50aW1lIGluc3RhbmNlcy4KKyAqIDxwPgorICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKKyAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+cnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgorICogPC9wPgorICogPHA+CisgKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAorICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAorICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCisgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPC9wPgorICogCisgKiBAcGxhbm5lZGZvciAzLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIHsKKwlwcm90ZWN0ZWQgY2xhc3MgU291cmNlQXR0YWNobWVudFVwZGF0ZSB7CisJCVN0cmluZyBydW50aW1lSWQ7CisJCUlQYXRoIGVudHJ5OworCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aDsKKwkJSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoOworCQlJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cmlidXRlczsKKwl9CisKKwlwcml2YXRlIExpc3Q8U291cmNlQXR0YWNobWVudFVwZGF0ZT4gc291cmNlQXR0YWNobWVudHM7CisKKwlwcml2YXRlIFN0cmluZyBleHRlbnNpb25JZDsKKworCXByaXZhdGUgTWFwPFN0cmluZywgSVBhdGg+IHJ1bnRpbWVQYXRoTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJUGF0aD4oKTsKKworCXByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gcHJldmlvdXNDbGFzc3BhdGggPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisKKwlwdWJsaWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUoKSB7CisJCS8vIGRlZmF1bHQgY29uc3RydWN0b3IKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGlzIGNsYXNzcGF0aCBwcm92aWRlciB3aXRoIGl0cyBsaWZlLWxvbmcgaWQuCisJICogPHA+CisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsuCisJICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KKwkgKiA8L3A+CisJICogQHBhcmFtIGlkIHRoZSBleHRlbnNpb24gaWQKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBpbml0aWFsaXplKFN0cmluZyBpZCkgeworCQlleHRlbnNpb25JZCA9IGlkOworCX0KKworCS8qKgorCSAqIFJlc29sdmVzIChjcmVhdGVzIHRoZSBjbGFzc3BhdGggZW50cmllcyBmb3IpIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIHdpdGgKKwkgKiB0aGUgZ2l2ZW4gcnVudGltZSBhbmQgdGhlIGdpdmVuIGNsYXNzcGF0aCBjb250YWluZXIgaWQgKHJldHVybmVkIGZyb20KKwkgKiBnZXRDbGFzc3BhdGhFbnRyeUlkcygpKS4gSWYgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgY2Fubm90IGJlIHJlc29sdmVkCisJICogKGZvciBpbnN0YW5jZSwgaWYgdGhlIHJ1bnRpbWUgZG9lcyBub3QgZXhpc3QpLCByZXR1cm4gbnVsbC4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0byByZXNvbHZlIHRoZSBjb250YWluZXIgZm9yCisJICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlIGNvbnRhaW5lciwgb3IgbnVsbCBpZiB0aGUKKwkgKiAgIGNvbnRhaW5lciBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKKwkgKiBAZGVwcmVjYXRlZCB1c2UgcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUHJvamVjdCwgSVJ1bnRpbWUpIGluc3RlYWQKKwkgKi8KKwlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSBydW50aW1lKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJlc29sdmVzIChjcmVhdGVzIHRoZSBjbGFzc3BhdGggZW50cmllcyBmb3IpIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIHdpdGgKKwkgKiB0aGUgZ2l2ZW4gcnVudGltZSBhbmQgdGhlIGdpdmVuIGNsYXNzcGF0aCBjb250YWluZXIgaWQgKHJldHVybmVkIGZyb20KKwkgKiBnZXRDbGFzc3BhdGhFbnRyeUlkcygpKS4gSWYgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgY2Fubm90IGJlIHJlc29sdmVkCisJICogKGZvciBpbnN0YW5jZSwgaWYgdGhlIHJ1bnRpbWUgZG9lcyBub3QgZXhpc3QpLCByZXR1cm4gbnVsbC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0byByZXNvbHZlCisJICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdG8gcmVzb2x2ZSB0aGUgY29udGFpbmVyIGZvcgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBjb250YWluZXIsIG9yIG51bGwgaWYgdGhlCisJICogICBjb250YWluZXIgY291bGQgbm90IGJlIHJlc29sdmVkCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXNvbHZlIHRoZSBjbGFzc3BhdGggY29udGFpbmVyLgorCSAqIAorCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQorCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcworCSAqIEBkZXByZWNhdGVkIHNob3VsZCB1c2UgcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwoSVByb2plY3QsIElSdW50aW1lKSBpbnN0ZWFkCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKElSdW50aW1lIHJ1bnRpbWUpIHsKKwkJcmV0dXJuIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKG51bGwsIHJ1bnRpbWUpOworCX0KKworCS8qKgorCSAqIFJlc29sdmUgdGhlIGNsYXNzcGF0aCBjb250YWluZXIuCisJICogCisJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CisJICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCisJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUpIHsKKwkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOworCQlydW50aW1lUGF0aE1hcC5wdXQocnVudGltZS5nZXRJZCgpLCBydW50aW1lLmdldExvY2F0aW9uKCkpOworCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihwcm9qZWN0LCBydW50aW1lKTsKKwkJaWYgKGVudHJpZXMgPT0gbnVsbCkKKwkJCWVudHJpZXMgPSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKHJ1bnRpbWUpOworCQkKKwkJaWYgKGVudHJpZXMgPT0gbnVsbCkKKwkJCWVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOworCQkKKwkJaWYgKHNvdXJjZUF0dGFjaG1lbnRzID09IG51bGwpCisJCQlsb2FkKCk7CisJCQorCQlpbnQgc2l6ZSA9IGVudHJpZXMubGVuZ3RoOworCQlpbnQgc2l6ZTIgPSBzb3VyY2VBdHRhY2htZW50cy5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQlTb3VyY2VBdHRhY2htZW50VXBkYXRlIHNhdSA9IHNvdXJjZUF0dGFjaG1lbnRzLmdldChqKTsKKwkJCQlpZiAoc2F1LnJ1bnRpbWVJZC5lcXVhbHMocnVudGltZS5nZXRJZCgpKSAmJiBzYXUuZW50cnkuZXF1YWxzKGVudHJpZXNbaV0uZ2V0UGF0aCgpKSkgeworCQkJCQllbnRyaWVzW2ldID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGVudHJpZXNbaV0uZ2V0UGF0aCgpLCBzYXUuc291cmNlQXR0YWNobWVudFBhdGgsIHNhdS5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsIG5ldyBJQWNjZXNzUnVsZVswXSwgc2F1LmF0dHJpYnV0ZXMsIGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCVN0cmluZyBrZXkgPSBwcm9qZWN0LmdldE5hbWUoKSArICIvIiArIHJ1bnRpbWUuZ2V0SWQoKTsKKwkJaWYgKCFwcmV2aW91c0NsYXNzcGF0aC5jb250YWluc0tleShrZXkpKQorCQkJcHJldmlvdXNDbGFzc3BhdGgucHV0KGtleSwgbmV3IEludGVnZXIoZW50cmllcy5sZW5ndGgpKTsKKwkJZWxzZSB7CisJCQlJbnRlZ2VyIHByZXZpb3VzRW50cmllcyA9IHByZXZpb3VzQ2xhc3NwYXRoLmdldChrZXkpOworCQkJCisJCQlpZiAoKHByZXZpb3VzRW50cmllcyA9PSBudWxsKSB8fCAocHJldmlvdXNFbnRyaWVzLmludFZhbHVlKCkgIT0gZW50cmllcy5sZW5ndGgpKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQ2xhc3NwYXRoIHVwZGF0ZTogIiArIGtleSArICIgIiArIGVudHJpZXMpOworCQkJCXByZXZpb3VzQ2xhc3NwYXRoLnB1dChrZXksIG5ldyBJbnRlZ2VyKGVudHJpZXMubGVuZ3RoKSk7CisJCQkJCisJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuU0VSVkVSX0NPTlRBSU5FUik7CisJCQkJcGF0aCA9IHBhdGguYXBwZW5kKGV4dGVuc2lvbklkKS5hcHBlbmQocnVudGltZS5nZXRJZCgpKTsKKwkJCQl0cnkgeworCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisJCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihwYXRoLCBuZXcgSUphdmFQcm9qZWN0W10geyBqYXZhUHJvamVjdCB9LAorCQkJCQkJCW5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10geyBudWxsIH0sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciB1cGRhdGluZyBjbGFzc3BhdGgiLCBlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBlbnRyaWVzOworCX0KKworCS8qCisJICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyBpbiB0aGUgcnVudGltZSBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlCisJICogY2xhc3NwYXRoIHdhcyByZXNvbHZlZCB3aGljaCBtYXkgYWZmZWN0IHRoZSBjbGFzc3BhdGgsIGFuZCBmYWxzZSBvdGhlcndpc2UuIFRoaXMKKwkgKiBtZXRob2QgaXMgdXNlZCB0byBjaGVjayBwcm9qZWN0cyB3aGVuIGEgcnVudGltZSBjaGFuZ2VzIGFuZCBhdXRvbWF0aWNhbGx5IHJlYnVpbGQKKwkgKiB0aGVtIGlmIG5lY2Vzc2FyeS4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGFzc3BhdGggbWF5IGNoYW5nZSBkdWUgdG8gYSBjaGFuZ2UgaW4gdGhlIHJ1bnRpbWUsCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcworCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKKwkJdHJ5IHsKKwkJCUlQYXRoIHBhdGggPSBydW50aW1lUGF0aE1hcC5nZXQocnVudGltZS5nZXRJZCgpKTsKKwkJCXJldHVybiAocGF0aCAhPSBudWxsICYmICFwYXRoLmVxdWFscyhydW50aW1lLmdldExvY2F0aW9uKCkpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphckZpbGVzKEZpbGUgZGlyLCBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbGlzdCwgYm9vbGVhbiBpbmNsdWRlU3ViZGlyZWN0b3JpZXMpIHsKKwkJaW50IGRlcHRoID0gMDsKKwkJaWYgKGluY2x1ZGVTdWJkaXJlY3RvcmllcykKKwkJCWRlcHRoID0gMjsKKwkJYWRkSmFyRmlsZXMoZGlyLCBsaXN0LCBkZXB0aCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXJGaWxlcyhGaWxlIGRpciwgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGxpc3QsIGludCBkZXB0aCkgeworCQlpZiAoZGlyID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQorCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7CisJCWlmIChmaWxlcyAhPSBudWxsKSB7CisJCQlmb3IgKEZpbGUgZmlsZSA6IGZpbGVzKSB7CisJCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSAmJiBkZXB0aCA+IDApIHsKKwkJCQkJYWRkSmFyRmlsZXMoZmlsZSwgbGlzdCwgZGVwdGggLSAxKTsKKwkJCQl9IGVsc2UgaWYgKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi5qYXIiKSB8fCBmaWxlLmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKCIuemlwIikpIHsKKwkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJCQlsaXN0LmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgbnVsbCwgbnVsbCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEFkZCBsaWJyYXJ5IGVudHJpZXMgdG8gdGhlIGdpdmVuIGxpc3QgZm9yIGV2ZXJ5IGphciBmaWxlIGZvdW5kIGluIHRoZQorCSAqIGdpdmVuIGRpcmVjdG9yeS4gT3B0aW9uYWxseSBzZWFyY2ggc3ViZGlyZWN0b3JpZXMgYXMgd2VsbC4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdCBhIGxpc3QKKwkgKiBAcGFyYW0gZGlyIGEgZGlyZWN0b3J5CisJICogQHBhcmFtIGluY2x1ZGVTdWJkaXJlY3RvcmllcyA8Y29kZT50cnVlPC9jb2RlPiB0byBpbmNsdWRlIHN1YmRpcmVjdG9yaWVzLCBhbmQKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZExpYnJhcnlFbnRyaWVzKExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBsaXN0LCBGaWxlIGRpciwgYm9vbGVhbiBpbmNsdWRlU3ViZGlyZWN0b3JpZXMpIHsKKwkJaWYgKGRpciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQlhZGRKYXJGaWxlcyhkaXIsIGxpc3QsIGluY2x1ZGVTdWJkaXJlY3Rvcmllcyk7CisJfQorCisJLyoqCisJICogUmVxdWVzdCB0aGF0IHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGZvciB0aGUgZ2l2ZW4gcnVudGltZSBhbmQgaWQgYmUgdXBkYXRlZAorCSAqIHdpdGggdGhlIGdpdmVuIGNsYXNzcGF0aCBjb250YWluZXIgZW50cmllcy4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKKwkgKiBAcGFyYW0gZW50cmllcyBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcworCSAqLworCXB1YmxpYyB2b2lkIHJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoSVJ1bnRpbWUgcnVudGltZSwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgeworCQkvLyBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBzYXZlIHRoZSBzb3VyY2UgcGF0aCBlbnRyaWVzCisJCWlmIChydW50aW1lID09IG51bGwgfHwgZW50cmllcyA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJLy8gZmluZCB0aGUgc291cmNlIGF0dGFjaG1lbnRzCisJCXNvdXJjZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5TGlzdDxTb3VyY2VBdHRhY2htZW50VXBkYXRlPigpOworCQkKKwkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7CisJCQlpZiAoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSAhPSBudWxsIHx8IGVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpICE9IG51bGwpIHsKKwkJCQlTb3VyY2VBdHRhY2htZW50VXBkYXRlIHNhdSA9IG5ldyBTb3VyY2VBdHRhY2htZW50VXBkYXRlKCk7CisJCQkJc2F1LnJ1bnRpbWVJZCA9IHJ1bnRpbWUuZ2V0SWQoKTsKKwkJCQlzYXUuZW50cnkgPSBlbnRyeS5nZXRQYXRoKCk7CisJCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKKwkJCQlzYXUuc291cmNlQXR0YWNobWVudFJvb3RQYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCk7CisJCQkJc2F1LmF0dHJpYnV0ZXMgPSBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKKwkJCQlzb3VyY2VBdHRhY2htZW50cy5hZGQoc2F1KTsKKwkJCX0KKwkJfQorCQlzYXZlKCk7CisJfQorCisJLyoqCisJICogTG9hZCBzb3VyY2UgYXR0YWNobWVudCBpbmZvLgorCSAqLworCXByaXZhdGUgdm9pZCBsb2FkKCkgeworCQlzb3VyY2VBdHRhY2htZW50cyA9IG5ldyBBcnJheUxpc3Q8U291cmNlQXR0YWNobWVudFVwZGF0ZT4oKTsKKwkJCisJCVN0cmluZyBpZCA9IGV4dGVuc2lvbklkOworCQlTdHJpbmcgZmlsZW5hbWUgPSBKYXZhU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChpZCArICIueG1sIikudG9PU1N0cmluZygpOworCQlpZiAoIShuZXcgRmlsZShmaWxlbmFtZSkpLmV4aXN0cygpKQorCQkJcmV0dXJuOworCQkKKwkJdHJ5IHsKKwkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKKwkJCQorCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNvdXJjZS1hdHRhY2htZW50Iik7CisJCQlmb3IgKElNZW1lbnRvIGNoaWxkIDogY2hpbGRyZW4pIHsKKwkJCQl0cnkgeworCQkJCQlTb3VyY2VBdHRhY2htZW50VXBkYXRlIHNhdSA9IG5ldyBTb3VyY2VBdHRhY2htZW50VXBkYXRlKCk7CisJCQkJCXNhdS5ydW50aW1lSWQgPSBjaGlsZC5nZXRTdHJpbmcoInJ1bnRpbWUtaWQiKTsKKwkJCQkJU3RyaW5nIHRlbXAgPSBjaGlsZC5nZXRTdHJpbmcoImVudHJ5Iik7CisJCQkJCWlmICh0ZW1wICE9IG51bGwpCisJCQkJCQlzYXUuZW50cnkgPSBuZXcgUGF0aCh0ZW1wKTsKKwkJCQkJdGVtcCA9IGNoaWxkLmdldFN0cmluZygic291cmNlLWF0dGFjaG1lbnQtcGF0aCIpOworCQkJCQlpZiAodGVtcCAhPSBudWxsKQorCQkJCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoID0gbmV3IFBhdGgodGVtcCk7CisJCQkJCXRlbXAgPSBjaGlsZC5nZXRTdHJpbmcoInNvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aCIpOworCQkJCQlpZiAodGVtcCAhPSBudWxsKQorCQkJCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IG5ldyBQYXRoKHRlbXApOworCQkJCQlJTWVtZW50b1tdIGF0dHJDaGlsZHJlbiA9IGNoaWxkLmdldENoaWxkcmVuKCJhdHRyaWJ1dGUiKTsKKwkJCQkJaWYgKGF0dHJDaGlsZHJlbiAhPSBudWxsKSB7CisJCQkJCQlpbnQgc2l6ZTIgPSBhdHRyQ2hpbGRyZW4ubGVuZ3RoOworCQkJCQkJc2F1LmF0dHJpYnV0ZXMgPSBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtzaXplMl07CisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQkJCQlTdHJpbmcgbmFtZSA9IGF0dHJDaGlsZHJlbltqXS5nZXRTdHJpbmcoIm5hbWUiKTsKKwkJCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyQ2hpbGRyZW5bal0uZ2V0U3RyaW5nKCJ2YWx1ZSIpOworCQkJCQkJCXNhdS5hdHRyaWJ1dGVzW2pdID0gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlzb3VyY2VBdHRhY2htZW50cy5hZGQoc2F1KTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgc291cmNlIGF0dGFjaG1lbnQ6ICIgKyBlKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgc291cmNlIHBhdGggaW5mbyIsIGUpOworCQl9CisJfQorCisJLyoqCisJICogU2F2ZSBzb3VyY2UgYXR0YWNobWVudCBpbmZvLgorCSAqLworCXByaXZhdGUgdm9pZCBzYXZlKCkgeworCQlpZiAoc291cmNlQXR0YWNobWVudHMgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJU3RyaW5nIGlkID0gZXh0ZW5zaW9uSWQ7CisJCVN0cmluZyBmaWxlbmFtZSA9IEphdmFTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKGlkICsgIi54bWwiKS50b09TU3RyaW5nKCk7CisJCXRyeSB7CisJCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgiY2xhc3NwYXRoIik7CisKKwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc291cmNlQXR0YWNobWVudHMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlTb3VyY2VBdHRhY2htZW50VXBkYXRlIHNhdSA9IChTb3VyY2VBdHRhY2htZW50VXBkYXRlKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJzb3VyY2UtYXR0YWNobWVudCIpOworCQkJCWNoaWxkLnB1dFN0cmluZygicnVudGltZS1pZCIsIHNhdS5ydW50aW1lSWQpOworCQkJCWlmIChzYXUuZW50cnkgIT0gbnVsbCkKKwkJCQkJY2hpbGQucHV0U3RyaW5nKCJlbnRyeSIsIHNhdS5lbnRyeS50b1BvcnRhYmxlU3RyaW5nKCkpOworCQkJCWlmIChzYXUuc291cmNlQXR0YWNobWVudFBhdGggIT0gbnVsbCkKKwkJCQkJY2hpbGQucHV0U3RyaW5nKCJzb3VyY2UtYXR0YWNobWVudC1wYXRoIiwgc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7CisJCQkJaWYgKHNhdS5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGggIT0gbnVsbCkKKwkJCQkJY2hpbGQucHV0U3RyaW5nKCJzb3VyY2UtYXR0YWNobWVudC1yb290LXBhdGgiLCBzYXUuc291cmNlQXR0YWNobWVudFJvb3RQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7CisJCQkJaWYgKHNhdS5hdHRyaWJ1dGVzICE9IG51bGwpIHsKKwkJCQkJZm9yIChJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHIgOiBzYXUuYXR0cmlidXRlcykgeworCQkJCQkJSU1lbWVudG8gYXR0ckNoaWxkID0gY2hpbGQuY3JlYXRlQ2hpbGQoImF0dHJpYnV0ZSIpOworCQkJCQkJYXR0ckNoaWxkLnB1dFN0cmluZygibmFtZSIsIGF0dHIuZ2V0TmFtZSgpKTsKKwkJCQkJCWF0dHJDaGlsZC5wdXRTdHJpbmcoInZhbHVlIiwgYXR0ci5nZXRWYWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHNhdmluZyBzb3VyY2UgcGF0aCBpbmZvIiwgZSk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQcm9maWxlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1NlcnZlclByb2ZpbGVyRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmYwZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQcm9maWxlckRlbGVnYXRlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1SdW5uZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KYXZhU2VydmVyUGx1Z2luOworLyoqCisgKiBBIHNlcnZlciBwcm9maWxlciBkZWxlZ2F0ZS4KKyAqIDxwPgorICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKKyAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKKyAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAorICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwvcD4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlclByb2ZpbGVyRGVsZWdhdGUgeworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgcHJvZmlsZXIgZGVsZWdhdGUuIFRoaXMgY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIFNlcnZlclByb2ZpbGVyRGVsZWdhdGUoKSB7CisJCS8vIGlnbm9yZQorCX0KKworCS8qKgorCSAqIFByb2Nlc3NlcyB0aGUgSmF2YSBsYXVuY2ggY29uZmlndXJhdGlvbiBhYm91dCB0byBiZSBydW4gdG8gc3VwcG9ydCBwcm9maWxpbmcuCisJICogVk0gYXJncyBvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY2FuIGJlIHNldCB0byBhbGxvdyBwcm9maWxpbmcuCisJICogCisJICogQHBhcmFtIGxhdW5jaCB0aGUgbGF1bmNoCisJICogQHBhcmFtIHZtSW5zdGFsbCB0aGUgdm0gaW5zdGFsbCBiZWluZyBydW4gYWdhaW5zdAorCSAqIEBwYXJhbSB2bUNvbmZpZyB0aGUgY29uZmlndXJhdGlvbiB0byBwcm9jZXNzCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBkdXJpbmcgY29uZmlndXJhdGlvbgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3MoSUxhdW5jaCBsYXVuY2gsIElWTUluc3RhbGwgdm1JbnN0YWxsLCBWTVJ1bm5lckNvbmZpZ3VyYXRpb24gdm1Db25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247CisKKwkvKioKKwkgKiBQcm9jZXNzZXMgdGhlIEphdmEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gYWJvdXQgdG8gYmUgcnVuIHRvIHN1cHBvcnQgcHJvZmlsaW5nLgorCSAqIFZNIGFyZ3Mgb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzZXQgdG8gYWxsb3cgcHJvZmlsaW5nLgorCSAqIAorCSAqIEBwYXJhbSBsYXVuY2ggdGhlIGxhdW5jaAorCSAqIEBwYXJhbSB2bUluc3RhbGwgdGhlIHZtIGluc3RhbGwgYmVpbmcgcnVuIGFnYWluc3QKKwkgKiBAcGFyYW0gdm1Db25maWcgdGhlIGNvbmZpZ3VyYXRpb24gdG8gcHJvY2VzcworCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbm8gcHJvZmlsZXJzIGNvbmZpZ3VyZWQgb3IgdGhlcmUgaXMgYSBwcm9ibGVtCisJICogICBjb25maWd1cmluZyB0aGUgbGF1bmNoCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZVByb2ZpbGluZyhJTGF1bmNoIGxhdW5jaCwgSVZNSW5zdGFsbCB2bUluc3RhbGwsIFZNUnVubmVyQ29uZmlndXJhdGlvbiB2bUNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUphdmFTZXJ2ZXJQbHVnaW4uY29uZmlndXJlUHJvZmlsaW5nKGxhdW5jaCwgdm1JbnN0YWxsLCB2bUNvbmZpZywgbW9uaXRvcik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvU2VydmxldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjYzRkYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOworLyoqCisgKiBBIEoyRUUgU2VydmxldC4KKyAqIDxwPgorICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKKyAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKKyAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAorICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwvcD4KKyAqIEBwbGFubmVkZm9yIDMuMAorICovCitwdWJsaWMgY2xhc3MgU2VydmxldCBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgeworCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKwlwcml2YXRlIFN0cmluZyBhbGlhczsKKwkKKwkvKioKKwkgKiBDcmVhdGUgYSByZWZlcmVuY2UgdG8gYSBzZXJ2bGV0LgorCSAqIAorCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IHRoZSBzZXJ2bGV0IGlzIGNvbnRhaW5lZCBpbgorCSAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQKKwkgKiBAcGFyYW0gYWxpYXMgdGhlIHNlcnZsZXQncyBhbGlhcworCSAqLworCXB1YmxpYyBTZXJ2bGV0KElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgYWxpYXMpIHsKKwkJc3VwZXIobW9kdWxlKTsKKwkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisJCXRoaXMuYWxpYXMgPSBhbGlhczsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgZW1wdHkgc2VydmxldC4KKwkgKi8KKwlwdWJsaWMgU2VydmxldCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQuCisJICogCisJICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldENsYXNzTmFtZSgpIHsKKwkJcmV0dXJuIGNsYXNzTmFtZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzZXJ2bGV0J3MgYWxpYXMuCisJICogCisJICogQHJldHVybiB0aGUgc2VydmxldCdzIGFsaWFzCisJICovCisJcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKKwkJcmV0dXJuIGFsaWFzOworCX0KKworCS8qCisJICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0U2VydmxldCwgY2xhc3NOYW1lKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNkZXNlcmlhbGl6ZShTdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHMpIHsKKwkJaW50IGluZCA9IHMuaW5kZXhPZigiLy8iKTsKKwkJc3VwZXIuZGVzZXJpYWxpemUocy5zdWJzdHJpbmcoMCwgaW5kKSk7CisJCXMgPSBzLnN1YnN0cmluZyhpbmQrMik7CisJCWluZCA9IHMuaW5kZXhPZigiLy8iKTsKKwkJY2xhc3NOYW1lID0gcy5zdWJzdHJpbmcoMCwgaW5kKTsKKwkJYWxpYXMgPSBzLnN1YnN0cmluZyhpbmQrMik7CisJfQorCisJLyoKKwkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjc2VyaWFsaXplKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZSgpIHsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5zZXJpYWxpemUoKSk7CisJCXNiLmFwcGVuZCgiLy8iKTsKKwkJc2IuYXBwZW5kKGNsYXNzTmFtZSk7CisJCXNiLmFwcGVuZCgiLy8iKTsKKwkJc2IuYXBwZW5kKGFsaWFzKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiU2VydmxldCBbbW9kdWxlPSIgKyBnZXRNb2R1bGUoKSArICIsIGNsYXNzPSIgKyBjbGFzc05hbWUgKyAiLCBhbGlhcz0iICsgYWxpYXMgKyAiXSI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRmY2FhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNSdW50aW1lIGV4dGVuZHMgUnVudGltZURlbGVnYXRlIGltcGxlbWVudHMgSUdlbmVyaWNSdW50aW1lLCBJR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weSB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQgPSAidm0taW5zdGFsbC10eXBlLWlkIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNX0lOU1RBTExfSUQgPSAidm0taW5zdGFsbC1pZCI7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgZ2VuZXJpYyBydW50aW1lLgorCSAqLworCXB1YmxpYyBHZW5lcmljUnVudGltZSgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCAoU3RyaW5nKW51bGwpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vk1JbnN0YWxsSWQoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJ1bnRpbWUgaXMgdXNpbmcgdGhlIGRlZmF1bHQgSlJFLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJ1bnRpbWUgaXMgdXNpbmcgdGhlIGRlZmF1bHQgSlJFLAorCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gaXNVc2luZ0RlZmF1bHRKUkUoKSB7CisJCXJldHVybiBnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsOworCX0KKworCS8qKgorCSAqIEBzZWUgSUdlbmVyaWNSdW50aW1lI2dldFZNSW5zdGFsbCgpCisJICovCisJcHVibGljIElWTUluc3RhbGwgZ2V0Vk1JbnN0YWxsKCkgeworCQlpZiAoZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbCkKKwkJCXJldHVybiBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7CisJCXRyeSB7CisJCQlJVk1JbnN0YWxsVHlwZSB2bUluc3RhbGxUeXBlID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZShnZXRWTUluc3RhbGxUeXBlSWQoKSk7CisJCQlJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IHZtSW5zdGFsbFR5cGUuZ2V0Vk1JbnN0YWxscygpOworCQkJU3RyaW5nIGlkID0gZ2V0Vk1JbnN0YWxsSWQoKTsKKwkJCWZvciAoSVZNSW5zdGFsbCB2bUluc3QgOiB2bUluc3RhbGxzKSB7CisJCQkJaWYgKGlkLmVxdWFscyh2bUluc3QuZ2V0SWQoKSkpCisJCQkJCXJldHVybiB2bUluc3Q7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogQHNlZSBSdW50aW1lRGVsZWdhdGUjdmFsaWRhdGUoKQorCSAqLworCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgeworCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKCk7CisJCWlmICghc3RhdHVzLmlzT0soKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCQorCQlJUnVudGltZSBydW50aW1lID0gZ2V0UnVudGltZSgpOworCisJCUlQYXRoIHBhdGggPSBydW50aW1lLmdldExvY2F0aW9uKCk7CisJCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckxvY2F0aW9uLCBudWxsKTsKKwkJZWxzZSBpZiAoZ2V0Vk1JbnN0YWxsKCkgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckpSRSwgbnVsbCk7CisJCWVsc2UKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KKworCS8qKgorCSAqIEBzZWUgSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkjc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwpCisJICovCisJcHVibGljIHZvaWQgc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7CisJCWlmICh2bUluc3RhbGwgPT0gbnVsbCkgeworCQkJc2V0Vk1JbnN0YWxsKG51bGwsIG51bGwpOworCQl9IGVsc2UKKwkJCXNldFZNSW5zdGFsbCh2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCksIHZtSW5zdGFsbC5nZXRJZCgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRWTUluc3RhbGwoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGlkKSB7CisJCWlmICh0eXBlSWQgPT0gbnVsbCkKKwkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKKwkJZWxzZQorCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCB0eXBlSWQpOworCQkKKwkJaWYgKGlkID09IG51bGwpCisJCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOworCQllbHNlCisJCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCBpZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJiYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlciBleHRlbmRzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIHsKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUjcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUHJvamVjdCwgSVJ1bnRpbWUpCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSkgeworCQlJUGF0aCBpbnN0YWxsUGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKKwkJCisJCWlmIChpbnN0YWxsUGF0aCA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07CisJCQorCQlMaXN0PElDbGFzc3BhdGhFbnRyeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOworCQlhZGRMaWJyYXJ5RW50cmllcyhsaXN0LCBpbnN0YWxsUGF0aC50b0ZpbGUoKSwgZmFsc2UpOworCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbGlzdC5zaXplKCldKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmYmIxMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVVdGlsLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKKy8qKgorICogVXRpbGl0eSBtZXRob2RzIGZvciB0aGUgZ2VuZXJpYyBKMkVFIHJ1bnRpbWUuCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZVV0aWwgeworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiOworCisJLyoqCisJICogQ2Fubm90IGNyZWF0ZSBHZW5lcmljUnVudGltZVV0aWwgLSB1c2Ugc3RhdGljIG1ldGhvZHMuCisJICovCisJcHJpdmF0ZSBHZW5lcmljUnVudGltZVV0aWwoKSB7CisJCS8vIGNhbid0IGNyZWF0ZQorCX0KKworCS8qKgorCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHJ1bnRpbWUgaXMgYSBnZW5lcmljIEoyRUUgcnVudGltZSwgYW5kCisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4gVGhlIHJ1bnRpbWUgbWF5IG5vdCBiZSBudWxsLgorCSAqIAorCSAqIEBwYXJhbSBydW50aW1lIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2VuZXJpY0oyRUVSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKKwkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworCQlyZXR1cm4gKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsICYmCisJCQlydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKS5zdGFydHNXaXRoKFJVTlRJTUVfVFlQRV9JRCkpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUdlbmVyaWNSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lHZW5lcmljUnVudGltZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGJkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lHZW5lcmljUnVudGltZS5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUphdmFSdW50aW1lOworLyoqCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBJR2VuZXJpY1J1bnRpbWUgZXh0ZW5kcyBJSmF2YVJ1bnRpbWUgeworCS8vIG5vIGFkZGl0aW9uYWwgbWV0aG9kcworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzE5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lHZW5lcmljUnVudGltZVdvcmtpbmdDb3B5LmphdmEKQEAgLTAsMCArMSwxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUphdmFSdW50aW1lV29ya2luZ0NvcHk7CisvKioKKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIElHZW5lcmljUnVudGltZVdvcmtpbmdDb3B5IGV4dGVuZHMgSUdlbmVyaWNSdW50aW1lLCBJSmF2YVJ1bnRpbWVXb3JraW5nQ29weSB7CisJLy8gbm8gbmV3IG1ldGhvZHMKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwZDFmMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOworLyoqCisgKiBJbnRlcmZhY2UgdG8gYSBtZW1lbnRvIHVzZWQgZm9yIHNhdmluZyB0aGUgaW1wb3J0YW50IHN0YXRlIG9mIGFuIG9iamVjdAorICogaW4gYSBmb3JtIHRoYXQgY2FuIGJlIHBlcnNpc3RlZCBpbiB0aGUgZmlsZSBzeXN0ZW0uCisgKiA8cD4KKyAqIE1lbWVudG9zIHdlcmUgZGVzaWduZWQgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBpbiBtaW5kOgorICogPG9sPgorICogIDxsaT5DZXJ0YWluIG9iamVjdHMgbmVlZCB0byBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIHBsYXRmb3JtIHNlc3Npb25zLgorICogICAgPC9saT4KKyAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIGFuIGFwcHJvcHJpYXRlIGNsYXNzIGZvciBhbiBvYmplY3QgbWlnaHQgbm90CisgKiAgICBiZSBhdmFpbGFibGUuIEl0IG11c3QgYmUgcG9zc2libGUgdG8gc2tpcCBhbiBvYmplY3QgaW4gdGhpcyBjYXNlLjwvbGk+CisgKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCB0aGUgYXBwcm9wcmlhdGUgY2xhc3MgZm9yIHRoZSBvYmplY3QgbWF5IGJlCisgKiAgICBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIHdoZW4gdGhlIG9iamVjdCB3YXMgb3JpZ2luYWxseSBzYXZlZC4gSWYgc28sIHRoZQorICogICAgbmV3IGNsYXNzIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIHJlYWQgdGhlIG9sZCBmb3JtIG9mIHRoZSBkYXRhLjwvbGk+CisgKiA8L29sPgorICogPC9wPgorICogPHA+CisgKiBNZW1lbnRvcyBtZWV0IHRoZXNlIHJlcXVpcmVtZW50cyBieSBwcm92aWRpbmcgc3VwcG9ydCBmb3Igc3RvcmluZyBhCisgKiBtYXBwaW5nIG9mIGFyYml0cmFyeSBzdHJpbmcga2V5cyB0byBwcmltaXRpdmUgdmFsdWVzLCBhbmQgYnkgYWxsb3dpbmcKKyAqIG1lbWVudG9zIHRvIGhhdmUgb3RoZXIgbWVtZW50b3MgYXMgY2hpbGRyZW4gKGFycmFuZ2VkIGludG8gYSB0cmVlKS4KKyAqIEEgcm9idXN0IGV4dGVybmFsIHN0b3JhZ2UgZm9ybWF0IGJhc2VkIG9uIFhNTCBpcyB1c2VkLgorICogPC9wPjxwPgorICogVGhlIGtleSBmb3IgYW4gYXR0cmlidXRlIG1heSBiZSBhbnkgYWxwaGEgbnVtZXJpYyB2YWx1ZS4gIEhvd2V2ZXIsIHRoZQorICogdmFsdWUgb2YgPGNvZGU+VEFHX0lEPC9jb2RlPiBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLgorICogPC9wPjxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSU1lbWVudG8geworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY2hpbGQgb2YgdGhpcyBtZW1lbnRvIHdpdGggdGhlIGdpdmVuIHR5cGUuCisJICogPHA+CisJICogVGhlIDxjb2RlPmdldENoaWxkPC9jb2RlPiBhbmQgPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IG1ldGhvZHMKKwkgKiBhcmUgdXNlZCB0byByZXRyaWV2ZSBjaGlsZHJlbiBvZiBhIGdpdmVuIHR5cGUuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKKwkgKiBAcmV0dXJuIGEgbmV3IGNoaWxkIG1lbWVudG8KKwkgKiBAc2VlICNnZXRDaGlsZAorCSAqIEBzZWUgI2dldENoaWxkcmVuCisJICovCisJcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCisJICoKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUKKwkgKi8KKwlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpOworCQorCS8qKgorCSAqIFJldHVybnMgYWxsIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCisJICoKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAorCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZQorCSAqLworCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgorCSAqCisJICogQHBhcmFtIGtleSB0aGUga2V5CisJICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKKwkgKiAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gc3RyaW5nLgorCSAqCisJICogQHBhcmFtIGtleSB0aGUga2V5CisJICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSjJFRUxhdW5jaGFibGVDbGllbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSjJFRUxhdW5jaGFibGVDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZhNTBiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KMkVFTGF1bmNoYWJsZUNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpuZGlMYXVuY2hhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5DbGllbnREZWxlZ2F0ZTsKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEoyRUVMYXVuY2hhYmxlQ2xpZW50IGV4dGVuZHMgQ2xpZW50RGVsZWdhdGUgeworCS8qCisJICogQHNlZSBDbGllbnREZWxlZ2F0ZSNzdXBwb3J0cyhJTGF1bmNoYWJsZSkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7CisJCXJldHVybiAobGF1bmNoYWJsZSBpbnN0YW5jZW9mIEpuZGlMYXVuY2hhYmxlKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQ2xpZW50RGVsZWdhdGUjbGF1bmNoKElMYXVuY2hhYmxlKQorCSAqLworCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCkgeworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJKTkRJIGNsaWVudCBsYXVuY2hlZCIpOworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0oyRUVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0oyRUVVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiZjhlOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSjJFRVV0aWwuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUVudGVycHJpc2VBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUoyRUVNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklXZWJNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7CisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGRlYWxpbmcgd2l0aCBKMkVFIG1vZHVsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBKMkVFVXRpbCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9NT0RVTEUgPSAianN0LmVhciI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEUgPSAianN0LndlYiI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTW9kdWxlW10gRU1QVFlfTElTVCA9IG5ldyBJTW9kdWxlWzBdOworCXByaXZhdGUgc3RhdGljIE1hcDxJTW9kdWxlLCBMaXN0PElNb2R1bGU+PiBlYXJDYWNoZTsKKwlwcml2YXRlIHN0YXRpYyBNYXA8SUoyRUVNb2R1bGUsIExpc3Q8SU1vZHVsZT4+IGVhckNhY2hlMjsKKwlwcml2YXRlIHN0YXRpYyBNYXA8SU1vZHVsZSwgTGlzdDxJTW9kdWxlPj4gd2ViQ2FjaGU7CisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY2FjaGU7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyB0aGF0IHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIHdpdGhpbi4KKwkgKiAKKwkgKiBAcGFyYW0gbW9kdWxlIGEgSjJFRSBtb2R1bGUKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGVudGVycHJpc2UgYXBwbGljYXRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBJTW9kdWxlW10gZ2V0RW50ZXJwcmlzZUFwcGxpY2F0aW9ucyhJSjJFRU1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlpZiAoc2hvdWxkVXNlQ2FjaGUoKSkgeworCQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gZWFyQ2FjaGUyLmdldChtb2R1bGUpOworCQkJaWYgKGxpc3QgPT0gbnVsbCkKKwkJCQlyZXR1cm4gRU1QVFlfTElTVDsKKwkJCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbGlzdC5zaXplKCldKTsgCisJCX0KKwkJCisJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKKwkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoRUFSX01PRFVMRSk7CisJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKKwkJCWZvciAoSU1vZHVsZSBtb2R1bGUyIDogbW9kdWxlcykgeworCQkJCUlFbnRlcnByaXNlQXBwbGljYXRpb24gZWFyID0gKElFbnRlcnByaXNlQXBwbGljYXRpb24pIG1vZHVsZTIubG9hZEFkYXB0ZXIoSUVudGVycHJpc2VBcHBsaWNhdGlvbi5jbGFzcywgbW9uaXRvcik7CisJCQkJaWYgKGVhciAhPSBudWxsKSB7CisJCQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IGVhci5nZXRNb2R1bGVzKCk7CisJCQkJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7CisJCQkJCQlmb3IgKElNb2R1bGUgbSA6IG1vZHVsZXMyKSB7CisJCQkJCQkJaWYgKG1vZHVsZS5lcXVhbHMobS5sb2FkQWRhcHRlcihJSjJFRU1vZHVsZS5jbGFzcywgbW9uaXRvcikpKQorCQkJCQkJCQlsaXN0LmFkZChtb2R1bGUyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb25zIHRoYXQgdGhlIG1vZHVsZSBpcyBjb250YWluZWQgd2l0aGluLgorCSAqIAorCSAqIEBwYXJhbSBtb2R1bGUgYSBKMkVFIG1vZHVsZSBvciB1dGlsaXR5IG1vZHVsZQorCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElNb2R1bGVbXSBnZXRFbnRlcnByaXNlQXBwbGljYXRpb25zKElNb2R1bGUgbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKHNob3VsZFVzZUNhY2hlKCkpIHsKKwkJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IGVhckNhY2hlLmdldChtb2R1bGUpOworCQkJaWYgKGxpc3QgPT0gbnVsbCkKKwkJCQlyZXR1cm4gRU1QVFlfTElTVDsKKwkJCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbGlzdC5zaXplKCldKTsgCisJCX0KKwkJCisJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKKwkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoRUFSX01PRFVMRSk7CisJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKKwkJCWZvciAoSU1vZHVsZSBtb2R1bGUyIDogbW9kdWxlcykgeworCQkJCUlFbnRlcnByaXNlQXBwbGljYXRpb24gZWFyID0gKElFbnRlcnByaXNlQXBwbGljYXRpb24pIG1vZHVsZTIubG9hZEFkYXB0ZXIoSUVudGVycHJpc2VBcHBsaWNhdGlvbi5jbGFzcywgbW9uaXRvcik7CisJCQkJaWYgKGVhciAhPSBudWxsKSB7CisJCQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IGVhci5nZXRNb2R1bGVzKCk7CisJCQkJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7CisJCQkJCQlmb3IgKElNb2R1bGUgbSA6IG1vZHVsZXMyKSB7CisJCQkJCQkJaWYgKG1vZHVsZS5lcXVhbHMobSkpCisJCQkJCQkJCWxpc3QuYWRkKG1vZHVsZTIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgd2ViIG1vZHVsZXMgdGhhdCB0aGUgdXRpbGl0eSBtb2R1bGUgaXMgY29udGFpbmVkIHdpdGhpbi4KKwkgKiAKKwkgKiBAcGFyYW0gbW9kdWxlIGEgdXRpbGl0eSBtb2R1bGUKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHdlYiBtb2R1bGVzCisJICovCisJcHVibGljIHN0YXRpYyBJTW9kdWxlW10gZ2V0V2ViTW9kdWxlcyhJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWlmIChzaG91bGRVc2VDYWNoZSgpKSB7CisJCQlMaXN0PElNb2R1bGU+IGxpc3QgPSB3ZWJDYWNoZS5nZXQobW9kdWxlKTsKKwkJCWlmIChsaXN0ID09IG51bGwpCisJCQkJcmV0dXJuIEVNUFRZX0xJU1Q7CisJCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXSk7CisJCX0KKwkJCisJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKKwkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoV0VCX01PRFVMRSk7CisJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKKwkJCWZvciAoSU1vZHVsZSBtb2R1bGUyIDogbW9kdWxlcykgeworCQkJCUlXZWJNb2R1bGUgd2ViID0gKElXZWJNb2R1bGUpIG1vZHVsZTIubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbW9uaXRvcik7CisJCQkJaWYgKHdlYiAhPSBudWxsKSB7CisJCQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IHdlYi5nZXRNb2R1bGVzKCk7CisJCQkJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7CisJCQkJCQlmb3IgKElNb2R1bGUgbSA6IG1vZHVsZXMyKSB7CisJCQkJCQkJaWYgKG1vZHVsZS5lcXVhbHMobSkpCisJCQkJCQkJCWxpc3QuYWRkKG1vZHVsZTIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsQ2FjaGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWVhckNhY2hlID0gbmV3IEhhc2hNYXA8SU1vZHVsZSwgTGlzdDxJTW9kdWxlPj4oKTsKKwkJZWFyQ2FjaGUyID0gbmV3IEhhc2hNYXA8SUoyRUVNb2R1bGUsIExpc3Q8SU1vZHVsZT4+KCk7CisJCXdlYkNhY2hlID0gbmV3IEhhc2hNYXA8SU1vZHVsZSwgTGlzdDxJTW9kdWxlPj4oKTsKKwkJCisJCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKEVBUl9NT0RVTEUpOworCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7CisJCQlmb3IgKElNb2R1bGUgbW9kdWxlMiA6IG1vZHVsZXMpIHsKKwkJCQlJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIGVhciA9IChJRW50ZXJwcmlzZUFwcGxpY2F0aW9uKSBtb2R1bGUyLmxvYWRBZGFwdGVyKElFbnRlcnByaXNlQXBwbGljYXRpb24uY2xhc3MsIG1vbml0b3IpOworCQkJCWlmIChlYXIgIT0gbnVsbCkgeworCQkJCQlJTW9kdWxlW10gbW9kdWxlczIgPSBlYXIuZ2V0TW9kdWxlcygpOworCQkJCQlpZiAobW9kdWxlczIgIT0gbnVsbCkgeworCQkJCQkJZm9yIChJTW9kdWxlIG1tIDogbW9kdWxlczIpIHsKKwkJCQkJCQlMaXN0PElNb2R1bGU+IG0gPSBlYXJDYWNoZS5nZXQobW0pOworCQkJCQkJCWlmIChtID09IG51bGwpIHsKKwkJCQkJCQkJbSA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oMik7CisJCQkJCQkJCWVhckNhY2hlLnB1dChtbSwgbSk7CisJCQkJCQkJfQorCQkJCQkJCW0uYWRkKG1vZHVsZTIpOworCQkJCQkJCQorCQkJCQkJCUlKMkVFTW9kdWxlIG1vZCA9IChJSjJFRU1vZHVsZSkgbW0ubG9hZEFkYXB0ZXIoSUoyRUVNb2R1bGUuY2xhc3MsIG1vbml0b3IpOworCQkJCQkJCWlmIChtb2QgIT0gbnVsbCkgeworCQkJCQkJCQltID0gZWFyQ2FjaGUyLmdldChtb2QpOworCQkJCQkJCQlpZiAobSA9PSBudWxsKSB7CisJCQkJCQkJCQltID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigyKTsKKwkJCQkJCQkJCWVhckNhY2hlMi5wdXQobW9kLCBtKTsKKwkJCQkJCQkJfQorCQkJCQkJCQltLmFkZChtb2R1bGUyKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCW1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoV0VCX01PRFVMRSk7CisJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKKwkJCWZvciAoSU1vZHVsZSBtb2R1bGUyIDogbW9kdWxlcykgeworCQkJCUlXZWJNb2R1bGUgd2ViID0gKElXZWJNb2R1bGUpIG1vZHVsZTIubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbW9uaXRvcik7CisJCQkJaWYgKHdlYiAhPSBudWxsKSB7CisJCQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IHdlYi5nZXRNb2R1bGVzKCk7CisJCQkJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7CisJCQkJCQlmb3IgKElNb2R1bGUgbW0gOiBtb2R1bGVzMikgeworCQkJCQkJCUxpc3Q8SU1vZHVsZT4gbSA9IHdlYkNhY2hlLmdldChtbSk7CisJCQkJCQkJaWYgKG0gPT0gbnVsbCkgeworCQkJCQkJCQltID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigyKTsKKwkJCQkJCQkJd2ViQ2FjaGUucHV0KG1tLCBtKTsKKwkJCQkJCQl9CisJCQkJCQkJbS5hZGQobW9kdWxlMik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZUNhY2hlKCkgeworCQlTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiSjJFRWNhY2hlIik7CisJCWlmIChzID09IG51bGwgfHwgIiIuZXF1YWxzKHMpIHx8ICJmYWxzZSIuZXF1YWxzKHMpKSB7CisJCQl3ZWJDYWNoZSA9IG51bGw7CisJCQllYXJDYWNoZSA9IG51bGw7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKGNhY2hlID09IG51bGwgfHwgIWNhY2hlLmVxdWFscyhzKSkgeworCQkJY2FjaGUgPSBzOworCQkJZmlsbENhY2hlKG51bGwpOworCQl9CisJCXJldHVybiB0cnVlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0pSRVJ1bnRpbWVDb21wb25lbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KUkVSdW50aW1lQ29tcG9uZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWFmYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KUkVSdW50aW1lQ29tcG9uZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUphdmFSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOworCitwdWJsaWMgY2xhc3MgSlJFUnVudGltZUNvbXBvbmVudFByb3ZpZGVyIGV4dGVuZHMgUnVudGltZUNvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUgeworCisJcHVibGljIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldFJ1bnRpbWVDb21wb25lbnRzKElSdW50aW1lIHJ1bnRpbWUpIHsKKwkJLy8gZGVmaW5lIEpSRSBjb21wb25lbnQKKwkJSUphdmFSdW50aW1lIGphdmFSdW50aW1lID0gKElKYXZhUnVudGltZSkgcnVudGltZS5sb2FkQWRhcHRlcihJSmF2YVJ1bnRpbWUuY2xhc3MsIG51bGwpOworCQlpZiAoamF2YVJ1bnRpbWUgIT0gbnVsbCkgeworCQkgICAgZmluYWwgSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBqYXZhUnVudGltZS5nZXRWTUluc3RhbGwoKTsKKwkJICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjID0gU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LmNyZWF0ZSggdm1JbnN0YWxsICk7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggcmMgKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KYXZhU2VydmVyUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0phdmFTZXJ2ZXJQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmUwNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KYXZhU2VydmVyUGx1Z2luLmphdmEKQEAgLTAsMCArMSwzNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTVJ1bm5lckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKy8qKgorICogVGhlIG1haW4gc2VydmVyIHRvb2xpbmcgcGx1Z2luIGNsYXNzLgorICovCitwdWJsaWMgY2xhc3MgSmF2YVNlcnZlclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7CisJLyoqCisJICogSmF2YSBzZXJ2ZXIgcGx1Z2luIGlkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSI7CisKKwkvLyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcworCXByaXZhdGUgc3RhdGljIEphdmFTZXJ2ZXJQbHVnaW4gc2luZ2xldG9uOworCisJLy8JY2FjaGVkIGNvcHkgb2YgYWxsIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVycworCXByaXZhdGUgc3RhdGljIExpc3Q8UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlcj4gcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczsKKworCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBzZXJ2ZXIgcHJvZmlsZXJzCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTZXJ2ZXJQcm9maWxlcj4gc2VydmVyUHJvZmlsZXJzOworCQorCS8vIHJ1bnRpbWUgbGlzdGVuZXIKKwlwcml2YXRlIHN0YXRpYyBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIHJ1bnRpbWVMaXN0ZW5lcjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgSmF2YVNlcnZlclBsdWdpbi4KKwkgKi8KKwlwdWJsaWMgSmF2YVNlcnZlclBsdWdpbigpIHsKKwkJc3VwZXIoKTsKKwkJc2luZ2xldG9uID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIGEgc2luZ2xldG9uIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhU2VydmVyUGx1Z2luIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gc2luZ2xldG9uOworCX0KKworCS8qKgorCSAqIEBzZWUgUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQkKKwkJcnVudGltZUxpc3RlbmVyID0gbmV3IElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBydW50aW1lQWRkZWQoSVJ1bnRpbWUgcnVudGltZSkgeworCQkJCWhhbmRsZVJ1bnRpbWVDaGFuZ2UocnVudGltZSwgMCk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKKwkJCQloYW5kbGVSdW50aW1lQ2hhbmdlKHJ1bnRpbWUsIDEpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBydW50aW1lUmVtb3ZlZChJUnVudGltZSBydW50aW1lKSB7CisJCQkJaGFuZGxlUnVudGltZUNoYW5nZShydW50aW1lLCAyKTsKKwkJCX0KKwkJfTsKKwkJCisJCVNlcnZlckNvcmUuYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKHJ1bnRpbWVMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHNlZSBQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dDIpIHRocm93cyBFeGNlcHRpb24geworCQlTZXJ2ZXJDb3JlLnJlbW92ZVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihydW50aW1lTGlzdGVuZXIpOworCQlzdXBlci5zdG9wKGNvbnRleHQyKTsKKwl9CisKKwkvKioKKwkgKiBIYW5kbGUgYSBydW50aW1lIGNoYW5nZSBieSBwb3RlbnRpYWxseSB1cGRhdGluZyB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lci4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSdW50aW1lQ2hhbmdlKGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsIGZpbmFsIGludCBhY3QpIHsKKwkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCisJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBvc3NpYmxlIHJ1bnRpbWUgY2hhbmdlOiAiICsgcnVudGltZSk7CisJCQorCQlpZiAocnVudGltZS5nZXRSdW50aW1lVHlwZSgpID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlmaW5hbCBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJjcHcgPSBmaW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSk7CisJCWlmIChyY3B3ICE9IG51bGwgJiYgKHJjcHcuaGFzUnVudGltZUNsYXNzcGF0aENoYW5nZWQocnVudGltZSkgfHwgYWN0ICE9IDEpKSB7CisJCQlmaW5hbCBJUGF0aCBzZXJ2ZXJDb250YWluZXJQYXRoID0gbmV3IFBhdGgoUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5TRVJWRVJfQ09OVEFJTkVSKQorCQkJCS5hcHBlbmQocmNwdy5nZXRJZCgpKS5hcHBlbmQocnVudGltZS5nZXRJZCgpKTsKKwkJCQorCQkJY2xhc3MgUmVidWlsZFJ1bnRpbWVSZWZlcmVuY2VzSm9iIGV4dGVuZHMgSm9iIHsKKwkJCQlwdWJsaWMgUmVidWlsZFJ1bnRpbWVSZWZlcmVuY2VzSm9iKCkgeworCQkJCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy51cGRhdGVDbGFzc3BhdGhDb250YWluZXJzLCBydW50aW1lLmdldE5hbWUoKSkpOworCQkJCX0KKworCQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7CisJCQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOworCQkJCX0KKworCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKwkJCQkJaWYgKHByb2plY3RzICE9IG51bGwpIHsKKwkJCQkJCWZvciAoSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7CisJCQkJCQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCWlmICghcHJvamVjdC5pc05hdHVyZUVuYWJsZWQoSmF2YUNvcmUuTkFUVVJFX0lEKSkKKwkJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJCQorCQkJCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworCQkJCQkJCQkJCisJCQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjZSA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOworCQkJCQkJCQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgY3AgOiBjZSkgeworCQkJCQkJCQkJCWlmIChjcC5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgeworCQkJCQkJCQkJCQlpZiAoc2VydmVyQ29udGFpbmVyUGF0aC5pc1ByZWZpeE9mKGNwLmdldFBhdGgoKSkpCisJCQkJCQkJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJCisJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJDbGFzc3BhdGggY2hhbmdlIG9uOiAiICsgcHJvamVjdCArICIgIiArIGZvdW5kKTsKKwkJCQkJCQkJCQorCQkJCQkJCQkJaWYgKGZvdW5kKSB7CisJCQkJCQkJCQkJSVJ1bnRpbWUgcnVudGltZTIgPSBydW50aW1lOworCQkJCQkJCQkJCWlmIChhY3QgPT0gMikKKwkJCQkJCQkJCQkJcnVudGltZTIgPSBudWxsOworCQkJCQkJCQkJCVJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbmV3IFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIocHJvamVjdCwKKwkJCQkJCQkJCQkJCXNlcnZlckNvbnRhaW5lclBhdGgsIHJjcHcsIHJ1bnRpbWUyLCBydW50aW1lLmdldElkKCkpOworCQkJCQkJCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihzZXJ2ZXJDb250YWluZXJQYXRoLCBuZXcgSUphdmFQcm9qZWN0W10geyBqYXZhUHJvamVjdCB9LAorCQkJCQkJCQkJCQkJbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7Y29udGFpbmVyfSwgbnVsbCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgdXBkYXRlIGNsYXNzcGF0aCBjb250YWluZXIiLCBlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkKKwkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQkJfQorCQkJfQorCQkJUmVidWlsZFJ1bnRpbWVSZWZlcmVuY2VzSm9iIGpvYiA9IG5ldyBSZWJ1aWxkUnVudGltZVJlZmVyZW5jZXNKb2IoKTsKKwkJCWpvYi5zY2hlZHVsZSgpOworCQl9CisJfQorCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBsb2dnaW5nLgorCSAqCisJICogQHBhcmFtIHN0YXR1cyBhIHN0YXR1cworCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7CisJCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1zZykgeworCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2VzLgorCSAqIDxwPgorCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZQorCSAqIHJlc3VsdC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGluc3RhbmNlcworCSAqICAgICAgICAge0BsaW5rIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXJ9CisJICovCisJcHVibGljIHN0YXRpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyW10gZ2V0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpIHsKKwkJaWYgKHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgPT0gbnVsbCkKKwkJCWxvYWRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzKCk7CisJCQorCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyW10gcnRoID0gbmV3IFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXJbcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5zaXplKCldOworCQlydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLnRvQXJyYXkocnRoKTsKKwkJcmV0dXJuIHJ0aDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBydW50aW1lIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24gcnVudGltZQorCSAqIGNsYXNzcGF0aCBwcm92aWRlcnMgKHtAbGluayAjZ2V0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpfSkgZm9yIHRoZSBvbmUgd2l0aAorCSAqIGEgbWF0Y2hpbmcgcnVudGltZSB0eXBlLgorCSAqIFRoZSBydW50aW1lVHlwZSBtYXkgbm90IGJlIG51bGwuCisJICoKKwkgKiBAcGFyYW0gcnVudGltZVR5cGUgYSBydW50aW1lIHR5cGUKKwkgKiBAcmV0dXJuIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKwkgKiAgIHRoZXJlIGlzIG5vIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIHRoYXQgc3VwcG9ydHMgdGhlIGdpdmVuIGlkCisJICovCisJcHVibGljIHN0YXRpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGZpbmRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7CisJCWlmIChydW50aW1lVHlwZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisJCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzID09IG51bGwpCisJCQlsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpOworCQkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyID0gKFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuc3VwcG9ydHNSdW50aW1lVHlwZShydW50aW1lVHlwZSkpCisJCQkJcmV0dXJuIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBydW50aW1lIHR5cGUgaWQsCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KKwkgKiBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlcnMgKHtAbGluayAjZ2V0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpfSkgZm9yIHRoZSBvbmUKKwkgKiB3aXRoIGEgbWF0Y2hpbmcgcnVudGltZSB0eXBlIGlkLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgorCSAqCisJICogQHBhcmFtIGlkIGEgcnVudGltZSB0eXBlIGlkCisJICogQHJldHVybiB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogICB0aGVyZSBpcyBubyBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBpZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBmaW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyQnlTdXBwb3J0KFN0cmluZyBpZCkgeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCisJCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzID09IG51bGwpCisJCQlsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpOworCQkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyID0gKFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuc3VwcG9ydHNSdW50aW1lVHlwZShpZCkpCisJCQkJcmV0dXJuIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93biBydW50aW1lCisJICogY2xhc3NwYXRoIHByb3ZpZGVycyAoe0BsaW5rICNnZXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzKCl9KSBmb3IgdGhlIG9uZSB3aXRoCisJICogYSBtYXRjaGluZyBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpZCAoe0BsaW5rIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIjZ2V0SWQoKX0pLgorCSAqIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCisJICoKKwkgKiBAcGFyYW0gaWQgdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGlkCisJICogQHJldHVybiB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogICB0aGVyZSBpcyBubyBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB3aXRoIHRoZSBnaXZlbiBpZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBmaW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKFN0cmluZyBpZCkgeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCisJCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzID09IG51bGwpCisJCQlsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpOworCQkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyID0gKFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChpZC5lcXVhbHMocnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmdldElkKCkpKQorCQkJCXJldHVybiBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXI7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogTG9hZCB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXJzLgorCSAqLworCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzKCkgeworCQlpZiAocnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyAhPSBudWxsKQorCQkJcmV0dXJuOworCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyBleHRlbnNpb24gcG9pbnQgLT4tIik7CisJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAicnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyIpOworCQkKKwkJTGlzdDxSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyPihjZi5sZW5ndGgpOworCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7CisJCQl0cnkgeworCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyKGNlKSk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7CisJCQl9CisJCX0KKwkJcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyA9IGxpc3Q7CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBzZXJ2ZXIgcHJvZmlsZXIgaW5zdGFuY2VzLgorCSAqIDxwPgorCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBzZXJ2ZXIgcHJvZmlsZXIgaW5zdGFuY2VzCisJICogICAge0BsaW5rIFNlcnZlclByb2ZpbGVyfQorCSAqLworCXB1YmxpYyBzdGF0aWMgU2VydmVyUHJvZmlsZXJbXSBnZXRTZXJ2ZXJQcm9maWxlcnMoKSB7CisJCWlmIChzZXJ2ZXJQcm9maWxlcnMgPT0gbnVsbCkKKwkJCWxvYWRTZXJ2ZXJQcm9maWxlcnMoKTsKKwkJCisJCVNlcnZlclByb2ZpbGVyW10gc3AgPSBuZXcgU2VydmVyUHJvZmlsZXJbc2VydmVyUHJvZmlsZXJzLnNpemUoKV07CisJCXNlcnZlclByb2ZpbGVycy50b0FycmF5KHNwKTsKKwkJcmV0dXJuIHNwOworCX0KKworCS8qKgorCSAqIExvYWQgdGhlIHNlcnZlciBwcm9maWxlcnMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFNlcnZlclByb2ZpbGVycygpIHsKKwkJaWYgKHNlcnZlclByb2ZpbGVycyAhPSBudWxsKQorCQkJcmV0dXJuOworCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAuc2VydmVyUHJvZmlsZXJzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKKwkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJzZXJ2ZXJQcm9maWxlcnMiKTsKKwkJCisJCUxpc3Q8U2VydmVyUHJvZmlsZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNlcnZlclByb2ZpbGVyPihjZi5sZW5ndGgpOworCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7CisJCQl0cnkgeworCQkJCWxpc3QuYWRkKG5ldyBTZXJ2ZXJQcm9maWxlcihjZSkpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIHNlcnZlclByb2ZpbGVyOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpKTsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBzZXJ2ZXJQcm9maWxlcjogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7CisJCQl9CisJCX0KKwkJc2VydmVyUHJvZmlsZXJzID0gbGlzdDsKKwkJCisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLnNlcnZlclByb2ZpbGVycyBleHRlbnNpb24gcG9pbnQgLTwtIik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZVByb2ZpbGluZyhJTGF1bmNoIGxhdW5jaCwgSVZNSW5zdGFsbCB2bUluc3RhbGwsIFZNUnVubmVyQ29uZmlndXJhdGlvbiB2bUNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCVNlcnZlclByb2ZpbGVyW10gc3AgPSBKYXZhU2VydmVyUGx1Z2luLmdldFNlcnZlclByb2ZpbGVycygpOworCQlpZiAoc3AgPT0gbnVsbCB8fCBzcC5sZW5ndGggPT0gMCkKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTm9Qcm9maWxlciwgbnVsbCkpOworCQkKKwkJc3BbMF0ucHJvY2VzcyhsYXVuY2gsIHZtSW5zdGFsbCwgdm1Db25maWcsIG1vbml0b3IpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0xhdW5jaENvbmZpZ3VyYXRpb25VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0xhdW5jaENvbmZpZ3VyYXRpb25VdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmZTE2OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTGF1bmNoQ29uZmlndXJhdGlvblV0aWwuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIExhdW5jaENvbmZpZ3VyYXRpb25VdGlsIHsKKwkvKioKKwkgKiBHZXRzIHRoZSBjbGFzc3BhdGggZnJvbSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGdpdmVuIHNlcnZlci4KKwkgKiBJZiBjcmVhdGUgaXMgZmFsc2UsIGl0IHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gbGF1bmNoIGNvbmZpZ3VyYXRpb24KKwkgKiAoaS5lLiB0aGUgc2VydmVyIGhhcyBub3QgYmVlbiBydW4gYmVmb3JlKSBJZiBjcmVhdGUgaXMgdHJ1ZSwgaXQgd2lsbCBjcmVhdGUKKwkgKiBhIGxhdW5jaCBjb25maWd1cmF0aW9uIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KKwkgKgorCSAqIEBwYXJhbSBzZXJ2ZXIKKwkgKiBAcGFyYW0gY3JlYXRlCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCisJICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHJ1bnRpbWUgY2xhc3NwYXRoIGVudHJpZXMKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKwkgKi8KKwkvKnB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aChJU2VydmVyIHNlcnZlciwgYm9vbGVhbiBjcmVhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXJ2ZXIuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihjcmVhdGUsIG1vbml0b3IpOworCQlpZiAoY29uZmlnID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiBKYXZhUnVudGltZS5jb21wdXRlVW5yZXNvbHZlZFJ1bnRpbWVDbGFzc3BhdGgoY29uZmlnKTsKKwl9Ki8KKworCS8qKgorCSAqIFNldHMgdGhlIGNsYXNzcGF0aCBvbiB0aGUgZ2l2ZW4gc2VydmVyJ3MgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCisJICoKKwkgKiBAcGFyYW0gc2VydmVyCisJICogQHBhcmFtIGNsYXNzcGF0aAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCS8qcHVibGljIHN0YXRpYyB2b2lkIHNldENsYXNzcGF0aChJU2VydmVyIHNlcnZlciwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNlcnZlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uKHRydWUsIG1vbml0b3IpOworCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7CisJCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0NMQVNTUEFUSCwgZmFsc2UpOworCQorCQlMaXN0IG1lbWVudG9zID0gbmV3IEFycmF5TGlzdChjbGFzc3BhdGgubGVuZ3RoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKKwkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07CisJCQltZW1lbnRvcy5hZGQoZW50cnkuZ2V0TWVtZW50bygpKTsKKwkJfQorCQl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRILCBtZW1lbnRvcyk7CisJCXdjLmRvU2F2ZSgpOworCX0qLworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZmVlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKy8qKgorICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxvY2F0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySlJFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhDb250YWluZXJVbmJvdW5kOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ1Rhc2s7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdUYXNrOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ29weWluZ0ZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDcmVhdGluZ1ppcEZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEZWxldGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZW5hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZWFkaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcnM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1J1bnRpbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JGYWNldDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlbGV0aW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm90QURpcmVjdG9yeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1rZGlyOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RTZXJ2bGV0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0RUpCOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0Sk5ESTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdENhY3R1c1Rlc3Q7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5Nb2RpZnlNb2R1bGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9Qcm9maWxlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgaHR0cFBvcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW5Vc2U7CisKKwlzdGF0aWMgeworCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzZjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0NCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbj1TZXJ2ZXIgTGlicmFyeQorY2xhc3NwYXRoQ29udGFpbmVyPXswfSBbezF9XQorY2xhc3NwYXRoQ29udGFpbmVyVW5ib3VuZD17MH0gW3sxfV0gKHVuYm91bmQpCisKK2Vycm9yTG9jYXRpb249SW52YWxpZCBsb2NhdGlvbi4KK2Vycm9ySlJFPUludmFsaWQgSlJFLgorCitjb3B5aW5nVGFzaz1Db3B5aW5nIGZyb20gezB9IHRvIHsxfQorZGVsZXRpbmdUYXNrPURlbGV0aW5nIHswfQorZXJyb3JDb3B5aW5nRmlsZT1FcnJvciBjb3B5aW5nIGZpbGUgezB9OiB7MX0KK2Vycm9yQ3JlYXRpbmdaaXBGaWxlPUVycm9yIGNyZWF0aW5nIHppcCBmaWxlIHswfTogezF9CitlcnJvckRlbGV0ZT1Db3VsZCBub3QgZGVsZXRlIHByZXZpb3VzIGNvcHksIHdoaWNoIG1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgorZXJyb3JSZW5hbWU9Q291bGQgbm90IHJlcGxhY2Ugd2l0aCB0ZW1wIGZpbGUgezB9LgorZXJyb3JSZWFkaW5nPUVycm9yIHJlYWRpbmcgZmlsZSB7MH0KK2Vycm9yTm9SdW50aW1lPUNhbm5vdCB2ZXJpZnkgZmFjZXRzIGJlY2F1c2UgdGhlcmUgaXMgbm8gcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KK2Vycm9yRmFjZXQ9UHJvamVjdCBmYWNldCB7MH0gdmVyc2lvbiB7MX0gaXMgbm90IHN1cHBvcnRlZC4KK2Vycm9yRGVsZXRpbmc9Q291bGQgbm90IGRlbGV0ZSB7MH0uIE1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgorZXJyb3JOb3RBRGlyZWN0b3J5PUNvdWxkIG5vdCBkZWxldGUgezB9IHNpbmNlIGl0IGlzIG5vdCBhIGRpcmVjdG9yeS4KK2Vycm9yTWtkaXI9Q291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgezB9LgorCit1cGRhdGVDbGFzc3BhdGhDb250YWluZXJzPVVwZGF0aW5nIGNsYXNzcGF0aCBjb250YWluZXIgZm9yIHswfQorCithcnRpZmFjdFNlcnZsZXQ9U2VydmxldCB7MH0KK2FydGlmYWN0RUpCPUVKQiB7MH0KK2FydGlmYWN0Sk5EST1KTkRJIHswfQorYXJ0aWZhY3RDYWN0dXNUZXN0PUNhY3R1cyB0ZXN0IHswfQorCitjYW5Nb2RpZnlNb2R1bGVzPVdlYiBtb2R1bGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCitlcnJvck5vUHJvZmlsZXI9Q291bGQgbm90IGxhdW5jaCBpbiBwcm9maWxpbmcgbW9kZSBiZWNhdXNlIG5vIHByb2ZpbGVycyBhcmUgY29uZmlndXJlZC4KK2Vycm9yUHVibGlzaD1BbiBlcnJvciBvY2N1cmVkIGR1cmluZyBwdWJsaXNoaW5nLgoraHR0cFBvcnQ9SFRUUCBQb3J0CitlcnJvclBvcnRJblVzZT1Qb3J0IHswfSByZXF1aXJlZCBieSB7MX0gaXMgYWxyZWFkeSBpbiB1c2UuIFRoZSBzZXJ2ZXIgbWF5IGFscmVhZHkgYmUgcnVubmluZyBpbiBhbm90aGVyIHByb2Nlc3MsIG9yIGEgc3lzdGVtIHByb2Nlc3MgbWF5IGJlIHVzaW5nIHRoZSBwb3J0LiBcCisgIFRvIHN0YXJ0IHRoaXMgc2VydmVyIHlvdSB3aWxsIG5lZWQgdG8gc3RvcCB0aGUgb3RoZXIgcHJvY2VzcyBvciBjaGFuZ2UgdGhlIHBvcnQgbnVtYmVyKHMpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZDk5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKKy8qKgorICogUHJvZ3Jlc3MgTW9uaXRvciB1dGlsaXR5LgorICovCitwdWJsaWMgY2xhc3MgUHJvZ3Jlc3NVdGlsIHsKKwkvKioKKwkgKiBQcm9ncmVzc1V0aWwgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwcml2YXRlIFByb2dyZXNzVXRpbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSB2YWxpZCBwcm9ncmVzcyBtb25pdG9yLgorCSAqCisJICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCisJICovCisJcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldE1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWlmIChtb25pdG9yID09IG51bGwpCisJCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJcmV0dXJuIG1vbml0b3I7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZQorCSAqIGN1cnJlbnQgcHJvZ3Jlc3MgbW9uaXRvci4KKwkgKgorCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCisJICogQHBhcmFtIHRpY2tzIGludAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcykgeworCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKKwkJCXJldHVybiBtb25pdG9yOworCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcyk7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZQorCSAqIGN1cnJlbnQgcHJvZ3Jlc3MgbW9uaXRvci4KKwkgKgorCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCisJICogQHBhcmFtIHRpY2tzIGEgbnVtYmVyIG9mIHRpY2tzCisJICogQHBhcmFtIHN0eWxlIGEgc3R5bGUKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCisJICovCisJcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MsIGludCBzdHlsZSkgeworCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKKwkJCXJldHVybiBtb25pdG9yOworCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcywgc3R5bGUpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0NGIwNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lciB7CisJLyoqCisJICogVGhlIHNlcnZlciBjb250YWluZXIgaWQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0NPTlRBSU5FUiA9IEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgIi5jb250YWluZXIiOworCisJcHJpdmF0ZSBJUGF0aCBwYXRoOworCXByaXZhdGUgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBkZWxlZ2F0ZTsKKwlwcml2YXRlIElSdW50aW1lIHJ1bnRpbWU7CisJcHJpdmF0ZSBTdHJpbmcgcnVudGltZUlkOworCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIGNsYXNzcGF0aCBjb250YWluZXIuCisJICogCisJICogQHBhcmFtIHBhdGgKKwkgKiBAcGFyYW0gZGVsZWdhdGUKKwkgKiBAcGFyYW0gcnVudGltZQorCSAqIEBkZXByZWNhdGVkIHNob3VsZCB1c2UgdGhlIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyBhIHByb2plY3QKKwkgKi8KKwlwdWJsaWMgUnVudGltZUNsYXNzcGF0aENvbnRhaW5lcihJUGF0aCBwYXRoLCBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGRlbGVnYXRlLCBJUnVudGltZSBydW50aW1lKSB7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKwkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgcnVudGltZSBjbGFzc3BhdGggY29udGFpbmVyLgorCSAqIAorCSAqIEBwYXJhbSBwcm9qZWN0CisJICogQHBhcmFtIHBhdGgKKwkgKiBAcGFyYW0gZGVsZWdhdGUKKwkgKiBAcGFyYW0gcnVudGltZQorCSAqIEBwYXJhbSBydW50aW1lSWQKKwkgKi8KKwlwdWJsaWMgUnVudGltZUNsYXNzcGF0aENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBwYXRoLCBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGRlbGVnYXRlLCBJUnVudGltZSBydW50aW1lLCBTdHJpbmcgcnVudGltZUlkKSB7CisJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKwkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKKwkJdGhpcy5ydW50aW1lSWQgPSBydW50aW1lSWQ7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIjZ2V0Q2xhc3NwYXRoRW50cmllcygpCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7CisJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBudWxsOworCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCAmJiBydW50aW1lICE9IG51bGwpCisJCQllbnRyaWVzID0gZGVsZWdhdGUucmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwocHJvamVjdCwgcnVudGltZSk7CisJCQorCQlpZiAoZW50cmllcyA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07CisJCQorCQlyZXR1cm4gZW50cmllczsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lciNnZXREZXNjcmlwdGlvbigpCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgeworCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOworCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpCisJCQkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lciwgcnVudGltZVR5cGUuZ2V0TmFtZSgpLCBydW50aW1lLmdldE5hbWUoKSk7CisJCX0KKwkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lclVuYm91bmQsIE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uLCBydW50aW1lSWQpOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyI2dldEtpbmQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKKwkJcmV0dXJuIElDbGFzc3BhdGhDb250YWluZXIuS19BUFBMSUNBVElPTjsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lciNnZXRQYXRoKCkKKwkgKi8KKwlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKCEob2JqIGluc3RhbmNlb2YgUnVudGltZUNsYXNzcGF0aENvbnRhaW5lcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyIHJjYyA9IChSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKSBvYmo7CisJCWlmIChkZWxlZ2F0ZSAhPSBudWxsICYmICFkZWxlZ2F0ZS5lcXVhbHMocmNjLmRlbGVnYXRlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChydW50aW1lID09IG51bGwgJiYgcmNjLnJ1bnRpbWUgIT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChydW50aW1lICE9IG51bGwgJiYgIXJ1bnRpbWUuZXF1YWxzKHJjYy5ydW50aW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChydW50aW1lSWQgIT0gbnVsbCAmJiAhcnVudGltZUlkLmVxdWFscyhyY2MucnVudGltZUlkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChwcm9qZWN0ID09IG51bGwgJiYgcmNjLnByb2plY3QgIT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuZXF1YWxzKHJjYy5wcm9qZWN0KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChwYXRoICE9IG51bGwgJiYgIXBhdGguZXF1YWxzKHJjYy5wYXRoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTdjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBleHRlbmRzIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIHsKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgeworCQkJaWYgKGNvbnRhaW5lclBhdGguc2VnbWVudCgwKS5lcXVhbHMoUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5TRVJWRVJfQ09OVEFJTkVSKSkgeworCQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZGVsZWdhdGUgPSBudWxsOworCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOworCQkJCVN0cmluZyBydW50aW1lSWQgPSBudWxsOworCQkJCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMikgeworCQkJCQlkZWxlZ2F0ZSA9IEphdmFTZXJ2ZXJQbHVnaW4uZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihjb250YWluZXJQYXRoLnNlZ21lbnQoMSkpOworCQkJCQkKKwkJCQkJcnVudGltZUlkID0gY29udGFpbmVyUGF0aC5zZWdtZW50KDIpOworCQkJCQlpZiAocnVudGltZUlkICE9IG51bGwpCisJCQkJCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOworCQkJCX0KKwkJCQlSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKHByb2plY3QuZ2V0UHJvamVjdCgpLCBjb250YWluZXJQYXRoLCBkZWxlZ2F0ZSwgcnVudGltZSwgcnVudGltZUlkKTsKKwkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHtwcm9qZWN0fSwgbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7Y29udGFpbmVyfSwgbnVsbCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIjZ2V0RGVzY3JpcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gTWVzc2FnZXMuY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb247CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI2NhblVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI3JlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIpCisJICovCisJcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJTdWdnZXN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgeworCQkJaWYgKGNvbnRhaW5lclBhdGguc2VnbWVudCgwKS5lcXVhbHMoUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5TRVJWRVJfQ09OVEFJTkVSKSkgeworCQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZGVsZWdhdGUgPSBudWxsOworCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOworCQkJCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMikgeworCQkJCQlkZWxlZ2F0ZSA9IEphdmFTZXJ2ZXJQbHVnaW4uZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihjb250YWluZXJQYXRoLnNlZ21lbnQoMSkpOworCQkJCQlTdHJpbmcgcnVudGltZUlkID0gY29udGFpbmVyUGF0aC5zZWdtZW50KDIpOworCQkJCQlpZiAocnVudGltZUlkICE9IG51bGwpCisJCQkJCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOworCQkJCQlkZWxlZ2F0ZS5yZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKHJ1bnRpbWUsIGNvbnRhaW5lclN1Z2dlc3Rpb24uZ2V0Q2xhc3NwYXRoRW50cmllcygpKTsKKwkJCQkJLy9KYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHsgcHJvamVjdCB9LAorCQkJCQkvLwkJbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IGNvbnRhaW5lclN1Z2dlc3Rpb24gfSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQkJCXVwZGF0ZUNsYXNzcGF0aChydW50aW1lLCBjb250YWluZXJQYXRoLCBjb250YWluZXJTdWdnZXN0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlQ2xhc3NwYXRoKGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsIGZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGgsIGZpbmFsIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyU3VnZ2VzdGlvbikgeworCQljbGFzcyBVcGRhdGVDbGFzc3BhdGhKb2IgZXh0ZW5kcyBKb2IgeworCQkJcHVibGljIFVwZGF0ZUNsYXNzcGF0aEpvYigpIHsKKwkJCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy51cGRhdGVDbGFzc3BhdGhDb250YWluZXJzLCBydW50aW1lLmdldE5hbWUoKSkpOworCQkJfQorCisJCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgeworCQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOworCQkJfQorCisJCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKwkJCQlMaXN0PElKYXZhUHJvamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUphdmFQcm9qZWN0PigpOworCQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7CisJCQkJCWZvciAoSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7CisJCQkJCQlpZiAocHJvamVjdC5pc0FjY2Vzc2libGUoKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWlmICghcHJvamVjdC5pc05hdHVyZUVuYWJsZWQoSmF2YUNvcmUuTkFUVVJFX0lEKSkKKwkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQkKKwkJCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworCQkJCQkJCQkKKwkJCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjZSA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOworCQkJCQkJCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBjcCA6IGNlKSB7CisJCQkJCQkJCQlpZiAoY3AuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKKwkJCQkJCQkJCQlpZiAoY29udGFpbmVyUGF0aC5pc1ByZWZpeE9mKGNwLmdldFBhdGgoKSkpCisJCQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQ2xhc3NwYXRoIGNoYW5nZSBvbjogIiArIHByb2plY3QgKyAiICIgKyBmb3VuZCk7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAoZm91bmQpCisJCQkJCQkJCQlsaXN0LmFkZChqYXZhUHJvamVjdCk7CisJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHVwZGF0ZSBjbGFzc3BhdGggY29udGFpbmVyIiwgZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7CisJCQkJaWYgKHNpemUgPiAwKSB7CisJCQkJCUlKYXZhUHJvamVjdFtdIGphdmFQcm9qZWN0cyA9IG5ldyBJSmF2YVByb2plY3Rbc2l6ZV07CisJCQkJCWxpc3QudG9BcnJheShqYXZhUHJvamVjdHMpOworCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyW10gY29udGFpbmVycyA9IG5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW3NpemVdOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQkJCWNvbnRhaW5lcnNbaV0gPSBjb250YWluZXJTdWdnZXN0aW9uOworCQkJCQkKKwkJCQkJdHJ5IHsKKwkJCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdHMsIGNvbnRhaW5lcnMsIG1vbml0b3IpOworCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7CisJCQkJCQlyZXR1cm4gam1lLmdldFN0YXR1cygpOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJfQorCQl9CisJCVVwZGF0ZUNsYXNzcGF0aEpvYiBqb2IgPSBuZXcgVXBkYXRlQ2xhc3NwYXRoSm9iKCk7CisJCWpvYi5zY2hlZHVsZSgpOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciNnZXRDb21wYXJpc29uSUQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpCisJICovCisJcHVibGljIE9iamVjdCBnZXRDb21wYXJpc29uSUQoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwkJaWYgKGNvbnRhaW5lclBhdGggPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJcmV0dXJuIGNvbnRhaW5lclBhdGgudG9Qb3J0YWJsZVN0cmluZygpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmFhZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIFN1cHBvcnQgZm9yIGFsbCBzZXJ2ZXIgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciBpbXBsZW1lbnRzIElDbGFzc3BhdGhQcm92aWRlciB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBXRUJfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC53ZWIiKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEVKQl9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LmVqYiIpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgRUFSX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3QuZWFyIik7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBVVElMSVRZX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3QudXRpbGl0eSIpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgQ09OTkVDVE9SX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3QuY29ubmVjdG9yIik7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBBUFBfQ0xJRU5UX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3QuYXBwY2xpZW50Iik7CisKKwlwcml2YXRlIElSdW50aW1lQ29tcG9uZW50IHJjOworCisJcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihJUnVudGltZUNvbXBvbmVudCByYykgeworCQl0aGlzLnJjID0gcmM7CisJfQorCisJcHVibGljIExpc3QgZ2V0Q2xhc3NwYXRoRW50cmllcyhJUHJvamVjdEZhY2V0VmVyc2lvbiBmdikgeworCQlJUHJvamVjdEZhY2V0IHBmID0gZnYuZ2V0UHJvamVjdEZhY2V0KCk7CisJCWlmIChwZiA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpZiAocGYuZXF1YWxzKFdFQl9GQUNFVCkgfHwgcGYuZXF1YWxzKEVKQl9GQUNFVCkgfHwgcGYuZXF1YWxzKEVBUl9GQUNFVCkgfHwKKwkJCQlwZi5lcXVhbHMoVVRJTElUWV9GQUNFVCkgfHwgcGYuZXF1YWxzKENPTk5FQ1RPUl9GQUNFVCkgfHwgcGYuZXF1YWxzKEFQUF9DTElFTlRfRkFDRVQpKSB7CisJCQlTdHJpbmcgcnVudGltZVR5cGVJZCA9IHJjLmdldFByb3BlcnR5KCJ0eXBlLWlkIik7CisJCQlTdHJpbmcgcnVudGltZUlkID0gcmMuZ2V0UHJvcGVydHkoImlkIik7CisJCQlpZiAocnVudGltZVR5cGVJZCA9PSBudWxsIHx8IHJ1bnRpbWVJZCA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciByY3B3ID0gSmF2YVNlcnZlclBsdWdpbi5maW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyQnlTdXBwb3J0KHJ1bnRpbWVUeXBlSWQpOworCQkJaWYgKHJjcHcgIT0gbnVsbCkgeworCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyLlNFUlZFUl9DT05UQUlORVIpOworCQkJCXBhdGggPSBwYXRoLmFwcGVuZChyY3B3LmdldElkKCkpLmFwcGVuZChydW50aW1lSWQpOworCQkJCUlDbGFzc3BhdGhFbnRyeSBjcGVudHJ5ID0gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkocGF0aCk7CisJCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY3BlbnRyeSk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSUNsYXNzcGF0aFByb3ZpZGVyLmNsYXNzIH07CisKKwkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCQlJUnVudGltZUNvbXBvbmVudCByYyA9IChJUnVudGltZUNvbXBvbmVudCkgYWRhcHRhYmxlOworCQkJcmV0dXJuIG5ldyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIocmMpOworCQl9CisKKwkJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7CisJCQlyZXR1cm4gQURBUFRFUl9UWVBFUzsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiODU4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgeworCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7CisJcHJpdmF0ZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIHRhcmdldCBoYW5kbGVyLgorCSAqIAorCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50CisJICovCisJcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKKwl9CisJCisJcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgeworCQlyZXR1cm4gZWxlbWVudDsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcmRlci4KKwkgKgorCSAqIEByZXR1cm4gdGhlIG9yZGVyCisJICovCisJcHVibGljIGludCBnZXRPcmRlcigpIHsKKwkJdHJ5IHsKKwkJCVN0cmluZyBvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIik7CisJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChvKTsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVHlwZUlkcygpIHsKKwkJdHJ5IHsKKwkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkcyIpLCAiLCIpOworCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKKwkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKKwkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7CisJCQl9CisJCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07CisJCQlsaXN0LnRvQXJyYXkocyk7CisJCQlyZXR1cm4gczsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBwYXJzZSBydW50aW1lIHR5cGUgaWRzOiAiICsgZWxlbWVudCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQorCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCisJICogdGhlIHJlc3VsdCBvZiB0aGUgZ2V0U2VydmVyUmVzb3VyY2VzKCkgbWV0aG9kLgorCSAqCisJICogQHBhcmFtIHJ1bnRpbWVUeXBlIGEgcnVudGltZSB0eXBlCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSdW50aW1lVHlwZShJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKKwkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBzdXBwb3J0c1J1bnRpbWVUeXBlKHJ1bnRpbWVUeXBlLmdldElkKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQorCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCisJICogdGhlIHJlc3VsdCBvZiB0aGUgZ2V0U2VydmVyUmVzb3VyY2VzKCkgbWV0aG9kLgorCSAqCisJICogQHBhcmFtIGlkIGEgcnVudGltZSB0eXBlIGlkCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSdW50aW1lVHlwZShTdHJpbmcgaWQpIHsKKwkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCVN0cmluZ1tdIHMgPSBnZXRSdW50aW1lVHlwZUlkcygpOworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJZm9yIChTdHJpbmcgc3MgOiBzKSB7CisJCQlpZiAoc3MuZW5kc1dpdGgoIioiKSkgeworCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzcy5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNzLnN1YnN0cmluZygwLCBzcy5sZW5ndGgoKSAtIDEpKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzcykpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogTG9hZHMgdGhlIGRlbGVnYXRlIGNsYXNzLgorCSAqLworCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKKwkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJZGVsZWdhdGUgPSAoUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKKwkJCQlkZWxlZ2F0ZS5pbml0aWFsaXplKGdldElkKCkpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCB0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGVsZWdhdGU7CisJfQorCisJLyoKKwkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI3Jlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKElQcm9qZWN0LCBJUnVudGltZSkKKwkgKi8KKwlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSkgeworCQlpZiAocnVudGltZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXRyeSB7CisJCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5yZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChwcm9qZWN0LCBydW50aW1lKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNyZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lLCBJQ2xhc3NwYXRoRW50cnlbXSkKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lIHJ1bnRpbWUsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKKwkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJdHJ5IHsKKwkJCWdldERlbGVnYXRlKCkucmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShydW50aW1lLCBlbnRyaWVzKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIGUpOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI2hhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKElSdW50aW1lKQorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKKwkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJdHJ5IHsKKwkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmhhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKHJ1bnRpbWUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU2VydmVyUGx1Z2luLmxvZ0V4dGVuc2lvbkZhaWx1cmUodG9TdHJpbmcoKSwgZSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlclsiICsgZ2V0SWQoKSArICJdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRQcm92aWRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRQcm92aWRlckRlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4ZTRkZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5mYWNldHMuUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZTsKKy8qKgorICogQSBydW50aW1lIGNvbXBvbmVudCBwcm92aWRlciBjYW4gcHJvdmlkZSBhZGRpdGlvbmFsIHJ1bnRpbWUgY29tcG9uZW50cyBmb3IgYSBmYWNldCBydW50aW1lLgorICogVGhpcyBwcm92aWRlciBpcyBzY29wZWQgYnkgcnVudGltZSB0eXBlIGFuZCBtYXkgcHJvdmlkZSBjb21wb25lbnRzIGZvciBtdWx0aXBsZQorICogcnVudGltZSBpbnN0YW5jZXMuCisgKiA8cD4KKyAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCisgKiB0byBleHRlbmQgdGhlIDxjb2RlPmludGVybmFsUnVudGltZUNvbXBvbmVudFByb3ZpZGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgorICogPC9wPgorICogPHA+CisgKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAorICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAorICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCisgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPC9wPgorICogCisgKiBAcGxhbm5lZGZvciAyLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bnRpbWVDb21wb25lbnRQcm92aWRlckRlbGVnYXRlIGV4dGVuZHMgUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSB7CisJLy8gbm90aGluZyBhZGRlZAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3ZWFmMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlciB7CisJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKKwlwcml2YXRlIFJ1bnRpbWVDb21wb25lbnRQcm92aWRlckRlbGVnYXRlIGRlbGVnYXRlOworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgY29tcG9uZW50IGhhbmRsZXIuCisJICogCisJICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQlzdXBlcigpOworCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworCX0KKwkKKwlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnQoKSB7CisJCXJldHVybiBlbGVtZW50OworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGlkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOworCX0KKworCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVHlwZUlkcygpIHsKKwkJdHJ5IHsKKwkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkcyIpLCAiLCIpOworCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKKwkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKKwkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7CisJCQl9CisJCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07CisJCQlsaXN0LnRvQXJyYXkocyk7CisJCQlyZXR1cm4gczsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBwYXJzZSBydW50aW1lIHR5cGUgaWRzOiAiICsgZWxlbWVudCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQorCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCisJICogdGhlIHJlc3VsdCBvZiB0aGUgZ2V0U2VydmVyUmVzb3VyY2VzKCkgbWV0aG9kLgorCSAqCisJICogQHBhcmFtIHJ1bnRpbWVUeXBlIGEgcnVudGltZSB0eXBlCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSdW50aW1lVHlwZShJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKKwkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCVN0cmluZyBpZCA9IHJ1bnRpbWVUeXBlLmdldElkKCk7CisJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJU3RyaW5nW10gcyA9IGdldFJ1bnRpbWVUeXBlSWRzKCk7CisJCWlmIChzID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlmb3IgKFN0cmluZyBzcyA6IHMpIHsKKwkJCWlmIChzcy5lbmRzV2l0aCgiKiIpKSB7CisJCQkJaWYgKGlkLmxlbmd0aCgpID49IHNzLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc3Muc3Vic3RyaW5nKDAsIHNzLmxlbmd0aCgpIC0gMSkpKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoaWQuZXF1YWxzKHNzKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBMb2FkcyB0aGUgZGVsZWdhdGUgY2xhc3MuCisJICovCisJcHJvdGVjdGVkIFJ1bnRpbWVDb21wb25lbnRQcm92aWRlckRlbGVnYXRlIGdldERlbGVnYXRlKCkgeworCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlkZWxlZ2F0ZSA9IChSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCB0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGVsZWdhdGU7CisJfQorCisJLyoKKwkgKiBAc2VlIFJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUjZ2V0UnVudGltZUNvbXBvbmVudHMoSVJ1bnRpbWUpCisJICovCisJcHVibGljIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldENvbXBvbmVudHMoSVJ1bnRpbWUgcnVudGltZSkgeworCQlpZiAocnVudGltZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXRyeSB7CisJCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRSdW50aW1lQ29tcG9uZW50cyhydW50aW1lKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlclsiICsgZ2V0SWQoKSArICJdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVGYWNldE1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUZhY2V0TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyY2QwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVGYWNldE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSdW50aW1lRmFjZXRNYXBwaW5nIHsKKwlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgZmFjZXQgbWFwcGluZy4KKwkgKiAKKwkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAorCSAqLworCXB1YmxpYyBSdW50aW1lRmFjZXRNYXBwaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisJfQorCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7CisJfQorCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVUeXBlSWQoKSB7CisJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZCIpOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGlkCisJICovCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNvbXBvbmVudCgpIHsKKwkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lLWNvbXBvbmVudCIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUnVudGltZUZhY2V0TWFwcGluZ1siICsgZ2V0SWQoKSArICJdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclByb2ZpbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclByb2ZpbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMzAwMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHJvZmlsZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNUnVubmVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZTsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJQcm9maWxlciB7CisJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKKwlwcml2YXRlIFNlcnZlclByb2ZpbGVyRGVsZWdhdGUgZGVsZWdhdGU7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIHByb2ZpbGVyLgorCSAqIAorCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50CisJICovCisJcHVibGljIFNlcnZlclByb2ZpbGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisJfQorCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7CisJfQorCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7CisJfQorCisJLyoKKwkgKiBMb2FkcyB0aGUgZGVsZWdhdGUgY2xhc3MuCisJICovCisJcHJvdGVjdGVkIFNlcnZlclByb2ZpbGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7CisJCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7CisJCQlpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXRyeSB7CisJCQkJZGVsZWdhdGUgPSAoU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGVsZWdhdGU7CisJfQorCisJLyoqCisJICogQGRlcHJlY2F0ZWQgU3dpdGNoIHRvIG5ldyBBUEkgdmlhIFRPRE8KKwkgKiBAcmV0dXJuIHRoZSBWTSBhcmdzCisJICovCisJcHVibGljIFN0cmluZyBnZXRWTUFyZ3MoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHByb2Nlc3MoSUxhdW5jaCBsYXVuY2gsIElWTUluc3RhbGwgdm1JbnN0YWxsLCBWTVJ1bm5lckNvbmZpZ3VyYXRpb24gdm1Db25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0cnkgeworCQkJU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZSBkZWwgPSBnZXREZWxlZ2F0ZSgpOworCQkJaWYgKGRlbCAhPSBudWxsKQorCQkJCWRlbC5wcm9jZXNzKGxhdW5jaCwgdm1JbnN0YWxsLCB2bUNvbmZpZywgbW9uaXRvcik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGNlKTsKKwkJCXRocm93IGNlOworCQl9CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJTZXJ2ZXJQcm9maWxlclsiICsgZ2V0SWQoKSArICJdIjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNDcwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgorICovCitwdWJsaWMgY2xhc3MgVHJhY2UgeworCS8qKgorCSAqIENvbmZpZyB0cmFjaW5nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7CisJLyoqCisJICogV2FybmluZyB0cmFjaW5nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFdBUk5JTkcgPSAxOworCS8qKgorCSAqIFNldmVyZSB0cmFjaW5nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFVkVSRSA9IDI7CisJLyoqCisJICogRmluZXN0IHRyYWNpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBQVUJMSVNISU5HID0gNDsKKworCXByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IGxvZ2dlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCS8qKgorCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHJpdmF0ZSBUcmFjZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KKwkgKgorCSAqIEBwYXJhbSBsZXZlbCB0cmFjZSBsZXZlbAorCSAqIEBwYXJhbSBzIFN0cmluZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgeworCQlUcmFjZS50cmFjZShsZXZlbCwgcywgbnVsbCk7CisJfQorCisJLyoqCisJICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBsZXZlbCB0cmFjZSBsZXZlbAorCSAqIEBwYXJhbSBzIFN0cmluZworCSAqIEBwYXJhbSB0IFRocm93YWJsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWlmIChsZXZlbCA9PSBTRVZFUkUpIHsKKwkJCWlmICghbG9nZ2VkLmNvbnRhaW5zKHMpKSB7CisJCQkJSmF2YVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCBzLCB0KSk7CisJCQkJbG9nZ2VkLmFkZChzKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKCFKYXZhU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKKwkJCXJldHVybjsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbihKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOworCQlpZiAodCAhPSBudWxsKQorCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTlmMTRkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworLyoqCisgKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCisgKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCisgKgorICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCisgKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKKyAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCisgKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAorICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KKyAqCisgKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKKyAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKKyAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgorICoKKyAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RhbmNlIHdpdGggYSB2ZXJzaW9uIElELgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKKwlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7CisJcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7CisKKwkvKioKKwkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQorCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCisJICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KKwkgKi8KKwlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7CisJCWZhY3RvcnkgPSBkb2M7CisJCWVsZW1lbnQgPSBlbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElNZW1lbnRvI2NyZWF0ZUNoaWxkKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpIHsKKwkJRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlKTsKKwkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7CisJCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgRG9jdW1lbnQgZnJvbSBhIFJlYWRlciBhbmQgYW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciByZWFkaW5nIAorCSAqIGEgZG9jdW1lbnQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVSZWFkUm9vdChJbnB1dFN0cmVhbSBpbikgeworCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7CisJCXRyeSB7CisJCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisJCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKwkJCWRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOworCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQorCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWluLmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBBbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHdyaXRpbmcgYSBkb2N1bWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSBhIHR5cGUKKwkgKiBAcmV0dXJuIGEgbWVtZW50bworCSAqLworCXB1YmxpYyBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVXcml0ZVJvb3QoU3RyaW5nIHR5cGUpIHsKKwkJRG9jdW1lbnQgZG9jdW1lbnQ7CisJCXRyeSB7CisJCQlkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsKKwkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOworCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCBlbGVtZW50KTsgICAgICAgICAgICAKKwkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoZSk7CisJCX0KKwl9CisJCisJLyoKKwkgKiBAc2VlIElNZW1lbnRvCisJICovCisJcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7CisJCS8vIEdldCB0aGUgbm9kZXMuCisJCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7CisJCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7CisJCWlmIChzaXplID09IDApCisJCQlyZXR1cm4gbnVsbDsKKwkKKwkJLy8gRmluZCB0aGUgZmlyc3Qgbm9kZSB3aGljaCBpcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KKwkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7CisJCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKKwkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgeworCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOworCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKKwkJCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGVsZW1lbnQyKTsKKwkJCX0KKwkJfQorCQorCQkvLyBBIGNoaWxkIHdhcyBub3QgZm91bmQuCisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJTWVtZW50bworCSAqLworCXB1YmxpYyBJTWVtZW50byBbXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSkgeworCQkvLyBHZXQgdGhlIG5vZGVzLgorCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOworCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOworCQlpZiAoc2l6ZSA9PSAwKQorCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKKwkKKwkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgorCQlMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KHNpemUpOworCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKKwkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisJCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7CisJCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQorCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7CisJCQl9CisJCX0KKwkKKwkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgorCQlzaXplID0gbGlzdC5zaXplKCk7CisJCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07CisJCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgeworCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGxpc3QuZ2V0KHgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0czsKKwl9CisKKwkvKgorCSAqIEBzZWUgSU1lbWVudG8KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOworCQlpZiAoYXR0ciA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7IAorCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOworCX0KKworCS8qKgorCSAqIExvYWRzIGEgbWVtZW50byBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBmaWxlbmFtZSBqYXZhLmxhbmcuU3RyaW5nCisJICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogQHJldHVybiBhIG1lbWVudG8KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElNZW1lbnRvIGxvYWRNZW1lbnRvKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQl0cnkgeworCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKSk7CisJCQlyZXR1cm4gWE1MTWVtZW50by5jcmVhdGVSZWFkUm9vdChpbik7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChpbiAhPSBudWxsKQorCQkJCQlpbi5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJTWVtZW50bworCSAqLworCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm47CisJCWVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpOworCX0KKwkKKwkvKioKKwkgKiBTYXZlIHRoaXMgTWVtZW50byB0byBhIFdyaXRlci4KKwkgKiAKKwkgKiBAcGFyYW0gb3MgYW4gb3V0cHV0IHN0cmVhbQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZworCSAqLworCXByaXZhdGUgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQob3MpOworCQlTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShmYWN0b3J5KTsKKwkJdHJ5IHsKKwkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbn1pbmRlbnQtYW1vdW50IiwgIjIiKTsKKwkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOworCQl9CisJfQorCisJLyoqCisJICogU2F2ZXMgdGhlIG1lbWVudG8gdG8gdGhlIGdpdmVuIGZpbGUuCisJICoKKwkgKiBAcGFyYW0gZmlsZW5hbWUgamF2YS5sYW5nLlN0cmluZworCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNhdmVUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlT3V0cHV0U3RyZWFtIHcgPSBudWxsOworCQl0cnkgeworCQkJdyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKTsKKwkJCXNhdmUodyk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IGU7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKHcgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXcuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyZjQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c0xhdW5jaGFibGUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQ2FjdHVzTGF1bmNoYWJsZSB7CisJcHJpdmF0ZSBTdHJpbmcgZlByb2plY3RuYW1lOworCXByaXZhdGUgU3RyaW5nIGZDbGFzc05hbWU7CisJcHJpdmF0ZSBTdHJpbmcgZlRlc3ROYW1lOworCXByaXZhdGUgVVJMIGZDYWN0dXNVUkw7CisKKwlwdWJsaWMgQ2FjdHVzTGF1bmNoYWJsZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyB0ZXN0TmFtZSwgVVJMIGNhY3R1c1VSTCkgeworCQlmUHJvamVjdG5hbWUgPSBwcm9qZWN0TmFtZTsKKwkJZkNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKwkJZlRlc3ROYW1lID0gdGVzdE5hbWU7CisJCWZDYWN0dXNVUkwgPSBjYWN0dXNVUkw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUZXN0Q2xhc3NOYW1lKCkgeworCQlyZXR1cm4gZkNsYXNzTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCkgeworCQlyZXR1cm4gZlRlc3ROYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7CisJCXJldHVybiBmUHJvamVjdG5hbWU7CisJfQorCisJcHVibGljIFVSTCBnZXRDYWN0dXNVUkwoKSB7CisJCXJldHVybiBmQ2FjdHVzVVJMOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4ZjZmYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVVSTFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5MYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlOworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQ2FjdHVzTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSBleHRlbmRzIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgeworCXB1YmxpYyBPYmplY3QgZ2V0TGF1bmNoYWJsZShJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChtb2R1bGVBcnRpZmFjdCBpbnN0YW5jZW9mIFdlYlRlc3RhYmxlUmVzb3VyY2UpIHsKKwkJCVdlYlRlc3RhYmxlUmVzb3VyY2UgcmVzb3VyY2UgPSAoV2ViVGVzdGFibGVSZXNvdXJjZSkgbW9kdWxlQXJ0aWZhY3Q7CisJCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlci5nZXRBZGFwdGVyKElVUkxQcm92aWRlci5jbGFzcykpCisJCQkJCS5nZXRNb2R1bGVSb290VVJMKHJlc291cmNlLmdldE1vZHVsZSgpKTsKKwkJCQorCQkJU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOworCQkJaWYgKHVybFN0cmluZy5lbmRzV2l0aCgiLyIpKSB7CisJCQkJdHJ5IHsKKwkJCQkJdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcuc3Vic3RyaW5nKDAsIHVybFN0cmluZy5sZW5ndGgoKSAtIDEpKTsKKwkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIGxhdW5jaGFibGUiLCBlKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG5ldyBDYWN0dXNMYXVuY2hhYmxlKHJlc291cmNlLmdldFByb2plY3ROYW1lKCksCisJCQkJCXJlc291cmNlLmdldENsYXNzTmFtZSgpLCByZXNvdXJjZS5nZXRUZXN0TmFtZSgpLCB1cmwpOworCQl9CisJCXJldHVybiBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmEyODE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIERhbmllbCBSLiBTb21lcmZpZWxkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLmNhY3R1czsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGU7CisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDYWN0dXNNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBleHRlbmRzIE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9URVNUX0NBU0VfVFlQRSA9ICJvcmcuYXBhY2hlLmNhY3R1cy5TZXJ2bGV0VGVzdENhc2UiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX01FVEhPRCA9ICJzdWl0ZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTU19OQU1FID0gImp1bml0LmZyYW1ld29yay5UZXN0IjsKKworCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaikgeworCQlTdHJpbmcgbWV0aG9kTmFtZSA9ICIiOworCQlpZiAob2JqIGluc3RhbmNlb2YgSU1ldGhvZCkgeworCQkJSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgb2JqOworCQkJbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOworCQkJb2JqID0gbWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpOworCQl9CisJCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7CisJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSAoKElBZGFwdGFibGUpIG9iaikuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOworCQkJU3RyaW5nIHRlc3RDbGFzc05hbWUgPSBnZXRDbGFzc05hbWVGb3JUeXBlKHJlc291cmNlKTsKKwkJCWlmICh0ZXN0Q2xhc3NOYW1lICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOworCQkJCXJldHVybiBuZXcgV2ViVGVzdGFibGVSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSwgZmFsc2UsCisJCQkJCQlwcm9qZWN0TmFtZSwgdGVzdENsYXNzTmFtZSwgbWV0aG9kTmFtZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZUZvclR5cGUoSVJlc291cmNlIHJlc291cmNlKSB7CisJCWlmIChyZXNvdXJjZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpZiAoISJqYXZhIi5lcXVhbHMocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpKSAmJiAhImNsYXNzIi5lcXVhbHMocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpKSkKKwkJCXJldHVybiBudWxsOworCQkKKwkJdHJ5IHsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7CisJCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKKwkJCWlmIChwYXRoID09IG51bGwgfHwgIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpCisJCQkJcmV0dXJuIG51bGw7CisJCQkKKwkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHByb2plY3QuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7CisJCQlpZiAoIWphdmFQcm9qZWN0LmlzT3BlbigpKQorCQkJCWphdmFQcm9qZWN0Lm9wZW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQkKKwkJCS8vIG91dHB1dCBsb2NhdGlvbiBtYXkgbm90IGJlIG9uIGNsYXNzcGF0aAorCQkJSVBhdGggb3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7CisJCQlpZiAob3V0cHV0UGF0aCAhPSBudWxsCisJCQkJCSYmICJjbGFzcyIuZXF1YWxzKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSAmJiBvdXRwdXRQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWludCBjb3VudCA9IG91dHB1dFBhdGguc2VnbWVudENvdW50KCk7CisJCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7CisJCQl9CisJCQkKKwkJCS8vIHJlbW92ZSBpbml0aWFsIHBhcnQgb2YgY2xhc3NwYXRoCisJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc1BhdGhFbnRyeSA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJaWYgKGNsYXNzUGF0aEVudHJ5ICE9IG51bGwpIHsKKwkJCQlpbnQgc2l6ZSA9IGNsYXNzUGF0aEVudHJ5Lmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQlJUGF0aCBjbGFzc1BhdGggPSBjbGFzc1BhdGhFbnRyeVtpXS5nZXRQYXRoKCk7CisJCQkJCWlmIChjbGFzc1BhdGguaXNQcmVmaXhPZihwYXRoKSkgeworCQkJCQkJaW50IGNvdW50ID0gY2xhc3NQYXRoLnNlZ21lbnRDb3VudCgpOworCQkJCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7CisJCQkJCQlpICs9IHNpemU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCS8vIGdldCBqYXZhIGVsZW1lbnQKKwkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IGphdmFQcm9qZWN0LmZpbmRFbGVtZW50KHBhdGgpOworCQkJSVR5cGVbXSB0eXBlcyA9IGdldFR5cGVzKGphdmFFbGVtZW50KTsKKwkJCWlmICh0eXBlcyAhPSBudWxsKSB7CisJCQkJaW50IHNpemUyID0gdHlwZXMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgeworCQkJCQlpZiAoaGFzU3VwZXJjbGFzcyh0eXBlc1tpXSkgfHwgaGFzU3VpdGVNZXRob2QodHlwZXNbaV0pKQorCQkJCQkJcmV0dXJuIHR5cGVzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzU3VpdGVNZXRob2QoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlNZXRob2RbXSBtZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKCk7CisJCWludCBzaXplID0gbWV0aG9kcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCkubGVuZ3RoID09IDAgJiYgbWV0aG9kLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKFNVSVRFX01FVEhPRCkpIHsKKwkJCQlTdHJpbmcgcmV0dXJuVHlwZSA9IGdldEZ1bGx5UXVhbGlmaWVkVHlwZUZvck1hbmdsZWRUeXBlKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHR5cGUpOworCQkJCWlmIChURVNUX0NMQVNTX05BTUUuZXF1YWxzKHJldHVyblR5cGUpKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgSVR5cGVbXSBnZXRUeXBlcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQl0cnkgeworCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSAhPSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiAoKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQpLmdldEFsbFR5cGVzKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzU3VwZXJjbGFzcyhJVHlwZSB0eXBlKSB7CisJCXRyeSB7CisJCQlJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsKKwkJCUlUeXBlW10gc3VwZXJDbGFzc2VzID0gaGllcmFyY2h5LmdldEFsbFN1cGVyY2xhc3Nlcyh0eXBlKTsKKwkJCWludCBzaXplID0gc3VwZXJDbGFzc2VzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJaWYgKFNFUlZMRVRfVEVTVF9DQVNFX1RZUEUuZXF1YWxzKHN1cGVyQ2xhc3Nlc1tpXS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKKwkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KFNlcnZlclV0aWwuZ2V0TW9kdWxlcygianN0LndlYiIpKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgeworCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKKwkJCQlpZiAoZGVwbG95YWJsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQorCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlRm9yTWFuZ2xlZFR5cGUoU3RyaW5nIHR5cGUsCisJCQlJVHlwZSBkZWNsYXJpbmdUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdHlwZSA9IFNpZ25hdHVyZS50b1N0cmluZyh0eXBlKTsKKwkJcmV0dXJuIGdldEZ1bGx5UXVhbGlmaWVkVHlwZUZvclR5cGUodHlwZSwgZGVjbGFyaW5nVHlwZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZUZvclR5cGUoU3RyaW5nIHR5cGUsIElUeXBlIGRlY2xhcmluZ1R5cGUpCisJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJU3RyaW5nW11bXSByZXNvbHZlZFR5cGVzID0gZGVjbGFyaW5nVHlwZS5yZXNvbHZlVHlwZSh0eXBlKTsKKwkJLy8gQXJlIHRoZXJlIGxlZ2l0IGNhc2VzIHdoZXJlIHRoaXMgd291bGQgbm90IGJlIHRoZSBjYXNlPyBXZSBtaWdodCBuZWVkIHRvIGNoZWNrCisJCS8vIGZvciB0aGlzIGFuZCBib21iIG91dCBpZiB0aGUgdHlwZSBjYW5ub3QgYmUgdW5hbWJpZ2lvdXNseSByZXNvbHZlZAorCQlpZiAocmVzb2x2ZWRUeXBlcy5sZW5ndGggIT0gMSkKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJUaGUgdHlwZSBjYW5ub3QgYmUgdW5hbWJpZ2lvdXNseSByZXNvbHZlZC4gTmVlZCB0byBoYW5kbGUgdGhpcyBjYXNlIik7CisJCVN0cmluZ1tdIHJlc29sdmVkVHlwZSA9IHJlc29sdmVkVHlwZXNbMF07CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb2x2ZWRUeXBlLmxlbmd0aCAtIDE7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZChyZXNvbHZlZFR5cGVbaV0pOworCQkJYnVmZmVyLmFwcGVuZCgnLicpOworCQl9CisKKwkJYnVmZmVyLmFwcGVuZChyZXNvbHZlZFR5cGVbcmVzb2x2ZWRUeXBlLmxlbmd0aCAtIDFdKTsKKworCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL1NlcnZsZXRUZXN0Q2FzZVByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9TZXJ2bGV0VGVzdENhc2VQcm9wZXJ0eVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MzcwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9TZXJ2bGV0VGVzdENhc2VQcm9wZXJ0eVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBEYW5pZWwgUi4gU29tZXJmaWVsZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2bGV0VGVzdENhc2VQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JU19TRVJWTEVUX1RFU1RfQ0FTRSA9ICJpc1NlcnZsZXRUZXN0Q2FzZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1VQRVJDTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSI7CisKKwlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKKwkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gbnVsbDsKKwkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgeworCQkJamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSAoKElBZGFwdGFibGUpIHJlY2VpdmVyKS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7CisJCX0KKwkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKKwkJCWlmICghamF2YUVsZW1lbnQuZXhpc3RzKCkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0CisJCQkJfHwgamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdAorCQkJCXx8IGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKKwkJCWlmIChQUk9QRVJUWV9JU19TRVJWTEVUX1RFU1RfQ0FTRS5lcXVhbHMobWV0aG9kKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIGlzU2VydmxldFRlc3RDYXNlKGphdmFFbGVtZW50KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzU2VydmxldFRlc3RDYXNlKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJCUlUeXBlIHRlc3RUeXBlID0gbnVsbDsKKworCQl0cnkgeworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7CisJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OworCQkJCXRlc3RUeXBlID0gY3UuZ2V0VHlwZShTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKGN1LmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCisJCQkJdGVzdFR5cGUgPSAoKElDbGFzc0ZpbGUpIGVsZW1lbnQpLmdldFR5cGUoKTsKKwkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkKKwkJCQl0ZXN0VHlwZSA9IChJVHlwZSkgZWxlbWVudDsKKwkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWVtYmVyKQorCQkJCXRlc3RUeXBlID0gKChJTWVtYmVyKSBlbGVtZW50KS5nZXREZWNsYXJpbmdUeXBlKCk7CisJCQkKKwkJCWlmICh0ZXN0VHlwZSAhPSBudWxsICYmIHRlc3RUeXBlLmV4aXN0cygpICYmIGlzVGVzdE9yU3VpdGUodGVzdFR5cGUpKQorCQkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2hlY2tpbmcgaXNTZXJ2bGV0IiwgZSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSB0ZXN0VHlwZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHRlc3QsIGZhbHNlIG90aGVyd2lzZQorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc1Rlc3RPclN1aXRlKElUeXBlIHRlc3RUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSVR5cGVbXSB0eXBlcyA9IHRlc3RUeXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKS5nZXRBbGxTdXBlcmNsYXNzZXModGVzdFR5cGUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAodHlwZXNbaV0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFRFU1RfU1VQRVJDTEFTU19OQU1FKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvV2ViVGVzdGFibGVSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvV2ViVGVzdGFibGVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjg3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9XZWJUZXN0YWJsZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIERhbmllbCBSLiBTb21lcmZpZWxkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLmNhY3R1czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOworCitwdWJsaWMgY2xhc3MgV2ViVGVzdGFibGVSZXNvdXJjZSBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgeworCXByaXZhdGUgYm9vbGVhbiBmU2VydmxldElzQ29uZmlndXJlZDsKKwlwcml2YXRlIFN0cmluZyBmQ2xhc3NOYW1lOworCXByaXZhdGUgU3RyaW5nIGZUZXN0TmFtZTsKKwlwcml2YXRlIFN0cmluZyBmUHJvamVjdE5hbWU7CisKKwlwdWJsaWMgV2ViVGVzdGFibGVSZXNvdXJjZShJTW9kdWxlIG1vZHVsZSwgYm9vbGVhbiBzZXJ2bGV0SXNDb25maWd1cmVkLAorCQkJU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgdGVzdE5hbWUpIHsKKwkJc3VwZXIobW9kdWxlKTsKKwkJZlNlcnZsZXRJc0NvbmZpZ3VyZWQgPSBzZXJ2bGV0SXNDb25maWd1cmVkOworCQlmQ2xhc3NOYW1lID0gY2xhc3NOYW1lOworCQlmVGVzdE5hbWUgPSB0ZXN0TmFtZTsKKwkJZlByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7CisJfQorCisJcHVibGljIFdlYlRlc3RhYmxlUmVzb3VyY2UoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKKwkJcmV0dXJuIGZQcm9qZWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1NlcnZsZXRDb25maWd1cmVkKCkgeworCQlyZXR1cm4gZlNlcnZsZXRJc0NvbmZpZ3VyZWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisJCXJldHVybiBmQ2xhc3NOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7CisJCXJldHVybiBmVGVzdE5hbWU7CisJfQorCisJLyoKKwkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RDYWN0dXNUZXN0LCBmVGVzdE5hbWUpOworCX0KKworCS8qCisJICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI2Rlc2VyaWFsaXplKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShTdHJpbmcgcykgeworCQlpbnQgaW5kID0gcy5pbmRleE9mKCIvLyIpOworCQlzdXBlci5kZXNlcmlhbGl6ZShzLnN1YnN0cmluZygwLCBpbmQpKTsKKwkJcyA9IHMuc3Vic3RyaW5nKGluZCsyKTsKKwkJaW5kID0gcy5pbmRleE9mKCIvLyIpOworCQlmUHJvamVjdE5hbWUgPSBzLnN1YnN0cmluZygwLCBpbmQpOworCQkKKwkJcyA9IHMuc3Vic3RyaW5nKGluZCsyKTsKKwkJaW5kID0gcy5pbmRleE9mKCIvLyIpOworCQlmQ2xhc3NOYW1lID0gcy5zdWJzdHJpbmcoMCwgaW5kKTsKKwkJCisJCWlmICgnVCcgPT0gcy5jaGFyQXQoaW5kKzIpKQorCQkJZlNlcnZsZXRJc0NvbmZpZ3VyZWQgPSB0cnVlOworCQllbHNlCisJCQlmU2VydmxldElzQ29uZmlndXJlZCA9IGZhbHNlOworCQlmVGVzdE5hbWUgPSBzLnN1YnN0cmluZyhpbmQrMyk7CisJfQorCisJLyoKKwkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjc2VyaWFsaXplKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZSgpIHsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5zZXJpYWxpemUoKSk7CisJCXNiLmFwcGVuZCgiLy8iKTsKKwkJc2IuYXBwZW5kKGZQcm9qZWN0TmFtZSk7CisJCXNiLmFwcGVuZCgiLy8iKTsKKwkJc2IuYXBwZW5kKGZDbGFzc05hbWUpOworCQlzYi5hcHBlbmQoIi8vIik7CisJCWlmIChmU2VydmxldElzQ29uZmlndXJlZCkKKwkJCXNiLmFwcGVuZCgiVCIpOworCQllbHNlCisJCQlzYi5hcHBlbmQoIkYiKTsKKwkJc2IuYXBwZW5kKGZUZXN0TmFtZSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmEzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDY2IEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZSB3aWR0aD0iNTAwIj4KKzx0cj4KKzx0ZD4KKzxwPlN1cHBvcnQgZm9yIEphdmEgYW5kIEoyRUUgc2VydmVyIHR5cGVzLjwvcD4KKzwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzx0YWJsZSB3aWR0aD0iNTAwIj4KKzx0cj4KKzx0ZD4KKzxwPlRoZSBDbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlciBjbGFzcyBwcm92aWRlcyBhIGNvbW1vbiBzdWJjbGFzcworZm9yIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXJzIHRoYXQgbmVlZCB0byBtb2RpZnkgYSBwcm9qZWN0J3MgY2xhc3NwYXRoCit3aGVuIGEgcHJvamVjdCBpcyB0YXJnZXR0ZWQgdG8gYSBwYXJ0aWN1bGFyIHJ1bnRpbWUuPC9wPgorPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPHRhYmxlIHdpZHRoPSI1MDAiPgorPHRyPgorPHRkPgorPHA+SUdlbmVyaWNSdW50aW1lIGFuZCBpdHMgd29ya2luZyBjb3B5IHByb3ZpZGUgdHlwZS1zcGVjaWZpYyBhY2Nlc3MKK3RvIHRoZSBnZW5lcmljIHJ1bnRpbWUgdHlwZS4gV2hlbiB1c2luZyBhIGdlbmVyaWMgcnVudGltZSwgY2xpZW50cyBjYW4KK2FjY2VzcyB0aGUgdHlwZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBieSBhZGFwdGluZyB0byB0aGVzZSB0eXBlcyB1c2luZworPHByZT5JR2VuZXJpY1J1bnRpbWUgZ3IgPSAoSUdlbmVyaWNSdW50aW1lKSBydW50aW1lLmdldEFkYXB0ZXIoSUdlbmVyaWNSdW50aW1lLmNsYXNzKTwvcHJlPi4KK0dlbmVyaWNSdW50aW1lVXRpbCBjb250YWlucyBzb21lIHV0aWxpdHkgbWV0aG9kcyBmb3IgaGFuZGxpbmcgdGhlCitnZW5lcmljIHJ1bnRpbWUgdHlwZS48L3A+Cis8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjUwMCI+Cis8dHI+Cis8dGQ+Cis8cD5JRW50ZXJwcmlzZUFwcGxpY2F0aW9uLCBJRUpCTW9kdWxlLCBJV2ViTW9kdWxlLCBJQXBwbGljYXRpb25DbGllbnRNb2R1bGUsCithbmQgSUNvbm5lY3Rvck1vZHVsZSBhcmUgSjJFRSBtb2R1bGUgaW50ZXJmYWNlcyBtZWFudCB0byBiZSBpbXBsZW1lbnRlZAorYnkgbW9kdWxlIGRlbGVnYXRlcyB0aGF0IHByb3ZpZGUgSjJFRSBtb2R1bGUgc3VwcG9ydC48L3A+Cis8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjUwMCI+Cis8dHI+Cis8dGQ+Cis8cD5JTG9vc2VBcmNoaXZlIGFuZCBJTG9vc2VBcmNoaXZlU3VwcG9ydCBhcmUgbW9kdWxlIGludGVyZmFjZXMgZm9yIG1vZHVsZXMKK3RoYXQgdGFrZSBhZHZhbnRhZ2Ugb2YgbG9vc2UgYXJjaGl2ZSBzdXBwb3J0IC0gYWxsb3dpbmcgSkFScyBjb250YWluZWQgd2l0aGluCit0aGUgbW9kdWxlIHRvIGJlIGF2YWlsYWJsZSBpbiBhIHNlcGFyYXRlIEphdmEgcHJvamVjdCBpbnN0ZWFkIG9mIGRpcmVjdGx5Cit3aXRoaW4gdGhlIG1vZHVsZS48L3A+Cis8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjUwMCI+Cis8dHI+Cis8dGQ+Cis8cD5UaGUgcmVtYWluZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgbW9kdWxlIGFydGlmYWN0IGFuZAorbGF1bmNoYWJsZSB0eXBlcyB0byBwcm92aWRlIGFjY2VzcyB0byBKMkVFIHJlc291cmNlIHR5cGVzIGZvciB0aGUgc2VydmVyIHRvb2wKK2ZyYW1ld29yay48L3A+Cis8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGMwNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGh0bWw+Cis8aGVhZD4KKwk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KKwk8bWV0YQorCQluYW1lPSJyb290IgorCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8iIC8+CisJPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPHA+U3VwcG9ydCBmb3IgSmF2YSBhbmQgSjJFRSBzZXJ2ZXIgdHlwZXMuPC9wPgorCis8cD5UaGUgQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIgY2xhc3MgcHJvdmlkZXMgYSBjb21tb24gc3ViY2xhc3MKK2ZvciBydW50aW1lIHRhcmdldCBoYW5kbGVycyB0aGF0IG5lZWQgdG8gbW9kaWZ5IGEgcHJvamVjdCdzIGNsYXNzcGF0aAord2hlbiBhIHByb2plY3QgaXMgdGFyZ2V0dGVkIHRvIGEgcGFydGljdWxhciBydW50aW1lLjwvcD4KKworPHA+SUdlbmVyaWNSdW50aW1lIGFuZCBpdHMgd29ya2luZyBjb3B5IHByb3ZpZGUgdHlwZS1zcGVjaWZpYyBhY2Nlc3MKK3RvIHRoZSBnZW5lcmljIHJ1bnRpbWUgdHlwZS4gV2hlbiB1c2luZyBhIGdlbmVyaWMgcnVudGltZSwgY2xpZW50cyBjYW4KK2FjY2VzcyB0aGUgdHlwZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBieSBhZGFwdGluZyB0byB0aGVzZSB0eXBlcyB1c2luZworPHByZT5JR2VuZXJpY1J1bnRpbWUgZ3IgPSAoSUdlbmVyaWNSdW50aW1lKSBydW50aW1lLmdldEFkYXB0ZXIoSUdlbmVyaWNSdW50aW1lLmNsYXNzKTwvcHJlPi4KK0dlbmVyaWNSdW50aW1lVXRpbCBjb250YWlucyBzb21lIHV0aWxpdHkgbWV0aG9kcyBmb3IgaGFuZGxpbmcgdGhlCitnZW5lcmljIHJ1bnRpbWUgdHlwZS48L3A+CisKKzxwPklFbnRlcnByaXNlQXBwbGljYXRpb24sIElFSkJNb2R1bGUsIElXZWJNb2R1bGUsIElBcHBsaWNhdGlvbkNsaWVudE1vZHVsZSwKK2FuZCBJQ29ubmVjdG9yTW9kdWxlIGFyZSBKMkVFIG1vZHVsZSBpbnRlcmZhY2VzIG1lYW50IHRvIGJlIGltcGxlbWVudGVkCitieSBtb2R1bGUgZGVsZWdhdGVzIHRoYXQgcHJvdmlkZSBKMkVFIG1vZHVsZSBzdXBwb3J0LjwvcD4KKworPHA+SUxvb3NlQXJjaGl2ZSBhbmQgSUxvb3NlQXJjaGl2ZVN1cHBvcnQgYXJlIG1vZHVsZSBpbnRlcmZhY2VzIGZvciBtb2R1bGVzCit0aGF0IHRha2UgYWR2YW50YWdlIG9mIGxvb3NlIGFyY2hpdmUgc3VwcG9ydCAtIGFsbG93aW5nIEpBUnMgY29udGFpbmVkIHdpdGhpbgordGhlIG1vZHVsZSB0byBiZSBhdmFpbGFibGUgaW4gYSBzZXBhcmF0ZSBKYXZhIHByb2plY3QgaW5zdGVhZCBvZiBkaXJlY3RseQord2l0aGluIHRoZSBtb2R1bGUuPC9wPgorCis8cD5UaGUgcmVtYWluZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgbW9kdWxlIGFydGlmYWN0IGFuZAorbGF1bmNoYWJsZSB0eXBlcyB0byBwcm92aWRlIGFjY2VzcyB0byBKMkVFIHJlc291cmNlIHR5cGVzIGZvciB0aGUgc2VydmVyIHRvb2wKK2ZyYW1ld29yay48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzQ2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vbml0b3Jjb3JlLyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQxZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5jdnNpZ25vcmUKQEAgLTAsMCArMSw4IEBACitiaW4KK21vbml0b3Jjb3JlLmphcgorYnVpbGQueG1sCit0ZW1wLmZvbGRlcgorb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZV8zLjAuMC5qYXIKK0Bkb3QKK3NyYy56aXAKK2phdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzA3MGVlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5vcHRpb25zCkBAIC0wLDAgKzEsNiBAQAorIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUgcGx1Z2luCisKKyMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZworb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9kZWJ1Zz10cnVlCisKK29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvcGFyc2luZz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjIzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGJlNDMyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjA4NTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzcgQEAKKyNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQoraW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjZTIwOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI0ZyaSBGZWIgMjMgMjE6MTY6MjEgRVNUIDIwMDcKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTYwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpAQCAtMCwwICsxLDE0IEBACisjU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgorY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCitjb21waWxlcnMucC5idWlsZD0wCitjb21waWxlcnMucC5kZXByZWNhdGVkPTEKK2NvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCitjb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCitjb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCitjb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKK2NvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKK2NvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Y2ZiNDgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxNCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4zMDQucXVhbGlmaWVyCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3JQbHVnaW4KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiLAorIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSIsCisgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSIKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTlkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYWJvdXQuaHRtbApAQCAtMCwwICsxLDM0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8SFRNTD4KKworPGhlYWQ+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPC9oZWFkPgorCis8Qk9EWSBsYW5nPSJFTi1VUyI+CisKKzxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgorCis8UD5KdW5lLCAyMDA4PC9QPgorCis8SDM+TGljZW5zZTwvSDM+CisKKzxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKKygiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAordW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAorKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Cis8QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgorCis8UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKK0NvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCit0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKK0NoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAorbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCit0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAorPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlZDU2MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2Jpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICAub3B0aW9ucyxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbAorYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKKyAgICAgICAgICAgICAgIEBkb3QvKiosXAorICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKK3NyYy5pbmNsdWRlcyA9IHNjaGVtYS8KK3NvdXJjZS4uID0gbW9uaXRvcmNvcmUvCitvdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0FjY2VwdFRocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQWNjZXB0VGhyZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxMTFhYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0FjY2VwdFRocmVhZC5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKKy8qKgorICogVGhlIGFjdHVhbCBUQ1AvSVAgbW9uaXRvcmluZyBzZXJ2ZXIuIFRoaXMgaXMgYSB0aHJlYWQgdGhhdAorICogbGlzdGVucyBvbiBhIHBvcnQgYW5kIHJlbGF5cyBhIGNhbGwgdG8gYW5vdGhlciBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBBY2NlcHRUaHJlYWQgeworCXByb3RlY3RlZCBJTW9uaXRvciBtb25pdG9yOworCisJcHJvdGVjdGVkIGJvb2xlYW4gYWxpdmUgPSB0cnVlOworCXByb3RlY3RlZCBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0OworCisJcHJvdGVjdGVkIFRocmVhZCB0aHJlYWQ7CisKKwljbGFzcyBTZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCQlwdWJsaWMgU2VydmVyVGhyZWFkKCkgeworCQkJc3VwZXIoIlRDUC9JUCBNb25pdG9yIik7CisJCX0KKworCQkvKioKKwkJICogU2VydmVyVGhyZWFkIGFjY2VwdHMgaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIGRlbGVnYXRlcyB0byB0aGUgcHJvdG9jb2wKKwkJICogYWRhcHRlciB0byBkZWFsIHdpdGggdGhlIGNvbm5lY3Rpb24uCisJCSAqLworCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkvLyBjcmVhdGUgYSBuZXcgc2VydmVyIHNvY2tldAorCQkJdHJ5IHsKKwkJCQlzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KG1vbml0b3IuZ2V0TG9jYWxQb3J0KCkpOworCQkJCXNlcnZlclNvY2tldC5zZXRTb1RpbWVvdXQoMjAwMCk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTW9uaXRvcmluZyBsb2NhbGhvc3Q6IiArIG1vbml0b3IuZ2V0TG9jYWxQb3J0KCkgKyAiIC0+ICIgKyBtb25pdG9yLmdldFJlbW90ZUhvc3QoKQorCQkJCQkJKyAiOiIgKyBtb25pdG9yLmdldFJlbW90ZVBvcnQoKSk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzdGFydCBtb25pdG9yaW5nIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQl3aGlsZSAoYWxpdmUpIHsKKwkJCQl0cnkgeworCQkJCQkvLyBhY2NlcHQgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY2xpZW50CisJCQkJCVNvY2tldCBsb2NhbFNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKwkJCQkJCisJCQkJCWludCB0aW1lb3V0ID0gbW9uaXRvci5nZXRUaW1lb3V0KCk7CisJCQkJCWlmICh0aW1lb3V0ICE9IDApCisJCQkJCQlsb2NhbFNvY2tldC5zZXRTb1RpbWVvdXQodGltZW91dCk7CisJCQkJCQorCQkJCQl0cnkgeworCQkJCQkJLy8gY29ubmVjdCB0byB0aGUgcmVtb3RlIHNlcnZlcgorCQkJCQkJU29ja2V0IHJlbW90ZVNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKwkJCQkJCWlmICh0aW1lb3V0ICE9IDApCisJCQkJCQkJcmVtb3RlU29ja2V0LnNldFNvVGltZW91dCh0aW1lb3V0KTsKKwkJCQkJCQorCQkJCQkJcmVtb3RlU29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpLCBtb25pdG9yLmdldFJlbW90ZVBvcnQoKSksIHRpbWVvdXQpOworCQkJCQkJCisJCQkJCQkvLyByZWxheSB0aGUgY2FsbCB0aHJvdWdoCisJCQkJCQlTdHJpbmcgcHJvdG9jb2xJZCA9IG1vbml0b3IuZ2V0UHJvdG9jb2woKTsKKwkJCQkJCVByb3RvY29sQWRhcHRlciBhZGFwdGVyID0gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb3RvY29sQWRhcHRlcihwcm90b2NvbElkKTsKKwkJCQkJCWFkYXB0ZXIuY29ubmVjdChtb25pdG9yLCBsb2NhbFNvY2tldCwgcmVtb3RlU29ja2V0KTsKKwkJCQkJfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlGYWlsZWRDb25uZWN0aW9uVGhyZWFkIHRocmVhZDIgPSBuZXcgRmFpbGVkQ29ubmVjdGlvblRocmVhZCgoTW9uaXRvcikgbW9uaXRvciwgbG9jYWxTb2NrZXQsIE1lc3NhZ2VzLmVycm9yQ29ubmVjdFRpbWVvdXQpOworCQkJCQkJdGhyZWFkMi5zdGFydCgpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJRmFpbGVkQ29ubmVjdGlvblRocmVhZCB0aHJlYWQyID0gbmV3IEZhaWxlZENvbm5lY3Rpb25UaHJlYWQoKE1vbml0b3IpIG1vbml0b3IsIGxvY2FsU29ja2V0LCBudWxsKTsKKwkJCQkJCXRocmVhZDIuc3RhcnQoKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBkbyBub3RoaW5nCisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJaWYgKGFsaXZlKQorCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2hpbGUgbW9uaXRvcmluZyIsIGUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEFjY2VwdFRocmVhZCBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gbW9uaXRvciBhIG1vbml0b3IKKwkgKi8KKwlwdWJsaWMgQWNjZXB0VGhyZWFkKElNb25pdG9yIG1vbml0b3IpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKKwl9CisJCisJLyoqCisJICogU3RhcnQgdGhlIHNlcnZlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydFNlcnZlcigpIHsKKwkJaWYgKHRocmVhZCAhPSBudWxsKQorCQkJcmV0dXJuOworCQl0aHJlYWQgPSBuZXcgU2VydmVyVGhyZWFkKCk7CisJCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisJCXRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSArIDEpOworCQl0aHJlYWQuc3RhcnQoKTsKKwkJCisJCVRocmVhZC55aWVsZCgpOworCQkKKwkJLy8gd2FpdCB1cCB0byAyIHNlY29uZHMgZm9yIGluaXRpYWxpemF0aW9uCisJCWludCBpID0gMDsKKwkJd2hpbGUgKHNlcnZlclNvY2tldCA9PSBudWxsICYmIGkgPCAxMCkgeworCQkJdHJ5IHsKKwkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCQlpKys7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgaXMgcnVubmluZywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqICAgIG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKwkJcmV0dXJuICh0aHJlYWQgIT0gbnVsbCk7CisJfQorCisJLyoqCisJICogQ29ycmVjdGx5IGNsb3NlIHRoZSBzZXJ2ZXIgc29ja2V0IGFuZCBzaHV0IGRvd24gdGhlIHNlcnZlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkgeworCQl0cnkgeworCQkJYWxpdmUgPSBmYWxzZTsKKwkJCXRocmVhZCA9IG51bGw7CisJCQkKKwkJCVN0cmluZyBwcm90b2NvbElkID0gbW9uaXRvci5nZXRQcm90b2NvbCgpOworCQkgICBQcm90b2NvbEFkYXB0ZXIgYWRhcHRlciA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm90b2NvbEFkYXB0ZXIocHJvdG9jb2xJZCk7CisJCQlhZGFwdGVyLmRpc2Nvbm5lY3QobW9uaXRvcik7CisJCQlpZiAoc2VydmVyU29ja2V0ICE9IG51bGwpCisJCQkJc2VydmVyU29ja2V0LmNsb3NlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzdG9wcGluZyBzZXJ2ZXIiLCBlKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwb3J0IGlzIGluIHVzZS4KKwkgKgorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqIEBwYXJhbSBwb3J0IGludAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BvcnRJblVzZShpbnQgcG9ydCkgeworCQlTZXJ2ZXJTb2NrZXQgcyA9IG51bGw7CisJCXRyeSB7CisJCQlzID0gbmV3IFNlcnZlclNvY2tldChwb3J0KTsKKwkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0gZmluYWxseSB7CisJCQlpZiAocyAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJcy5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Db25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Db25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2ZmIzOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0Nvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uIHsKKwlwcm90ZWN0ZWQgU29ja2V0IGluOworCXByb3RlY3RlZCBTb2NrZXQgb3V0OworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gaW4gaW5ib3VuZCBzb2NrZXQKKwkgKiBAcGFyYW0gb3V0IG91dGJvdW5kIHNvY2tldAorCSAqLworCXB1YmxpYyBDb25uZWN0aW9uKFNvY2tldCBpbiwgU29ja2V0IG91dCkgeworCQl0aGlzLmluID0gaW47CisJCXRoaXMub3V0ID0gb3V0OworCX0KKworCS8qKgorCSAqIENsb3NlIHRoZSBjb25uZWN0aW9uLgorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJDbG9zaW5nIGNvbm5lY3Rpb24iKTsKKwkJdHJ5IHsKKwkJCWluLmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7CisJCQlpbi5zaHV0ZG93bklucHV0KCk7CisJCQlpbi5zaHV0ZG93bk91dHB1dCgpOworCQkJCisJCQlvdXQuZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKKwkJCW91dC5zaHV0ZG93bklucHV0KCk7CisJCQlvdXQuc2h1dGRvd25PdXRwdXQoKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNvbm5lY3Rpb24gY2xvc2VkIik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGNsb3NpbmcgY29ubmVjdGlvbiAiICsgdGhpcywgZXgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQ29udGVudEZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQ29udGVudEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTY0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Db250ZW50RmlsdGVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50RmlsdGVyRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIENvbnRlbnRGaWx0ZXIgaW1wbGVtZW50cyBJQ29udGVudEZpbHRlciB7CisJcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OworCXByb3RlY3RlZCBDb250ZW50RmlsdGVyRGVsZWdhdGUgZGVsZWdhdGU7CisJCisJcHJvdGVjdGVkIENvbnRlbnRGaWx0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGlkLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGlkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBvcmRlciBmb3IgdGhpcyBmaWx0ZXIuCisJICogCisJICogQHJldHVybiB0aGUgb3JkZXIKKwkgKi8gCisJcHVibGljIGludCBnZXRPcmRlcigpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcmRlciIpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuYW1lCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKwl9CisKKwkvKioKKwkgKiBEbyB0aGUgZmlsdGVyaW5nLgorCSAqIAorCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0CisJICogQHBhcmFtIGlzUmVxdWVzdCB0cnVlIGlmIHJlcXVlc3QsIGZhbHNlIGlmIHJlc3BvbnNlCisJICogQHBhcmFtIGNvbnRlbnQgdGhlIGNvbnRlbnQKKwkgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBjb250ZW50CisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gcHJvYmxlbQorCSAqLworCXB1YmxpYyBieXRlW10gZmlsdGVyKFJlcXVlc3QgcmVxdWVzdCwgYm9vbGVhbiBpc1JlcXVlc3QsIGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlkZWxlZ2F0ZSA9IChDb250ZW50RmlsdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBjb250ZW50IGZpbHRlciBkZWxlZ2F0ZTogIiArIGdldElkKCksIGUpOworCQkJCXJldHVybiBuZXcgYnl0ZVswXTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGVsZWdhdGUuZmlsdGVyKHJlcXVlc3QsIGlzUmVxdWVzdCwgY29udGVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvRmFpbGVkQ29ubmVjdGlvblRocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvRmFpbGVkQ29ubmVjdGlvblRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZDQ1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9GYWlsZWRDb25uZWN0aW9uVGhyZWFkLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7CisKKy8qKgorICogVGhyZWFkIHVzZWQgaWYgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBmYWlscy4KKyAqLworcHVibGljIGNsYXNzIEZhaWxlZENvbm5lY3Rpb25UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVIgPSAyMDQ4OworCXByb3RlY3RlZCBNb25pdG9yIG1vbml0b3I7CisJcHJvdGVjdGVkIFNvY2tldCBzb2NrZXQ7CisJcHJvdGVjdGVkIFN0cmluZyBlcnJvcjsKKworCXB1YmxpYyBGYWlsZWRDb25uZWN0aW9uVGhyZWFkKE1vbml0b3IgbW9uaXRvciwgU29ja2V0IHNvY2tldCwgU3RyaW5nIGVycm9yKSB7CisJCXN1cGVyKCk7CisJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CisJCXRoaXMuc29ja2V0ID0gc29ja2V0OworCQl0aGlzLmVycm9yID0gZXJyb3I7CisJfQorCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChtb25pdG9yLCBJUHJvdG9jb2xBZGFwdGVyLlRDUElQX1BST1RPQ09MX0lELCBtb25pdG9yLmdldExvY2FsUG9ydCgpLCBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpOworCQlTdHJpbmcgZXJyID0gZXJyb3I7CisJCWlmIChlcnIgPT0gbnVsbCkKKwkJCWVyciA9IE1lc3NhZ2VzLmVycm9yQ29ubmVjdFRvU2VydmVyOworCQlyZXF1ZXN0LmFkZFRvUmVzcG9uc2UoZXJyLmdldEJ5dGVzKCkpOworCQkKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIGluID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisJCQlieXRlW10gYiA9IG5ldyBieXRlW0JVRkZFUl07CisJCQl3aGlsZSAoaW4uYXZhaWxhYmxlKCkgPiAwKSB7CisJCQkJaW50IG4gPSBpbi5yZWFkKGIpOworCQkJCWJ5dGVbXSBjID0gbmV3IGJ5dGVbbl07CisJCQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCBjLCAwLCBuKTsKKwkJCQlyZXF1ZXN0LmFkZFRvUmVxdWVzdChjKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlzb2NrZXQuc2h1dGRvd25JbnB1dCgpOworCQkJCXNvY2tldC5zaHV0ZG93bk91dHB1dCgpOworCQkJCXNvY2tldC5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSUNvbnRlbnRGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lDb250ZW50RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljN2JiNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lDb250ZW50RmlsdGVyLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKKy8qKgorICogQSBjb250ZW50IGZpbHRlciB0aGF0IGZpbHRlcnMgc3BlY2lmaWMgY29udGVudHMgZnJvbSB0aGUgbW9uaXRvciB0cmFmZmljCisgKiBvZiBhIHJlcXVlc3QuIAorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJQ29udGVudEZpbHRlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBmaWx0ZXIuCisJICogRWFjaCBmaWx0ZXIgaGFzIGEgZGlzdGluY3QsIGZpeGVkIGlkLiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOworCSAqIHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCisJICogCisJICogQHJldHVybiB0aGUgZWxlbWVudCBpZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlICh0cmFuc2xhdGVkKSBuYW1lIGZvciB0aGlzIGZpbHRlci4KKwkgKgorCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBvcmRlciBvZiB0aGlzIGZpbHRlci4KKwkgKiBFYWNoIGZpbHRlciBoYXMgYSByZWxhdGl2ZSBvcmRlciB0aGF0IGFsbG93cyB0aGVtIHRvIGJlIGFwcGxpZWQgaW4gdGhlIGNvcnJlY3QKKwkgKiBvcmRlciByZWxhdGl2ZSB0byBlYWNoIG90aGVyLiBMb3dlciBvcmRlcnMgYXJlIHByb2Nlc3NlZCBmaXJzdC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHJlbGF0aXZlIG9yZGVyCisJICogCisJICogW2lzc3VlOiBDUyAtIFRoZSBzY2hlbWEgKGNvbnRlbnRGaWx0ZXJucy5leHNkKSBkZWZpbmVzIGFuICdvcmRlcicgYXR0cmlidXRlLiAgCisJICogVGhlIGNvbW1lbnRzIGFib3ZlIHN1Z2dlc3QgdGhhdCBmaWx0ZXJzIHNob3VsZCBiZSBkZXNpZ25lZCB0byBiZSBjb21wb3NhYmxlLiAgSXMgdGhpcyBjb3JyZWN0PyAgCisJICogSXQgd291bGQgYmUgZ29vZCB0byBtYWtlIHRoaXMgb3B0aW9uYWwgaWYgdGhlIHVzZXIgaGFkIG5vIGlkZWEgaG93IGhpcyBmaWx0ZXIgc2hvdWxkIGJlIG9yZGVyZWQuCisJICogSSd2ZSBmb3VuZCB0aGF0IHNvbWV0aW1lcyAnbG93JywgJ21lZGl1bScsICdoaWdoJyBhcmUgYWRlcXVhdGUgdG8gaGFuZGxlIG9yZGVyaW5nIGlzc3VlcyBhbmQgYXJlIAorCSAqIGVhc2llciBmb3IgdGhlIGV4dGVuc2lvbiB3cml0ZXIgZGVhbCB3aXRoIGFuZCBnZXQgYSBzZW5zZSBvZiB0aGUgcHJvcGVyIHZhbHVlIHRvIGFzc2lnbi4gXQorCSAqLworCS8vcHVibGljIGludCBnZXRPcmRlcigpOworCisJLyoqCisJICogRmlsdGVyIHRoZSBnaXZlbiBjb250ZW50IGZyb20gdGhlIGdpdmVuIHJlcXVlc3QuIFRoZSBjb250ZW50IHRoYXQgaGFzIGJlZW4gZmlsdGVyZWQgb3V0IHdpbGwgCisJICogbm90IGJlIHNob3duIHRvIGNsaWVudHMgb2YgdGhlIFRDUC9JUCBtb25pdG9yLgorCSAqIAorCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRoYXQgdGhlIGZpbHRlciB3aWxsIGJlIHBlcmZvcm1lZCBvbgorCSAqIEBwYXJhbSBpc1JlcXVlc3Qgc2V0IHRvIHRydWUgaWYgdGhlIGNvbnRlbnQgZmlsdGVyIGFwcGxpZXMgdG8gcmVxdWVzdCBtb25pdG9yIHRyYWZmaWMsCisJICogICAgb3Igc2V0IHRvIGZhbHNlIGlmIHRoZSBjb250ZW50IGZpbHRlciBhcHBsaWVzIHRvIHRoZSByZXNwb25zZSBtb25pdG9yIHRyYWZmaWMKKwkgKiBAcGFyYW0gY29udGVudCB0aGUgbWVzc2FnZSBjb250ZW50IHRvIGJlIGZpbHRlcmVkIG91dAorCSAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGNvbnRlbnQKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHBhcnNpbmcgb3IgZmlsdGVyaW5nIHRoZSBjb250ZW50CisJICovCisJcHVibGljIGJ5dGVbXSBmaWx0ZXIoUmVxdWVzdCByZXF1ZXN0LCBib29sZWFuIGlzUmVxdWVzdCwgYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JTWVtZW50by5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTVmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JTWVtZW50by5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7CisvKioKKyAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0CisgKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAqIDxwPgorICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6CisgKiA8b2w+CisgKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCisgKiAgICA8L2xpPgorICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKKyAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KKyAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKKyAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCisgKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KKyAqIDwvb2w+CisgKiA8L3A+CisgKiA8cD4KKyAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKKyAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZworICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgorICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCisgKiA8L3A+PHA+CisgKiBUaGUga2V5IGZvciBhbiBhdHRyaWJ1dGUgbWF5IGJlIGFueSBhbHBoYSBudW1lcmljIHZhbHVlLiAgSG93ZXZlciwgdGhlCisgKiB2YWx1ZSBvZiA8Y29kZT5UQUdfSUQ8L2NvZGU+IGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCisgKiA8L3A+PHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KKwkgKiA8cD4KKwkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcworCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQorCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bworCSAqIEBzZWUgI2dldENoaWxkCisJICogQHNlZSAjZ2V0Q2hpbGRyZW4KKwkgKi8KKwlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCisJICoKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUKKwkgKi8KKwlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpOworCQorCS8qKgorCSAqIFJldHVybnMgYWxsIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCisJICoKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAorCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZQorCSAqLworCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KKwkgKgorCSAqIEBwYXJhbSBrZXkgdGhlIGtleQorCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCisJICogICBidXQgd2FzIG5vdCBhbiBpbnRlZ2VyCisJICovCisJcHVibGljIEludGVnZXIgZ2V0SW50ZWdlcihTdHJpbmcga2V5KTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgorCSAqCisJICogQHBhcmFtIGtleSB0aGUga2V5CisJICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKKwkgKiAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgorCSAqCisJICogQHBhcmFtIGtleSB0aGUga2V5CisJICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKKwkgKiAgYnV0IHdhcyBub3QgYSBib29sZWFuCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGludGVnZXIuCisJICoKKwkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisJICovCisJcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgdmFsdWUpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGJvb2xlYW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisJICovCisJcHVibGljIHZvaWQgcHV0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KKwkgKgorCSAqIEBwYXJhbSBrZXkgdGhlIGtleQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JUHJvdG9jb2xBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JUHJvdG9jb2xBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhODM4YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lQcm90b2NvbEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKy8qKgorICogQSBwcm90b2NvbCBhZGFwdGVyIGVuYWJsZXMgYSBtb25pdG9yIHRvIHN1cHBvcnQgYSBwYXJ0aWN1bGFyIG5ldHdvcmsKKyAqIHByb3RvY29sIHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBBbGwgc3VwcG9ydGVkCisgKiBwcm90b2NvbHMgd2lsbCBiZSBiYXNlZCBvbiBUQ1AvSVAuCisgKiA8cD4KKyAqIFByb3RvY29sIGFkYXB0ZXJzIGFyZSByZWdpc3RlcmVkIHZpYSB0aGUgPGNvZGU+cHJvdG9jb2xBZGFwYXRlcnM8L2NvZGU+CisgKiBleHRlbnNpb24gcG9pbnQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU8L2NvZGU+CisgKiBwbHVnLWluLiBUaGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gcHJvdG9jb2wgYWRhcHRlcnMgaXMgYXZhaWxhYmxlIHZpYQorICoge0BsaW5rIE1vbml0b3JQbHVnaW4jZ2V0UHJvdG9jb2xBZGFwdGVycygpfS4gU3RhbmRhcmQgcHJvdG9jb2wKKyAqIGFkYXB0ZXJzIGZvciB7QGxpbmtwbGFpbiAjSFRUUF9QUk9UT0NPTF9JRCBIVFRQfSBhbmQKKyAqIHtAbGlua3BsYWluICNUQ1BJUF9QUk9UT0NPTF9JRCBUQ1AvSVB9IGFyZSBidWlsdC1pbi4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVByb3RvY29sQWRhcHRlciB7CisJLyoqCisJICogUHJvdG9jb2wgYWRhcHRlciBpZCAodmFsdWUge0B2YWx1ZX0pIGZvciBUQ1AvSVAuCisJICogVGhlIFRDUC9JUCBwcm90b2NvbCBhZGFwdGVyIGlzIHN0YW5kYXJkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRDUElQX1BST1RPQ09MX0lEID0gIlRDUC9JUCI7CisKKwkvKioKKwkgKiBQcm90b2NvbCBhZGFwdGVyIGlkICh2YWx1ZSB7QHZhbHVlfSkgZm9yIEhUVFAuCisJICogVGhlIEhUVFAgcHJvdG9jb2wgYWRhcHRlciBpcyBzdGFuZGFyZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX1BST1RPQ09MX0lEID0gIkhUVFAiOworCisJLyoqCisJICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBhZGFwdGVyLgorCSAqIEVhY2ggYWRhcHRlciBoYXMgYSBkaXN0aW5jdCwgZml4ZWQgaWQuIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZAorCSAqIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90IGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGlkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgKHRyYW5zbGF0ZWQpIG5hbWUgZm9yIHRoaXMgYWRhcHRlci4KKwkgKgorCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JU3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSVN0YXJ0dXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE0MTcwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSVN0YXJ0dXAuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOworLyoqCisgKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSBzdGFydHVwIGV4dGVuc2lvbiBwb2ludC4KKyAqIFBsdWctaW5zIHRoYXQgcmVnaXN0ZXIgYSBzdGFydHVwIGV4dGVuc2lvbiB3aWxsIGJlIGFjdGl2YXRlZCB3aGVuIHRoZSBtb25pdG9yCisgKiBjb3JlIHBsdWctaW4gaW5pdGlhbGl6ZXMgYW5kIGhhdmUgYW4gb3Bwb3J0dW5pdHkgdG8gcnVuIGNvZGUgdGhhdCBjYW4ndCBiZQorICogaW1wbGVtZW50ZWQgdXNpbmcgdGhlIG5vcm1hbCBjb250cmlidXRpb24gbWVjaGFuaXNtcy4KKyAqLworcHVibGljIGludGVyZmFjZSBJU3RhcnR1cCB7CisJLyoqCisJICogV2lsbCBiZSBjYWxsZWQgb24gbW9uaXRvciBjb3JlIHN0YXJ0dXAuCisJICovCisJcHVibGljIHZvaWQgc3RhcnR1cCgpOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0YWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisvKioKKyAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnZhbGlkTG9jYWxQb3J0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW52YWxpZFJlbW90ZVBvcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnZhbGlkUmVtb3RlSG9zdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvbm5lY3RUb1NlcnZlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvbm5lY3RUaW1lb3V0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vbml0b3JWYWxpZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvbnRlbnRTaXplOworCisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5YzNmMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyAtLS0tLS0tLS0tLS0tLS0gRXJyb3JzIC0tLS0tLS0tLS0tLS0tLQorZXJyb3JQb3J0SW5Vc2U9VGhlIFRDUC9JUCBtb25pdG9yIGNvdWxkIG5vdCBzdGFydCBiZWNhdXNlIHBvcnQgezB9IGlzIGluIHVzZS4KK2Vycm9ySW52YWxpZExvY2FsUG9ydD1UaGUgbG9jYWwgcG9ydCBudW1iZXIgaXMgaW52YWxpZC4KK2Vycm9ySW52YWxpZFJlbW90ZVBvcnQ9VGhlIHJlbW90ZSBwb3J0IG51bWJlciBpcyBpbnZhbGlkLgorZXJyb3JJbnZhbGlkUmVtb3RlSG9zdD1UaGUgcmVtb3RlIGhvc3QgbmFtZSBpcyBpbnZhbGlkLgorZXJyb3JDb25uZWN0VG9TZXJ2ZXI9RXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlci4KK2Vycm9yQ29ubmVjdFRpbWVvdXQ9RXJyb3I6IFRpbWVvdXQgY29ubmVjdGluZyB0byBzZXJ2ZXIuCitlcnJvckNvbnRlbnRTaXplPVRoZSBIVFRQIGNvbnRlbnQgaXMgdG9vIGxhcmdlIHRvIGRpc3BsYXkuCisKK21vbml0b3JWYWxpZD1UaGUgbW9uaXRvciBpcyB2YWxpZC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGRiYzAzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsMzQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuKjsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yIGltcGxlbWVudHMgSU1vbml0b3IgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX0lEID0gImlkIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNRU5UT19MT0NBTF9QT1JUID0gImxvY2FsLXBvcnQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX1JFTU9URV9IT1NUID0gInJlbW90ZS1ob3N0IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNRU5UT19SRU1PVEVfUE9SVCA9ICJyZW1vdGUtcG9ydCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fVFlQRV9JRCA9ICJ0eXBlLWlkIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNRU5UT19USU1FT1VUID0gInRpbWVvdXQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX0FVVE9fU1RBUlQgPSAiYXV0by1zdGFydCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gMDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFID0gMTsKKworCXByb3RlY3RlZCBTdHJpbmcgaWQ7CisJcHJvdGVjdGVkIFN0cmluZyByZW1vdGVIb3N0OworCXByb3RlY3RlZCBpbnQgcmVtb3RlUG9ydCA9IDgwOworCXByb3RlY3RlZCBpbnQgbG9jYWxQb3J0ID0gODA7CisJcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbElkOworCXByb3RlY3RlZCBpbnQgdGltZW91dDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvU3RhcnQgPSBmYWxzZTsKKworCXByb3RlY3RlZCBMaXN0PElSZXF1ZXN0TGlzdGVuZXI+IHJlcXVlc3RMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElSZXF1ZXN0TGlzdGVuZXI+KDIpOworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IG1vbml0b3IuCisJICovCisJcHVibGljIE1vbml0b3IoKSB7CisJCXByb3RvY29sSWQgPSBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdFR5cGUoKTsKKwl9CisJCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIElNb25pdG9yI2dldElkKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIElNb25pdG9yI2dldFJlbW90ZUhvc3QoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpIHsKKwkJcmV0dXJuIHJlbW90ZUhvc3Q7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIElNb25pdG9yI2dldFJlbW90ZVBvcnQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpIHsKKwkJcmV0dXJuIHJlbW90ZVBvcnQ7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIElNb25pdG9yI2dldExvY2FsUG9ydCgpCisJICovCisJcHVibGljIGludCBnZXRMb2NhbFBvcnQoKSB7CisJCXJldHVybiBsb2NhbFBvcnQ7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIElNb25pdG9yI2dldFByb3RvY29sKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworCQlyZXR1cm4gcHJvdG9jb2xJZDsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgSU1vbml0b3IjZ2V0VGltZW91dCgpCisJICovCisJcHVibGljIGludCBnZXRUaW1lb3V0KCkgeworCQlyZXR1cm4gdGltZW91dDsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgSU1vbml0b3IjaXNBdXRvU3RhcnQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQXV0b1N0YXJ0KCkgeworCQlyZXR1cm4gYXV0b1N0YXJ0OworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBJTW9uaXRvciNpc1J1bm5pbmcoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKwkJaWYgKGlzV29ya2luZ0NvcHkoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNSdW5uaW5nKHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElNb25pdG9yI2RlbGV0ZSgpCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlKCkgeworCQlpZiAoaXNXb3JraW5nQ29weSgpKQorCQkJcmV0dXJuOworCQlNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZU1vbml0b3IodGhpcyk7CisJfQorCisJLyoqCisJICogQHNlZSBJTW9uaXRvciNpc1dvcmtpbmdDb3B5KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSU1vbml0b3IjY3JlYXRlV29ya2luZ0NvcHkoKQorCSAqLworCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCkgeworCQlyZXR1cm4gbmV3IE1vbml0b3JXb3JraW5nQ29weSh0aGlzKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbChJTW9uaXRvciBtb25pdG9yKSB7CisJCWlkID0gbW9uaXRvci5nZXRJZCgpOworCQlyZW1vdGVIb3N0ID0gbW9uaXRvci5nZXRSZW1vdGVIb3N0KCk7CisJCXJlbW90ZVBvcnQgPSBtb25pdG9yLmdldFJlbW90ZVBvcnQoKTsKKwkJbG9jYWxQb3J0ID0gbW9uaXRvci5nZXRMb2NhbFBvcnQoKTsKKwkJcHJvdG9jb2xJZCA9IG1vbml0b3IuZ2V0UHJvdG9jb2woKTsKKwkJdGltZW91dCA9IG1vbml0b3IuZ2V0VGltZW91dCgpOworCQlhdXRvU3RhcnQgPSBtb25pdG9yLmlzQXV0b1N0YXJ0KCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2F2ZShJTWVtZW50byBtZW1lbnRvKSB7CisJCW1lbWVudG8ucHV0U3RyaW5nKE1FTUVOVE9fSUQsIGlkKTsKKwkJbWVtZW50by5wdXRTdHJpbmcoTUVNRU5UT19UWVBFX0lELCBwcm90b2NvbElkKTsKKwkJbWVtZW50by5wdXRJbnRlZ2VyKE1FTUVOVE9fTE9DQUxfUE9SVCwgbG9jYWxQb3J0KTsKKwkJbWVtZW50by5wdXRTdHJpbmcoTUVNRU5UT19SRU1PVEVfSE9TVCwgcmVtb3RlSG9zdCk7CisJCW1lbWVudG8ucHV0SW50ZWdlcihNRU1FTlRPX1JFTU9URV9QT1JULCByZW1vdGVQb3J0KTsKKwkJbWVtZW50by5wdXRJbnRlZ2VyKE1FTUVOVE9fVElNRU9VVCwgdGltZW91dCk7CisJCW1lbWVudG8ucHV0Qm9vbGVhbihNRU1FTlRPX0FVVE9fU1RBUlQsIGF1dG9TdGFydCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbG9hZChJTWVtZW50byBtZW1lbnRvKSB7CisJCWlkID0gbWVtZW50by5nZXRTdHJpbmcoTUVNRU5UT19JRCk7CisJCXByb3RvY29sSWQgPSBtZW1lbnRvLmdldFN0cmluZyhNRU1FTlRPX1RZUEVfSUQpOworCQlJbnRlZ2VyIHRlbXAgPSBtZW1lbnRvLmdldEludGVnZXIoTUVNRU5UT19MT0NBTF9QT1JUKTsKKwkJaWYgKHRlbXAgIT0gbnVsbCkKKwkJCWxvY2FsUG9ydCA9IHRlbXAuaW50VmFsdWUoKTsKKwkJcmVtb3RlSG9zdCA9IG1lbWVudG8uZ2V0U3RyaW5nKE1FTUVOVE9fUkVNT1RFX0hPU1QpOworCQl0ZW1wID0gbWVtZW50by5nZXRJbnRlZ2VyKE1FTUVOVE9fUkVNT1RFX1BPUlQpOworCQlpZiAodGVtcCAhPSBudWxsKQorCQkJcmVtb3RlUG9ydCA9IHRlbXAuaW50VmFsdWUoKTsKKwkJdGVtcCA9IG1lbWVudG8uZ2V0SW50ZWdlcihNRU1FTlRPX1RJTUVPVVQpOworCQlpZiAodGVtcCAhPSBudWxsKQorCQkJdGltZW91dCA9IHRlbXAuaW50VmFsdWUoKTsKKwkJQm9vbGVhbiB0ZW1wMiA9IG1lbWVudG8uZ2V0Qm9vbGVhbihNRU1FTlRPX0FVVE9fU1RBUlQpOworCQlpZiAodGVtcCAhPSBudWxsKQorCQkJYXV0b1N0YXJ0ID0gdGVtcDIuYm9vbGVhblZhbHVlKCk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSU1vbml0b3Ijc3RhcnQoKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGlzUnVubmluZygpKQorCQkJcmV0dXJuOworCQlpZiAoaXNXb3JraW5nQ29weSgpIHx8ICFNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmV4aXN0cyh0aGlzKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCisJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGUoKTsKKwkJaWYgKCFzdGF0dXMuaXNPSygpKQorCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKKwkJCisJCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RhcnRNb25pdG9yKHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElNb25pdG9yI3N0YXJ0KCkKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKKwkJaWYgKGlzV29ya2luZ0NvcHkoKSB8fCAhTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5leGlzdHModGhpcykpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCWlmICghaXNSdW5uaW5nKCkpCisJCQlyZXR1cm47CisJCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RvcE1vbml0b3IodGhpcyk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSU1vbml0b3IjYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlcXVlc3RMaXN0ZW5lcihJUmVxdWVzdExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWlmIChsaXN0ZW5lciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQlpZiAoIXJlcXVlc3RMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQorCQkJcmVxdWVzdExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElNb25pdG9yI3JlbW92ZVJlcXVlc3RMaXN0ZW5lcihJUmVxdWVzdExpc3RlbmVyKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJcmVxdWVzdExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKwkKKwkvKioKKwkgKiBGaXJlIGEgcmVxdWVzdCBldmVudC4KKwkgKiBAcGFyYW0gcnIKKwkgKiBAcGFyYW0gdHlwZQorCSAqLworCXByb3RlY3RlZCB2b2lkIGZpcmVSZXF1ZXN0RXZlbnQoUmVxdWVzdCByciwgaW50IHR5cGUpIHsKKwkJaW50IHNpemUgPSByZXF1ZXN0TGlzdGVuZXJzLnNpemUoKTsKKwkJSVJlcXVlc3RMaXN0ZW5lcltdIHJsID0gbmV3IElSZXF1ZXN0TGlzdGVuZXJbc2l6ZV07CisJCXJlcXVlc3RMaXN0ZW5lcnMudG9BcnJheShybCk7CisJCQorCQlmb3IgKElSZXF1ZXN0TGlzdGVuZXIgbGlzdGVuZXIgOiBybCkgeworCQkJaWYgKHR5cGUgPT0gQUREKQorCQkJCWxpc3RlbmVyLnJlcXVlc3RBZGRlZCh0aGlzLCBycik7CisJCQllbHNlIGlmICh0eXBlID09IENIQU5HRSkKKwkJCQlsaXN0ZW5lci5yZXF1ZXN0Q2hhbmdlZCh0aGlzLCBycik7CisJCX0KKwl9CisJCisJLyoqCisJICogQWRkIGEgbmV3IHJlcXVlc3QgcmVzcG9uc2UgcGFpci4KKwkgKiAKKwkgKiBAcGFyYW0gcmVxdWVzdCBhIHJlcXVlc3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgeworCQlmaXJlUmVxdWVzdEV2ZW50KHJlcXVlc3QsIEFERCk7CisJfQorCisJLyoqCisJICogQSByZXF1ZXN0IHJlc3BvbnNlIHBhaXIgaGFzIGJlZW4gY2hhbmdlZC4KKwkgKiAKKwkgKiBAcGFyYW0gcmVxdWVzdCBhIHJlcXVlc3QKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXF1ZXN0Q2hhbmdlZChSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJZmlyZVJlcXVlc3RFdmVudChyZXF1ZXN0LCBDSEFOR0UpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElNb25pdG9yI3ZhbGlkYXRlKCkKKwkgKi8KKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKKwkJaWYgKGxvY2FsUG9ydCA8IDApCisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JJbnZhbGlkTG9jYWxQb3J0LCBudWxsKTsKKwkJCisJCWlmIChyZW1vdGVQb3J0IDwgMCkKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckludmFsaWRSZW1vdGVQb3J0LCBudWxsKTsKKwkJCisJCWlmIChyZW1vdGVIb3N0ID09IG51bGwgfHwgcmVtb3RlSG9zdC5sZW5ndGgoKSA9PSAwIHx8ICFpc1ZhbGlkSG9zdG5hbWUocmVtb3RlSG9zdCkpCisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JJbnZhbGlkUmVtb3RlSG9zdCwgbnVsbCk7CisJCQorCQlpZiAoaXNMb2NhbGhvc3QocmVtb3RlSG9zdCkgJiYgbG9jYWxQb3J0ID09IHJlbW90ZVBvcnQpCisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JJbnZhbGlkTG9jYWxQb3J0LCBudWxsKTsKKwkKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVmFsaWRIb3N0bmFtZShTdHJpbmcgaG9zdCkgeworCQlpZiAoaG9zdCA9PSBudWxsIHx8IGhvc3QudHJpbSgpLmxlbmd0aCgpIDwgMSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWludCBsZW5ndGggPSBob3N0Lmxlbmd0aCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQljaGFyIGMgPSBob3N0LmNoYXJBdChpKTsKKwkJCWlmICghQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSAmJiBjICE9ICc6JyAmJiBjICE9ICcuJyAmJiBjICE9ICctJykKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKGhvc3QuZW5kc1dpdGgoIjoiKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTG9jYWxob3N0KFN0cmluZyBob3N0KSB7CisJCWlmIChob3N0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXRyeSB7CisJCQlpZiAoImxvY2FsaG9zdCIuZXF1YWxzKGhvc3QpIHx8ICIxMjcuMC4wLjEiLmVxdWFscyhob3N0KSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCUluZXRBZGRyZXNzIGxvY2FsSG9zdGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKwkJCWlmIChsb2NhbEhvc3RhZGRyLmdldEhvc3ROYW1lKCkuZXF1YWxzKGhvc3QpKQorCQkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGNoZWNraW5nIGZvciBsb2NhbGhvc3QiLCBlKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiTW9uaXRvciBbIiArIGdldElkKCkgKyAiLCAiICsgZ2V0UHJvdG9jb2woKSArICIsICIgKyBnZXRMb2NhbFBvcnQoKSArICIsICIKKwkJCSsgZ2V0UmVtb3RlSG9zdCgpICsgIiwgIiArIGdldFJlbW90ZVBvcnQoKSArICJdIjsKKwl9CisJCisJLyoqCisJICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNb25pdG9yKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCUlNb25pdG9yIG0gPSAoSU1vbml0b3IpIG9iajsKKwkJaWYgKG0uaXNXb3JraW5nQ29weSgpKSB7CisJCQltID0gKChJTW9uaXRvcldvcmtpbmdDb3B5KSBtKS5nZXRPcmlnaW5hbCgpOworCQkJaWYgKG0gPT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKGlkID09IG51bGwgJiYgbS5nZXRJZCgpICE9IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChpZCAhPSBudWxsICYmICFpZC5lcXVhbHMobS5nZXRJZCgpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChsb2NhbFBvcnQgIT0gbS5nZXRMb2NhbFBvcnQoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHJlbW90ZVBvcnQgIT0gbS5nZXRSZW1vdGVQb3J0KCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpZiAocmVtb3RlSG9zdCA9PSBudWxsICYmIG0uZ2V0UmVtb3RlSG9zdCgpICE9IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChyZW1vdGVIb3N0ICE9IG51bGwgJiYgIXJlbW90ZUhvc3QuZXF1YWxzKG0uZ2V0UmVtb3RlSG9zdCgpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChwcm90b2NvbElkID09IG51bGwgJiYgbS5nZXRQcm90b2NvbCgpICE9IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChwcm90b2NvbElkICE9IG51bGwgJiYgIXByb3RvY29sSWQuZXF1YWxzKG0uZ2V0UHJvdG9jb2woKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3JNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1YzU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3JNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLio7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTW9uaXRvck1hbmFnZXIgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREQgPSAwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0UgPSAxOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAyOworCisJLy8gbW9uaXRvcnMKKwlwcm90ZWN0ZWQgTGlzdDxJTW9uaXRvcj4gbW9uaXRvcnM7CisJcHJvdGVjdGVkIE1hcDxJTW9uaXRvciwgQWNjZXB0VGhyZWFkPiB0aHJlYWRzID0gbmV3IEhhc2hNYXA8SU1vbml0b3IsIEFjY2VwdFRocmVhZD4oKTsKKwkKKwlwcm90ZWN0ZWQgTGlzdDxJTW9uaXRvckxpc3RlbmVyPiBtb25pdG9yTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJTW9uaXRvckxpc3RlbmVyPigpOworCisJcHJpdmF0ZSBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2w7CisJcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKKwkKKwlwcm90ZWN0ZWQgTWFwPFJlcXVlc3QsIExpc3Q8UmVzZW5kSFRUUFJlcXVlc3Q+PiByZXNlbmRNYXAgPSBuZXcgSGFzaE1hcDxSZXF1ZXN0LCBMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0Pj4oKTsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIE1vbml0b3JNYW5hZ2VyIGluc3RhbmNlOworCQorCXN0YXRpYyB7CisJCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5leGVjdXRlU3RhcnR1cHMoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIGEgc3RhdGljIGluc3RhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBNb25pdG9yTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKKwkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKKwkJCWluc3RhbmNlID0gbmV3IE1vbml0b3JNYW5hZ2VyKCk7CisJCQlpbnN0YW5jZS5zdGFydE1vbml0b3JzKCk7CisJCX0KKwkJCisJCXJldHVybiBpbnN0YW5jZTsKKwl9CisJCisJcHJpdmF0ZSBNb25pdG9yTWFuYWdlcigpIHsKKwkJbG9hZE1vbml0b3JzKCk7CisJCQorCQlwY2wgPSBuZXcgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJaWYgKGlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzKQorCQkJCQlyZXR1cm47CisJCQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKKwkJCQlpZiAocHJvcGVydHkuZXF1YWxzKCJtb25pdG9ycyIpKSB7CisJCQkJCWxvYWRNb25pdG9ycygpOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJCisJCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKKwkJTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgbW9uaXRvci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgbW9uaXRvcgorCSAqLworCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZU1vbml0b3IoKSB7CisJCXJldHVybiBuZXcgTW9uaXRvcldvcmtpbmdDb3B5KCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgbGlzdCBvZiBtb25pdG9ycy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1vbml0b3JzCisJICovCisJcHVibGljIExpc3Q8SU1vbml0b3I+IGdldE1vbml0b3JzKCkgeworCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxJTW9uaXRvcj4obW9uaXRvcnMpOworCX0KKworCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKCFtb25pdG9ycy5jb250YWlucyhtb25pdG9yKSkKKwkJCW1vbml0b3JzLmFkZChtb25pdG9yKTsKKwkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBBREQpOworCQlzYXZlTW9uaXRvcnMoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNSdW5uaW5nKElNb25pdG9yIG1vbml0b3IpIHsKKwkJcmV0dXJuICh0aHJlYWRzLmdldChtb25pdG9yKSAhPSBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBTdGFydCBhIG1vbml0b3IuCisJICogCisJICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydE1vbml0b3IoSU1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQorCQkJcmV0dXJuOworCQkKKwkJaWYgKEFjY2VwdFRocmVhZC5pc1BvcnRJblVzZShtb25pdG9yLmdldExvY2FsUG9ydCgpKSkKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUG9ydEluVXNlLCBtb25pdG9yLmdldExvY2FsUG9ydCgpICsgIiIpLCBudWxsKSk7CisJCQorCQlBY2NlcHRUaHJlYWQgdGhyZWFkID0gbmV3IEFjY2VwdFRocmVhZChtb25pdG9yKTsKKwkJdGhyZWFkLnN0YXJ0U2VydmVyKCk7CisJCXRocmVhZHMucHV0KG1vbml0b3IsIHRocmVhZCk7CisJfQorCQorCS8qKgorCSAqIFN0b3AgYSBtb25pdG9yLgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yCisJICovCisJcHVibGljIHZvaWQgc3RvcE1vbml0b3IoSU1vbml0b3IgbW9uaXRvcikgeworCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQorCQkJcmV0dXJuOworCQkKKwkJQWNjZXB0VGhyZWFkIHRocmVhZCA9IHRocmVhZHMuZ2V0KG1vbml0b3IpOworCQlpZiAodGhyZWFkICE9IG51bGwpIHsKKwkJCXRocmVhZC5zdG9wU2VydmVyKCk7CisJCQl0aHJlYWRzLnJlbW92ZShtb25pdG9yKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTW9uaXRvcihJTW9uaXRvciBtb25pdG9yKSB7CisJCWlmIChtb25pdG9yLmlzUnVubmluZygpKQorCQkJc3RvcE1vbml0b3IobW9uaXRvcik7CisJCW1vbml0b3JzLnJlbW92ZShtb25pdG9yKTsKKwkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBSRU1PVkUpOworCQlzYXZlTW9uaXRvcnMoKTsKKwl9CisJCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG1vbml0b3JDaGFuZ2VkKElNb25pdG9yIG1vbml0b3IpIHsKKwkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBDSEFOR0UpOworCQlzYXZlTW9uaXRvcnMoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gZXhpc3RzKElNb25pdG9yIG1vbml0b3IpIHsKKwkJcmV0dXJuIChtb25pdG9ycy5jb250YWlucyhtb25pdG9yKSk7CisJfQorCQorCS8qKgorCSAqIEFkZCBtb25pdG9yIGxpc3RlbmVyLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAoIW1vbml0b3JMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQorCQkJbW9uaXRvckxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFJlbW92ZSBtb25pdG9yIGxpc3RlbmVyLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAobW9uaXRvckxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCisJCQltb25pdG9yTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCQorCS8qKgorCSAqIEZpcmUgYSBtb25pdG9yIGV2ZW50LgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yCisJICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgZXZlbnQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9uaXRvckV2ZW50KElNb25pdG9yIG1vbml0b3IsIGludCB0eXBlKSB7CisJCUlNb25pdG9yTGlzdGVuZXJbXSBvYmogPSBtb25pdG9yTGlzdGVuZXJzLnRvQXJyYXkobmV3IElNb25pdG9yTGlzdGVuZXJbbW9uaXRvckxpc3RlbmVycy5zaXplKCldKTsKKwkJCisJCWZvciAoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IG9iaikgeworCQkJaWYgKHR5cGUgPT0gQUREKQorCQkJCWxpc3RlbmVyLm1vbml0b3JBZGRlZChtb25pdG9yKTsKKwkJCWVsc2UgaWYgKHR5cGUgPT0gQ0hBTkdFKQorCQkJCWxpc3RlbmVyLm1vbml0b3JDaGFuZ2VkKG1vbml0b3IpOworCQkJZWxzZSBpZiAodHlwZSA9PSBSRU1PVkUpCisJCQkJbGlzdGVuZXIubW9uaXRvclJlbW92ZWQobW9uaXRvcik7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbG9hZE1vbml0b3JzKCkgeworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMb2FkaW5nIG1vbml0b3JzIik7CisJCQorCQltb25pdG9ycyA9IG5ldyBBcnJheUxpc3Q8SU1vbml0b3I+KCk7CisJCVByZWZlcmVuY2VzIHByZWZzID0gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCVN0cmluZyB4bWxTdHJpbmcgPSBwcmVmcy5nZXRTdHJpbmcoIm1vbml0b3JzIik7CisJCWlmICh4bWxTdHJpbmcgIT0gbnVsbCAmJiB4bWxTdHJpbmcubGVuZ3RoKCkgPiAwKSB7CisJCQl0cnkgeworCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygiVVRGLTgiKSk7CisJCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOworCQkKKwkJCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigibW9uaXRvciIpOworCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisJCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkJTW9uaXRvciBtb25pdG9yID0gbmV3IE1vbml0b3IoKTsKKwkJCQkJCW1vbml0b3IubG9hZChjaGlsZHJlbltpXSk7CisJCQkJCQltb25pdG9ycy5hZGQobW9uaXRvcik7CisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBtb25pdG9ycyIsIGUpOworCQkJfQorCQl9CisJfQorCQorCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlTW9uaXRvcnMoKSB7CisJCXRyeSB7CisJCQlpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcyA9IHRydWU7CisJCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgibW9uaXRvcnMiKTsKKworCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb25pdG9ycy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCU1vbml0b3IgbW9uaXRvciA9IChNb25pdG9yKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtb25pdG9yIik7CisJCQkJbW9uaXRvci5zYXZlKGNoaWxkKTsKKwkJCX0KKwkJCQorCQkJU3RyaW5nIHhtbFN0cmluZyA9IG1lbWVudG8uc2F2ZVRvU3RyaW5nKCk7CisJCQlQcmVmZXJlbmNlcyBwcmVmcyA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQkJcHJlZnMuc2V0VmFsdWUoIm1vbml0b3JzIiwgeG1sU3RyaW5nKTsKKwkJCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIGJyb3dzZXJzIiwgZSk7CisJCX0KKwkJaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyByZXNlbmQgcmVxdWVzdCBmcm9tIHRoZSBnaXZlbiByZXF1ZXN0LgorCSAqIAorCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRoYXQgaXMgdG8gYmUgcmVzZW50OyBtYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiBhIG5ldyByZXNlbmQgcmVxdWVzdAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzZW5kSFRUUFJlcXVlc3QgY3JlYXRlUmVzZW5kUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJcmV0dXJuIG5ldyBSZXNlbmRIVFRQUmVxdWVzdCgoTW9uaXRvcilyZXF1ZXN0LmdldE1vbml0b3IoKSwgcmVxdWVzdCk7CisJfQorCisJLyoqCisJICogQWRkcyBhIHJlc2VuZCByZXF1ZXN0IHRvIHRoaXMgcmVxdWVzdC4KKwkgKiAKKwkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVzZW5kIHJlcXVlc3QgdG8gYWRkCisJICogQHBhcmFtIHJlc2VuZFJlcSB0aGUgcmVzZW5kIHJlcXVlc3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRSZXNlbmRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCwgUmVzZW5kSFRUUFJlcXVlc3QgcmVzZW5kUmVxKSB7CisJCWlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVzZW5kUmVxID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0PiBsaXN0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWxpc3QgPSByZXNlbmRNYXAuZ2V0KHJlcXVlc3QpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkJCisJCWlmIChsaXN0ID09IG51bGwpIHsKKwkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0PigpOworCQkJcmVzZW5kTWFwLnB1dChyZXF1ZXN0LCBsaXN0KTsKKwkJfQorCQlsaXN0LmFkZChyZXNlbmRSZXEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVzZW5kIHJlcXVlc3RzIGJhc2VkIG9uIHRoaXMgcmVxdWVzdC4gCisJICogCisJICogQHBhcmFtIHJlcXVlc3QgYSByZXF1ZXN0CisJICogQHJldHVybiB0aGUgYXJyYXkgb2YgcmVzZW5kIHJlcXVlc3RzIGJhc2VkIG9uIHRoaXMgcmVxdWVzdAorCSAqLworCXB1YmxpYyBSZXNlbmRIVFRQUmVxdWVzdFtdIGdldFJlc2VuZFJlcXVlc3RzKFJlcXVlc3QgcmVxdWVzdCkgeworCQlMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0PiBsaXN0ID0gcmVzZW5kTWFwLmdldChyZXF1ZXN0KTsKKwkJaWYgKGxpc3QgIT0gbnVsbCkKKwkJCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IFJlc2VuZEhUVFBSZXF1ZXN0W2xpc3Quc2l6ZSgpXSk7CisJCQorCQlyZXR1cm4gbmV3IFJlc2VuZEhUVFBSZXF1ZXN0WzBdOworCX0KKworCS8qKgorCSAqIFN0YXJ0IGFsbCBtb25pdG9ycyB0aGF0IGFyZSBzZXQgdG8gYXV0by1zdGFydC4KKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnRNb25pdG9ycygpIHsKKwkJTW9uaXRvck1hbmFnZXIgbWFuYWdlciA9IE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisJCUxpc3QgbW9uaXRvckxpc3QgPSBtYW5hZ2VyLmdldE1vbml0b3JzKCk7CisJCUl0ZXJhdG9yIG1vbml0b3JJdGVyYXRvciA9IG1vbml0b3JMaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChtb25pdG9ySXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBtb25pdG9ySXRlcmF0b3IubmV4dCgpOworCQkJaWYgKG1vbml0b3IuaXNBdXRvU3RhcnQoKSkKKwkJCQl0cnkgeworCQkJCQltb25pdG9yLnN0YXJ0KCk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkZhaWxlZCB0byBzdGFydCBtb25pdG9yOiIgKyBtb25pdG9yLnRvU3RyaW5nKCksIGUpOworCQkJCX0KKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3OWIxOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3JQbHVnaW4uamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CisvKioKKyAqIFRoZSBtb25pdG9yIGNvcmUgcGx1Z2luLgorICovCitwdWJsaWMgY2xhc3MgTW9uaXRvclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7CisJLyoqCisJICogVGhlIHBsdWdpbi9idW5kbGUgaWQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiOworCisJcHJpdmF0ZSBzdGF0aWMgTW9uaXRvclBsdWdpbiBzaW5nbGV0b247CisJCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFByb3RvY29sQWRhcHRlcj4gcHJvdG9jb2xBZGFwdGVyczsKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgSUNvbnRlbnRGaWx0ZXI+IGNvbnRlbnRGaWx0ZXJzOworCXByb3RlY3RlZCBib29sZWFuIHN0YXJ0dXBzTG9hZGVkOworCisJLyoqCisJICogTW9uaXRvclBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBNb25pdG9yUGx1Z2luKCkgeworCQlzdXBlcigpOworCQlzaW5nbGV0b24gPSB0aGlzOworCQlsb2FkUHJvdG9jb2xBZGFwdGVycygpOworCQlsb2FkQ29udGVudEZpbHRlcnMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuTW9uaXRvclBsdWdpbgorCSAqLworCXB1YmxpYyBzdGF0aWMgTW9uaXRvclBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIHNpbmdsZXRvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHByb3RvY29sIHR5cGUuCisJICogCisJICogQHJldHVybiB0aGUgcHJvdG9jb2wKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUeXBlKCkgeworCQlyZXR1cm4gIkhUVFAiOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHByb3RvY29sIGFkYXB0ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KKwkgKiBwcm90b2NvbCBhZGFwdGVycyAoe0BsaW5rICNnZXRQcm90b2NvbEFkYXB0ZXJzKCl9KSBmb3IgdGhlIG9uZSB3aXRoIGEKKwkgKiBtYXRjaGluZyBpZC4KKwkgKgorCSAqIEBwYXJhbSBpZCB0aGUgcHJvdG9jb2wgYWRhcHRlciBpZDsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIHRoZSBwcm90b2NvbCBhZGFwdGVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZQorCSAqICAgaXMgbm8gcHJvdG9jb2wgYWRhcHRlciB3aXRoIHRoZSBnaXZlbiBpZAorCSAqLworCXB1YmxpYyBQcm90b2NvbEFkYXB0ZXIgZ2V0UHJvdG9jb2xBZGFwdGVyKFN0cmluZyBpZCkgeworCQlyZXR1cm4gcHJvdG9jb2xBZGFwdGVycy5nZXQoaWQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBrbm93biBwcm90b2NvbCBhZGFwdGVyIGluc3RhbmNlcy4KKwkgKiA8cD4KKwkgKiBQcm90b2NvbCBhZGFwdGVycyBhcmUgcmVnaXN0ZXJlZCB2aWEgdGhlIDxjb2RlPnByb3RvY29sQWRhcGF0ZXJzPC9jb2RlPgorCSAqIGV4dGVuc2lvbiBwb2ludCBpbiB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZTwvY29kZT4KKwkgKiBwbHVnLWluLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGw7IGNsaWVudHMgbWF5IHNhZmVseSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHByb3RvY29sIGFkYXB0ZXIgaW5zdGFuY2VzCisJICovCisJcHVibGljIFByb3RvY29sQWRhcHRlcltdIGdldFByb3RvY29sQWRhcHRlcnMoKSB7CisJCUxpc3Q8UHJvdG9jb2xBZGFwdGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxQcm90b2NvbEFkYXB0ZXI+KCk7CisJCUl0ZXJhdG9yPFByb3RvY29sQWRhcHRlcj4gaXRlcmF0b3IgPSBwcm90b2NvbEFkYXB0ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCWxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7CisJCX0KKwkJUHJvdG9jb2xBZGFwdGVyW10gdHlwZXMgPSBuZXcgUHJvdG9jb2xBZGFwdGVyW2xpc3Quc2l6ZSgpXTsKKwkJbGlzdC50b0FycmF5KHR5cGVzKTsKKwkJcmV0dXJuIHR5cGVzOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgY29udGVudCBmaWx0ZXJzLgorCSAqIAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29udGVudCBmaWx0ZXJzCisJICovCisJcHVibGljIElDb250ZW50RmlsdGVyW10gZ2V0Q29udGVudEZpbHRlcnMoKSB7CisJCUxpc3Q8SUNvbnRlbnRGaWx0ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElDb250ZW50RmlsdGVyPigpOworCQlJdGVyYXRvcjxJQ29udGVudEZpbHRlcj4gaXRlcmF0b3IgPSBjb250ZW50RmlsdGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlsaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOworCQl9CisJCUlDb250ZW50RmlsdGVyW10gY2YgPSBuZXcgSUNvbnRlbnRGaWx0ZXJbbGlzdC5zaXplKCldOworCQlsaXN0LnRvQXJyYXkoY2YpOworCQlyZXR1cm4gY2Y7CisJfQorCisJLyoqCisJICogRmluZCBhIGNvbnRlbnQgZmlsdGVyIGJ5IHRoZSBpZC4KKwkgKiAKKwkgKiBAcGFyYW0gaWQgYW4gaWQKKwkgKiBAcmV0dXJuIHRoZSBjb250ZW50IGZpbHRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgY291bGRuJ3QgYmUgZm91bmQKKwkgKi8KKwlwdWJsaWMgSUNvbnRlbnRGaWx0ZXIgZmluZENvbnRlbnRGaWx0ZXIoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQlyZXR1cm4gY29udGVudEZpbHRlcnMuZ2V0KGlkKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbG9hZFByb3RvY29sQWRhcHRlcnMoKSB7CisJCWlmIChwcm90b2NvbEFkYXB0ZXJzICE9IG51bGwpCisJCQlyZXR1cm47CisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIkxvYWRpbmcgcHJvdG9jb2wgYWRhcHRlcnMiKTsgCisJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAiaW50ZXJuYWxQcm90b2NvbEFkYXB0ZXJzIik7CisKKwkJaW50IHNpemUgPSBjZi5sZW5ndGg7CisJCU1hcDxTdHJpbmcsIFByb3RvY29sQWRhcHRlcj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm90b2NvbEFkYXB0ZXI+KHNpemUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJU3RyaW5nIGlkID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiTG9hZGluZyBhZGFwdGVyOiAiICsgaWQpOworCQkJbWFwLnB1dChpZCwgbmV3IFByb3RvY29sQWRhcHRlcihjZltpXSkpOworCQl9CisJCXByb3RvY29sQWRhcHRlcnMgPSBtYXA7CisJfQorCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGxvYWRDb250ZW50RmlsdGVycygpIHsKKwkJaWYgKGNvbnRlbnRGaWx0ZXJzICE9IG51bGwpCisJCQlyZXR1cm47CisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIkxvYWRpbmcgY29udGVudCBmaWx0ZXJzIik7IAorCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgImludGVybmFsQ29udGVudEZpbHRlcnMiKTsKKworCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKKwkJTWFwPFN0cmluZywgSUNvbnRlbnRGaWx0ZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUNvbnRlbnRGaWx0ZXI+KHNpemUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJU3RyaW5nIGlkID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiTG9hZGluZyBmaWx0ZXI6ICIgKyBpZCk7CisJCQltYXAucHV0KGlkLCBuZXcgQ29udGVudEZpbHRlcihjZltpXSkpOworCQl9CisJCWNvbnRlbnRGaWx0ZXJzID0gbWFwOworCX0KKworCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBleGVjdXRlU3RhcnR1cHMoKSB7CisJCWlmIChzdGFydHVwc0xvYWRlZCkKKwkJCXJldHVybjsKKwkJCisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIkxvYWRpbmcgc3RhcnR1cHMiKTsgCisJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAiaW50ZXJuYWxTdGFydHVwIik7CisJCQorCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCVN0cmluZyBpZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIkxvYWRpbmcgc3RhcnR1cDogIiArIGlkKTsKKwkJCXRyeSB7CisJCQkJSVN0YXJ0dXAgc3RhcnR1cCA9IChJU3RhcnR1cCkgY2ZbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKKwkJCQl0cnkgeworCQkJCQlzdGFydHVwLnN0YXJ0dXAoKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiU3RhcnR1cCBmYWlsZWQiICsgc3RhcnR1cC50b1N0cmluZygpLCBleCk7CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIHN0YXJ0dXA6ICIgKyBpZCwgZSk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3JXb3JraW5nQ29weS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTI3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yV29ya2luZ0NvcHkuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcldvcmtpbmdDb3B5OworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIE1vbml0b3JXb3JraW5nQ29weSBleHRlbmRzIE1vbml0b3IgaW1wbGVtZW50cyBJTW9uaXRvcldvcmtpbmdDb3B5IHsKKwlwcm90ZWN0ZWQgTW9uaXRvciBtb25pdG9yOworCQorCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBtb25pdG9yIHdvcmtpbmcgY29weS4gKHVzZWQgZm9yIGluaXRpYWwgY3JlYXRpb24pCisJICovCisJcHVibGljIE1vbml0b3JXb3JraW5nQ29weSgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBtb25pdG9yIHdvcmtpbmcgY29weS4gKHVzZWQgZm9yIHdvcmtpbmcgY29waWVzKQorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRoaXMgd29ya2luZyBjb3B5IGlzIGZvcgorCSAqLworCXB1YmxpYyBNb25pdG9yV29ya2luZ0NvcHkoTW9uaXRvciBtb25pdG9yKSB7CisJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CisJCXNldEludGVybmFsKG1vbml0b3IpOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I2dldE9yaWdpbmFsKCkKKwkgKi8KKwlwdWJsaWMgSU1vbml0b3IgZ2V0T3JpZ2luYWwoKSB7CisJCXJldHVybiBtb25pdG9yOworCX0KKworCS8qKgorCSAqIFNldCB0aGUgaWQuCisJICogCisJICogQHBhcmFtIG5ld0lkIHRoZSBpZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlpZCA9IG5ld0lkOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I3NldFJlbW90ZUhvc3QoU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlbW90ZUhvc3QoU3RyaW5nIGhvc3QpIHsKKwkJcmVtb3RlSG9zdCA9IGhvc3Q7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2V0UmVtb3RlUG9ydChpbnQpCisJICovCisJcHVibGljIHZvaWQgc2V0UmVtb3RlUG9ydChpbnQgcG9ydCkgeworCQlyZW1vdGVQb3J0ID0gcG9ydDsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weSNzZXRMb2NhbFBvcnQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2FsUG9ydChpbnQgcG9ydCkgeworCQlsb2NhbFBvcnQgPSBwb3J0OworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I3NldFByb3RvY29sKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2xJZDIpIHsKKwkJcHJvdG9jb2xJZCA9IHByb3RvY29sSWQyOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I3NldFRpbWVvdXQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQyKSB7CisJCXRpbWVvdXQgPSB0aW1lb3V0MjsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weSNzZXRBdXRvU3RhcnQoYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBdXRvU3RhcnQoYm9vbGVhbiBzdGFydEJ5RGVmYXVsdCkgeworCQlhdXRvU3RhcnQgPSBzdGFydEJ5RGVmYXVsdDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElNb25pdG9yI2lzV29ya2luZ0NvcHkoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElNb25pdG9yI2NyZWF0ZVdvcmtpbmdDb3B5KCkKKwkgKi8KKwlwdWJsaWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I3NhdmUoKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgSU1vbml0b3Igc2F2ZSgpIHsKKwkJTW9uaXRvck1hbmFnZXIgbW0gPSBNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpOworCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQkvL2Jvb2xlYW4gcmVzdGFydCA9IGZhbHNlOworCQkJaWYgKG1vbml0b3IuaXNSdW5uaW5nKCkpIHsKKwkJCQkvL3Jlc3RhcnQgPSB0cnVlOworCQkJCW1tLnN0b3BNb25pdG9yKG1vbml0b3IpOworCQkJfQorCQkJbW9uaXRvci5zZXRJbnRlcm5hbCh0aGlzKTsKKwkJCW1tLm1vbml0b3JDaGFuZ2VkKG1vbml0b3IpOworCQkJLy9pZiAocmVzdGFydCkKKwkJCS8vCW1tLnN0YXJ0TW9uaXRvcihtb25pdG9yKTsKKwkJfSBlbHNlIHsKKwkJCW1vbml0b3IgPSBuZXcgTW9uaXRvcigpOworCQkJbW9uaXRvci5zZXRJbnRlcm5hbCh0aGlzKTsKKwkJCW1tLmFkZE1vbml0b3IobW9uaXRvcik7CisJCX0KKwkJcmV0dXJuIG1vbml0b3I7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1Byb3RvY29sQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvUHJvdG9jb2xBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmOGMwZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1Byb3RvY29sQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQcm90b2NvbEFkYXB0ZXIgaW1wbGVtZW50cyBJUHJvdG9jb2xBZGFwdGVyIHsKKwlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7CisJcHJvdGVjdGVkIFByb3RvY29sQWRhcHRlckRlbGVnYXRlIGRlbGVnYXRlOworCisJcHJvdGVjdGVkIFByb3RvY29sQWRhcHRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworCX0KKworCS8qKgorCSAqIEBzZWUgSVByb3RvY29sQWRhcHRlciNnZXRJZCgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOworCX0KKworCS8qKgorCSAqIEBzZWUgSVByb3RvY29sQWRhcHRlciNnZXROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOworCX0KKworCXByb3RlY3RlZCBQcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKKwkJaWYgKGRlbGVnYXRlICE9IG51bGwpCisJCQlyZXR1cm4gZGVsZWdhdGU7CisJCQorCQl0cnkgeworCQkJZGVsZWdhdGUgPSAoUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgcHJvdG9jb2wgYWRhcHRlciBkZWxlZ2F0ZTogIiArIGdldElkKCksIGUpOworCQl9CisJCXJldHVybiBkZWxlZ2F0ZTsKKwl9CisKKwkvKioKKwkgKiBDb25uZWN0IHdpdGggdGhlIHByb3RvY29sLgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgorCSAqIEBwYXJhbSBpbiBhbiBpbmJvdW5kIHNvY2tldAorCSAqIEBwYXJhbSBvdXQgYW4gb3V0Ym91bmQgc29ja2V0CisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlnZXREZWxlZ2F0ZSgpLmNvbm5lY3QobW9uaXRvciwgaW4sIG91dCk7CisJfQorCisJLyoqCisJICogRGlzY29ubmVjdCBmcm9tIHRoZSBzb2NrZXRzLgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWdldERlbGVnYXRlKCkuZGlzY29ubmVjdChtb25pdG9yKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1Byb3RvY29sQWRhcHRlckRlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3Y2QzZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1Byb3RvY29sQWRhcHRlckRlbGVnYXRlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwcm90b2NvbCBhZGFwdGVyIGRlbGVnYXRlcywgd2hpY2ggcHJvdmlkZSB0aGUKKyAqIGltcGxlbWVudGF0aW9uIGJlaGluZCBhIHBhcnRpY3VsYXIgcHJvdG9jb2wgYWRhcHRlci4KKyAqIEEgcHJvdG9jb2wgYWRhcHRlciB3YXRjaGVzIHRoZSBtZXNzYWdlIHRyYWZmaWMgcGFzc2luZyBiZXR3ZWVuIGNsaWVudCBhbmQKKyAqIHNlcnZlcjsgaXQgcGFyc2VzIHRoZSBtZXNzYWdlcyBhbmQgcmVwb3J0cyB0aGVtIGluIHRoZSBmb3JtIG9mIAorICogUmVxdWVzdCBvYmplY3RzLgorICogPHA+CisgKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb25seSBieSBjbGllbnRzCisgKiB0byBleHRlbmQgdGhlIDxjb2RlPnByb3RvY29sQWRhcHRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KKyAqIFRoZSBzdWJjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvciwgd2hpY2ggd2lsbCBiZSB1c2VkCisgKiBhdXRvbWF0aWNhbGx5IHRvIGluc3RhbnRpYXRlIHRoZSBkZWxlZ2F0ZSB3aGVuIHJlcXVpcmVkLiAKKyAqIDwvcD4KKyAqIDxwPgorICogVGhlcmUgaXMgb25seSBvbmUgZGVsZWdhdGUgY3JlYXRlZCBwZXIgcHJvdG9jb2wsIGFuZCB0aGlzIGRlbGVnYXRlIG11c3QKKyAqIGJlIGFibGUgdG8gaGFuZGxlIG11bHRpcGxlIG1vbml0b3IgaW5zdGFuY2VzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGRlbGVnYXRlCisgKiB0eXBpY2FsbHkgd2lsbCBub3QgaGF2ZSBpbnN0YW5jZSBzdGF0ZSwgb3IgbXVzdCBzeW5jaHJvbml6ZSBhbmQga2VlcCB0aGUKKyAqIHN0YXRlIHNlcGFyYXRlLgorICogPC9wPgorICogPHA+CisgKiBbaXNzdWU6IFRoZSBIVFRQIGFuZCBUQ1AvSVAgZGVsZWdhdGUgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSB0aHJlYWRzIHdoaWNoCisgKiBzaHVmZmxlIGluZm8gYmV0d2VlbiBzb2NrZXRzLiBJZiB0aGUgbW9uaXRvciBpcyBjaGFuZ2VkIG9yIGRlbGV0ZWQsIGhvdyBkbworICogdGhlc2UgdGhyZWFkcyBnbyBhd2F5PyBNZXRoaW5rcyB0aGF0IGRlbGVnYXRlcyBpbiBnZW5lcmFsIHNob3VsZCBiZSBmb3JjZWQKKyAqIHRvIGltcGxlbWVudCBkaXNjb25uZWN0KElNb25pdG9yKSBhcyB3ZWxsLiBUaGlzIG1ldGhvZCB3b3VsZCBiZSBjYWxsZWQgYnkgdGhlCisgKiBzeXN0ZW0gd2hlbiB0aGUgbW9uaXRvciBpcyBjaGFuZ2VkIG9yIGRlbGV0ZWQsIG9yIHdoZW4gdGhlIHBsdWctaW4gaXMKKyAqIGJlaW5nIHNodXQgZG93bi5dCisgKiA8L3A+CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSB7CisJLyoqCisJICogRXN0YWJsaXNoZXMgYW4gb25nb2luZyBjb25uZWN0aW9uIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgYmVpbmcKKwkgKiBtb25pdG9yZWQgYnkgdGhlIGdpdmVuIG1vbml0b3IuIFRoZSA8Y29kZT5pbjwvY29kZT4gc29ja2V0IGlzIGFzc29jaWF0ZWQKKwkgKiB3aXRoIHRoZSBtb25pdG9yJ3MgY2xpZW50LiBUaGUgPGNvZGU+b3V0PC9jb2RlPiBzb2NrZXQgaXMgYXNzb2NpYXRlZCB3aXRoCisJICogdGhlIG1vbml0b3IncyBzZXJ2ZXIuIERpZmZlcmVudCBhZGFwYXRlcnMgaGFuZGxlIGRpZmZlcmVudCBuZXR3b3JrCisJICogcHJvdG9jb2xzLgorCSAqIDxwPgorCSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCSAqIDx1bD4KKwkgKiA8bGk+Q2xpZW50IHRvIHNlcnZlciBjb21tdW5pY2F0aW9uIC0KKwkgKiBPcGVuaW5nIGFuIGlucHV0IHN0cmVhbSBvbiB0aGUgPGNvZGU+aW48L2NvZGU+IHNvY2tldCwgb3BlbmluZyBhbiBvdXRwdXQKKwkgKiBzdHJlYW0gb24gdGhlIDxjb2RlPm91dDwvY29kZT4gc29ja2V0LCBhbmQgZXN0YWJsaXNoaW5nIGEgbWVjaGFuaXNtIHRoYXQKKwkgKiB3aWxsIHBhc3MgYWxvbmcgYWxsIGJ5dGVzIHJlY2VpdmVkIG9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dAorCSAqIHN0cmVhbS48L2xpPgorCSAqIDxsaT5TZXJ2ZXIgdG8gY2xpZW50IGNvbW11bmljYXRpb24gLSBPcGVuaW5nIGFuIGlucHV0IHN0cmVhbSBvbiB0aGUKKwkgKiA8Y29kZT5vdXQ8L2NvZGU+IHNvY2tldCwgb3BlbmluZyBhbiBvdXRwdXQgc3RyZWFtIG9uIHRoZSA8Y29kZT5pbjwvY29kZT4KKwkgKiBzb2NrZXQsIGFuZCBlc3RhYmxpc2hpbmcgYSBtZWNoYW5pc20gdGhhdCB3aWxsIHBhc3MgYWxvbmcgYWxsIGJ5dGVzCisJICogcmVjZWl2ZWQgb24gdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgb3V0cHV0IHN0cmVhbS48L2xpPgorCSAqIDxsaT5QYXJzaW5nIHRoZSBwcm90b2NvbC1zcGVjaWZpYyBtZXNzYWdlIHRyYWZmaWMgdG8gY3JlYXRlIGFuZCByZXBvcnQKKwkgKiByZXF1ZXN0IG9iamVjdHMgZm9yIGVhY2ggbWVzc2FnZSBwYXNzZWQgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlci48L2xpPgorCSAqIDxsaT5DbG9zaW5nIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHNvY2tldHMgYW5kIG90aGVyd2lzZSBjbGVhbmluZyB1cAorCSAqIGFmdGVyd2FyZHMuPC9saT4KKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0aGF0IHVzZXMgdGhpcyBwcm90b2NvbCBhZGFwdGVyCisJICogQHBhcmFtIGluIHRoZSBpbnB1dCBzb2NrZXQgb2YgdGhlIG1vbml0b3IgY2xpZW50CisJICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IHNvY2tldCBvZiB0aGUgbW9uaXRvciBzZXJ2ZXIKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1ciB3aGVuIG9wZW5pbmcgdGhlIHN0cmVhbXMgb2YgdGhlCisJICogICAgaW5wdXQgb3Igb3V0cHV0IHNvY2tldHMKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25uZWN0KElNb25pdG9yIG1vbml0b3IsIFNvY2tldCBpbiwgU29ja2V0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCQorCS8qKgorCSAqIENhbGxlZCBpZiB0aGUgbW9uaXRvciBpcyBjaGFuZ2VkIG9yIGRlbGV0ZWQsIG9yIHRoZSBwbHVnaW4gaXMgc2h1dHRpbmcgZG93bi4KKwkgKiBUaGUgZGVsZWdhdGUgbXVzdCBjbGVhbiB1cCB0aGUgY29ubmVjdGlvbnMgYW5kIHRocmVhZHMgY3JlYXRlZCB0byByZXNwb25kIHRvCisJICogdGhpcyBtb25pdG9yLiAKKwkgKiAKKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNjb25uZWN0KElNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1NvY2tldFdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1NvY2tldFdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmI0ZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvU29ja2V0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMzUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisvKioKKyAqIEEgc29ja2V0IHRoYXQgaXMgb25seSB1c2VkIGZvciByZXNlbmRpbmcgcmVxdWVzdHMuIEFsbCBpbnB1dCBvcGVyYXRpb25zIGFyZQorICogaWdub3JlZC4KKyAqLworcHVibGljIGNsYXNzIFNvY2tldFdyYXBwZXIgZXh0ZW5kcyBTb2NrZXQgeworCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CisJcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOworCQorCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBzb2NrZXQgd3JhcHBlci4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXRTdHJlYW0KKwkgKi8KKwlwdWJsaWMgU29ja2V0V3JhcHBlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgeworCSAgdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworCSAgdGhpcy5vdXRwdXRTdHJlYW0gPSBuZXcgRHVtbXlPdXRwdXRTdHJlYW0oKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2JpbmQoamF2YS5uZXQuU29ja2V0QWRkcmVzcykKKwkgKi8KKwlwdWJsaWMgdm9pZCBiaW5kKFNvY2tldEFkZHJlc3MgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjY2xvc2UoKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2Nvbm5lY3QoamF2YS5uZXQuU29ja2V0QWRkcmVzcywgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGNvbm5lY3QoU29ja2V0QWRkcmVzcyBhcmcwLCBpbnQgYXJnMSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjY29ubmVjdChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQorCSAqLworCXB1YmxpYyB2b2lkIGNvbm5lY3QoU29ja2V0QWRkcmVzcyBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRDaGFubmVsKCkKKwkgKi8KKwlwdWJsaWMgU29ja2V0Q2hhbm5lbCBnZXRDaGFubmVsKCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0Q2hhbm5lbCgpOworCX0KKwkKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldEluZXRBZGRyZXNzKCkKKwkgKi8KKwlwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0SW5ldEFkZHJlc3MoKSB7CisJCXJldHVybiBzdXBlci5nZXRJbmV0QWRkcmVzcygpOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0SW5wdXRTdHJlYW0oKQorCSAqLworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBpbnB1dFN0cmVhbTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldEtlZXBBbGl2ZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gZ2V0S2VlcEFsaXZlKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldExvY2FsQWRkcmVzcygpCisJICovCisJcHVibGljIEluZXRBZGRyZXNzIGdldExvY2FsQWRkcmVzcygpIHsKKwkJcmV0dXJuIHN1cGVyLmdldExvY2FsQWRkcmVzcygpOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0TG9jYWxQb3J0KCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKKwkJcmV0dXJuIHN1cGVyLmdldExvY2FsUG9ydCgpOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkKKwkgKi8KKwlwdWJsaWMgU29ja2V0QWRkcmVzcyBnZXRMb2NhbFNvY2tldEFkZHJlc3MoKSB7CisJCXJldHVybiBzdXBlci5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKTsKKwl9CisJCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRPT0JJbmxpbmUoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGdldE9PQklubGluZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlyZXR1cm4gc3VwZXIuZ2V0T09CSW5saW5lKCk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRPdXRwdXRTdHJlYW0oKQorCSAqLworCXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG91dHB1dFN0cmVhbTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFBvcnQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKwkJcmV0dXJuIHN1cGVyLmdldFBvcnQoKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFJlY2VpdmVCdWZmZXJTaXplKCkKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSZWNlaXZlQnVmZmVyU2l6ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlyZXR1cm4gc3VwZXIuZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFJlbW90ZVNvY2tldEFkZHJlc3MoKQorCSAqLworCXB1YmxpYyBTb2NrZXRBZGRyZXNzIGdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSB7CisJCXJldHVybiBzdXBlci5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRSZXVzZUFkZHJlc3MoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGdldFJldXNlQWRkcmVzcygpIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlyZXR1cm4gc3VwZXIuZ2V0UmV1c2VBZGRyZXNzKCk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRTZW5kQnVmZmVyU2l6ZSgpCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U2VuZEJ1ZmZlclNpemUoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHN1cGVyLmdldFNlbmRCdWZmZXJTaXplKCk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRTb0xpbmdlcigpCisJICovCisJcHVibGljIGludCBnZXRTb0xpbmdlcigpIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlyZXR1cm4gc3VwZXIuZ2V0U29MaW5nZXIoKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFNvVGltZW91dCgpCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U29UaW1lb3V0KCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CisJCXJldHVybiBzdXBlci5nZXRTb1RpbWVvdXQoKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFRjcE5vRGVsYXkoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGdldFRjcE5vRGVsYXkoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHN1cGVyLmdldFRjcE5vRGVsYXkoKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFRyYWZmaWNDbGFzcygpCisJICovCisJcHVibGljIGludCBnZXRUcmFmZmljQ2xhc3MoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHN1cGVyLmdldFRyYWZmaWNDbGFzcygpOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjaXNCb3VuZCgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCb3VuZCgpIHsKKwkJcmV0dXJuIHN1cGVyLmlzQm91bmQoKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2lzQ2xvc2VkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjaXNDb25uZWN0ZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2lzSW5wdXRTaHV0ZG93bigpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnB1dFNodXRkb3duKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNpc091dHB1dFNodXRkb3duKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc091dHB1dFNodXRkb3duKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZW5kVXJnZW50RGF0YShpbnQpCisJICovCisJcHVibGljIHZvaWQgc2VuZFVyZ2VudERhdGEoaW50IGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXN1cGVyLnNlbmRVcmdlbnREYXRhKGFyZzApOworCX0KKwkKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldEtlZXBBbGl2ZShib29sZWFuKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEtlZXBBbGl2ZShib29sZWFuIGFyZzApIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlzdXBlci5zZXRLZWVwQWxpdmUoYXJnMCk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRPT0JJbmxpbmUoYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPT0JJbmxpbmUoYm9vbGVhbiBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0T09CSW5saW5lKGFyZzApOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0UmVjZWl2ZUJ1ZmZlclNpemUoaW50KQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWNlaXZlQnVmZmVyU2l6ZShpbnQgYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFJlY2VpdmVCdWZmZXJTaXplKGFyZzApOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0UmV1c2VBZGRyZXNzKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0UmV1c2VBZGRyZXNzKGJvb2xlYW4gYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFJldXNlQWRkcmVzcyhhcmcwKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldFNlbmRCdWZmZXJTaXplKGludCkKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2VuZEJ1ZmZlclNpemUoaW50IGFyZzApIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlzdXBlci5zZXRTZW5kQnVmZmVyU2l6ZShhcmcwKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldFNvTGluZ2VyKGJvb2xlYW4sIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTb0xpbmdlcihib29sZWFuIGFyZzAsIGludCBhcmcxKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0U29MaW5nZXIoYXJnMCwgYXJnMSk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRTb1RpbWVvdXQoaW50KQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTb1RpbWVvdXQoaW50IGFyZzApIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlzdXBlci5zZXRTb1RpbWVvdXQoYXJnMCk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRUY3BOb0RlbGF5KGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0VGNwTm9EZWxheShib29sZWFuIGFyZzApIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlzdXBlci5zZXRUY3BOb0RlbGF5KGFyZzApOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0VHJhZmZpY0NsYXNzKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFmZmljQ2xhc3MoaW50IGFyZzApIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlzdXBlci5zZXRUcmFmZmljQ2xhc3MoYXJnMCk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzaHV0ZG93bklucHV0KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaHV0ZG93bklucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NodXRkb3duT3V0cHV0KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaHV0ZG93bk91dHB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBBIGR1bW15IE91dHB1dFN0cmVhbSB0aGF0IGFsbG93cyB1cyB0byBmYWtlIG91dHB1dCBmb3IgYSBzb2NrZXQuCisJICovCisJcHVibGljIGNsYXNzIER1bW15T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKwkJLyoqIChub24tSmF2YWRvYykKKwkJICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSNjbG9zZSgpCisJCSAqLworCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKwkJCisJCS8qKiAobm9uLUphdmFkb2MpCisJCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jZmx1c2goKQorCQkgKi8KKwkJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJLy8gZG8gbm90aGluZworCQl9CisJCisJCS8qKiAobm9uLUphdmFkb2MpCisJCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLCBpbnQsIGludCkKKwkJICovCisJCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKwkKKwkJLyoqIChub24tSmF2YWRvYykKKwkJICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShieXRlW10pCisJCSAqLworCQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQorCisJCS8qKiAobm9uLUphdmFkb2MpCisJCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jd3JpdGUoaW50KQorCQkgKi8KKwkJcHVibGljIHZvaWQgd3JpdGUoaW50IGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVENQSVBQcm90b2NvbEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RDUElQUHJvdG9jb2xBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhNGVjOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RDUElQUHJvdG9jb2xBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUQ1BJUFByb3RvY29sQWRhcHRlciBleHRlbmRzIFByb3RvY29sQWRhcHRlckRlbGVnYXRlIHsKKwlwcm90ZWN0ZWQgTWFwPElNb25pdG9yLCBDb25uZWN0aW9uPiBtYXAgPSBuZXcgSGFzaE1hcDxJTW9uaXRvciwgQ29ubmVjdGlvbj4oKTsKKwkKKwkvKioKKwkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Nvbm5lY3QoSU1vbml0b3IsIFNvY2tldCwgU29ja2V0KQorCSAqLworCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgoTW9uaXRvcikgbW9uaXRvciwgSVByb3RvY29sQWRhcHRlci5UQ1BJUF9QUk9UT0NPTF9JRCwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKKwkJQ29ubmVjdGlvbiBjb25uID0gbmV3IENvbm5lY3Rpb24oaW4sIG91dCk7CisJCW1hcC5wdXQobW9uaXRvciwgY29ubik7CisJCVRDUElQVGhyZWFkIHJlcXVlc3RUaHJlYWQgPSBuZXcgVENQSVBUaHJlYWQoY29ubiwgcmVxdWVzdCwgaW4uZ2V0SW5wdXRTdHJlYW0oKSwgb3V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKTsKKwkJcmVxdWVzdFRocmVhZC5zdGFydCgpOworCQluZXcgVENQSVBUaHJlYWQoY29ubiwgcmVxdWVzdCwgb3V0LmdldElucHV0U3RyZWFtKCksIGluLmdldE91dHB1dFN0cmVhbSgpLCBmYWxzZSkuc3RhcnQoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Rpc2Nvbm5lY3QoSU1vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgZGlzY29ubmVjdChJTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJQ29ubmVjdGlvbiBjb25uID0gbWFwLmdldChtb25pdG9yKTsKKwkJCWNvbm4uY2xvc2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVENQSVBUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RDUElQVGhyZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0ZGU4NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RDUElQVGhyZWFkLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKKy8qKgorICogTW9uaXRvciBzZXJ2ZXIgSS9PIHRocmVhZC4KKyAqLworcHVibGljIGNsYXNzIFRDUElQVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gMjA0ODsKKwlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW47CisJcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBvdXQ7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1ZXN0OworCQorCXByb3RlY3RlZCBDb25uZWN0aW9uIGNvbm47CisJcHJvdGVjdGVkIFJlcXVlc3QgcmVxdWVzdDsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBUQ1AvSVAgdGhyZWFkLgorCSAqIAorCSAqIEBwYXJhbSBjb25uCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcGFyYW0gaW4KKwkgKiBAcGFyYW0gb3V0CisJICogQHBhcmFtIGlzUmVxdWVzdAorCSAqLworCXB1YmxpYyBUQ1BJUFRocmVhZChDb25uZWN0aW9uIGNvbm4sIFJlcXVlc3QgcmVxdWVzdCwgSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQsIGJvb2xlYW4gaXNSZXF1ZXN0KSB7CisJCXN1cGVyKCJUQ1AvSVAgTW9uaXRvciBUQ1AvSVAgQ29ubmVjdGlvbiIpOworCQl0aGlzLmNvbm4gPSBjb25uOworCQl0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworCQl0aGlzLmluID0gaW47CisJCXRoaXMub3V0ID0gb3V0OworCQl0aGlzLmlzUmVxdWVzdCA9IGlzUmVxdWVzdDsKKwkJc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgKyAxKTsKKwkJc2V0RGFlbW9uKHRydWUpOworCX0KKworCS8qKgorCSAqIExpc3RlbiBmb3IgaW5wdXQsIHNhdmUgaXQsIGFuZCBwYXNzIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJdHJ5IHsKKwkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbQlVGRkVSXTsKKwkJCWludCBuID0gaW4ucmVhZChiKTsKKwkJCXdoaWxlIChuID4gMCkgeworCQkJCW91dC53cml0ZShiLCAwLCBuKTsKKwkJCQlpZiAoYiAhPSBudWxsICYmIG4gPiAwKSB7CisJCQkJCWJ5dGVbXSB4ID0gbnVsbDsKKwkJCQkJaWYgKG4gPT0gQlVGRkVSKQorCQkJCQkJeCA9IGI7CisJCQkJCWVsc2UgeworCQkJCQkJeCA9IG5ldyBieXRlW25dOworCQkJCQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCB4LCAwLCBuKTsKKwkJCQkJfQorCQkJCQlpZiAoaXNSZXF1ZXN0KQorCQkJCQkJcmVxdWVzdC5hZGRUb1JlcXVlc3QoeCk7CisJCQkJCWVsc2UKKwkJCQkJCXJlcXVlc3QuYWRkVG9SZXNwb25zZSh4KTsKKwkJCQl9CisJCQkJbiA9IGluLnJlYWQoYik7CisJCQkJVGhyZWFkLnlpZWxkKCk7CisJCQl9CisJCQlvdXQuZmx1c2goKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0gZmluYWxseSB7CisJCQkvL3JlcXVlc3QuZmlyZUNoYW5nZWRFdmVudCgpOworCQkJaWYgKCFpc1JlcXVlc3QpCisJCQkJY29ubi5jbG9zZSgpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjM5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CisvKioKKyAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFjZSB7CisJLyoqCisJICogQ29uZmlnIHRyYWNlIGV2ZW50LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOworCQorCS8qKgorCSAqIFdhcm5pbmcgdHJhY2UgZXZlbnQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFdBUk5JTkcgPSAxOworCQorCS8qKgorCSAqIFNldmVyZSB0cmFjZSBldmVudC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMjsKKwkKKwkvKioKKwkgKiBGaW5lc3QgdHJhY2UgZXZlbnQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVTVCA9IDM7CisJCisJLyoqCisJICogUGFyc2luZyB0cmFjZSBldmVudC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUEFSU0lORyA9IDQ7CisKKwkvKioKKwkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXByaXZhdGUgVHJhY2UoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCS8qKgorCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgorCSAqCisJICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAorCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgeworCQl0cmFjZShsZXZlbCwgcywgbnVsbCk7CisJfQorCQorCS8qKgorCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCisJICoKKwkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCisJICogQHBhcmFtIHMgYSBtZXNzYWdlCisJICogQHBhcmFtIHQgYSB0aHJvd2FibGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7CisJCWlmIChsZXZlbCA9PSBTRVZFUkUpCisJCQlNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKKwkJCisJCWlmICghTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCisJCQlyZXR1cm47CisJCQorCQlTeXN0ZW0ub3V0LnByaW50bG4oTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQgKyAiICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIgIiArIHMpOworCQlpZiAodCAhPSBudWxsKQorCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmYyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKQEAgLTAsMCArMSwyNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworLyoqCisgKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCisgKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCisgKgorICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCisgKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKKyAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCisgKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAorICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KKyAqCisgKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKKyAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKKyAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgorICoKKyAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RlbmNlIHdpdGggYSB2ZXJzaW9uIElELgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKKwlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7CisJcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7CisKKwkvKioKKwkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQorCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCisJICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KKwkgKi8KKwlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7CisJCWZhY3RvcnkgPSBkb2M7CisJCWVsZW1lbnQgPSBlbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElNZW1lbnRvI2NyZWF0ZUNoaWxkKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpIHsKKwkJRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlKTsKKwkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7CisJCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgRG9jdW1lbnQgZnJvbSBhIFJlYWRlciBhbmQgYW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciByZWFkaW5nIAorCSAqIGEgZG9jdW1lbnQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVSZWFkUm9vdChJbnB1dFN0cmVhbSBpbikgeworCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7CisJCXRyeSB7CisJCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisJCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKwkJCWRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOworCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQorCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOworCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlpbi5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogQW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciB3cml0aW5nIGEgZG9jdW1lbnQuCisJICogCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcmV0dXJuIGEgbWVtZW50bworCSAqLworCXB1YmxpYyBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVXcml0ZVJvb3QoU3RyaW5nIHR5cGUpIHsKKwkJRG9jdW1lbnQgZG9jdW1lbnQ7CisJCXRyeSB7CisJCQlkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsKKwkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOworCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCBlbGVtZW50KTsgICAgICAgICAgICAKKwkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoZSk7CisJCX0KKwl9CisJCisJLyoqCisJICogQHNlZSBJTWVtZW50byNnZXRDaGlsZChTdHJpbmcpCisJICovCisJcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7CisJCS8vIEdldCB0aGUgbm9kZXMuCisJCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7CisJCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7CisJCWlmIChzaXplID09IDApCisJCQlyZXR1cm4gbnVsbDsKKwkKKwkJLy8gRmluZCB0aGUgZmlyc3Qgbm9kZSB3aGljaCBpcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KKwkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7CisJCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKKwkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgeworCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOworCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKKwkJCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGVsZW1lbnQyKTsKKwkJCX0KKwkJfQorCQorCQkvLyBBIGNoaWxkIHdhcyBub3QgZm91bmQuCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEBzZWUgSU1lbWVudG8jZ2V0Q2hpbGRyZW4oU3RyaW5nKQorCSAqLworCXB1YmxpYyBJTWVtZW50byBbXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSkgeworCQkvLyBHZXQgdGhlIG5vZGVzLgorCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOworCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOworCQlpZiAoc2l6ZSA9PSAwKQorCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKKwkKKwkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgorCQlMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KHNpemUpOworCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKKwkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisJCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7CisJCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQorCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7CisJCQl9CisJCX0KKwkKKwkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgorCQlzaXplID0gbGlzdC5zaXplKCk7CisJCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07CisJCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgeworCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGxpc3QuZ2V0KHgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0czsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElNZW1lbnRvI2dldEludGVnZXIoU3RyaW5nKQorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSkgeworCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKKwkJaWYgKGF0dHIgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOyAKKwkJU3RyaW5nIHN0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOworCQl0cnkgeworCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHN0clZhbHVlKTsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBJTWVtZW50byNnZXRTdHJpbmcoU3RyaW5nKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7CisJCWlmIChhdHRyID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsgCisJCXJldHVybiBhdHRyLmdldFZhbHVlKCk7CisJfQorCisJLyoqCisJICogTG9hZHMgYSBtZW1lbnRvIGZyb20gdGhlIGdpdmVuIGZpbGVuYW1lLgorCSAqCisJICogQHBhcmFtIGluIHRoZSBpbnB1dCBzdHJlYW0KKwkgKiBAcmV0dXJuIGEgbWVtZW50bworCSAqLworCXB1YmxpYyBzdGF0aWMgSU1lbWVudG8gbG9hZE1lbWVudG8oSW5wdXRTdHJlYW0gaW4pIHsKKwkJcmV0dXJuIGNyZWF0ZVJlYWRSb290KGluKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElNZW1lbnRvI3B1dEludGVnZXIoU3RyaW5nLCBpbnQpCisJICovCisJcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgbikgeworCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZy52YWx1ZU9mKG4pKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElNZW1lbnRvI3B1dFN0cmluZyhTdHJpbmcsIFN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisJCWlmICh2YWx1ZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKKwl9CisJCisJLyoqCisJICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYW4gb3V0cHV0IHN0cmVhbS4KKwkgKiAKKwkgKiBAcGFyYW0gb3MKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7CisJCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOworCQl0cnkgeworCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAorCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAorCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7ICAgICAgICAgICAgCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOworCQl9CisJfQorCisJLyoqCisJICogU2F2ZSB0byBzdHJpbmcuCisJICogCisJICogQHJldHVybiB0aGUgc3RyaW5nCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBTdHJpbmcgc2F2ZVRvU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJc2F2ZShvdXQpOworCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCJVVEYtOCIpOworCX0KKworCS8qKgorCSAqIEBzZWUgSU1lbWVudG8jZ2V0Qm9vbGVhbihTdHJpbmcpCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KSB7CisJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOworCQlpZiAoYXR0ciA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKKwkJaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHN0clZhbHVlKSkKKwkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKKwkJCisJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7CisJfQorCisJLyoqCisJICogQHNlZSBJTWVtZW50byNwdXRCb29sZWFuKFN0cmluZywgYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpIHsKKwkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBDb25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBDb25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjYjg1ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUENvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworLyoqCisgKiBNYW5hZ2VzIGEgbW9uaXRvciBzZXJ2ZXIgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBob3N0cy4gVGhpcworICogY29ubmVjdGlvbiBtYXkgc3Bhd24gb25lIG9yIG1vcmUgVENQL0lQIHJlcXVlc3RzIHRvIGJlIGRpc3BsYXllZAorICogaW4gdGhlIG1vbml0b3Igc2VydmVyIHZpZXcuCisgKi8KK3B1YmxpYyBjbGFzcyBIVFRQQ29ubmVjdGlvbiB7CisJcHJvdGVjdGVkIElNb25pdG9yIG1vbml0b3I7CisKKwlwcm90ZWN0ZWQgaW50IHJlcSA9IC0xOworCXByb3RlY3RlZCBpbnQgcmVzcCA9IC0xOworCisJcHJvdGVjdGVkIExpc3Q8UmVxdWVzdD4gcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0PFJlcXVlc3Q+KCk7CisKKwkvKioKKwkgKiBIVFRQQ29ubmVjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgorCSAqLworCXB1YmxpYyBIVFRQQ29ubmVjdGlvbihJTW9uaXRvciBtb25pdG9yKSB7CisJCXN1cGVyKCk7CisJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CisJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJUQ1AvSVAgbW9uaXRvciBjb25uZWN0aW9uIG9wZW5lZCAiICsgbW9uaXRvcik7CisJfQorCisJLyoqCisJICogQWRkIGEgcmVxdWVzdC4KKwkgKiAKKwkgKiBAcGFyYW0gYiB0aGUgcmVxdWVzdCBkYXRhCisJICogQHBhcmFtIGlzTmV3IHRydWUgaWYgbmV3CisJICovCisJcHVibGljIHZvaWQgYWRkUmVxdWVzdChieXRlW10gYiwgYm9vbGVhbiBpc05ldykgeworCQlpZiAoaXNOZXcpCisJCQlyZXEgKys7CisJCUhUVFBSZXF1ZXN0IHJlcXVlc3QgPSAoSFRUUFJlcXVlc3QpIGdldFJlcXVlc3RSZXNwb25zZShyZXEpOworCQlyZXF1ZXN0LmFkZFRvUmVxdWVzdChiKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSByZXNwb25zZS4KKwkgKiAKKwkgKiBAcGFyYW0gYiB0aGUgcmVzcG9uc2UgZGF0YQorCSAqIEBwYXJhbSBpc05ldyB0cnVlIGlmIG5ldworCSAqLworCXB1YmxpYyB2b2lkIGFkZFJlc3BvbnNlKGJ5dGVbXSBiLCBib29sZWFuIGlzTmV3KSB7CisJCWlmIChpc05ldykKKwkJCXJlc3AgKys7CisJCUhUVFBSZXF1ZXN0IHJlcXVlc3QgPSAoSFRUUFJlcXVlc3QpIGdldFJlcXVlc3RSZXNwb25zZShyZXNwKTsKKwkJcmVxdWVzdC5hZGRUb1Jlc3BvbnNlKGIpOworCX0KKworCS8qKgorCSAqIEFkZCBhIHByb3BlcnR5LgorCSAqIAorCSAqIEBwYXJhbSBrZXkKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkJUmVxdWVzdCByZXF1ZXN0ID0gZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7CisJCXJlcXVlc3Quc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSByZXF1ZXN0LgorCSAqIAorCSAqIEBwYXJhbSBpc1JlcXVlc3QKKwkgKiBAcmV0dXJuIHRoZSByZXF1ZXN0CisJICovCisJcHVibGljIFJlcXVlc3QgZ2V0UmVxdWVzdFJlc3BvbnNlKGJvb2xlYW4gaXNSZXF1ZXN0KSB7CisJCWlmIChpc1JlcXVlc3QpCisJCQlyZXR1cm4gZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7CisJCQorCQlyZXR1cm4gZ2V0UmVxdWVzdFJlc3BvbnNlKHJlc3ApOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCBSZXF1ZXN0IGdldFJlcXVlc3RSZXNwb25zZShpbnQgaSkgeworCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJCXdoaWxlIChpID49IHJlcXVlc3RzLnNpemUoKSkgeworCQkJCVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBIVFRQUmVxdWVzdCgoTW9uaXRvcikgbW9uaXRvciwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKKwkJCQlyZXF1ZXN0cy5hZGQocmVxdWVzdCk7CisJCQkJcmV0dXJuIHJlcXVlc3Q7CisJCQl9CisJCQlyZXR1cm4gcmVxdWVzdHMuZ2V0KGkpOworCQl9CisJfQorCisJLyoqCisJICogU2V0IHRoZSB0aXRsZS4KKwkgKiAKKwkgKiBAcGFyYW0gdGl0bGUgdGhlIHRpdGxlCisJICogQHBhcmFtIGlzTmV3IGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgdGl0bGUsIGJvb2xlYW4gaXNOZXcpIHsKKwkJaWYgKGlzTmV3KQorCQkJcmVxICsrOworCQlIVFRQUmVxdWVzdCByZXF1ZXN0ID0gKEhUVFBSZXF1ZXN0KSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVxKTsKKwkJcmVxdWVzdC5zZXROYW1lKHRpdGxlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBQcm90b2NvbEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFByb3RvY29sQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjRjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBQcm90b2NvbEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBIVFRQUHJvdG9jb2xBZGFwdGVyIGV4dGVuZHMgUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUgeworCXByb3RlY3RlZCBNYXA8SU1vbml0b3IsIENvbm5lY3Rpb24+IG1hcCA9IG5ldyBIYXNoTWFwPElNb25pdG9yLCBDb25uZWN0aW9uPigpOworCisJLyoqCisJICogQHNlZSBQcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSNjb25uZWN0KElNb25pdG9yLCBTb2NrZXQsIFNvY2tldCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25uZWN0KElNb25pdG9yIG1vbml0b3IsIFNvY2tldCBpbiwgU29ja2V0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uMiA9IG5ldyBDb25uZWN0aW9uKGluLCBvdXQpOworCQltYXAucHV0KG1vbml0b3IsIGNvbm4yKTsKKwkJSFRUUENvbm5lY3Rpb24gY29ubiA9IG5ldyBIVFRQQ29ubmVjdGlvbihtb25pdG9yKTsKKwkJSFRUUFRocmVhZCByZXF1ZXN0ID0gbmV3IEhUVFBUaHJlYWQoY29ubjIsIGluLmdldElucHV0U3RyZWFtKCksIG91dC5nZXRPdXRwdXRTdHJlYW0oKSwgY29ubiwgdHJ1ZSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKKwkJSFRUUFRocmVhZCByZXNwb25zZSA9IG5ldyBIVFRQVGhyZWFkKGNvbm4yLCBvdXQuZ2V0SW5wdXRTdHJlYW0oKSwgaW4uZ2V0T3V0cHV0U3RyZWFtKCksIGNvbm4sIGZhbHNlLCAibG9jYWxob3N0IiwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgcmVxdWVzdCk7CisJCXJlcXVlc3Quc3RhcnQoKTsKKwkJcmVzcG9uc2Uuc3RhcnQoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Rpc2Nvbm5lY3QoSU1vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgZGlzY29ubmVjdChJTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJQ29ubmVjdGlvbiBjb25uID0gbWFwLmdldChtb25pdG9yKTsKKwkJCWlmIChjb25uICE9IG51bGwpCisJCQkJY29ubi5jbG9zZSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBSZXF1ZXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlMTY1NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JUHJvdG9jb2xBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgSFRUUFJlcXVlc3QgZXh0ZW5kcyBSZXF1ZXN0IHsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFUVVFU1RfSEVBREVSID0gInJlcXVlc3QtaGVhZGVyIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0hFQURFUiA9ICJyZXNwb25zZS1oZWFkZXIiOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFVRVNUX0JPRFkgPSAicmVxdWVzdC1ib2R5IjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0JPRFkgPSAicmVzcG9uc2UtYm9keSI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWSA9IG5ldyBieXRlWzBdOworCisJLyoqCisJICogQ3JlYXRlIGFuIEhUVFBSZXF1ZXN0LgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yCisJICogQHBhcmFtIGxvY2FsUG9ydAorCSAqIEBwYXJhbSByZW1vdGVIb3N0CisJICogQHBhcmFtIHJlbW90ZVBvcnQKKwkgKi8KKwlwdWJsaWMgSFRUUFJlcXVlc3QoTW9uaXRvciBtb25pdG9yLCBpbnQgbG9jYWxQb3J0LCBTdHJpbmcgcmVtb3RlSG9zdCwgaW50IHJlbW90ZVBvcnQpIHsKKwkJc3VwZXIobW9uaXRvciwgSVByb3RvY29sQWRhcHRlci5IVFRQX1BST1RPQ09MX0lELCBsb2NhbFBvcnQsIHJlbW90ZUhvc3QsIHJlbW90ZVBvcnQpOworCX0KKworCS8qKgorCSAqIEBzZWUgUmVxdWVzdCNnZXRSZXF1ZXN0KGludCkKKwkgKi8KKwlwdWJsaWMgYnl0ZVtdIGdldFJlcXVlc3QoaW50IHR5cGUyKSB7CisJCWlmICh0eXBlMiA9PSBBTEwpCisJCQlyZXR1cm4gcmVxdWVzdDsKKwkJZWxzZSBpZiAodHlwZTIgPT0gVFJBTlNQT1JUKQorCQkJcmV0dXJuIGdldFJlcXVlc3RIZWFkZXIoKTsKKwkJZWxzZQorCQkJcmV0dXJuIGdldFJlcXVlc3RDb250ZW50KCk7CisJfQorCisJLyoqCisJICogQHNlZSBSZXF1ZXN0I2dldFJlc3BvbnNlKGludCkKKwkgKi8KKwlwdWJsaWMgYnl0ZVtdIGdldFJlc3BvbnNlKGludCB0eXBlMikgeworCQlpZiAodHlwZTIgPT0gQUxMKQorCQkJcmV0dXJuIHJlc3BvbnNlOworCQllbHNlIGlmICh0eXBlMiA9PSBUUkFOU1BPUlQpCisJCQlyZXR1cm4gZ2V0UmVzcG9uc2VIZWFkZXIoKTsKKwkJZWxzZQorCQkJcmV0dXJuIGdldFJlc3BvbnNlQ29udGVudCgpOworCX0KKworCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdEhlYWRlcigpIHsKKwkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9IRUFERVIpOworCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBieXRlW10pKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiAoYnl0ZVtdKSBvYmo7CisJfQorCisJcHJvdGVjdGVkIGJ5dGVbXSBnZXRSZXF1ZXN0Q29udGVudCgpIHsKKwkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9CT0RZKTsKKwkJaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgYnl0ZVtdKSkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gKGJ5dGVbXSkgb2JqOworCX0KKworCXByb3RlY3RlZCBieXRlW10gZ2V0UmVzcG9uc2VIZWFkZXIoKSB7CisJCU9iamVjdCBvYmogPSBnZXRQcm9wZXJ0eShIVFRQX1JFU1BPTlNFX0hFQURFUik7CisJCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChieXRlW10pIG9iajsKKwl9CisKKwlwcm90ZWN0ZWQgYnl0ZVtdIGdldFJlc3BvbnNlQ29udGVudCgpIHsKKwkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVTUE9OU0VfQk9EWSk7CisJCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChieXRlW10pIG9iajsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuKSB7CisJCXN1cGVyLnNldE5hbWUobik7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQVGhyZWFkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBUaHJlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNiYmUxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQVGhyZWFkLmphdmEKQEAgLTAsMCArMSw3MjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7CisvKioKKyAqIE1vbml0b3Igc2VydmVyIEkvTyB0aHJlYWQuCisgKi8KK3B1YmxpYyBjbGFzcyBIVFRQVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gMjA0ODsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIENSID0gKGJ5dGUpICdccic7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBMRiA9IChieXRlKSAnXG4nOworCXByb3RlY3RlZCBzdGF0aWMgaW50IHRocmVhZENvdW50ID0gMDsKKworCXByaXZhdGUgYnl0ZVtdIHJlYWRCdWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJdOworCisJLy8gYnVmZmVyIGFuZCBpbmRleAorCXByb3RlY3RlZCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMF07CisJcHJvdGVjdGVkIGludCBidWZmZXJJbmRleCA9IDA7CisKKwlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW47CisJcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBvdXQ7CisJcHJvdGVjdGVkIEhUVFBDb25uZWN0aW9uIGNvbm47CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1ZXN0OworCXByb3RlY3RlZCBDb25uZWN0aW9uIGNvbm4yOworCQorCXByb3RlY3RlZCBIVFRQVGhyZWFkIHJlcXVlc3Q7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNXYWl0aW5nOworCQorCS8vIHVzZXIgdG8gdHJhbnNsYXRlIHRoZSBIb3N0OiBoZWFkZXIKKwlwcm90ZWN0ZWQgU3RyaW5nIGhvc3Q7CisJcHJvdGVjdGVkIGludCBwb3J0OworCisJcHJvdGVjdGVkIGludCBjb250ZW50TGVuZ3RoID0gLTE7CisJcHJvdGVjdGVkIGJ5dGUgdHJhbnNmZXJFbmNvZGluZyA9IC0xOworCXByb3RlY3RlZCBTdHJpbmcgcmVzcG9uc2VUeXBlID0gbnVsbDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uS2VlcEFsaXZlID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbkNsb3NlID0gZmFsc2U7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVOQ09ESU5HX1NUUklORyA9IG5ldyBTdHJpbmdbXSB7CisJCSJjaHVua2VkIiwgImlkZW50aXR5IiwgImd6aXAiLCAiY29tcHJlc3NlZCIsICJkZWZsYXRlIn07CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgRU5DT0RJTkdfQ0hVTktFRCA9IDA7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEVOQ09ESU5HX0lERU5USVRZID0gMTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgRU5DT0RJTkdfR1pJUCA9IDI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEVOQ09ESU5HX0NPTVBSRVNTRUQgPSAzOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBFTkNPRElOR19ERUZMQVRFID0gNDsKKworLyogY2hhbmdlOgorUmVmZXJlcjogaHR0cDovL2xvY2FsaG9zdDo4MDgxL2luZGV4Lmh0bWwKK0hvc3Q6IGxvY2FsaG9zdDo4MDgxCisqLworLyogVGhlIENvbm5lY3Rpb24gaGVhZGVyIGhhcyB0aGUgZm9sbG93aW5nIGdyYW1tYXI6CisKKwkgICBDb25uZWN0aW9uID0gIkNvbm5lY3Rpb24iICI6IiAxIyhjb25uZWN0aW9uLXRva2VuKQorCSAgIGNvbm5lY3Rpb24tdG9rZW4gID0gdG9rZW4KKworICAgSFRUUC8xLjEgcHJveGllcyBNVVNUIHBhcnNlIHRoZSBDb25uZWN0aW9uIGhlYWRlciBmaWVsZCBiZWZvcmUgYQorICAgbWVzc2FnZSBpcyBmb3J3YXJkZWQgYW5kLCBmb3IgZWFjaCBjb25uZWN0aW9uLXRva2VuIGluIHRoaXMgZmllbGQsCisgICByZW1vdmUgYW55IGhlYWRlciBmaWVsZChzKSBmcm9tIHRoZSBtZXNzYWdlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUKKyAgIGNvbm5lY3Rpb24tdG9rZW4uICovCisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgSFRUUCB0aHJlYWQuCisJICogCisJICogQHBhcmFtIGNvbm4yCisJICogQHBhcmFtIGluCisJICogQHBhcmFtIG91dAorCSAqIEBwYXJhbSBjb25uCisJICogQHBhcmFtIGlzUmVxdWVzdAorCSAqIEBwYXJhbSBob3N0CisJICogQHBhcmFtIHBvcnQKKwkgKi8KKwlwdWJsaWMgSFRUUFRocmVhZChDb25uZWN0aW9uIGNvbm4yLCBJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCwgSFRUUENvbm5lY3Rpb24gY29ubiwgYm9vbGVhbiBpc1JlcXVlc3QsIFN0cmluZyBob3N0LCBpbnQgcG9ydCkgeworCQlzdXBlcigiVENQL0lQIE1vbml0b3IgSFRUUCBDb25uZWN0aW9uIik7CisJCXRoaXMuY29ubjIgPSBjb25uMjsKKwkJdGhpcy5pbiA9IGluOworCQl0aGlzLm91dCA9IG91dDsKKwkJdGhpcy5jb25uID0gY29ubjsKKwkJdGhpcy5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7CisJCXRoaXMuaG9zdCA9IGhvc3Q7CisJCXRoaXMucG9ydCA9IHBvcnQ7CisJCisJCXNldE5hbWUoIkhUVFAgKCIgKyBob3N0ICsgIjoiICsgcG9ydCArICIpICIgKyAoaXNSZXF1ZXN0ID8gIlJFUVVFU1QiIDogIlJFU1BPTlNFIikgKyAiICIgKyAodGhyZWFkQ291bnQrKykpOworCQlzZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSArIDEpOworCQlzZXREYWVtb24odHJ1ZSk7CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiU3RhcnRlZDogIiArIHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgSFRUUCB0aHJlYWQuCisJICogCisJICogQHBhcmFtIGNvbm4yCisJICogQHBhcmFtIGluCisJICogQHBhcmFtIG91dAorCSAqIEBwYXJhbSBjb25uCisJICogQHBhcmFtIGlzUmVxdWVzdAorCSAqIEBwYXJhbSBob3N0CisJICogQHBhcmFtIHBvcnQKKwkgKiBAcGFyYW0gcmVxdWVzdAorCSAqLworCXB1YmxpYyBIVFRQVGhyZWFkKENvbm5lY3Rpb24gY29ubjIsIElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0LCBIVFRQQ29ubmVjdGlvbiBjb25uLCBib29sZWFuIGlzUmVxdWVzdCwgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBIVFRQVGhyZWFkIHJlcXVlc3QpIHsKKwkJdGhpcyhjb25uMiwgaW4sIG91dCwgY29ubiwgaXNSZXF1ZXN0LCBob3N0LCBwb3J0KTsKKwkJCisJCXRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisJfQorCisJLyoqCisJICogQWRkIGEgbGluZSBmZWVkIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYXJyYXkuCisJICogQHJldHVybiBieXRlW10KKwkgKiBAcGFyYW0gYiBieXRlW10KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBjb252ZXJ0KGJ5dGVbXSBiKSB7CisJCWlmIChiID09IG51bGwgfHwgYi5sZW5ndGggPT0gMCkKKwkJCXJldHVybiBiOworCQorCQlpbnQgc2l6ZSA9IGIubGVuZ3RoOworCQlieXRlW10geCA9IG5ldyBieXRlW3NpemUgKyAyXTsKKwkJU3lzdGVtLmFycmF5Y29weShiLCAwLCB4LCAwLCBzaXplKTsKKwkJeFtzaXplXSA9IChieXRlKSAnXHInOyAgICAgLy8gQ1IKKwkJeFtzaXplICsgMV0gPSAoYnl0ZSkgJ1xuJzsgLy8gTEYKKwkJcmV0dXJuIHg7CisJfQorCisJLyoqCisJICogUmVhZCBtb3JlIGRhdGEgaW50byB0aGUgYnVmZmVyLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGZpbGxCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbnQgbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7CisJCQorCQlpZiAobiA8PSAwKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFbmQgb2YgaW5wdXQiKTsKKwkJCisJCS8vIGFkZCB0byBmdWxsIGJ1ZmZlcgorCQlpbnQgbGVuID0gYnVmZmVyLmxlbmd0aCAtIGJ1ZmZlckluZGV4OworCQlpZiAobGVuIDwgMCkKKwkJCWxlbiA9IDA7CisJCWJ5dGVbXSB4ID0gbmV3IGJ5dGVbbiArIGxlbl07CisJCVN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZmZXJJbmRleCwgeCwgMCwgbGVuKTsKKwkJU3lzdGVtLmFycmF5Y29weShyZWFkQnVmZmVyLCAwLCB4LCBsZW4sIG4pOworCQlidWZmZXJJbmRleCA9IDA7CisJCWJ1ZmZlciA9IHg7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZmlyc3QgbG9jYXRpb24gb2YgYSBDUkxGLgorCSAqCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGdldEZpcnN0Q1JMRigpIHsKKwkJaW50IHNpemUgPSBidWZmZXIubGVuZ3RoOworCQlpbnQgaSA9IGJ1ZmZlckluZGV4ICsgMTsKKwkJd2hpbGUgKGkgPCBzaXplKSB7CisJCQlpZiAoYnVmZmVyW2kgLSAxXSA9PSBDUiAmJiBidWZmZXJbaV0gPT0gTEYpCisJCQkJcmV0dXJuIGk7CisJCQlpKys7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCS8qKgorCSAqIE91dHB1dCB0aGUgZ2l2ZW4gYnl0ZXMuCisJICogQHBhcmFtIGIgYnl0ZVtdCisJICovCisJcHJvdGVjdGVkIHZvaWQgb3V0cHV0Qnl0ZXMoYnl0ZVtdIGIsIGJvb2xlYW4gaXNOZXcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW91dC53cml0ZShiKTsKKwkJaWYgKGlzUmVxdWVzdCkKKwkJCWNvbm4uYWRkUmVxdWVzdChiLCBpc05ldyk7CisJCWVsc2UKKwkJCWNvbm4uYWRkUmVzcG9uc2UoYiwgaXNOZXcpOworCX0KKworCS8qKgorCSAqIFBhcnNlIHRoZSBIVFRQIGJvZHkuCisJICogCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHBhcnNlQm9keSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJQYXJzaW5nIGJvZHkgZm9yOiAiICsgdGhpcyk7CisJCQorCQlpZiAocmVzcG9uc2VUeXBlICE9IG51bGwgJiYgKCIyMDQiLmVxdWFscyhyZXNwb25zZVR5cGUpIHx8ICIzMDQiLmVxdWFscyhyZXNwb25zZVR5cGUpKSkgeworCQkJc2V0SFRUUEJvZHkobmV3IGJ5dGVbMF0pOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoaXNSZXF1ZXN0KSB7CisJCQlpZiAoY29udGVudExlbmd0aCAhPSAtMSkgeworCQkJCWJ5dGVbXSBiMiA9IG51bGw7CisJCQkJaW50IGIySW5kZXggPSAwOworCQkJCWlmIChjb250ZW50TGVuZ3RoIDwgMTAyNCAqIDEwMjQpCisJCQkJCWIyID0gbmV3IGJ5dGVbY29udGVudExlbmd0aF07CisJCQkJYnl0ZVtdIGIgPSByZW1vdmVGcm9tQnVmZmVyKE1hdGgubWluKGJ1ZmZlci5sZW5ndGgsIGJ1ZmZlckluZGV4ICsgY29udGVudExlbmd0aCkpOworCQkJCWlmIChiMiAhPSBudWxsKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgYjIsIDAsIGIubGVuZ3RoKTsKKwkJCQkJYjJJbmRleCArPSBiLmxlbmd0aDsKKwkJCQl9CisJCQkJaW50IGJ5dGVzTGVmdCA9IGNvbnRlbnRMZW5ndGggLSBiLmxlbmd0aDsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiW1JlcXVlc3RdIGJ5dGVzTGVmdDogIisgYnl0ZXNMZWZ0KTsKKwkJCQlvdXQud3JpdGUoYik7CisJCQkJCisJCQkJaW50IG4gPSAwOworCQkJCXdoaWxlIChieXRlc0xlZnQgPiAwKSB7ICAKKwkJCQkJbiA9IGluLnJlYWQocmVhZEJ1ZmZlciwgMCwgTWF0aC5taW4ocmVhZEJ1ZmZlci5sZW5ndGgsIGJ5dGVzTGVmdCkpOworCQkJCQlieXRlc0xlZnQgLT0gbjsKKwkJCQkJaWYgKGIyICE9IG51bGwpIHsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkocmVhZEJ1ZmZlciwgMCwgYjIsIGIySW5kZXgsIG4pOworCQkJCQkJYjJJbmRleCArPSBuOworCQkJCQl9CisJCQkJCW91dC53cml0ZShyZWFkQnVmZmVyLCAwLCBuKTsJCQkJCQorCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAgIltSZXF1ZXN0XSBieXRlcyByZWFkOiAiKyBuICsgIiBieXRlc0xlZnQ6ICIrIGJ5dGVzTGVmdCk7CisJCQkJfQorCQkJCQorCQkJCS8vIHJlc3RvcmUgdGhlIGJ5dGUgYXJyYXkgZm9yIGRpc3BsYXkKKwkJCQlpZiAoYjIgPT0gbnVsbCkKKwkJCQkJYjIgPSBNZXNzYWdlcy5lcnJvckNvbnRlbnRTaXplLmdldEJ5dGVzKCk7CisJCQkJCisJCQkJY29ubi5hZGRSZXF1ZXN0KGIyLCBmYWxzZSk7CisJCQkJc2V0SFRUUEJvZHkoYjIpOworCQkJfSBlbHNlIGlmICh0cmFuc2ZlckVuY29kaW5nICE9IC0xICYmIHRyYW5zZmVyRW5jb2RpbmcgIT0gRU5DT0RJTkdfSURFTlRJVFkpIHsKKwkJCQlwYXJzZUNodW5rKCk7CisJCQl9CisJCQkKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJEb25lIHBhcnNpbmcgcmVxdWVzdCBib2R5IGZvcjogIiArIHRoaXMpOworCQkJcmV0dXJuOworCQl9CisJCQorCQkvLyBqdXN0IHJldHVybiBib2R5IGZvciBIVFRQIDEuMCByZXNwb25zZXMKKwkJaWYgKCFpc1JlcXVlc3QgJiYgIWNvbm5lY3Rpb25LZWVwQWxpdmUgJiYgY29udGVudExlbmd0aCA9PSAtMSAmJiB0cmFuc2ZlckVuY29kaW5nID09IC0xKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQXNzdW1pbmcgSFRUUCAxLjAgZm9yOiAiICsgdGhpcyk7CisJCQlpbnQgbiA9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJJbmRleDsKKwkJCWJ5dGVbXSBiID0gcmVhZEJ5dGVzKG4pOworCQkJYnl0ZVtdIGJvZHkgPSBuZXcgYnl0ZVswXTsKKwkJCXdoaWxlIChuID49IDApIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQnl0ZXMgcmVhZDogIiArIG4gKyAiICIgKyB0aGlzKTsKKwkJCQlpZiAoYiAhPSBudWxsICYmIG4gPiAwKSB7CisJCQkJCWJ5dGVbXSB4ID0gbnVsbDsKKwkJCQkJaWYgKG4gPT0gYi5sZW5ndGgpCisJCQkJCQl4ID0gYjsKKwkJCQkJZWxzZSB7CisJCQkJCQl4ID0gbmV3IGJ5dGVbbl07CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGIsIDAsIHgsIDAsIG4pOworCQkJCQl9CisJCQkJCW91dHB1dEJ5dGVzKHgsIGZhbHNlKTsKKwkJCQkJCisJCQkJCS8vIGNvcHkgdG8gSFRUUCBib2R5CisJCQkJCWJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbYm9keS5sZW5ndGggKyB4Lmxlbmd0aF07CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoYm9keSwgMCwgdGVtcCwgMCwgYm9keS5sZW5ndGgpOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHgsIDAsIHRlbXAsIGJvZHkubGVuZ3RoLCB4Lmxlbmd0aCk7CisJCQkJCWJvZHkgPSB0ZW1wOworCQkJCX0KKwkJCQlpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoIDwgQlVGRkVSKQorCQkJCQliID0gbmV3IGJ5dGVbQlVGRkVSXTsKKwkJCQluID0gaW4ucmVhZChiKTsKKwkJCQlUaHJlYWQueWllbGQoKTsKKwkJCX0KKwkJCW91dC5mbHVzaCgpOworCQkJc2V0SFRUUEJvZHkoYm9keSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIHNwZWMgNC40LjEKKwkJaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsICYmIHJlc3BvbnNlVHlwZS5zdGFydHNXaXRoKCIxIikpIHsKKwkJCXNldEhUVFBCb2R5KG5ldyBieXRlWzBdKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gc3BlYyA0LjQuMgorCQlpZiAodHJhbnNmZXJFbmNvZGluZyAhPSAtMSAmJiB0cmFuc2ZlckVuY29kaW5nICE9IEVOQ09ESU5HX0lERU5USVRZKSB7CisJCQlwYXJzZUNodW5rKCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIHNwZWMgNC40LjMKKwkJaWYgKGNvbnRlbnRMZW5ndGggIT0gLTEpIHsKKwkJCWJ5dGVbXSBiMiA9IG51bGw7CisJCQlpbnQgYjJJbmRleCA9IDA7CisJCQlpZiAoY29udGVudExlbmd0aCA8IDEwMjQgKiAxMDI0KQorCQkJCWIyID0gbmV3IGJ5dGVbY29udGVudExlbmd0aF07CisJCQlieXRlW10gYiA9IHJlbW92ZUZyb21CdWZmZXIoTWF0aC5taW4oYnVmZmVyLmxlbmd0aCwgYnVmZmVySW5kZXggKyBjb250ZW50TGVuZ3RoKSk7CisJCQlpZiAoYjIgIT0gbnVsbCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgYjIsIDAsIGIubGVuZ3RoKTsKKwkJCQliMkluZGV4ICs9IGIubGVuZ3RoOworCQkJfQorCQkJaW50IGJ5dGVzTGVmdCA9IGNvbnRlbnRMZW5ndGggLSBiLmxlbmd0aDsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsImJ5dGVzTGVmdDogIisgYnl0ZXNMZWZ0KTsKKwkJCW91dC53cml0ZShiKTsKKwkJCQorCQkJaW50IG4gPSAwOworCQkJd2hpbGUgKGJ5dGVzTGVmdCA+IDApIHsKKwkJCQluID0gaW4ucmVhZChyZWFkQnVmZmVyLCAwLCBNYXRoLm1pbihyZWFkQnVmZmVyLmxlbmd0aCwgYnl0ZXNMZWZ0KSk7CisJCQkJYnl0ZXNMZWZ0IC09IG47CisJCQkJaWYgKGIyICE9IG51bGwpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShyZWFkQnVmZmVyLCAwLCBiMiwgYjJJbmRleCwgbik7CisJCQkJCWIySW5kZXggKz0gbjsKKwkJCQl9CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywiYnl0ZXMgcmVhZDogIituICsgIiBieXRlc0xlZnQ6ICIrIGJ5dGVzTGVmdCk7CisJCQkJb3V0LndyaXRlKHJlYWRCdWZmZXIsIDAsIG4pOworCQkJfQorCQkJCQkJCisJCQkvLyByZXN0b3JlIHRoZSBieXRlIGFycmF5IGZvciBkaXNwbGF5CisJCQlpZiAoYjIgPT0gbnVsbCkKKwkJCQliMiA9IE1lc3NhZ2VzLmVycm9yQ29udGVudFNpemUuZ2V0Qnl0ZXMoKTsKKwkJCQorCQkJaWYgKGlzUmVxdWVzdCkKKwkJCQljb25uLmFkZFJlcXVlc3QoYjIsIGZhbHNlKTsKKwkJCWVsc2UKKwkJCQljb25uLmFkZFJlc3BvbnNlKGIyLCBmYWxzZSk7CisJCQlzZXRIVFRQQm9keShiMik7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIHNwZWMgNC40LjQgKD8pCisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiVW5rbm93biBib2R5IGZvcjogIiArIHRoaXMpOworCX0KKworCS8vIFVzZSB0aGlzIG1ldGhvZCB0byBkdW1wIHRoZSBjb250ZW50IG9mIGEgYnl0ZSBhcnJheQorCS8vCisJLy8JcHJpdmF0ZSB2b2lkIGR1bXBCdWZmZXIoYnl0ZVtdIGIpIHsKKwkvLwkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkJ1ZmZlciBkdW1wIHRvIGRlZmF1bHQub3V0OiIpOworCS8vCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQnl0ZSBhcnJheTogIiArIGIubGVuZ3RoKTsKKwkvLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7CisJLy8JCQlTeXN0ZW0ub3V0LnByaW50KCIgWyIgKyAoY2hhcikgYltpXSArICJdIik7IC8vICsiIFsiK2JbaSsxXSsiXSAiCisJLy8JCQlpZiAoaSAlIDIwID09IDApIHsKKwkvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkvLwkJCX0KKwkvLwkJfQorCS8vCX0KKwkKKwkKKwkvKioKKwkgKiBQYXJzZSBhbiBIVFRQIGNodW5rLgorCSAqIAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBwYXJzZUNodW5rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlBhcnNpbmcgY2h1bmsgZm9yOiAiICsgdGhpcyk7CisJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOworCQlieXRlW10gYm9keSA9IG5ldyBieXRlWzBdOworCQorCQl3aGlsZSAoIWRvbmUpIHsKKwkJCS8vIHJlYWQgY2h1bmsgc2l6ZQorCQkJYnl0ZVtdIGIgPSByZWFkTGluZSgpOworCQorCQkJU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGIpOworCQkJaW50IGluZGV4ID0gcy5pbmRleE9mKCIgIik7CisJCQlpbnQgbGVuZ3RoID0gLTE7CisJCQl0cnkgeworCQkJCWlmIChpbmRleCA+IDApCisJCQkJCXMgPSBzLnN1YnN0cmluZygwLCBpbmRleCk7CisJCQkJbGVuZ3RoID0gSW50ZWdlci5wYXJzZUludChzLnRyaW0oKSwgMTYpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgY2h1bmsgZm9yOiAiICsgdGhpcywgZSk7CisJCQl9CisJCisJCQkvLyBvdXRwdXQgYnl0ZXMKKwkJCW91dHB1dEJ5dGVzKGIsIGZhbHNlKTsKKwkKKwkJCWlmIChsZW5ndGggPD0gMCkKKwkJCQlkb25lID0gdHJ1ZTsKKwkJCWVsc2UgeworCQkJCS8vIHJlYWQgYW5kIG91dHB1dCBjaHVuayBkYXRhIHBsdXMgQ1JMRgorCQkJCWIgPSByZWFkQnl0ZXMobGVuZ3RoICsgMik7CisJCQkJb3V0cHV0Qnl0ZXMoYiwgZmFsc2UpOworCQkJCQorCQkJCS8vIGNvcHkgdG8gSFRUUCBib2R5CisJCQkJYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVtib2R5Lmxlbmd0aCArIGIubGVuZ3RoIC0gMl07CisJCQkJU3lzdGVtLmFycmF5Y29weShib2R5LCAwLCB0ZW1wLCAwLCBib2R5Lmxlbmd0aCk7CisJCQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCB0ZW1wLCBib2R5Lmxlbmd0aCwgYi5sZW5ndGggLSAyKTsKKwkJCQlib2R5ID0gdGVtcDsKKwkJCX0KKwkJfQorCQorCQkvLyByZWFkIHRyYWlsZXIKKwkJYnl0ZVtdIGIgPSByZWFkTGluZSgpOworCQl3aGlsZSAoYi5sZW5ndGggPiAyKSB7CisJCQlvdXRwdXRCeXRlcyhiLCBmYWxzZSk7CisJCQliID0gcmVhZExpbmUoKTsKKwkJfQorCQorCQlvdXRwdXRCeXRlcyhiLCBmYWxzZSk7CisJCXNldEhUVFBCb2R5KGJvZHkpOworCX0KKworCS8qKgorCSAqIFBhcnNlIGFuIEhUVFAgaGVhZGVyLgorCSAqIAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBwYXJzZUhlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJQYXJzaW5nIGhlYWRlciBmb3I6ICIgKyB0aGlzKTsKKwkKKwkJLy8gcmVhZCB1bnRpbCBmaXJzdCBibGFuayBsaW5lCisJCWJvb2xlYW4gaXNGaXJzdExpbmUgPSB0cnVlOworCQlib29sZWFuIGlzTmV3ID0gdHJ1ZTsKKwkKKwkJYnl0ZVtdIGIgPSByZWFkTGluZSgpOworCQl3aGlsZSAoYi5sZW5ndGggPiA1KSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBoZWFkZXIgbGluZTogJyIgKyBuZXcgU3RyaW5nKGIpICsgIiciKTsKKwkJCQorCQkJaWYgKGlzRmlyc3RMaW5lKSB7CisJCQkJU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGIpOworCQkJCWlmIChpc1JlcXVlc3QpIHsKKwkJCQkJc2V0TGFiZWwocyk7CisJCQkJCWlzTmV3ID0gZmFsc2U7CisJCQkJfQorCQorCQkJCWlmICghaXNSZXF1ZXN0KSB7CisJCQkJCWludCBpbmRleDEgPSBzLmluZGV4T2YoJyAnKTsKKwkJCQkJaW50IGluZGV4MiA9IHMuaW5kZXhPZignICcsIGluZGV4MSArIDEpOworCQorCQkJCQl0cnkgeworCQkJCQkJcmVzcG9uc2VUeXBlID0gcy5zdWJzdHJpbmcoaW5kZXgxICsgMSwgaW5kZXgyKS50cmltKCk7CisJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUmVzcG9uc2UgVHlwZTogIiArIHRoaXMgKyAiICIgKyByZXNwb25zZVR5cGUpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIHBhcnNpbmcgcmVzcG9uc2UgdHlwZSBmb3I6ICIgKyB0aGlzLCBlKTsKKwkJCQkJfQorCQkJCQlpZiAocmVzcG9uc2VUeXBlICE9IG51bGwgJiYgcmVzcG9uc2VUeXBlLmVxdWFscygiMTAwIikpIHsKKwkJCQkJCW91dHB1dEJ5dGVzKGIsIGlzTmV3KTsKKwkJCQkJCWlzTmV3ID0gZmFsc2U7CisKKwkJCQkJCWIgPSByZWFkTGluZSgpOworCQkJCQkJb3V0cHV0Qnl0ZXMoYiwgZmFsc2UpOworCisJCQkJCQliID0gcmVhZExpbmUoKTsKKworCQkJCQkJaW5kZXgxID0gcy5pbmRleE9mKCcgJyk7CisJCQkJCQlpbmRleDIgPSBzLmluZGV4T2YoJyAnLCBpbmRleDEgKyAxKTsKKworCQkJCQkJdHJ5IHsKKwkJCQkJCQlyZXNwb25zZVR5cGUgPSBzLnN1YnN0cmluZyhpbmRleDEgKyAxLCBpbmRleDIpLnRyaW0oKTsKKwkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUmVzcG9uc2UgVHlwZTogIiArIHRoaXMgKyAiICIgKyByZXNwb25zZVR5cGUpOworCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgcGFyc2luZyByZXNwb25zZSB0eXBlIGZvcjogIiArIHRoaXMsIGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlzRmlyc3RMaW5lID0gZmFsc2U7CisJCQl9CisJCisJCQkvLyB0cmFuc2xhdGUKKwkJCWIgPSB0cmFuc2xhdGVIZWFkZXJMaW5lKGIpOworCQkJCisJCQlvdXRwdXRCeXRlcyhiLCBpc05ldyk7CisJCQlpc05ldyA9IGZhbHNlOworCQorCQkJYiA9IHJlYWRMaW5lKCk7CisJCX0KKwkJCisJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJQYXJzaW5nIGZpbmFsIGhlYWRlciBsaW5lOiAnIiArIG5ldyBTdHJpbmcoYikgKyAiJyIpOworCQkKKwkJb3V0cHV0Qnl0ZXMoYiwgZmFsc2UpOworCQkKKwkJUmVxdWVzdCByciA9IGNvbm4uZ2V0UmVxdWVzdFJlc3BvbnNlKGlzUmVxdWVzdCk7CisJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJTZXR0aW5nIGhlYWRlciBsZW5ndGg6ICIgKyByci5nZXRSZXF1ZXN0KFJlcXVlc3QuQUxMKS5sZW5ndGgpOworCQkKKwkJc2V0SFRUUEhlYWRlcihycik7CisJfQorCisJLyoqCisJICogUmVhZCBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCisJICogQHJldHVybiBieXRlW10KKwkgKi8KKwlwcm90ZWN0ZWQgYnl0ZVtdIHJlYWRCeXRlcyhpbnQgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgInJlYWRCeXRlcygpICIgKyBuICsgIiBmb3I6ICIgKyB0aGlzKTsKKwkJd2hpbGUgKGJ1ZmZlci5sZW5ndGggLSBidWZmZXJJbmRleCA8IG4pCisJCQlmaWxsQnVmZmVyKCk7CisJCQorCQlyZXR1cm4gcmVtb3ZlRnJvbUJ1ZmZlcihidWZmZXJJbmRleCArIG4pOworCX0KKworCS8qKgorCSAqIFJlYWQgYW5kIHJldHVybiB0aGUgbmV4dCBmdWxsIGxpbmUuCisJICoKKwkgKiBAcmV0dXJuIGJ5dGVbXQorCSAqLworCXByb3RlY3RlZCBieXRlW10gcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAicmVhZExpbmUoKSBmb3I6ICIgKyB0aGlzKTsKKwkJCisJCWludCBuID0gZ2V0Rmlyc3RDUkxGKCk7CisJCXdoaWxlIChuIDwgMCkgeworCQkJZmlsbEJ1ZmZlcigpOworCQkJbiA9IGdldEZpcnN0Q1JMRigpOworCQl9CisJCXJldHVybiByZW1vdmVGcm9tQnVmZmVyKG4gKyAxKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgZGF0YSBmcm9tIHRoZSBidWZmZXIgdXAgdG8gdGhlIGFic29sdXRlIGluZGV4IG4uCisJICogUmV0dXJuIHRoZSBkYXRhIGZyb20gYmV0d2VlbiBidWZmZXJJbmRleCBhbmQgbi4KKwkgKgorCSAqIEBwYXJhbSBuIHRoZSBieXRlcyB0byByZW1vdmUKKwkgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheQorCSAqLworCXByb3RlY3RlZCBieXRlW10gcmVtb3ZlRnJvbUJ1ZmZlcihpbnQgbikgeworCQkvLyBjb3B5IGxpbmUgb3V0IG9mIGJ1ZmZlcgorCQlieXRlW10gYiA9IG5ldyBieXRlW24gLSBidWZmZXJJbmRleF07CisJCVN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZmZXJJbmRleCwgYiwgMCwgbiAtIGJ1ZmZlckluZGV4KTsKKwkJCisJCWlmIChidWZmZXIubGVuZ3RoID4gQlVGRkVSICogMiB8fCBidWZmZXJJbmRleCA+IEJVRkZFUikgeworCQkJLy8gcmVtb3ZlIGxpbmUgZnJvbSBidWZmZXIKKwkJCWludCBzaXplID0gYnVmZmVyLmxlbmd0aDsKKwkJCWJ5dGVbXSB4ID0gbmV3IGJ5dGVbc2l6ZSAtIG5dOworCQkJU3lzdGVtLmFycmF5Y29weShidWZmZXIsIG4sIHgsIDAsIHNpemUgLSBuKTsKKwkJCWJ1ZmZlciA9IHg7CisJCQlidWZmZXJJbmRleCA9IDA7CisJCX0gZWxzZQorCQkJYnVmZmVySW5kZXggPSBuOworCQkKKwkJcmV0dXJuIGI7CisJfQorCisJLyoqCisJICogTGlzdGVuIGZvciBpbnB1dCwgc2F2ZSBpdCwgYW5kIHBhc3MgdG8gdGhlIG91dHB1dCBzdHJlYW0uCisJICogUGhpbG9zb3BoeTogUmVhZCBhIHNpbmdsZSBsaW5lIHNlcGFyYXRlbHkgYW5kIHRyYW5zbGF0ZS4KKwkgKiBXaGVuIGJsYW5rIGxpbmUgaXMgcmVhY2hlZCwganVzdCBwYXNzIGFsbCBvdGhlciBkYXRhIHRocm91Z2guCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQl0cnkgeworCQkJdHJ5IHsKKwkJCQl3aGlsZSAodHJ1ZSkgeworCQkJCQljb250ZW50TGVuZ3RoID0gLTE7CisJCQkJCXRyYW5zZmVyRW5jb2RpbmcgPSAtMTsKKwkJCQkJY29ubmVjdGlvbktlZXBBbGl2ZSA9IGZhbHNlOworCQkJCQljb25uZWN0aW9uQ2xvc2UgPSBmYWxzZTsKKwkJCQkJCisJCQkJCXBhcnNlSGVhZGVyKCk7CisJCQkJCXBhcnNlQm9keSgpOworCQkJCQkKKwkJCQkJaWYgKGlzUmVxdWVzdCAmJiBjb25uZWN0aW9uS2VlcEFsaXZlKQorCQkJCQkJd2FpdEZvclJlc3BvbnNlKCk7CisJCQkJCQorCQkJCQkvL1JlcXVlc3QgciA9IGNvbm4uZ2V0UmVxdWVzdFJlc3BvbnNlKHRydWUpOworCQkJCQkvL3IuZmlyZUNoYW5nZWRFdmVudCgpOworCQkJCQkKKwkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkRvbmUgSFRUUCByZXF1ZXN0IGZvciAiICsgdGhpcyArICIgIiArIGNvbm5lY3Rpb25LZWVwQWxpdmUpOworCQkJCQlpZiAoIWlzUmVxdWVzdCAmJiAoIXJlcXVlc3QuY29ubmVjdGlvbktlZXBBbGl2ZSB8fCBjb25uZWN0aW9uQ2xvc2UpKSB7CisJCQkJCQljb25uMi5jbG9zZSgpOworCQkJCQkJaWYgKHJlcXVlc3QuY29ubmVjdGlvbktlZXBBbGl2ZSAmJiBjb25uZWN0aW9uQ2xvc2UpCisJCQkJCQkJcmVxdWVzdC5jb25uZWN0aW9uS2VlcEFsaXZlID0gZmFsc2U7CisJCQkJCQkJbm90aWZ5UmVxdWVzdCgpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmICghaXNSZXF1ZXN0KQorCQkJCQkJbm90aWZ5UmVxdWVzdCgpOworCQkJCQkKKwkJCQkJVGhyZWFkLnlpZWxkKCk7CisJCQkJfQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCS8vIHJlYWNoZWQgZW5kIG9mIGlucHV0CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVuZCBvZiBidWZmZXIgZm9yOiAiICsgdGhpcywgZSk7CisJCQkJaWYgKCFpc1JlcXVlc3QpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJlcXVlc3QuY29ubmVjdGlvbktlZXBBbGl2ZSA9IGZhbHNlOworCQkJCQkJcmVxdWVzdC5jb25uMi5jbG9zZSgpOworCQkJCQkJbm90aWZ5UmVxdWVzdCgpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFcnJvciBjbG9zaW5nIHJlcXVlc3QgaW4gcmVzcG9uc2UgdG8gZXJyb3I6ICIgKyB0aGlzLCBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJLy8gc2VuZCByZXN0IG9mIGJ1ZmZlcgorCQkJb3V0LndyaXRlKGJ1ZmZlciwgYnVmZmVySW5kZXgsIGJ1ZmZlci5sZW5ndGggLSBidWZmZXJJbmRleCk7CisJCQlvdXQuZmx1c2goKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFcnJvciBpbjogIiArIHRoaXMsIGUpOworCQl9CisJCS8vaWYgKCFpc1JlcXVlc3QpCisJCS8vCWNvbm4yLmNsb3NlKCk7CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQ2xvc2luZyB0aHJlYWQgIiArIHRoaXMpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHRpdGxlIG9mIHRoZSBjYWxsLgorCSAqCisJICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZworCSAqLworCXByb3RlY3RlZCB2b2lkIHNldExhYmVsKFN0cmluZyBzKSB7CisJCXRyeSB7CisJCQlpbnQgaW5kZXgxID0gcy5pbmRleE9mKCcgJyk7CisJCQlpZiAoaW5kZXgxIDwgMCB8fCBpbmRleDEgPiAxNSkKKwkJCQlyZXR1cm47CisJCQlpbnQgaW5kZXgyID0gcy5pbmRleE9mKCcgJywgaW5kZXgxICsgMSk7CisJCQlpZiAoaW5kZXgyIDwgMCkKKwkJCQlyZXR1cm47CisJCisJCQljb25uLnNldExhYmVsKHMuc3Vic3RyaW5nKGluZGV4MSArIDEsIGluZGV4MiksIHRydWUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwl9CisKKwkvKioKKwkgKiBUcmFuc2xhdGUgdGhlIGhlYWRlciBsaW5lLgorCSAqIAorCSAqIEByZXR1cm4gYnl0ZVtdCisJICogQHBhcmFtIGIgYnl0ZVtdCisJICovCisJcHJvdGVjdGVkIGJ5dGVbXSB0cmFuc2xhdGVIZWFkZXJMaW5lKGJ5dGVbXSBiKSB7CisJCVN0cmluZyBzID0gbmV3IFN0cmluZyhiKTsKKwkKKwkJaWYgKGlzUmVxdWVzdCAmJiBzLnN0YXJ0c1dpdGgoIkhvc3Q6ICIpKSB7CisJCQlTdHJpbmcgdCA9ICJIb3N0OiAiICsgaG9zdDsKKwkJCWlmIChwb3J0ICE9IDgwKQorCQkJCXQgKz0gIjoiICsgcG9ydDsKKwkJCXJldHVybiBjb252ZXJ0KHQuZ2V0Qnl0ZXMoKSk7CisJCX0gZWxzZSBpZiAocy5zdGFydHNXaXRoKCJDb250ZW50LUxlbmd0aDogIikpIHsKKwkJCXRyeSB7CisJCQkJY29udGVudExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQocy5zdWJzdHJpbmcoMTYpLnRyaW0oKSk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkNvbnRlbnQgbGVuZ3RoOiAiICsgdGhpcyArICIgIiArIGNvbnRlbnRMZW5ndGgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQ29udGVudCBsZW5ndGggZXJyb3IiLCBlKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzLnN0YXJ0c1dpdGgoIkNvbm5lY3Rpb246ICIpKSB7CisJCQl0cnkgeworCQkJCVN0cmluZyB0ID0gcy5zdWJzdHJpbmcoMTEpLnRyaW0oKTsKKwkJCQlpZiAodC5lcXVhbHNJZ25vcmVDYXNlKCJLZWVwLUFsaXZlIikpCisJCQkJCWNvbm5lY3Rpb25LZWVwQWxpdmUgPSB0cnVlOworCQkJCS8vIHJlc3BvbnNlIGNvbnRhaW5zICJDb25uZWN0aW9uOiBjbG9zZSIgaGVhZGVyCisJCQkJLy8gY2xvc2UgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IGV2ZW4gaWYgImtlZXBhbGl2ZSIgaGFkIGJlZW4gcmVxdWVzdGVkCisJCQkJLy8gd2UgY2FuJ3QganVzdCByZXNldCByZXF1ZXN0LmtlZXBBbGl2ZSAtIGl0J3MgdXNlZCBhcyBpbmRpY2F0b3Igd2hldGhlcgorCQkJCS8vIHRoZSByZXF1ZXN0IHRocmVhZCBpcyAoZ29pbmcgdG8pIHdhaXQgZm9yIHRoZSByZXNwb25zZSB0aHJlYWQKKwkJCQkvLyAoYW5kIG11c3QgYmUgbm90aWZpZWQgKG9ubHkgdGhlbikpLAorCQkJCS8vIHNvIHdlIGhhdmUgdG8gbGV0IGl0IGFsb25lCisJCQkJaWYgKHQuZXF1YWxzSWdub3JlQ2FzZSgiY2xvc2UiKSkKKwkJCQkJY29ubmVjdGlvbkNsb3NlID0gdHJ1ZTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiS2VlcCBhbGl2ZTogIiArIGNvbm5lY3Rpb25LZWVwQWxpdmUpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgZ2V0dGluZyBDb25uZWN0aW9uOiBmcm9tIGhlYWRlciIsIGUpOworCQkJfQorCQl9IGVsc2UgaWYgKHMuc3RhcnRzV2l0aCgiVHJhbnNmZXItRW5jb2Rpbmc6ICIpKSB7CisJCQlTdHJpbmcgdCA9IHMuc3Vic3RyaW5nKDE5KS50cmltKCk7CisJCQlpbnQgc2l6ZSA9IEVOQ09ESU5HX1NUUklORy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWlmIChFTkNPRElOR19TVFJJTkdbaV0uZXF1YWxzSWdub3JlQ2FzZSh0KSkgeworCQkJCQl0cmFuc2ZlckVuY29kaW5nID0gKGJ5dGUpIGk7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJUcmFuc2ZlciBlbmNvZGluZzogIiArIEVOQ09ESU5HX1NUUklOR1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCisJCXJldHVybiBiOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjbG9zZSgpIHsKKwkJdHJ5IHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJDbG9zaW5nOiAiICsgdGhpcyk7CisJCQlvdXQuY2xvc2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFcnJvciBjbG9zaW5nIGNvbm5lY3Rpb24gIiArIHRoaXMsIGUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgd2FpdEZvclJlc3BvbnNlKCkgeworCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiV2FpdGluZyBmb3IgcmVzcG9uc2UgIiArIHRoaXMpOworCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJCXRyeSB7CisJCQkJaXNXYWl0aW5nID0gdHJ1ZTsKKwkJCQl3YWl0KCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFcnJvciBpbiB3YWl0Rm9yUmVzcG9uc2UoKSAiICsgdGhpcywgZSk7CisJCQl9CisJCQlpc1dhaXRpbmcgPSBmYWxzZTsKKwkJfQorCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRG9uZSB3YWl0aW5nIGZvciByZXNwb25zZSAiICsgdGhpcyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVxdWVzdCgpIHsKKwkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIk5vdGlmeWluZyByZXF1ZXN0ICIgKyB0aGlzKTsKKwkJd2hpbGUgKHJlcXVlc3QuY29ubmVjdGlvbktlZXBBbGl2ZSAmJiAhcmVxdWVzdC5pc1dhaXRpbmcpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJXYWl0aW5nIGZvciByZXF1ZXN0ICIgKyB0aGlzKTsKKwkJCXRyeSB7CisJCQkJVGhyZWFkLnNsZWVwKDEwMCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJCXN5bmNocm9uaXplZCAocmVxdWVzdCkgeworCQkJdHJ5IHsKKwkJCQlyZXF1ZXN0Lm5vdGlmeSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgaW4gbm90aWZ5UmVxdWVzdCgpICIgKyB0aGlzLCBlKTsKKwkJCX0KKwkJfQorCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRG9uZSBub3RpZnlpbmcgcmVxdWVzdCAiICsgdGhpcyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0SFRUUEhlYWRlcihSZXF1ZXN0IHJyKSB7CisJCWlmIChpc1JlcXVlc3QpIHsKKwkJCWJ5dGVbXSBiID0gcnIuZ2V0UmVxdWVzdChSZXF1ZXN0LkFMTCk7CisJCQlieXRlW10gaCA9IG5ldyBieXRlW2IubGVuZ3RoXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgaCwgMCwgYi5sZW5ndGgpOworCQkJcnIuc2V0UHJvcGVydHkoSFRUUFJlcXVlc3QuSFRUUF9SRVFVRVNUX0hFQURFUiwgaCk7CisJCX0gZWxzZSB7CisJCQlieXRlW10gYiA9IHJyLmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKTsKKwkJCWJ5dGVbXSBoID0gbmV3IGJ5dGVbYi5sZW5ndGhdOworCQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCBoLCAwLCBiLmxlbmd0aCk7CisJCQlyci5zZXRQcm9wZXJ0eShIVFRQUmVxdWVzdC5IVFRQX1JFU1BPTlNFX0hFQURFUiwgaCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRIVFRQQm9keShieXRlW10gYikgeworCQlSZXF1ZXN0IHJyID0gY29ubi5nZXRSZXF1ZXN0UmVzcG9uc2UoaXNSZXF1ZXN0KTsKKwkJaWYgKGlzUmVxdWVzdCkKKwkJCXJyLnNldFByb3BlcnR5KEhUVFBSZXF1ZXN0LkhUVFBfUkVRVUVTVF9CT0RZLCBiKTsKKwkJZWxzZQorCQkJcnIuc2V0UHJvcGVydHkoSFRUUFJlcXVlc3QuSFRUUF9SRVNQT05TRV9CT0RZLCBiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL1Jlc2VuZEhUVFBDb25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL1Jlc2VuZEhUVFBDb25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllMzQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUENvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKKy8qKgorICogQSByZXNlbmQgSFRUUCBjb25uZWN0aW9uIHdyYXBzIGFuIEhUVFAgY29ubmVjdGlvbiB0byBzZW5kIGFuIGV4aXN0aW5nIHJlcXVlc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNlbmRIVFRQQ29ubmVjdGlvbiBleHRlbmRzIEhUVFBDb25uZWN0aW9uIHsKKwlwcm90ZWN0ZWQgUmVxdWVzdCBleGlzdGluZ1JlcXVlc3Q7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgcmVzZW5kIGNvbm5lY3Rpb24uCisJICogCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKi8KKwlwdWJsaWMgUmVzZW5kSFRUUENvbm5lY3Rpb24oUmVxdWVzdCByZXF1ZXN0KSB7CisJCXN1cGVyKG51bGwpOworCQl0aGlzLmV4aXN0aW5nUmVxdWVzdCA9IHJlcXVlc3Q7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLkhUVFBDb25uZWN0aW9uI2dldFJlcXVlc3RSZXNwb25zZShpbnQpCisJICovCisJcHJvdGVjdGVkIFJlcXVlc3QgZ2V0UmVxdWVzdFJlc3BvbnNlKGludCBpKSB7CisJCXJldHVybiBleGlzdGluZ1JlcXVlc3Q7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUFJlcXVlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUFJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ4ODU5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9SZXNlbmRIVFRQUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlNvY2tldFdyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OworLyoqCisgKiBXcmFwcyBhbiBleGlzdGluZyByZXF1ZXN0IHRvIGNyZWF0ZSBhbiBIVFRQIHJlcXVlc3QgdGhhdCBjYW4gYmUgc2VudC4gVGhlCisgKiByZXNwb25zZSBpcyBpZ25vcmVkLiBPbmx5IHRoZSByZXF1ZXN0IGlzIGltcG9ydGFudCBpbiB0aGlzIGNhc2UuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNlbmRIVFRQUmVxdWVzdCBleHRlbmRzIEhUVFBSZXF1ZXN0IHsKKwlwcml2YXRlIGJvb2xlYW4gc2VudCA9IGZhbHNlOworCisJcHJpdmF0ZSBieXRlW10gaGVhZGVyOworCisJcHJpdmF0ZSBieXRlW10gY29udGVudDsKKworCXByaXZhdGUgUmVxdWVzdCBvcmlnaW5hbFJlcXVlc3QgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIG1vbml0b3IKKwkgKiBAcGFyYW0gcmVxIHRoZSByZXF1ZXN0IHRoYXQgaXMgdG8gYmUgcmVzZW50LgorCSAqLworCXB1YmxpYyBSZXNlbmRIVFRQUmVxdWVzdChNb25pdG9yIG1vbml0b3IsIFJlcXVlc3QgcmVxKSB7CisJCXN1cGVyKG1vbml0b3IsIHJlcS5nZXRMb2NhbFBvcnQoKSwgcmVxLmdldFJlbW90ZUhvc3QoKSwgcmVxLmdldFJlbW90ZVBvcnQoKSk7CisJCXNldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9IRUFERVIsIHJlcS5nZXRQcm9wZXJ0eShIVFRQX1JFUVVFU1RfSEVBREVSKSk7CisJCXNldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9CT0RZLCByZXEuZ2V0UHJvcGVydHkoSFRUUF9SRVFVRVNUX0JPRFkpKTsKKwkJaGVhZGVyID0gcmVxLmdldFJlcXVlc3QoVFJBTlNQT1JUKTsKKwkJY29udGVudCA9IHJlcS5nZXRSZXF1ZXN0KENPTlRFTlQpOworCQlyZXF1ZXN0ID0gcmVxLmdldFJlcXVlc3QoQUxMKTsKKwkJbmFtZSA9IHJlcS5nZXROYW1lKCk7CisJCXRoaXMub3JpZ2luYWxSZXF1ZXN0ID0gcmVxOworCX0KKworCS8qKgorCSAqIFNlbmQgdGhlIHJlcXVlc3QuCisJICovCisJcHVibGljIHZvaWQgc2VuZFJlcXVlc3QoKSB7CisJCXRyeSB7CisJCQlTb2NrZXQgaW5Tb2NrZXQgPSBuZXcgU29ja2V0V3JhcHBlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVxdWVzdCkpOworCQkJU29ja2V0IG91dFNvY2tldCA9IG5ldyBTb2NrZXQocmVtb3RlSG9zdCwgcmVtb3RlUG9ydCk7CisJCQkvL0Nvbm5lY3Rpb24gY29ubiA9IG5ldyBDb25uZWN0aW9uKGluU29ja2V0LCBvdXRTb2NrZXQpOworCQkJLy9UQ1BJUFRocmVhZCByZXF1ZXN0VGhyZWFkID0gbmV3IFRDUElQVGhyZWFkKGNvbm4sIHRoaXMsIGluLAorCQkJLy8gb3V0U29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKTsKKwkJCS8vcmVxdWVzdFRocmVhZC5zdGFydCgpOworCQkJLy9uZXcgVENQSVBUaHJlYWQoY29ubiwgdGhpcywgb3V0U29ja2V0LmdldElucHV0U3RyZWFtKCksCisJCQkvLyBpblNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgZmFsc2UpLnN0YXJ0KCk7CisJCQlDb25uZWN0aW9uIGNvbm4yID0gbmV3IENvbm5lY3Rpb24oaW5Tb2NrZXQsIG91dFNvY2tldCk7CisJCQlSZXNlbmRIVFRQQ29ubmVjdGlvbiBjb25uID0gbmV3IFJlc2VuZEhUVFBDb25uZWN0aW9uKHRoaXMpOworCisJCQlIVFRQVGhyZWFkIHJlcXVlc3QyID0gbmV3IEhUVFBUaHJlYWQoY29ubjIsIGluU29ja2V0LmdldElucHV0U3RyZWFtKCksCisJCQkJCW91dFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgY29ubiwgdHJ1ZSwgcmVtb3RlSG9zdCwgcmVtb3RlUG9ydCk7CisJCQlIVFRQVGhyZWFkIHJlc3BvbnNlMiA9IG5ldyBIVFRQVGhyZWFkKGNvbm4yLCBvdXRTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSwKKwkJCQkJaW5Tb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIGNvbm4sIGZhbHNlLCAibG9jYWxob3N0IiwgbG9jYWxQb3J0LCByZXF1ZXN0Mik7CisJCQlyZXF1ZXN0Mi5zdGFydCgpOworCQkJcmVzcG9uc2UyLnN0YXJ0KCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXJlc3BvbnNlID0gKCJVbmFibGUgdG8gcmVzZW5kIHRvIHNlcnZlci5cbiIgKyBlKS5nZXRCeXRlcygpOworCQl9CisJCXNlbnQgPSB0cnVlOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBSZXF1ZXN0I2FkZFRvUmVxdWVzdChieXRlW10pCisJICovCisJcHVibGljIHZvaWQgYWRkVG9SZXF1ZXN0KGJ5dGVbXSBhZGRSZXF1ZXN0KSB7CisJCS8vIERvbid0IHdhbnQgdG8gYWRkIHRvIHRoZSByZXF1ZXN0IGFzIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmVxdWVzdC4KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogICAgb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQmVlblNlbnQoKSB7CisJCXJldHVybiBzZW50OworCX0KKworCS8qKgorCSAqIFNldCB0aGUgcmVxdWVzdC4KKwkgKiAKKwkgKiBAcGFyYW0gcmVxdWVzdAorCSAqIEBwYXJhbSB0eXBlCisJICovCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdChieXRlW10gcmVxdWVzdCwgaW50IHR5cGUpIHsKKwkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKKwkJCXJlcXVlc3QgPSBuZXcgYnl0ZVswXTsKKwkJaWYgKHR5cGUgPT0gVFJBTlNQT1JUKQorCQkJaGVhZGVyID0gcmVxdWVzdDsKKwkJZWxzZSBpZiAodHlwZSA9PSBDT05URU5UKQorCQkJY29udGVudCA9IHJlcXVlc3Q7CisJCQorCQlpbnQgbGVuZ3RoID0gMDsKKwkJaW50IGhlYWRlckxlbmd0aCA9IDA7CisJCWlmIChoZWFkZXIgIT0gbnVsbCkgeworCQkJbGVuZ3RoICs9IGhlYWRlci5sZW5ndGg7CisJCQloZWFkZXJMZW5ndGggPSBsZW5ndGg7CisJCX0KKwkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKKwkJCWxlbmd0aCArPSBjb250ZW50Lmxlbmd0aDsKKwkJYnl0ZVtdIG5ld1JlcXVlc3QgPSBuZXcgYnl0ZVtsZW5ndGhdOworCQlpZiAoaGVhZGVyICE9IG51bGwpCisJCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlciwgMCwgbmV3UmVxdWVzdCwgMCwgaGVhZGVyLmxlbmd0aCk7CisJCWlmIChjb250ZW50ICE9IG51bGwpCisJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnQsIDAsIG5ld1JlcXVlc3QsIGhlYWRlckxlbmd0aCwgY29udGVudC5sZW5ndGgpOworCQlzdXBlci5zZXRSZXF1ZXN0KG5ld1JlcXVlc3QpOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBIVFRQUmVxdWVzdCNnZXRSZXF1ZXN0Q29udGVudCgpCisJICovCisJcHJvdGVjdGVkIGJ5dGVbXSBnZXRSZXF1ZXN0Q29udGVudCgpIHsKKwkJcmV0dXJuIGNvbnRlbnQ7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIEhUVFBSZXF1ZXN0I2dldFJlcXVlc3RIZWFkZXIoKQorCSAqLworCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdEhlYWRlcigpIHsKKwkJcmV0dXJuIGhlYWRlcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCByZXF1ZXN0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcXVlc3QKKwkgKi8KKwlwdWJsaWMgUmVxdWVzdCBnZXRPcmlnaW5hbFJlcXVlc3QoKSB7CisJCXJldHVybiBvcmlnaW5hbFJlcXVlc3Q7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0NvbnRlbnRGaWx0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudEZpbHRlckRlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjZGZhZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0NvbnRlbnRGaWx0ZXJEZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworLyoqCisgKiBBIGNvbnRlbnQgZmlsdGVyIHRoYXQgZmlsdGVycyBjb250ZW50cyBmcm9tIHRoZSBtb25pdG9yIHRyYWZmaWMgb24gYSByZXF1ZXN0LgorICogPHA+CisgKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb25seSBieSBjbGllbnRzCisgKiB0byBleHRlbmQgdGhlIDxjb2RlPmNvbnRlbnRGaWx0ZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCisgKiBUaGUgc3ViY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IsIHdoaWNoIHdpbGwgYmUgdXNlZAorICogYXV0b21hdGljYWxseSB0byBpbnN0YW50aWF0ZSB0aGUgZGVsZWdhdGUgd2hlbiByZXF1aXJlZC4gCisgKiA8L3A+CisgKiA8cD4KKyAqIFtpc3N1ZTogVGhlIG5vdGlvbiBvZiBjb250ZW50IGZpbHRlcnMgaXMgYSBVSS9wcmVzZW50YXRpb24KKyAqIGNvbmNlcm4sIG5vdCBzb21ldGhpbmcgdGhhdCBpcyBtYWtlcyBzZW5zZSB0byBoYXZlIGFzIGNvcmUKKyAqIGZ1bmN0aW9uYWxpdHkuIFRoZSBjb250ZW50RmlsdGVycyBleHRlbnNpb24gcG9pbnQsIElDb250ZW50RmlsdGVyLAorICogYW5kIENvbnRlbnRGaWx0ZXJEZWxlZ2F0ZSBzaG91bGQgYWxsIG1vdmUgdG8gdGhlIG8uZS53c3QuaW50ZXJuZXQubW9uaXRvci51aQorICogcGx1Zy1pbi5dCisgKiBbaXNzdWU6IENTIC0gSSdkIGVjaG8gdGhlIGNvbW1lbnQgYWJvdmUgdGhhdCB0aGlzIHNlZW1zIGxpa2UgYSBVSSBjb25jZXJuLiAgCisgKiBJIG5vdGljZWQgdGhlcmUncyBhbHNvIGEgdmlld2VyIG9uIHRoZSBVSSBzaWRlLCBzbyBpJ20gbm90IHN1cmUgaG93IHRoZXNlIHdvdWxkIGludGVyYWN0LiAKKyAqIEkgYXNzdW1lIHRoYXQgZmlsdGVycyBvcGVyYXRlIG9uIHRoZSBieXRlIHN0cmVhbSBhbmQgYXJlbid0IGNvbmNlcm5lZCB3aXRoIFVJIHByZXNlbnRhdGlvbi4uLgorICogYnV0IHVzdWFsbHkgVUkncyBhbmQgZmlsdGVycyBhcmUgdGlnaHRseSBjb3VwbGVkLgorICogPC9wPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudEZpbHRlckRlbGVnYXRlIHsKKwkvKioKKwkgKiBGaWx0ZXIgdGhlIGdpdmVuIGNvbnRlbnQgZnJvbSB0aGUgZ2l2ZW4gcmVxdWVzdC4gVGhlIGNvbnRlbnQgdGhhdCBoYXMgYmVlbiBmaWx0ZXJlZCBvdXQgd2lsbCAKKwkgKiBub3QgYmUgc2hvd24gdG8gY2xpZW50cyBvZiB0aGUgVENQL0lQIG1vbml0b3IuCisJICogCisJICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdGhhdCB0aGUgZmlsdGVyIHdpbGwgYmUgcGVyZm9ybWVkIG9uCisJICogQHBhcmFtIGlzUmVxdWVzdCBzZXQgdG8gdHJ1ZSBpZiB0aGUgY29udGVudCBmaWx0ZXIgYXBwbGllcyB0byByZXF1ZXN0IG1vbml0b3IgdHJhZmZpYywKKwkgKiAgICBvciBzZXQgdG8gZmFsc2UgaWYgdGhlIGNvbnRlbnQgZmlsdGVyIGFwcGxpZXMgdG8gdGhlIHJlc3BvbnNlIG1vbml0b3IgdHJhZmZpYworCSAqIEBwYXJhbSBjb250ZW50IHRoZSBtZXNzYWdlIGNvbnRlbnQgdG8gYmUgZmlsdGVyZWQgb3V0CisJICogQHJldHVybiB0aGUgZmlsdGVyZWQgY29udGVudAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgcGFyc2luZyBvciBmaWx0ZXJpbmcgdGhlIGNvbnRlbnQKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGZpbHRlcihSZXF1ZXN0IHJlcXVlc3QsIGJvb2xlYW4gaXNSZXF1ZXN0LCBieXRlW10gY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3ZjEzOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKKy8qKgorICogUmVwcmVzZW50cyBhIG1vbml0b3IgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLgorICogVGhlIG1vbml0b3Igd2F0Y2hlcyBhbGwgbmV0d29yayB0cmFmZmljIGJldHdlZW4gYSBsb2NhbCBjbGllbnQgKHRhbGtpbmcKKyAqIG9uIGEgZ2l2ZW4gbG9jYWwgcG9ydCkgYW5kIGEgcmVtb3RlIHNlcnZlciAoaWRlbnRpZmllZCBieSBob3N0IGFuZCBwb3J0KS4KKyAqIFRoZSBnbG9iYWwgbGlzdCBvZiBrbm93biBtb25pdG9ycyBpcyBhdmFpbGFibGUgdmlhIHtAbGluayBNb25pdG9yQ29yZSNnZXRNb25pdG9ycygpfS4KKyAqIElNb25pdG9yIGlzIHRocmVhZC1zYWZlLgorICogPHA+CisgKiBJTW9uaXRvcnMgYXJlIHJlYWQtb25seS4gVG8gbWFrZSBjaGFuZ2VzIHRvIGEgbW9uaXRvciwgeW91IG11c3QgY3JlYXRlIGFuCisgKiBJTW9uaXRvcldvcmtpbmdDb3B5IGJ5IGNhbGxpbmcgY3JlYXRlV29ya2luZ0NvcHkoKS4gQ2hhbmdlcyB0byB0aGUgd29ya2luZyBjb3B5CisgKiBhcmUgYXBwbGllZCB3aGVuIHRoZSB3b3JraW5nIGNvcHkgaXMgc2F2ZWQuIE1vbml0b3JzIGFuZCBtb25pdG9yIHdvcmtpbmcgY29waWVzCisgKiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAqICAgKiBlcXVhbHMoKSByZXR1cm5zIHRydWUgZm9yIGEgbW9uaXRvciBhbmQgaXQncyB3b3JraW5nIGNvcHkKKyAqIDxwPgorICogW2lzc3VlOiBXaHkgdGhlIGJ1aWx0LWluIGFzc3VtcHRpb24gdGhhdCB0aGUgY2xpZW50IGlzIGxvY2FsPyBBIG1vbml0b3IKKyAqIHdvdWxkIG1ha2UganVzdCBhcyBtdWNoIHNlbnNlIHNpdHRpbmcgYmV0d2VlbiBhIGNsaWVudCBvbiBhIHJlbW90ZSBtYWNoaW5lCisgKiBhbmQgYSBzZXJ2ZXIuXQorICogPC9wPgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weQorICovCitwdWJsaWMgaW50ZXJmYWNlIElNb25pdG9yIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIG1vbml0b3IuCisJICogRWFjaCBtb25pdG9yIGhhcyBhIGRpc3RpbmN0LCBmaXhlZCBpZC4gSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsKKwkgKiB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1vbml0b3IgaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZW1vdGUgaG9zdCBuYW1lIG9mIHRoZSBzZXJ2ZXIgYmVpbmcgbW9uaXRvcmVkLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBob3N0IG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZW1vdGUgcG9ydCBudW1iZXIgb2YgdGhlIHNlcnZlciBiZWluZyBtb25pdG9yZWQuCisJICogIAorCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBwb3J0IG51bWJlcgorCSAqLworCXB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGxvY2FsIHBvcnQgbnVtYmVyIG9mIHRoZSBjbGllbnQgYmVpbmcgbW9uaXRvcmVkLiBUaGlzCisJICogaXMgdGhlIHBvcnQgdGhhdCB0aGUgY2xpZW50IGlzIHRhbGtpbmcgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIgb24uCisJICogIAorCSAqIEByZXR1cm4gdGhlIGxvY2FsIHBvcnQgbnVtYmVyCisJICovCisJcHVibGljIGludCBnZXRMb2NhbFBvcnQoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwcm90b2NvbCB0aGF0IHRoaXMgbW9uaXRvciB1c2VzIHRvIHJlYWQgbmV0d29yaworCSAqIHRyYWZmaWMuCisJICogCisJICogQHJldHVybiB0aGUgcHJvdG9jb2wgaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQgKGluIG1zKS4gUmV0dXJucyAwIGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQuCisJICogCisJICogQHJldHVybiB0aGUgdGltZW91dAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VGltZW91dCgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbW9uaXRvciBzdGFydHMgYnkgZGVmYXVsdC4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb25pdG9yIHNob3VsZCBiZSBzdGFydGVkIGJ5IGRlZmF1bHQsIG9yCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQXV0b1N0YXJ0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtb25pdG9yIGlzIGN1cnJlbnRseSBydW5uaW5nLiBNb25pdG9yIHdvcmtpbmcKKwkgKiBjb3BpZXMgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlIChzaW5jZSB0aGV5IGNhbm5vdCBiZSBydW4pLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vbml0b3IgaXMgY3VycmVudGx5IHJ1bm5pbmcsIG9yCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpOworCQorCS8qKgorCSAqIERlbGV0ZXMgdGhpcyBtb25pdG9yLiBUaGUgbW9uaXRvciB3aWxsIG5vIGxvbmdlciBiZSBhdmFpbGFibGUgdG8gY2xpZW50cy4KKwkgKiBJZiB0aGUgbW9uaXRvciBpcyBjdXJyZW50bHkgcnVubmluZywgaXQgd2lsbCBiZSBzdG9wcGVkIGZpcnN0LgorCSAqIFRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QgaWYgdGhlIG1vbml0b3IgaGFzIGFscmVhZHkgYmVlbiBkZWxldGVkIG9yIGlmCisJICogaXQgaXMgY2FsbGVkIG9uIGEgd29ya2luZyBjb3B5LiBDbGllbnRzIGhhdmUgbm8gb2JsaWdhdGlvbiB0byBkZWxldGUKKwkgKiB3b3JraW5nIGNvcGllcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxldGUoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtb25pdG9yIGlzIGEgd29ya2luZyBjb3B5LiBNb25pdG9ycyB3aGljaCByZXR1cm4KKwkgKiA8Y29kZT50cnVlPC9jb2RlPiB0byB0aGlzIG1ldGhvZCBjYW4gYmUgc2FmZWx5IGNhc3QgdG8KKwkgKiB7QGxpbmsgSU1vbml0b3JXb3JraW5nQ29weX0uCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1vbml0b3IgaXMgYSB3b3JraW5nIGNvcHksIGFuZAorCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCk7CisJCisJLyoqCisJICogUmV0dXJucyBhIHdvcmtpbmcgY29weSBmb3IgdGhpcyBtb25pdG9yLiBJZiB0aGUgcmVjZWl2ZXIgaXMgbm90IGEKKwkgKiB3b3JraW5nIGNvcHksIGEgbmV3IHdvcmtpbmcgY29weSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIHRvIGhhdmUKKwkgKiB0aGUgc2FtZSBhdHRyaWJ1dGVzIGFzIHRoaXMgbW9uaXRvci4gSWYgdGhlIHJlY2VpdmVyIGlzIGEgd29ya2luZyBjb3B5LAorCSAqIHRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSByZWNlaXZlci4gQWZ0ZXIgY29uZmlndXJpbmcgYXR0cmlidXRlcyBvbgorCSAqIHRoZSB3b3JraW5nIGNvcHksIGNhbGxpbmcge0BsaW5rIElNb25pdG9yV29ya2luZ0NvcHkjc2F2ZSgpfSBhcHBsaWVzCisJICogdGhlIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIG1vbml0b3IuCisJICogCisJICogQHJldHVybiBhIHdvcmtpbmcgY29weSBvZiB0aGlzIG1vbml0b3IKKwkgKi8KKwlwdWJsaWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpOworCQorCS8qKgorCSAqIFN0YXJ0cyB0aGUgZ2l2ZW4gbW9uaXRvciBsaXN0ZW5pbmcgb24gaXRzIGNsaWVudCBwb3J0LiBUaGlzIG1ldGhvZCBpcworCSAqIHN5bmNocm9ub3VzIGFuZCB0aGUgbW9uaXRvciB3aWxsIGJlIHJ1bm5pbmcgYW5kIHJlYWR5IGZvciB1c2UgYnkgdGhlCisJICogdGltZSB0aGF0IHRoZSBtZXRob2QgcmV0dXJucy4gVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgbW9uaXRvcgorCSAqIGlzIGFscmVhZHkgcnVubmluZy4KKwkgKiA8cD4KKwkgKiBBIENvcmVFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBtb25pdG9yIGlzIG5vdCB2YWxpZCwgdGhlIGxvY2FsIHBvcnQKKwkgKiBpcyBpbiB1c2UsIG9yIGlmIGFub3RoZXIgcHJvYmxlbSBvY2N1cnMgd2hlbiBzdGFydGluZyB0aGUgbW9uaXRvci4gCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGNhbGxlZCBvbiBhIHdvcmtpbmcgY29weSBvciBhZnRlciB0aGUgbW9uaXRvcgorCSAqIGhhcyBiZWVuIGRlbGV0ZWQuCisJICogPC9wPgorCSAqIAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIG1vbml0b3IncyBwcm9wZXJ0aWVzIGFyZSBpbnZhbGlkLAorCSAqICAgaWYgaXQgZmFpbHMgdG8gc3RhcnQgYmVjYXVzZSB0aGUgcG9ydCBpcyBpbiB1c2UsIG9yIGFub3RoZXIgcHJvYmxlbSBvY2N1cnMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOworCisJLyoqCisJICogU3RvcHMgdGhlIGdpdmVuIG1vbml0b3IgYW5kIGZyZWVzIHVwIGFsbCB1bmRlcmx5aW5nIG9wZXJhdGluZyAKKwkgKiBzeXN0ZW0gcmVzb3VyY2VzLiBUaGlzIG1ldGhvZCBpcyBzeW5jaHJvbm91cyBhbmQgdGhlIG1vbml0b3Igd2lsbCBiZQorCSAqIHJ1bm5pbmcgYW5kIHJlYWR5IGZvciB1c2UgYnkgdGhlIHRpbWUgdGhhdCB0aGUgbWV0aG9kIHJldHVybnMuCisJICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgbW9uaXRvciB3YXMgbm90IGFscmVhZHkgcnVubmluZy4KKwkgKiA8cD4KKwkgKiBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGlzIG1ldGhvZCwgdGhlIG1vbml0b3IgbWF5IGJlIHJlc3RhcnRlZCBhdAorCSAqIGFueSB0aW1lLiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBjYWxsZWQgb24gYSB3b3JraW5nIGNvcHkgb3IgYWZ0ZXIKKwkgKiB0aGUgbW9uaXRvciBoYXMgYmVlbiBkZWxldGVkLgorCSAqIDwvcD4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKCk7CisKKwkvKioKKwkgKiBBZGRzIGEgcmVxdWVzdCBsaXN0ZW5lci4KKwkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgCisJICogY2hhbmdlcyB0byB0aGUgZ2xvYmFsIGxpc3Qgb2YgcmVxdWVzdHMuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQorCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KKwkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCisJICogPHA+CisJICogSWYgYSBsaXN0ZW5lciBpcyBhZGRlZCB0byBhIHdvcmtpbmcgY29weSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkCisJICogdG8gdGhlIG9yaWdpbmFsIG1vbml0b3IuIElmIHRoZSBtb25pdG9yIGRvZXMgbm90IGV4aXN0IHlldCAod2hlbiB0aGUgd29ya2luZworCSAqIGNvcHkgd2FzIGp1c3QgY3JlYXRlZCBmcm9tIE1vbml0b3JDb3JlLmNyZWF0ZU1vbml0b3IoKSksIHRoZSBsaXN0ZW5lciB3aWxsCisJICogYmUgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgbW9uaXRvciB3aGVuIChpZikgdGhlIHdvcmtpbmcgY29weSBpcyBzYXZlZC4gCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGxpc3RlbmVyIHRoZSByZXF1ZXN0IGxpc3RlbmVyCisJICogQHNlZSAjcmVtb3ZlUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIgbGlzdGVuZXIpOworCQorCS8qKgorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHJlcXVlc3QgbGlzdGVuZXIuIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzCisJICogbm90IHJlZ2lzdGVyZWQuCisJICogPHA+CisJICogSWYgYSBsaXN0ZW5lciBpcyByZW1vdmVkIGZyb20gYSB3b3JraW5nIGNvcHksIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZQorCSAqIHJlbW92ZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBvcmlnaW5hbCBtb25pdG9yLiBSZW1vdmluZyBhIG1vbml0b3IgZnJvbQorCSAqIGEgbmV3bHkgY3JlYXRlZCBtb25pdG9yIGhhcyBubyBlZmZlY3QgdW5sZXNzIHRoZSBtb25pdG9yIGhhZCBhbHJlYWR5IGJlZW4KKwkgKiBhZGRlZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyByZW1vdmVkIGZyb20gbm90aWZpY2F0aW9uIGFuZCB3aWxsIG5vdCBiZSBhZGRlZAorCSAqIHRvIHRoZSBjcmVhdGVkIG1vbml0b3Igd2hlbiAoaWYpIHRoZSB3b3JraW5nIGNvcHkgaXMgc2F2ZWQuIAorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCisJICogQHNlZSAjYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIgbGlzdGVuZXIpOworCQorCS8qKgorCSAqIFZhbGlkYXRlcyB0aGlzIG1vbml0b3IuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIG1vbml0b3IKKwkgKiBoYXMgaW52YWxpZCBwb3J0cyBvciByZW1vdGUgaG9zdG5hbWUuCisJICogPHA+CisJICogVGhpcyBtZXRob2QgaXMgbm90IG9uIHRoZSB3b3JraW5nIGNvcHkgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gYmUgdmFsaWRhdGVkCisJICogYXQgYW55IHRpbWUuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoaXMKKwkgKiAgIHJ1bnRpbWUgaXMgdmFsaWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzCisJICogICB3cm9uZyB3aXRoIGl0CisJICovCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9uaXRvckxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9uaXRvckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjOTQ3YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKKy8qKgorICogTGlzdGVuZXIgZm9yIGdsb2JhbCBjaGFuZ2VzIGFmZmVjdGluZyBtb25pdG9ycy4KKyAqIDxwPgorICogQ2xpZW50cyBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFuZCByZWdpc3RlcgorICogdGhlaXIgbGlzdGVuZXIgdmlhIHtAbGluayBNb25pdG9yQ29yZSNhZGRNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcil9LgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElNb25pdG9yTGlzdGVuZXIgeworCQorCS8qKgorCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBnaXZlbiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQgKGFkZGVkIHRvIHRoZQorCSAqIGdsb2JhbCBsaXN0IG9mIGtub3duIG1vbml0b3JzKS4KKwkgKiAKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbmV3bHktY3JlYXRlZCBtb25pdG9yCisJICovCisJcHVibGljIHZvaWQgbW9uaXRvckFkZGVkKElNb25pdG9yIG1vbml0b3IpOworCisJLyoqCisJICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIG1vbml0b3IgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIG1vbml0b3IgaXMgbmV2ZXIgYSB3b3JraW5nIGNvcHkuCisJICogCisJICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkCisJICovCisJcHVibGljIHZvaWQgbW9uaXRvckNoYW5nZWQoSU1vbml0b3IgbW9uaXRvcik7CisKKwkvKioKKwkgKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgZ2l2ZW4gbW9uaXRvciBoYXMgYmVlbiBkZWxldGVkIChyZW1vdmVkCisJICogZnJvbSB0aGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gbW9uaXRvcnMpLgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRoYXQgaGFzIGJlZW4gZGVsZXRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1vbml0b3JSZW1vdmVkKElNb25pdG9yIG1vbml0b3IpOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vbml0b3JXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vbml0b3JXb3JraW5nQ29weS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzQwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9uaXRvcldvcmtpbmdDb3B5LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKKy8qKgorICogUmVwcmVzZW50cyBhIHdvcmtpbmcgY29weSBvZiBhIG1vbml0b3IuIEEgd29ya2luZyBjb3B5IGlzIGEgY29weSB0aGF0IHRoZQorICogYXR0cmlidXRlcyBjYW4gYmUgY2hhbmdlZC4KKyAqIElNb25pdG9yV29ya2luZ0NvcHkgaXMgdGhyZWFkLXNhZmUuIEhvd2V2ZXIsIHdvcmtpbmcgY29waWVzIGluc3RhbmNlcworICogc2hvdWxkIGJlIHNob3J0LWxpdmVkIHRvIHJlZHVjZSB0aGUgY2hhbmNlIG9mIG11bHRpcGxlIHdvcmtpbmcgY29waWVzCisgKiBiZWluZyBjcmVhdGVkIGJ5IGRpZmZlcmVudCBjbGllbnRzIGFuZCBvbmUgY2xpZW50IG92ZXJ3cml0dGluZyBjaGFuZ2VzCisgKiBtYWRlIHRvIHRoZSBvdGhlciB3b3JraW5nIGNvcHkuIAorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqIEBzZWUgSU1vbml0b3IKKyAqIAorICogW2lzc3VlIDogQ1MgLSBpdCBzb3VuZHMgbGlrZSB0aGlzIGlzIHNvbWV0aGluZyB1c2VmdWwgZm9yIGNyZWF0aW5nIG1vbml0b3JzLiAKKyAqIFNob3VsZG4ndCB0aGlzIGJlIGNhbGxlZCBhIElNb25pdG9yQ29uZmlndXJhdGlvbj8gIElzIHRoZXJlIGFuIGFkdmFudGFnZSB0byBtYWtpbmcKKyAqIHRoaXMgYWN0dWFsbHkgc2VlbSB0byBiZSBhIElNb25pdG9yPyAgUGVyaGFwcyBzb21lIFVJIGNvbnZlbmllbmNlPyAgCisgKiBJcyBhIElNb25pdG9yV29ya2luZ0NvcHkgYWN0dWFsbHkgJ3VzZWFibGUnIGZvciBtb25pdG9yaW5nIC4uIG9yIGlzIGl0IHJlYWxseSBqdXN0IGEgY29uZmlndXJhdGlvbj8gXQorICovCitwdWJsaWMgaW50ZXJmYWNlIElNb25pdG9yV29ya2luZ0NvcHkgZXh0ZW5kcyBJTW9uaXRvciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgb3JpZ2luYWwgbW9uaXRvciB0aGF0IHRoaXMgd29ya2luZyBjb3B5IGNvcnJlc3BvbmRzIHRvLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgd29ya2luZyBjb3B5IHdhcyBqdXN0IGNyZWF0ZWQgZnJvbQorCSAqIE1vbml0b3JDb3JlLmNyZWF0ZU1vbml0b3IoKS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHdvcmtpbmcgY29weQorCSAqICAgIHdhcyBqdXN0IGNyZWF0ZWQKKwkgKi8KKwlwdWJsaWMgSU1vbml0b3IgZ2V0T3JpZ2luYWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIGxvY2FsIHBvcnQgbnVtYmVyIG9mIHRoZSBjbGllbnQgdG8gYmUgbW9uaXRvcmVkLgorCSAqIAorCSAqIEBwYXJhbSBwb3J0IHRoZSBsb2NhbCAoY2xpZW50KSBwb3J0IG51bWJlcgorCSAqIEBzZWUgSU1vbml0b3IjZ2V0TG9jYWxQb3J0KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2NhbFBvcnQoaW50IHBvcnQpOworCisJLyoqCisJICogU2V0cyB0aGUgcmVtb3RlIGhvc3QgbmFtZSBvZiB0aGUgc2VydmVyIHRvIGJlIG1vbml0b3JlZC4KKwkgKiAKKwkgKiBAcGFyYW0gaG9zdCB0aGUgbmV3IHJlbW90ZSBob3N0IG5hbWUKKwkgKiBAc2VlIElNb25pdG9yI2dldFJlbW90ZUhvc3QoKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlbW90ZUhvc3QoU3RyaW5nIGhvc3QpOworCisJLyoqCisJICogU2V0cyB0aGUgcmVtb3RlIHBvcnQgbnVtYmVyIG9mIHRoZSBzZXJ2ZXIgdG8gYmUgbW9uaXRvcmVkLgorCSAqIAorCSAqIEBwYXJhbSBwb3J0IHRoZSBuZXcgcmVtb3RlIHBvcnQgbnVtYmVyCisJICogQHNlZSBJTW9uaXRvciNnZXRSZW1vdGVQb3J0KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZW1vdGVQb3J0KGludCBwb3J0KTsKKworCS8qKgorCSAqIFNldHMgdGhlIHByb3RvY29sIHRvIGJlIHVzZWQgdG8gcmVhZCBuZXR3b3JrCisJICogdHJhZmZpYyBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIHRoZSBjbGllbnQuCisJICogCisJICogQHBhcmFtIHByb3RvY29sSWQgdGhlIHByb3RvY29sIGlkCisJICogQHNlZSBJTW9uaXRvciNnZXRQcm90b2NvbCgpCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIHByb3RvY29sSWQpOworCisJLyoqCisJICogU2V0cyB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IChpbiBtcykuIFVzZSAwIHRvIGNsZWFyIHRoZSB0aW1lb3V0LgorCSAqIAorCSAqIEBwYXJhbSB0aW1lb3V0IHRoZSBjb25uZWN0aW9uIHRpbWVvdXQKKwkgKiBAc2VlIElNb25pdG9yI2dldFRpbWVvdXQoKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpOworCisJLyoqCisJICogU2V0cyB3aGV0aGVyIHRoaXMgbW9uaXRvciBzdGFydHMgYnkgZGVmYXVsdC4KKwkgKiAKKwkgKiBAcGFyYW0gc3RhcnRCeURlZmF1bHQgcnVuIHRoZSBtb25pdG9yIG9uIHBsdWctaW4gc3RhcnR1cAorCSAqIEBzZWUgSU1vbml0b3IjaXNBdXRvU3RhcnQoKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEF1dG9TdGFydChib29sZWFuIHN0YXJ0QnlEZWZhdWx0KTsKKworCS8qKgorCSAqIFNhdmVzIHRoZSBjaGFuZ2VzIG1hZGUgdG8gdGhpcyB3b3JraW5nIGNvcHkuCisJICogRm9yIGEgYnJhbmQgbmV3IHdvcmtpbmcgY29weSAoY3JlYXRlZCBieQorCSAqIHtAbGluayBNb25pdG9yQ29yZSNjcmVhdGVNb25pdG9yKCl9LCBhbmQgbm90IHlldCBzYXZlZCksIHRoaXMgbWV0aG9kCisJICogY3JlYXRlcyBhIG5ldyBtb25pdG9yIGluc3RhbmNlIHdpdGggYXR0cmlidXRlcyBtYXRjaGluZyB0aGlzIHdvcmtpbmcgY29weS4KKwkgKiBGb3IgYSB3b3JraW5nIGNvcHkgY2xvbmVkIGZyb20gYW4gZXhpc3RpbmcgbW9uaXRvciBpbnN0YW5jZSAoYnkKKwkgKiB7QGxpbmsgSU1vbml0b3IjY3JlYXRlV29ya2luZ0NvcHkoKX0pLCB0aGlzIG1ldGhvZCBzdG9wcyB0aGUgZXhpc3RpbmcKKwkgKiBtb25pdG9yICh1c2luZyB7QGxpbmsgSU1vbml0b3Ijc3RvcCgpfSkgaWYgbmVjZXNzYXJ5LAorCSAqIGFuZCB0aGVuIHNldHMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG1vbml0b3IgaW5zdGFuY2UgdG8gbWF0Y2ggdGhpcworCSAqIHdvcmtpbmcgY29weSAodGhlIG1vbml0b3IgaW5zdGFuY2UgaXMgcmV0dXJuZWQpLgorCSAqIDxwPgorCSAqIFNhdmluZyBhIHdvcmtpbmcgY29weSBmb3IgYSBtb25pdG9yIHRoYXQgd2FzIGFscmVhZHkgZGVsZXRlZCB3aWxsIGNhdXNlCisJICogdGhlIG1vbml0b3IgdG8gZ2V0IHJlY3JlYXRlZCAod2l0aCBhbnkgY2hhbmdlcyBpbiB0aGUgd29ya2luZyBjb3B5KS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhpcyBtZXRob2QgdGhyb3dzIGEgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2F2aW5nIHRoZQorCSAqIG1vbml0b3IuIE5vIHZhbGlkYXRpb24gY2hlY2tzIG9jY3VyIHdoZW4gc2F2aW5nIHRoZSBtb25pdG9yLiBUaGlzIGNhbiBiZQorCSAqIGRvbmUgYnkgY2FsbGluZyBJTW9uaXRvci52YWxpZGF0ZSgpIHByaW9yIHRvIHNhdmluZy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBhZmZlY3RlZCBtb25pdG9yCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRocm93biBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHNhdmluZyB0aGUgbW9uaXRvciAKKwkgKi8KKwlwdWJsaWMgSU1vbml0b3Igc2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lSZXF1ZXN0TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lSZXF1ZXN0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDBjNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVJlcXVlc3RMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7CisvKioKKyAqIExpc3RlbmVyIGZvciBuZXcgb3IgbW9kaWZpZWQgcmVxdWVzdHMgY3JlYXRlZCBmcm9tIGEgc2luZ2xlIG1vbml0b3IuCisgKiBFYWNoIHJlcXVlc3QgcmVwcmVzZW50cyBtZXNzYWdlIHRyYWZmaWMgYmV0d2VlbiBhIG1vbml0b3JlZCBjbGllbnQKKyAqIGFuZCBzZXJ2ZXIuCisgKiA8cD4KKyAqIFJlcXVlc3RzIGFyZSBub3QgcGVyc2lzdGVkIC0gdGhleSBvbmx5IGV4aXN0IGluIHRoaXMgQVBJIHVudGlsIHRoZQorICogY29ubmVjdGlvbiBpcyBkb25lLiBBbiBpbml0aWFsIHJlcXVlc3RBZGRlZCgpIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlCisgKglyZXF1ZXN0IGlzIGNyZWF0ZWQgKGJ5IHRoZSBjbGllbnQgY3JlYXRpbmcgYSBjb25uZWN0aW9uKSwgYW5kIHRoZW4KKyAqIHJlcXVlc3RDaGFuZ2VkKCkgZXZlbnRzIG9jY3VyIGFzIGRhdGEgaXMgcGFzc2VkIHRocm91Z2ggdGhlIHJlcXVlc3QKKyAqIG9yIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIHJlcXVlc3QncyBwcm9wZXJ0aWVzLgorICogPC9wPgorICogCisgKiBAc2VlIElNb25pdG9yI2FkZFJlcXVlc3RMaXN0ZW5lcihJUmVxdWVzdExpc3RlbmVyKQorICovCitwdWJsaWMgaW50ZXJmYWNlIElSZXF1ZXN0TGlzdGVuZXIgeworCS8qKgorCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBnaXZlbiByZXF1ZXN0IHdhcyBjcmVhdGVkLgorCSAqIDxwPgorCSAqIFJlcXVlc3RzIG1heSBiZSBjcmVhdGVkIHdpdGggbGl0dGxlIHRvIG5vIGRhdGEgaW4gdGhlbS4KKwkgKiBBcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgdGhlCisJICogPGNvZGU+cmVxdWVzdENoYW5nZWQ8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIGZyb20gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIGluaXRpYXRlZAorCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRoYXQgaGFzIGJlZW4gYWRkZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXF1ZXN0QWRkZWQoSU1vbml0b3IgbW9uaXRvciwgUmVxdWVzdCByZXF1ZXN0KTsKKworCS8qKgorCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBnaXZlbiByZXF1ZXN0IGhhcyBiZWVuIGNoYW5nZWQuCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUKKwkgKiByZXF1ZXN0LgorCSAqIDxwPgorCSAqIEluZGl2aWR1YWwgdmFsdWVzIHdpdGhpbiB0aGUgcmVxdWVzdCBhcmUgcmFyZWx5IG1vZGlmaWVkLgorCSAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgd2hlbiB0aGV5IGFyZSBpbml0aWFsbHkgc2V0IG9yCisJICogd2hlbiBtb3JlIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50IG9yIHNlcnZlci4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgZnJvbSB3aGljaCB0aGUgcmVxdWVzdCB3YXMgaW5pdGlhdGVkCisJICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkCisJICovCisJcHVibGljIHZvaWQgcmVxdWVzdENoYW5nZWQoSU1vbml0b3IgbW9uaXRvciwgUmVxdWVzdCByZXF1ZXN0KTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL01vbml0b3JDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yQ29yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTQ4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yQ29yZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3JNYW5hZ2VyOworLyoqCisgKiBNYWluIGNsYXNzIGZvciBjcmVhdGluZyBuZXcgbW9uaXRvcnMgYW5kIGxvY2F0aW5nIGV4aXN0aW5nIG9uZXMuIFRoZSBtZXRob2RzIG9uCisgKiB0aGlzIGNsYXNzIGFyZSB0aHJlYWQgc2FmZS4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLiBJdCBpcyBub3QgaW50ZW5kZWQKKyAqIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTW9uaXRvckNvcmUgeworCXByaXZhdGUgc3RhdGljIE1vbml0b3JNYW5hZ2VyIG1hbmFnZXI7CisKKwkvKioKKwkgKiBDYW5ub3QgY3JlYXRlIE1vbml0b3JDb3JlIC0gdXNlIHN0YXRpYyBtZXRob2RzLgorCSAqLworCXByaXZhdGUgTW9uaXRvckNvcmUoKSB7CisJCS8vIGNhbid0IGNyZWF0ZQorCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBtb25pdG9yIG1hbmFnZXIgaW5zdGFuY2UuCisJICogCisJICogQHJldHVybiB0aGUgbW9uaXRvciBtYW5hZ2VyCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTW9uaXRvck1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKKwkJCW1hbmFnZXIgPSBNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpOworCQlyZXR1cm4gbWFuYWdlcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwga25vd24gbW9uaXRvciBpbnN0YW5jZXMuIFRoZSBsaXN0IHdpbGwgbm90IGNvbnRhaW4gYW55CisJICogd29ya2luZyBjb3BpZXMgYW5kIGlzIHBlcnNpc3RlZCBiZXR3ZWVuIHdvcmtiZW5jaCBzZXNzaW9ucy4KKwkgKiA8cD4KKwkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGw7IGNsaWVudHMgbWF5IHNhZmVseSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIG1vbml0b3IgaW5zdGFuY2VzCisJICovCisJcHVibGljIHN0YXRpYyBJTW9uaXRvcltdIGdldE1vbml0b3JzKCkgeworCQlMaXN0PElNb25pdG9yPiBsaXN0ID0gZ2V0TWFuYWdlcigpLmdldE1vbml0b3JzKCk7CisJCUlNb25pdG9yW10gbSA9IG5ldyBJTW9uaXRvcltsaXN0LnNpemUoKV07CisJCWxpc3QudG9BcnJheShtKTsKKwkJcmV0dXJuIG07CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBtb25pdG9yIHdvcmtpbmcgY29weS4gQWZ0ZXIgY29uZmlndXJpbmcgcGFyYW1ldGVycyBvbgorCSAqIHRoZSB3b3JraW5nIGNvcHksIGNhbGxpbmcge0BsaW5rIElNb25pdG9yV29ya2luZ0NvcHkjc2F2ZSgpfSBicmluZ3MKKwkgKiB0aGUgbW9uaXRvciBpbnRvIGV4aXN0ZW5jZS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB7QGxpbmsgSU1vbml0b3IjZGVsZXRlKCl9CisJICogdG8gZGVsZXRlIHRoZSBtb25pdG9yIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogV2hlbiBtb25pdG9ycyBhcmUgY3JlYXRlZCwgdGhlIGxvY2FsIGFuZCByZW1vdGUgcG9ydCB2YWx1ZXMgZGVmYXVsdCB0bworCSAqIDxjb2RlPjgwPC9jb2RlPiwgYnV0IHRoZXkgZG8gbm90IGhhdmUgYSBwcm90b2NvbCBvciByZW1vdGUgaG9zdCAodmFsdWVzCisJICogYXJlIDxjb2RlPm51bGw8L2NvZGU+KS4KKwkgKiA8L3A+IAorCSAqIAorCSAqIEByZXR1cm4gYSBtb25pdG9yIHdvcmtpbmcgY29weQorCSAqLworCXB1YmxpYyBzdGF0aWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVNb25pdG9yKCkgeworCQlyZXR1cm4gZ2V0TWFuYWdlcigpLmNyZWF0ZU1vbml0b3IoKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgbW9uaXRvciBsaXN0ZW5lci4KKwkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgCisJICogY2hhbmdlcyB0byB0aGUgbW9uaXRvcnMuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQorCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KKwkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCisJICoKKwkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIG1vbml0b3IgbGlzdGVuZXIKKwkgKiBAc2VlICNyZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTW9uaXRvckxpc3RlbmVyKElNb25pdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJaWYgKGxpc3RlbmVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCWdldE1hbmFnZXIoKS5hZGRNb25pdG9yTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIG1vbml0b3IgbGlzdGVuZXIuIEhhcyBubworCSAqIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCisJICogCisJICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgorCSAqIEBzZWUgI2FkZE1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyKQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJZ2V0TWFuYWdlcigpLnJlbW92ZU1vbml0b3JMaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUmVxdWVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZWJkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9SZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwzNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5UcmFjZTsKKy8qKgorICogUmVwcmVzZW50cyBhIFRDUC9JUCByZXF1ZXN0IG1hZGUgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgorICogRWFjaCByZXF1ZXN0IHJlcHJlc2VudHMgYSByZXF1ZXN0LXJlc3BvbnNlIHBhaXIsIHdoZXJlIHRoZSByZXF1ZXN0CisgKiBpcyBmcm9tIGNsaWVudCAtPiBzZXJ2ZXIsIGFuZCB0aGUgcmVzcG9uc2UgaXMgZnJvbSBzZXJ2ZXIgLT4gY2xpZW50LgorICogPHA+CisgKiBSZXF1ZXN0cyBhcmUgY3JlYXRlZCBieSBhIHJ1bm5pbmcgbW9uaXRvci4gVGhleSBkbyBub3QgaGF2ZSBhIHJlZmVyZW5jZQorICogYmFjayB0byB0aGUgbW9uaXRvciBiZWNhdXNlIHRoZSBtb25pdG9yIG1heSBoYXZlIGJlZW4gZGVsZXRlZCBvciBtb2RpZmllZAorICogc2luY2UgdGhlIHJlcXVlc3Qgd2FzIGNyZWF0ZWQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cworICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5wcm90b2NvbEFkYXB0ZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuIAorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIElBZGFwdGFibGUgeworCXByb3RlY3RlZCBNb25pdG9yIG1vbml0b3I7CisJcHJvdGVjdGVkIERhdGUgZGF0ZTsKKwlwcm90ZWN0ZWQgbG9uZyByZXNwb25zZVRpbWUgPSAtMTsKKwlwcm90ZWN0ZWQgaW50IGxvY2FsUG9ydDsKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlbW90ZUhvc3Q7CisJcHJvdGVjdGVkIGludCByZW1vdGVQb3J0OworCXByb3RlY3RlZCBieXRlW10gcmVxdWVzdDsKKwlwcm90ZWN0ZWQgYnl0ZVtdIHJlc3BvbnNlOworCQorCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sSWQ7CisKKwlwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCQorCS8qKgorCSAqIFJlcXVlc3QyIGNvbnRlbnQgdHlwZSAodmFsdWUgMSkgZm9yIHRoZSB0cmFuc3BvcnQgKGhlYWRlcikgb2YgYSByZXF1ZXN0CisJICogb3IgcmVzcG9uc2UuCisJICogCisJICogQHNlZSAjZ2V0UmVxdWVzdChpbnQpCisJICogQHNlZSAjZ2V0UmVzcG9uc2UoaW50KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUE9SVCA9IDE7CisKKwkvKioKKwkgKiBSZXF1ZXN0MiBjb250ZW50IHR5cGUgKHZhbHVlIDIpIGZvciB0aGUgY29udGVudCAoYm9keSkgb2YgYSByZXF1ZXN0CisJICogb3IgcmVzcG9uc2UuCisJICogCisJICogQHNlZSAjZ2V0UmVxdWVzdChpbnQpCisJICogQHNlZSAjZ2V0UmVzcG9uc2UoaW50KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlQgPSAyOworCisJLyoqCisJICogUmVxdWVzdDIgY29udGVudCB0eXBlICh2YWx1ZSAzKSBmb3IgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgcmVxdWVzdAorCSAqIG9yIHJlc3BvbnNlLgorCSAqIAorCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQorCSAqIEBzZWUgI2dldFJlc3BvbnNlKGludCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTEwgPSAzOworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IFJlcXVlc3QuCisJICogCisJICogQHBhcmFtIG1vbml0b3IgYSBtb25pdG9yCisJICogQHBhcmFtIHByb3RvY29sSWQgdGhlIHByb3RvY29sIGlkCisJICogQHBhcmFtIGxvY2FsUG9ydCBhIGxvY2FsIHBvcnQgbnVtYmVyCisJICogQHBhcmFtIHJlbW90ZUhvc3QgYSByZW1vdGUgaG9zdG5hbWUKKwkgKiBAcGFyYW0gcmVtb3RlUG9ydCBhIHJlbW90ZSBwb3J0IG51bWJlcgorCSAqLworCXB1YmxpYyBSZXF1ZXN0KE1vbml0b3IgbW9uaXRvciwgU3RyaW5nIHByb3RvY29sSWQsIGludCBsb2NhbFBvcnQsIFN0cmluZyByZW1vdGVIb3N0LCBpbnQgcmVtb3RlUG9ydCkgeworCQlzdXBlcigpOworCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOworCQl0aGlzLnByb3RvY29sSWQgPSBwcm90b2NvbElkOworCQl0aGlzLmxvY2FsUG9ydCA9IGxvY2FsUG9ydDsKKwkJdGhpcy5yZW1vdGVIb3N0ID0gcmVtb3RlSG9zdDsKKwkJdGhpcy5yZW1vdGVQb3J0ID0gcmVtb3RlUG9ydDsKKwkJZGF0ZSA9IG5ldyBEYXRlKCk7CisJCXByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCQlpZiAobW9uaXRvciAhPSBudWxsKQorCQkJbW9uaXRvci5hZGRSZXF1ZXN0KHRoaXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHByb3RvY29sIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIHJlcXVlc3QuCisJICogCisJICogQHJldHVybiB0aGUgcHJvdG9jb2wgaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworCQlyZXR1cm4gcHJvdG9jb2xJZDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0aW1lIHRoaXMgcmVxdWVzdCB3YXMgbWFkZS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcAorCSAqLworCXB1YmxpYyBEYXRlIGdldERhdGUoKSB7CisJCXJldHVybiBkYXRlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxvY2FsIChjbGllbnQpIHBvcnQuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBsb2NhbCBwb3J0IG51bWJlcgorCSAqLworCXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgeworCQlyZXR1cm4gbG9jYWxQb3J0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlbW90ZSAoc2VydmVyKSBob3N0LgorCSAqCisJICogQHJldHVybiB0aGUgcmVtb3RlIGhvc3QKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKSB7CisJCXJldHVybiByZW1vdGVIb3N0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlbW90ZSAoc2VydmVyKSBwb3J0LgorCSAqCisJICogQHJldHVybiB0aGUgcmVtb3RlIHBvcnQgbnVtYmVyCisJICovCisJcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgeworCQlyZXR1cm4gcmVtb3RlUG9ydDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjb250ZW50IG9mIHRoZSByZXF1ZXN0IHBvcnRpb24gb2YgdGhpcyByZXF1ZXN0LgorCSAqIDxwPgorCSAqIFtpc3N1ZTogSSBkb24ndCBrbm93IGhvdyB0byBleHBsYWluIHRoaXMuIEZvciBiYXNpYyBUQ1AvSVAgcmVxdWVzdHMsCisJICogZGlzdGluY3Rpb24gYmV0d2VlbiB0cmFuc3BvcnQgYW5kIGNvbnRlbnQgaXMgaWdub3JlZC4KKwkgKiBGb3IgSFRUUCByZXF1ZXN0cywgdGhpcyBUUkFOU1BPUlQgcmV0dXJucyBqdXN0IHRoZSBIVFRQIGhlYWRlciBhbmQgCisJICogQ09OVEVOVCByZXR1cm5zIGp1c3QgdGhlIEhUVFAgYm9keSB3aXRob3V0IHRoZSBoZWFkZXJzLiBXaGF0IHdvdWxkCisJICogaXQgbWVhbiBmb3Igb3RoZXIgcHJvdG9jb2xzPworCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSB0eXBlIHRoZSBjb250ZW50IHR5cGU6IG9uZSBvZiB7QGxpbmsgI1RSQU5TUE9SVH0sCisJICogICAge0BsaW5rICNDT05URU5UfSwgb3Ige0BsaW5rICNBTEx9CisJICogQHJldHVybiB0aGUgY29udGVudCBieXRlcworCSAqLworCXB1YmxpYyBieXRlW10gZ2V0UmVxdWVzdChpbnQgdHlwZSkgeworCQlyZXR1cm4gcmVxdWVzdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjb250ZW50IG9mIHRoZSByZXNwb25zZSBwb3J0aW9uIG9mIHRoaXMgcmVxdWVzdC4KKwkgKiA8cD4KKwkgKiBbaXNzdWU6IEkgZG9uJ3Qga25vdyBob3cgdG8gZXhwbGFpbiB0aGlzLiBGb3IgYmFzaWMgVENQL0lQIHJlcXVlc3RzLAorCSAqIGRpc3RpbmN0aW9uIGJldHdlZW4gdHJhbnNwb3J0IGFuZCBjb250ZW50IGlzIGlnbm9yZWQuCisJICogRm9yIEhUVFAgcmVxdWVzdHMsIHRoaXMgVFJBTlNQT1JUIHJldHVybnMganVzdCB0aGUgSFRUUCBoZWFkZXIgYW5kIAorCSAqIENPTlRFTlQgcmV0dXJucyBqdXN0IHRoZSBIVFRQIGJvZHkgd2l0aG91dCB0aGUgaGVhZGVycy4gV2hhdCB3b3VsZAorCSAqIGl0IG1lYW4gZm9yIG90aGVyIHByb3RvY29scz9dCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIHR5cGUgdGhlIGNvbnRlbnQgdHlwZTogb25lIG9mIHtAbGluayAjVFJBTlNQT1JUfSwKKwkgKiAgICB7QGxpbmsgI0NPTlRFTlR9LCBvciB7QGxpbmsgI0FMTH0KKwkgKiBAcmV0dXJuIHRoZSBjb250ZW50IGJ5dGVzCisJICovCisJcHVibGljIGJ5dGVbXSBnZXRSZXNwb25zZShpbnQgdHlwZSkgeworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuIElmIHRoZSByZXF1ZXN0CisJICogaGFzIG5vdCBiZWVuIGNvbXBsZXRlZCB5ZXQsIC0xIGlzIHJldHVybmVkLgorCSAqCisJICogQHJldHVybiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgdGltZSwgb3IgLTEgaWYgdGhlcmUgaGFzIGJlZW4gbm8KKwkgKiAgICByZXNwb25zZSB5ZXQKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRSZXNwb25zZVRpbWUoKSB7CisJCXJldHVybiByZXNwb25zZVRpbWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIG5hbWUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCWlmIChuYW1lID09IG51bGwpCisJCQlyZXR1cm4gZ2V0UmVtb3RlSG9zdCgpICsgIjoiICsgZ2V0UmVtb3RlUG9ydCgpOworCQkKKwkJcmV0dXJuIG5hbWU7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHBhcmFtIG4gdGhlIG5hbWUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuKSB7CisJCW5hbWUgPSBuOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGdpdmVuIGtleS12YWx1ZSBwcm9wZXJ0eSBvbiB0aGlzIHJlcXVlc3QuIFRvIHJlbW92ZSBhIHByb3BlcnR5LAorCSAqIHNldCB0aGUgdmFsdWUgdG8gbnVsbC4KKwkgKiA8cD4KKwkgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5IHByb3RvY29sIGFkYXB0ZXJzIHRvIGF0dGFjaCBwcm90b2NvbC0KKwkgKiBzcGVjaWZpYyBmaWVsZHMgdG8gdGhlIHJlcXVlc3QsIGJ1dCBpdCBtYXkgYmUgY2FsbGVkIGJ5IGFueSBjbGllbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBrZXkgdGhlIGtleQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkJdHJ5IHsKKwkJCWlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KGtleSkpCisJCQkJcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKKwkJCWlmICh2YWx1ZSAhPSBudWxsKQorCQkJCXByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGFkZCBwcm9wZXJ0eSIsIGUpOworCQl9CisJCW1vbml0b3IucmVxdWVzdENoYW5nZWQodGhpcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoaXMgcmVxdWVzdC4KKwkgKiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0LCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0ga2V5IHRoZSBwcm9wZXJ0eSBrZXkgCisJICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBwcm9wZXJ0aWVzLmdldChrZXkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGQgdG8gdGhlIHJlcXVlc3QuCisJICoKKwkgKiBAcGFyYW0gYWRkUmVxdWVzdCBieXRlW10KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRUb1JlcXVlc3QoYnl0ZVtdIGFkZFJlcXVlc3QpIHsKKwkJaWYgKGFkZFJlcXVlc3QgPT0gbnVsbCB8fCBhZGRSZXF1ZXN0Lmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuOworCQorCQlpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QubGVuZ3RoID09IDApIHsKKwkJCXNldFJlcXVlc3QoYWRkUmVxdWVzdCk7CisJCQlyZXR1cm47CisJCX0KKwkKKwkJaW50IHNpemUgPSByZXF1ZXN0Lmxlbmd0aCArIGFkZFJlcXVlc3QubGVuZ3RoOworCQlieXRlW10gYiA9IG5ldyBieXRlW3NpemVdOworCQlTeXN0ZW0uYXJyYXljb3B5KHJlcXVlc3QsIDAsIGIsIDAsIHJlcXVlc3QubGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weShhZGRSZXF1ZXN0LCAwLCBiLCByZXF1ZXN0Lmxlbmd0aCwgYWRkUmVxdWVzdC5sZW5ndGgpOworCQlyZXF1ZXN0ID0gYjsKKwkJZmlyZUNoYW5nZWRFdmVudCgpOworCX0KKworCS8qKgorCSAqIEFkZCB0byB0aGUgcmVzcG9uc2UuCisJICoKKwkgKiBAcGFyYW0gYWRkUmVzcG9uc2UgYnl0ZVtdCisJICovCisJcHVibGljIHZvaWQgYWRkVG9SZXNwb25zZShieXRlW10gYWRkUmVzcG9uc2UpIHsKKwkJaWYgKGFkZFJlc3BvbnNlID09IG51bGwgfHwgYWRkUmVzcG9uc2UubGVuZ3RoID09IDApCisJCQlyZXR1cm47CisJCQorCQlpZiAocmVzcG9uc2UgPT0gbnVsbCB8fCByZXNwb25zZS5sZW5ndGggPT0gMCkgeworCQkJc2V0UmVzcG9uc2UoYWRkUmVzcG9uc2UpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpbnQgc2l6ZSA9IHJlc3BvbnNlLmxlbmd0aCArIGFkZFJlc3BvbnNlLmxlbmd0aDsKKwkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtzaXplXTsKKwkJU3lzdGVtLmFycmF5Y29weShyZXNwb25zZSwgMCwgYiwgMCwgcmVzcG9uc2UubGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weShhZGRSZXNwb25zZSwgMCwgYiwgcmVzcG9uc2UubGVuZ3RoLCBhZGRSZXNwb25zZS5sZW5ndGgpOworCQlyZXNwb25zZSA9IGI7CisJCWZpcmVDaGFuZ2VkRXZlbnQoKTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIHJlcXVlc3QuCisJICoKKwkgKiBAcGFyYW0gcmVxdWVzdCBieXRlW10KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSZXF1ZXN0KGJ5dGVbXSByZXF1ZXN0KSB7CisJCWlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVxdWVzdC5sZW5ndGggPT0gMCkKKwkJCXJldHVybjsKKwkJCisJCXRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisJCW1vbml0b3IucmVxdWVzdENoYW5nZWQodGhpcyk7CisJfQorCisJLyoqCisJICogU2V0IHRoZSByZXNwb25zZS4KKwkgKgorCSAqIEBwYXJhbSByZXNwb25zZSBieXRlW10KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSZXNwb25zZShieXRlW10gcmVzcG9uc2UpIHsKKwkJaWYgKHJlc3BvbnNlID09IG51bGwgfHwgcmVzcG9uc2UubGVuZ3RoID09IDApCisJCQlyZXR1cm47CisJCisJCXRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKwkJcmVzcG9uc2VUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBkYXRlLmdldFRpbWUoKTsKKwkJbW9uaXRvci5yZXF1ZXN0Q2hhbmdlZCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtb25pdG9yIHRoYXQgY3JlYXRlZCB0aGlzIHJlcXVlc3QuCisJICogQ2hhbmdlIGV2ZW50cyB3aWxsIGJlIGZpcmVkIGZyb20gdGhpcyBtb25pdG9yLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGUgbW9uaXRvciBtYXkgaGF2ZSBiZWVuIGVkaXR0ZWQgc2luY2UgdGhpcworCSAqIHJlcXVlc3Qgd2FzIGNyZWF0ZWQsIHNvIHlvdSBjYW5ub3QgcmVseSBvbiB0aGUgbW9uaXRvcidzCisJICogaG9zdG5hbWUgb3IgcG9ydCB2YWx1ZXMuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1vbml0b3IgdGhhdCBjcmVhdGVkIHRoaXMgcmVxdWVzdAorCSAqLworCXB1YmxpYyBJTW9uaXRvciBnZXRNb25pdG9yKCkgeworCQlyZXR1cm4gbW9uaXRvcjsKKwl9CisKKwkvKioKKwkgKiBGaXJlIGEgY2hhbmdlIGV2ZW50IHRvIG5vdGlmeSBtb25pdG9yIGxpc3RlbmVycyB0aGF0IHRoZSByZXF1ZXN0IGhhcyBjaGFuZ2VkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGZpcmVDaGFuZ2VkRXZlbnQoKSB7CisJCWlmIChtb25pdG9yICE9IG51bGwpCisJCQltb25pdG9yLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDVlZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzxodG1sPgorPGhlYWQ+Cis8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhpcyBwYWNrYWdlIGdpdmVzIGNvcmUgKG5vbi1VSSkgYWNjZXNzIHRvIHRoZSBUQ1AvSVAgbW9uaXRvci4gQ2xpZW50cyBjYW4KK3F1ZXJ5IGZvciBleGlzdGluZyBtb25pdG9ycywgY3JlYXRlIG5ldyBtb25pdG9ycywgc3RhcnQvc3RvcCBtb25pdG9ycywgYW5kCitsaXN0ZW4gZm9yIHJlcXVlc3RzIGJlaW5nIHJlY2VpdmVkIGJ5IGEgcnVubmluZyBtb25pdG9yLjwvcD4KKzx0YWJsZSB3aWR0aD0iNTAwIj4KKzx0cj4KKzx0ZD4KKzxwPlRoZSBNb25pdG9yQ29yZSBjbGFzcyBnaXZlcyBpbml0aWFsIGFjY2VzcyB0byBhbGwgb2YgdGhlIEFQSS4gRnJvbSBoZXJlIHlvdQorY2FuIHF1ZXJ5IHRoZSBleGlzdGluZyBtb25pdG9ycywgY3JlYXRlIG5ldyBvbmVzLCBhbmQgYWRkL3JlbW92ZSBhIGxpc3RlbmVyIGZvcgorbW9uaXRvciBjaGFuZ2VzLjwvcD4KKzwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzx0YWJsZSB3aWR0aD0iNTAwIj4KKzx0cj4KKzx0ZD4KKzxwPlRoZSBJTW9uaXRvciBpbnRlcmZhY2UgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIG1vbml0b3IsCithbGxvd2luZyB5b3UgdG8gY2hhbmdlIGl0IHZpYSBhIHdvcmtpbmcgY29weSwgc3RhcnQvc3RvcCBpdCwgb3IgYWRkIGEgbGlzdGVuZXIKK2ZvciByZXF1ZXN0IGFjdGl2aXR5LjwvcD4KKzwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0ZTA0YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8aHRtbD4KKzxoZWFkPgorCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgorCTxtZXRhCisJCW5hbWU9InJvb3QiCisJCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KKwk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCisKKzxhYnN0cmFjdD5UaGlzIHBhY2thZ2UgZ2l2ZXMgY29yZSAobm9uLVVJKSBhY2Nlc3MgdG8gdGhlIFRDUC9JUCBtb25pdG9yLiBDbGllbnRzIGNhbgorcXVlcnkgZm9yIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG1vbml0b3JzLCBzdGFydC9zdG9wIG1vbml0b3JzLCBhbmQKK2xpc3RlbiBmb3IgcmVxdWVzdHMgYmVpbmcgcmVjZWl2ZWQgYnkgYSBydW5uaW5nIG1vbml0b3IuPC9hYnN0cmFjdD4KKworPHA+VGhlIE1vbml0b3JDb3JlIGNsYXNzIGdpdmVzIGluaXRpYWwgYWNjZXNzIHRvIGFsbCBvZiB0aGUgQVBJLiBGcm9tIGhlcmUgeW91CitjYW4gcXVlcnkgdGhlIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG9uZXMsIGFuZCBhZGQvcmVtb3ZlIGEgbGlzdGVuZXIgZm9yCittb25pdG9yIGNoYW5nZXMuPC9wPgorCis8cD5UaGUgSU1vbml0b3IgaW50ZXJmYWNlIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBtb25pdG9yLAorYWxsb3dpbmcgeW91IHRvIGNoYW5nZSBpdCB2aWEgYSB3b3JraW5nIGNvcHksIHN0YXJ0L3N0b3AgaXQsIG9yIGFkZCBhIGxpc3RlbmVyCitmb3IgcmVxdWVzdCBhY3Rpdml0eS48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGU1MjQyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwbHVnaW5OYW1lPU1vbml0b3IKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworCitleHRlbnNpb25Qb2ludFByb3RvY29sQWRhcHRlcnM9UHJvdG9jb2wgQWRhcHRlcnMKK2V4dGVuc2lvblBvaW50Q29udGVudEZpbHRlcnM9Q29udGVudCBGaWx0ZXJzCitleHRlbnNpb25Qb2ludFN0YXJ0dXA9U3RhcnR1cAorCitIVFRQPUhUVFAKK1RDUElQPVRDUC9JUApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4MjVmYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+CisKKzxwbHVnaW4+CisKKzxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWV4dGVuc2lvblBvaW50UHJvdG9jb2xBZGFwdGVycyIgaWQ9ImludGVybmFsUHJvdG9jb2xBZGFwdGVycyIgc2NoZW1hPSJzY2hlbWEvcHJvdG9jb2xBZGFwdGVycy5leHNkIi8+Cis8ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVleHRlbnNpb25Qb2ludENvbnRlbnRGaWx0ZXJzIiBpZD0iaW50ZXJuYWxDb250ZW50RmlsdGVycyIgc2NoZW1hPSJzY2hlbWEvaW50ZXJuYWxDb250ZW50RmlsdGVycy5leHNkIi8+Cis8ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVleHRlbnNpb25Qb2ludFN0YXJ0dXAiIGlkPSJpbnRlcm5hbFN0YXJ0dXAiIHNjaGVtYT0ic2NoZW1hL3N0YXJ0dXAuZXhzZCIvPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsUHJvdG9jb2xBZGFwdGVycyI+CisgIDxwcm90b2NvbEFkYXB0ZXIKKyAgICBpZD0iVENQL0lQIgorICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlRDUElQUHJvdG9jb2xBZGFwdGVyIgorICAgIG5hbWU9IiVUQ1BJUCIvPgorICA8cHJvdG9jb2xBZGFwdGVyCisgICAgaWQ9IkhUVFAiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5IVFRQUHJvdG9jb2xBZGFwdGVyIgorICAgIG5hbWU9IiVIVFRQIi8+Cis8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL3NjaGVtYS9pbnRlcm5hbENvbnRlbnRGaWx0ZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL2ludGVybmFsQ29udGVudEZpbHRlcnMuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJkZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL3NjaGVtYS9pbnRlcm5hbENvbnRlbnRGaWx0ZXJzLmV4c2QKQEAgLTAsMCArMSwxNDYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiIGlkPSJjb250ZW50RmlsdGVycyIgbmFtZT0iQ29udGVudCBGaWx0ZXJzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gZmlsdGVyIGNvbnRlbnQgcmVjZWl2ZWQgaW4gYSBtb25pdG9yLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaWx0ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXIiPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KKyAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudEZpbHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4KK0NvbnRlbnQgZmlsdGVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudEZpbHRlckRlbGVnYXRlIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGZpbHRlcgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdXNlZCB0byBvcmRlciBmaWx0ZXJzIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuIExvd2VyIG9yZGVycyBhcmUgcHJvY2Vzc2VkIGZpcnN0CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIDEuMAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250ZW50IGZpbHRlciBleHRlbnNpb24gcG9pbnQ6CisKKyZsdDtwcmUmZ3Q7CisgICAmbHQ7ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmNvbnRlbnRGaWx0ZXImcXVvdDsmZ3Q7CisgICAgICAmbHQ7ZmlsdGVyCisgICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlSWRlbnRpZmllciZxdW90OworICAgICAgICAgICAgbmFtZT0mcXVvdDslZXhhbXBsZU5hbWUmcXVvdDsKKyAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVDb250ZW50RmlsdGVyJnF1b3Q7LyZndDsKKyAgICZsdDsvZXh0ZW5zaW9uJmd0OworJmx0Oy9wcmUmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGFic3RyYWN0IGNsYXNzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudEZpbHRlckRlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3Byb3RvY29sQWRhcHRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvcHJvdG9jb2xBZGFwdGVycy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjgzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3Byb3RvY29sQWRhcHRlcnMuZXhzZApAQCAtMCwwICsxLDEzNiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIiBpZD0iaW50ZXJuYWxQcm90b2NvbEFkYXB0ZXJzIiBuYW1lPSJQcm90b2NvbCBBZGFwdGVycyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYW4gYWRhcHRlciBmb3IgYSBuZXcgcHJvdG9jb2wgKGUuZy4gSFRUUCkuIFRoaXMgYWxsb3dzIGRpZmZlcmVudCB0eXBlcyBvZiBwcm90b2NvbHMgdG8gYmUgbW9uaXRvcmVkIGluIGEgc3BlY2lmaWMgd2F5Lg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvdG9jb2xBZGFwdGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJwcm90b2NvbEFkYXB0ZXIiPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCisgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlByb3RvY29sQWRhcHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Ow0KK1Byb3RvY29sIGFkYXB0ZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Qcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgcHJvdG9jb2wgYWRhcHRlcg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcHJvdG9jb2wgYWRhcHRlciBleHRlbnNpb24gcG9pbnQgdG8gZGVmaW5lIGEgcHJvdG9jb2wgYWRhcHRlciBmb3IgVENQL0lQOg0KKw0KKyZsdDtwcmUmZ3Q7DQorICAgJmx0O2V4dGVuc2lvbiANCisgICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLnByb3RvY29sQWRhcHRlcnMmcXVvdDsmZ3Q7DQorICAgICAgJmx0O3Byb3RvY29sQWRhcHRlcg0KKyAgICAgICAgICAgIGlkPSZxdW90O1RDUElQJnF1b3Q7DQorICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuVENQSVBQcm90b2NvbEFkYXB0ZXImcXVvdDsNCisgICAgICAgICAgICBuYW1lPSZxdW90OyVUQ1BJUCZxdW90Oy8mZ3Q7DQorICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQorJmx0Oy9wcmUmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGFic3RyYWN0IGNsYXNzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7Lg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL3NjaGVtYS9zdGFydHVwLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk5MmU0OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkCkBAIC0wLDAgKzEsMTI3IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIiBpZD0iaW50ZXJuYWxTdGFydHVwIiBuYW1lPSJTdGFydHVwIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gbG9hZCBhIHNlY29uZGFyeSBwbHVnaW4uIFRoZSBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbW9uaXRvciBjb3JlIHBsdWdpbiBzdGFydHMgdXAuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0YXJ0dXAiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8ZWxlbWVudCBuYW1lPSJzdGFydHVwIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+CisgICAgICAgICA8L2FwcEluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JU3RhcnR1cCIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc3RhcnR1cCBleHRlbnNpb24gcG9pbnQ6CisKKyZsdDtwcmUmZ3Q7CisgICAmbHQ7ZXh0ZW5zaW9uIAorICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5zdGFydHVwcyZxdW90OyZndDsKKyAgICAgICZsdDtzdGFydHVwCisgICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5teXBsdWdpbiZxdW90OworICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUubXlwbHVnaW4uU3RhcnR1cCZxdW90Oy8mZ3Q7CisgICAmbHQ7L2V4dGVuc2lvbiZndDsKKyZsdDsvcHJlJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCit0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjE2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb25pdG9ydWkvIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmNjViZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDggQEAKK2JpbgorbW9uaXRvcnVpLmphcgorYnVpbGQueG1sCit0ZW1wLmZvbGRlcgorb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWlfMy4wLjAuamFyCitAZG90CitzcmMuemlwCitqYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODQxMmVhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ub3B0aW9ucwpAQCAtMCwwICsxLDQgQEAKKyMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSBwbHVnaW4KKworIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCitvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODExNzNlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmU0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyMDg1MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzcgQEAKKyNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQoraW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZmYTI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI0ZyaSBGZWIgMjMgMjE6MTY6MjggRVNUIDIwMDcKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhNjBlNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpAQCAtMCwwICsxLDE0IEBACisjU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgorY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCitjb21waWxlcnMucC5idWlsZD0wCitjb21waWxlcnMucC5kZXByZWNhdGVkPTEKK2NvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCitjb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCitjb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCitjb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKK2NvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKK2NvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4YmU3NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxOCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMzA0LnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7eC1pbnRlcm5hbDo9dHJ1ZQorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMS4xLjApIgorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTlkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwzNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPEhUTUw+CisKKzxoZWFkPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzwvaGVhZD4KKworPEJPRFkgbGFuZz0iRU4tVVMiPgorCis8SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KKworPFA+SnVuZSwgMjAwODwvUD4KKworPEgzPkxpY2Vuc2U8L0gzPgorCis8UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCisoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKK3VuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKKygiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAorPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KKworPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCitDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAordGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCitDaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKK2xpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAordGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKKzxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkZGNkNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDIyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitiaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sCitiaW4uZXhjbHVkZXMgPSBiaW4vKiosXAorICAgICAgICAgICAgICAgQGRvdC8qKixcCisgICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgorc3JjLmluY2x1ZGVzID0gc2NoZW1hLworc291cmNlLi4gPSBtb25pdG9ydWkvCitvdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L2NsZWFyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODk5NTRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvY2xlYXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L2h0dHBIZWFkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvaHR0cEhlYWRlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyMGMzOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L2h0dHBIZWFkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3Bpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9waW4uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNTBiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9waW4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzNGU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY3ZpZXcxNi9tb25pdG9yVmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2N2aWV3MTYvbW9uaXRvclZpZXcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzRmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2N2aWV3MTYvbW9uaXRvclZpZXcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2NsZWFyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY5OGMwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvY2xlYXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2h0dHBIZWFkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvaHR0cEhlYWRlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3MWE4YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2h0dHBIZWFkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3Bpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9waW4uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjE1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9waW4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlMGM3MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2NsZWFyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODk5NTRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvY2xlYXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2h0dHBIZWFkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvaHR0cEhlYWRlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyMGMzOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2h0dHBIZWFkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Bpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9waW4uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNTBiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9waW4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Jlc2VuZFJlcXVlc3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvcmVzZW5kUmVxdWVzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2MmI2MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Jlc2VuZFJlcXVlc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzNGU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZXRvb2wxNi9lZGl0UmVxdWVzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDRlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZXZpZXcxNi9tb25pdG9yVmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V2aWV3MTYvbW9uaXRvclZpZXcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzRmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V2aWV3MTYvbW9uaXRvclZpZXcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvaG9zdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L2hvc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWFlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L2hvc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTVmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmYzOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvdGNwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvdGNwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTZlMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi90Y3AuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjFkMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7CisvKioKKyAqIENvbnN0YW50IGlkcyBmb3IgY29udGV4dCBoZWxwLgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbnRleHRJZHMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVcgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXZ3MDAwMCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19UUkVFID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG12dzAwMDIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVRVUVTVCA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtdncwMDA0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFU1BPTlNFID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG12dzAwMDYiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRiA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtcHIwMDAwIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NIT1cgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXByMDAwMiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9NT05JVE9SUyA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtcHIwMDA0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0RJQUxPRyA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtcHIwMDA2IjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWJkMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworLyoqCisgKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRNb25pdG9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld01vbml0b3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxQb3J0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW90ZUhvc3Q7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3RlUG9ydDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdGVHcm91cDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25uZWN0aW9uVGltZW91dDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhdXRvU3RhcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VUeXBlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZURlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZTaG93VmlldzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBtb25pdG9yTGlzdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5TdGF0dXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uUmVtb3RlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtblR5cGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uTG9jYWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uQXV0b1N0YXJ0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFydDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0ZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcHBlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBoZWFkZXJMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBpbWFnZVZpZXdJbnZhbGlkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbFZpZXdJbnZhbGlkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0bWxWaWV3SW52YWxpZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3RGF0ZUZvcm1hdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3VGltZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3UmVzcG9uc2VUaW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdUeXBlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXNwb25zZVRpbWVGb3JtYXQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1NpemU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1Jlc3BvbnNlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXF1ZXN0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblNvcnRCeVJlc3BvbnNlVGltZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U2l6ZUZvcm1hdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25DbGVhclRvb2xUaXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU2hvd0hlYWRlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25QaW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHJvcGVydGllczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB5ZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgbm87CisKKwlzdGF0aWMgeworCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDE0MTdkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDc4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIC0tLS0tLS0tLS0tLS0tLSBUQ1AvSVAgTW9uaXRvciB2aWV3IC0tLS0tLS0tLS0tLS0tLQorCisjIExhYmVscwordmlld1JlcXVlc3Q9UmVxdWVzdDogezB9Cit2aWV3UmVzcG9uc2U9UmVzcG9uc2U6IHswfQordmlld1RpbWU9VGltZSBvZiByZXF1ZXN0OiB7MH0KK3ZpZXdUeXBlPVR5cGU6IHswfQordmlld1Jlc3BvbnNlVGltZT1SZXNwb25zZSBUaW1lOiB7MH0KK3ZpZXdTaXplPVNpemU6IHswfQordmlld1Jlc3BvbnNlVGltZUZvcm1hdD17MH0gbXMKK3ZpZXdTaXplRm9ybWF0PXswfSAoezF9KSBieXRlcworCisjIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSB0aW1lIGZvcm1hdCBvZiB0aGUgVENQL0lQIG1vbml0b3IKKyMgdmlldy4gSXQgdXNlcyB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGZvdW5kIGluIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OgorIyAgIGsgLSBob3VyIGluIGRheSwgaCAtIGhvdXIgaW4gYW0vcG0sIG0gLSBtaW51dGUsIHMgLSBzZWNvbmQsIFMgLSBtaWxsaXNlY29uZCwKKyMgICBhIC0gYW0vcG0gbWFya2VyLiB1c2UgZHVwbGljYXRlIGNoYXJzIChlLmcuICdtbScpIHRvIGZpbGwgd2l0aCB6ZXJvcyAoaS5lLiAKKyMgICAnMDEnIGluc3RlYWQgb2YgJzEnKQordmlld0RhdGVGb3JtYXQ9aDptbS5zLlMgYQorCisjIEFjdGlvbnMKK2FjdGlvblNvcnRCeVJlc3BvbnNlVGltZT1Tb3J0IEJ5IFJlc3BvbnNlIFRpbWUKK2FjdGlvbkNsZWFyVG9vbFRpcD1DbGVhcgorYWN0aW9uU2hvd0hlYWRlcj1TaG93IEhlYWRlcgorYWN0aW9uUGluPVBpbiBTZWxlY3Rpb24KK2FjdGlvblByb3BlcnRpZXM9UHJvcGVydGllcworCisKKyMgLS0tLS0tLS0tLS0tLS0tIFJlcXVlc3RSZXNwb25zZSBWaWV3ZXJzIC0tLS0tLS0tLS0tLS0tLQoraGVhZGVyTGFiZWw9SGVhZGVyOiB7MH0KK2ltYWdlVmlld0ludmFsaWQ9PE5vdCBhIHZhbGlkIGltYWdlIGZpbGU+Cit4bWxWaWV3SW52YWxpZD08Tm90IGEgdmFsaWQgWE1MIGZpbGU+CitodG1sVmlld0ludmFsaWQ9PE5vdCBhIHZhbGlkIEhUTUwgZmlsZT4KKworIyAtLS0tLS0tLS0tLS0tLS0gRXJyb3JzIC0tLS0tLS0tLS0tLS0tLQorZXJyb3JEaWFsb2dUaXRsZT1FcnJvcgorCisjIC0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIFVJIC0tLS0tLS0tLS0tLS0tLQorbW9uaXRvckxpc3Q9VENQL0lQICZNb25pdG9yczoKK2NvbHVtbkxvY2FsPUxvY2FsIFBvcnQKK2NvbHVtblJlbW90ZT1Ib3N0IG5hbWUKK2NvbHVtblR5cGU9VHlwZQorY29sdW1uU3RhdHVzPVN0YXR1cworY29sdW1uQXV0b1N0YXJ0PUF1dG8tc3RhcnQKK2FkZD0mQWRkLi4uCitlZGl0PSZFZGl0Li4uCityZW1vdmU9JlJlbW92ZQorc3RhcnQ9JlN0YXJ0CitzdG9wPVMmdG9wCitzdGFydGVkPVN0YXJ0ZWQKK3N0b3BwZWQ9U3RvcHBlZAoreWVzPVllcworbm89Tm8KKworbmV3TW9uaXRvcj1OZXcgTW9uaXRvcgorZWRpdE1vbml0b3I9RWRpdCBNb25pdG9yCisKK2xvY2FsUG9ydD0mTG9jYWwgbW9uaXRvcmluZyBwb3J0OgorcmVtb3RlR3JvdXA9TW9uaXRvcgorcmVtb3RlSG9zdD0mSG9zdCBuYW1lOgorcmVtb3RlUG9ydD0mUG9ydDoKK3BhcnNlVHlwZT0mVHlwZToKK2F1dG9TdGFydD0mU3RhcnQgbW9uaXRvciBhdXRvbWF0aWNhbGx5Citjb25uZWN0aW9uVGltZW91dD1UJmltZW91dCAoaW4gbWlsbGlzZWNvbmRzKToKKworcHJlZmVyZW5jZURlc2NyaXB0aW9uPUNvbmZpZ3VyZSBUQ1AvSVAgbW9uaXRvcnMgb24gbG9jYWwgYW5kIHJlbW90ZSBwb3J0cy4KK3ByZWZTaG93Vmlldz1TJmhvdyB0aGUgVENQL0lQIE1vbml0b3IgdmlldyB3aGVuIHRoZXJlIGlzIGFjdGl2aXR5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4N2IzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Nb25pdG9yQ29yZTsKKy8qKgorICogTW9uaXRvciBjb250ZW50IHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgTW9uaXRvckNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKKwkvKioKKwkgKiBNb25pdG9yQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIE1vbml0b3JDb250ZW50UHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoKKwkgKiBEaXNwb3NlcyBvZiB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuICAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgCisJICogd2hlbiBpdHMgaW5wdXQgaXMgc2V0IHRvIHRoZSBnaXZlbiBlbGVtZW50LiAKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQlyZXR1cm4gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKKwl9CisKKwkvKgorCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dAorCSAqIGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGVsZW1lbnQuCisJICovCisJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckRpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmE4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yRGlhbG9nLmphdmEKQEAgLTAsMCArMSwzMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuSVByb3RvY29sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3JXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk1vbml0b3JDb3JlOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIE1vbml0b3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworCXByb3RlY3RlZCBJTW9uaXRvcldvcmtpbmdDb3B5IG1vbml0b3I7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0OworCisJcHJpdmF0ZSBCdXR0b24gb2tCdXR0b247CisJcHJpdmF0ZSBTcGlubmVyIG1vbml0b3JQb3J0OworCXByaXZhdGUgTGFiZWwgdmFsaWRhdGVMYWJlbDsKKworCWludGVyZmFjZSBTdHJpbmdNb2RpZnlMaXN0ZW5lciB7CisJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgcyk7CisJfQorCisJaW50ZXJmYWNlIEJvb2xlYW5Nb2RpZnlMaXN0ZW5lciB7CisJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChib29sZWFuIGIpOworCX0KKworCWludGVyZmFjZSBUeXBlTW9kaWZ5TGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoSVByb3RvY29sQWRhcHRlciB0eXBlKTsKKwl9CisKKwlpbnRlcmZhY2UgSW50TW9kaWZ5TGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoaW50IGkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBtb25pdG9yIGRpYWxvZy4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50U2hlbGwKKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqLworCXB1YmxpYyBNb25pdG9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJTW9uaXRvcldvcmtpbmdDb3B5IG1vbml0b3IpIHsKKwkJc3VwZXIocGFyZW50U2hlbGwpOworCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOworCQlpc0VkaXQgPSB0cnVlOworCX0KKwkKKwlwdWJsaWMgTW9uaXRvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgeworCQlzdXBlcihwYXJlbnRTaGVsbCk7CisJCW1vbml0b3IgPSBNb25pdG9yQ29yZS5jcmVhdGVNb25pdG9yKCk7CisJCWlzRWRpdCA9IGZhbHNlOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgeworCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7CisJCWlmIChpc0VkaXQpCisJCQlzaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLmVkaXRNb25pdG9yKTsKKwkJZWxzZQorCQkJc2hlbGwuc2V0VGV4dChNZXNzYWdlcy5uZXdNb25pdG9yKTsKKwl9CisKKwlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgdHh0LCBib29sZWFuIHNlbGVjdGVkLCBmaW5hbCBCb29sZWFuTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKKwkJYnV0dG9uLnNldFRleHQodHh0KTsKKwkJYnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3RlZCk7CisJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOworCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKKwkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJCWxpc3RlbmVyLnZhbHVlQ2hhbmdlZChidXR0b24uZ2V0U2VsZWN0aW9uKCkpOworCQkJCX0KKwkJCX0pOworCQlyZXR1cm4gYnV0dG9uOworCX0KKworCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCkgeworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQodHh0KTsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKKwkJcmV0dXJuIGxhYmVsOworCX0KKwkKKwlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgdHh0LCBmaW5hbCBTdHJpbmdNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuQk9SREVSKTsKKwkJaWYgKHR4dCAhPSBudWxsKQorCQkJdGV4dC5zZXRUZXh0KHR4dCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKKwkJZGF0YS53aWR0aEhpbnQgPSAxNTA7CisJCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJaWYgKGxpc3RlbmVyICE9IG51bGwpCisJCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsJCisJCQkJCWxpc3RlbmVyLnZhbHVlQ2hhbmdlZCh0ZXh0LmdldFRleHQoKSk7CisJCQkJfQorCQkJfSk7CisJCXJldHVybiB0ZXh0OworCX0KKworCXByb3RlY3RlZCBTcGlubmVyIGNyZWF0ZVNwaW5uZXIoQ29tcG9zaXRlIGNvbXAsIGludCB2LCBmaW5hbCBJbnRNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlmaW5hbCBTcGlubmVyIHMgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSKTsKKwkJcy5zZXRNaW5pbXVtKDApOworCQlzLnNldE1heGltdW0oSW50ZWdlci5NQVhfVkFMVUUpOworCQlpZiAodiAhPSAtMSkKKwkJCXMuc2V0U2VsZWN0aW9uKHYpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7CisJCWRhdGEud2lkdGhIaW50ID0gMTUwOworCQlzLnNldExheW91dERhdGEoZGF0YSk7CisJCWlmIChsaXN0ZW5lciAhPSBudWxsKQorCQkJcy5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CQorCQkJCQlsaXN0ZW5lci52YWx1ZUNoYW5nZWQocy5nZXRTZWxlY3Rpb24oKSk7CisJCQkJfQorCQkJfSk7CisJCXJldHVybiBzOworCX0KKworCXByb3RlY3RlZCBDb21ibyBjcmVhdGVUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbXAsIGZpbmFsIFN0cmluZ1tdIHR5cGVzLCBTdHJpbmcgc2VsLCBmaW5hbCBTdHJpbmdNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlmaW5hbCBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7CisJCWludCBzaXplID0gdHlwZXMubGVuZ3RoOworCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbc2l6ZV07CisJCWludCBpbmRleCA9IC0xOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJaXRlbXNbaV0gPSB0eXBlc1tpXTsKKwkJCWlmICh0eXBlc1tpXS5lcXVhbHMoc2VsKSkKKwkJCQlpbmRleCA9IGk7CisJCX0KKwkJY29tYm8uc2V0SXRlbXMoaXRlbXMpOworCQlpZiAoaW5kZXggPj0gMCkKKwkJCWNvbWJvLnNlbGVjdChpbmRleCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKKwkJZGF0YS53aWR0aEhpbnQgPSAxNTA7CisJCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7CisJCWlmIChsaXN0ZW5lciAhPSBudWxsKQorCQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCisJCQkJCWxpc3RlbmVyLnZhbHVlQ2hhbmdlZCh0eXBlc1tjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXSk7CisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCXdpZGdldFNlbGVjdGVkKGUpOworCQkJCX0KKwkJCX0pOworCQlyZXR1cm4gY29tYm87CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCSgoR3JpZExheW91dCljb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOworCQkKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuUFJFRl9ESUFMT0cpOworCQkKKwkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5sb2NhbFBvcnQpOworCQltb25pdG9yUG9ydCA9IGNyZWF0ZVNwaW5uZXIoY29tcG9zaXRlLCBtb25pdG9yLmdldExvY2FsUG9ydCgpLCBuZXcgSW50TW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoaW50IGkpIHsKKwkJCQl0cnkgeworCQkJCQltb25pdG9yLnNldExvY2FsUG9ydChpKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisJCQkJdmFsaWRhdGVGaWVsZHMoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7CisJCWdyb3VwLnNldExheW91dChsYXlvdXQpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlncm91cC5zZXRUZXh0KE1lc3NhZ2VzLnJlbW90ZUdyb3VwKTsKKwkJCisJCWNyZWF0ZUxhYmVsKGdyb3VwLCBNZXNzYWdlcy5yZW1vdGVIb3N0KTsKKwkJY3JlYXRlVGV4dChncm91cCwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG5ldyBTdHJpbmdNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgcykgeworCQkJCW1vbml0b3Iuc2V0UmVtb3RlSG9zdChzKTsKKwkJCQl2YWxpZGF0ZUZpZWxkcygpOworCQkJfQorCQl9KTsKKwkJCisJCWNyZWF0ZUxhYmVsKGdyb3VwLCBNZXNzYWdlcy5yZW1vdGVQb3J0KTsKKwkJY3JlYXRlU3Bpbm5lcihncm91cCwgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCksIG5ldyBJbnRNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChpbnQgaSkgeworCQkJCXRyeSB7CisJCQkJCW1vbml0b3Iuc2V0UmVtb3RlUG9ydChpKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisJCQkJdmFsaWRhdGVGaWVsZHMoKTsKKwkJCX0KKwkJfSk7CisJCQorCQljcmVhdGVMYWJlbChncm91cCwgTWVzc2FnZXMucGFyc2VUeXBlKTsKKwkJY3JlYXRlVHlwZUNvbWJvKGdyb3VwLCBuZXcgU3RyaW5nW10geyJUQ1AvSVAiLCJIVFRQIn0sIG1vbml0b3IuZ2V0UHJvdG9jb2woKSwgbmV3IFN0cmluZ01vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBwcm90b2NvbElkKSB7CisJCQkJbW9uaXRvci5zZXRQcm90b2NvbChwcm90b2NvbElkKTsKKwkJCX0KKwkJfSk7CisJCQorCQljcmVhdGVMYWJlbChncm91cCwgTWVzc2FnZXMuY29ubmVjdGlvblRpbWVvdXQpOworCQljcmVhdGVTcGlubmVyKGdyb3VwLCBtb25pdG9yLmdldFRpbWVvdXQoKSwgbmV3IEludE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGludCBpKSB7CisJCQkJbW9uaXRvci5zZXRUaW1lb3V0KGkpOworCQkJCXZhbGlkYXRlRmllbGRzKCk7CisJCQl9CisJCX0pOworCQkKKwkJY3JlYXRlTGFiZWwoZ3JvdXAsICIiKTsKKwkJY3JlYXRlQ2hlY2tCb3goZ3JvdXAsIE1lc3NhZ2VzLmF1dG9TdGFydCwgbW9uaXRvci5pc0F1dG9TdGFydCgpLCBuZXcgQm9vbGVhbk1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGJvb2xlYW4gYikgeworCQkJCW1vbml0b3Iuc2V0QXV0b1N0YXJ0KGIpOworCQkJfQorCQl9KTsKKwkJCisJCXZhbGlkYXRlTGFiZWwgPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsICIiKTsKKwkJdmFsaWRhdGVMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOworCQkKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKKwkJSU1vbml0b3Igc2F2ZWRNb25pdG9yID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXNhdmVkTW9uaXRvciA9IG1vbml0b3Iuc2F2ZSgpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBjZS5nZXRTdGF0dXMoKSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHNhdmVkTW9uaXRvciAhPSBudWxsICYmIHNhdmVkTW9uaXRvci5pc0F1dG9TdGFydCgpKQorCQkJdHJ5IHsKKwkJCQlzYXZlZE1vbml0b3Iuc3RhcnQoKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBjZS5nZXRTdGF0dXMoKSk7CisJCQl9CisJCXN1cGVyLm9rUHJlc3NlZCgpOworCX0KKworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbnRyb2wgYnV0dG9uQ29udHJvbCA9IHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOworCQl2YWxpZGF0ZUZpZWxkcygpOworCQlyZXR1cm4gYnV0dG9uQ29udHJvbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0T0tCdXR0b25FbmFibGVkKGJvb2xlYW4gY3VySXNFbmFibGVkKSB7CisJCWlmIChva0J1dHRvbiA9PSBudWxsKQorCQkJb2tCdXR0b24gPSBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7CisJCQorCQlpZiAob2tCdXR0b24gIT0gbnVsbCkKKwkJCW9rQnV0dG9uLnNldEVuYWJsZWQoY3VySXNFbmFibGVkKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZpZWxkcygpIHsKKwkJaWYgKG1vbml0b3JQb3J0ID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlib29sZWFuIHJlc3VsdCA9IHRydWU7CisJCUlTdGF0dXMgc3RhdHVzID0gbW9uaXRvci52YWxpZGF0ZSgpOworCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKKwkJCWlmIChtb25pdG9yLmdldFJlbW90ZUhvc3QoKSA9PSBudWxsIHx8IG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpLmxlbmd0aCgpIDwgMSkKKwkJCQl2YWxpZGF0ZUxhYmVsLnNldFRleHQoIiIpOworCQkJZWxzZQorCQkJCXZhbGlkYXRlTGFiZWwuc2V0VGV4dChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKwkJCXJlc3VsdCA9IGZhbHNlOworCQl9IGVsc2UKKwkJCXZhbGlkYXRlTGFiZWwuc2V0VGV4dCgiIik7CisJCQorCQlzZXRPS0J1dHRvbkVuYWJsZWQocmVzdWx0KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDI3NDgxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7CisvKioKKyAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBob2xkcyBtb25pdG9yIHByb3BlcnRpZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7CisJcHJvdGVjdGVkIEJ1dHRvbiBkaXNwbGF5QnV0dG9uOworCQorCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKKwlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7CisJCisJcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OworCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlOworCXByb3RlY3RlZCBCdXR0b24gc3RhcnQ7CisJcHJvdGVjdGVkIEJ1dHRvbiBzdG9wOworCQorCXByb3RlY3RlZCBMaXN0PE9iamVjdD4gc2VsZWN0aW9uMjsKKworCS8qKgorCSAqIE1vbml0b3JQcmVmZXJlbmNlUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBNb25pdG9yUHJlZmVyZW5jZVBhZ2UoKSB7CisJCXN1cGVyKCk7CisJCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIHRoZSBwcmVmZXJlbmNlIG9wdGlvbnMuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAorCSAqLworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7CisJCQorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuUFJFRik7CisJCQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKKwkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmZXJlbmNlRGVzY3JpcHRpb24pOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCisJCWRpc3BsYXlCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKKwkJZGlzcGxheUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLnByZWZTaG93Vmlldyk7CisJCWRpc3BsYXlCdXR0b24uc2V0U2VsZWN0aW9uKE1vbml0b3JVSVBsdWdpbi5nZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoKSk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDg7CisJCWRpc3BsYXlCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaXNwbGF5QnV0dG9uLCBDb250ZXh0SWRzLlBSRUZfU0hPVyk7CisJCQorCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKKwkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5tb25pdG9yTGlzdCk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWRhdGEudmVydGljYWxJbmRlbnQgPSA4OworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlkYXRhLndpZHRoSGludCA9IDM1MDsKKwkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZSwgQ29udGV4dElkcy5QUkVGX01PTklUT1JTKTsKKwkJCisJCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKwkJCisJCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7CisJCQorCQlUYWJsZUNvbHVtbiBzdGF0dXNDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKKwkJc3RhdHVzQ29sdW1uLnNldFRleHQoTWVzc2FnZXMuY29sdW1uU3RhdHVzKTsKKwkJQ29sdW1uV2VpZ2h0RGF0YSBjb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNiwgNjAsIHRydWUpOworCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOworCQkKKwkJVGFibGVDb2x1bW4gcmVtb3RlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisJCXJlbW90ZUNvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtblJlbW90ZSk7CisJCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMiwgMTIwLCB0cnVlKTsKKwkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKKwkJCisJCVRhYmxlQ29sdW1uIGh0dHBDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKKwkJaHR0cENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtblR5cGUpOworCQljb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNSwgNTAsIHRydWUpOworCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOworCQkKKwkJVGFibGVDb2x1bW4gbG9jYWxDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKKwkJbG9jYWxDb2x1bW4uc2V0VGV4dChNZXNzYWdlcy5jb2x1bW5Mb2NhbCk7CisJCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg2LCA2MCwgdHJ1ZSk7CisJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7CisJCQorCQlUYWJsZUNvbHVtbiBzdGFydE9uU3RhcnR1cENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQlzdGFydE9uU3RhcnR1cENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtbkF1dG9TdGFydCk7CisJCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg3LCA3MCwgdHJ1ZSk7CisJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7CisJCQorCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOworCQkKKwkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOworCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IE1vbml0b3JDb250ZW50UHJvdmlkZXIoKSk7CisJCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIoKSk7CisJCXRhYmxlVmlld2VyLnNldElucHV0KCJyb290Iik7CisJCQorCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCXNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQl9CisJCX0pOworCQkKKwkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQlidXR0b25Db21wLnNldExheW91dChsYXlvdXQpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7CisJCWJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCUJ1dHRvbiBhZGQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5hZGQpOworCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKKwkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKQorCQkJCQlyZXR1cm47CisJCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOworCQkJCQorCQkJCUlNb25pdG9yW10gbW9uaXRvcnMgPSBNb25pdG9yQ29yZS5nZXRNb25pdG9ycygpOworCQkJCU9iamVjdCBtb25pdG9yID0gbW9uaXRvcnNbbW9uaXRvcnMubGVuZ3RoIC0gMV07CisJCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vbml0b3IpKTsKKwkJCX0KKwkJfSk7CQkKKwkJCisJCWVkaXQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0KTsKKwkJZWRpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBnZXRTZWxlY3Rpb24oKS5nZXQoMCk7CisJCQkJSU1vbml0b3JXb3JraW5nQ29weSB3YyA9IG1vbml0b3IuY3JlYXRlV29ya2luZ0NvcHkoKTsKKwkJCQkKKwkJCQlNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBNb25pdG9yRGlhbG9nKGdldFNoZWxsKCksIHdjKTsKKwkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7CisJCQkJCXRyeSB7CisJCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHdjLnNhdmUoKSk7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJLy8gaWdub3JlCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0pOworCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOworCQkKKwkJcmVtb3ZlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMucmVtb3ZlKTsKKwkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1vbml0b3IuZGVsZXRlKCk7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJLy8gaWdub3JlCisJCQkJCX0KKwkJCQkJdGFibGVWaWV3ZXIucmVtb3ZlKG1vbml0b3IpOworCQkJCQkKKwkJCQkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7CisJCQkJCWlmIChtb25pdG9ycy5sZW5ndGggPiAwKSB7CisJCQkJCQlPYmplY3QgbW9uaXRvcjIgPSBtb25pdG9yc1ttb25pdG9ycy5sZW5ndGggLSAxXTsKKwkJCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb25pdG9yMikpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9KTsKKwkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOworCQkKKwkJc3RhcnQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zdGFydCk7CisJCWRhdGEgPSAoR3JpZERhdGEpIHN0YXJ0LmdldExheW91dERhdGEoKTsKKwkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDk7CisJCXN0YXJ0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1vbml0b3Iuc3RhcnQoKTsKKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgY2UuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKTsKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNlKSB7CisJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRNZXNzYWdlKCkpOworCQkJCQl9CisJCQkJCXRhYmxlVmlld2VyLnJlZnJlc2gobW9uaXRvciwgdHJ1ZSk7CisJCQkJfQorCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7CisJCQl9CisJCX0pOworCQlzdGFydC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCisJCXN0b3AgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zdG9wKTsKKwkJc3RvcC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlbGVjdGlvbigpLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCXRyeSB7CisJCQkJCQltb25pdG9yLnN0b3AoKTsKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCQkvLyBpZ25vcmUKKwkJCQkJfQorCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKG1vbml0b3IsIHRydWUpOworCQkJCX0KKwkJCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCQkJfQorCQl9KTsKKwkJc3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKKwkKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSB1c2luZyB0aGUgcGFzc2VkIHdvcmtiZW5jaC4KKwkgKgorCSAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCisJICogPHA+CisJICogVGhpcyBpcyBhIGZyYW1ld29yayBob29rIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuCisJICogdGhlIERlZmF1bHRzIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgorCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLCBidXQgc2hvdWxkIGNhbGwgPGNvZGU+c3VwZXIucGVyZm9ybURlZmF1bHRzPC9jb2RlPi4KKwkgKiA8L3A+CisJICovCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgeworCQlkaXNwbGF5QnV0dG9uLnNldFNlbGVjdGlvbihNb25pdG9yVUlQbHVnaW4uZ2V0RGVmYXVsdFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZSgpKTsKKwkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7CisJfQorCisJLyoqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCU1vbml0b3JVSVBsdWdpbi5zZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoZGlzcGxheUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7CisJCU1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gc2VsZWN0aW9uMjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwyKSB7CisJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWwuaXRlcmF0b3IoKTsKKwkJc2VsZWN0aW9uMiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBJTW9uaXRvcikKKwkJCQlzZWxlY3Rpb24yLmFkZChvYmopOworCQl9CisJCQorCQlpZiAoIXNlbGVjdGlvbjIuaXNFbXB0eSgpKSB7CisJCQlyZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQorCQkJYm9vbGVhbiBhbGxTdG9wcGVkID0gdHJ1ZTsKKwkJCWJvb2xlYW4gYWxsU3RhcnRlZCA9IHRydWU7CisJCQkKKwkJCWl0ZXJhdG9yID0gc2VsZWN0aW9uMi5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkKKwkJCQkJYWxsU3RvcHBlZCA9IGZhbHNlOworCQkJCWVsc2UKKwkJCQkJYWxsU3RhcnRlZCA9IGZhbHNlOworCQkJfQorCQkJc3RhcnQuc2V0RW5hYmxlZChhbGxTdG9wcGVkKTsKKwkJCXN0b3Auc2V0RW5hYmxlZChhbGxTdGFydGVkKTsKKwkJCWVkaXQuc2V0RW5hYmxlZChzZWxlY3Rpb24yLnNpemUoKSA9PSAxICYmIGFsbFN0b3BwZWQpOworCQl9IGVsc2UgeworCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCXN0YXJ0LnNldEVuYWJsZWQoZmFsc2UpOworCQkJc3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIENvbnRleHRJZHMuUFJFRik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODc1MzI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclRhYmxlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKKy8qKgorICogTW9uaXRvciB0YWJsZSBsYWJlbCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKKwkvKioKKwkgKiBNb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKE9iamVjdCwgaW50KQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7CisJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBlbGVtZW50OworCQkJaWYgKG1vbml0b3IuaXNSdW5uaW5nKCkpCisJCQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX01PTklUT1JfT04pOworCQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX01PTklUT1JfT0ZGKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChPYmplY3QsIGludCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBlbGVtZW50OworCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgeworCQkJaWYgKG1vbml0b3IuaXNSdW5uaW5nKCkpCisJCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXJ0ZWQ7CisJCQlyZXR1cm4gTWVzc2FnZXMuc3RvcHBlZDsKKwkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKQorCQkJcmV0dXJuIG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpICsgIjoiICsgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCk7CisJCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpCisJCQlyZXR1cm4gbW9uaXRvci5nZXRQcm90b2NvbCgpOworCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKQorCQkJcmV0dXJuIG1vbml0b3IuZ2V0TG9jYWxQb3J0KCkgKyAiIjsKKwkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gNCkgeworCQkJaWYgKG1vbml0b3IuaXNBdXRvU3RhcnQoKSkKKwkJCQlyZXR1cm4gTWVzc2FnZXMueWVzOworCQkJcmV0dXJuIE1lc3NhZ2VzLm5vOworCQl9IGVsc2UKKwkJCXJldHVybiAiWCI7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBub3ROdWxsKFN0cmluZyBzKSB7CisJCWlmIChzID09IG51bGwpCisJCQlyZXR1cm4gIiI7CisJCQorCQlyZXR1cm4gczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShPYmplY3QsIFN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkvLyBkbyBub3RoaW5nCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclVJUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzY2YyOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JVSVBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMzQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5Nb25pdG9yVmlldzsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKy8qKgorICogVGhlIFRDUC9JUCBtb25pdG9yIFVJIHBsdWdpbi4KKyAqLworcHVibGljIGNsYXNzIE1vbml0b3JVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4geworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSI7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEJVRkZFUiA9IG5ldyBieXRlWzQwOTZdOworCisJcHJpdmF0ZSBzdGF0aWMgTW9uaXRvclVJUGx1Z2luIHNpbmdsZXRvbjsKKworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+IGltYWdlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlRGVzY3JpcHRvcj4oKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCisJcHJpdmF0ZSBzdGF0aWMgVVJMIElDT05fQkFTRV9VUkw7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9DTENMID0gImNsY2wxNi8iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRUxDTCA9ICJlbGNsMTYvIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0RMQ0wgPSAiZGxjbDE2LyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9PQkogPSAib2JqMTYvIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1NPUlRfUkVTUE9OU0VfVElNRSA9ICJJTUdfRUxDTF9TT1JUX1JFU1BPTlNFX1RJTUUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX0NMRUFSID0gIklNR19FTENMX0NMRUFSIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9IVFRQX0hFQURFUiA9ICJJTUdfRUxDTF9IVFRQX0hFQURFUiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfUElOID0gIklNR19FTENMX1BJTiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfU09SVF9SRVNQT05TRV9USU1FID0gIklNR19DTENMX1NPUlRfUkVTUE9OU0VfVElNRSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfQ0xFQVIgPSAiSU1HX0NMQ0xfQ0xFQVIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX0hUVFBfSEVBREVSID0gIklNR19DTENMX0hUVFBfSEVBREVSIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9QSU4gPSAiSU1HX0NMQ0xfUElOIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TT1JUX1JFU1BPTlNFX1RJTUUgPSAiSU1HX0RMQ0xfU09SVF9SRVNQT05TRV9USU1FIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9DTEVBUiA9ICJJTUdfRExDTF9DTEVBUiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfSFRUUF9IRUFERVIgPSAiSU1HX0RMQ0xfSFRUUF9IRUFERVIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1BJTiA9ICJJTUdfRExDTF9QSU4iOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1JFUVVFU1RfUkVTUE9OU0UgPSAicmVxdWVzdFJlc3BvbnNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVTRU5EX1JFUVVFU1RfUkVTUE9OU0UgPSAicmVzZW5kUmVxdWVzdFJlc3BvbnNlIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19IT1NUID0gImhvc3QiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NT05JVE9SX09OID0gIm1vbml0b3JPbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01PTklUT1JfT0ZGID0gIm1vbml0b3JPZmYiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfVklFV19PTl9BQ1RJVklUWSA9ICJzaG93LXZpZXciOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSU5fVklFVyA9ICJwaW4tdmlldyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfSEVBREVSID0gInNob3ctaGVhZGVyIjsKKworCXByb3RlY3RlZCBMaXN0PFJlcXVlc3Q+IHJlcXVlc3RzID0gbmV3IEFycmF5TGlzdDxSZXF1ZXN0PigpOworCisJcHJvdGVjdGVkIElNb25pdG9yTGlzdGVuZXIgbW9uaXRvckxpc3RlbmVyID0gbmV3IElNb25pdG9yTGlzdGVuZXIoKSB7CisJCXB1YmxpYyB2b2lkIG1vbml0b3JBZGRlZChJTW9uaXRvciBtb25pdG9yKSB7CisJCQltb25pdG9yLmFkZFJlcXVlc3RMaXN0ZW5lcihyZXF1ZXN0TGlzdGVuZXIpOworCQl9CisKKwkJcHVibGljIHZvaWQgbW9uaXRvckNoYW5nZWQoSU1vbml0b3IgbW9uaXRvcikgeworCQkJLy8gaWdub3JlCisJCX0KKworCQlwdWJsaWMgdm9pZCBtb25pdG9yUmVtb3ZlZChJTW9uaXRvciBtb25pdG9yKSB7CisJCQltb25pdG9yLnJlbW92ZVJlcXVlc3RMaXN0ZW5lcihyZXF1ZXN0TGlzdGVuZXIpOworCQl9CisJfTsKKworCXByb3RlY3RlZCBJUmVxdWVzdExpc3RlbmVyIHJlcXVlc3RMaXN0ZW5lciA9IG5ldyBJUmVxdWVzdExpc3RlbmVyKCkgeworCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWRkZWQoSU1vbml0b3IgbW9uaXRvciwgUmVxdWVzdCByZXF1ZXN0KSB7CisJCQlhZGRSZXF1ZXN0KHJlcXVlc3QpOworCQkJCisJCQlpZiAoTW9uaXRvclZpZXcudmlldyAhPSBudWxsKQorCQkJCU1vbml0b3JWaWV3LnZpZXcuZG9SZXF1ZXN0QWRkZWQocmVxdWVzdCk7CisJCQllbHNlIGlmIChNb25pdG9yVUlQbHVnaW4uZ2V0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKCkpCisJCQkJTW9uaXRvclZpZXcub3BlbihyZXF1ZXN0KTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHJlcXVlc3RDaGFuZ2VkKElNb25pdG9yIG1vbml0b3IsIFJlcXVlc3QgcmVxdWVzdCkgeworCQkJaWYgKE1vbml0b3JWaWV3LnZpZXcgIT0gbnVsbCkKKwkJCQlNb25pdG9yVmlldy52aWV3LmRvUmVxdWVzdENoYW5nZWQocmVxdWVzdCk7CisJCX0KKwl9OworCisJLyoqCisJICogTW9uaXRvclVJUGx1Z2luIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIE1vbml0b3JVSVBsdWdpbigpIHsKKwkJc3VwZXIoKTsKKwkJc2luZ2xldG9uID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCBwcmUtbG9hZHMgdGhlIGltYWdlIHJlZ2lzdHJ5LgorCSAqIAorCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeQorCSAqLworCXByb3RlY3RlZCBJbWFnZVJlZ2lzdHJ5IGNyZWF0ZUltYWdlUmVnaXN0cnkoKSB7CisJCUltYWdlUmVnaXN0cnkgcmVnaXN0cnkgPSBzdXBlci5jcmVhdGVJbWFnZVJlZ2lzdHJ5KCk7CisJCQorCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfUkVRVUVTVF9SRVNQT05TRSwgVVJMX09CSiArICJ0Y3AuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19SRVNFTkRfUkVRVUVTVF9SRVNQT05TRSwgVVJMX0VMQ0wgKyAicmVzZW5kUmVxdWVzdC5naWYiKTsKKwkJCisJCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19IT1NULCBVUkxfT0JKICsgImhvc3QuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19NT05JVE9SX09OLCBVUkxfT0JKICsgIm1vbml0b3JPbi5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX01PTklUT1JfT0ZGLCBVUkxfT0JKICsgIm1vbml0b3JPZmYuZ2lmIik7CisJCQorCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfQ0xDTF9DTEVBUiwgVVJMX0NMQ0wgKyAiY2xlYXIuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19DTENMX1NPUlRfUkVTUE9OU0VfVElNRSwgVVJMX0NMQ0wgKyAic29ydFJlc3BvbnNlVGltZS5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0NMQ0xfSFRUUF9IRUFERVIsIFVSTF9DTENMICsgImh0dHBIZWFkZXIuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19DTENMX1BJTiwgVVJMX0NMQ0wgKyAicGluLmdpZiIpOworCQkKKwkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0VMQ0xfQ0xFQVIsIFVSTF9FTENMICsgImNsZWFyLmdpZiIpOworCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRUxDTF9TT1JUX1JFU1BPTlNFX1RJTUUsIFVSTF9FTENMICsgInNvcnRSZXNwb25zZVRpbWUuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19FTENMX0hUVFBfSEVBREVSLCBVUkxfRUxDTCArICJodHRwSGVhZGVyLmdpZiIpOworCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRUxDTF9QSU4sIFVSTF9FTENMICsgInBpbi5naWYiKTsKKwkJCisJCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19ETENMX0NMRUFSLCBVUkxfRExDTCArICJjbGVhci5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0RMQ0xfU09SVF9SRVNQT05TRV9USU1FLCBVUkxfRExDTCArICJzb3J0UmVzcG9uc2VUaW1lLmdpZiIpOworCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRExDTF9IVFRQX0hFQURFUiwgVVJMX0RMQ0wgKyAiaHR0cEhlYWRlci5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0RMQ0xfUElOLCBVUkxfRExDTCArICJwaW4uZ2lmIik7CisJCQorCQlyZXR1cm4gcmVnaXN0cnk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCisJICogCisJICogQHBhcmFtIGtleSB0aGUga2V5CisJICogQHJldHVybiB0aGUgaW1hZ2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgorCSAqIAorCSAqIEBwYXJhbSBrZXkgdGhlIGtleQorCSAqIEByZXR1cm4gYW4gaW1hZ2UgZGVzY3JpcHRvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7CisJCXRyeSB7CisJCQlnZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKTsKKwkJCXJldHVybiBnZXRJbnN0YW5jZSgpLmltYWdlRGVzY3JpcHRvcnMuZ2V0KGtleSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwbHVnaW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1vbml0b3JVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIHNpbmdsZXRvbjsKKwl9CisKKwkvKioKKwkgKiBSZWdpc3RlciBhbiBpbWFnZSB3aXRoIHRoZSByZWdpc3RyeS4KKwkgKiAKKwkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKKwkgKiBAcGFyYW0gcGFydGlhbFVSTAorCSAqLworCXByaXZhdGUgdm9pZCByZWdpc3RlckltYWdlKEltYWdlUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBrZXksIFN0cmluZyBwYXJ0aWFsVVJMKSB7CisJCWlmIChJQ09OX0JBU0VfVVJMID09IG51bGwpIHsKKwkJCVN0cmluZyBwYXRoU3VmZml4ID0gImljb25zLyI7CisJCQlJQ09OX0JBU0VfVVJMID0gc2luZ2xldG9uLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGhTdWZmaXgpOworCQl9CisKKwkJdHJ5IHsKKwkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwoSUNPTl9CQVNFX1VSTCwgcGFydGlhbFVSTCkpOworCQkJcmVnaXN0cnkucHV0KGtleSwgaWQpOworCQkJaW1hZ2VEZXNjcmlwdG9ycy5wdXQoa2V5LCBpZCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZWdpc3RlcmluZyBpbWFnZSIsIGUpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQkKKwkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0RGVmYXVsdChNb25pdG9yVUlQbHVnaW4uU0hPV19WSUVXX09OX0FDVElWSVRZLCB0cnVlKTsKKwkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0RGVmYXVsdChNb25pdG9yVUlQbHVnaW4uUElOX1ZJRVcsIGZhbHNlKTsKKwkJCisJCU1vbml0b3JDb3JlLmFkZE1vbml0b3JMaXN0ZW5lcihtb25pdG9yTGlzdGVuZXIpOworCQkKKwkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7CisJCWlmIChtb25pdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKElNb25pdG9yIG1vbml0b3IgOiBtb25pdG9ycykKKwkJCQltb25pdG9yLmFkZFJlcXVlc3RMaXN0ZW5lcihyZXF1ZXN0TGlzdGVuZXIpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCQkKKwkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7CisJCWlmIChtb25pdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKElNb25pdG9yIG1vbml0b3IgOiBtb25pdG9ycykKKwkJCQltb25pdG9yLnJlbW92ZVJlcXVlc3RMaXN0ZW5lcihyZXF1ZXN0TGlzdGVuZXIpOworCQl9CisJCQorCQlNb25pdG9yQ29yZS5yZW1vdmVNb25pdG9yTGlzdGVuZXIobW9uaXRvckxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oU0hPV19WSUVXX09OX0FDVElWSVRZKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKCkgeworCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFNIT1dfVklFV19PTl9BQ1RJVklUWSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZShib29sZWFuIGIpIHsKKwkJZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShTSE9XX1ZJRVdfT05fQUNUSVZJVFksIGIpOworCQlnZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRQaW5WaWV3UHJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihQSU5fVklFVyk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFBpblZpZXdQcmVmZXJlbmNlKGJvb2xlYW4gYikgeworCQlnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFBJTl9WSUVXLCBiKTsKKwkJZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd0hlYWRlclByZWZlcmVuY2UoKSB7CisJCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oU0hPV19IRUFERVIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93SGVhZGVyUHJlZmVyZW5jZShib29sZWFuIGIpIHsKKwkJZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShTSE9XX0hFQURFUiwgYik7CisJCWdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJfQorCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHVuemlwIHRoZSBnaXZlbiBieXRlcyB1c2luZyBnemlwLiBUaGUgcmV0dXJuZWQgYnl0ZQorCSAqIGFycmF5IGlzIGVpdGhlciB0aGUgdW56aXBwZWQgcmVzdWx0cywgb3IgdGhlIG9yaWdpbmFsIGJ5dGUgYXJyYXkgaWYgdW56aXBwaW5nCisJICogd2FzIG5vdCBzdWNjZXNzZnVsLiBUaGUgYnl0ZSBhcnJheSBtdXN0IG5vdCBiZSBudWxsLgorCSAqIAorCSAqIEBwYXJhbSBiIGEgYnl0ZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIHVuemlwcGVkIGFycmF5LCBvciB0aGUgb3JpZ2luYWwgYXJyYXkgaWYgdW5zdWNjZXNzZnVsCisJICovCisJcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgYnl0ZVtdIHVuemlwKGJ5dGVbXSBiKSB7CisJCWlmIChiID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQorCQl0cnkgeworCQkJR1pJUElucHV0U3RyZWFtIGdpbiA9IG5ldyBHWklQSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpKTsKKwkJCWJ5dGVbXSB0ID0gbmV3IGJ5dGVbMF07CisJCQl3aGlsZSAoZ2luLmF2YWlsYWJsZSgpID4gMCkgeworCQkJCWludCBuID0gZ2luLnJlYWQoQlVGRkVSKTsKKwkJCQlpZiAobiA+IDApIHsKKwkJCQkJYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVt0Lmxlbmd0aCArIG5dOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHQsIDAsIHRlbXAsIDAsIHQubGVuZ3RoKTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShCVUZGRVIsIDAsIHRlbXAsIHQubGVuZ3RoLCBuKTsKKwkJCQkJdCA9IHRlbXA7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHQ7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJDb3VsZCBub3QgdW56aXAgYnl0ZSBhcnJheSIpOworCQkJcmV0dXJuIGI7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGFyc2UgdGhlIGdpdmVuIGJ5dGVzIGludG8gU3RyaW5nIGZvcm0uIFRoZSBieXRlcworCSAqIGFyZSBwYXJzZWQgaW50byBhIGxpbmUgZGVsaW1pdGVkIHN0cmluZy4gVGhlIGJ5dGUgYXJyYXkgbXVzdCBub3QgYmUgbnVsbC4KKwkgKiAKKwkgKiBAcGFyYW0gYiBhIGJ5dGUgYXJyYXkKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgYWZ0ZXIgdGhlIGNvbnZlcnNpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZShieXRlW10gYikgeworCQlpZiAoYiA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpOworCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmluKSk7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJdHJ5IHsKKwkJCVN0cmluZyBzID0gYnIucmVhZExpbmUoKTsKKwkJCQorCQkJd2hpbGUgKHMgIT0gbnVsbCkgeworCQkJCXNiLmFwcGVuZChzKTsKKwkJCQlzID0gYnIucmVhZExpbmUoKTsKKwkJCQlpZiAocyAhPSBudWxsKQorCQkJCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBwYXJzaW5nIGlucHV0IiwgZSk7CisJCX0KKwkJCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7CisJCWlmICghcmVxdWVzdHMuY29udGFpbnMocmVxdWVzdCkpCisJCQlyZXF1ZXN0cy5hZGQocmVxdWVzdCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdHMuCisJICoKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJlcXVlc3RzCisJICovCisJcHVibGljIFJlcXVlc3RbXSBnZXRSZXF1ZXN0cygpIHsKKwkJUmVxdWVzdFtdIHIgPSBuZXcgUmVxdWVzdFtyZXF1ZXN0cy5zaXplKCldOworCQlyZXF1ZXN0cy50b0FycmF5KHIpOworCQlyZXR1cm4gcjsKKwl9CisJCisJcHVibGljIHZvaWQgY2xlYXJSZXF1ZXN0cygpIHsKKwkJcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0PFJlcXVlc3Q+KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFjdGlvbkZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFjdGlvbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTkyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9SZXF1ZXN0QWN0aW9uRmlsdGVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OworLyoqCisgKiBBbiBhY3Rpb24gZmlsdGVyIGZvciByZXF1ZXN0cy4KKyAqLworcHVibGljIGNsYXNzIFJlcXVlc3RBY3Rpb25GaWx0ZXIgaW1wbGVtZW50cyBJQWN0aW9uRmlsdGVyeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfU0VOVCA9ICJyZXF1ZXN0c2VudCI7CisKKwkvKioKKwkgKiBAc2VlIElBY3Rpb25GaWx0ZXIjdGVzdEF0dHJpYnV0ZShPYmplY3QsIFN0cmluZywgU3RyaW5nKQorCSAqLworCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCQlSZXF1ZXN0IHJlcXVlc3QgPSAoUmVxdWVzdCkgdGFyZ2V0OworCQlpZiAobmFtZS5lcXVhbHMoUkVRVUVTVF9TRU5UKSkgeworCQkJaWYgKHZhbHVlLmVxdWFscygidHJ1ZSIpKQorCQkJCXJldHVybiByZXF1ZXN0LmdldFJlc3BvbnNlVGltZSgpICE9IC0xOworCQkJCisJCQlyZXR1cm4gcmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKSA9PSAtMTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1JlcXVlc3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3ZDY4NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1JlcXVlc3RBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7CisvKioKKyAqIEFkYXB0ZXIgZmFjdG9yeSB0byBhZGFwdCBSZXF1ZXN0cyB0byBJQWN0aW9uRmlsdGVyLgorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKKwlwcml2YXRlIFJlcXVlc3RBY3Rpb25GaWx0ZXIgcmVxQWN0aW9uRmlsdGVyID0gbnVsbDsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCisJICovCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCWlmIChhZGFwdGVyVHlwZSA9PSBJQWN0aW9uRmlsdGVyLmNsYXNzKSB7CisJCQlpZiAocmVxQWN0aW9uRmlsdGVyID09IG51bGwpIHsKKwkJCQlyZXFBY3Rpb25GaWx0ZXIgPSBuZXcgUmVxdWVzdEFjdGlvbkZpbHRlcigpOworCQkJfQorCQkJcmV0dXJuIHJlcUFjdGlvbkZpbHRlcjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKKwkgKi8KKwlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKKwkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSUFjdGlvbkZpbHRlci5jbGFzcyB9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2MjJiMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CisvKioKKyAqIFNXVCBVdGlsaXR5IGNsYXNzLgorICovCitwdWJsaWMgY2xhc3MgU1dUVXRpbCB7CisJcHJpdmF0ZSBzdGF0aWMgRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKENvbnRyb2wgdGVzdENvbnRyb2wpIHsKKwkJLy8gQ29tcHV0ZSBhbmQgc3RvcmUgYSBmb250IG1ldHJpYworCQlHQyBnYyA9IG5ldyBHQyh0ZXN0Q29udHJvbCk7CisJCWdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKKwkJZm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOworCQlnYy5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHdpZHRoIGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKKwkJaW50IHdpZHRoSGludCA9IERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOworCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGJ1dHRvbiB3aXRoIHRoZSBzdGFuZGFyZCBzaXplLgorCSAqIAorCSAqIEBwYXJhbSBjb21wIHRoZSBjb21wb25lbnQgdG8gYWRkIHRoZSBidXR0b24gdG8KKwkgKiBAcGFyYW0gbGFiZWwgdGhlIGJ1dHRvbiBsYWJlbAorCSAqIEByZXR1cm4gYSBidXR0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbXAsIFN0cmluZyBsYWJlbCkgeworCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOworCQliLnNldFRleHQobGFiZWwpOworCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKKwkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOworCQlkYXRhLndpZHRoSGludCA9IGdldEJ1dHRvbldpZHRoSGludChiKTsKKwkJYi5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlyZXR1cm4gYjsKKwl9CisJCisJcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0eHQsIGJvb2xlYW4gaXNTZWxlY3RlZCl7CisJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7CisJCWJ1dHRvbi5zZXRUZXh0KHR4dCk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOworCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKKwkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7CisJCWJ1dHRvbi5zZXRTZWxlY3Rpb24oaXNTZWxlY3RlZCk7CisJCXJldHVybiBidXR0b247CisJfQorCQorCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0eHQpIHsKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KHR4dCk7CisJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7CisJCXJldHVybiBsYWJlbDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjdlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JU3RhcnR1cDsKKy8qKgorICogU3RhcnR1cCBob29rLgorICovCitwdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklTdGFydHVwI3N0YXJ0dXAoKQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7CisJCS8vIGRvIG5vdGhpbmcgLSBwbHVnaW4gbG9hZGluZyBpcyBlbm91Z2gKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODdhYzNiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3JQbHVnaW47CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KKyAqLworcHVibGljIGNsYXNzIFRyYWNlIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ09ORklHID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV0FSTklORyA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFVkVSRSA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVTVCA9IDM7CisKKwkvKioKKwkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXByaXZhdGUgVHJhY2UoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCS8qKgorCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgorCSAqCisJICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAorCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgeworCQl0cmFjZShsZXZlbCwgcywgbnVsbCk7CisJfQorCQorCS8qKgorCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCisJICoKKwkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCisJICogQHBhcmFtIHMgYSBtZXNzYWdlCisJICogQHBhcmFtIHQgYSB0aHJvd2FibGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7CisJCWlmIChsZXZlbCA9PSBTRVZFUkUpCisJCQlNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKKwkJCisJCWlmICghTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKKwkJCXJldHVybjsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbihNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIiAiICsgcyk7CisJCWlmICh0ICE9IG51bGwpCisJCQl0LnByaW50U3RhY2tUcmFjZSgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vTW9uaXRvclN0YWNrTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vTW9uaXRvclN0YWNrTGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzYjExMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9Nb25pdG9yU3RhY2tMYXlvdXQuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLmN1c3RvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CisvKioKKyAqIFRoaXMgTGF5b3V0IHN0YWNrcyBhbGwgdGhlIGNvbnRyb2xzIG9uZSBvbiB0b3Agb2YgdGhlIG90aGVyIGFuZCByZXNpemVzIGFsbCBjb250cm9scworICogdG8gaGF2ZSB0aGUgc2FtZSBzaXplIGFuZCBsb2NhdGlvbi4KKyAqIFRoZSBjb250cm9sIHNwZWNpZmllZCBpbiB0b3BDb250cm9sIGlzIHZpc2libGUgYW5kIGFsbCBvdGhlciBjb250cm9scyBhcmUgbm90IHZpc2libGUuCisgKiBVc2VycyBtdXN0IHNldCB0aGUgdG9wQ29udHJvbCB2YWx1ZSB0byBmbGlwIGJldHdlZW4gdGhlIHZpc2libGUgaXRlbXMgYW5kIHRoZW4gY2FsbCAKKyAqIGxheW91dCgpIG9uIHRoZSBjb21wb3NpdGUgd2hpY2ggaGFzIHRoZSBNb25pdG9yU3RhY2tMYXlvdXQuCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yU3RhY2tMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgeworIAkvKioKKyAJICogdG9wQ29udHJvbCB0aGUgQ29udHJvbCB0aGF0IGlzIGRpc3BsYXllZCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKyAJICogQWxsIG90aGVyIGNvbnRyb2xzIHRoYXQgYXJlIGNoaWxkcmVuIG9mIHRoZSBwYXJlbnQgY29tcG9zaXRlIHdpbGwgbm90IGJlIHZpc2libGUuCisgCSAqLworIAlwdWJsaWMgQ29udHJvbCB0b3BDb250cm9sOworCisJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKKwkJQ29udHJvbCBjaGlsZHJlbltdID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7CisJCWludCBtYXhXaWR0aCA9IDA7CisJCWludCBtYXhIZWlnaHQgPSAwOworCQlmb3IgKENvbnRyb2wgY2hpbGQgOiBjaGlsZHJlbikgeworCQkJaWYgKGNoaWxkID09IHRvcENvbnRyb2wpIHsKKwkJCQlQb2ludCBzaXplID0gY2hpbGQuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKKwkJCQltYXhXaWR0aCA9IE1hdGgubWF4KHNpemUueCwgbWF4V2lkdGgpOworCQkJCW1heEhlaWdodCA9IE1hdGgubWF4KHNpemUueSwgbWF4SGVpZ2h0KTsKKwkJCX0KKwkJfQorCQlpbnQgd2lkdGggPSBtYXhXaWR0aDsKKwkJaW50IGhlaWdodCA9IG1heEhlaWdodDsKKwkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKQorCQkJd2lkdGggPSB3SGludDsKKwkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQorCQkJaGVpZ2h0ID0gaEhpbnQ7CisJCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hDYWNoZShDb250cm9sIGNvbnRyb2wpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgeworCQlDb250cm9sIGNoaWxkcmVuW10gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKKwkJUmVjdGFuZ2xlIHJlY3QgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOworCQlmb3IgKENvbnRyb2wgY2hpbGQgOiBjaGlsZHJlbikgeworCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTGFiZWwpIHsKKwkJCQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUocmVjdC54KzIsIHJlY3QueSwgcmVjdC53aWR0aC0yLCByZWN0LmhlaWdodCk7CisJCQkJY2hpbGQuc2V0Qm91bmRzKHIpOworCQkJfSBlbHNlCisJCQkJY2hpbGQuc2V0Qm91bmRzKHJlY3QpOworCQkJY2hpbGQuc2V0VmlzaWJsZShjaGlsZCA9PSB0b3BDb250cm9sKTsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiTW9uaXRvclN0YWNrTGF5b3V0IjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL1Nhc2hGb3JtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ1MTIwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL1Nhc2hGb3JtLmphdmEKQEAgLTAsMCArMSw0MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5jdXN0b207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworLyoqCisgKiBUaGUgU2FzaEZvcm0gaXMgYSBjb21wb3NpdGUgY29udHJvbCB0aGF0IGxheXMgb3V0IGl0cyBjaGlsZHJlbiBpbiBhCisgKiByb3cgb3IgY29sdW1uIGFycmFuZ2VtZW50IChhcyBzcGVjaWZpZWQgYnkgdGhlIG9yaWVudGF0aW9uKSBhbmQgcGxhY2VzCisgKiBhIFNhc2ggYmV0d2VlbiBlYWNoIGNoaWxkLiBPbmUgY2hpbGQgbWF5IGJlIG1heGltaXplZCB0byBvY2N1cHkgdGhlCisgKiBlbnRpcmUgc2l6ZSBvZiB0aGUgU2FzaEZvcm0uICBUaGUgcmVsYXRpdmUgc2l6ZXMgb2YgdGhlIGNoaWxkcmVuIG1heQorICogYmUgc3BlY2lmaWVkIHVzaW5nIHdlaWdodHMuCisgKiA8cD4KKyAqIDxkbD4KKyAqIDxkdD48Yj5TdHlsZXM6PC9iPjwvZHQ+CisgKiA8ZGQ+SE9SSVpPTlRBTCwgVkVSVElDQUwsIFNNT09USDwvZGQ+CisgKiA8L2RsPgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgU2FzaEZvcm0gZXh0ZW5kcyBDb21wb3NpdGUgeworCXB1YmxpYyBpbnQgU0FTSF9XSURUSCA9IDM7CisKKwlpbnQgc2FzaFN0eWxlOworCVNhc2hbXSBzYXNoZXMgPSBuZXcgU2FzaFswXTsKKwkvLyBSZW1lbWJlciBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kCisJLy8gY29sb3JzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNldAorCS8vIHNhc2hlcyB0byB0aGUgZGVmYXVsdCBjb2xvciAobnVsbCkgb3IKKwkvLyBhIHNwZWNpZmljIGNvbG9yCisJQ29sb3IgYmFja2dyb3VuZCA9IG51bGw7CisJQ29sb3IgZm9yZWdyb3VuZCA9IG51bGw7CisJQ29udHJvbFtdIGNvbnRyb2xzID0gbmV3IENvbnRyb2xbMF07CisJQ29udHJvbCBtYXhDb250cm9sID0gbnVsbDsKKwlMaXN0ZW5lciBzYXNoTGlzdGVuZXI7CisJc3RhdGljIGZpbmFsIGludCBEUkFHX01JTklNVU0gPSAyMDsKKworCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZVNhc2ggPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZXNpemU7ICAKKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAorICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCisgKiA8cD4KKyAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgorICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCisgKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKKyAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCisgKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCisgKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgorICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCisgKiA8L3A+CisgKgorICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCisgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKKyAqCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+CisgKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+CisgKiA8L3VsPgorICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgorICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KKyAqIDwvdWw+CisgKgorICogQHNlZSBTV1QjSE9SSVpPTlRBTAorICogQHNlZSBTV1QjVkVSVElDQUwKKyAqIEBzZWUgI2dldFN0eWxlKCkKKyAqLworcHVibGljIFNhc2hGb3JtKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgeworCXN1cGVyKHBhcmVudCwgY2hlY2tTdHlsZTIoc3R5bGUpKTsKKwlzdXBlci5zZXRMYXlvdXQobmV3IFNhc2hGb3JtTGF5b3V0KCkpOworCXNhc2hTdHlsZSA9ICgoc3R5bGUgJiBTV1QuVkVSVElDQUwpICE9IDApID8gU1dULkhPUklaT05UQUwgOiBTV1QuVkVSVElDQUw7CisJaWYgKChzdHlsZSAmIFNXVC5CT1JERVIpICE9IDApIHNhc2hTdHlsZSB8PSBTV1QuQk9SREVSOworCWlmICgoc3R5bGUgJiBTV1QuU01PT1RIKSAhPSAwKSBzYXNoU3R5bGUgfD0gU1dULlNNT09USDsKKwlzYXNoTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7CisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKKwkJCW9uRHJhZ1Nhc2goZSk7CisJCX0KKwl9OworfQorc3RhdGljIGludCBjaGVja1N0eWxlMihpbnQgc3R5bGUpIHsKKwlpbnQgbWFzayA9IFNXVC5CT1JERVIgfCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5SSUdIVF9UT19MRUZUOworCXJldHVybiBzdHlsZSAmIG1hc2s7Cit9CisvKioKKyAqIFJldHVybnMgU1dULkhPUklaT05UQUwgaWYgdGhlIGNvbnRyb2xzIGluIHRoZSBTYXNoRm9ybSBhcmUgbGFpZCBvdXQgc2lkZSBieSBzaWRlCisgKiBvciBTV1QuVkVSVElDQUwgICBpZiB0aGUgY29udHJvbHMgaW4gdGhlIFNhc2hGb3JtIGFyZSBsYWlkIG91dCB0b3AgdG8gYm90dG9tLgorICogCisgKiBAcmV0dXJuIFNXVC5IT1JJWk9OVEFMIG9yIFNXVC5WRVJUSUNBTAorICovCitwdWJsaWMgaW50IGdldE9yaWVudGF0aW9uKCkgeworCS8vY2hlY2tXaWRnZXQoKTsKKwlyZXR1cm4gKHNhc2hTdHlsZSAmIFNXVC5WRVJUSUNBTCkgIT0gMCA/IFNXVC5IT1JJWk9OVEFMIDogU1dULlZFUlRJQ0FMOworfQorcHVibGljIGludCBnZXRTdHlsZSgpIHsKKwlpbnQgc3R5bGUgPSBzdXBlci5nZXRTdHlsZSgpOworCXN0eWxlIHw9IGdldE9yaWVudGF0aW9uKCkgPT0gU1dULlZFUlRJQ0FMID8gU1dULlZFUlRJQ0FMIDogU1dULkhPUklaT05UQUw7CisJaWYgKChzYXNoU3R5bGUgJiBTV1QuU01PT1RIKSAhPSAwKSBzdHlsZSB8PSBTV1QuU01PT1RIOworCXJldHVybiBzdHlsZTsKK30KKy8qKgorICogQW5zd2VyIHRoZSBjb250cm9sIHRoYXQgY3VycmVudGx5IGlzIG1heGltaXplZCBpbiB0aGUgU2FzaEZvcm0uICAKKyAqIFRoaXMgdmFsdWUgbWF5IGJlIG51bGwuCisgKiAKKyAqIEByZXR1cm4gdGhlIGNvbnRyb2wgdGhhdCBjdXJyZW50bHkgaXMgbWF4aW1pemVkIG9yIG51bGwKKyAqLworcHVibGljIENvbnRyb2wgZ2V0TWF4aW1pemVkQ29udHJvbCgpeworCS8vY2hlY2tXaWRnZXQoKTsKKwlyZXR1cm4gdGhpcy5tYXhDb250cm9sOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlbGF0aXZlIHdlaWdodCBvZiBlYWNoIGNoaWxkIGluIHRoZSBTYXNoRm9ybS4gIFRoZSB3ZWlnaHQgcmVwcmVzZW50cyB0aGUKKyAqIHBlcmNlbnQgb2YgdGhlIHRvdGFsIHdpZHRoIChpZiBTYXNoRm9ybSBoYXMgSG9yaXpvbnRhbCBvcmllbnRhdGlvbikgb3IgCisgKiB0b3RhbCBoZWlnaHQgKGlmIFNhc2hGb3JtIGhhcyBWZXJ0aWNhbCBvcmllbnRhdGlvbikgZWFjaCBjb250cm9sIG9jY3VwaWVzLgorICogVGhlIHdlaWdodHMgYXJlIHJldHVybmVkIGluIG9yZGVyIG9mIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2lkZ2V0cyAod2VpZ2h0WzBdCisgKiBjb3JyZXNwb25kcyB0byB0aGUgd2VpZ2h0IG9mIHRoZSBmaXJzdCBjaGlsZCBjcmVhdGVkKS4KKyAqIAorICogQHJldHVybiB0aGUgcmVsYXRpdmUgd2VpZ2h0IG9mIGVhY2ggY2hpbGQKKyAqIAorICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgorICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+CisgKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+CisgKiA8L3VsPgorICovCisKK3B1YmxpYyBpbnRbXSBnZXRXZWlnaHRzKCkgeworCWNoZWNrV2lkZ2V0KCk7CisJQ29udHJvbFtdIGNBcnJheSA9IGdldENvbnRyb2xzKGZhbHNlKTsKKwlpbnRbXSByYXRpb3MgPSBuZXcgaW50W2NBcnJheS5sZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgY0FycmF5Lmxlbmd0aDsgaSsrKSB7CisJCU9iamVjdCBkYXRhID0gY0FycmF5W2ldLmdldExheW91dERhdGEoKTsKKwkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSB7CisJCQlyYXRpb3NbaV0gPSAoaW50KSgoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQgKiAxMDAwID4+IDE2KTsKKwkJfSBlbHNlIHsKKwkJCXJhdGlvc1tpXSA9IDIwMDsKKwkJfQorCX0KKwlyZXR1cm4gcmF0aW9zOworfQorQ29udHJvbFtdIGdldENvbnRyb2xzKGJvb2xlYW4gb25seVZpc2libGUpIHsKKwlDb250cm9sW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOworCUNvbnRyb2xbXSByZXN1bHQgPSBuZXcgQ29udHJvbFswXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCWlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIFNhc2gpIGNvbnRpbnVlOworCQlpZiAob25seVZpc2libGUgJiYgIWNoaWxkcmVuW2ldLmdldFZpc2libGUoKSkgY29udGludWU7CisKKwkJQ29udHJvbFtdIG5ld1Jlc3VsdCA9IG5ldyBDb250cm9sW3Jlc3VsdC5sZW5ndGggKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIG5ld1Jlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7CisJCW5ld1Jlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IGNoaWxkcmVuW2ldOworCQlyZXN1bHQgPSBuZXdSZXN1bHQ7CisJfQorCXJldHVybiByZXN1bHQ7Cit9Cit2b2lkIG9uRHJhZ1Nhc2goRXZlbnQgZXZlbnQpIHsKKwlpZiAoIWVuYWJsZVNhc2gpCisJCXJldHVybjsKKwkKKwlTYXNoIHNhc2ggPSAoU2FzaClldmVudC53aWRnZXQ7CisJaW50IHNhc2hJbmRleCA9IC0xOworCWZvciAoaW50IGk9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHNhc2hlc1tpXSA9PSBzYXNoKSB7CisJCQlzYXNoSW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHNhc2hJbmRleCA9PSAtMSkgcmV0dXJuOworCQorCUNvbnRyb2wgYzEgPSBjb250cm9sc1tzYXNoSW5kZXhdOworCUNvbnRyb2wgYzIgPSBjb250cm9sc1tzYXNoSW5kZXggKyAxXTsKKwlSZWN0YW5nbGUgYjEgPSBjMS5nZXRCb3VuZHMoKTsKKwlSZWN0YW5nbGUgYjIgPSBjMi5nZXRCb3VuZHMoKTsKKwkKKwlSZWN0YW5nbGUgc2FzaEJvdW5kcyA9IHNhc2guZ2V0Qm91bmRzKCk7CisJUmVjdGFuZ2xlIGFyZWEgPSBnZXRDbGllbnRBcmVhKCk7CisJYm9vbGVhbiBjb3JyZWN0aW9uID0gZmFsc2U7CisJaWYgKGdldE9yaWVudGF0aW9uKCkgPT0gU1dULkhPUklaT05UQUwpIHsKKwkJY29ycmVjdGlvbiA9IGIxLndpZHRoIDwgRFJBR19NSU5JTVVNIHx8IGIyLndpZHRoIDwgRFJBR19NSU5JTVVNOworCQlpbnQgdG90YWxXaWR0aCA9IGIyLnggKyBiMi53aWR0aCAtIGIxLng7IAorCQlpbnQgc2hpZnQgPSBldmVudC54IC0gc2FzaEJvdW5kcy54OworCQliMS53aWR0aCArPSBzaGlmdDsKKwkJYjIueCArPSBzaGlmdDsKKwkJYjIud2lkdGggLT0gc2hpZnQ7CisJCWlmIChiMS53aWR0aCA8IERSQUdfTUlOSU1VTSkgeworCQkJYjEud2lkdGggPSBEUkFHX01JTklNVU07CisJCQliMi54ID0gYjEueCArIGIxLndpZHRoICsgc2FzaEJvdW5kcy53aWR0aDsKKwkJCWIyLndpZHRoID0gdG90YWxXaWR0aCAtIGIyLng7CisJCQlldmVudC54ID0gYjEueCArIGIxLndpZHRoOworCQkJZXZlbnQuZG9pdCA9IGZhbHNlOworCQl9CisJCWlmIChiMi53aWR0aCA8IERSQUdfTUlOSU1VTSkgeworCQkJYjEud2lkdGggPSB0b3RhbFdpZHRoIC0gRFJBR19NSU5JTVVNIC0gc2FzaEJvdW5kcy53aWR0aDsKKwkJCWIyLnggPSBiMS54ICsgYjEud2lkdGggKyBzYXNoQm91bmRzLndpZHRoOworCQkJYjIud2lkdGggPSBEUkFHX01JTklNVU07CisJCQlldmVudC54ID0gYjEueCArIGIxLndpZHRoOworCQkJZXZlbnQuZG9pdCA9IGZhbHNlOworCQl9CisJCU9iamVjdCBkYXRhMSA9IGMxLmdldExheW91dERhdGEoKTsKKwkJaWYgKGRhdGExID09IG51bGwgfHwgIShkYXRhMSBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKKwkJCWRhdGExID0gbmV3IFNhc2hGb3JtRGF0YSgpOworCQkJYzEuc2V0TGF5b3V0RGF0YShkYXRhMSk7CisJCX0KKwkJT2JqZWN0IGRhdGEyID0gYzIuZ2V0TGF5b3V0RGF0YSgpOworCQlpZiAoZGF0YTIgPT0gbnVsbCB8fCAhKGRhdGEyIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgeworCQkJZGF0YTIgPSBuZXcgU2FzaEZvcm1EYXRhKCk7CisJCQljMi5zZXRMYXlvdXREYXRhKGRhdGEyKTsKKwkJfQorCQkoKFNhc2hGb3JtRGF0YSlkYXRhMSkud2VpZ2h0ID0gKCgobG9uZyliMS53aWR0aCA8PCAxNikgKyBhcmVhLndpZHRoIC0gMSkgLyBhcmVhLndpZHRoOworCQkoKFNhc2hGb3JtRGF0YSlkYXRhMikud2VpZ2h0ID0gKCgobG9uZyliMi53aWR0aCA8PCAxNikgKyBhcmVhLndpZHRoIC0gMSkgLyBhcmVhLndpZHRoOworCX0gZWxzZSB7CisJCWNvcnJlY3Rpb24gPSBiMS5oZWlnaHQgPCBEUkFHX01JTklNVU0gfHwgYjIuaGVpZ2h0IDwgRFJBR19NSU5JTVVNOworCQlpbnQgdG90YWxIZWlnaHQgPSBiMi55ICsgYjIuaGVpZ2h0IC0gYjEueTsKKwkJaW50IHNoaWZ0ID0gZXZlbnQueSAtIHNhc2hCb3VuZHMueTsKKwkJYjEuaGVpZ2h0ICs9IHNoaWZ0OworCQliMi55ICs9IHNoaWZ0OworCQliMi5oZWlnaHQgLT0gc2hpZnQ7CisJCWlmIChiMS5oZWlnaHQgPCBEUkFHX01JTklNVU0pIHsKKwkJCWIxLmhlaWdodCA9IERSQUdfTUlOSU1VTTsKKwkJCWIyLnkgPSBiMS55ICsgYjEuaGVpZ2h0ICsgc2FzaEJvdW5kcy5oZWlnaHQ7CisJCQliMi5oZWlnaHQgPSB0b3RhbEhlaWdodCAtIGIyLnk7CisJCQlldmVudC55ID0gYjEueSArIGIxLmhlaWdodDsKKwkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKKwkJfQorCQlpZiAoYjIuaGVpZ2h0IDwgRFJBR19NSU5JTVVNKSB7CisJCQliMS5oZWlnaHQgPSB0b3RhbEhlaWdodCAtIERSQUdfTUlOSU1VTSAtIHNhc2hCb3VuZHMuaGVpZ2h0OworCQkJYjIueSA9IGIxLnkgKyBiMS5oZWlnaHQgKyBzYXNoQm91bmRzLmhlaWdodDsKKwkJCWIyLmhlaWdodCA9IERSQUdfTUlOSU1VTTsKKwkJCWV2ZW50LnkgPSBiMS55ICsgYjEuaGVpZ2h0OworCQkJZXZlbnQuZG9pdCA9IGZhbHNlOworCQl9CisJCU9iamVjdCBkYXRhMSA9IGMxLmdldExheW91dERhdGEoKTsKKwkJaWYgKGRhdGExID09IG51bGwgfHwgIShkYXRhMSBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKKwkJCWRhdGExID0gbmV3IFNhc2hGb3JtRGF0YSgpOworCQkJYzEuc2V0TGF5b3V0RGF0YShkYXRhMSk7CisJCX0KKwkJT2JqZWN0IGRhdGEyID0gYzIuZ2V0TGF5b3V0RGF0YSgpOworCQlpZiAoZGF0YTIgPT0gbnVsbCB8fCAhKGRhdGEyIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgeworCQkJZGF0YTIgPSBuZXcgU2FzaEZvcm1EYXRhKCk7CisJCQljMi5zZXRMYXlvdXREYXRhKGRhdGEyKTsKKwkJfQorCQkvLygoU2FzaEZvcm1EYXRhKWRhdGExKS53ZWlnaHQgPSAoKChsb25nKWIxLmhlaWdodCA8PCAxNikgKyBhcmVhLmhlaWdodCAtIDEpIC8gYXJlYS5oZWlnaHQ7CisJCS8vKChTYXNoRm9ybURhdGEpZGF0YTIpLndlaWdodCA9ICgoKGxvbmcpYjIuaGVpZ2h0IDw8IDE2KSArIGFyZWEuaGVpZ2h0IC0gMSkgLyBhcmVhLmhlaWdodDsKKwkJKChTYXNoRm9ybURhdGEpZGF0YTEpLndlaWdodCA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwICogYjEuaGVpZ2h0IC8gYjIuaGVpZ2h0OworCQkoKFNhc2hGb3JtRGF0YSlkYXRhMikud2VpZ2h0ID0gKCgyMDAgPDwgMTYpICsgOTk5KSAvIDEwMDA7CisJfQorCWlmIChjb3JyZWN0aW9uIHx8IChldmVudC5kb2l0ICYmIGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykpIHsKKwkJYzEuc2V0Qm91bmRzKGIxKTsKKwkJc2FzaC5zZXRCb3VuZHMoZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7CisJCWMyLnNldEJvdW5kcyhiMik7CisJfQorfQorLyoqCisgKiBJZiBvcmllbnRhdGlvbiBpcyBTV1QuSE9SSVpPTlRBTCwgbGF5IHRoZSBjb250cm9scyBpbiB0aGUgU2FzaEZvcm0gCisgKiBvdXQgc2lkZSBieSBzaWRlLiAgSWYgb3JpZW50YXRpb24gaXMgU1dULlZFUlRJQ0FMLCBsYXkgdGhlIAorICogY29udHJvbHMgaW4gdGhlIFNhc2hGb3JtIG91dCB0b3AgdG8gYm90dG9tLgorICogCisgKiBAcGFyYW0gb3JpZW50YXRpb24gU1dULkhPUklaT05UQUwgb3IgU1dULlZFUlRJQ0FMCisgKiAKKyAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KKyAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgorICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgorICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgdmFsdWUgb2Ygb3JpZW50YXRpb24gaXMgbm90IFNXVC5IT1JJWk9OVEFMIG9yIFNXVC5WRVJUSUNBTAorICogPC91bD4KKyAqLworcHVibGljIHZvaWQgc2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKSB7CisJY2hlY2tXaWRnZXQoKTsKKwlpZiAoZ2V0T3JpZW50YXRpb24oKSA9PSBvcmllbnRhdGlvbikgcmV0dXJuOworCWlmIChvcmllbnRhdGlvbiAhPSBTV1QuSE9SSVpPTlRBTCAmJiBvcmllbnRhdGlvbiAhPSBTV1QuVkVSVElDQUwpIHsKKwkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKKwl9CisJc2FzaFN0eWxlICY9IH4oU1dULkhPUklaT05UQUwgfCBTV1QuVkVSVElDQUwpOworCXNhc2hTdHlsZSB8PSBvcmllbnRhdGlvbiA9PSBTV1QuVkVSVElDQUwgPyBTV1QuSE9SSVpPTlRBTCA6IFNXVC5WRVJUSUNBTDsKKwlmb3IgKGludCBpID0gMDsgaSA8IHNhc2hlcy5sZW5ndGg7IGkrKykgeworCQlzYXNoZXNbaV0uZGlzcG9zZSgpOworCQlzYXNoZXNbaV0gPSBuZXcgU2FzaCh0aGlzLCBzYXNoU3R5bGUpOworCQlzYXNoZXNbaV0uc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKKwkJc2FzaGVzW2ldLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7CisJCXNhc2hlc1tpXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzYXNoTGlzdGVuZXIpOworCX0KKwlsYXlvdXQoZmFsc2UpOworfQorcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZCAoQ29sb3IgY29sb3IpIHsKKwlzdXBlci5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKKwliYWNrZ3JvdW5kID0gY29sb3I7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKKwkJc2FzaGVzW2ldLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7CisJfQorfQorcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZCAoQ29sb3IgY29sb3IpIHsKKwlzdXBlci5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKKwlmb3JlZ3JvdW5kID0gY29sb3I7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKKwkJc2FzaGVzW2ldLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7CisJfQorfQorLyoqCisgKiBTZXRzIHRoZSBsYXlvdXQgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlciB0byBiZQorICogdGhlIGFyZ3VtZW50IHdoaWNoIG1heSBiZSBudWxsLgorICogPHA+CisgKiBOb3RlOiBObyBMYXlvdXQgY2FuIGJlIHNldCBvbiB0aGlzIENvbnRyb2wgYmVjYXVzZSBpdCBhbHJlYWR5CisgKiBtYW5hZ2VzIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiBpdHMgY2hpbGRyZW4uCisgKiA8L3A+CisgKgorICogQHBhcmFtIGxheW91dCB0aGUgcmVjZWl2ZXIncyBuZXcgbGF5b3V0IG9yIG51bGwKKyAqCisgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+CisgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KKyAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyB2b2lkIHNldExheW91dCAoTGF5b3V0IGxheW91dCkgeworCWNoZWNrV2lkZ2V0KCk7CisJcmV0dXJuOworfQorLyoqCisgKiBTcGVjaWZ5IHRoZSBjb250cm9sIHRoYXQgc2hvdWxkIHRha2UgdXAgdGhlIGVudGlyZSBjbGllbnQgYXJlYSBvZiB0aGUgU2FzaEZvcm0uICAKKyAqIElmIG9uZSBjb250cm9sIGhhcyBiZWVuIG1heGltaXplZCwgYW5kIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IGNvbnRyb2wsIAorICogdGhlIHByZXZpb3VzIGNvbnRyb2wgd2lsbCBiZSBtaW5pbWl6ZWQgYW5kIHRoZSBuZXcgY29udHJvbCB3aWxsIGJlIG1heGltaXplZC4KKyAqIElmIHRoZSB2YWx1ZSBvZiBjb250cm9sIGlzIG51bGwsIHRoZSBTYXNoRm9ybSB3aWxsIG1pbmltaXplIGFsbCBjb250cm9scyBhbmQgcmV0dXJuIHRvCisgKiB0aGUgZGVmYXVsdCBsYXlvdXQgd2hlcmUgYWxsIGNvbnRyb2xzIGFyZSBsYWlkIG91dCBzZXBhcmF0ZWQgYnkgc2FzaGVzLgorICogCisgKiBAcGFyYW0gY29udHJvbCB0aGUgY29udHJvbCB0byBiZSBtYXhpbWl6ZWQgb3IgbnVsbAorICogCisgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+CisgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KKyAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyB2b2lkIHNldE1heGltaXplZENvbnRyb2woQ29udHJvbCBjb250cm9sKXsKKwljaGVja1dpZGdldCgpOworCWlmIChjb250cm9sID09IG51bGwpIHsKKwkJaWYgKG1heENvbnRyb2wgIT0gbnVsbCkgeworCQkJdGhpcy5tYXhDb250cm9sID0gbnVsbDsKKwkJCWxheW91dChmYWxzZSk7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgc2FzaGVzLmxlbmd0aDsgaSsrKXsKKwkJCQlzYXNoZXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfQorCQorCWZvciAoaW50IGk9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspeworCQlzYXNoZXNbaV0uc2V0VmlzaWJsZShmYWxzZSk7CisJfQorCW1heENvbnRyb2wgPSBjb250cm9sOworCWxheW91dChmYWxzZSk7Cit9CisKKy8qKgorICogU3BlY2lmeSB0aGUgcmVsYXRpdmUgd2VpZ2h0IG9mIGVhY2ggY2hpbGQgaW4gdGhlIFNhc2hGb3JtLiAgVGhpcyB3aWxsIGRldGVybWluZQorICogd2hhdCBwZXJjZW50IG9mIHRoZSB0b3RhbCB3aWR0aCAoaWYgU2FzaEZvcm0gaGFzIEhvcml6b250YWwgb3JpZW50YXRpb24pIG9yIAorICogdG90YWwgaGVpZ2h0IChpZiBTYXNoRm9ybSBoYXMgVmVydGljYWwgb3JpZW50YXRpb24pIGVhY2ggY29udHJvbCB3aWxsIG9jY3VweS4KKyAqIFRoZSB3ZWlnaHRzIG11c3QgYmUgcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGVyZSBtdXN0IGJlIGFuIGVudHJ5IGZvciBlYWNoCisgKiBub24tc2FzaCBjaGlsZCBvZiB0aGUgU2FzaEZvcm0uCisgKiAKKyAqIEBwYXJhbSB3ZWlnaHRzIHRoZSByZWxhdGl2ZSB3ZWlnaHQgb2YgZWFjaCBjaGlsZAorICogCisgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+CisgKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KKyAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KKyAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHdlaWdodHMgdmFsdWUgaXMgbnVsbCBvciBvZiBpbmNvcnJlY3QgbGVuZ3RoIChtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4pPC9saT4KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyB2b2lkIHNldFdlaWdodHMoaW50W10gd2VpZ2h0cykgeworCWNoZWNrV2lkZ2V0KCk7CisJQ29udHJvbFtdIGNBcnJheSA9IGdldENvbnRyb2xzKGZhbHNlKTsKKwlpZiAod2VpZ2h0cyA9PSBudWxsIHx8IHdlaWdodHMubGVuZ3RoICE9IGNBcnJheS5sZW5ndGgpIHsKKwkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKKwl9CisJCisJaWYgKHdlaWdodHMgPT0gbnVsbCkKKwkJcmV0dXJuOworCQorCWludCB0b3RhbCA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWlnaHRzLmxlbmd0aDsgaSsrKSB7CisJCWlmICh3ZWlnaHRzW2ldIDwgMCkgeworCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKKwkJfQorCQl0b3RhbCArPSB3ZWlnaHRzW2ldOworCX0KKwlpZiAodG90YWwgPT0gMCkgeworCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOworCX0KKwlmb3IgKGludCBpID0gMDsgaSA8IGNBcnJheS5sZW5ndGg7IGkrKykgeworCQlPYmplY3QgZGF0YSA9IGNBcnJheVtpXS5nZXRMYXlvdXREYXRhKCk7CisJCWlmIChkYXRhID09IG51bGwgfHwgIShkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgeworCQkJZGF0YSA9IG5ldyBTYXNoRm9ybURhdGEoKTsKKwkJCWNBcnJheVtpXS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQl9CisJCSgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodCA9ICgoKGxvbmcpd2VpZ2h0c1tpXSA8PCAxNikgKyB0b3RhbCAtIDEpIC8gdG90YWw7CisJfQorCisJbGF5b3V0KGZhbHNlKTsKK30KKworcHVibGljIHZvaWQgc2V0U2ltcGxlTGF5b3V0KGJvb2xlYW4gYikgeworCUNvbnRyb2xbXSBjQXJyYXkgPSBnZXRDb250cm9scyhmYWxzZSk7CisJaWYgKGNBcnJheSA9PSBudWxsIHx8IGNBcnJheS5sZW5ndGggIT0gMikKKwkJcmV0dXJuOworCWVuYWJsZVNhc2ggPSBiOworCVNhc2hGb3JtTGF5b3V0IGxheW91dCA9IChTYXNoRm9ybUxheW91dCkgZ2V0TGF5b3V0KCk7CisJbGF5b3V0LnNpbXBsZSA9ICFlbmFibGVTYXNoOworCQorCWlmIChlbmFibGVTYXNoKQorCQlyZXNpemUgPSB0cnVlOworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybURhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGJhMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL1Nhc2hGb3JtRGF0YS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5jdXN0b207CisKK2NsYXNzIFNhc2hGb3JtRGF0YSB7CisKKwlsb25nIHdlaWdodDsKKworU3RyaW5nIGdldE5hbWUgKCkgeworCVN0cmluZyBzdHJpbmcgPSBnZXRDbGFzcyAoKS5nZXROYW1lICgpOworCWludCBpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZiAoJy4nKTsKKwlpZiAoaW5kZXggPT0gLTEpIHJldHVybiBzdHJpbmc7CisJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcgKGluZGV4ICsgMSwgc3RyaW5nLmxlbmd0aCAoKSk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUKKyAqIGRlc2NyaXB0aW9uIG9mIHRoZSByZWNlaXZlci4KKyAqCisgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBldmVudAorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpIHsKKwlyZXR1cm4gZ2V0TmFtZSgpKyIge3dlaWdodD0iK3dlaWdodCsifSI7IC8vJE5PTi1OTFMtMiQKK30KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybUxheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL1Nhc2hGb3JtTGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1MDMyMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybUxheW91dC5qYXZhCkBAIC0wLDAgKzEsMjQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBsYXlvdXQgZm9yIFNhc2hGb3JtCisgKiAKKyAqIEBzZWUgU2FzaEZvcm0KKyAqLworY2xhc3MgU2FzaEZvcm1MYXlvdXQgZXh0ZW5kcyBMYXlvdXQgeworCXByb3RlY3RlZCBib29sZWFuIHNpbXBsZTsKKworcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKKwlTYXNoRm9ybSBzYXNoRm9ybSA9IChTYXNoRm9ybSljb21wb3NpdGU7CisJQ29udHJvbFtdIGNBcnJheSA9IHNhc2hGb3JtLmdldENvbnRyb2xzKHRydWUpOworCWludCB3aWR0aCA9IDA7CisJaW50IGhlaWdodCA9IDA7CisJaWYgKGNBcnJheS5sZW5ndGggPT0gMCkgeworCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7CisJCWlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7CisJCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7CisJfQorCS8vIGRldGVybWluZSBjb250cm9sIHNpemVzCisJYm9vbGVhbiB2ZXJ0aWNhbCA9IHNhc2hGb3JtLmdldE9yaWVudGF0aW9uKCkgPT0gU1dULlZFUlRJQ0FMOworCWludCBtYXhJbmRleCA9IDA7CisJaW50IG1heFZhbHVlID0gMDsKKwlQb2ludFtdIHNpemVzID0gbmV3IFBvaW50W2NBcnJheS5sZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgY0FycmF5Lmxlbmd0aDsgaSsrKSB7CisJCWlmICh2ZXJ0aWNhbCkgeworCQkJc2l6ZXNbaV0gPSBjQXJyYXlbaV0uY29tcHV0ZVNpemUod0hpbnQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKKwkJCWlmIChzaXplc1tpXS55ID4gbWF4VmFsdWUpIHsKKwkJCQltYXhJbmRleCA9IGk7CisJCQkJbWF4VmFsdWUgPSBzaXplc1tpXS55OworCQkJfQorCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgc2l6ZXNbaV0ueCk7CisJCX0gZWxzZSB7CisJCQlzaXplc1tpXSA9IGNBcnJheVtpXS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgaEhpbnQsIGZsdXNoQ2FjaGUpOworCQkJaWYgKHNpemVzW2ldLnggPiBtYXhWYWx1ZSkgeworCQkJCW1heEluZGV4ID0gaTsKKwkJCQltYXhWYWx1ZSA9IHNpemVzW2ldLng7CisJCQl9CisJCQloZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHNpemVzW2ldLnkpOworCQl9CisJfQorCS8vIGdldCB0aGUgcmF0aW9zCisJbG9uZ1tdIHJhdGlvcyA9IG5ldyBsb25nW2NBcnJheS5sZW5ndGhdOworCWxvbmcgdG90YWwgPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgY0FycmF5Lmxlbmd0aDsgaSsrKSB7CisJCU9iamVjdCBkYXRhID0gY0FycmF5W2ldLmdldExheW91dERhdGEoKTsKKwkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSB7CisJCQlyYXRpb3NbaV0gPSAoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQ7CisJCX0gZWxzZSB7CisJCQlkYXRhID0gbmV3IFNhc2hGb3JtRGF0YSgpOworCQkJY0FycmF5W2ldLnNldExheW91dERhdGEoZGF0YSk7CisJCQkoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQgPSByYXRpb3NbaV0gPSAoKDIwMCA8PCAxNikgKyA5OTkpIC8gMTAwMDsKKwkJCQorCQl9CisJCXRvdGFsICs9IHJhdGlvc1tpXTsKKwl9CisJaWYgKHJhdGlvc1ttYXhJbmRleF0gPiAwKSB7CisJCWludCBzYXNod2lkdGggPSBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoID4gMCA/IHNhc2hGb3JtLlNBU0hfV0lEVEggKyBzYXNoRm9ybS5zYXNoZXMgWzBdLmdldEJvcmRlcldpZHRoKCkgKiAyIDogc2FzaEZvcm0uU0FTSF9XSURUSDsKKwkJaWYgKHZlcnRpY2FsKSB7CisJCQloZWlnaHQgKz0gKGludCkodG90YWwgKiBtYXhWYWx1ZSAvIHJhdGlvc1ttYXhJbmRleF0pICsgKGNBcnJheS5sZW5ndGggLSAxKSAqIHNhc2h3aWR0aDsKKwkJfSBlbHNlIHsKKwkJCXdpZHRoICs9IChpbnQpKHRvdGFsICogbWF4VmFsdWUgLyByYXRpb3NbbWF4SW5kZXhdKSArIChjQXJyYXkubGVuZ3RoIC0gMSkgKiBzYXNod2lkdGg7CisJCX0KKwl9CisJd2lkdGggKz0gc2FzaEZvcm0uZ2V0Qm9yZGVyV2lkdGgoKSoyOworCWhlaWdodCArPSBzYXNoRm9ybS5nZXRCb3JkZXJXaWR0aCgpKjI7CisJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKSB3aWR0aCA9IHdIaW50OworCWlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7CisJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKK30KKworcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hDYWNoZShDb250cm9sIGNvbnRyb2wpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKworcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgeworCVNhc2hGb3JtIHNhc2hGb3JtID0gKFNhc2hGb3JtKWNvbXBvc2l0ZTsKKwlSZWN0YW5nbGUgYXJlYSA9IHNhc2hGb3JtLmdldENsaWVudEFyZWEoKTsKKwlpZiAoYXJlYS53aWR0aCA8PSAxIHx8IGFyZWEuaGVpZ2h0IDw9IDEpIHJldHVybjsKKwkKKwlDb250cm9sW10gbmV3Q29udHJvbHMgPSBzYXNoRm9ybS5nZXRDb250cm9scyh0cnVlKTsKKwlpZiAoc2FzaEZvcm0uY29udHJvbHMubGVuZ3RoID09IDAgJiYgbmV3Q29udHJvbHMubGVuZ3RoID09IDApCisJCXJldHVybjsKKwlzYXNoRm9ybS5jb250cm9scyA9IG5ld0NvbnRyb2xzOworCQorCUNvbnRyb2xbXSBjb250cm9scyA9IHNhc2hGb3JtLmNvbnRyb2xzOworCQorCWlmIChzYXNoRm9ybS5tYXhDb250cm9sICE9IG51bGwgJiYgIXNhc2hGb3JtLm1heENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7CisJCWZvciAoaW50IGk9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKyl7CisJCQlpZiAoY29udHJvbHNbaV0gIT0gc2FzaEZvcm0ubWF4Q29udHJvbCkgeworCQkJCWNvbnRyb2xzW2ldLnNldEJvdW5kcygtMjAwLCAtMjAwLCAwLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJY29udHJvbHNbaV0uc2V0Qm91bmRzKGFyZWEpOworCQkJfQorCQl9CisJCXJldHVybjsKKwl9CisJCisJLy8gc2ltcGxlIGxheW91dAorCWlmIChzaW1wbGUpIHsKKwkJLy8gaGlkZSBzYXNoZXMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoOyBpKyspIHsKKwkJCXNhc2hGb3JtLnNhc2hlc1tpXS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCXNhc2hGb3JtLnNhc2hlc1tpXS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJfQorCQkKKwkJUG9pbnQgcCA9IGNvbnRyb2xzWzBdLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7CisJCWNvbnRyb2xzWzBdLnNldEJvdW5kcygwLCAwLCBhcmVhLndpZHRoLCBwLnkpOworCQljb250cm9sc1sxXS5zZXRCb3VuZHMoMCwgcC55ICsgMiwgYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQgLSBwLnkgLSAyKTsKKwkJCisJCXJldHVybjsKKwl9CisJCisJLy8ga2VlcCBqdXN0IHRoZSByaWdodCBudW1iZXIgb2Ygc2FzaGVzCisJaWYgKHNhc2hGb3JtLnNhc2hlcy5sZW5ndGggPCBjb250cm9scy5sZW5ndGggLSAxKSB7CisJCVNhc2hbXSBuZXdTYXNoZXMgPSBuZXcgU2FzaFtjb250cm9scy5sZW5ndGggLSAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShzYXNoRm9ybS5zYXNoZXMsIDAsIG5ld1Nhc2hlcywgMCwgc2FzaEZvcm0uc2FzaGVzLmxlbmd0aCk7CisJCWZvciAoaW50IGkgPSBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoOyBpIDwgbmV3U2FzaGVzLmxlbmd0aDsgaSsrKSB7CisJCQluZXdTYXNoZXNbaV0gPSBuZXcgU2FzaChzYXNoRm9ybSwgc2FzaEZvcm0uc2FzaFN0eWxlKTsKKwkJCW5ld1Nhc2hlc1tpXS5zZXRCYWNrZ3JvdW5kKHNhc2hGb3JtLmJhY2tncm91bmQpOworCQkJbmV3U2FzaGVzW2ldLnNldEZvcmVncm91bmQoc2FzaEZvcm0uZm9yZWdyb3VuZCk7CisJCQluZXdTYXNoZXNbaV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc2FzaEZvcm0uc2FzaExpc3RlbmVyKTsKKwkJfQorCQlzYXNoRm9ybS5zYXNoZXMgPSBuZXdTYXNoZXM7CisJfQorCWlmIChzYXNoRm9ybS5zYXNoZXMubGVuZ3RoID4gY29udHJvbHMubGVuZ3RoIC0gMSkgeworCQlpZiAoY29udHJvbHMubGVuZ3RoID09IDApIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2FzaEZvcm0uc2FzaGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJc2FzaEZvcm0uc2FzaGVzW2ldLmRpc3Bvc2UoKTsKKwkJCX0KKwkJCXNhc2hGb3JtLnNhc2hlcyA9IG5ldyBTYXNoWzBdOworCQl9IGVsc2UgeworCQkJU2FzaFtdIG5ld1Nhc2hlcyA9IG5ldyBTYXNoW2NvbnRyb2xzLmxlbmd0aCAtIDFdOworCQkJU3lzdGVtLmFycmF5Y29weShzYXNoRm9ybS5zYXNoZXMsIDAsIG5ld1Nhc2hlcywgMCwgbmV3U2FzaGVzLmxlbmd0aCk7CisJCQlmb3IgKGludCBpID0gY29udHJvbHMubGVuZ3RoIC0gMTsgaSA8IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGg7IGkrKykgeworCQkJCXNhc2hGb3JtLnNhc2hlc1tpXS5kaXNwb3NlKCk7CisJCQl9CisJCQlzYXNoRm9ybS5zYXNoZXMgPSBuZXdTYXNoZXM7CisJCX0KKwl9CisJaWYgKGNvbnRyb2xzLmxlbmd0aCA9PSAwKSByZXR1cm47CisJU2FzaFtdIHNhc2hlcyA9IHNhc2hGb3JtLnNhc2hlczsKKwkKKwlmb3IgKGludCBpID0gMDsgaSA8IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGg7IGkrKykgeworCQlzYXNoZXNbaV0uc2V0RW5hYmxlZCh0cnVlKTsKKwkJc2FzaGVzW2ldLnNldFZpc2libGUodHJ1ZSk7CisJfQorCQorCWlmIChzYXNoRm9ybS5yZXNpemUpIHsKKwkJQ29udHJvbCBjMSA9IGNvbnRyb2xzWzBdOworCQlDb250cm9sIGMyID0gY29udHJvbHNbMV07CisJCQorCQlpbnQgaDEgPSBhcmVhLmhlaWdodCAvIDM7CisJCWludCBoMiA9IGFyZWEuaGVpZ2h0IC0gaDEgLSBzYXNoZXNbMF0uZ2V0Qm91bmRzKCkuaGVpZ2h0OworCQkKKwkJT2JqZWN0IGRhdGExID0gYzEuZ2V0TGF5b3V0RGF0YSgpOworCQlpZiAoZGF0YTEgPT0gbnVsbCB8fCAhKGRhdGExIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgeworCQkJZGF0YTEgPSBuZXcgU2FzaEZvcm1EYXRhKCk7CisJCQljMS5zZXRMYXlvdXREYXRhKGRhdGExKTsKKwkJfQorCQlPYmplY3QgZGF0YTIgPSBjMi5nZXRMYXlvdXREYXRhKCk7CisJCWlmIChkYXRhMiA9PSBudWxsIHx8ICEoZGF0YTIgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpKSB7CisJCQlkYXRhMiA9IG5ldyBTYXNoRm9ybURhdGEoKTsKKwkJCWMyLnNldExheW91dERhdGEoZGF0YTIpOworCQl9CisJCSgoU2FzaEZvcm1EYXRhKWRhdGExKS53ZWlnaHQgPSAoKDIwMCA8PCAxNikgKyA5OTkpIC8gMTAwMCAqIGgxIC8gaDI7CisJCSgoU2FzaEZvcm1EYXRhKWRhdGEyKS53ZWlnaHQgPSAoKDIwMCA8PCAxNikgKyA5OTkpIC8gMTAwMDsKKwkJc2FzaEZvcm0ucmVzaXplID0gZmFsc2U7CisJfQorCQorCS8vIGdldCB0aGUgcmF0aW9zCisJbG9uZ1tdIHJhdGlvcyA9IG5ldyBsb25nW2NvbnRyb2xzLmxlbmd0aF07CisJbG9uZyB0b3RhbCA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgeworCQlPYmplY3QgZGF0YSA9IGNvbnRyb2xzW2ldLmdldExheW91dERhdGEoKTsKKwkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSB7CisJCQlyYXRpb3NbaV0gPSAoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQ7CisJCX0gZWxzZSB7CisJCQlkYXRhID0gbmV3IFNhc2hGb3JtRGF0YSgpOworCQkJY29udHJvbHNbaV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCSgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodCA9IHJhdGlvc1tpXSA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwOworCQl9CisJCXRvdGFsICs9IHJhdGlvc1tpXTsKKwl9CisJCisJaW50IHNhc2h3aWR0aCA9IHNhc2hlcy5sZW5ndGggPiAwID8gc2FzaEZvcm0uU0FTSF9XSURUSCArIHNhc2hlcyBbMF0uZ2V0Qm9yZGVyV2lkdGgoKSAqIDIgOiBzYXNoRm9ybS5TQVNIX1dJRFRIOworCWlmIChzYXNoRm9ybS5nZXRPcmllbnRhdGlvbigpID09IFNXVC5IT1JJWk9OVEFMKSB7CisJCWludCB3aWR0aCA9IChpbnQpKHJhdGlvc1swXSAqIChhcmVhLndpZHRoIC0gc2FzaGVzLmxlbmd0aCAqIHNhc2h3aWR0aCkgLyB0b3RhbCk7CisJCWludCB4ID0gYXJlYS54OworCQljb250cm9sc1swXS5zZXRCb3VuZHMoeCwgYXJlYS55LCB3aWR0aCwgYXJlYS5oZWlnaHQpOworCQl4ICs9IHdpZHRoOworCQlmb3IgKGludCBpID0gMTsgaSA8IGNvbnRyb2xzLmxlbmd0aCAtIDE7IGkrKykgeworCQkJc2FzaGVzW2kgLSAxXS5zZXRCb3VuZHMoeCwgYXJlYS55LCBzYXNod2lkdGgsIGFyZWEuaGVpZ2h0KTsKKwkJCXggKz0gc2FzaHdpZHRoOworCQkJd2lkdGggPSAoaW50KShyYXRpb3NbaV0gKiAoYXJlYS53aWR0aCAtIHNhc2hlcy5sZW5ndGggKiBzYXNod2lkdGgpIC8gdG90YWwpOworCQkJY29udHJvbHNbaV0uc2V0Qm91bmRzKHgsIGFyZWEueSwgd2lkdGgsIGFyZWEuaGVpZ2h0KTsKKwkJCXggKz0gd2lkdGg7CisJCX0KKwkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDEpIHsKKwkJCXNhc2hlc1tzYXNoZXMubGVuZ3RoIC0gMV0uc2V0Qm91bmRzKHgsIGFyZWEueSwgc2FzaHdpZHRoLCBhcmVhLmhlaWdodCk7CisJCQl4ICs9IHNhc2h3aWR0aDsKKwkJCXdpZHRoID0gYXJlYS53aWR0aCAtIHg7CisJCQljb250cm9sc1tjb250cm9scy5sZW5ndGggLSAxXS5zZXRCb3VuZHMoeCwgYXJlYS55LCB3aWR0aCwgYXJlYS5oZWlnaHQpOworCQl9CisJfSBlbHNlIHsKKwkJaW50IGhlaWdodCA9IChpbnQpKHJhdGlvc1swXSAqIChhcmVhLmhlaWdodCAtIHNhc2hlcy5sZW5ndGggKiBzYXNod2lkdGgpIC8gdG90YWwpOworCQlpbnQgeSA9IGFyZWEueTsKKwkJY29udHJvbHNbMF0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgaGVpZ2h0KTsKKwkJeSArPSBoZWlnaHQ7CisJCWZvciAoaW50IGkgPSAxOyBpIDwgY29udHJvbHMubGVuZ3RoIC0gMTsgaSsrKSB7CisJCQlzYXNoZXNbaSAtIDFdLnNldEJvdW5kcyhhcmVhLngsIHksIGFyZWEud2lkdGgsIHNhc2h3aWR0aCk7CisJCQl5ICs9IHNhc2h3aWR0aDsKKwkJCWhlaWdodCA9IChpbnQpKHJhdGlvc1tpXSAqIChhcmVhLmhlaWdodCAtIHNhc2hlcy5sZW5ndGggKiBzYXNod2lkdGgpIC8gdG90YWwpOworCQkJY29udHJvbHNbaV0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgaGVpZ2h0KTsKKwkJCXkgKz0gaGVpZ2h0OworCQl9CisJCWlmIChjb250cm9scy5sZW5ndGggPiAxKSB7CisJCQlzYXNoZXNbc2FzaGVzLmxlbmd0aCAtIDFdLnNldEJvdW5kcyhhcmVhLngsIHksIGFyZWEud2lkdGgsIHNhc2h3aWR0aCk7CisJCQl5ICs9IHNhc2h3aWR0aDsKKwkJCWhlaWdodCA9IGFyZWEuaGVpZ2h0IC0geTsKKwkJCWNvbnRyb2xzW2NvbnRyb2xzLmxlbmd0aCAtIDFdLnNldEJvdW5kcyhhcmVhLngsIHksIGFyZWEud2lkdGgsIGhlaWdodCk7CisJCX0KKwl9Cit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudFZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudFZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTAwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Db250ZW50Vmlld2VyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworLyoqCisgKiBFZGl0YWJsZSB2aWV3ZXIgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4KKyAqIDxwPgorICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9ubHkgYnkgY2xpZW50cworICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5jb250ZW50Vmlld2VyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgorICogVGhlIHN1YmNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLCB3aGljaCB3aWxsIGJlIHVzZWQKKyAqIGF1dG9tYXRpY2FsbHkgdG8gaW5zdGFudGlhdGUgdGhlIHZpZXdlciB3aGVuIHJlcXVpcmVkLgorICogT25jZSBpbnN0YW50aWF0ZWQsIHtAbGluayAjaW5pdChDb21wb3NpdGUpfSBpcyBjYWxsZWQgdG8gY3JlYXRlCisgKiB0aGUgdmlld2VyJ3MgY29udHJvbHMuIFRoZW4ge0BsaW5rICNzZXRDb250ZW50KGJ5dGVbXSl9IGlzIGNhbGxlZCwKKyAqIG9uZSBvciBtb3JlIHRpbWVzLCB0byBjYXVzZSB0aGUgdmlld2VyIHRvIGRpc3BsYXkgcGFydGljdWxhcgorICogY29udGVudC4gRmluYWxseSwgd2hlbiB0aGUgdmlld2VyIGlzIG5vIGxvbmdlciBuZWVkZWQsIHtAbGluayAjZGlzcG9zZSgpfQorICogaXMgY2FsbGVkIHRvIGZyZWUgdXAgYW55IHJlc291cmNlcyB0aWVkIHVwIGJ5IHRoZSB2aWV3ZXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIFtpc3N1ZTogSXQncyB1bmNsZWFyIGhvdyB0aGVzZSBjb250ZW50IHZpZXdlcnMgYXJlIHVzZWQuCisgKiBJcyBpdCBqdXN0IHRoYXQgdGhlIFVJIHByb3ZpZGVzIGEgbGlzdCBvZiBhdmFpbGFibGUKKyAqIHZpZXdzIGZvciB0aGUgdXNlciB0byBtYWtlIGEgbWFudWFsIHNlbGVjdGlvbiBmcm9tLCByZWdhcmRsZXNzCisgKiBvZiB0aGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgdHJhZmZpYz9dCisgKiA8L3A+CisgKiBbaXNzdWU6IENTIC0gSWYgYSBDb250ZW50Vmlld2VyIGlzIGVkaXRhYmxlLCBkb2VzIHRoYXQgbWVhbiB3ZSBjYW4gZWRpdCB0aGUgCisgKiBieXRlcyBvZiB0aGUgbWVzc2FnZSBhbmQgcmVzZW5kIGl0IGFjcm9zcyB0aGUgd2lyZT8gIEhvdyBpcyBhbiBlZGl0YWJsZSBDb250ZW50Vmlld2VyCisgKiBoYW5kbGVkIGRpZmZlcmVudGx5IGJ5IHRoZSBmcmFtZXdvcms/IFBlcmhhcHMgYW4gZXhhbXBsZSBvZiB3aGF0IGFuIGVkaXRlYWJsZSB2aWV3ZXIgd291bGQgZG8uIF0KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRWaWV3ZXIgeworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29udGVudCB2aWV3ZXIgaW5zdGFuY2UuCisJICovCisJcHJvdGVjdGVkIENvbnRlbnRWaWV3ZXIoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBjb250cm9scyBmb3IgdGhpcyB2aWV3ZXIgYXMgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGNvbXBvc2l0ZS4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisJICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpOworCisJLyoqCisJICogU2V0cyB0aGUgY29udGVudCB0aGF0IHRoZSB2aWV3ZXIgc2hvdWxkIGRpc3BsYXkuCisJICogVGhlIHBhcmFtZXRlciBtYXkgYmUgbnVsbCBpZiBubyBjb250ZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgaXMgZm9yIGRpc3BsYXlpbmcgcmVxdWVzdC1yZXBvbnNlIG1lc3NhZ2VzLAorCSAqIHdoeSBub3QgcGFzcyBhbiBSZXF1ZXN0PyBUaGUgcHJvYmxlbSBhcyBpdCBzdGFuZHMgbm93IGlzIHRoYXQKKwkgKiBpdCBpcyB1bmNsZWFyIGZyb20gc3BlY3MgaG93IGNvbnRlbnQgdmlld2VycyByZWxhdGUgdG8gYW55dGhpbmcKKwkgKiBlbHNlIGhhdmluZyB0byBkbyB3aXRoIHRoZSBtb25pdG9yLl0KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGIgdGhlIGNvbnRlbnQgdG8gZGlzcGxheSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KKwkgKiBkaXNwbGF5IG5vdGhpbmcKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKTsKKworCS8qKgorCSAqIEdldCB0aGUgY29udGVudCBmcm9tIHRoZSB2aWV3ZXIuIFRoaXMgaXMgdXN1YWxseSBvbmx5IGludGVyZXN0aW5nIGlmIHRoZQorCSAqIGNvbnRlbnQgaGFzIGNoYW5nZWQuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGFuZAorCSAqIHJldHVybnMgbnVsbC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZnJvbSB0aGUgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovCisJcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRDb250ZW50KCk7CisKKwkvKioKKwkgKiBEaXNwb3NlcyB0aGlzIHZpZXdlciBhbmQgYW55IHVuZGVybHlpbmcgcmVzb3VyY2VzIHN1Y2ggYXMgYSBjb21wb3NpdGUuCisJICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVzZXIgc3dpdGNoZXMgdG8gdXNlIGFub3RoZXIKKwkgKiB2aWV3ZXIgb3IgdGhlIG1vbml0b3IgdmlldyBpcyBjbG9zZWQuIFRoZSBwYXJlbnQgY29tcG9zaXRlIHNob3VsZCBub3QKKwkgKiBiZSBkaXNwb3NlZCBzaW5jZSBpdCBtYXkgYmUgdXNlZCB0byBkaXNwbGF5IGFub3RoZXIgdmlld2VyLiAKKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisJICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBzcGVjaWFsaXplZCBjbGVhbnVwLgorCSAqIDwvcD4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogU2V0IHdoZXRoZXIgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGVkaXRhYmxlLCB0aGF0IGlzLCB0aGUgdXNlciBpcyBhYmxlIHRvCisJICogZWRpdCB0aGUgY29udGVudC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisJICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWxsb3dzIGluc3RhbmNlcworCSAqIHRvIGJlIG1hZGUgZWRpdGFibGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBlZGl0YWJsZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0cnVlIHRoZSBjb250ZW50IGNhbiBiZSBlZGl0ZWQsCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGVkaXRhYmxlLCB0aGF0IGlzLCB0aGUgdXNlciBpcyBhYmxlIHRvCisJICogZWRpdCB0aGUgY29udGVudC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisJICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWxsb3dzIGluc3RhbmNlcworCSAqIHRvIGJlIG1hZGUgZWRpdGFibGUuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHJ1ZSB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLAorCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yVUlDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yVUlDb3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlYTQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL01vbml0b3JVSUNvcmUuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47CisvKioKKyAqIE1haW4gY2xhc3MgZm9yIGFjY2VzcyB0byB0aGUgbW9uaXRvciBVSS4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLiBJdCBpcyBub3QgaW50ZW5kZWQKKyAqIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTW9uaXRvclVJQ29yZSB7CisJLyoqCisJICogQ2Fubm90IGNyZWF0ZSBNb25pdG9yVUlDb3JlIC0gdXNlIHN0YXRpYyBtZXRob2RzLgorCSAqLworCXByaXZhdGUgTW9uaXRvclVJQ29yZSgpIHsKKwkJLy8gY2FuJ3QgY3JlYXRlCisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVxdWVzdHMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgVENQL0lQCisJICogbW9uaXRvciB2aWV3LgorCSAqCisJICogQHJldHVybiBhbiBhcnJheSBvZiByZXF1ZXN0cworCSAqLworCXB1YmxpYyBzdGF0aWMgUmVxdWVzdFtdIGdldFJlcXVlc3RzKCkgeworCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVxdWVzdHMoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4YjZjMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDIxIEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPlRDUC9JUCBtb25pdG9yIFVJPC9wPgorPHRhYmxlIHdpZHRoPSI1MDAiPgorPHRyPgorPHRkPgorPHA+VGhlIENvbnRlbnRWaWV3ZXIgY2xhc3MgaXMgcHJvdmlkZWQgdG8KK2ltcGxlbWVudCB0aGUgdmlld2VycyBleHRlbnNpb24gcG9pbnQgdGhhdCBhbGxvd3MgZXh0ZXJuYWwgcGx1Z2lucyB0byBwcm92aWRlCithIHZpZXcgZm9yIHZpZXdpbmcgcmVxdWVzdCBhbmQgcmVzcG9uc2UgZGF0YSBjb250ZW50IGluIHRoZSBtb25pdG9yIHZpZXcuCis8L3A+Cis8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDFhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGh0bWw+Cis8aGVhZD4KKwk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KKwk8bWV0YQorCQluYW1lPSJyb290IgorCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+CisJPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxhYnN0cmFjdD5UQ1AvSVAgbW9uaXRvciBVSTwvYWJzdHJhY3Q+CisKKzxwPlRoZSBDb250ZW50Vmlld2VyIGNsYXNzIGlzIHByb3ZpZGVkIHRvCitpbXBsZW1lbnQgdGhlIHZpZXdlcnMgZXh0ZW5zaW9uIHBvaW50IHRoYXQgYWxsb3dzIGV4dGVybmFsIHBsdWdpbnMgdG8gcHJvdmlkZQorYSB2aWV3IGZvciB2aWV3aW5nIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGRhdGEgY29udGVudCBpbiB0aGUgbW9uaXRvciB2aWV3LgorPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9GaWx0ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvRmlsdGVyQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0ZDgzZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvRmlsdGVyQWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLklDb250ZW50RmlsdGVyOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIEZpbHRlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJcHJvdGVjdGVkIFZpZXdlck1hbmFnZXIgdm07CisJcHJvdGVjdGVkIElDb250ZW50RmlsdGVyIGZpbHRlcjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVkOworCisJcHVibGljIEZpbHRlckFjdGlvbihWaWV3ZXJNYW5hZ2VyIHZtLCBJQ29udGVudEZpbHRlciBmaWx0ZXIpIHsKKwkJc3VwZXIoZmlsdGVyLmdldE5hbWUoKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQl0aGlzLnZtID0gdm07CisJCXRoaXMuZmlsdGVyID0gZmlsdGVyOworCX0KKwkKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWlmICghaXNDaGVja2VkKCkpCisJCQl2bS5yZW1vdmVGaWx0ZXIoZmlsdGVyKTsKKwkJZWxzZQorCQkJdm0uYWRkRmlsdGVyKGZpbHRlcik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb2RpZnlNZXNzYWdlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmMGY1OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKKy8qKgorICogTW9kaWZ5IHRoZSBzZWxlY3RlZCBtZXNzYWdlLiBDcmVhdGVzIGEgbmV3IHJlc2VuZHJlcXVlc3QgYW5kIGFkZHMgaXQKKyAqIHRvIHRoZSB0cmVlLgorICovCitwdWJsaWMgY2xhc3MgTW9kaWZ5TWVzc2FnZUFjdGlvbiBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGV7CisJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKKwkJCU9iamVjdCBlbGVtZW50ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgUmVxdWVzdCkgeworCQkJCVJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIGVsZW1lbnQ7CisJCQkJUmVzZW5kSFRUUFJlcXVlc3QgbmV3UmVxID0gTW9uaXRvck1hbmFnZXIuY3JlYXRlUmVzZW5kUmVxdWVzdChyZXEpOworCQkJCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkUmVzZW5kUmVxdWVzdChyZXEsIG5ld1JlcSk7CisJCQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gTW9uaXRvclZpZXcudmlldy50cmVlVmlld2VyOworCQkJCXRyZWVWaWV3ZXIuYWRkKHJlcSwgbmV3UmVxKTsKKwkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdSZXEpLCBmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uMikgeworCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDVlYjIwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKKy8qKgorICogQ29udGVudCBwcm92aWRlciBmb3IgdGhlIG1vbml0b3Igc2VydmVyIHZpZXcuCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOworCisJLyoqCisJICogUHJveHlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4KKwkgKiA8cD4KKwkgKiBbSXNzdWU6IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHRha2UgYSBWaWV3ZXIsCisJICogcmVuYW1lZCBhbmQgcmVwdXJwb3NlZCB0byBkaXNjb25uZWN0IGEgY29udGVudCBwcm92aWRlciBmcm9tCisJICogYSB2aWV3ZXIuIFRoaXMgaXMgb3ZlciBhbmQgYWJvdmUgd2hhdCBpbnB1dENoYW5nZWQgZG9lcywKKwkgKiB3aGljaCBpcyBkaXNjb25uZWN0aW5nIGEgY29udGVudCBwcm92aWRlciBmcm9tIHRoZSB2aWV3ZXIncworCSAqIGlucHV0IChidXQgbm90IHRoZSB2aWV3ZXIgaXRzZWxmKS4KKwkgKiBdCisJICogPC9wPgorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorCSAqIDxwPgorCSAqIE5vdGU6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIAorCSAqIDxjb2RlPklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzPC9jb2RlPiBpcworCSAqIHRoYXQgPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIAorCSAqIHRyZWUgdmlld2VyJ3Mgcm9vdCBlbGVtZW50cywgd2hlcmVhcyA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gaXMgdXNlZAorCSAqIHRvIG9idGFpbiB0aGUgY2hpbGRyZW4gb2YgYSBnaXZlbiBub2RlIGluIHRoZSB0cmVlCisJICogKGluY2x1ZGluZyBhIHJvb3QpLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBbSXNzdWU6IERvbid0IGtub3cgd2hhdCBhYm92ZSBpcyB0cnlpbmcgdG8gc2F5LgorCSAqICBTZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMuCisJICogXQorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50CisJICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBjaGlsZCBlbGVtZW50cyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5PYmplY3Q8L2NvZGU+KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpIHsKKwkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZWxlbWVudDsKKwkJCUxpc3Q8UmVxdWVzdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVxdWVzdD4oKTsKKwkJCVJlcXVlc3RbXSByZXF1ZXN0cyA9IE1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlcXVlc3RzKCk7CisJCQlpZiAocmVxdWVzdHMgIT0gbnVsbCkgeworCQkJCWZvciAoUmVxdWVzdCByZXEgOiByZXF1ZXN0cykgeworCQkJCQlpZiAoKHJlcS5nZXRMb2NhbFBvcnQoKSA9PSBpbi5pbnRWYWx1ZSgpKQorCQkJCQkJCSYmICEocmVxIGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QpKQorCQkJCQkJbGlzdC5hZGQocmVxKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7CisJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKKwkJCVJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIGVsZW1lbnQ7CisJCQlSZXNlbmRIVFRQUmVxdWVzdFtdIHJyID0gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNlbmRSZXF1ZXN0cyhyZXEpOworCQkJTGlzdDxSZXF1ZXN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZXF1ZXN0PigpOworCQkJaWYgKHJyICE9IG51bGwpIHsKKwkJCQlmb3IgKFJlc2VuZEhUVFBSZXF1ZXN0IHIgOiBycikKKwkJCQkJbGlzdC5hZGQocik7CisJCQl9CisJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUKKwkgKiBnaXZlbiBlbGVtZW50LiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwKKwkgKiBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKFJPT1QuZXF1YWxzKGVsZW1lbnQpKSB7CisJCQlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisJCQlSZXF1ZXN0W10gcmVxdWVzdHMgPSBNb25pdG9yVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXF1ZXN0cygpOworCQkJaWYgKHJlcXVlc3RzICE9IG51bGwpIHsKKwkJCQlmb3IgKFJlcXVlc3QgcmVxIDogIHJlcXVlc3RzKSB7CisJCQkJCUludGVnZXIgaW4gPSBuZXcgSW50ZWdlcihyZXEuZ2V0TG9jYWxQb3J0KCkpOworCQkJCQlpZiAoIWxpc3QuY29udGFpbnMoaW4pKQorCQkJCQkJbGlzdC5hZGQoaW4pOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKKwkJfQorCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7CisJfQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiAKKwkgKiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gCisJICovCisJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgeworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKQorCQkJCXJldHVybiBST09UOworCQkJUmVxdWVzdCBjYWxsID0gKFJlcXVlc3QpIGVsZW1lbnQ7CisJCQlpZiAoY2FsbCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSB7CisJCQkJUmVzZW5kSFRUUFJlcXVlc3QgY2FsbFJlc2VuZCA9IChSZXNlbmRIVFRQUmVxdWVzdCkgY2FsbDsKKwkJCQlSZXF1ZXN0IHBhcmVudCA9IGNhbGxSZXNlbmQuZ2V0T3JpZ2luYWxSZXF1ZXN0KCk7CisJCQkJaWYgKHBhcmVudCAhPSBudWxsKQorCQkJCQlyZXR1cm4gcGFyZW50OworCQkJfQorCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGNhbGwuZ2V0TG9jYWxQb3J0KCkpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IGhhcyBjaGlsZHJlbi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KQorCQkJcmV0dXJuIE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzZW5kUmVxdWVzdHMoKFJlcXVlc3QpIGVsZW1lbnQpLmxlbmd0aCA+IDA7IAorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0CisJICogaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQgZWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJLy8gZG8gbm90aGluZworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vbml0b3JWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vbml0b3JWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzODg1MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9uaXRvclZpZXcuamF2YQpAQCAtMCwwICsxLDU2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JQ29udGVudEZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3JQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVJlcXVlc3RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuKjsKKy8qKgorICogVmlldyBvZiBUQ1AvSVAgYWN0aXZpdHkuCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKKwlwcm90ZWN0ZWQgVHJlZSB0cmVlOworCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7CisJcHJvdGVjdGVkIE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKKworCXByb3RlY3RlZCBJUmVxdWVzdExpc3RlbmVyIGxpc3RlbmVyOworCXByb3RlY3RlZCBWaWV3ZXJNYW5hZ2VyIHZtOworCXByb3RlY3RlZCBMaXN0IHJlcXVlc3RWaWV3ZXJzOworCXByb3RlY3RlZCBMaXN0IHJlc3BvbnNlVmlld2VyczsKKworCXByb3RlY3RlZCBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQ7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3IjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZJRVdFUiA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmJ5dGUiOworCisJcHJvdGVjdGVkIElBY3Rpb24gaHR0cEhlYWRlckFjdGlvbjsKKwlwcm90ZWN0ZWQgSUFjdGlvbiBwcmVmZXJlbmNlQWN0aW9uOworCQorCXB1YmxpYyBzdGF0aWMgTW9uaXRvclZpZXcgdmlldzsKKwkKKwlwcm90ZWN0ZWQgUmVxdWVzdCBjdXJyZW50UmVxdWVzdCA9IG51bGw7CisJcHJvdGVjdGVkIFN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IG51bGw7CisKKwkvKioKKwkgKiBNb25pdG9yVmlldyBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBNb25pdG9yVmlldygpIHsKKwkJc3VwZXIoKTsKKwkJdmlldyA9IHRoaXM7CisJCQorCQkvLyB0cnkgc3BlY2lmaWVkIGZvcm1hdCwgYW5kIGZhbGwgYmFjayB0byBzdGFuZGFyZCBmb3JtYXQKKwkJdHJ5IHsKKwkJCWZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KE1lc3NhZ2VzLnZpZXdEYXRlRm9ybWF0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJoOm1tLnMuUyBhIik7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBkb1JlcXVlc3RBZGRlZChmaW5hbCBSZXF1ZXN0IHJyKSB7CisJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKCEocnIgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCkpIHsKKwkJCQkgIHRyZWVWaWV3ZXIucmVmcmVzaChNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKKwkJCQkgIGlmICghTW9uaXRvclVJUGx1Z2luLmdldFBpblZpZXdQcmVmZXJlbmNlKCkpCisJCQkJCSAgdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocnIpLCB0cnVlKTsKKwkJCQl9CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyB2b2lkIGRvUmVxdWVzdENoYW5nZWQoZmluYWwgUmVxdWVzdCBycikgeworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmICh0cmVlVmlld2VyID09IG51bGwpCisJCQkJCXJldHVybjsKKwkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisJCQkJCisJCQkJdHJlZVZpZXdlci5yZWZyZXNoKHJyKTsKKwkJCQlpZiAoIXNlbC5pc0VtcHR5KCkpCisJCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7CisJCQl9CisJCX0pOworCX0KKworCS8qKgorCSAqIENsZWFyIHRoZSB2aWV3LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgeworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOworCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb24oUmVxdWVzdCByZXF1ZXN0KSB7CisJCWlmICh0cmVlVmlld2VyICE9IG51bGwpCisJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihyZXF1ZXN0KSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJU2FzaEZvcm0gc2FzaEZwYXJlbnQgPSBuZXcgU2FzaEZvcm0ocGFyZW50LCBTV1QuVkVSVElDQUwpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gNDsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDQ7CisJCXNhc2hGcGFyZW50LnNldExheW91dChsYXlvdXQpOworCQlzYXNoRnBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzYXNoRnBhcmVudCwgQ29udGV4dElkcy5WSUVXKTsKKwkJCisJCS8vIGNyZWF0ZSB0cmVlIHBhbmVsCisJCUNvbXBvc2l0ZSB0cmVlUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHNhc2hGcGFyZW50LCBTV1QuTk9ORSk7CisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCXRyZWVQYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOworCQlkYXRhLmhlaWdodEhpbnQgPSAxMTA7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQl0cmVlUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkKKwkJdHJlZSA9IG5ldyBUcmVlKHRyZWVQYW5lbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCS8vZGF0YS53aWR0aEhpbnQgPSAxMjA7CisJCXRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQljb250ZW50UHJvdmlkZXIgPSBuZXcgTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIoKTsKKwkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKKwkJdHJlZVZpZXdlci5zZXRJbnB1dChNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKKwkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUcmVlTGFiZWxQcm92aWRlcigpKTsKKworCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRyZWUsIENvbnRleHRJZHMuVklFV19UUkVFKTsKKwkKKwkJQ29tcG9zaXRlIGRldGFpbHNQYW5lbCA9IG5ldyBDb21wb3NpdGUodHJlZVBhbmVsLCBTV1QuTk9ORSk7CisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDI7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWRldGFpbHNQYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKKwkJZGF0YS53aWR0aEhpbnQgPSAyMDA7CisJCWRldGFpbHNQYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRldGFpbHNQYW5lbCwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdUaW1lLCAiIikpOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKKworCQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwoZGV0YWlsc1BhbmVsLCBTV1QuTk9ORSk7CisJCWxhYmVsMi5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZVRpbWUsICIiKSk7CisJCWxhYmVsMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKKwkJCisJCWZpbmFsIExhYmVsIGxhYmVsMyA9IG5ldyBMYWJlbChkZXRhaWxzUGFuZWwsIFNXVC5OT05FKTsKKwkJbGFiZWwzLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1R5cGUsICIiKSk7CisJCWxhYmVsMy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKKwkJCisJCS8vIGNyZWF0ZSBjZW50ZXIgYW5kIHJpZ2h0IHBhbmVscworCQlTYXNoRm9ybSBzYXNoRmNoaWxkID0gbmV3IFNhc2hGb3JtKHNhc2hGcGFyZW50LCBTV1QuSE9SSVpPTlRBTCk7CisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMjsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDQ7CisJCXNhc2hGY2hpbGQuc2V0TGF5b3V0KGxheW91dCk7CisJCXNhc2hGcGFyZW50LnNldFdlaWdodHMobmV3IGludFtdIHsgMzAsIDcwIH0pOworCQkKKwkJLy8gcmVxdWVzdCBwYW5lbAorCQlDb21wb3NpdGUgcmVxdWVzdCA9IG5ldyBDb21wb3NpdGUoc2FzaEZjaGlsZCwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMzsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCXJlcXVlc3Quc2V0TGF5b3V0KGxheW91dCk7CisJCXJlcXVlc3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCQorCQlDb21wb3NpdGUgcmVxdWVzdEhlYWRlciA9IG5ldyBDb21wb3NpdGUocmVxdWVzdCwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAyOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisJCXJlcXVlc3RIZWFkZXIuc2V0TGF5b3V0KGxheW91dCk7CisJCXJlcXVlc3RIZWFkZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCWZpbmFsIExhYmVsIHJlcXVlc3RMYWJlbCA9IG5ldyBMYWJlbChyZXF1ZXN0SGVhZGVyLCBTV1QuTk9ORSk7CisJCXJlcXVlc3RMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXF1ZXN0LCAiIikpOworCQlyZXF1ZXN0TGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQorCQlmaW5hbCBDb21ibyByZXF1ZXN0Vmlld2VyQ29tYm8gPSBuZXcgQ29tYm8ocmVxdWVzdEhlYWRlciwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKKwkJZGF0YS52ZXJ0aWNhbFNwYW4gPSAyOworCQlyZXF1ZXN0Vmlld2VyQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCWZpbmFsIExhYmVsIHJlcXVlc3RTaXplTGFiZWwgPSBuZXcgTGFiZWwocmVxdWVzdEhlYWRlciwgU1dULk5PTkUpOworCQlyZXF1ZXN0U2l6ZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1NpemUsICIiKSk7CisJCXJlcXVlc3RTaXplTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQorCQkvLyByZXNwb25zZSBwYW5lbAorCQlDb21wb3NpdGUgcmVzcG9uc2UgPSBuZXcgQ29tcG9zaXRlKHNhc2hGY2hpbGQsIFNXVC5OT05FKTsKKwkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDM7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlyZXNwb25zZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJcmVzcG9uc2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisKKwkJQ29tcG9zaXRlIHJlc3BvbnNlSGVhZGVyID0gbmV3IENvbXBvc2l0ZShyZXNwb25zZSwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAyOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisJCXJlc3BvbnNlSGVhZGVyLnNldExheW91dChsYXlvdXQpOworCQlyZXNwb25zZUhlYWRlci5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJZmluYWwgTGFiZWwgcmVzcG9uc2VMYWJlbCA9IG5ldyBMYWJlbChyZXNwb25zZUhlYWRlciwgU1dULk5PTkUpOworCQlyZXNwb25zZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlLCAiIikpOworCQlyZXNwb25zZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQkKKwkJZmluYWwgQ29tYm8gcmVzcG9uc2VWaWV3ZXJDb21ibyA9IG5ldyBDb21ibyhyZXNwb25zZUhlYWRlciwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKKwkJZGF0YS52ZXJ0aWNhbFNwYW4gPSAyOworCQlyZXNwb25zZVZpZXdlckNvbWJvLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlmaW5hbCBMYWJlbCByZXNwb25zZVNpemVMYWJlbCA9IG5ldyBMYWJlbChyZXNwb25zZUhlYWRlciwgU1dULk5PTkUpOworCQlyZXNwb25zZVNpemVMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCAiIikpOworCQlyZXNwb25zZVNpemVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJCisJCS8vIHZpZXdlciBtYW5hZ2VyCisJCXZtID0gbmV3IFZpZXdlck1hbmFnZXIocmVxdWVzdCwgcmVzcG9uc2UpOworCQlyZXF1ZXN0Vmlld2VycyA9IHZtLmdldFJlcXVlc3RWaWV3ZXJzKCk7CisJCXJlc3BvbnNlVmlld2VycyA9IHZtLmdldFJlc3BvbnNlVmlld2VycygpOworCQkKKwkJLy8gc2V0IHVwIHRoZSB2aWV3ZXIgY29tYm8gYm94ZXMKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSByZXF1ZXN0Vmlld2Vycy5pdGVyYXRvcigpOworCQlpbnQgY3RyID0gMDsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCXJlcXVlc3RWaWV3ZXJDb21iby5hZGQodmlld2VyLmdldExhYmVsKCksIGN0cik7CisJCQlpZiAodmlld2VyLmdldElkKCkuZXF1YWxzKERFRkFVTFRfVklFV0VSKSkgeworCQkJCXJlcXVlc3RWaWV3ZXJDb21iby5zZWxlY3QoY3RyKTsgCisJCQkJdm0uc2V0UmVxdWVzdFZpZXdlcih2aWV3ZXIpOworCQkJfQorCQkJY3RyKys7CisJCX0KKwkJcmVxdWVzdFZpZXdlckNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlWaWV3ZXIgdmlld2VyID0gKFZpZXdlcikgcmVxdWVzdFZpZXdlcnMuZ2V0KHJlcXVlc3RWaWV3ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKKwkJCQlpZiAoY3VycmVudFJlcXVlc3QgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gbnVsbCkKKwkJCQkJY3VycmVudFJlcXVlc3Quc2V0UHJvcGVydHkoInJlcXVlc3Qtdmlld2VyIiwgdmlld2VyLmdldElkKCkpOworCQkJCXZtLnNldFJlcXVlc3RWaWV3ZXIodmlld2VyKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfSk7CisJCXJlcXVlc3RIZWFkZXIubGF5b3V0KHRydWUpOworCQkKKwkJaXRlcmF0b3IgPSByZXNwb25zZVZpZXdlcnMuaXRlcmF0b3IoKTsKKwkJY3RyID0gMDsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCXJlc3BvbnNlVmlld2VyQ29tYm8uYWRkKHZpZXdlci5nZXRMYWJlbCgpLCBjdHIpOworCQkJaWYgKHZpZXdlci5nZXRJZCgpLmVxdWFscyhERUZBVUxUX1ZJRVdFUikpIHsKKwkJCQlyZXNwb25zZVZpZXdlckNvbWJvLnNlbGVjdChjdHIpOyAKKwkJCQl2bS5zZXRSZXNwb25zZVZpZXdlcih2aWV3ZXIpOworCQkJfQorCQkJY3RyKys7CisJCX0KKwkJcmVzcG9uc2VWaWV3ZXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIHJlc3BvbnNlVmlld2Vycy5nZXQocmVzcG9uc2VWaWV3ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKKwkJCQlpZiAoY3VycmVudFJlcXVlc3QgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gbnVsbCkKKwkJCQkJY3VycmVudFJlcXVlc3Quc2V0UHJvcGVydHkoInJlc3BvbnNlLXZpZXdlciIsIHZpZXdlci5nZXRJZCgpKTsKKwkJCQl2bS5zZXRSZXNwb25zZVZpZXdlcih2aWV3ZXIpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9KTsKKwkJcmVzcG9uc2VIZWFkZXIubGF5b3V0KHRydWUpOworCisJCS8vIHNlbGVjdGlvbiBsaXN0ZW5lcgorCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKworCQkJCWN1cnJlbnRSZXF1ZXN0ID0gbnVsbDsKKwkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKwkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOworCQkJCQljdXJyZW50U2VsZWN0aW9uID0gc2VsOworCQkJCQlPYmplY3Qgb2JqID0gc2VsLml0ZXJhdG9yKCkubmV4dCgpOworCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUmVxdWVzdCkKKwkJCQkJCWN1cnJlbnRSZXF1ZXN0ID0gKFJlcXVlc3QpIG9iajsKKwkJCQl9CisJCisJCQkJaWYgKGN1cnJlbnRSZXF1ZXN0ICE9IG51bGwpIHsKKwkJCQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VGltZSwgZm9ybWF0LmZvcm1hdChjdXJyZW50UmVxdWVzdC5nZXREYXRlKCkpKSk7CisJCisJCQkJCWlmIChjdXJyZW50UmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKSA9PSAtMSkKKwkJCQkJCWxhYmVsMi5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZVRpbWUsICIiKSk7CisJCQkJCWVsc2UgeworCQkJCQkJU3RyaW5nIHRpbWUgPSBOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lRm9ybWF0LCBjdXJyZW50UmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKSArICIiKTsKKwkJCQkJCWxhYmVsMi5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZVRpbWUsIHRpbWUpKTsKKwkJCQkJfQorCQkJCQlsYWJlbDMuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VHlwZSwgY3VycmVudFJlcXVlc3QuZ2V0UHJvdG9jb2woKSkpOworCQorCQkJCQkvLyByZXF1ZXN0IGluZm9ybWF0aW9uCisJCQkJCXJlcXVlc3RMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXF1ZXN0LCAibG9jYWxob3N0OiIgKyBjdXJyZW50UmVxdWVzdC5nZXRMb2NhbFBvcnQoKSkpOworCQkJCQlyZXF1ZXN0U2l6ZUxhYmVsLnNldFRleHQoZ2V0U2l6ZVN0cmluZyhjdXJyZW50UmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuQ09OVEVOVCksIGN1cnJlbnRSZXF1ZXN0LmdldFJlcXVlc3QoUmVxdWVzdC5BTEwpKSk7CisJCisJCQkJCS8vIHJlc3BvbnNlIGluZm9ybWF0aW9uCisJCQkJCXJlc3BvbnNlTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2UsIGN1cnJlbnRSZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSArICI6IiArIGN1cnJlbnRSZXF1ZXN0LmdldFJlbW90ZVBvcnQoKSkpOworCQkJCQlyZXNwb25zZVNpemVMYWJlbC5zZXRUZXh0KGdldFNpemVTdHJpbmcoY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5DT05URU5UKSwgY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5BTEwpKSk7CisJCQkJCQorCQkJCQl2bS5zZXRSZXF1ZXN0KGN1cnJlbnRSZXF1ZXN0KTsKKwkJCQkJCisJCQkJCVZpZXdlciB2aWV3ZXIgPSB2bS5maW5kVmlld2VyKChTdHJpbmcpIGN1cnJlbnRSZXF1ZXN0LmdldFByb3BlcnR5KCJyZXF1ZXN0LXZpZXdlciIpKTsKKwkJCQkJaWYgKHZpZXdlciA9PSBudWxsKQorCQkJCQkJdmlld2VyID0gdm0uZmluZFZpZXdlcihERUZBVUxUX1ZJRVdFUik7CisJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJdm0uc2V0UmVxdWVzdFZpZXdlcih2aWV3ZXIpOworCQkJCQkJcmVxdWVzdFZpZXdlckNvbWJvLnNlbGVjdChyZXF1ZXN0Vmlld2Vycy5pbmRleE9mKHZpZXdlcikpOworCQkJCQl9CisJCQkJCQorCQkJCQl2aWV3ZXIgPSB2bS5maW5kVmlld2VyKChTdHJpbmcpIGN1cnJlbnRSZXF1ZXN0LmdldFByb3BlcnR5KCJyZXNwb25zZS12aWV3ZXIiKSk7CisJCQkJCWlmICh2aWV3ZXIgPT0gbnVsbCAmJiBjdXJyZW50UmVxdWVzdC5nZXROYW1lKCkgIT0gbnVsbCkKKwkJCQkJCXZpZXdlciA9IHZtLmdldERlZmF1bHRWaWV3ZXIoY3VycmVudFJlcXVlc3QuZ2V0TmFtZSgpKTsKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCQl2bS5zZXRSZXNwb25zZVZpZXdlcih2aWV3ZXIpOworCQkJCQkJcmVzcG9uc2VWaWV3ZXJDb21iby5zZWxlY3QocmVzcG9uc2VWaWV3ZXJzLmluZGV4T2Yodmlld2VyKSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdUaW1lLCAiIikpOworCQkJCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCAiIikpOworCQkJCQlyZXF1ZXN0TGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVxdWVzdCwgIiIpKTsKKwkJCQkJcmVxdWVzdFNpemVMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCAiIikpOworCQkJCQlyZXNwb25zZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlLCAiIikpOworCQkJCQlyZXNwb25zZVNpemVMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCAiIikpOworCQkJCQl2bS5zZXRSZXF1ZXN0KGN1cnJlbnRSZXF1ZXN0KTsKKwkJCQl9CisJCQl9CisJCX0pOworCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7CisJCQorCQkvLyBjcmVhdGUgYSBtZW51IG1hbmFnZXIgZm9yIGEgY29udGV4dCBtZW51CisJCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7CisJCW1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7CisJCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisJCQkJbWVudS5hZGQocHJlZmVyZW5jZUFjdGlvbik7CisJCQl9CisJCX0pOworCisJCS8vIGNyZWF0ZSB0aGUgbWVudQorCQlNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudSh0cmVlVmlld2VyLmdldENvbnRyb2woKSk7CisJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCQorCQkvLyByZWdpc3RlciB0aGUgbWVudSB3aXRoIHRoZSBwbGF0Zm9ybQorCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWFuYWdlciwgdHJlZVZpZXdlcik7CisgICAgICAgIAorCQlpbml0aWFsaXplQWN0aW9ucygpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNpemVTdHJpbmcoYnl0ZVtdIGEsIGJ5dGVbXSBiKSB7CisJCVN0cmluZyBhYSA9ICIwIjsKKwkJU3RyaW5nIGJiID0gIjAiOworCQlpZiAoYSAhPSBudWxsKQorCQkJYWEgPSBhLmxlbmd0aCArICIiOworCQlpZiAoYiAhPSBudWxsKQorCQkJYmIgPSBiLmxlbmd0aCArICIiOworCQlTdHJpbmcgc2l6ZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplRm9ybWF0LCBuZXcgT2JqZWN0W10geyBhYSwgYmJ9KTsKKwkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCBzaXplKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJCXRyZWVWaWV3ZXIgPSBudWxsOworCQl2aWV3ID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSB0b29sLWJhciBhbmQgbWVudSBhY3Rpb25zLgorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBY3Rpb25zKCkgeworCQlmaW5hbCBJQWN0aW9uIHBpbkFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJYm9vbGVhbiBwaW4gPSBNb25pdG9yVUlQbHVnaW4uZ2V0UGluVmlld1ByZWZlcmVuY2UoKTsKKwkJCQkJCU1vbml0b3JVSVBsdWdpbi5zZXRQaW5WaWV3UHJlZmVyZW5jZSghcGluKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9OworCQlwaW5BY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7CisJCXBpbkFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25QaW4pOworCQlwaW5BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLklNR19FTENMX1BJTikpOworCQlwaW5BY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0NMQ0xfUElOKSk7CisJCXBpbkFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRExDTF9QSU4pKTsKKwkJCisJCQorCQlmaW5hbCBJQWN0aW9uIHNvcnRCeVJlc3BvbnNlVGltZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJaWYgKHRyZWVWaWV3ZXIuZ2V0Q29tcGFyYXRvcigpID09IG51bGwpIHsKKwkJCQkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgUmVxdWVzdENvbXBhcmF0b3IoKSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXNldENoZWNrZWQoZmFsc2UpOworCQkJCQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihudWxsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9OworCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7CisJCXNvcnRCeVJlc3BvbnNlVGltZUFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25Tb3J0QnlSZXNwb25zZVRpbWUpOworCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLklNR19FTENMX1NPUlRfUkVTUE9OU0VfVElNRSkpOworCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0NMQ0xfU09SVF9SRVNQT05TRV9USU1FKSk7CisJCXNvcnRCeVJlc3BvbnNlVGltZUFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRExDTF9TT1JUX1JFU1BPTlNFX1RJTUUpKTsKKwkKKwkJSUFjdGlvbiBjbGVhckFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuY2xlYXJSZXF1ZXN0cygpOworCQkJCWNsZWFyKCk7CisJCQl9CisJCX07CisJCWNsZWFyQWN0aW9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbkNsZWFyVG9vbFRpcCk7CisJCWNsZWFyQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRUxDTF9DTEVBUikpOworCQljbGVhckFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfQ0xDTF9DTEVBUikpOworCQljbGVhckFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRExDTF9DTEVBUikpOworCisJCWh0dHBIZWFkZXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCWJvb2xlYW4gYiA9IHZtLmdldERpc3BsYXlIZWFkZXJJbmZvKCk7CisJCQkJCQl2bS5zZXREaXNwbGF5SGVhZGVySW5mbyghYik7CisJCQkJCQlzZXRDaGVja2VkKCFiKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9OworCQlodHRwSGVhZGVyQWN0aW9uLnNldENoZWNrZWQodm0uZ2V0RGlzcGxheUhlYWRlckluZm8oKSk7CisJCWh0dHBIZWFkZXJBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TaG93SGVhZGVyKTsKKworCQlwcmVmZXJlbmNlQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlzaG93UHJlZmVyZW5jZVBhZ2UoKTsKKwkJCX0KKwkJfTsKKwkJcHJlZmVyZW5jZUFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb3BlcnRpZXMpOworCQkKKwkJCisJCUlUb29sQmFyTWFuYWdlciB0Ym0gPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpOworCQl0Ym0uYWRkKHNvcnRCeVJlc3BvbnNlVGltZUFjdGlvbik7CisJCXRibS5hZGQoY2xlYXJBY3Rpb24pOworCQl0Ym0uYWRkKHBpbkFjdGlvbik7CisJCQorCQlJQ29udGVudEZpbHRlcltdIGZpbHRlcnMgPSBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudEZpbHRlcnMoKTsKKwkJSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0TWVudU1hbmFnZXIoKTsKKwkJbWVudU1hbmFnZXIuYWRkKGh0dHBIZWFkZXJBY3Rpb24pOworCQlmb3IgKElDb250ZW50RmlsdGVyIGNmIDogZmlsdGVycykgeworCQkJRmlsdGVyQWN0aW9uIGFjdGlvbiA9IG5ldyBGaWx0ZXJBY3Rpb24odm0sIGNmKTsKKwkJCW1lbnVNYW5hZ2VyLmFkZChhY3Rpb24pOworCQl9CisJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQltZW51TWFuYWdlci5hZGQocHJlZmVyZW5jZUFjdGlvbik7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ByZWZlcmVuY2VQYWdlKCkgeworCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOworCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQcmVmZXJlbmNlUGFnZSIpLmZpbmRTdWJOb2RlKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5wcmVmZXJlbmNlUGFnZSIpOworCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyMiA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcigpOworCQltYW5hZ2VyMi5hZGRUb1Jvb3Qobm9kZSk7CisJCQorCQlmaW5hbCBQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmVmZXJlbmNlRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpLCBtYW5hZ2VyMik7CisJCWZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhbltdIHsgZmFsc2UgfTsKKwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZGlhbG9nLmNyZWF0ZSgpOworCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKKwkJCQkJcmVzdWx0WzBdID0gdHJ1ZTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiByZXN1bHRbMF07CisJfQorCisJLyoqCisJICogT3BlbiBhIHJlcXVlc3QuCisJICogCisJICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbihmaW5hbCBSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IE1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOworCQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwkJCQkJCisJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOworCQkJCQkKKwkJCQkJSVZpZXdQYXJ0IHZpZXcyID0gcGFnZS5maW5kVmlldyhWSUVXX0lEKTsKKwkJCQkJCisJCQkJCWlmICh2aWV3MiAhPSBudWxsKQorCQkJCQkJcGFnZS5icmluZ1RvVG9wKHZpZXcyKTsKKwkJCQkJZWxzZQorCQkJCQkJcGFnZS5zaG93VmlldyhWSUVXX0lEKTsKKwkJCQkJCisJCQkJCWlmICh2aWV3ICE9IG51bGwgJiYgIU1vbml0b3JVSVBsdWdpbi5nZXRQaW5WaWV3UHJlZmVyZW5jZSgpKQorCQkJCQkJdmlldy5zZXRTZWxlY3Rpb24ocmVxdWVzdCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igb3BlbmluZyBUQ1AvSVAgdmlldyIsIGUpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCWlmICh0cmVlICE9IG51bGwpCisJCQl0cmVlLnNldEZvY3VzKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9SZXF1ZXN0Q29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9SZXF1ZXN0Q29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmN2I2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1JlcXVlc3RDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKKworcHVibGljIGNsYXNzIFJlcXVlc3RDb21wYXJhdG9yIGV4dGVuZHMgVmlld2VyQ29tcGFyYXRvciB7CisJLyoKKwkgKiBAc2VlIFZpZXdlclNvcnRlciNjb21wYXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgbzEsIE9iamVjdCBvMikgeworCQlpZiAobzEgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIG8yIGluc3RhbmNlb2YgUmVxdWVzdCkgeworCQkJUmVxdWVzdCByMSA9IChSZXF1ZXN0KSBvMTsKKwkJCVJlcXVlc3QgcjIgPSAoUmVxdWVzdCkgbzI7CisJCQlpZiAocjEuZ2V0UmVzcG9uc2VUaW1lKCkgPCByMi5nZXRSZXNwb25zZVRpbWUoKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG8xLCBvMik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVzZW5kTWVzc2FnZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9SZXNlbmRNZXNzYWdlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmMDRkZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVzZW5kTWVzc2FnZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKKy8qKgorICogUmVzZW5kcyB0aGUgc2VsZWN0ZWQgcmVxdWVzdCBhbmQgYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIHRyZWUuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNlbmRNZXNzYWdlQWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZXsKKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKKwkJCU9iamVjdCBlbGVtZW50ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgUmVxdWVzdCkgeworCQkJCVJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIGVsZW1lbnQ7CisJCQkJUmVzZW5kSFRUUFJlcXVlc3QgbmV3UmVxID0gTW9uaXRvck1hbmFnZXIuY3JlYXRlUmVzZW5kUmVxdWVzdChyZXEpOworCQkJCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkUmVzZW5kUmVxdWVzdChyZXEsIG5ld1JlcSk7CisJCQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gTW9uaXRvclZpZXcudmlldy50cmVlVmlld2VyOworCQkJCXRyZWVWaWV3ZXIuYWRkKHJlcSwgbmV3UmVxKTsKKwkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdSZXEpLCBmYWxzZSk7CisJCQkJbmV3UmVxLnNlbmRSZXF1ZXN0KCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uMikgeworCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvU2VuZE1vZGlmaWVkTWVzc2FnZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9TZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwYjQzMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvU2VuZE1vZGlmaWVkTWVzc2FnZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnMuSGVhZGVyVmlld2VyOworLyoqCisgKiBTZW5kIGEgbW9kaWZpZWQgbWVzc2FnZS4KKyAqLworcHVibGljIGNsYXNzIFNlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24gaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRleworCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCisJICovCisJcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKKwkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7CisJCQlPYmplY3QgZWxlbWVudCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSB7CisJCQkJUmVzZW5kSFRUUFJlcXVlc3QgcmVxID0gKFJlc2VuZEhUVFBSZXF1ZXN0KSBlbGVtZW50OworCQkJCUNvbnRlbnRWaWV3ZXIgY3VyVmlld2VyID0gTW9uaXRvclZpZXcudmlldy52bS5nZXRDdXJyZW50UmVxdWVzdFZpZXdlcigpOworCQkJCUhlYWRlclZpZXdlciBjdXJIZWFkZXJWaWV3ZXIgPSBNb25pdG9yVmlldy52aWV3LnZtLmdldEN1cnJlbnRSZXF1ZXN0SGVhZGVyVmlld2VyKCk7CisJCQkJcmVxLnNldFJlcXVlc3QoY3VyVmlld2VyLmdldENvbnRlbnQoKSwgUmVxdWVzdC5DT05URU5UKTsKKwkJCQkKKwkJCQlpZiAoY3VySGVhZGVyVmlld2VyICE9IG51bGwpCisJCQkJCXJlcS5zZXRSZXF1ZXN0KGN1ckhlYWRlclZpZXdlci5nZXRDb250ZW50KCksIFJlcXVlc3QuVFJBTlNQT1JUKTsKKworCQkJCXJlcS5zZW5kUmVxdWVzdCgpOworCQkJfQorCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbjIpIHsKKwkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24yOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1RyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1RyZWVMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljMWRmMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47CisvKioKKyAqIEEgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBtb25pdG9yIHNlcnZlciB2aWV3LgorICovCitwdWJsaWMgY2xhc3MgVHJlZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7CisJLyoqCisJICogVHJlZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgVHJlZUxhYmVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoKKwkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKgorCSAqIERpc3Bvc2VzIG9mIHRoaXMgbGFiZWwgcHJvdmlkZXIuCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qCisJICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBmb3IgdXNlCisJICogaW4gdGhlIGdpdmVuIHZpZXdlci4KKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSB7CisJCQkJaWYgKCEoKFJlc2VuZEhUVFBSZXF1ZXN0KSBlbGVtZW50KS5oYXNCZWVuU2VudCgpKQorCQkJCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldEltYWdlKE1vbml0b3JVSVBsdWdpbi5JTUdfUkVTRU5EX1JFUVVFU1RfUkVTUE9OU0UpOworCQkJfQorCQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX1JFUVVFU1RfUkVTUE9OU0UpOworCQl9CisJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19IT1NUKTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBmb3IgdXNlCisJICogaW4gdGhlIGdpdmVuIHZpZXdlci4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7CisJCQlSZXF1ZXN0IGNhbGwgPSAoUmVxdWVzdCkgZWxlbWVudDsKKwkJCXJldHVybiBjYWxsLmdldE5hbWUoKTsKKwkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSW50ZWdlcikgeworCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBlbGVtZW50OworCQkJcmV0dXJuICJsb2NhbGhvc3Q6IiArIGluLmludFZhbHVlKCk7CisJCX0gZWxzZQorCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQgCisJICogYnkgYSBjaGFuZ2UgdG8gdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50LgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoKKwkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4ZjkzOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVmlld2VyLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlRyYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVmlld2VyIHsKKwlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGNvbnRlbnQgdmlld2VyLgorCSAqIAorCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50CisJICovCisJcHVibGljIFZpZXdlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQlzdXBlcigpOworCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlTdHJpbmcgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKKwkJaWYgKGxhYmVsID09IG51bGwpCisJCQlyZXR1cm4gIm4vYSI7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHZpZXdlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGNvdWxkbid0IGJlIGxvYWRlZAorCSAqLworCXB1YmxpYyBDb250ZW50Vmlld2VyIGNyZWF0ZVZpZXdlcigpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiAoQ29udGVudFZpZXdlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSB2aWV3ZXIiICsgdG9TdHJpbmcoKSwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVxdWVzdFZpZXdlcigpIHsKKwkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJyZXF1ZXN0IikgPj0gMDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlVmlld2VyKCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInJlc3BvbnNlIikgPj0gMDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisJICogCisJICogQHJldHVybiBTdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkNvbnRlbnRWaWV3ZXJbIiArIGdldElkKCkgKyAiXSI7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk0NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXJNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuSUNvbnRlbnRGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tLlNhc2hGb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5CeXRlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnMuSGVhZGVyVmlld2VyOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFZpZXdlck1hbmFnZXIgeworCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5SGVhZGVySW5mOworCisJcHJvdGVjdGVkIENvbnRlbnRWaWV3ZXIgcmVxVmlld2VyOworCXByb3RlY3RlZCBDb250ZW50Vmlld2VyIHJlc3BWaWV3ZXI7CisJcHJvdGVjdGVkIFZpZXdlciByZXF1ZXN0Vmlld2VyOworCXByb3RlY3RlZCBWaWV3ZXIgcmVzcG9uc2VWaWV3ZXI7CisKKwlwcm90ZWN0ZWQgSGVhZGVyVmlld2VyIHJlcUhlYWRlcjsKKwlwcm90ZWN0ZWQgSGVhZGVyVmlld2VyIHJlc3BIZWFkZXI7CisKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIHJlcUNvbXA7CisJcHJvdGVjdGVkIENvbXBvc2l0ZSByZXNwQ29tcDsKKworCXByb3RlY3RlZCBMaXN0PFZpZXdlcj4gdmlld2VyczsKKworCXByb3RlY3RlZCBSZXF1ZXN0IHJlcXVlc3Q7CisKKwlwcm90ZWN0ZWQgU2FzaEZvcm0gcmVxU2FzaDsKKwlwcm90ZWN0ZWQgU2FzaEZvcm0gcmVzcFNhc2g7CisKKwlwcm90ZWN0ZWQgTGlzdDxJQ29udGVudEZpbHRlcj4gZmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbnRlbnRGaWx0ZXI+KCk7CisKKwlwdWJsaWMgVmlld2VyTWFuYWdlcihDb21wb3NpdGUgcmVxUGFyZW50LCBDb21wb3NpdGUgcmVzcFBhcmVudCkgeworCQlyZXFTYXNoID0gbmV3IFNhc2hGb3JtKHJlcVBhcmVudCwgU1dULlZFUlRJQ0FMKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlyZXFTYXNoLnNldExheW91dChsYXlvdXQpOworCQlyZXFTYXNoLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQkKKwkJcmVzcFNhc2ggPSBuZXcgU2FzaEZvcm0ocmVzcFBhcmVudCwgU1dULlZFUlRJQ0FMKTsKKwkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJcmVzcFNhc2guc2V0TGF5b3V0KGxheW91dCk7CisJCXJlc3BTYXNoLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQkKKwkJcmVxQ29tcCA9IHJlcVNhc2g7CisJCXJlc3BDb21wID0gcmVzcFNhc2g7CisJCQorCQlyZXFIZWFkZXIgPSBuZXcgSGVhZGVyVmlld2VyKHJlcVNhc2gsIEhlYWRlclZpZXdlci5SRVFVRVNUX0hFQURFUik7CisJCXJlc3BIZWFkZXIgPSBuZXcgSGVhZGVyVmlld2VyKHJlc3BTYXNoLCBIZWFkZXJWaWV3ZXIuUkVTUE9OU0VfSEVBREVSKTsKKwkJcmVxVmlld2VyID0gbmV3IEJ5dGVWaWV3ZXIoKTsKKwkJcmVxVmlld2VyLmluaXQocmVxU2FzaCk7CisJCXJlc3BWaWV3ZXIgPSBuZXcgQnl0ZVZpZXdlcigpOworCQlyZXNwVmlld2VyLmluaXQocmVzcFNhc2gpOworCQkKKwkJcmVxU2FzaC5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDEwLCA5MCB9KTsKKwkJcmVzcFNhc2guc2V0V2VpZ2h0cyhuZXcgaW50W10geyAxMCwgOTAgfSk7CisJCQorCQlzZXREaXNwbGF5SGVhZGVySW5mbyhNb25pdG9yVUlQbHVnaW4uZ2V0U2hvd0hlYWRlclByZWZlcmVuY2UoKSk7CisJCWxvYWRBdmFpbGFibGVWaWV3ZXJzKCk7CisJfQorCisJcHJvdGVjdGVkIFZpZXdlciBnZXREZWZhdWx0Vmlld2VyKFN0cmluZyBuYW1lKSB7CisJCWlmIChuYW1lID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCVN0cmluZyBuYW1lMiA9IG5hbWUudG9Mb3dlckNhc2UoKTsgCisJCWlmIChuYW1lMi5lbmRzV2l0aCgiLnhtbCIpKQorCQkJcmV0dXJuIGZpbmRWaWV3ZXIoIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMueG1sIik7CisJCWVsc2UgaWYgKG5hbWUyLmVuZHNXaXRoKCIuaHRtbCIpKQorCQkJcmV0dXJuIGZpbmRWaWV3ZXIoIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMuYnJvd3NlciIpOworCQllbHNlIGlmIChuYW1lMi5lbmRzV2l0aCgiLmdpZiIpIHx8IG5hbWUyLmVuZHNXaXRoKCIuanBnIikgfHwKKwkJCQluYW1lMi5lbmRzV2l0aCgiLmpwZWciKSB8fCBuYW1lMi5lbmRzV2l0aCgiLnBuZyIpKQorCQkJcmV0dXJuIGZpbmRWaWV3ZXIoIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMuaW1hZ2UiKTsKKwkJZWxzZQorCQkJcmV0dXJuIGZpbmRWaWV3ZXIoIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMuYnl0ZSIpOworCX0KKworCXByb3RlY3RlZCBWaWV3ZXIgZmluZFZpZXdlcihTdHJpbmcgaWQpIHsKKwkJaWYgKGlkID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdmlld2Vycy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlWaWV3ZXIgdmlld2VyID0gKFZpZXdlcikgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKGlkLmVxdWFscyh2aWV3ZXIuZ2V0SWQoKSkpCisJCQkJcmV0dXJuIHZpZXdlcjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgbG9hZEF2YWlsYWJsZVZpZXdlcnMoKSB7CisJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQsICJ2aWV3ZXJzIik7CisJCWludCBzaXplID0gY2YubGVuZ3RoOworCQl2aWV3ZXJzID0gbmV3IEFycmF5TGlzdDxWaWV3ZXI+KHNpemUpOworCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKQorCQkJdmlld2Vycy5hZGQobmV3IFZpZXdlcihjZSkpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjc2V0RGlzcGxheUhlYWRlckluZm8oYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREaXNwbGF5SGVhZGVySW5mbyhib29sZWFuIGIpIHsKKwkJZGlzcGxheUhlYWRlckluZiA9IGI7CisJCXJlcUhlYWRlci5zZXREaXNwbGF5SGVhZGVyKGIpOworCQlyZXNwSGVhZGVyLnNldERpc3BsYXlIZWFkZXIoYik7CisJCXJlcVNhc2guc2V0U2ltcGxlTGF5b3V0KGIpOworCQlyZXNwU2FzaC5zZXRTaW1wbGVMYXlvdXQoYik7CisJCXJlcVNhc2gubGF5b3V0KHRydWUpOworCQlyZXNwU2FzaC5sYXlvdXQodHJ1ZSk7CisJCQorCQlNb25pdG9yVUlQbHVnaW4uc2V0U2hvd0hlYWRlclByZWZlcmVuY2UoYik7CisJCWlmIChiKSB7CisJCQlyZXFIZWFkZXIuc2V0RWRpdGFibGUoZmFsc2UpOworCQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCAmJiByZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuVFJBTlNQT1JUKSA9PSBudWxsKSB7CisJCQkJcmVxSGVhZGVyLnNldEVkaXRhYmxlKHRydWUpOworCQkJfQorCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNnZXREaXNwbGF5SGVhZGVySW5mbygpCisJICovCisJcHVibGljIGJvb2xlYW4gZ2V0RGlzcGxheUhlYWRlckluZm8oKSB7CisJCXJldHVybiBkaXNwbGF5SGVhZGVySW5mOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3QoUmVxdWVzdCBycikgeworCQkvLyBtYWludGFpbiB0aGUgc3RhdGUgb2YgdGhlIHJlcXVlc3QgYW5kIHJlcXVlc3QgaGVhZGVyIGlmIHRoZXkndmUgYmVlbiBtb2RpZmllZC4KKwkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCAmJiByZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKSA9PSBudWxsKSB7CisJCQlSZXNlbmRIVFRQUmVxdWVzdCByZXNSZXF1ZXN0ID0gKFJlc2VuZEhUVFBSZXF1ZXN0KSByZXF1ZXN0OworCQkJLy9FZGl0YWJsZUNvbnRlbnRWaWV3ZXIgZWRpdFZpZXdlciA9IChDb250ZW50Vmlld2VyKSByZXFWaWV3ZXI7CisJCQlieXRlW10gY29udGVudCA9IHJlcVZpZXdlci5nZXRDb250ZW50KCk7CisJCQlieXRlW10gYiA9IHJlc1JlcXVlc3QuZ2V0UmVxdWVzdChSZXF1ZXN0LkNPTlRFTlQpOworCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCAmJiBiICE9IG51bGwgJiYgIU1vbml0b3JVSVBsdWdpbi5wYXJzZShiKS5lcXVhbHMoTW9uaXRvclVJUGx1Z2luLnBhcnNlKGNvbnRlbnQpKSkgeworCQkJCXJlc1JlcXVlc3Quc2V0UmVxdWVzdChjb250ZW50LCBSZXF1ZXN0LkNPTlRFTlQpOworCQkJfQorCQkJYnl0ZVtdIGhlYWRlciA9IHJlcUhlYWRlci5nZXRDb250ZW50KCk7CisJCQliID0gcmVzUmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuVFJBTlNQT1JUKTsKKwkJCWlmIChoZWFkZXIgIT0gbnVsbCAmJiBiICE9IG51bGwgJiYgIU1vbml0b3JVSVBsdWdpbi5wYXJzZShiKS5lcXVhbHMoTW9uaXRvclVJUGx1Z2luLnBhcnNlKGhlYWRlcikpKSB7CisJCQkJcmVzUmVxdWVzdC5zZXRSZXF1ZXN0KGhlYWRlciwgUmVxdWVzdC5UUkFOU1BPUlQpOworCQkJfQorCQl9CisJCXJlcUhlYWRlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOworCQlyZXNwSGVhZGVyLnNldFJlcXVlc3RSZXNwb25zZShycik7CisJCWJ5dGVbXSBiID0gbnVsbDsKKwkJaWYgKHJyICE9IG51bGwpCisJCQliID0gZmlsdGVyKHJyLmdldFJlcXVlc3QoUmVxdWVzdC5DT05URU5UKSk7CisJCXJlcVZpZXdlci5zZXRDb250ZW50KGIpOworCQliID0gbnVsbDsKKwkJaWYgKHJyICE9IG51bGwpCisJCQliID0gZmlsdGVyKHJyLmdldFJlc3BvbnNlKFJlcXVlc3QuQ09OVEVOVCkpOworCQlyZXNwVmlld2VyLnNldENvbnRlbnQoYik7CisJCXJlcXVlc3QgPSBycjsKKwkJCisJCS8vIHNldCB0aGUgZWRpdG9yIHRvIGVkaXRhYmxlIGlmIHRoZSByZXF1ZXN0IGhhc24ndCBiZWVuIHNlbnQgYW5kIHRoZQorCQkvLyBlZGl0b3IgY2FuIGJlIHNldCBhcyBlZGl0YWJsZQorCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5BTEwpID09IG51bGwpIHsKKwkJCWlmIChkaXNwbGF5SGVhZGVySW5mKQorCQkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZSh0cnVlKTsKKwkJCQorCQkJcmVxVmlld2VyLnNldEVkaXRhYmxlKHRydWUpOworCQl9IGVsc2UgeworCQkJaWYgKGRpc3BsYXlIZWFkZXJJbmYpCisJCQkJcmVxSGVhZGVyLnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJCQorCQkJcmVxVmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGFkZEZpbHRlcihJQ29udGVudEZpbHRlciBmaWx0ZXIpIHsKKwkJZmlsdGVycy5hZGQoZmlsdGVyKTsKKwkJc2V0UmVxdWVzdChyZXF1ZXN0KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVGaWx0ZXIoSUNvbnRlbnRGaWx0ZXIgZmlsdGVyKSB7CisJCWZpbHRlcnMucmVtb3ZlKGZpbHRlcik7CisJCXNldFJlcXVlc3QocmVxdWVzdCk7CisJfQorCisJcHJvdGVjdGVkIGJ5dGVbXSBmaWx0ZXIoYnl0ZVtdIGIpIHsKKwkJaWYgKGIgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpbHRlcnMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJSUNvbnRlbnRGaWx0ZXIgZmlsdGVyID0gKElDb250ZW50RmlsdGVyKSBpdGVyYXRvci5uZXh0KCk7CisJCQl0cnkgeworCQkJCWIgPSBmaWx0ZXIuZmlsdGVyKHJlcXVlc3QsIGZhbHNlLCBiKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2hpbGUgZmlsdGVyaW5nIHdpdGggIiArIGZpbHRlci5nZXRJZCgpLCBlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYjsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS50Y3BpcC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0UmVxdWVzdFZpZXdlcnMoKQorCSAqLworCXB1YmxpYyBMaXN0IGdldFJlcXVlc3RWaWV3ZXJzKCkgeworCQlJdGVyYXRvciBpdGVyYXRvciA9IHZpZXdlcnMuaXRlcmF0b3IoKTsKKwkJTGlzdDxWaWV3ZXI+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PFZpZXdlcj4oKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmICh2aWV3ZXIuaXNSZXF1ZXN0Vmlld2VyKCkpCisJCQkJdGVtcC5hZGQodmlld2VyKTsKKwkJfQorCQlyZXR1cm4gdGVtcDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS50Y3BpcC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0UmVzcG9uc2VWaWV3ZXJzKCkKKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRSZXNwb25zZVZpZXdlcnMoKSB7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdmlld2Vycy5pdGVyYXRvcigpOworCQlMaXN0PFZpZXdlcj4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8Vmlld2VyPigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlWaWV3ZXIgdmlld2VyID0gKFZpZXdlcikgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKHZpZXdlci5pc1Jlc3BvbnNlVmlld2VyKCkpCisJCQkJdGVtcC5hZGQodmlld2VyKTsKKwkJfQorCQlyZXR1cm4gdGVtcDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS50Y3BpcC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjc2V0UmVxdWVzdFZpZXdlcihqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RWaWV3ZXIoVmlld2VyIHZpZXdlcikgeworCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmVxdWFscyhyZXF1ZXN0Vmlld2VyKSkKKwkJCXJldHVybjsKKwkJCisJCS8vIGNhbGwgc2V0IHJlcXVlc3QgdG8gc2F2ZSBhbmQgcmVzZXQgdGhlIHJlcXVlc3QKKwkJc2V0UmVxdWVzdChyZXF1ZXN0KTsKKwkJcmVxVmlld2VyLmRpc3Bvc2UoKTsKKwkJCisJCXJlcXVlc3RWaWV3ZXIgPSB2aWV3ZXI7CisJCWlmICh2aWV3ZXIgIT0gbnVsbCkKKwkJCXJlcVZpZXdlciA9IHZpZXdlci5jcmVhdGVWaWV3ZXIoKTsKKwkJZWxzZQorCQkJcmVxVmlld2VyID0gbnVsbDsKKwkJaWYgKHJlcVZpZXdlciA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJcmVxVmlld2VyLmluaXQocmVxQ29tcCk7CisJCS8vcmVxVmlld2VyLnNldFJlcXVlc3RSZXNwb25zZShycik7CisJCWJ5dGVbXSBiID0gbnVsbDsKKwkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgeworCQkJYiA9IGZpbHRlcihyZXF1ZXN0LmdldFJlcXVlc3QoUmVxdWVzdC5DT05URU5UKSk7CisJCQkvLyBzZXQgdGhlIGVkaXRvciB0byBlZGl0YWJsZSBpZiB0aGUgcmVxdWVzdCBoYXNuJ3QgYmVlbiBzZW50IGFuZCB0aGUKKwkJCS8vIGVkaXRvciBjYW4gYmUgc2V0IGFzIGVkaXRhYmxlCisJCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5UUkFOU1BPUlQpID09IG51bGwpIHsKKwkJCQlyZXFWaWV3ZXIuc2V0RWRpdGFibGUodHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCXJlcVZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7CisJCQl9CisJCX0KKwkJcmVxVmlld2VyLnNldENvbnRlbnQoYik7CisJCXJlcUNvbXAubGF5b3V0KHRydWUpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnRjcGlwLm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNzZXRSZXNwb25zZVZpZXdlcihqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlVmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKKwkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5lcXVhbHMocmVzcG9uc2VWaWV3ZXIpKQorCQkJcmV0dXJuOworCQlyZXNwVmlld2VyLmRpc3Bvc2UoKTsKKwkJCisJCXJlc3BvbnNlVmlld2VyID0gdmlld2VyOworCQlpZiAodmlld2VyICE9IG51bGwpCisJCQlyZXNwVmlld2VyID0gdmlld2VyLmNyZWF0ZVZpZXdlcigpOworCQllbHNlCisJCQlyZXNwVmlld2VyID0gbnVsbDsKKwkJaWYgKHJlc3BWaWV3ZXIgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCXJlc3BWaWV3ZXIuaW5pdChyZXNwQ29tcCk7CisJCS8vcmVzcFZpZXdlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOworCQlieXRlW10gYiA9IG51bGw7CisJCWlmIChyZXF1ZXN0ICE9IG51bGwpCisJCQliID0gZmlsdGVyKHJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5DT05URU5UKSk7CisJCXJlc3BWaWV3ZXIuc2V0Q29udGVudChiKTsKKwkJcmVzcENvbXAubGF5b3V0KHRydWUpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0Q3VycmVudFJlcXVlc3RWaWV3ZXIoKQorCSAqLworCXB1YmxpYyBDb250ZW50Vmlld2VyIGdldEN1cnJlbnRSZXF1ZXN0Vmlld2VyKCkgeworCQlyZXR1cm4gcmVxVmlld2VyOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0Q3VycmVudFJlcXVlc3RIZWFkZXJWaWV3ZXIoKQorCSAqLworCXB1YmxpYyBIZWFkZXJWaWV3ZXIgZ2V0Q3VycmVudFJlcXVlc3RIZWFkZXJWaWV3ZXIoKSB7CisJCXJldHVybiByZXFIZWFkZXI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnJvd3NlclZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9Ccm93c2VyVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3YTM2MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnJvd3NlclZpZXdlci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKKy8qKgorICogQSBicm93c2VyIHZpZXdlci4KKyAqLworcHVibGljIGNsYXNzIEJyb3dzZXJWaWV3ZXIgZXh0ZW5kcyBDb250ZW50Vmlld2VyIHsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQ1IgPSAnXHInOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBMRiA9ICdcbic7CisKKwlwcm90ZWN0ZWQgQnJvd3NlciBicm93c2VyOworCisJcHJvdGVjdGVkIGJ5dGVbXSBjb250ZW50OworCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjaW5pdChDb21wb3NpdGUpCisJICovCisJcHVibGljIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50KSB7CisJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKKwkJYnJvd3Nlci5hZGRMaXN0ZW5lcihTV1QuTWVudURldGVjdCwgbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQlldmVudC5kb2l0ID0gZmFsc2U7CisJCQl9CisJCX0pOworCX0KKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBDb250ZW50Vmlld2VyI3NldENvbnRlbnQoYnl0ZVtdKQorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoYnl0ZVtdIGIpIHsKKwkJY29udGVudCA9IGI7CisJCWlmIChiID09IG51bGwgfHwgYi5sZW5ndGggPT0gMCkgeworCQkJYnJvd3Nlci5zZXRUZXh0KE1lc3NhZ2VzLmh0bWxWaWV3SW52YWxpZCk7CisJCX0gZWxzZSB7CisJCQliID0gTW9uaXRvclVJUGx1Z2luLnVuemlwKGIpOworCQkJCisJCQlpbnQgdHJpbUZyb250ID0gMDsKKwkJCWludCB0cmltQmFjayA9IDA7CisJCQlpbnQgbGVuID0gYi5sZW5ndGggLSAxOworCQkJd2hpbGUgKHRyaW1Gcm9udCA8IGIubGVuZ3RoICYmIChiW3RyaW1Gcm9udF0gPT0gQ1IgfHwgYlt0cmltRnJvbnRdID09IExGKSkKKwkJCQl0cmltRnJvbnQrKzsKKwkJCXdoaWxlICh0cmltQmFjayA8IGIubGVuZ3RoICYmIGIubGVuZ3RoID4gMCAmJiAoYltsZW4gLSB0cmltQmFja10gPT0gQ1IgfHwgYltsZW4gLSB0cmltQmFja10gPT0gTEYpKQorCQkJCXRyaW1CYWNrKys7CisJCQkKKwkJCWlmICh0cmltRnJvbnQgKyB0cmltQmFjayA+IDApIHsKKwkJCQlpZiAodHJpbUZyb250ICsgdHJpbUJhY2sgPiBiLmxlbmd0aCkgeworCQkJCQliID0gbmV3IGJ5dGVbMF07CisJCQkJfSBlbHNlIHsKKwkJCQkJYnl0ZVtdIHRlbXAgPSBiOworCQkJCQliID0gbmV3IGJ5dGVbdGVtcC5sZW5ndGggLSB0cmltQmFjayAtIHRyaW1Gcm9udF07CisJCQkJCWZvciAoaW50IGkgPSB0cmltRnJvbnQ7IGkgPCB0ZW1wLmxlbmd0aCAtIHRyaW1CYWNrOyBpKyspIHsKKwkJCQkJCWJbaSAtIHRyaW1Gcm9udF0gPSB0ZW1wW2ldOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJvd3Nlci5zZXRUZXh0KG5ldyBTdHJpbmcoYikpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQorCSAqLworCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKKwkJcmV0dXJuIGNvbnRlbnQ7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJYnJvd3Nlci5kaXNwb3NlKCk7CisJCWJyb3dzZXIgPSBudWxsOworCQljb250ZW50ID0gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0J5dGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnl0ZVZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODJlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0J5dGVWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLkNvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7CisvKioKKyAqIEEgYmFzaWMgYnl0ZSB2aWV3ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBCeXRlVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlciB7CisJcHJvdGVjdGVkIFRleHQgdGV4dDsKKworCS8qKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBDb250ZW50Vmlld2VyI2luaXQoQ29tcG9zaXRlKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCkgeworCQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7CisJCURpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7CisJCXRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKKwkJdGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOworCQl0ZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGV4dCwgQ29udGV4dElkcy5WSUVXX1JFU1BPTlNFKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRFZGl0YWJsZShib29sZWFuKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKKwkJdGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZ2V0Q29udGVudCgpCisJICovCisJcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgeworCQlpZiAodGV4dCA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBieXRlWzBdOworCQkKKwkJU3RyaW5nIGNvbnRlbnQgPSB0ZXh0LmdldFRleHQoKS50cmltKCk7CisJCWlmIChjb250ZW50LmVxdWFscygiIikpCisJCQlyZXR1cm4gbmV3IGJ5dGVbMF07CisJCQorCQkvLyBOZWVkIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50CisJCS8vIGdldEJ5dGVzKCkgcmVtb3ZlcyB0aGUgbmV3bGluZQorCQlieXRlW10gdHdvTmV3bGluZXMgPSBuZXcgYnl0ZVtdIHsgJ1wwMTUnLCAnXDAxMicgfTsKKwkJYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IGNvbnRlbnQuZ2V0Qnl0ZXMoKTsKKwkJYnl0ZVtdIHJldEJ5dGVzID0gbmV3IGJ5dGVbY29udGVudEJ5dGVzLmxlbmd0aCArIDJdOworCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRCeXRlcywgMCwgcmV0Qnl0ZXMsIDAsIGNvbnRlbnRCeXRlcy5sZW5ndGgpOworCQlTeXN0ZW0uYXJyYXljb3B5KHR3b05ld2xpbmVzLCAwLCByZXRCeXRlcywgY29udGVudEJ5dGVzLmxlbmd0aCwgMik7CisJCXJldHVybiByZXRCeXRlczsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7CisJCVN0cmluZyBvdXQgPSAiIjsKKwkJaWYgKGIgIT0gbnVsbCkgeworCQkJYiA9IE1vbml0b3JVSVBsdWdpbi51bnppcChiKTsKKwkJCW91dCA9IE1vbml0b3JVSVBsdWdpbi5wYXJzZShiKTsKKwkJfQorCQkKKwkJU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisJCWludCBscyA9IGxpbmVTZXBhcmF0b3IubGVuZ3RoKCk7CisJCWlmIChvdXQubGVuZ3RoKCkgPiBscykgeworCQkJd2hpbGUgKG91dC5zdWJzdHJpbmcoMCwgbHMpLmluZGV4T2YobGluZVNlcGFyYXRvcikgPj0gMCkKKwkJCQlvdXQgPSBvdXQuc3Vic3RyaW5nKGxzLCBvdXQubGVuZ3RoKCkpOyAKKwkJfQorCQkKKwkJdGV4dC5zZXRUZXh0KG91dCk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdGV4dC5kaXNwb3NlKCk7CisJCXRleHQgPSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSGVhZGVyVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0hlYWRlclZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNGY0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0hlYWRlclZpZXdlci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Db250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5jdXN0b20uTW9uaXRvclN0YWNrTGF5b3V0OworLyoqCisgKiBBbiB0cmFuc3BvcnQgKGhlYWRlcikgdmlld2VyLgorICovCitwdWJsaWMgY2xhc3MgSGVhZGVyVmlld2VyIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkaXNwbGF5SGVhZGVyOworCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBoZWFkZXJDb21wOworCXByb3RlY3RlZCBNb25pdG9yU3RhY2tMYXlvdXQgbGF5b3V0OworCisJcHJvdGVjdGVkIExhYmVsIGhlYWRlckxhYmVsOworCXByb3RlY3RlZCBUZXh0IGhlYWRlclRleHQ7CisJcHJvdGVjdGVkIFJlcXVlc3QgcnI7CisJcHJvdGVjdGVkIGJ5dGUgbXNnOworCisJcHJvdGVjdGVkIGJvb2xlYW4gaGlkZGVuOworCisJLyoqCisJICogUmVxdWVzdCBoZWFkZXIgY29uc3RhbnQuCisJICovCisJcHVibGljIHN0YXRpYyBieXRlIFJFUVVFU1RfSEVBREVSID0gMDsKKwkKKwkvKioKKwkgKiBSZXNwb25zZSBoZWFkZXIgY29uc3RhbnQuCisJICovCisJcHVibGljIHN0YXRpYyBieXRlIFJFU1BPTlNFX0hFQURFUiA9IDE7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgaGVhZGVyIHZpZXdlci4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKi8KKwlwdWJsaWMgSGVhZGVyVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGJ5dGUgbWVzc2FnZSkgeworCQlkaXNwbGF5SGVhZGVyID0gdHJ1ZTsKKwkJaGlkZGVuID0gZmFsc2U7CisJCQorCQloZWFkZXJDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJbGF5b3V0ID0gbmV3IE1vbml0b3JTdGFja0xheW91dCgpOworCQloZWFkZXJDb21wLnNldExheW91dChsYXlvdXQpOworCQkKKwkJaGVhZGVyVGV4dCA9IG5ldyBUZXh0KGhlYWRlckNvbXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKKwkJRGlzcGxheSBkaXNwbGF5ID0gaGVhZGVyQ29tcC5nZXREaXNwbGF5KCk7CisJCWhlYWRlclRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKKwkJaGVhZGVyVGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOworCQloZWFkZXJUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoaGVhZGVyVGV4dCwgQ29udGV4dElkcy5WSUVXX1JFU1BPTlNFKTsKKwkJCisJCWhlYWRlckxhYmVsID0gbmV3IExhYmVsKGhlYWRlckNvbXAsIFNXVC5OT05FKTsKKwkJCisJCWxheW91dC50b3BDb250cm9sID0gaGVhZGVyVGV4dDsKKwkJCisJCXJyID0gbnVsbDsKKwkJbXNnID0gbWVzc2FnZTsKKworCQlzZXREaXNwbGF5SGVhZGVyKGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gcmVxdWVzdAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RSZXNwb25zZShSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJcnIgPSByZXF1ZXN0OworCQlpZiAoIWhpZGRlbikKKwkJCWdldFZpZXcoKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gYgorCSAqLworCXB1YmxpYyB2b2lkIHNldERpc3BsYXlIZWFkZXIoYm9vbGVhbiBiKSB7CisJCWlmIChkaXNwbGF5SGVhZGVyICE9IGIpIHsKKwkJCWRpc3BsYXlIZWFkZXIgPSBiOworCQkJCisJCQlpZiAoZGlzcGxheUhlYWRlcikKKwkJCQlsYXlvdXQudG9wQ29udHJvbCA9IGhlYWRlclRleHQ7CisJCQllbHNlCisJCQkJbGF5b3V0LnRvcENvbnRyb2wgPSBoZWFkZXJMYWJlbDsKKwkJCQorCQkJaGVhZGVyQ29tcC5sYXlvdXQodHJ1ZSk7CisJCQlnZXRWaWV3KCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZ2V0VmlldygpIHsKKwkJU3RyaW5nIG91dCA9ICIiOworCQlpZiAocnIgIT0gbnVsbCkgeworCQkJaWYgKG1zZyA9PSBSRVFVRVNUX0hFQURFUikgeworCQkJCWJ5dGVbXSBiID0gcnIuZ2V0UmVxdWVzdChSZXF1ZXN0LlRSQU5TUE9SVCk7CisJCQkJaWYgKGIgIT0gbnVsbCkKKwkJCQkJb3V0ID0gTW9uaXRvclVJUGx1Z2luLnBhcnNlKGIpOworCQkJfSBlbHNlIGlmIChtc2cgPT0gUkVTUE9OU0VfSEVBREVSKSB7CisJCQkJYnl0ZVtdIGIgPSByci5nZXRSZXNwb25zZShSZXF1ZXN0LlRSQU5TUE9SVCk7CisJCQkJaWYgKGIgIT0gbnVsbCkKKwkJCQkJb3V0ID0gTW9uaXRvclVJUGx1Z2luLnBhcnNlKGIpOworCQkJfQorCQl9CisJCQorCQlpZiAoZGlzcGxheUhlYWRlcikKKwkJCWhlYWRlclRleHQuc2V0VGV4dChvdXQpOworCQllbHNlIHsKKwkJCVN0cmluZyBsaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCQkJaW50IGluZGV4ID0gb3V0LmluZGV4T2YobGluZVNlcGFyYXRvcik7CisJCQlpZiAoaW5kZXggPiAwKQorCQkJCWhlYWRlckxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuaGVhZGVyTGFiZWwsIG91dC5zdWJzdHJpbmcoMCwgaW5kZXgpKSk7CisJCQllbHNlIAorCQkJCWhlYWRlckxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuaGVhZGVyTGFiZWwsIG91dCkpOworCQl9CisJfQorCisJLyoqCisJICogRGlzcG9zZSB0aGUgaGVhZGVyLgorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWhlYWRlckNvbXAuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIFNldCB3aGV0aGVyIHRoZSBoZWFkZXIgY2FuIGJlIGVkaXRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gZWRpdGFibGUgSWYgdHJ1ZSB0aGUgaGVhZGVyIGNhbiBiZSBlZGl0ZWQsIG90aGVyd2lzZSB0aGUgaGVhZGVyIGNhbm5vdCBiZSBlZGl0ZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgeworCQloZWFkZXJUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGNvbnRlbnQgZnJvbSB0aGUgaGVhZGVyLgorCSAqIAorCSAqIEByZXR1cm4gVGhlIGNvbnRlbnQgZnJvbSB0aGUgaGVhZGVyLgorCSAqLworCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKKwkJaWYgKGhlYWRlclRleHQgPT0gbnVsbCB8fCBoZWFkZXJUZXh0LmlzRGlzcG9zZWQoKSkKKwkJCXJldHVybiBudWxsOworCQkKKwkJU3RyaW5nIGhlYWRlciA9IGhlYWRlclRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJLy8gTmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIDQgYnl0ZXMgZW5kIHRoZSBoZWFkZXIuIFRoZSBnZXRCeXRlcygpCisJCS8vIG1ldGhvZCByZW1vdmVzIHNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisJCWJ5dGVbXSB0d29OZXdsaW5lcyA9IG5ldyBieXRlW10geyAnXDAxNScsICdcMDEyJywgJ1wwMTUnLCAnXDAxMicgfTsKKwkJYnl0ZVtdIGhlYWRlckJ5dGVzID0gaGVhZGVyLmdldEJ5dGVzKCk7CisJCWJ5dGVbXSByZXRCeXRlcyA9IG5ldyBieXRlW2hlYWRlckJ5dGVzLmxlbmd0aCArIDRdOworCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlckJ5dGVzLCAwLCByZXRCeXRlcywgMCwgaGVhZGVyQnl0ZXMubGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weSh0d29OZXdsaW5lcywgMCwgcmV0Qnl0ZXMsIGhlYWRlckJ5dGVzLmxlbmd0aCwgNCk7CisJCXJldHVybiByZXRCeXRlczsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9JbWFnZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9JbWFnZVZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDRkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0ltYWdlVmlld2VyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7CisvKioKKyAqIEFuIGltYWdlIHZpZXdlci4KKyAqLworcHVibGljIGNsYXNzIEltYWdlVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlciB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIENSID0gJ1xyJzsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTEYgPSAnXG4nOworCisJcHJvdGVjdGVkIFNjcm9sbGVkQ29tcG9zaXRlIHNjcm9sbDsKKwlwcm90ZWN0ZWQgTGFiZWwgbWVzc2FnZUxhYmVsOworCisJcHJvdGVjdGVkIGJ5dGVbXSBjb250ZW50OworCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjaW5pdChDb21wb3NpdGUpCisJICovCisJcHVibGljIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50KSB7CisJCXNjcm9sbCA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7CisJCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChzY3JvbGwsIFNXVC5OT05FKTsKKwkJbWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuaW1hZ2VWaWV3SW52YWxpZCk7CisJCW1lc3NhZ2VMYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOworCQltZXNzYWdlTGFiZWwuc2V0U2l6ZShtZXNzYWdlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7CisJCXNjcm9sbC5zZXRDb250ZW50KG1lc3NhZ2VMYWJlbCk7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjc2V0Q29udGVudChieXRlW10pCisJICovCisJcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gYikgeworCQljb250ZW50ID0gYjsKKwkJaWYgKGIgPT0gbnVsbCB8fCBiLmxlbmd0aCA9PSAwKSB7CisJCQltZXNzYWdlTGFiZWwuc2V0SW1hZ2UobnVsbCk7CisJCX0gZWxzZSB7CisJCQliID0gTW9uaXRvclVJUGx1Z2luLnVuemlwKGIpOworCQkJCisJCQlpbnQgdHJpbUZyb250ID0gMDsKKwkJCWludCB0cmltQmFjayA9IDA7CisJCQlpbnQgbGVuID0gYi5sZW5ndGggLSAxOworCQkJd2hpbGUgKHRyaW1Gcm9udCA8IGIubGVuZ3RoICYmIGJbdHJpbUZyb250XSA9PSBDUiB8fCBiW3RyaW1Gcm9udF0gPT0gTEYpCisJCQkJdHJpbUZyb250Kys7CisJCQl3aGlsZSAodHJpbUJhY2sgPCBiLmxlbmd0aCAmJiBiW2xlbiAtIHRyaW1CYWNrXSA9PSBDUiB8fCBiW2xlbiAtIHRyaW1CYWNrXSA9PSBMRikKKwkJCQl0cmltQmFjaysrOworCQkJCisJCQlpZiAodHJpbUZyb250ICsgdHJpbUJhY2sgPiAwKSB7CisJCQkJaWYgKHRyaW1Gcm9udCArIHRyaW1CYWNrID4gYi5sZW5ndGgpIHsKKwkJCQkJYiA9IG5ldyBieXRlWzBdOworCQkJCX0gZWxzZSB7CisJCQkJCWJ5dGVbXSB0ZW1wID0gYjsKKwkJCQkJYiA9IG5ldyBieXRlW3RlbXAubGVuZ3RoIC0gdHJpbUJhY2sgLSB0cmltRnJvbnRdOworCQkJCQlmb3IgKGludCBpID0gdHJpbUZyb250OyBpIDwgdGVtcC5sZW5ndGggLSB0cmltQmFjazsgaSsrKSB7CisJCQkJCQliW2kgLSB0cmltRnJvbnRdID0gdGVtcFtpXTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJdHJ5IHsKKwkJCQlJbWFnZURhdGEgaW1nRCA9IG5ldyBJbWFnZURhdGEobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpKTsKKwkJCQlJbWFnZSBpbWcgPSBuZXcgSW1hZ2UobnVsbCwgaW1nRCk7CisJCQkJbWVzc2FnZUxhYmVsLnNldEltYWdlKGltZyk7CisJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJbWVzc2FnZUxhYmVsLnNldEltYWdlKG51bGwpOworCQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmltYWdlVmlld0ludmFsaWQpOworCQkJfQorCQl9CisJCQorCQltZXNzYWdlTGFiZWwuc2V0U2l6ZShtZXNzYWdlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7CisJfQorCisJLyoqCisJICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQorCSAqLworCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKKwkJcmV0dXJuIGNvbnRlbnQ7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc2Nyb2xsLmRpc3Bvc2UoKTsKKwkJc2Nyb2xsID0gbnVsbDsKKwkJbWVzc2FnZUxhYmVsID0gbnVsbDsKKwkJY29udGVudCA9IG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9YTUxWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvWE1MVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyOWRmMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvWE1MVmlld2VyLmphdmEKQEAgLTAsMCArMSwyMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgCisgKiAgICAgMjAwNS0xMS0yNSBBcnRodXIgUnltYW4sIHJ5bWFuQGNhLmlibS5jb20KKyAqICAgICAtIGZpeGVkIGJ1ZyAxMTgxMDI6IHNldCB4bWxUYWdNaXNzaW5nIGNvcnJlY3RseSBlYWNoIHRpbWUgc2V0Q29udGVudCgpIGlzIGNhbGxlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7CisgCitpbXBvcnQgamF2YS5pby4qOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKKworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKy8qKgorICogWE1MIFZpZXdlci4KKyAqLworcHVibGljIGNsYXNzIFhNTFZpZXdlciBleHRlbmRzIENvbnRlbnRWaWV3ZXIgeworCXByb3RlY3RlZCBDb21wb3NpdGUgdmlld2VyQ29tcDsKKwlwcm90ZWN0ZWQgU3RhY2tMYXlvdXQgbGF5b3V0OworCXByb3RlY3RlZCBUZXh0IG1lc3NhZ2VUZXh0OworCXByb3RlY3RlZCBMYWJlbCBtZXNzYWdlTGFiZWw7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxUYWdNaXNzaW5nID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gc2V0RW5jb2RpbmcgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtaXNzaW5nRW5jb2RpbmcgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIG9yaWdpbmFsRW5jb2Rpbmc7CisKKwlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnQ7CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7CisJCWNvbnRlbnQgPSBiOworCQlTdHJpbmcgb3V0ID0gIiI7CQorCQlpZiAoYiAhPSBudWxsKSB7CisJCQliID0gTW9uaXRvclVJUGx1Z2luLnVuemlwKGIpOworCQkJb3V0ID0gTW9uaXRvclVJUGx1Z2luLnBhcnNlKGIpOworCQl9CisJCQorCQlTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKwkJaW50IGxzID0gbGluZVNlcGFyYXRvci5sZW5ndGgoKTsKKwkJaWYgKG91dC5sZW5ndGgoKSA+IGxzKSB7CisJCQl3aGlsZSAob3V0LnN1YnN0cmluZygwLCBscykuaW5kZXhPZihsaW5lU2VwYXJhdG9yKSA+PSAwKQorCQkJb3V0ID0gb3V0LnN1YnN0cmluZyhscywgb3V0Lmxlbmd0aCgpKTsKKwkJfQorCQkKKwkJU3RyaW5nIG91dF90ZW1wID0gb3V0LnRvTG93ZXJDYXNlKCk7CisJCXhtbFRhZ01pc3NpbmcgPSAhb3V0X3RlbXAuc3RhcnRzV2l0aCgiPD94bWwiKTsKKwkJCisJCWlmIChvdXQubGVuZ3RoKCkgPiAwKSB7CisJCQlTdHJpbmcgZmluYWxNc2cgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlieXRlW10gYjEgPSBjcmVhdGVEb2N1bWVudChvdXQpOworCQkJCWZpbmFsTXNnID0gbmV3IFN0cmluZyhiMSkudHJpbSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBjYXNlOiBlcnJvciBwYXJzaW5nCisJCQkJbWVzc2FnZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJbGF5b3V0LnRvcENvbnRyb2wgPSBtZXNzYWdlTGFiZWw7CisJCQkJbWVzc2FnZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7CisJCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZXMueG1sVmlld0ludmFsaWQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICh4bWxUYWdNaXNzaW5nICYmIGZpbmFsTXNnLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8+IikpIHsKKwkJCQlpbnQgeCA9IGZpbmFsTXNnLmluZGV4T2YoIlxuIikgKyAxOworCQkJCVN0cmluZyBNc2cgPSBmaW5hbE1zZy5zdWJzdHJpbmcoeCk7CisJCQkJZmluYWxNc2cgPSBNc2c7CisJCQkJCisJCQkJbWVzc2FnZVRleHQuc2V0VGV4dChmaW5hbE1zZyk7CisJCQl9IGVsc2UgaWYgKHNldEVuY29kaW5nKSB7CisJCQkJLy8gY2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgZW5jb2RpbmcKKwkJCQlpbnQgYmVnaW4gPSBmaW5hbE1zZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInV0Zi04Iik7IC8vIGxvY2F0aW9uIG9mIG9wZW5pbmcgIgorCQkJCWlmIChiZWdpbiA+PSAwKSB7CisJCQkJCWludCBsYXN0ID0gYmVnaW4gKyA1OyAgLy8gbG9jYXRpb24gb2YgY2xvc2luZyAiCisJCQkJCVN0cmluZyBmaXJzdF9oYWxmID0gZmluYWxNc2cuc3Vic3RyaW5nKDAsYmVnaW4pOworCQkJCQlTdHJpbmcgc2Vjb25kX2hhbGYgPSBmaW5hbE1zZy5zdWJzdHJpbmcobGFzdCk7CisJCQkJCWZpbmFsTXNnID0gZmlyc3RfaGFsZiArIG9yaWdpbmFsRW5jb2RpbmcgKyBzZWNvbmRfaGFsZjsKKwkJCQl9CisJCQkJCisJCQkJbWVzc2FnZVRleHQuc2V0VGV4dChmaW5hbE1zZyk7CisJCQl9IGVsc2UgaWYgKG1pc3NpbmdFbmNvZGluZykgeworCQkJCS8vIHJlbW92ZSBlbmNvZGluZyBjb21wbGV0ZWx5CisJCQkJaW50IGJlZ2luID0gZmluYWxNc2cudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbmNvZGluZz1cInV0Zi04XCIiKTsgLy9sb2NhdGlvbiBvZiBvcGVuaW5nICIKKwkJCQlpbnQgbGFzdCA9IGJlZ2luICsgMTY7ICAvL2xvY2F0aW9uIG9mIGNsb3NpbmcgIgorCQkJCVN0cmluZyBmaXJzdF9oYWxmID0gZmluYWxNc2cuc3Vic3RyaW5nKDAsYmVnaW4pOworCQkJCVN0cmluZyBzZWNvbmRfaGFsZiA9IGZpbmFsTXNnLnN1YnN0cmluZyhsYXN0KTsKKwkJCQlmaW5hbE1zZyA9IGZpcnN0X2hhbGYgKyBzZWNvbmRfaGFsZjsKKwkJCQkKKwkJCQltZXNzYWdlVGV4dC5zZXRUZXh0KGZpbmFsTXNnKTsJCisJCQl9IGVsc2UKKwkJCQltZXNzYWdlVGV4dC5zZXRUZXh0KGZpbmFsTXNnKTsKKwkJfSBlbHNlCisJCQltZXNzYWdlVGV4dC5zZXRUZXh0KG91dCk7CisJCQorCQltZXNzYWdlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7CisJCWxheW91dC50b3BDb250cm9sID0gbWVzc2FnZVRleHQ7CisJCW1lc3NhZ2VUZXh0LnNldFZpc2libGUodHJ1ZSk7CisJfQorCisJLyoqCisJICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQorCSAqLworCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKKwkJcmV0dXJuIGNvbnRlbnQ7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjaW5pdChDb21wb3NpdGUpCisJICovCisJcHVibGljIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50KSB7CisJCXZpZXdlckNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCXZpZXdlckNvbXAuc2V0TGF5b3V0KGxheW91dCk7CisJCQorCQltZXNzYWdlVGV4dCA9IG5ldyBUZXh0KHZpZXdlckNvbXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKKwkJRGlzcGxheSBkaXNwbGF5ID0gdmlld2VyQ29tcC5nZXREaXNwbGF5KCk7CisJCW1lc3NhZ2VUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7CisJCW1lc3NhZ2VUZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7CisJCW1lc3NhZ2VUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7CisJCW1lc3NhZ2VUZXh0LnNldFZpc2libGUodHJ1ZSk7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWVzc2FnZVRleHQsIENvbnRleHRJZHMuVklFV19SRVNQT05TRSk7CisJCQorCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwodmlld2VyQ29tcCwgU1dULk5PTkUpOworCQltZXNzYWdlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7CisJCQorCQlsYXlvdXQudG9wQ29udHJvbCA9IG1lc3NhZ2VUZXh0OworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAI2NyZWF0ZURvY3VtZW50KFN0cmluZykKKwkgKi8KKwlwcm90ZWN0ZWQgYnl0ZVtdIGNyZWF0ZURvY3VtZW50KFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CQorCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCQkJdHJ5IHsKKwkJCQlmYWN0b3J5LnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2FsbG93LWphdmEtZW5jb2RpbmdzIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOworCQkJCWZhY3Rvcnkuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLCBuZXcgQm9vbGVhbih0cnVlKSk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisJCQkKKwkJCWlmICh4bWxUYWdNaXNzaW5nKSB7CisJCQkJc3RyID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKyBzdHI7CisJCQl9IGVsc2UgeworCQkJCVN0cmluZyBzdHJfdGVtcCA9IHN0ci50b0xvd2VyQ2FzZSgpOworCQkJCQorCQkJCS8vIGlmIGVuY29kaW5nIHByZXNlbnQsIHRoZW4gc2F2ZSBvcmlnaW5hbCBlbmNvZGluZyBhbmQgY2hhbmdlIHRvIFVURi04CisJCQkJaW50IGluZCA9IHN0cl90ZW1wLmluZGV4T2YoImVuY29kaW5nPSIpOworCQkJCWlmIChpbmQgPj0gMCkgeworCQkJCQlTdHJpbmcgdGVtcDEgPSBzdHIuc3Vic3RyaW5nKGluZCk7CisJCQkJCWludCBiZWdpbkluZGV4ID0gdGVtcDEuaW5kZXhPZigiXCIiKSArIDE7CisJCQkJCVN0cmluZyB0ZW1wMiA9IHRlbXAxLnN1YnN0cmluZyhiZWdpbkluZGV4KTsKKwkJCQkJaW50IGVuZEluZGV4ID0gdGVtcDIuaW5kZXhPZigiXCIiKTsKKwkJCQkJb3JpZ2luYWxFbmNvZGluZyA9IHRlbXAyLnN1YnN0cmluZygwLCBlbmRJbmRleCk7CisJCQkJCWlmICghInV0Zi04Ii5lcXVhbHMob3JpZ2luYWxFbmNvZGluZykpCisJCQkJCQlzZXRFbmNvZGluZyA9IHRydWU7CisJCQkJfSBlbHNlIGlmIChpbmQgPCAwKSB7IC8vaWYgbm8gZW5jb2RpbmcgYXQgYWxsLHRoZW4gbm8gY2hhbmdlcyB0byBiZSBtYWRlCisJCQkJCXNldEVuY29kaW5nID0gZmFsc2U7CisJCQkJCW1pc3NpbmdFbmNvZGluZyA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJYnl0ZVtdIHBhcnNlQXJyYXkgPSBzdHIuZ2V0Qnl0ZXMoKTsKKwkJCURvY3VtZW50IGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGFyc2VBcnJheSkpKTsKKwkJCXJldHVybiBnZXRDb250ZW50cyhkb2N1bWVudCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludmFsaWQgWE1MIik7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYnl0ZVtdIGdldENvbnRlbnRzKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvdXQpOworCQlTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2N1bWVudCk7CisJCXRyeSB7CisJCQlUcmFuc2Zvcm1lckZhY3RvcnkgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJCXRyeSB7CisJCQkJdGYuc2V0QXR0cmlidXRlKCJpbmRlbnQtbnVtYmVyIiwgbmV3IEludGVnZXIoMikpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCS8vIGlnbm9yZSAtIGZhaWxzIG9uIEpESyAxLjQKKwkJCX0KKwkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdGYubmV3VHJhbnNmb3JtZXIoKTsKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKKwkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7CisJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOworCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOworCQl9CisJCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKKwl9CisKKwkvKiogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl2aWV3ZXJDb21wLmRpc3Bvc2UoKTsKKwkJdmlld2VyQ29tcCA9IG51bGw7CisJCWNvbnRlbnQgPSBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQ4NTc2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDI3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGx1Z2luTmFtZT1UQ1AvSVAgTW9uaXRvcgorcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCisKK2V4dGVuc2lvblBvaW50Vmlld2Vycz1WaWV3ZXJzCisKK3ZpZXdUaXRsZT1UQ1AvSVAgTW9uaXRvcgorYWN0aW9uUmVzZW5kPVJlc2VuZCByZXF1ZXN0CithY3Rpb25Nb2RpZnk9TW9kaWZ5IHJlcXVlc3QKK2FjdGlvbk1vZGlmeVJlc2VuZD1TZW5kIE1vZGlmaWVkIFJlcXVlc3QKKworYnl0ZVZpZXc9Qnl0ZQoraW1hZ2VWaWV3PUltYWdlCit4bWxWaWV3PVhNTAorYnJvd3NlclZpZXc9V2ViIEJyb3dzZXIKKworcHJlZmVyZW5jZVRpdGxlPVRDUC9JUCBNb25pdG9yCitwcmVmZXJlbmNlS2V5d29yZHM9ZGVidWcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzNjEwZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvcGx1Z2luLnhtbApAQCAtMCwwICsxLDEwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKworPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRWaWV3ZXJzIiBpZD0idmlld2VycyIgc2NoZW1hPSJzY2hlbWEvdmlld2Vycy5leHNkIi8+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWxTdGFydHVwIj4KKyAgPHN0YXJ0dXAKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlN0YXJ0dXAiLz4KKzwvZXh0ZW5zaW9uPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+IAorICA8dmlldworICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3IgorICAgIG5hbWU9IiV2aWV3VGl0bGUiCisgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpIgorICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3Lk1vbml0b3JWaWV3IgorICAgIGljb249Imljb25zL2N2aWV3MTYvbW9uaXRvclZpZXcuZ2lmIj4KKyAgPC92aWV3PgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgIDxwYWdlCisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnByZWZlcmVuY2VQYWdlIgorICAgIG5hbWU9IiVwcmVmZXJlbmNlVGl0bGUiCisgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUHJlZmVyZW5jZVBhZ2UiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JQcmVmZXJlbmNlUGFnZSI+CisgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZUtleXdvcmRzIi8+CisgIDwvcGFnZT4KKzwvZXh0ZW5zaW9uPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+CisgIDxrZXl3b3JkCisgICAgbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMiCisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnByZWZlcmVuY2VLZXl3b3JkcyIvPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLnZpZXdlcnMiPgorICA8dmlld2VyCisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMuYnl0ZSIKKyAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5CeXRlVmlld2VyIgorICAgIHR5cGU9InJlcXVlc3RyZXNwb25zZSIKKyAgICBsYWJlbD0iJWJ5dGVWaWV3Ii8+CisgIDx2aWV3ZXIKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5pbWFnZSIKKyAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5JbWFnZVZpZXdlciIKKyAgICB0eXBlPSJyZXF1ZXN0cmVzcG9uc2UiCisgICAgbGFiZWw9IiVpbWFnZVZpZXciLz4KKyAgPHZpZXdlcgorICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLnhtbCIKKyAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5YTUxWaWV3ZXIiCisgICAgdHlwZT0icmVxdWVzdHJlc3BvbnNlIgorICAgIGxhYmVsPSIleG1sVmlldyIvPgorICA8dmlld2VyCisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMuYnJvd3NlciIKKyAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5Ccm93c2VyVmlld2VyIgorICAgIHR5cGU9InJlcXVlc3RyZXNwb25zZSIKKyAgICBsYWJlbD0iJWJyb3dzZXJWaWV3Ii8+Cis8L2V4dGVuc2lvbj4KKworPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KKyAgPGZhY3RvcnkKKyAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuUmVxdWVzdEFkYXB0ZXJGYWN0b3J5IgorICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdCI+CisgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlciIvPgorICA8L2ZhY3Rvcnk+Cis8L2V4dGVuc2lvbj4KKworPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CisgICAgPG9iamVjdENvbnRyaWJ1dGlvbgorICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3QiCisgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLm1vZGlmeWFjdGlvbiI+CisgICAgICAgPGZpbHRlciBuYW1lPSJyZXF1ZXN0c2VudCIgdmFsdWU9InRydWUiLz4KKyAgICAgICA8YWN0aW9uCisgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb25SZXNlbmQiCisgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKKyAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5SZXNlbmRNZXNzYWdlQWN0aW9uIgorICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCisgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuUmVzZW5kTWVzc2FnZUFjdGlvbiIKKyAgICAgICAgICAgICBpY29uPSJpY29ucy9lbGNsMTYvcmVzZW5kUmVxdWVzdC5naWYiPgorICAgICAgIDwvYWN0aW9uPgorICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbk1vZGlmeSIKKyAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgorICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3Lk1vZGlmeU1lc3NhZ2VBY3Rpb24iCisgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKKyAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5Nb2RpZnlNZXNzYWdlQWN0aW9uIgorICAgICAgICAgICAgIGljb249Imljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmIj4KKyAgICAgICA8L2FjdGlvbj4KKyAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KKyAgICA8b2JqZWN0Q29udHJpYnV0aW9uCisgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdCIKKyAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuc2VuZG1vZGlmeWFjdGlvbiI+CisgICAgICAgPGZpbHRlciBuYW1lPSJyZXF1ZXN0c2VudCIgdmFsdWU9ImZhbHNlIi8+ICAgIAorICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbk1vZGlmeVJlc2VuZCIKKyAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgorICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LlNlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24iCisgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKKyAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5TZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uIgorICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZiI+CisgICAgICAgPC9hY3Rpb24+CisgICAgPC9vYmplY3RDb250cmlidXRpb24+Cis8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9zY2hlbWEvdmlld2Vycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9zY2hlbWEvdmlld2Vycy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzYzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3NjaGVtYS92aWV3ZXJzLmV4c2QKQEAgLTAsMCArMSwxNDMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIiBpZD0idmlld2VycyIgbmFtZT0iQ29udGVudCBWaWV3ZXJzIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIHZpZXdlciBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIGNvbnRlbnQuIChlLmcuIGEgdmlld2VyIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UgZm9ybWF0KQ0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJ2aWV3ZXIiPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCisgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyJmx0Oy9zYW1wJmd0Oy4gVmlld2VycyBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyIi8+DQorICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgY29udGVudCB2aWV3ZXINCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBbaXNzdWU6IHdoYXQgaXMgdGhpcyB1c2VkIGZvcj9dDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIDEuMA0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250ZW50IHZpZXdlciBleHRlbnNpb24gcG9pbnQ6DQorDQorJmx0O3ByZSZndDsNCisgICAmbHQ7ZXh0ZW5zaW9uIA0KKyAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLnZpZXdlcnMmcXVvdDsmZ3Q7DQorICAgICAgJmx0O3ZpZXdlcg0KKyAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLmJ5dGV2aWV3ZXImcXVvdDsNCisgICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5CeXRlQ29udGVudFZpZXdlciZxdW90Ow0KKyAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVxdWVzdHJlc3BvbnNlJnF1b3Q7DQorICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JWJ5dGVWaWV3JnF1b3Q7LyZndDsNCisgICAmbHQ7L2V4dGVuc2lvbiZndDsNCismbHQ7L3ByZSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgYWJzdHJhY3QgY2xhc3MgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlciZsdDsvY29kZSZndDsuDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIA0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCit0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCismbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5jbGFzc3BhdGgKaW5kZXggYTZlYjk5OC4uOTIxZGFmMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uY2xhc3NwYXRoCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxjbGFzc3BhdGg+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VydmVyY29yZS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgogPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggNGM0NTkzNC4uMjkyMDg1MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMSwyNCArMSwyNSBAQAotI0ZyaSBGZWIgMjMgMjE6MTE6NTIgRVNUIDIwMDcKKyNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3CiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQoraW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgogb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCkBAIC0zMyw3ICszNCw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKQEAgLTQxLDEzICs0MiwxNSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCkBAIC02MiwxMyArNjUsMTMgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBkZjIxODc1Li4xM2EwODQxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMiw3ICsyLDcgQEAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjA2LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDEuMS40LnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCkBAIC0xOCw1ICsxOCw1IEBACiAgb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAogIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2Fib3V0Lmh0bWwKaW5kZXggNzNkYjM2ZS4uMjE5OWRmMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvYWJvdXQuaHRtbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sCkBAIC0xMCw3ICsxMCw3IEBACiAKIDxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgogCi08UD5KdW5lIDA2LCAyMDA3PC9QPgorPFA+SnVuZSwgMjAwODwvUD4KIAogPEgzPkxpY2Vuc2U8L0gzPgogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvYnVpbGQucHJvcGVydGllcwppbmRleCA2OWE1MjZlLi44MmUzMmI4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTE3LDYgKzE3LDUgQEAKIGJpbi5leGNsdWRlcyA9IGJpbi8qKixcCiAgICAgICAgICAgICAgICBAZG90LyoqLFwKICAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKK3NyYy5pbmNsdWRlcyA9IHNjaGVtYS8KIHNvdXJjZS4uID0gc2VydmVyY29yZS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2RlYjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyIj4KLSAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotICA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPgotICAgIDx0eXBlIG5hbWU9IklNb2R1bGUiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSU1vZHVsZUFydGlmYWN0IiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IklNb2R1bGVUeXBlIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotPCEtLSAgICA8dHlwZSBuYW1lPSJJUHJvamVjdFByb3BlcnRpZXMiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+LS0+Ci0gICAgPHR5cGUgbmFtZT0iSVB1Ymxpc2hMaXN0ZW5lciIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJJUnVudGltZSIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotPCEtLSAgICA8dHlwZSBuYW1lPSJJUnVudGltZVRhcmdldEhhbmRsZXIiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+LS0+Ci0gICAgPHR5cGUgbmFtZT0iSVJ1bnRpbWVUeXBlIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IklSdW50aW1lV29ya2luZ0NvcHkiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSVNlcnZlciIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJJU2VydmVyQXR0cmlidXRlcyIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSVNlcnZlckxpc3RlbmVyIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IklTZXJ2ZXJUeXBlIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IklTZXJ2ZXJXb3JraW5nQ29weSIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJTZXJ2ZXJDb3JlIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IlNlcnZlckV2ZW50IiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IlNlcnZlclBvcnQiLz4KLSAgICA8dHlwZSBuYW1lPSJTZXJ2ZXJVdGlsIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IlRhc2tNb2RlbCIgaW1wbGVtZW50PSJmYWxzZSIvPgotICA8L3BhY2thZ2U+Ci0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbCI+Ci0gICAgPHR5cGUgbmFtZT0iSVVSTFByb3ZpZGVyIiBzdWJjbGFzcz0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJNb2R1bGVGYWN0b3J5RGVsZWdhdGUiLz4KLSAgICA8dHlwZSBuYW1lPSJSdW50aW1lRGVsZWdhdGUiLz4KLSAgICA8dHlwZSBuYW1lPSJSdW50aW1lTG9jYXRvckRlbGVnYXRlIi8+Ci08IS0tICAgIDx0eXBlIG5hbWU9IlJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUiLz4gLS0+Ci0gICAgPHR5cGUgbmFtZT0iSU1vZHVsZUZpbGUiLz4KLSAgICA8dHlwZSBuYW1lPSJJTW9kdWxlRm9sZGVyIi8+Ci0gICAgPHR5cGUgbmFtZT0iSU1vZHVsZVJlc291cmNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSU1vZHVsZVJlc291cmNlRGVsdGEiLz4KLSAgICA8dHlwZSBuYW1lPSJNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSIvPgotICAgIDx0eXBlIG5hbWU9IkxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUiLz4KLSAgICA8dHlwZSBuYW1lPSJDbGllbnREZWxlZ2F0ZSIvPgotICAgIDx0eXBlIG5hbWU9Ik1vZHVsZURlbGVnYXRlIi8+Ci0gICAgPHR5cGUgbmFtZT0iUHVibGlzaFRhc2tEZWxlZ2F0ZSIvPgotICAgIDx0eXBlIG5hbWU9IlB1Ymxpc2hPcGVyYXRpb24iLz4KLSAgICA8dHlwZSBuYW1lPSJTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSIvPgotICAgIDx0eXBlIG5hbWU9IlNlcnZlckRlbGVnYXRlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSW50ZXJuYWxJbml0aWFsaXplciIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIHJlZmVyZW5jZT0iZmFsc2UiLz4KLSAgPC9wYWNrYWdlPgotICA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbCI+Ci0gICAgPHR5cGUgbmFtZT0iSHR0cExhdW5jaGFibGUiLz4KLSAgICA8dHlwZSBuYW1lPSJJU3RhdGljV2ViIi8+Ci0gICAgPHR5cGUgbmFtZT0iTnVsbE1vZHVsZUFydGlmYWN0Ii8+Ci0gICAgPHR5cGUgbmFtZT0iUHVibGlzaEFkYXB0ZXIiLz4KLSAgICA8dHlwZSBuYW1lPSJQcm9qZWN0TW9kdWxlIi8+Ci0gICAgPHR5cGUgbmFtZT0iUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSIvPgotICAgIDx0eXBlIG5hbWU9IlJ1bnRpbWVMaWZlY3ljbGVBZGFwdGVyIi8+Ci0gICAgPHR5cGUgbmFtZT0iU2VydmVyTGlmZWN5Y2xlQWRhcHRlciIvPgotICAgIDx0eXBlIG5hbWU9IlNvY2tldFV0aWwiLz4KLSAgICA8dHlwZSBuYW1lPSJXZWJSZXNvdXJjZSIvPgotICA8L3BhY2thZ2U+Ci0KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiPgotICAgIDx0eXBlIG5hbWU9IlNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIiLz4KLSAgICA8dHlwZSBuYW1lPSJTZXJ2ZXJVSVV0aWwiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iU2VydmVyVUlDb3JlIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICA8L3BhY2thZ2U+Ci0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yIj4KLSAgICA8dHlwZSBuYW1lPSJTZXJ2ZXJFZGl0b3JQYXJ0Ii8+Ci0gICAgPHR5cGUgbmFtZT0iU2VydmVyRWRpdG9yU2VjdGlvbiIvPgotICAgIDx0eXBlIG5hbWU9IklTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQiLz4KLSAgPC9wYWNrYWdlPgotICA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZCI+Ci0gICAgPHR5cGUgbmFtZT0iSVdpemFyZEhhbmRsZSIvPgotICAgIDx0eXBlIG5hbWU9IldpemFyZEZyYWdtZW50Ii8+Ci0gIDwvcGFja2FnZT4KLQotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3IiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKaW5kZXggZWIyNjQ3Yi4uNTE2NjgwYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjMsNiArMjMsNyBAQAogZXh0ZW5zaW9uUG9pbnRMYXVuY2hhYmxlQWRhcHRlcnM9TGF1bmNoYWJsZSBBZGFwdGVycwogZXh0ZW5zaW9uUG9pbnRDbGllbnRzPUNsaWVudHMKIGV4dGVuc2lvblBvaW50UHVibGlzaFRhc2tzPVB1Ymxpc2ggVGFza3MKK2V4dGVuc2lvblBvaW50UHVibGlzaGVycz1QdWJsaXNoZXJzCiBleHRlbnNpb25Qb2ludFNlcnZlck1vbml0b3JzPVNlcnZlciBNb25pdG9ycwogZXh0ZW5zaW9uUG9pbnRJbnN0YWxsYWJsZVNlcnZlcnM9SW5zdGFsbGFibGUgU2VydmVycwogZXh0ZW5zaW9uUG9pbnRJbnN0YWxsYWJsZVJ1bnRpbWVzPUluc3RhbGxhYmxlIFJ1bnRpbWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnhtbAppbmRleCA4ODg3NTIzLi4zZTY5MjQ0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ueG1sCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3BsdWdpbi54bWwKQEAgLTcsMTIgKzcsMTMgQEAKICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZVRhcmdldEhhbmRsZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lVGFyZ2V0SGFuZGxlcnMiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVUYXJnZXRIYW5kbGVycy5leHNkIi8+CiAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVMb2NhdG9ycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UnVudGltZUxvY2F0b3JzIiBzY2hlbWE9InNjaGVtYS9ydW50aW1lTG9jYXRvcnMuZXhzZCIvPgogICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJUeXBlcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVyVHlwZXMiIHNjaGVtYT0ic2NoZW1hL3NlcnZlclR5cGVzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVyTG9jYXRvcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlckxvY2F0b3JzIiBzY2hlbWE9InNjaGVtYS9pbnRlcm5hbFNlcnZlckxvY2F0b3JzLmV4c2QiLz4KKyAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVyTG9jYXRvcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlckxvY2F0b3JzIiBzY2hlbWE9InNjaGVtYS9zZXJ2ZXJMb2NhdG9ycy5leHNkIi8+CiAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZHVsZUZhY3RvcmllcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50TW9kdWxlRmFjdG9yaWVzIiBzY2hlbWE9InNjaGVtYS9tb2R1bGVGYWN0b3JpZXMuZXhzZCIvPgogICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBzY2hlbWE9InNjaGVtYS9tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLmV4c2QiLz4KICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibGF1bmNoYWJsZUFkYXB0ZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRMYXVuY2hhYmxlQWRhcHRlcnMiIHNjaGVtYT0ic2NoZW1hL2xhdW5jaGFibGVBZGFwdGVycy5leHNkIi8+CiAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNsaWVudHMiIG5hbWU9IiVleHRlbnNpb25Qb2ludENsaWVudHMiIHNjaGVtYT0ic2NoZW1hL2NsaWVudHMuZXhzZCIvPgogICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwdWJsaXNoVGFza3MiIG5hbWU9IiVleHRlbnNpb25Qb2ludFB1Ymxpc2hUYXNrcyIgc2NoZW1hPSJzY2hlbWEvcHVibGlzaFRhc2tzLmV4c2QiLz4KKyAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHVibGlzaGVycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UHVibGlzaGVycyIgc2NoZW1hPSJzY2hlbWEvcHVibGlzaGVycy5leHNkIi8+CiAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludGVybmFsU2VydmVyTW9uaXRvcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlck1vbml0b3JzIiBzY2hlbWE9InNjaGVtYS9zZXJ2ZXJNb25pdG9ycy5leHNkIi8+CiAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludGVybmFsU3RhcnR1cCIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVyU3RhcnR1cCIgc2NoZW1hPSJzY2hlbWEvc3RhcnR1cC5leHNkIi8+CiAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Imluc3RhbGxhYmxlU2VydmVycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50SW5zdGFsbGFibGVTZXJ2ZXJzIiBzY2hlbWE9InNjaGVtYS9pbnN0YWxsYWJsZVNlcnZlcnMuZXhzZCIvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2NsaWVudHMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9jbGllbnRzLmV4c2QKaW5kZXggMTdhMzAxNC4uZmFlYWRmOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2NsaWVudHMuZXhzZAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvY2xpZW50cy5leHNkCkBAIC0xLDEwICsxLDEwIEBACiA8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KIDwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCiA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCisgICAgICA8YXBwaW5mbz4NCiAgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJjbGllbnRzIiBuYW1lPSJDbGllbnRzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDwvYXBwaW5mbz4NCiAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCiAgICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBsYXVuY2ggYSBjbGllbnQgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHJ1biBvbiBhIHNlcnZlci4NCiAgICAgICA8L2RvY3VtZW50YXRpb24+DQpAQCAtNDMsOSArNDMsOSBAQAogDQogICAgPGVsZW1lbnQgbmFtZT0iY2xpZW50Ij4NCiAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8YXBwaW5mbz4NCiAgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgIDwvYXBwaW5mbz4NCiAgICAgICA8L2Fubm90YXRpb24+DQogICAgICAgPGNvbXBsZXhUeXBlPg0KICAgICAgICAgIDxzZXF1ZW5jZT4NCkBAIC02NCw5ICs2NCw5IEBACiAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kICZsdDtzYW1wJmd0O0NsaWVudERlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCiBDbGllaW50IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0byBsYXVuY2guDQogICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgIDxhcHBpbmZvPg0KICAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuQ2xpZW50RGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KICAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICAgICA8L2F0dHJpYnV0ZT4NCiAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQpAQCAtNzQsNiArNzQsOSBAQAogICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQogICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBjbGllbnQNCiAgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcGluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4NCiAgICAgICAgICAgICA8L2Fubm90YXRpb24+DQogICAgICAgICAgPC9hdHRyaWJ1dGU+DQogICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCkBAIC04MSw2ICs4NCw5IEBACiAgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCiAgICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNsaWVudA0KICAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwaW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQorICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KICAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICAgICA8L2F0dHJpYnV0ZT4NCiAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhdW5jaGFibGUiIHR5cGU9InN0cmluZyI+DQpAQCAtMTAxLDE4ICsxMDcsMjcgQEAKICAgIDwvZWxlbWVudD4NCiANCiAgICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCisgICAgICA8YXBwaW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCisgICAgICA8L2FwcGluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwaW5mbz4NCiAgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDwvYXBwaW5mbz4NCiAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCiAgICAgICAgICAxLjANCiAgICAgICA8L2RvY3VtZW50YXRpb24+DQogICAgPC9hbm5vdGF0aW9uPg0KIA0KICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KKyAgICAgIDxhcHBpbmZvPg0KICAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQorICAgICAgPC9hcHBpbmZvPg0KICAgICAgIDxkb2N1bWVudGF0aW9uPg0KICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIGNsaWVudCBleHRlbnNpb24gcG9pbnQ6DQogDQpAQCAtMTI5LDI4ICsxNDQsMTIgQEAKICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCiAgICA8L2Fubm90YXRpb24+DQogDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5DbGllbnREZWxlZ2F0ZSZsdDsvY29kZSZndDsgYW5kIGNvbnRhaW5zIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQorDQogDQogICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KKyAgICAgIDxhcHBpbmZvPg0KICAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDwvYXBwaW5mbz4NCiAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCiAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2luc3RhbGxhYmxlUnVudGltZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnN0YWxsYWJsZVJ1bnRpbWVzLmV4c2QKaW5kZXggZmFhMTZlYS4uZTAxZTkyYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2luc3RhbGxhYmxlUnVudGltZXMuZXhzZAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW5zdGFsbGFibGVSdW50aW1lcy5leHNkCkBAIC0xLDE5ICsxLDIyIEBACiA8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgogPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+CisgICAgICA8YXBwaW5mbz4KICAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9Imluc3RhbGxhYmxlUnVudGltZXMiIG5hbWU9Ikluc3RhbGxhYmxlIFJ1bnRpbWVzIi8+Ci0gICAgICA8L2FwcEluZm8+CisgICAgICA8L2FwcGluZm8+CiAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gaW5zdGFsbCBuZXcgcnVudGltZXMgZnJvbSByZW1vdGUgdXBkYXRlIG1hbmFnZXIgc2l0ZXMuCisgICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGluc3RhbGwgbmV3IHJ1bnRpbWVzIChpLmUuIHNlcnZlciBpbnN0YWxsYXRpb25zKSBmcm9tIGEgcmVtb3RlIHNlcnZlci4KKworTmV3IHVzZXJzIHNob3VsZCB1c2UgdGhlICZhcG9zO3J1bnRpbWUmYXBvczsgZWxlbWVudCAod2hpY2ggYWxsb3dzIHlvdSB0byBwb2ludCB0byBhbnkgemlwIGZpbGUgb24gYW55IHNlcnZlcikgYW5kIG5vdCB0aGUgb3JpZ2luYWwgJmFwb3M7aW5zdGFsbGFibGVSdW50aW1lJmFwb3M7IGVsZW1lbnQgKHdoaWNoIHJlcXVpcmVzIGEgcmVtb3RlIHVwZGF0ZSBtYW5hZ2VyIHNpdGUpLgogICAgICAgPC9kb2N1bWVudGF0aW9uPgogICAgPC9hbm5vdGF0aW9uPgogCiAgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgogICAgICAgPGNvbXBsZXhUeXBlPgogICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnN0YWxsYWJsZVJ1bnRpbWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW5zdGFsbGFibGVSdW50aW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KICAgICAgICAgIDwvc2VxdWVuY2U+CiAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgogICAgICAgICAgICAgPGFubm90YXRpb24+CkBAIC00MSw5ICs0NCw5IEBACiAKICAgIDxlbGVtZW50IG5hbWU9Imluc3RhbGxhYmxlUnVudGltZSI+CiAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIgZGVwcmVjYXRlZD0idHJ1ZSIvPgorICAgICAgICAgPC9hcHBpbmZvPgogICAgICAgPC9hbm5vdGF0aW9uPgogICAgICAgPGNvbXBsZXhUeXBlPgogICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KQEAgLTc5LDYgKzgyLDkgQEAKICAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgogICAgICAgICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBidW5kbGUgaW4gd2hpY2ggdGhlIHJ1bnRpbWUgemlwIGlzIGluCiAgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBkZXByZWNhdGVkPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CiAgICAgICAgICAgICA8L2Fubm90YXRpb24+CiAgICAgICAgICA8L2F0dHJpYnV0ZT4KICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVuZGxlVmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KQEAgLTg2LDMxICs5Miw4MiBAQAogICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CiAgICAgICAgICAgICAgICAgICB0aGUgb3B0aW9uYWwgdmVyc2lvbiBvZiB0aGUgYnVuZGxlIGluIHdoaWNoIHRoZSBydW50aW1lIHppcCBpcyBpbgogICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgZGVwcmVjYXRlZD0idHJ1ZSIvPgorICAgICAgICAgICAgICAgPC9hcHBpbmZvPgogICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgogICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHR5cGU9InN0cmluZyI+CiAgICAgICAgICAgICA8YW5ub3RhdGlvbj4KICAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgogICAgICAgICAgICAgICAgICAgaWYgYnVuZGxlSWQgaXMgc3BlY2lmaWVkIHRoZW4gcmVwcmVzZW50cyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcnVudGltZSB6aXAgaW5zaWRlIHRoZSBidW5kbGUsIG90aGVyd2lzZSBpdCBhc3N1bWVzIGEgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcnVudGltZSBhcmNoaXZlIGluc2lkZSB0aGUgZmVhdHVyZSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBpbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0icnVudGltZSI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxhcHBpbmZvPgorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4KKyAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZVVybCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIFVSTCB0byB0aGUgcnVudGltZSBhcmNoaXZlIGRvd25sb2FkCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZVBhdGgiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgcGF0aCB3aXRoaW4gdGhlIGFyY2hpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHJ1bnRpbWUKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaWNlbnNlVXJsIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgVVJMIHRvIHRoZSBydW50aW1lIGxpY2Vuc2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcyIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBvcHRpb25hbCBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbSBkZXNpZ25hdG9ycyBkZWZpbmVkIGJ5IEVjbGlwc2UgKHNlZSBKYXZhZG9jIGZvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0pLiBJbmRpY2F0ZXMgdGhpcyBpbnN0YWxsYWJsZSBydW50aW1lIHNob3VsZCBvbmx5IGJlIHVzZWQgb24gb25lIG9mIHRoZSBzcGVjaWZpZWQgT1Mgc3lzdGVtcy4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZlYXR1cmUgY2FuIGJlIGluc3RhbGxlZCBvbiBhbGwgc3lzdGVtcyAocG9ydGFibGUgaW1wbGVtZW50YXRpb24pCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CiAgICAgICAgICAgICA8L2Fubm90YXRpb24+CiAgICAgICAgICA8L2F0dHJpYnV0ZT4KICAgICAgIDwvY29tcGxleFR5cGU+CiAgICA8L2VsZW1lbnQ+CiAKICAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+CisgICAgICA8YXBwaW5mbz4KICAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDwvYXBwaW5mbz4KICAgICAgIDxkb2N1bWVudGF0aW9uPgogICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7CiAgICAgICA8L2RvY3VtZW50YXRpb24+CiAgICA8L2Fubm90YXRpb24+CiAKICAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+CisgICAgICA8YXBwaW5mbz4KICAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDwvYXBwaW5mbz4KICAgICAgIDxkb2N1bWVudGF0aW9uPgogICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGluc3RhbGxhYmxlIHJ1bnRpbWUgZXh0ZW5zaW9uIHBvaW50OgogCkBAIC0xNTYsMjggKzIxMywxMyBAQAogICAgICAgPC9kb2N1bWVudGF0aW9uPgogICAgPC9hbm5vdGF0aW9uPgogCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgorCisKIAogICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+CisgICAgICA8YXBwaW5mbz4KICAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+CisgICAgICA8L2FwcGluZm8+CiAgICAgICA8ZG9jdW1lbnRhdGlvbj4KICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7CiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2xhdW5jaGFibGVBZGFwdGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2xhdW5jaGFibGVBZGFwdGVycy5leHNkCmluZGV4IDU5OGY0OGUuLjk3MzQzYWEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9sYXVuY2hhYmxlQWRhcHRlcnMuZXhzZAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbGF1bmNoYWJsZUFkYXB0ZXJzLmV4c2QKQEAgLTEsMTAgKzEsMTAgQEAKIDw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQogPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KKyAgICAgIDxhcHBpbmZvPg0KICAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9ImxhdW5jaGFibGVBZGFwdGVycyIgbmFtZT0iTGF1bmNoYWJsZSBBZGFwdGVycyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2FwcGluZm8+DQogICAgICAgPGRvY3VtZW50YXRpb24+DQogICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgZm9yIGEgc2VydmVyIHRvIHN1cHBvcnQgdGhlIFJ1biBvbiBTZXJ2ZXIgc2NlbmFyaW8uDQogICAgICAgPC9kb2N1bWVudGF0aW9uPg0KQEAgLTQxLDkgKzQxLDkgQEAKIA0KICAgIDxlbGVtZW50IG5hbWU9ImxhdW5jaGFibGVBZGFwdGVyIj4NCiAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQorICAgICAgICAgPC9hcHBpbmZvPg0KICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICA8Y29tcGxleFR5cGU+DQogICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCkBAIC01OSw5ICs1OSw5IEBACiAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCiBMYXVuY2hhYmxlIGFkYXB0ZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLg0KICAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICAgICA8YXBwaW5mbz4NCiAgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KICAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICAgICA8L2F0dHJpYnV0ZT4NCiAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyI+DQpAQCAtNzEsMjIgKzcxLDI5IEBACiAgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQogICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KICAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgcHJpb3JpdHkgYXRycmlidXRlIHdoaWNoIHNwZWNpZmllcyBhIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGxhdW5jaGFibGUgYWRhcHRlcnMuIEFkYXB0ZXJzIHdpdGggYSBoaWdoZXIgbnVtYmVyIGFyZSBhbHdheXMgdXNlZCBmaXJzdC4gVG8gb3ZlcnJpZGUgYW5vdGhlciBhZGFwdGVyLCBzaW1wbHkgcHJvdmlkZSBhIGhpZ2hlciBwcmlvcml0eSB2YWx1ZSB0aGF0IHRoZSBvdGhlciBhZGFwdGVyLiBUaGUgcHJpb3JpdHkgaXMgMCBpZiBubyBwcmlvcml0eSBpcyBzcGVjaWZpZWQNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KICAgICAgIDwvY29tcGxleFR5cGU+DQogICAgPC9lbGVtZW50Pg0KIA0KICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KKyAgICAgIDxhcHBpbmZvPg0KICAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQorICAgICAgPC9hcHBpbmZvPg0KICAgICAgIDxkb2N1bWVudGF0aW9uPg0KICAgICAgICAgIDEuMA0KICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCiAgICA8L2Fubm90YXRpb24+DQogDQogICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQorICAgICAgPGFwcGluZm8+DQogICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2FwcGluZm8+DQogICAgICAgPGRvY3VtZW50YXRpb24+DQogICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgbGF1bmNoYWJsZSBhZGFwdGVyIGV4dGVuc2lvbiBwb2ludDoNCiANCkBAIC0xMDIsMjcgKzEwOSwyMCBAQAogICAgPC9hbm5vdGF0aW9uPg0KIA0KICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KKyAgICAgIDxhcHBpbmZvPg0KICAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2FwcGluZm8+DQogICAgICAgPGRvY3VtZW50YXRpb24+DQogICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCiAgICAgICA8L2RvY3VtZW50YXRpb24+DQogICAgPC9hbm5vdGF0aW9uPg0KIA0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCisNCiANCiAgICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCisgICAgICA8YXBwaW5mbz4NCiAgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2FwcGluZm8+DQogICAgICAgPGRvY3VtZW50YXRpb24+DQogICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlQXJ0aWZhY3RBZGFwdGVycy5leHNkCmluZGV4IDVjNTAyODkuLmQ5MjdhNmMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLmV4c2QKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZUFydGlmYWN0QWRhcHRlcnMuZXhzZApAQCAtMSwxMCArMSwxMCBAQAogPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCiA8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBuYW1lPSJNb2R1bGUgQXJ0aWZhY3QgQWRhcHRlcnMiLz4NCi0gICAgICA8L2FwcEluZm8+DQorICAgICAgPGFwcGluZm8+DQorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0ibW9kdWxlQXJ0aWZhY3RBZGFwdGVycyIgbmFtZT0iTW9kdWxlIEFydGlmYWN0IEFkYXB0ZXJzIi8+DQorICAgICAgPC9hcHBpbmZvPg0KICAgICAgIDxkb2N1bWVudGF0aW9uPg0KICAgICAgICAgIA0KICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCkBAIC0xMyw2ICsxMywxMSBAQAogICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQogDQogICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCisgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICA8YXBwaW5mbz4NCisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+DQorICAgICAgICAgPC9hcHBpbmZvPg0KKyAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICA8Y29tcGxleFR5cGU+DQogICAgICAgICAgPHNlcXVlbmNlPg0KICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibW9kdWxlQXJ0aWZhY3RBZGFwdGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQpAQCAtNDMsOSArNDgsOSBAQAogDQogICAgPGVsZW1lbnQgbmFtZT0ibW9kdWxlQXJ0aWZhY3RBZGFwdGVyIj4NCiAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQorICAgICAgICAgPC9hcHBpbmZvPg0KICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICA8Y29tcGxleFR5cGU+DQogICAgICAgICAgPHNlcXVlbmNlPg0KQEAgLTYzLDkgKzY4LDkgQEAKICAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQogICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgIDxhcHBpbmZvPg0KICAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KICAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICAgICA8L2F0dHJpYnV0ZT4NCiAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciPg0KQEAgLTc5LDE4ICs4NCwxOCBAQAogICAgPC9lbGVtZW50Pg0KIA0KICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KKyAgICAgIDxhcHBpbmZvPg0KICAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQorICAgICAgPC9hcHBpbmZvPg0KICAgICAgIDxkb2N1bWVudGF0aW9uPg0KICAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCiAgICA8L2Fubm90YXRpb24+DQogDQogICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQorICAgICAgPGFwcGluZm8+DQogICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2FwcGluZm8+DQogICAgICAgPGRvY3VtZW50YXRpb24+DQogICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgbW9kdWxlIG9iamVjdCBhZGFwdGVyIGV4dGVuc2lvbiBwb2ludDoNCiANCkBAIC0xMDEsMjkgKzEwNiwyMSBAQAogICAgPC9hbm5vdGF0aW9uPg0KIA0KICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KKyAgICAgIDxhcHBpbmZvPg0KICAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2FwcGluZm8+DQogICAgICAgPGRvY3VtZW50YXRpb24+DQogICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQogICAgICAgPC9kb2N1bWVudGF0aW9uPg0KICAgIDwvYW5ub3RhdGlvbj4NCiANCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQogDQogICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQorICAgICAgPGFwcGluZm8+DQogICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQorICAgICAgPC9hcHBpbmZvPg0KICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCiB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlRmFjdG9yaWVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlRmFjdG9yaWVzLmV4c2QKaW5kZXggZDA4ZDRkMy4uNGVlNzc5ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZUZhY3Rvcmllcy5leHNkCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVGYWN0b3JpZXMuZXhzZApAQCAtNDIsNyArNDIsNyBAQAogICAgPGVsZW1lbnQgbmFtZT0ibW9kdWxlRmFjdG9yeSI+DQogICAgICAgPGFubm90YXRpb24+DQogICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQogICAgICAgICAgPC9hcHBJbmZvPg0KICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICA8Y29tcGxleFR5cGU+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3B1Ymxpc2hlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9wdWJsaXNoZXJzLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjODZkMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9wdWJsaXNoZXJzLmV4c2QKQEAgLTAsMCArMSwxNDggQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJwdWJsaXNoZXJzIiBuYW1lPSJQdWJsaXNoZXJzIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIHRhc2sgdGhhdCBpcyBydW4gd2hpbGUgcHVibGlzaGluZyB0byBhIHNlcnZlci4KKworJmx0O2ImZ3Q7UHJvdmlzaW9uYWwgQVBJOiZsdDsvYiZndDsKK1RoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InB1Ymxpc2hlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9InB1Ymxpc2hlciI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzZXJ2ZXIgdHlwZSBpZHMgdGhhdCB0aGlzIHRhc2sgbWF5IGFwcGx5IHRvLiBVc2VkIGZvciBtZW1vcnkgJmFtcDsgcGVyZm9ybWFuY2UgcmVhc29ucworICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgcHVibGlzaGVyCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHB1Ymxpc2hlcgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4KK1B1Ymxpc2ggaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hlckRlbGVnYXRlOiIvPgorICAgICAgICAgICAgICAgPC9hcHBpbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG9yZGVyIHRoYXQgdGhlIHB1Ymxpc2hlciBpcyBwcm9jZXNzZWQuIGlmIHRoZSB2YWx1ZSBpcyBsZXNzIHRoYW4gMCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBiZWZvcmUgY2FsbGluZyB0aGUgc2VydmVyIGJlaGF2aW91ciBkZWxlZ2F0ZSZhcG9zO3MgcHVibGlzaGluZyBtZXRob2RzLCBhbmQgbWF5IG1vZGlmeSB0aGUgd29ya3NwYWNlLiBpZiB0aGUgdmFsdWUgaXMgbW9yZSB0aGFuIDAsIGl0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIGRlbGVnYXRlJmFwb3M7cyBwdWJsaXNoaW5nIG1ldGhvZHMgYW5kIG1heSBub3QgbW9kaWZ5IHRoZSB3b3Jrc3BhY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgMy4wCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHB1Ymxpc2hlciBleHRlbnNpb24gcG9pbnQ6CisKKyZsdDtwcmUmZ3Q7CisKKyZsdDsvcHJlJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCit0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7LgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUxvY2F0b3JzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUxvY2F0b3JzLmV4c2QKaW5kZXggNjAzMmQ5NS4uZTNhZDE3YyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVMb2NhdG9ycy5leHNkCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lTG9jYXRvcnMuZXhzZApAQCAtNDIsNyArNDIsNyBAQAogICAgPGVsZW1lbnQgbmFtZT0icnVudGltZUxvY2F0b3IiPg0KICAgICAgIDxhbm5vdGF0aW9uPg0KICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KICAgICAgICAgIDwvYXBwSW5mbz4NCiAgICAgICA8L2Fubm90YXRpb24+DQogICAgICAgPGNvbXBsZXhUeXBlPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lVHlwZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lVHlwZXMuZXhzZAppbmRleCBiNTJlODg5Li5iMjk2ZjFiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZVR5cGVzLmV4c2QKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVUeXBlcy5leHNkCkBAIC00Miw3ICs0Miw3IEBACiAgICA8ZWxlbWVudCBuYW1lPSJydW50aW1lVHlwZSI+DQogICAgICAgPGFubm90YXRpb24+DQogICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQogICAgICAgICAgPC9hcHBJbmZvPg0KICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICA8Y29tcGxleFR5cGU+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2ludGVybmFsU2VydmVyTG9jYXRvcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJMb2NhdG9ycy5leHNkCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW50ZXJuYWxTZXJ2ZXJMb2NhdG9ycy5leHNkCnJlbmFtZSB0byBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyTG9jYXRvcnMuZXhzZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclR5cGVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyVHlwZXMuZXhzZAppbmRleCBmYWVjMjE5Li4wMmZmNjViIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyVHlwZXMuZXhzZAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyVHlwZXMuZXhzZApAQCAtNDAsNiArNDAsMTEgQEAKICAgIDwvZWxlbWVudD4NCiANCiAgICA8ZWxlbWVudCBuYW1lPSJzZXJ2ZXJUeXBlIj4NCisgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KKyAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2Fubm90YXRpb24+DQogICAgICAgPGNvbXBsZXhUeXBlPg0KICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQogICAgICAgICAgICAgPGFubm90YXRpb24+DQpAQCAtMTQyLDE0ICsxNDcsMTQgQEAKICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhcnRUaW1lb3V0IiB0eXBlPSJzdHJpbmciPg0KICAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KICAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSB0aW1lb3V0IHZhbHVlIHRoYXQgdGhlIHRvb2wgd2lsbCB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHN0YXJ0ZWQuIFRoZSBkZWZhdWx0IGlzIDIgbWludXRlcw0KKyAgICAgICAgICAgICAgICAgIHRoZSB0aW1lb3V0IHZhbHVlIChpbiBtcykgdGhhdCB0aGUgdG9vbCB3aWxsIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gYmUgc3RhcnRlZC4gVGhlIGRlZmF1bHQgaXMgMiBtaW51dGVzDQogICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KICAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICAgICA8L2F0dHJpYnV0ZT4NCiAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0b3BUaW1lb3V0IiB0eXBlPSJzdHJpbmciPg0KICAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KICAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSB0aW1lb3V0IHZhbHVlIHRoYXQgdGhlIHRvb2wgd2lsbCB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHN0b3BwZWQuIFRoZSBkZWZhdWx0IGlzIDIgbWludXRlcw0KKyAgICAgICAgICAgICAgICAgIHRoZSB0aW1lb3V0IHZhbHVlIChpbiBtcykgdGhhdCB0aGUgdG9vbCB3aWxsIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gYmUgc3RvcHBlZC4gVGhlIGRlZmF1bHQgaXMgMiBtaW51dGVzDQogICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KICAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICAgICA8L2F0dHJpYnV0ZT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlLmphdmEKaW5kZXggNGJhMmUwZC4uZGI3MjA5YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lNb2R1bGUuamF2YQpAQCAtMzcsNyArMzcsOCBAQAogICogd2l0aC4KICAqIDwvcD4KICAqIDxwPgotICogW2lzc3VlOiBFcXVhbGl0eS9pZGVudGlmeSBmb3IgbW9kdWxlcz9dCisgKiBBIG1vZHVsZSBpcyBlcXVhbCB0byBhbm90aGVyIG1vZHVsZSB3aGVuZXZlciB0aGUgdHdvIGlkcyBhcmUgZXF1YWwgYW5kIHRoZQorICogKG9wdGlvbmFsKSBwcm9qZWN0IGF0dHJpYnV0ZSBpcyBlcXVhbC4KICAqIDwvcD4KICAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KICAqIDxwPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVR5cGUuamF2YQppbmRleCAzNDZjZjM0Li4yZjZhYmUyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVR5cGUuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEzMiw4ICsxMzIsOCBAQAogCSAqIG5vdCBzZXQgYW5kIG11c3QgYmUgZXhwbGljaXRseSBzZXQgYnkgdGhlIGNsaWVudC4KIAkgKiA8L3A+CiAJICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NpZ24gdG8gdGhlIHJ1bnRpbWUgaW5zdGFuY2U7IGEgZ2VuZXJhdGVkCi0JICogICAgaWQgaXMgdXNlZCBpZiBpZCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiBlbXB0eSBzdHJpbmcKKwkgKiBAcGFyYW0gaWQgdGhlIGlkIHRvIGFzc2lnbiB0byB0aGUgcnVudGltZSBpbnN0YW5jZTsgdGhlIGRlZmF1bHQgbmFtZSBpcworCSAqICAgIHVzZWQgaWYgaWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgc3RyaW5nCiAJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwogCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAogCSAqIEByZXR1cm4gYSBuZXcgcnVudGltZSB3b3JraW5nIGNvcHkgd2l0aCB0aGUgZ2l2ZW4gaWQKQEAgLTE0MSw0ICsxNDEsNCBAQAogCSAqICAgIG9yIHNldHRpbmcgaXQncyBkZWZhdWx0IHZhbHVlcwogCSAqLwogCXB1YmxpYyBJUnVudGltZVdvcmtpbmdDb3B5IGNyZWF0ZVJ1bnRpbWUoU3RyaW5nIGlkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lV29ya2luZ0NvcHkuamF2YQppbmRleCA2NmU4ZGUzLi5jZmY1NjdjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVdvcmtpbmdDb3B5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVXb3JraW5nQ29weS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDcgKzE4LDEyIEBACiAgKiBBIHdvcmtpbmcgY29weSBydW50aW1lIG9iamVjdCB1c2VkIGZvciBmb3JtdWxhdGluZyBjaGFuZ2VzCiAgKiB0byBhIHJ1bnRpbWUgaW5zdGFuY2UgKHtAbGluayBJUnVudGltZX0pLiBDaGFuZ2VzIG1hZGUgb24gYQogICogd29ya2luZyBjb3B5IGRvIG5vdCBvY2N1ciAoYW5kIGFyZSBub3QgcGVyc2lzdGVkKSB1bnRpbCBhCi0gKiBzYXZlKCkgaXMgcGVyZm9ybWVkLiAKKyAqIHNhdmUoKSBpcyBwZXJmb3JtZWQuCisgKiA8cD4KKyAqIElmIHRoZSBjbGllbnQgb2YgdGhpcyB3b3JraW5nIGNvcHkgY2FsbHMgbG9hZEFkYXB0ZXIoKSwgYSBuZXcgaW5zdGFuY2Ugb2YKKyAqIHRoZSBkZWxlZ2F0ZSAoUnVudGltZURlbGVnYXRlKSB3aWxsIGJlIGNyZWF0ZWQgdG8gaGVscCB0aGlzIHdvcmtpbmcgY29weS4KKyAqIFRoaXMgZGVsZWdhdGUgaW5zdGFuY2Ugd2lsbCBiZSB1c2VkIGFzIGxvbmcgYXMgdGhpcyB3b3JraW5nIGNvcHkgZXhpc3RzLgorICogPC9wPgogICogPHA+CiAgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KQEAgLTE1NSwxMCArMTYwLDYgQEAKIAkgKiBSdW50aW1lcyBjYW4gYmUgc2F2ZWQgZXZlbiB3aGVuIHRoZXkgaGF2ZSBpbnZhbGlkIHByb3BlcnRpZXMuIEl0CiAJICogaXMgdGhlIGNsaWVudHMgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCB2YWxpZGF0ZSgpIG9yIGNoZWNrIHRoZQogCSAqIHByb3BlcnRpZXMgYmVmb3JlIHNhdmluZy4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFdoYXQgaXMgbGlmZWN5Y2xlIGZvciBSdW50aW1lV29ya2luZ0NvcHlEZWxlZ2F0ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdvcmtpbmcgY29weT9dCi0JICogPC9wPgogCSAqIAogCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBmb3JjZSB0aGUgc2F2ZSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+CiAJICogICAgb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyLmphdmEKaW5kZXggYmI3ZGRmOC4uMDQxODE3NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw3ICsxMCwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwogLyoqCiAgKiBSZXByZXNlbnRzIGEgc2VydmVyIGluc3RhbmNlLiBFdmVyeSBzZXJ2ZXIgaXMgYW4gaW5zdGFuY2Ugb2YgYQpAQCAtNjcsNyArNzEsNyBAQAogICogCiAgKiBAc2luY2UgMS4wCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlciBleHRlbmRzIElTZXJ2ZXJBdHRyaWJ1dGVzIHsKK3B1YmxpYyBpbnRlcmZhY2UgSVNlcnZlciBleHRlbmRzIElTZXJ2ZXJBdHRyaWJ1dGVzLCBJU2NoZWR1bGluZ1J1bGUgewogCS8qKgogCSAqIEFuIG9wZXJhdGlvbiBsaXN0ZW5lciBpcyB1c2VkIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIGJhY2sgYWJvdXQgYQogCSAqIHNwZWNpZmljIHNlcnZlciBvcGVyYXRpb24sIHN1Y2ggYXMgc3RhcnRpbmcgb3Igc3RvcHBpbmcgYSBzZXJ2ZXIuCkBAIC0zMDUsMTAgKzMwOSwxNSBAQAogCSAqIGZyYW1ld29yayBpcyBzYWZlLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBvdGhlciBidW5kbGVzIGFyZSBVSS1zYWZlCiAJICogYW5kIHRoZSByaXNrIG9mIFVJIGRlYWRsb2NrIGlzIGhpZ2guIAogCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBTaW5jZSB0aGlzIG1ldGhvZCBpcyBzeW5jaHJvbm91cyBhbmQgcmVxdWlyZXMgYWNjZXNzIHRvIHRoZSB3b3Jrc3BhY2UsCisJICogaXQgd2lsbCBibG9jayB1bnRpbCBpdCBjYW4gYWNjZXNzIGEgcmVzb3VyY2UgYW5kIHNlcnZlciBzY2hlZHVsaW5nIGxvY2suCisJICogVG8gcHVibGlzaCBhc3luY2hyb25vdXNseSB1c2luZyBhIGpvYiwgdXNlIHRoZSBhbHRlcm5hdGUgcHVibGlzaCgpIG1ldGhvZC4KKwkgKiA8L3A+CiAJICogCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgcHVibGlzaCBiZWluZyByZXF1ZXN0ZWQuIFZhbGlkIHZhbHVlcyBhcmUKKwkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoIGJlaW5nIHJlcXVlc3RlZC4gVmFsaWQgdmFsdWVzIGFyZToKIAkgKiAgICA8dWw+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxTSUhfRlVMTDwvY29kZT4tIGluZGljYXRlcyBhIGZ1bGwgcHVibGlzaC48L2xpPgorCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0ZVTEw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBmdWxsIHB1Ymxpc2guPC9saT4KIAkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9JTkNSRU1FTlRBTDwvY29kZT4tIGluZGljYXRlcyBhIGluY3JlbWVudGFsIHB1Ymxpc2guCiAJICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQ0xFQU48L2NvZGU+LSBpbmRpY2F0ZXMgYSBjbGVhbiByZXF1ZXN0LiBDbGVhbiB0aHJvd3MKIAkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKQEAgLTMxNywxMCArMzI2LDQ4IEBACiAJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwogCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAogCSAqIEByZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgd2hhdCAoaWYgYW55dGhpbmcpIHdlbnQgd3JvbmcKKwkgKiBAc2VlICNwdWJsaXNoKGludCwgTGlzdCwgSUFkYXB0YWJsZSwgSU9wZXJhdGlvbkxpc3RlbmVyKQogCSAqLwogCXB1YmxpYyBJU3RhdHVzIHB1Ymxpc2goaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7CiAKIAkvKioKKwkgKiBQdWJsaXNoIG9uZSBvciBtb3JlIG1vZHVsZXMgdG8gdGhlIHNlcnZlci4KKwkgKiA8cD4KKwkgKiBUaGUgb3BlcmF0aW9uIGxpc3RlbmVyIGNhbiBiZSB1c2VkIHRvIGFkZCBhIGxpc3RlbmVyIGZvciBub3RpZmljYXRpb24KKwkgKiBvZiB0aGUgcHVibGlzaCByZXN1bHQuIFRoZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCB3aXRoIGEKKwkgKiBzaW5nbGUgc3VjY2Vzc2Z1bCBzdGF0dXMgKHNldmVyaXR5IE9LKSB3aGVuIHRoZSBzZXJ2ZXIgaGFzCisJICogZmluaXNoZWQgcHVibGlzaGluZywgb3IgYSBzaW5nbGUgZmFpbHVyZSAoc2V2ZXJpdHkgRVJST1IpIGlmCisJICogdGhlcmUgd2FzIGFuIGVycm9yIHB1Ymxpc2hpbmcgdG8gdGhlIHNlcnZlci4KKwkgKiA8L3A+PHA+CisJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLiBQdWJsaXNoaW5nIGlzIGxvbmctCisJICogcnVubmluZyBhbmQgbWF5IHRyaWdnZXIgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cyBvciBidWlsZHMuIEFsdGhvdWdoIHRoaXMKKwkgKiBmcmFtZXdvcmsgaXMgc2FmZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb3RoZXIgYnVuZGxlcyBhcmUgVUktc2FmZQorCSAqIGFuZCB0aGUgcmlzayBvZiBVSSBkZWFkbG9jayBpcyBoaWdoLiAKKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgcHVibGlzaCBiZWluZyByZXF1ZXN0ZWQuIFZhbGlkIHZhbHVlcyBhcmU6CisJICogICAgPHVsPgorCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0ZVTEw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBmdWxsIHB1Ymxpc2guPC9saT4KKwkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9JTkNSRU1FTlRBTDwvY29kZT4tIGluZGljYXRlcyBhIGluY3JlbWVudGFsIHB1Ymxpc2guCisJICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQ0xFQU48L2NvZGU+LSBpbmRpY2F0ZXMgYSBjbGVhbiByZXF1ZXN0LiBDbGVhbiB0aHJvd3MKKwkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKKwkgKiAgICAgIGZ1bGwgcHVibGlzaC4KKwkgKiAgICA8L3VsPgorCSAqIEBwYXJhbSBtb2R1bGVzIGEgbGlzdCBvZiBtb2R1bGVzIHRvIHB1Ymxpc2gsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCisJICogICAgcHVibGlzaCBhbGwgbW9kdWxlcworCSAqIEBwYXJhbSBpbmZvIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCisJICogICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQorCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAorCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgorCSAqICAgIGZvciB0aGUgU2hlbGwgY2xhc3MuCisJICogQHBhcmFtIGxpc3RlbmVyIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuIHRoaXMKKwkgKiAgICBvcGVyYXRpb24gaXMgZG9uZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90aWZpY2F0aW9uIGlzIG5vdAorCSAqICAgIHJlcXVpcmVkCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyB2b2lkIHB1Ymxpc2goaW50IGtpbmQsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzLCBJQWRhcHRhYmxlIGluZm8sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcik7CisKKwkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgogCSAqIGJlIHN0YXJ0ZWQgaW4gdGhlIGdpdmVuIG1vZGUuCiAJICoKQEAgLTM0MSw3ICszODgsNyBAQAogCSAqIDxwPgogCSAqIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gbGlzdGVuIGZvciBmYWlsdXJlIG9yIHN1Y2Nlc3Mgb2YgdGhlCiAJICogc2VydmVyIHN0YXJ0aW5nLCBpdCBjYW4gYWRkIGEgc2VydmVyIGxpc3RlbmVyIG9yIHVzZSB0aGUKLQkgKiB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIHRoYXQgdGFrZXMgYSBzdGF0dXMgbGlzdGVuZXIgYXMgYQorCSAqIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGhhdCB0YWtlcyBhbiBvcGVyYXRpb24gbGlzdGVuZXIgYXMgYQogCSAqIHBhcmFtZXRlci4KIAkgKiA8L3A+CiAJICoKQEAgLTM1MSw5ICszOTgsMTAgQEAKIAkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCiAJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCiAJICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gc3RhcnQgdGhlIHNlcnZlcgorCSAqIEBzZWUgI3N0YXJ0KFN0cmluZywgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIpCiAJICovCiAJcHVibGljIHZvaWQgc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCisKIAkvKioKIAkgKiBBc3luY2hyb25vdXNseSBzdGFydHMgdGhpcyBzZXJ2ZXIgaW4gdGhlIGdpdmVuIGxhdW5jaCBtb2RlLgogCSAqIDxwPgpAQCAtMzc4LDI2ICs0MjYsNiBAQAogCXB1YmxpYyB2b2lkIHN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwogCiAJLyoqCi0JICogU3RhcnRzIHRoaXMgc2VydmVyIGluIHRoZSBnaXZlbiBsYXVuY2ggbW9kZSBhbmQgd2FpdHMgdW50aWwgdGhlIHNlcnZlcgotCSAqIGhhcyBmaW5pc2hlZCBzdGFydGluZy4KLQkgKiA8cD4KLQkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCB1c2VzIHtAbGluayAjc3RhcnQoU3RyaW5nLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiB0byBzdGFydCB0aGUgc2VydmVyLCBhbmQgYW4gaW50ZXJuYWwgdGhyZWFkIGFuZCBsaXN0ZW5lciB0byBkZXRlY3QKLQkgKiB3aGVuIHRoZSBzZXJ2ZXIgaGFzIGZpbmlzaGVkIHN0YXJ0aW5nLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIHVzZSBzdGFydChTdHJpbmcsCi0JICogICAgSVByb2dyZXNzTW9uaXRvciwgSU9wZXJhdGlvbkxpc3RlbmVyKSBpbnN0ZWFkCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gc3RhcnQgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzU3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgogCSAqIGJlIHJlc3RhcnRlZCBpbiB0aGUgZ2l2ZW4gbW9kZS4gTm90ZSB0aGF0IG9ubHkgc2VydmVycwogCSAqIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIGNhbiBiZSByZXN0YXJ0ZWQuCkBAIC00MzcsMTQgKzQ2NSwxNCBAQAogCXB1YmxpYyBib29sZWFuIGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpOwogCiAJLyoqCi0JICogQXN5bmNocm9ub3VzbHkgcmVzdGFydHMgdGhpcyBzZXJ2ZXIuIFRoaXMgb3BlcmF0aW9uIGRvZXMKKwkgKiBTeW5jaHJvbm91c2x5IHJlc3RhcnRzIHRoaXMgc2VydmVyLiBUaGlzIG9wZXJhdGlvbiBkb2VzCiAJICogbm90aGluZyBpZiB0aGlzIHNlcnZlciBjYW5ub3QgYmUgc3RvcHBlZCAoe0BsaW5rICNjYW5SZXN0YXJ0KFN0cmluZyl9CiAJICogcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCiAJICogVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gc3RhcnQgdGhlIHNlcnZlciBmcm9tIGEgc3RvcHBlZCBzdGF0ZS4KIAkgKiA8cD4KIAkgKiBJZiB0aGUgY2FsbGVyIHdhbnRzIHRvIGxpc3RlbiBmb3IgZmFpbHVyZSBvciBzdWNjZXNzIG9mIHRoZQogCSAqIHNlcnZlciByZXN0YXJ0aW5nLCBpdCBjYW4gYWRkIGEgc2VydmVyIGxpc3RlbmVyIG9yIHVzZSB0aGUKLQkgKiB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIHRoYXQgdGFrZXMgYSBzdGF0dXMgbGlzdGVuZXIgYXMgYQorCSAqIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGhhdCB0YWtlcyBhbiBvcGVyYXRpb24gbGlzdGVuZXIgYXMgYQogCSAqIHBhcmFtZXRlci4KIAkgKiA8L3A+CiAJICoKQEAgLTQ1Myw2ICs0ODEsNyBAQAogCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQogCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKIAkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAc2VlICNyZXN0YXJ0KFN0cmluZywgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIpCiAJICovCiAJcHVibGljIHZvaWQgcmVzdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKIApAQCAtNDc5LDI4ICs1MDgsNiBAQAogCXB1YmxpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcik7CiAKIAkvKioKLQkgKiBTeW5jaHJvbm91c2x5IHJlc3RhcnRzIHRoaXMgc2VydmVyLiBUaGlzIG9wZXJhdGlvbiBkb2VzCi0JICogbm90aGluZyBpZiB0aGlzIHNlcnZlciBjYW5ub3QgYmUgc3RvcHBlZCAoe0BsaW5rICNjYW5SZXN0YXJ0KFN0cmluZyl9Ci0JICogcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogPHA+Ci0JICogW2lzc3VlOiBUaGVyZSBpcyBubyB3YXkgdG8gY29tbXVuaWNhdGUgZmFpbHVyZSB0byB0aGUKLQkgKiBjbGllbnQuIEdpdmVuIHRoYXQgdGhpcyBvcGVyYXRpb24gY2FuIGdvIGF3cnksIHRoZXJlIHByb2JhYmx5Ci0JICogc2hvdWxkIGJlIGEgbWVjaGFuaXNtIHRoYXQgYWxsb3dzIGZhaWxpbmcgYXN5bmNoIG9wZXJhdGlvbnMKLQkgKiB0byBiZSBkaWFnbm9zZWQuXQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiB1c2UgcmVzdGFydChTdHJpbmcsCi0JICogICAgSVByb2dyZXNzTW9uaXRvciwgSU9wZXJhdGlvbkxpc3RlbmVyKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25vdXNSZXN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2VydmVyIGlzIGluIGEgc3RhdGUgdGhhdCBpdCBjYW4KIAkgKiBiZSBzdG9wcGVkLgogCSAqIFNlcnZlcnMgY2FuIGJlIHN0b3BwZWQgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgc3RvcHBlZCBhbmQgaWYKQEAgLTUyMywxMiArNTMwLDEzIEBACiAJICogPHA+CiAJICogSWYgdGhlIGNhbGxlciB3YW50cyB0byBsaXN0ZW4gZm9yIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUKIAkgKiBzZXJ2ZXIgc3RvcHBpbmcsIGl0IGNhbiBhZGQgYSBzZXJ2ZXIgbGlzdGVuZXIgb3IgdXNlIHRoZQotCSAqIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGhhdCB0YWtlcyBhIHN0YXR1cyBsaXN0ZW5lciBhcyBhCisJICogdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCB0aGF0IHRha2VzIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciBhcyBhCiAJICogcGFyYW1ldGVyLgogCSAqIDwvcD4KIAkgKiAKIAkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KIAkgKiAgICB0byBzdG9wIG5vcm1hbGx5CisJICogQHNlZSAjc3RhcnQoU3RyaW5nLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcikKIAkgKi8KIAlwdWJsaWMgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UpOwogCkBAIC01NTgsMjEgKzU2Niw2IEBACiAJcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwogCiAJLyoqCi0JICogU3RvcHMgdGhpcyBzZXJ2ZXIgYW5kIHdhaXRzIHVudGlsIHRoZSBzZXJ2ZXIgaGFzIGNvbXBsZXRlbHkgc3RvcHBlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCB1c2VzIHtAbGluayAjc3RvcChib29sZWFuKX0KLQkgKiB0byBzdG9wIHRoZSBzZXJ2ZXIsIGFuZCBhbiBpbnRlcm5hbCB0aHJlYWQgYW5kIGxpc3RlbmVyIHRvIGRldGVjdAotCSAqIHdoZW4gdGhlIHNlcnZlciBoYXMgY29tcGxpZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIHRvIHN0b3Agbm9ybWFsbHkKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiB1c2Ugc3RvcChib29sZWFuLAotCSAqICAgIElPcGVyYXRpb25MaXN0ZW5lcikgaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzU3RvcChib29sZWFuIGZvcmNlKTsKLQotCS8qKgogCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGdpdmVuIG1vZHVsZSBvbiB0aGlzIHNlcnZlci4KIAkgKiBSZXR1cm5zIDxjb2RlPlNUQVRFX1VOS05PV048L2NvZGU+IGlmIHRoZSBtb2R1bGUKIAkgKiBpcyBub3QgYW1vbmcgdGhlIG9uZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmVyLgpAQCAtNjYzLDE0ICs2NTYsNiBAQAogCSAqIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KIAkgKiA8L3A+CiAJICogPHA+Ci0JICogW2lzc3VlOiBTaW5jZSB0aGlzIG1ldGhvZCBpcyBhc2N5bmNocm9ub3VzLCBpcyB0aGVyZQotCSAqIGFueSBuZWVkIGZvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcj9dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogSVNlcnZlci5zeW5jaHJvbm91c01vZHVsZVJlc3RhcnQgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBpZiBhbnl0aGluZyBnb2VzIHdyb25nLl0KLQkgKiA8L3A+Ci0JICogPHA+CiAJICogW2lzc3VlOiBJZiB0aGUgbW9kdWxlIHdhcyBqdXN0IHB1Ymxpc2hlZCB0byB0aGUgc2VydmVyCiAJICogYW5kIGhhZCBuZXZlciBiZWVuIHN0YXJ0ZWQsIHdvdWxkIGlzIGJlIG9rIHRvICJzdGFydCIKIAkgKiB0aGUgbW9kdWxlIHVzaW5nIHRoaXMgbWV0aG9kP10KQEAgLTY5OSw0ICs2ODQsODIgQEAKIAkgKiBAc2luY2UgMi4wCiAJICovCiAJcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uIGdldExhdW5jaENvbmZpZ3VyYXRpb24oYm9vbGVhbiBjcmVhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsYXVuY2ggdGhhdCB3YXMgdXNlZCB0byBzdGFydCB0aGUgc2VydmVyLCBpZiBhdmFpbGFibGUuIElmIHRoZSBzZXJ2ZXIKKwkgKiBpcyBub3QgcnVubmluZywgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uIAorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxhdW5jaCB1c2VkIHRvIHN0YXJ0IHRoZSBjdXJyZW50bHkgcnVubmluZyBzZXJ2ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgaWYgdGhlIGxhdW5jaCBpcyB1bmF2YWlsYWJsZSBvciBjb3VsZCBub3QgYmUgZm91bmQKKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIElMYXVuY2ggZ2V0TGF1bmNoKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdGFydCB0aW1lb3V0IGluIHNlY29uZHMuCisJICogCisJICogQHJldHVybiB0aGUgc3RhcnQgdGltZW91dCBpbiBzZWNvbmRzCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBpbnQgZ2V0U3RhcnRUaW1lb3V0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdG9wIHRpbWVvdXQgaW4gc2Vjb25kcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzdG9wIHRpbWVvdXQgaW4gc2Vjb25kcworCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgaW50IGdldFN0b3BUaW1lb3V0KCk7CisKKwkvKioKKwkgKiBTdGFydHMgdGhpcyBzZXJ2ZXIgaW4gdGhlIGdpdmVuIGxhdW5jaCBtb2RlIGFuZCB3YWl0cyB1bnRpbCB0aGUgc2VydmVyCisJICogaGFzIGZpbmlzaGVkIHN0YXJ0aW5nLgorCSAqIDxwPgorCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHVzZXMge0BsaW5rICNzdGFydChTdHJpbmcsIElQcm9ncmVzc01vbml0b3IpfQorCSAqIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIsIGFuZCBhbiBpbnRlcm5hbCB0aHJlYWQgYW5kIGxpc3RlbmVyIHRvIGRldGVjdAorCSAqIHdoZW4gdGhlIHNlcnZlciBoYXMgZmluaXNoZWQgc3RhcnRpbmcuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGxhdW5jaE1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKKwkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKKwkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjc3RhcnQoU3RyaW5nLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcil9CisJICogICAgaW5zdGVhZAorCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1N0YXJ0KFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOworCisJLyoqCisJICogU3RvcHMgdGhpcyBzZXJ2ZXIgYW5kIHdhaXRzIHVudGlsIHRoZSBzZXJ2ZXIgaGFzIGNvbXBsZXRlbHkgc3RvcHBlZC4KKwkgKiA8cD4KKwkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCB1c2VzIHtAbGluayAjc3RvcChib29sZWFuKX0KKwkgKiB0byBzdG9wIHRoZSBzZXJ2ZXIsIGFuZCBhbiBpbnRlcm5hbCB0aHJlYWQgYW5kIGxpc3RlbmVyIHRvIGRldGVjdAorCSAqIHdoZW4gdGhlIHNlcnZlciBoYXMgY29tcGxpZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqICAgIHRvIHN0b3Agbm9ybWFsbHkKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNzdG9wKGJvb2xlYW4sIElPcGVyYXRpb25MaXN0ZW5lcil9CisJICogICAgaW5zdGVhZAorCSAqLworCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzU3RvcChib29sZWFuIGZvcmNlKTsKKworCS8qKgorCSAqIFN5bmNocm9ub3VzbHkgcmVzdGFydHMgdGhpcyBzZXJ2ZXIuIFRoaXMgb3BlcmF0aW9uIGRvZXMKKwkgKiBub3RoaW5nIGlmIHRoaXMgc2VydmVyIGNhbm5vdCBiZSBzdG9wcGVkICh7QGxpbmsgI2NhblJlc3RhcnQoU3RyaW5nKX0KKwkgKiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KKwkgKiA8cD4KKwkgKgorCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCisJICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5CisJICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9CisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcworCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNyZXN0YXJ0KFN0cmluZywgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIpfSAKKwkgKiAgICBpbnN0ZWFkCisJICovCisJcHVibGljIHZvaWQgc3luY2hyb25vdXNSZXN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJBdHRyaWJ1dGVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyQXR0cmlidXRlcy5qYXZhCmluZGV4IDY4MmM3NDQuLjI4Yjg4M2MgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJBdHRyaWJ1dGVzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckF0dHJpYnV0ZXMuamF2YQpAQCAtMzI4LDcgKzMyOCw3IEBACiAJICogCiAJICogPHA+SWYgaXQgZG9lcyByZXR1cm4gdmFsaWQgcGFyZW50KHMpLCB0aGlzIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4KIAkgKiB0aGUgdG9wbW9zdCBwYXJlbnQgbW9kdWxlKHMpLCBldmVuIGlmIHRoZXJlIGFyZSBhIGZldyBsZXZlbHMKLQkgKiAoYSBoZWlyYXJjaHkpIG9mIG1vZHVsZXMuPC9wPgorCSAqIChhIGhpZXJhcmNoeSkgb2YgbW9kdWxlcy48L3A+CiAJICogCiAJICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQogCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyVHlwZS5qYXZhCmluZGV4IDMwYTJkNmUuLjMzYzM3N2YgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlclR5cGUuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE3Myw4ICsxNzMsOCBAQAogCSAqIGRlbGVnYXRlJ3Mgc2V0RGVmYXVsdHMoKSBtZXRob2QuCiAJICogPC9wPgogCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgaWQgdG8gYXNzaWduIHRvIHRoZSBzZXJ2ZXIgaW5zdGFuY2U7IGEgZ2VuZXJhdGVkCi0JICogICAgaWQgaXMgdXNlZCBpZiBpZCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiBlbXB0eSBzdHJpbmcKKwkgKiBAcGFyYW0gaWQgdGhlIGlkIHRvIGFzc2lnbiB0byB0aGUgc2VydmVyIGluc3RhbmNlOyB0aGUgZGVmYXVsdCBuYW1lIGlzCisJICogICAgdXNlZCBpZiBpZCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiBlbXB0eSBzdHJpbmcKIAkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlIHdoZXJlIHRoZSBzZXJ2ZXIgaW5zdGFuY2UKIAkgKiAgICBpcyB0byBiZSBzZXJpYWxpemVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5mb3JtYXRpb24gaXMKIAkgKiAgICBpbnN0ZWFkIHRvIGJlIHBlcnNpc3RlZCB3aXRoIHRoZSB3b3Jrc3BhY2UgYnV0IG5vdCB3aXRoIGFueQpAQCAtMjEwLDggKzIxMCw4IEBACiAJICogQ29uc2lkZXIgY29tYmluaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUgb3RoZXIuXQogCSAqIDwvcD4KIAkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGlkIHRvIGFzc2lnbiB0byB0aGUgc2VydmVyIGluc3RhbmNlOyBhIGdlbmVyYXRlZAotCSAqICAgIGlkIGlzIHVzZWQgaWYgaWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgc3RyaW5nCisJICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NpZ24gdG8gdGhlIHNlcnZlciBpbnN0YW5jZTsgdGhlIGRlZmF1bHQgbmFtZSBpcworCSAqICAgIHVzZWQgaWYgaWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgc3RyaW5nCiAJICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlCiAJICogICAgaXMgdG8gYmUgc2VyaWFsaXplZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzCiAJICogICAgaW5zdGVhZCB0byBiZSBwZXJzaXN0ZWQgd2l0aCB0aGUgd29ya3NwYWNlIGJ1dCBub3Qgd2l0aCBhbnkKQEAgLTIyMyw0ICsyMjMsNCBAQAogCSAqICAgIG9yIHNldHRpbmcgaXQncyBkZWZhdWx0IHZhbHVlcwogCSAqLwogCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgY3JlYXRlU2VydmVyKFN0cmluZyBpZCwgSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJXb3JraW5nQ29weS5qYXZhCmluZGV4IGYwMzBkMTguLmQ1OGE4OGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJXb3JraW5nQ29weS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJXb3JraW5nQ29weS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDkgKzE2LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiAvKioKICAqIEEgd29ya2luZyBjb3B5IHNlcnZlciBvYmplY3QgdXNlZCBmb3IgZm9ybXVsYXRpbmcgY2hhbmdlcwotICogdG8gYSBzZXJ2ZXIgaW5zdGFuY2UgKHtAbGluayBJU2VydmVyfSkuCi0gKgotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgorICogdG8gYSBzZXJ2ZXIgaW5zdGFuY2UgKHtAbGluayBJU2VydmVyfSkuIENoYW5nZXMgbWFkZSBvbiBhCisgKiB3b3JraW5nIGNvcHkgZG8gbm90IG9jY3VyIChhbmQgYXJlIG5vdCBwZXJzaXN0ZWQpIHVudGlsIGEKKyAqIHNhdmUoKSBpcyBwZXJmb3JtZWQuCisgKiA8cD4KKyAqIElmIHRoZSBjbGllbnQgb2YgdGhpcyB3b3JraW5nIGNvcHkgY2FsbHMgbG9hZEFkYXB0ZXIoKSwgYSBuZXcgaW5zdGFuY2Ugb2YKKyAqIHRoZSBkZWxlZ2F0ZSAoU2VydmVyRGVsZWdhdGUpIHdpbGwgYmUgY3JlYXRlZCB0byBoZWxwIHRoaXMgd29ya2luZyBjb3B5LgorICogVGhpcyBkZWxlZ2F0ZSBpbnN0YW5jZSB3aWxsIGJlIHVzZWQgYXMgbG9uZyBhcyB0aGlzIHdvcmtpbmcgY29weSBleGlzdHMuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgogICogCiAgKiBAc2luY2UgMS4wCiAgKi8KQEAgLTE0NCwxMCArMTUyLDYgQEAKIAkgKiBjaGFuZ2VzIHRvIHRoZSBzZXJ2ZXIuCiAJICogPC9wPgogCSAqIDxwPgotCSAqIFtpc3N1ZTogV2hhdCBpcyBsaWZlY3ljbGUgZm9yIFNlcnZlcldvcmtpbmdDb3B5RGVsZWdhdGUKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyB3b3JraW5nIGNvcHk/XQotCSAqIDwvcD4KLQkgKiA8cD4KIAkgKiBbaXNzdWU6IFNpbmNlIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gY29tbWl0IGEgc2VydmVyCiAJICogd29ya2luZyBjb3B5IHdpdGhvdXQgZmlyc3QgY29tbWl0dGluZyBhbnkgYXNzb2NpYXRlZAogCSAqIHJ1bnRpbWUgYW5kIHNlcnZlciBjb25maWcgd29ya2luZyBjb3BpZXMsIHRoZSBzZW1hbnRpY3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckNvcmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckNvcmUuamF2YQppbmRleCBiMjgxMmE0Li42NmI2ZjBmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJDb3JlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyQ29yZS5qYXZhCkBAIC0zNCwxMCArMzQsMTAgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1JVTlRJTUVfVFlQRSA9ICJydW50aW1lVHlwZXMiOwogCiAJLy8JY2FjaGVkIGNvcHkgb2YgYWxsIHJ1bnRpbWUgdHlwZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IHJ1bnRpbWVUeXBlczsKKwlwcml2YXRlIHN0YXRpYyBMaXN0PElSdW50aW1lVHlwZT4gcnVudGltZVR5cGVzOwogCiAJLy8JY2FjaGVkIGNvcHkgb2YgYWxsIHNlcnZlciBhbmQgY29uZmlndXJhdGlvbiB0eXBlcwotCXByaXZhdGUgc3RhdGljIExpc3Qgc2VydmVyVHlwZXM7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxJU2VydmVyVHlwZT4gc2VydmVyVHlwZXM7CiAKIAlwcml2YXRlIHN0YXRpYyBJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciByZWdpc3RyeUxpc3RlbmVyOwogCkBAIC00NSwxNiArNDUsMTQgQEAKIAkJcHVibGljIHZvaWQgcmVnaXN0cnlDaGFuZ2VkKElSZWdpc3RyeUNoYW5nZUV2ZW50IGV2ZW50KSB7CiAJCQlJRXh0ZW5zaW9uRGVsdGFbXSBkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1JVTlRJTUVfVFlQRSk7CiAJCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQloYW5kbGVSdW50aW1lVHlwZURlbHRhKGRlbHRhc1tpXSk7Ci0JCQkJfQorCQkJCWZvciAoSUV4dGVuc2lvbkRlbHRhIGRlbHRhIDogZGVsdGFzKQorCQkJCQloYW5kbGVSdW50aW1lVHlwZURlbHRhKGRlbHRhKTsKIAkJCX0KIAkJCQogCQkJZGVsdGFzID0gZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9TRVJWRVJfVFlQRSk7CiAJCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQloYW5kbGVTZXJ2ZXJUeXBlRGVsdGEoZGVsdGFzW2ldKTsKLQkJCQl9CisJCQkJZm9yIChJRXh0ZW5zaW9uRGVsdGEgZGVsdGEgOiBkZWx0YXMpCisJCQkJCWhhbmRsZVNlcnZlclR5cGVEZWx0YShkZWx0YSk7CiAJCQl9CiAJCX0KIAl9CkBAIC02OSw3ICs2Nyw3IEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgcmVzb3VyY2UgbWFuYWdlci4KIAkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlJlc291cmNlTWFuYWdlcgorCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIG1hbmFnZXIKIAkgKi8KIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewogCQlyZXR1cm4gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7CkBAIC0xOTAsNyArMTg4LDcgQEAKIAkJCiAJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CiAJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9SVU5USU1FX1RZUEUpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGNmLmxlbmd0aCk7CisJCUxpc3Q8SVJ1bnRpbWVUeXBlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZVR5cGU+KGNmLmxlbmd0aCk7CiAJCWFkZFJ1bnRpbWVUeXBlcyhjZiwgbGlzdCk7CiAJCWFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKIAkJcnVudGltZVR5cGVzID0gbGlzdDsKQEAgLTIwMSwxMyArMTk5LDE0IEBACiAJLyoqCiAJICogTG9hZCB0aGUgcnVudGltZSB0eXBlcy4KIAkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRSdW50aW1lVHlwZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YsIExpc3QgbGlzdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNmLmxlbmd0aDsgaSsrKSB7CisJcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkUnVudGltZVR5cGVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmLCBMaXN0PElSdW50aW1lVHlwZT4gbGlzdCkgeworCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7CiAJCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lVHlwZShjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHJ1bnRpbWVUeXBlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKKwkJCQlpZiAoIVNlcnZlclBsdWdpbi5jb250YWlucyhTZXJ2ZXJQbHVnaW4uZ2V0RXhjbHVkZWRTZXJ2ZXJBZGFwdGVycygpLCBjZS5nZXRBdHRyaWJ1dGUoImlkIikpKQorCQkJCQlsaXN0LmFkZChuZXcgUnVudGltZVR5cGUoY2UpKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBydW50aW1lVHlwZTogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7CiAJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZVR5cGU6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZVR5cGU6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwogCQkJfQogCQl9CiAJfQpAQCAtMjIzLDcgKzIyMiw3IEBACiAJCQogCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwogCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fU0VSVkVSX1RZUEUpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGNmLmxlbmd0aCk7CisJCUxpc3Q8SVNlcnZlclR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXJUeXBlPihjZi5sZW5ndGgpOwogCQlhZGRTZXJ2ZXJUeXBlcyhjZiwgbGlzdCk7CiAJCWFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKIAkJc2VydmVyVHlwZXMgPSBsaXN0OwpAQCAtMjM0LDEzICsyMzMsMTQgQEAKIAkvKioKIAkgKiBMb2FkIHRoZSBzZXJ2ZXIgdHlwZXMuCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkU2VydmVyVHlwZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YsIExpc3QgbGlzdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNmLmxlbmd0aDsgaSsrKSB7CisJcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkU2VydmVyVHlwZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YsIExpc3Q8SVNlcnZlclR5cGU+IGxpc3QpIHsKKwkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgOiBjZikgewogCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZChuZXcgU2VydmVyVHlwZShjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHNlcnZlclR5cGU6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOworCQkJCWlmICghU2VydmVyUGx1Z2luLmNvbnRhaW5zKFNlcnZlclBsdWdpbi5nZXRFeGNsdWRlZFNlcnZlckFkYXB0ZXJzKCksIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSkpCisJCQkJCWxpc3QuYWRkKG5ldyBTZXJ2ZXJUeXBlKGNlKSk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgc2VydmVyVHlwZTogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7CiAJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgc2VydmVyVHlwZTogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBzZXJ2ZXJUeXBlOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKIAkJCX0KIAkJfQogCX0KQEAgLTM4NSw3ICszODUsNyBAQAogCQkKIAkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSBkZWx0YS5nZXRFeHRlbnNpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKIAkJCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2VydmVyVHlwZXMpOworCQlMaXN0PElTZXJ2ZXJUeXBlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyVHlwZT4oc2VydmVyVHlwZXMpOwogCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkgewogCQkJYWRkU2VydmVyVHlwZXMoY2YsIGxpc3QpOwogCQl9IGVsc2UgewpAQCAtNDE5LDcgKzQxOSw3IEBACiAJCQogCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IGRlbHRhLmdldEV4dGVuc2lvbigpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwogCQkKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChydW50aW1lVHlwZXMpOworCQlMaXN0PElSdW50aW1lVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVUeXBlPihydW50aW1lVHlwZXMpOwogCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkgewogCQkJYWRkUnVudGltZVR5cGVzKGNmLCBsaXN0KTsKIAkJfSBlbHNlIHsKQEAgLTQ1MSw0ICs0NTEsMTYgQEAKIAkJcmVnaXN0cnkuYWRkUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcihyZWdpc3RyeUxpc3RlbmVyLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEKTsKIAkJU2VydmVyUGx1Z2luLnNldFJlZ2lzdHJ5TGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lcik7CiAJfQorCisJLyoqCisJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQgdG8gYXV0b21hdGljYWxseQorCSAqIHB1Ymxpc2ggd2hlbiBzdGFydGluZyBzZXJ2ZXJzLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQgdG8gYXV0b21hdGljYWxseQorCSAqICAgIHB1Ymxpc2ggd2hlbiBzdGFydGluZyBzZXJ2ZXJzLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9QdWJsaXNoaW5nKCkgeworCQlyZXR1cm4gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5pc0F1dG9QdWJsaXNoaW5nKCk7CisJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJFdmVudC5qYXZhCmluZGV4IDQ5NzgyODUuLjU1YjFmMTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckV2ZW50LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyRXZlbnQuamF2YQpAQCAtMTMxLDcgKzEzMSw3IEBACiAJCQogCQljaGVja0tpbmQoKTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgY2hlY2tLaW5kKCkgewogCQlpbnQgaSA9IDA7CiAJCWlmICgoa2luZCAmIFNUQVRFX0NIQU5HRSkgIT0gMCkKQEAgLTE0MSw3ICsxNDEsNyBAQAogCQlpZiAoKGtpbmQgJiBQVUJMSVNIX1NUQVRFX0NIQU5HRSkgIT0gMCkKIAkJCWkrKzsKIAkJCi0JCWlmIChpICE9IDEpCisJCWlmIChpICE9IDAgJiYgaSAhPSAxKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiS2luZCBwYXJhbWV0ZXIgaW52YWxpZCIpOwogCX0KIApAQCAtMTUwLDkgKzE1MCw5IEBACiAJICogPHA+CiAJICogVGhpcyBraW5kIGNhbiBiZSB1c2VkIHRvIHRlc3Qgd2hldGhlciB0aGlzIGV2ZW50IGlzIGEgc2VydmVyIGV2ZW50IG9yIG1vZHVsZSBldmVudCBieSB1c2luZwogCSAqIHRoZSBmb2xsb3dpbmcgY29kZSAodGhlIGV4YW1wbGUgaXMgY2hlY2tpbmcgZm9yIHRoZSBzZXJ2ZXIgZXZlbnQpOgotCSAqICgoZ2V0S2luZCgpIHwgU0VSVkVSX0NIQU5HRSkgIT0gMCkgCisJICogICAgKChnZXRLaW5kKCkgfCBTRVJWRVJfQ0hBTkdFKSAhPSAwKSAKIAkgKiB0aGUgZm9sbG93aW5nIGNvZGUgKHRoZSBleGFtcGxlIGlzIGNoZWNraW5nIGZvciB0aGUgbW9kdWxlIGV2ZW50KToKLQkgKiAoKGdldEtpbmQoKSB8IE1PRFVMRV9DSEFOR0UpICE9IDApIAorCSAqICAgICgoZ2V0S2luZCgpIHwgTU9EVUxFX0NIQU5HRSkgIT0gMCkgCiAJICogCiAJICogQHJldHVybiB0aGUga2luZCBvZiB0aGUgY2hhbmdlICg8Y29kZT5YWFhfQ0hBTkdFPC9jb2RlPgogCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgU2VydmVyRXZlbnR9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJVdGlsLmphdmEKaW5kZXggNmYzNjRkZC4uMjBmODM2MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyVXRpbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlclV0aWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiw3ICsyNiw3IEBACiAgKiBjb21tb24gb3BlcmF0aW9ucyBvbiBzZXJ2ZXIgYXJ0aWZhY3RzLgogICogPHA+CiAgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgorICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1Yi1jbGFzc2VkIG9yIGluc3RhbnRpYXRlZC4KICAqIDwvcD4KICAqIEBzaW5jZSAxLjAKICAqLwpAQCAtODgsMTggKzg4LDE2IEBACiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCQogCQkvLyB1c2UgYSBzZXQgZm9yIGJldHRlciBjb250YWlucygpIHBlcmZvcm1hbmNlCi0JCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOworCQlTZXQ8SU1vZHVsZT4gc2V0ID0gbmV3IEhhc2hTZXQ8SU1vZHVsZT4oKTsKIAkJCiAJCU1vZHVsZUZhY3RvcnlbXSBmYWN0b3JpZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlRmFjdG9yaWVzKCk7CiAJCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmYWN0b3JpZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IGZhY3Rvcmllc1tpXS5nZXRNb2R1bGVzKHByb2plY3QsIG51bGwpOworCQkJZm9yIChNb2R1bGVGYWN0b3J5IGZhY3RvcnkgOiBmYWN0b3JpZXMpIHsKKwkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IGZhY3RvcnkuZ2V0TW9kdWxlcyhwcm9qZWN0LCBudWxsKTsKIAkJCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplMiA9IG1vZHVsZXMubGVuZ3RoOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCWlmICghc2V0LmNvbnRhaW5zKG1vZHVsZXNbal0pKQotCQkJCQkJCXNldC5hZGQobW9kdWxlc1tqXSk7CisJCQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKSB7CisJCQkJCQlpZiAoIXNldC5jb250YWlucyhtb2R1bGUpKQorCQkJCQkJCXNldC5hZGQobW9kdWxlKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTE1MSwxOCArMTQ5LDE2IEBACiAJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIG1vZHVsZXMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKElNb2R1bGVUeXBlW10gbW9kdWxlVHlwZXMpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CiAJCQogCQlNb2R1bGVGYWN0b3J5W10gZmFjdG9yaWVzID0gU2VydmVyUGx1Z2luLmdldE1vZHVsZUZhY3RvcmllcygpOwogCQlpZiAoZmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gZmFjdG9yaWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKGZhY3Rvcmllc1tpXS5nZXRNb2R1bGVUeXBlcygpLCBtb2R1bGVUeXBlcykpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBmYWN0b3JpZXNbaV0uZ2V0TW9kdWxlcyhudWxsKTsKKwkJCWZvciAoTW9kdWxlRmFjdG9yeSBmYWN0b3J5IDogZmFjdG9yaWVzKSB7CisJCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKGZhY3RvcnkuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlVHlwZXMpKSB7CisJCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gZmFjdG9yeS5nZXRNb2R1bGVzKG51bGwpOwogCQkJCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc2l6ZTIgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykKLQkJCQkJCQlsaXN0LmFkZChtb2R1bGVzW2pdKTsKKwkJCQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKQorCQkJCQkJCWxpc3QuYWRkKG1vZHVsZSk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC0xODYsMTkgKzE4MiwxNyBAQAogCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzCiAJICovCiAJcHVibGljIHN0YXRpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhTdHJpbmcgdHlwZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKIAkJCiAJCU1vZHVsZUZhY3RvcnlbXSBmYWN0b3JpZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlRmFjdG9yaWVzKCk7CiAJCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmYWN0b3JpZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUoZmFjdG9yaWVzW2ldLmdldE1vZHVsZVR5cGVzKCksIHR5cGUsIG51bGwpKSB7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gZmFjdG9yaWVzW2ldLmdldE1vZHVsZXMobnVsbCk7CisJCQlmb3IgKE1vZHVsZUZhY3RvcnkgZmFjdG9yeSA6IGZhY3RvcmllcykgeworCQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShmYWN0b3J5LmdldE1vZHVsZVR5cGVzKCksIHR5cGUsIG51bGwpKSB7CisJCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gZmFjdG9yeS5nZXRNb2R1bGVzKG51bGwpOwogCQkJCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc2l6ZTIgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykKLQkJCQkJCQlpZiAodHlwZS5lcXVhbHMobW9kdWxlc1tqXS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpCi0JCQkJCQkJCWxpc3QuYWRkKG1vZHVsZXNbal0pOworCQkJCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpCisJCQkJCQkJaWYgKHR5cGUuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpCisJCQkJCQkJCWxpc3QuYWRkKG1vZHVsZSk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC0yMzAsMjEgKzIyNCwxOCBAQAogCQlpZiAodHlwZUlkID09IG51bGwgJiYgdmVyc2lvbklkID09IG51bGwpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJCi0JCWlmIChtb2R1bGVUeXBlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vZHVsZVR5cGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKG1vZHVsZVR5cGVzW2ldLCB0eXBlSWQsIHZlcnNpb25JZCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQorCQlmb3IgKElNb2R1bGVUeXBlIG1vZHVsZVR5cGUgOiBtb2R1bGVUeXBlcykgeworCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKG1vZHVsZVR5cGUsIHR5cGVJZCwgdmVyc2lvbklkKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQorCQkKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZVR5cGVbXSBtb2R1bGVUeXBlcywgSU1vZHVsZVR5cGVbXSBtdCkgewogCQlpZiAobXQgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtdC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShtb2R1bGVUeXBlcywgbXRbaV0pKQorCQkJZm9yIChJTW9kdWxlVHlwZSBtb2R1bGVUeXBlIDogbXQpIHsKKwkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUobW9kdWxlVHlwZXMsIG1vZHVsZVR5cGUpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KIAkJfQpAQCAtMjY0LDkgKzI1NSw4IEBACiAJCWlmIChtb2R1bGVUeXBlcyA9PSBudWxsIHx8IG10ID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCQotCQlpbnQgc2l6ZSA9IG1vZHVsZVR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShtb2R1bGVUeXBlc1tpXSwgbXQpKQorCQlmb3IgKElNb2R1bGVUeXBlIG1vZHVsZVR5cGUgOiBtb2R1bGVUeXBlcykgeworCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKG1vZHVsZVR5cGUsIG10KSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCQlyZXR1cm4gZmFsc2U7CkBAIC0yNzQsOSArMjY0LDkgQEAKIAogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uKSB7CiAJCVN0cmluZyB0eXBlMiA9IG1vZHVsZVR5cGUuZ2V0SWQoKTsKLQkJaWYgKG1hdGNoZXModHlwZSwgdHlwZTIpKSB7CisJCWlmIChTZXJ2ZXJQbHVnaW4ubWF0Y2hlcyh0eXBlLCB0eXBlMikpIHsKIAkJCVN0cmluZyB2ZXJzaW9uMiA9IG1vZHVsZVR5cGUuZ2V0VmVyc2lvbigpOwotCQkJaWYgKG1hdGNoZXModmVyc2lvbiwgdmVyc2lvbjIpKQorCQkJaWYgKFNlcnZlclBsdWdpbi5tYXRjaGVzKHZlcnNpb24sIHZlcnNpb24yKSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCQlyZXR1cm4gZmFsc2U7CkBAIC0yOTQsMjEgKzI4NCwxMyBAQAogCQlpZiAobW9kdWxlVHlwZSA9PSBudWxsIHx8IG10ID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCQotCQlpZiAobWF0Y2hlcyhtdC5nZXRJZCgpLCBtb2R1bGVUeXBlLmdldElkKCkpICYmCi0JCQkJbWF0Y2hlcyhtdC5nZXRWZXJzaW9uKCksIG1vZHVsZVR5cGUuZ2V0VmVyc2lvbigpKSkKKwkJaWYgKFNlcnZlclBsdWdpbi5tYXRjaGVzKG10LmdldElkKCksIG1vZHVsZVR5cGUuZ2V0SWQoKSkgJiYKKwkJCQlTZXJ2ZXJQbHVnaW4ubWF0Y2hlcyhtdC5nZXRWZXJzaW9uKCksIG1vZHVsZVR5cGUuZ2V0VmVyc2lvbigpKSkKIAkJCXJldHVybiB0cnVlOwogCQkKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwgfHwgIioiLmVxdWFscyhhKSB8fCAiKiIuZXF1YWxzKGIpIHx8IGEuc3RhcnRzV2l0aChiKSB8fCBiLnN0YXJ0c1dpdGgoYSkKLQkJCXx8IChhLmVuZHNXaXRoKCIuKiIpICYmIGIuc3RhcnRzV2l0aChhLnN1YnN0cmluZygwLCBhLmxlbmd0aCgpIC0gMSkpKQotCQkJfHwgKGIuZW5kc1dpdGgoIi4qIikgJiYgYS5zdGFydHNXaXRoKGIuc3Vic3RyaW5nKDAsIGIubGVuZ3RoKCkgLSAxKSkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KIAkvKioKIAkgKiBBZGRzIG9yIHJlbW92ZXMgbW9kdWxlcyBmcm9tIGEgc2VydmVyLiBXaWxsIHNlYXJjaCBmb3IgdGhlIGZpcnN0IHBhcmVudCBtb2R1bGUKIAkgKiBvZiBlYWNoIG1vZHVsZSBhbmQgYWRkIGl0IHRvIHRoZSBzZXJ2ZXIgaW5zdGVhZC4gVGhpcyBtZXRob2Qgd2lsbCBoYW5kbGUgbXVsdGlwbGUKQEAgLTMzMiwxOSArMzE0LDE4IEBACiAJCWlmIChyZW1vdmUgPT0gbnVsbCkKIAkJCXJlbW92ZSA9IG5ldyBJTW9kdWxlWzBdOwogCQkKLQkJaW50IHNpemUgPSBhZGQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGFkZFtpXSA9PSBudWxsKQorCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogYWRkKSB7CisJCQlpZiAobW9kdWxlID09IG51bGwpCiAJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBudWxsIGVudHJpZXMiKTsKIAkJfQogCQkKLQkJTGlzdCBhZGRQYXJlbnRNb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlMaXN0PElNb2R1bGU+IGFkZFBhcmVudE1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CisJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBhZGQpIHsKIAkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKIAkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMoYWRkW2ldLCBtb25pdG9yKTsKKwkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwogCQkJCWlmIChwYXJlbnRzICE9IG51bGwgJiYgcGFyZW50cy5sZW5ndGggPiAwKSB7CQkJCQotCQkJCQlPYmplY3QgcGFyZW50ID0gcGFyZW50c1swXTsKKwkJCQkJSU1vZHVsZSBwYXJlbnQgPSBwYXJlbnRzWzBdOwogCQkJCQlmb3VuZCA9IHRydWU7CiAJCQkJCWlmICghYWRkUGFyZW50TW9kdWxlcy5jb250YWlucyhwYXJlbnQpKQogCQkJCQkJYWRkUGFyZW50TW9kdWxlcy5hZGQocGFyZW50KTsKQEAgLTM1NCwyMiArMzM1LDIxIEBACiAJCQl9CiAJCQkKIAkJCWlmICghZm91bmQpCi0JCQkJYWRkUGFyZW50TW9kdWxlcy5hZGQoYWRkW2ldKTsKKwkJCQlhZGRQYXJlbnRNb2R1bGVzLmFkZChtb2R1bGUpOwogCQl9CiAJCQotCQlzaXplID0gcmVtb3ZlLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChyZW1vdmVbaV0gPT0gbnVsbCkKKwkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IHJlbW92ZSkgeworCQkJaWYgKG1vZHVsZSA9PSBudWxsKQogCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCByZW1vdmUgbnVsbCBlbnRyaWVzIik7CiAJCX0KIAkJCi0JCUxpc3QgcmVtb3ZlUGFyZW50TW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJTGlzdDxJTW9kdWxlPiByZW1vdmVQYXJlbnRNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOworCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogcmVtb3ZlKSB7CiAJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CiAJCQl0cnkgewotCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKHJlbW92ZVtpXSwgbW9uaXRvcik7CisJCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKIAkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkgewkJCQkKLQkJCQkJT2JqZWN0IHBhcmVudCA9IHBhcmVudHNbMF07CisJCQkJCUlNb2R1bGUgcGFyZW50ID0gcGFyZW50c1swXTsKIAkJCQkJZm91bmQgPSB0cnVlOwogCQkJCQlpZiAoIXJlbW92ZVBhcmVudE1vZHVsZXMuY29udGFpbnMocGFyZW50KSkKIAkJCQkJCXJlbW92ZVBhcmVudE1vZHVsZXMuYWRkKHBhcmVudCk7CkBAIC0zNzksNyArMzU5LDcgQEAKIAkJCX0KIAkJCQogCQkJaWYgKCFmb3VuZCkKLQkJCQlyZW1vdmVQYXJlbnRNb2R1bGVzLmFkZChyZW1vdmVbaV0pOworCQkJCXJlbW92ZVBhcmVudE1vZHVsZXMuYWRkKG1vZHVsZSk7CiAJCX0KIAkJCiAJCUlNb2R1bGVbXSBhZGQyID0gbmV3IElNb2R1bGVbYWRkUGFyZW50TW9kdWxlcy5zaXplKCldOwpAQCAtNDAwLDcgKzM4MCw3IEBACiAJCQogCQlTdHJpbmcgbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRSdW50aW1lTmFtZSwgdHlwZU5hbWUpOwogCQlpbnQgaSA9IDI7Ci0JCXdoaWxlIChpc05hbWVJblVzZShydW50aW1lLmdldE9yaWdpbmFsKCksIG5hbWUpKSB7CisJCXdoaWxlIChTZXJ2ZXJQbHVnaW4uaXNOYW1lSW5Vc2UocnVudGltZS5nZXRPcmlnaW5hbCgpLCBuYW1lKSkgewogCQkJbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRSdW50aW1lTmFtZTIsIG5ldyBTdHJpbmdbXSB7dHlwZU5hbWUsIGkgKyAiIn0pOwogCQkJaSsrOwogCQl9CkBAIC00MzAsNyArNDEwLDcgQEAKIAkJCiAJCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlck5hbWUsIG5ldyBTdHJpbmdbXSB7dHlwZU5hbWUsIGhvc3R9KTsKIAkJaW50IGkgPSAyOwotCQl3aGlsZSAoaXNOYW1lSW5Vc2Uoc2VydmVyLmdldE9yaWdpbmFsKCksIG5hbWUpKSB7CisJCXdoaWxlIChTZXJ2ZXJQbHVnaW4uaXNOYW1lSW5Vc2Uoc2VydmVyLmdldE9yaWdpbmFsKCksIG5hbWUpKSB7CiAJCQluYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlck5hbWUyLCBuZXcgU3RyaW5nW10ge3R5cGVOYW1lLCBob3N0LCBpICsgIiJ9KTsKIAkJCWkrKzsKIAkJfQpAQCAtNDcxLDI3ICs0NTEsNiBAQAogCSAqIFJldHVybnMgYW4gdW51c2VkIGZpbGUgaW4gdGhlIGdpdmVuIHByb2plY3QuCiAJICogCiAJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0Ci0JICogQHBhcmFtIHR5cGUgYSBzZXJ2ZXIgdHlwZQotCSAqIEByZXR1cm4gYW4gdW51c2VkIGZpbGUgd2l0aGluIHRoZSBnaXZlbiBwcm9qZWN0Ci0JICovCi0JLypwdWJsaWMgc3RhdGljIElGaWxlIGdldFVudXNlZFNlcnZlckZpbGUoSVByb2plY3QgcHJvamVjdCwgSVNlcnZlclR5cGUgdHlwZSkgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8IHR5cGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyB0eXBlTmFtZSA9IGdldFZhbGlkRmlsZU5hbWUodHlwZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRTZXJ2ZXJOYW1lMywgdHlwZU5hbWUpKyAiLiIgICsgU2VydmVyLkZJTEVfRVhURU5TSU9OOwotCQlpbnQgaSA9IDI7Ci0JCXdoaWxlIChpc0ZpbGVOYW1lSW5Vc2UocHJvamVjdCwgbmFtZSkpIHsKLQkJCW5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0U2VydmVyTmFtZTQsIG5ldyBTdHJpbmdbXSB7dHlwZU5hbWUsIGkgKyAiIn0pICsgIi4iICArIFNlcnZlci5GSUxFX0VYVEVOU0lPTjsKLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gcHJvamVjdC5nZXRGaWxlKG5hbWUpOwotCX0qLwotCi0JLyoqCi0JICogUmV0dXJucyBhbiB1bnVzZWQgZmlsZSBpbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKIAkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCiAJICogQHJldHVybiBhbiB1bnVzZWQgZmlsZSB3aXRoaW4gdGhlIGdpdmVuIHByb2plY3QKIAkgKi8KQEAgLTUxMCw0NyArNDY5LDYgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYSBzZXJ2ZXIgb3IgcnVudGltZSBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIGEgbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5hbWUgaXMgaW4gdXNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05hbWVJblVzZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlhZGRBbGwobGlzdCwgU2VydmVyQ29yZS5nZXRSdW50aW1lcygpKTsKLQkJYWRkQWxsKGxpc3QsIFNlcnZlckNvcmUuZ2V0U2VydmVycygpKTsKLQkJCi0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgbGlzdC5jb250YWlucyhlbGVtZW50KSkKLQkJCWxpc3QucmVtb3ZlKGVsZW1lbnQpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlckF0dHJpYnV0ZXMgJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCgoSVNlcnZlckF0dHJpYnV0ZXMpb2JqKS5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSdW50aW1lICYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKElSdW50aW1lKW9iaikuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBbGwoTGlzdCBsaXN0LCBPYmplY3RbXSBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJbGlzdC5hZGQob2JqW2ldKTsKLQkJfQotCX0KLQkKLQkvKioKIAkgKiBSZXR1cm5zIHRydWUgaWYgYW4gZWxlbWVudCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KIAkgKgogCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdApAQCAtNTc5LDE0ICs0OTcsMTMgQEAKIAkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcnVudGltZSBpbnN0YW5jZXMge0BsaW5rIElSdW50aW1lfQogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVbXSBnZXRSdW50aW1lcyhTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlMaXN0PElSdW50aW1lPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKIAkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKIAkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBydW50aW1lc1tpXS5nZXRSdW50aW1lVHlwZSgpOworCQkJZm9yIChJUnVudGltZSBydW50aW1lIDogcnVudGltZXMpIHsKKwkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCk7CiAJCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwgJiYgaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgdHlwZSwgdmVyc2lvbikpIHsKLQkJCQkJbGlzdC5hZGQocnVudGltZXNbaV0pOworCQkJCQlsaXN0LmFkZChydW50aW1lKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTYwNSwxMyArNTIyLDEyIEBACiAJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJ1bnRpbWUgdHlwZSBpbnN0YW5jZXMge0BsaW5rIElSdW50aW1lVHlwZX0KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElSdW50aW1lVHlwZVtdIGdldFJ1bnRpbWVUeXBlcyhTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlMaXN0PElSdW50aW1lVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVUeXBlPigpOwogCQlJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVUeXBlcygpOwogCQlpZiAocnVudGltZVR5cGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKHJ1bnRpbWVUeXBlc1tpXS5nZXRNb2R1bGVUeXBlcygpLCB0eXBlLCB2ZXJzaW9uKSkgewotCQkJCQlsaXN0LmFkZChydW50aW1lVHlwZXNbaV0pOworCQkJZm9yIChJUnVudGltZVR5cGUgcnVudGltZVR5cGUgOiBydW50aW1lVHlwZXMpIHsKKwkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgdHlwZSwgdmVyc2lvbikpIHsKKwkJCQkJbGlzdC5hZGQocnVudGltZVR5cGUpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNjMyLDE0ICs1NDgsMTMgQEAKIAkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcnVudGltZSB0eXBlIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWVUeXBlfQogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVUeXBlW10gZ2V0UnVudGltZVR5cGVzKFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlMaXN0PElSdW50aW1lVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVUeXBlPigpOwogCQlJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVUeXBlcygpOwogCQlpZiAocnVudGltZVR5cGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKHJ1bnRpbWVUeXBlc1tpXS5nZXRNb2R1bGVUeXBlcygpLCB0eXBlLCB2ZXJzaW9uKSkgewotCQkJCQlpZiAocnVudGltZVR5cGVJZCA9PSBudWxsIHx8IHJ1bnRpbWVUeXBlc1tpXS5nZXRJZCgpLnN0YXJ0c1dpdGgocnVudGltZVR5cGVJZCkpCi0JCQkJCQlsaXN0LmFkZChydW50aW1lVHlwZXNbaV0pOworCQkJZm9yIChJUnVudGltZVR5cGUgcnVudGltZVR5cGUgOiBydW50aW1lVHlwZXMpIHsKKwkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgdHlwZSwgdmVyc2lvbikpIHsKKwkJCQkJaWYgKHJ1bnRpbWVUeXBlSWQgPT0gbnVsbCB8fCBydW50aW1lVHlwZS5nZXRJZCgpLnN0YXJ0c1dpdGgocnVudGltZVR5cGVJZCkpCisJCQkJCQlsaXN0LmFkZChydW50aW1lVHlwZSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC02NTAsMTAgKzU2NSwxMCBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBzZXJ2ZXJzIHRoYXQgdGhpcyBkZXBsb3lhYmxlIGlzIG5vdCBjdXJyZW50bHkKKwkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc2VydmVycyB0aGF0IHRoaXMgbW9kdWxlIGlzIG5vdCBjdXJyZW50bHkKIAkgKiBjb25maWd1cmVkIG9uLCBidXQgY291bGQgYmUgYWRkZWQgdG8uIElmIGluY2x1ZGVFcnJvcnMgaXMgdHJ1ZSwgdGhpcwotCSAqIG1ldGhvZCByZXR1cm4gc2VydmVycyB3aGVyZSB0aGUgcGFyZW50IGRlcGxveWFibGUgbWF5IHRocm93IGVycm9ycy4gRm9yCi0JICogaW5zdGFuY2UsIHRoaXMgZGVwbG95YWJsZSBtYXkgYmUgdGhlIHdyb25nIHNwZWMgbGV2ZWwuCisJICogbWV0aG9kIHJldHVybiBzZXJ2ZXJzIHdoZXJlIHRoZSBwYXJlbnQgbW9kdWxlIG1heSB0aHJvdyBlcnJvcnMuIEZvcgorCSAqIGluc3RhbmNlLCB0aGlzIG1vZHVsZSBtYXkgYmUgdGhlIHdyb25nIHNwZWMgbGV2ZWwuCiAJICoKIAkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCiAJICogQHBhcmFtIGluY2x1ZGVFcnJvcnMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5jbHVkZSBzZXJ2ZXJzIHRoYXQgcmV0dXJuZWQKQEAgLTY2OSwzMSArNTg0LDI4IEBACiAJCS8vIGRvIGl0IHRoZSBzbG93IHdheSAtIGdvIHRocm91Z2ggYWxsIHNlcnZlcnMgYW5kCiAJCS8vIHNlZSBpZiB0aGlzIGRlcGxveWFibGUgaXMgbm90IGNvbmZpZ3VyZWQgaW4gaXQKIAkJLy8gYnV0IGNvdWxkIGJlIGFkZGVkCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdDxJU2VydmVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOwogCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwogCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoIWNvbnRhaW5zTW9kdWxlKHNlcnZlcnNbaV0sIG1vZHVsZSwgbW9uaXRvcikpIHsKKwkJCWZvciAoSVNlcnZlciBzZXJ2ZXIgOiBzZXJ2ZXJzKSB7IAorCQkJCWlmICghY29udGFpbnNNb2R1bGUoc2VydmVyLCBtb2R1bGUsIG1vbml0b3IpKSB7CiAJCQkJCXRyeSB7Ci0JCQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlcnNbaV0uZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKKwkJCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbW9uaXRvcik7CiAJCQkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkgewogCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlpZiAocGFyZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBzaXplMiA9IHBhcmVudHMubGVuZ3RoOwotCQkJCQkJCQlmb3IgKGludCBqID0gMDsgIWZvdW5kICYmIGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQkJCQlJTW9kdWxlIHBhcmVudCA9IHBhcmVudHNbal07Ci0JCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHNlcnZlcnNbaV0uY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgcGFyZW50IH0sIG5ldyBJTW9kdWxlWzBdLCBtb25pdG9yKTsKLQkJCQkJCQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKXsKLQkJCQkJCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKLQkJCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQl9CisJCQkJCQkJaW50IHNpemUyID0gcGFyZW50cy5sZW5ndGg7CisJCQkJCQkJZm9yIChpbnQgaiA9IDA7ICFmb3VuZCAmJiBqIDwgc2l6ZTI7IGorKykgeworCQkJCQkJCQlJTW9kdWxlIHBhcmVudCA9IHBhcmVudHNbal07CisJCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gc2VydmVyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IHBhcmVudCB9LCBuZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7CisJCQkJCQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKXsKKwkJCQkJCQkJCWxpc3QuYWRkKHNlcnZlcik7CisJCQkJCQkJCQlmb3VuZCA9IHRydWU7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBzZSkgewogCQkJCQkJaWYgKGluY2x1ZGVFcnJvcnMpCi0JCQkJCQkJbGlzdC5hZGQoc2VydmVyc1tpXSk7CisJCQkJCQkJbGlzdC5hZGQoc2VydmVyKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTcyNSwxMyArNjM3LDEyIEBACiAKIAkJLy8gZG8gaXQgdGhlIHNsb3cgd2F5IC0gZ28gdGhyb3VnaCBhbGwgc2VydmVycyBhbmQKIAkJLy8gc2VlIGlmIHRoaXMgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgaW4gaXQKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlMaXN0PElTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7CiAJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CiAJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChjb250YWluc01vZHVsZShzZXJ2ZXJzW2ldLCBtb2R1bGUsIG1vbml0b3IpKQotCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKKwkJCWZvciAoSVNlcnZlciBzZXJ2ZXIgOiBzZXJ2ZXJzKSB7CisJCQkJaWYgKGNvbnRhaW5zTW9kdWxlKHNlcnZlciwgbW9kdWxlLCBtb25pdG9yKSkKKwkJCQkJbGlzdC5hZGQoc2VydmVyKTsKIAkJCX0KIAkJfQogCQkKQEAgLTgzMCw4ICs3NDEsOSBAQAogCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKIAkgKiBAcmV0dXJuIGEgc2NoZWR1bGluZyBydWxlIGZvciB0aGlzIHNlcnZlcgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAZGVwcmVjYXRlZCB0aGUgc2VydmVyIGluc3RhbmNlIGlzIG5vdyBhIHNjaGVkdWxpbmcgcnVsZSBkaXJlY3RseQogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVNjaGVkdWxpbmdSdWxlIGdldFNlcnZlclNjaGVkdWxpbmdSdWxlKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBuZXcgU2VydmVyU2NoZWR1bGluZ1J1bGUoc2VydmVyKTsKKwkJcmV0dXJuIHNlcnZlcjsKIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvVGFza01vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9UYXNrTW9kZWwuamF2YQppbmRleCA4MTZkYmI0Li5iZWFiNWMzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9UYXNrTW9kZWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9UYXNrTW9kZWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNyw3ICsxNyw3IEBACiAgKiB0YXNrcyBpbiBhIGNvbW1vbiB3b3JrZmxvdy4KICAqIDxwPgogICogVGhlIHRhc2sgbW9kZWwgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgdGFzayBmbG93IGFuZCBhbGxvd3MKLSAqIHRhc2tzIHRvIHN0b3JlIGFuZCByZXRyZWl2ZSBkYXRhLiBJdHMgdXNhZ2UgYWxsb3dzIG11dGxpcGxlIHRhc2tzIHRvIGJlCisgKiB0YXNrcyB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdWx0aXBsZSB0YXNrcyB0byBiZQogICogY2hhaW5lZCB0b2dldGhlciBhbmQgc2hhcmUgZGF0YSBmcm9tIHRoZSBvdXRwdXQgb2Ygb25lIHRhc2sgdG8gdGhlIGlucHV0CiAgKiBvZiBhbm90aGVyLgogICogPC9wPgpAQCAtMzIsNyArMzIsNyBAQAogCSAqIEBzZWUgI3B1dE9iamVjdChTdHJpbmcsIE9iamVjdCkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1JVTlRJTUUgPSAicnVudGltZSI7Ci0JCisKIAkvKioKIAkgKiBUYXNrIG1vZGVsIGlkIGZvciBhbiBJU2VydmVyLgogCSAqIApAQCAtNDksNyArNDksNyBAQAogCSAqIEBzZWUgVGFza01vZGVsI3B1dE9iamVjdChTdHJpbmcsIE9iamVjdCkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX01PRFVMRVMgPSAibW9kdWxlcyI7Ci0JCisKIAkvKioKIAkgKiBUYXNrIG1vZGVsIGlkIGZvciBhIGxhdW5jaCBtb2RlLgogCSAqIApAQCAtNTcsMTQgKzU3LDE0IEBACiAJICogQHNlZSAjcHV0T2JqZWN0KFN0cmluZywgT2JqZWN0KQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTEFVTkNIX01PREUgPSAibGF1bmNoLW1vZGUiOwotCQotCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBvYmplY3QgaW4gdGhlIHRhc2sgbW9kZWwgd2l0aCB0aGUgZ2l2ZW4gaWQuCiAJICogPHA+CiAJICogVGhlIGlkIGNhbiBiZSBhbnkgb2YgdGhlIHByZWRlZmluZWQgaWRzIHdpdGhpbiBUYXNrTW9kZWwsIG9yCi0JICogYW55IG90aGVyIGtleSB0byByZXRyZWl2ZSB0YXNrLXNwZWNpZmljIGRhdGEuCisJICogYW55IG90aGVyIGtleSB0byByZXRyaWV2ZSB0YXNrLXNwZWNpZmljIGRhdGEuCiAJICogPC9wPgogCSAqIAogCSAqIEBwYXJhbSBpZCBhbiBpZCBmb3IgdGhlIG9iamVjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQmFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQmFzZS5qYXZhCmluZGV4IDdkNDM2M2MuLjQzMjgwOTQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0Jhc2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9CYXNlLmphdmEKQEAgLTMwLDEzICszMCwxNCBAQAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFJJVkFURSA9ICJwcml2YXRlIjsKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX05BTUUgPSAibmFtZSI7CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JRCA9ICJpZCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JRF9TRVQgPSAiaWQtc2V0IjsKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RJTUVTVEFNUCA9ICJ0aW1lc3RhbXAiOwogCi0JcHJvdGVjdGVkIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQorCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCiAJLy8gZmlsZSBsb2FkZWQgZnJvbSwgb3IgbnVsbCBpZiBpdCBpcyBzYXZlZCBpbiBtZXRhZGF0YQogCXByb3RlY3RlZCBJRmlsZSBmaWxlOwotCQorCiAJLyoqCiAJICogQ3JlYXRlIGEgbmV3IG9iamVjdC4KIAkgKiAKQEAgLTU0LDggKzU1LDEwIEBACiAJICovCiAJcHVibGljIEJhc2UoSUZpbGUgZmlsZSwgU3RyaW5nIGlkKSB7CiAJCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCS8vdGhpcy5tYXAgPSBtYXA7Ci0JCW1hcC5wdXQoUFJPUF9JRCwgaWQpOworCQlpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSA+IDApIHsKKwkJCW1hcC5wdXQoUFJPUF9JRCwgaWQpOworCQkJbWFwLnB1dChQUk9QX0lEX1NFVCwgQm9vbGVhbi50b1N0cmluZyh0cnVlKSk7CisJCX0KIAl9CiAKIAkvKioKQEAgLTEzNiwxNSArMTM5LDE0IEBACiAJCX0KIAkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKIAl9Ci0JCi0JcHVibGljIExpc3QgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IGRlZmF1bHRWYWx1ZSkgeworCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3Q8U3RyaW5nPiBkZWZhdWx0VmFsdWUpIHsKIAkJdHJ5IHsKIAkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwogCQkJaWYgKG9iaiA9PSBudWxsKQogCQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgb2JqOwotCQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbGlzdDsKKwkJCXJldHVybiAoTGlzdDxTdHJpbmc+KSBvYmo7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQkvLyBpZ25vcmUKIAkJfQpAQCAtMTU2LDkgKzE1OCw3IEBACiAJCQlPYmplY3Qgb2JqID0gbWFwLmdldChhdHRyaWJ1dGVOYW1lKTsKIAkJCWlmIChvYmogPT0gbnVsbCkKIAkJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQkJTWFwIG1hcDIgPSAoTWFwKSBvYmo7Ci0JCQlpZiAobWFwMiAhPSBudWxsKQotCQkJCXJldHVybiBtYXAyOworCQkJcmV0dXJuIChNYXApIG9iajsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGlnbm9yZQogCQl9CkBAIC0yNzIsNDggKzI3Miw0MiBAQAogCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKTsKIAogCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bykgewotCQltYXAgPSBuZXcgSGFzaE1hcCgpOworCQltYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKIAkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVtZW50by5nZXROYW1lcygpLml0ZXJhdG9yKCk7CisJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBtZW1lbnRvLmdldE5hbWVzKCkuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCVN0cmluZyBrZXkgPSBpdGVyYXRvci5uZXh0KCk7CiAJCQltYXAucHV0KGtleSwgbWVtZW50by5nZXRTdHJpbmcoa2V5KSk7CiAJCX0KIAkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oImxpc3QiKTsKIAkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlsb2FkTGlzdChjaGlsZHJlbltpXSk7Ci0JCQl9CisJCQlmb3IgKElNZW1lbnRvIGNoaWxkIDogY2hpbGRyZW4pCisJCQkJbG9hZExpc3QoY2hpbGQpOwogCQl9CiAJCUlNZW1lbnRvW10gbWFwcyA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oIm1hcCIpOwogCQlpZiAobWFwcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8bWFwcy5sZW5ndGggOyBpKyspIHsKLQkJCQlsb2FkTWFwKG1hcHNbaV0pOwotCQkJfQorCQkJZm9yIChJTWVtZW50byBtIDogbWFwcykKKwkJCQlsb2FkTWFwKG0pOwogCQl9CiAJCQogCQlsb2FkU3RhdGUobWVtZW50byk7CiAJfQogCi0JCiAJcHJvdGVjdGVkIHZvaWQgbG9hZE1hcChJTWVtZW50byBtZW1lbnRvKSB7CiAJCVN0cmluZyBrZXkgPSBtZW1lbnRvLmdldFN0cmluZygia2V5Iik7Ci0JCU1hcCB2TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBrZXlzID0gbWVtZW50by5nZXROYW1lcygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGtleXMuaXRlcmF0b3IoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiB2TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBtZW1lbnRvLmdldE5hbWVzKCkuaXRlcmF0b3IoKTsKIAkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcyA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOworCQkJU3RyaW5nIHMgPSBpdGVyYXRvci5uZXh0KCk7CiAJCQlTdHJpbmcgdiA9IG1lbWVudG8uZ2V0U3RyaW5nKHMpOwogCQkJdk1hcC5wdXQocyx2KTsKIAkJfQogCQltYXAucHV0KGtleSwgdk1hcCk7CiAJfQotCQotCQorCiAJcHJvdGVjdGVkIHZvaWQgbG9hZExpc3QoSU1lbWVudG8gbWVtZW50bykgewogCQlTdHJpbmcga2V5ID0gbWVtZW50by5nZXRTdHJpbmcoImtleSIpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAJCWludCBpID0gMDsKIAkJU3RyaW5nIGtleTIgPSBtZW1lbnRvLmdldFN0cmluZygidmFsdWUiICsgKGkrKykpOwogCQl3aGlsZSAoa2V5MiAhPSBudWxsKSB7CkBAIC0zNTQsNyArMzQ4LDE2IEBACiAJCUJhc2UgYmFzZSA9IChCYXNlKSBvYmo7CiAJCWlmIChnZXRJZCgpID09IG51bGwpCiAJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRJZCgpLmVxdWFscyhiYXNlLmdldElkKCkpOworCQlpZiAoIWdldElkKCkuZXF1YWxzKGJhc2UuZ2V0SWQoKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpZiAoaXNXb3JraW5nQ29weSgpICE9IGJhc2UuaXNXb3JraW5nQ29weSgpKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKGlzV29ya2luZ0NvcHkoKSAmJiB0aGlzICE9IGJhc2UpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKIAkvKioKQEAgLTM2NywxMSArMzcwLDEyIEBACiAJCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhpbik7CiAJCQlsb2FkKG1lbWVudG8pOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGxvYWQgZnJvbSBmaWxlIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIGZyb20gZmlsZSIsIGUpOwogCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckxvYWRpbmcsIGdldEZpbGUoKS50b1N0cmluZygpKSwgZSkpOwogCQl9IGZpbmFsbHkgewogCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOworCQkJCWlmIChpbiAhPSBudWxsKQorCQkJCQlpbi5jbG9zZSgpOwogCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCQkvLyBpZ25vcmUKIAkJCX0KQEAgLTM5MiwxMSArMzk2LDEyIEBACiAJCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhpbik7CiAJCQlsb2FkKG1lbWVudG8pOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGxvYWQgZnJvbSBwYXRoOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGxvYWQgZnJvbSBwYXRoIiwgZSk7CiAJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTG9hZGluZywgcGF0aC50b1N0cmluZygpKSwgZSkpOwogCQl9IGZpbmFsbHkgewogCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOworCQkJCWlmIChpbiAhPSBudWxsKQorCQkJCQlpbi5jbG9zZSgpOwogCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCQkvLyBpZ25vcmUKIAkJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0NoYWluZWRKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0NoYWluZWRKb2IuamF2YQppbmRleCBkY2U5ZjUyLi5jMWY0NGE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DaGFpbmVkSm9iLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2hhaW5lZEpvYi5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiAJcHJpdmF0ZSBJSm9iQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7CiAKIAkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZGVwZW5kYW50IGpvYi4KKwkgKiBDcmVhdGUgYSBuZXcgZGVwZW5kZW50IGpvYi4KIAkgKiAKIAkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgam9iCiAJICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHB1Ymxpc2ggdG8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0NsaWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2xpZW50LmphdmEKaW5kZXggOGE3MGRiZC4uMjBjYzVjMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2xpZW50LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2xpZW50LmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKIAkJCXRyeSB7CiAJCQkJZGVsZWdhdGUgPSAoQ2xpZW50RGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIGUpOwogCQkJfQogCQl9CiAJCXJldHVybiBkZWxlZ2F0ZTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQl0cnkgewogCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuc3VwcG9ydHMoc2VydmVyLCBsYXVuY2hhYmxlLCBsYXVuY2hNb2RlKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAl9CkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJdHJ5IHsKIAkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmxhdW5jaChzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUsIGxhdW5jaCk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lJbnN0YWxsYWJsZVJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lJbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQppbmRleCAwOTE4YzFjLi45Zjc4YzA0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JSW5zdGFsbGFibGVSdW50aW1lLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlUnVudGltZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMxLDYgKzMxLDEzIEBACiAJcHVibGljIFN0cmluZyBnZXRJZCgpOwogCiAJLyoqCisJICogUHJvdmlkZXMgYSBuYW1lIGZvciB0aGlzIHJ1bnRpbWUuCisJICogCisJICogQHJldHVybiBhIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgogCSAqIERvd25sb2FkcyB0aGUgbGljZW5zZSBmcm9tIHRoZSB1cGRhdGUgc2l0ZS4KIAkgKiAKIAkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTWVtZW50by5qYXZhCmluZGV4IDg5YTY0YzAuLjUxYzFhYWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00MCwxNCArNDAsNiBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNZW1lbnRvIHsKIAkvKioKLQkgKiBTcGVjaWFsIHJlc2VydmVkIGtleSB1c2VkIHRvIHN0b3JlIHRoZSBtZW1lbnRvIGlkIAotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UudWkuaWQiPC9jb2RlPikuCi0JICoKLQkgKiBAc2VlICNnZXRJZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRCA9ICJJTWVtZW50by5pbnRlcm5hbC5pZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgY2hpbGQgb2YgdGhpcyBtZW1lbnRvIHdpdGggdGhlIGdpdmVuIHR5cGUuCiAJICogPHA+CiAJICogVGhlIDxjb2RlPmdldENoaWxkPC9jb2RlPiBhbmQgPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IG1ldGhvZHMKQEAgLTYwLDIzICs1Miw3IEBACiAJICogQHNlZSAjZ2V0Q2hpbGRyZW4KIAkgKi8KIAlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hpbGQgb2YgdGhpcyBtZW1lbnRvIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGlkLgotCSAqIFRoZSBpZCBpcyBzdG9yZWQgaW4gdGhlIGNoaWxkIG1lbWVudG8gKHVzaW5nIGEgc3BlY2lhbCByZXNlcnZlZAotCSAqIGtleSwgPGNvZGU+VEFHX0lEPC9jb2RlPikgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+Z2V0SWQ8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5nZXRDaGlsZDwvY29kZT4gYW5kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBtZXRob2RzCi0JICogYXJlIHVzZWQgdG8gcmV0cmlldmUgY2hpbGRyZW4gb2YgYSBnaXZlbiB0eXBlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCi0JICogQHBhcmFtIGlkIHRoZSBjaGlsZCBpZAotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50byB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBpZAotCSAqIEBzZWUgI2dldElkCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBpZC4KIAkgKgpAQCAtMTAxLDIyICs3Nyw2IEBACiAJICogICBidXQgd2FzIG5vdCBhIGZsb2F0aW5nIHBvaW50IG51bWJlcgogCSAqLwogCXB1YmxpYyBGbG9hdCBnZXRGbG9hdChTdHJpbmcga2V5KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBmb3IgdGhpcyBtZW1lbnRvLgotCSAqCi0JICogQHJldHVybiB0aGUgbWVtZW50byBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBzZWUgI2NyZWF0ZUNoaWxkKGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhpcyBtZW1lbnRvLgotCSAqCi0JICogQHJldHVybiB0aGUgbWVtZW50byBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHNlZSAjY3JlYXRlQ2hpbGQoamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgpAQCAtMTQ0LDE2ICsxMDQsOCBAQAogCSAqICBidXQgd2FzIG5vdCBhIGJvb2xlYW4KIAkgKi8KIAlwdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXkpOwotCQotCXB1YmxpYyBMaXN0IGdldE5hbWVzKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKTsKKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TmFtZXMoKTsKIAkKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBpbnRlZ2VyLgpAQCAtMTcyLDE0ICsxMjQsNiBAQAogCXB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSk7CiAKIAkvKioKLQkgKiBDb3B5IHRoZSBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlbiBmcm9tICA8Y29kZT5tZW1lbnRvPC9jb2RlPgotCSAqIHRvIHRoZSByZWNlaXZlci4KLQkgKgotCSAqIEBwYXJhbSBtZW1lbnRvIHRoZSBJTWVtZW50byB0byBiZSBjb3BpZWQuCi0JICovCi0JcHVibGljIHZvaWQgcHV0TWVtZW50byhJTWVtZW50byBtZW1lbnRvKTsKLQotCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KIAkgKgogCSAqIEBwYXJhbSBrZXkgdGhlIGtleQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZVJlc291cmNlRGVsdGFWaXNpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9kdWxlUmVzb3VyY2VEZWx0YVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlNzMyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9kdWxlUmVzb3VyY2VEZWx0YVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotLyoqCi0gKiBBbiBvYmplY3RzIHRoYXQgdmlzaXRzIG1vZHVsZSByZXNvdXJjZSBkZWx0YXMuCi0gKiA8cD4gCi0gKiBVc2FnZToKLSAqIDxwcmU+Ci0gKiBjbGFzcyBWaXNpdG9yIGltcGxlbWVudHMgSU1vZHVsZVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLSAqICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotICogICAgICAgc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLSAqICAgICAgICAgY2FzZSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0gKiAgICAgICAgICAgICAvLyBoYW5kbGUgYWRkZWQgcmVzb3VyY2UKLSAqICAgICAgICAgICAgIGJyZWFrOwotICogICAgICAgICBjYXNlIElNb2R1bGVSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotICogICAgICAgICAgICAgLy8gaGFuZGxlIHJlbW92ZWQgcmVzb3VyY2UKLSAqICAgICAgICAgICAgIGJyZWFrOwotICogICAgICAgICBjYXNlIElNb2R1bGVSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgotICogICAgICAgICAgICAgLy8gaGFuZGxlIGNoYW5nZWQgcmVzb3VyY2UKLSAqICAgICAgICAgICAgIGJyZWFrOwotICogICAgICAgICB9Ci0gKiAgICAgICByZXR1cm4gdHJ1ZTsKLSAqICAgICB9Ci0gKiB9Ci0gKiBJTW9kdWxlUmVzb3VyY2VEZWx0YSByb290RGVsdGEgPSAuLi47Ci0gKiByb290RGVsdGEuYWNjZXB0KG5ldyBWaXNpdG9yKCkpOwotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqCi0gKiBbaXNzdWU6IEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjYWNjZXB0KElNb2R1bGVSZXNvdXJjZVZpc2l0b3IpXQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JLyoqIAotCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlIGRlbHRhLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YSB0aGUgcmVzb3VyY2UgZGVsdGEKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXNvdXJjZSBkZWx0YSdzIGNoaWxkcmVuIHNob3VsZAotCSAqCQliZSB2aXNpdGVkOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBzaG91bGQgYmUgc2tpcHBlZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIHZpc2l0IGZhaWxzIGZvciBzb21lIHJlYXNvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSW5zdGFsbGFibGVSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQppbmRleCBkZGMyZGFiLi4zYjk3NjhkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQpAQCAtMzIsNiArMzIsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgSW5zdGFsbGFibGVSdW50aW1lIGltcGxlbWVudHMgSUluc3RhbGxhYmxlUnVudGltZSB7CiAJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKKwkKKwlwcml2YXRlIHN0YXRpYyBPYmplY3QgTE9DSyA9IG5ldyBPYmplY3QoKTsKIAogCXB1YmxpYyBJbnN0YWxsYWJsZVJ1bnRpbWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKIAkJc3VwZXIoKTsKQEAgLTUwLDYgKzUyLDEwIEBACiAJCX0KIAl9CiAKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBnZXRQYXRoKCkgKyAiIjsKKwl9CisKIAlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVWZXJzaW9uKCkgewogCQl0cnkgewogCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJmZWF0dXJlVmVyc2lvbiIpOwpAQCAtMTE4LDcgKzEyNCwxMSBAQAogCQlJU2l0ZSBzaXRlID0gSW5zdGFsbGFibGVSdW50aW1lLmdldFNpdGUoZnJvbVNpdGUsIG1vbml0b3IpOwogCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZlYXR1cmVJZC5lcXVhbHMoZmVhdHVyZVJlZnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkgJiYgZmVhdHVyZVZlcnNpb24uZXF1YWxzKGZlYXR1cmVSZWZzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSkpIHsKKwkJCVN0cmluZyB2ZXIgPSBmZWF0dXJlUmVmc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKwkJCWludCBpbmQgPSB2ZXIuaW5kZXhPZigiXyIpOworCQkJaWYgKGluZCA+PSAwKQorCQkJCXZlciA9IHZlci5zdWJzdHJpbmcoaW5kKzEpOworCQkJaWYgKGZlYXR1cmVJZC5lcXVhbHMoZmVhdHVyZVJlZnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkgJiYgZmVhdHVyZVZlcnNpb24uZXF1YWxzKHZlcikpIHsKIAkJCQlJRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZVJlZnNbaV0uZ2V0RmVhdHVyZShtb25pdG9yKTsKIAkJCQlJVVJMRW50cnkgbGljZW5zZSA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpOwogCQkJCWlmIChsaWNlbnNlICE9IG51bGwpCkBAIC0xNzQsNiArMTg0LDIwIEBACiAJCXJldHVybiBudWxsOwogCX0KIAorCXB1YmxpYyBzdGF0aWMgSVNpdGUgZ2V0U2l0ZShVUkwgZnJvbVNpdGVVUkwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXN5bmNocm9uaXplZCAoTE9DSykgeworCQkJCXJldHVybiBTaXRlTWFuYWdlci5nZXRTaXRlKGZyb21TaXRlVVJMLCBtb25pdG9yKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHBhcnNlIHNpdGUiLCBlKTsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHBhcnNlIHNpdGUiLCBlKTsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKIAlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRNaXJyb3IoU3RyaW5nIGZyb21TaXRlLCBJU2l0ZSBzaXRlLCBpbnQgbWlycm9yKSB7CiAJCWlmIChzaXRlICE9IG51bGwpIHsKIAkJCVN0cmluZyBtaXJyb3JTaXRlID0gZ2V0TWlycm9yKHNpdGUsIG1pcnJvcik7CkBAIC0yNjksNyArMjkzLDcgQEAKIAkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHVuemlwcGluZyBydW50aW1lIiwgZSk7CiAJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsCiAJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW5zdGFsbGluZ1NlcnZlciwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKSk7Ci0JCX0gCisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgdW56aXAoSW5wdXRTdHJlYW0gaW4sIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZTIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWIzMWIzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSW5zdGFsbGFibGVSdW50aW1lMi5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwudGFyLlRhckVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC50YXIuVGFySW5wdXRTdHJlYW07CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgSW5zdGFsbGFibGVSdW50aW1lMiBpbXBsZW1lbnRzIElJbnN0YWxsYWJsZVJ1bnRpbWUgeworCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7CisJcHJpdmF0ZSBieXRlW10gQlVGRkVSID0gbnVsbDsKKworCXB1YmxpYyBJbnN0YWxsYWJsZVJ1bnRpbWUyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisJfQorCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQl0cnkgeworCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBnZXRBcmNoaXZlUGF0aCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZVVybCgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYXJjaGl2ZVVybCIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcmNoaXZlUGF0aCgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYXJjaGl2ZVBhdGgiKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGljZW5zZVVSTCgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibGljZW5zZVVybCIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElJbnN0YWxsYWJsZVJ1bnRpbWUjZ2V0TGljZW5zZShJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGljZW5zZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJVVJMIHVybCA9IG51bGw7CisJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIGxpY2Vuc2VVUkwgPSBnZXRMaWNlbnNlVVJMKCk7CisJCQlpZiAobGljZW5zZVVSTCA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQl1cmwgPSBuZXcgVVJMKGxpY2Vuc2VVUkwpOworCQkJSW5wdXRTdHJlYW0gaW4gPSB1cmwub3BlblN0cmVhbSgpOworCQkJb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJY29weShpbiwgb3V0KTsKKwkJCXJldHVybiBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBsb2FkaW5nIGxpY2Vuc2UiLCBlKTsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwKKwkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JJbnN0YWxsaW5nU2VydmVyLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIGUpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJaWYgKG91dCAhPSBudWxsKQorCQkJCQlvdXQuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbGFibGVSdW50aW1lI2luc3RhbGwoSVBhdGgpCisJICovCisJcHVibGljIHZvaWQgaW5zdGFsbChmaW5hbCBJUGF0aCBwYXRoKSB7CisJCUpvYiBpbnN0YWxsUnVudGltZUpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5zdGFsbGluZ1J1bnRpbWUpIHsKKwkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7CisJCQkJcmV0dXJuIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQuZXF1YWxzKGZhbWlseSk7CisJCQl9CisJCQkKKwkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQl0cnkgeworCQkJCQlpbnN0YWxsKHBhdGgsIG1vbml0b3IpOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOworCQkJCX0KKwkJCQkKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0KKwkJfTsKKwkJCisJCWluc3RhbGxSdW50aW1lSm9iLnNjaGVkdWxlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvcHkoSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChCVUZGRVIgPT0gbnVsbCkKKwkJCUJVRkZFUiA9IG5ldyBieXRlWzgxOTJdOworCQlpbnQgciA9IGluLnJlYWQoQlVGRkVSKTsKKwkJd2hpbGUgKHIgPj0gMCkgeworCQkJb3V0LndyaXRlKEJVRkZFUiwgMCwgcik7CisJCQlyID0gaW4ucmVhZChCVUZGRVIpOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElJbnN0YWxsYWJsZVJ1bnRpbWUjaW5zdGFsbChJUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbnN0YWxsKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlVUkwgdXJsID0gbnVsbDsKKwkJRmlsZSB0ZW1wID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXVybCA9IG5ldyBVUkwoZ2V0QXJjaGl2ZVVybCgpKTsKKwkJCXRlbXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJydW50aW1lIiwgIiIpOworCQkJdGVtcC5kZWxldGVPbkV4aXQoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGNyZWF0aW5nIHVybCBhbmQgdGVtcCBmaWxlIiwgZSk7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsCisJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JJbnN0YWxsaW5nU2VydmVyLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIGUpKTsKKwkJfQorCQlTdHJpbmcgbmFtZSA9IHVybC5nZXRQYXRoKCk7CisJCQorCQkvLyBkb3dubG9hZAorCQlGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBudWxsOworCQl0cnkgeworCQkJSW5wdXRTdHJlYW0gaW4gPSB1cmwub3BlblN0cmVhbSgpOworCQkJZm91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXApOworCQkJY29weShpbiwgZm91dCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgZG93bmxvYWRpbmcgcnVudGltZSIsIGUpOworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW5zdGFsbGluZ1NlcnZlciwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChmb3V0ICE9IG51bGwpCisJCQkJCWZvdXQuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCQkKKwkJRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZW1wKTsKKwkJCWlmIChuYW1lLmVuZHNXaXRoKCJ6aXAiKSkKKwkJCQl1bnppcChpbiwgcGF0aCwgbW9uaXRvcik7CisJCQllbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJ0YXIiKSkKKwkJCQl1bnRhcihpbiwgcGF0aCwgbW9uaXRvcik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB1bmNvbXByZXNzaW5nIHJ1bnRpbWUiLCBlKTsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwKKwkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckluc3RhbGxpbmdTZXJ2ZXIsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwgZSkpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlpZiAoaW4gIT0gbnVsbCkKKwkJCQkJaW4uY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFVuemlwIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgZ2l2ZW4gcGF0aC4KKwkgKiAKKwkgKiBAcGFyYW0gaW4KKwkgKiBAcGFyYW0gcGF0aAorCSAqIEBwYXJhbSBtb25pdG9yCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCB1bnppcChJbnB1dFN0cmVhbSBpbiwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgYXJjaGl2ZVBhdGggPSBnZXRBcmNoaXZlUGF0aCgpOworCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluKTsKKwkJWmlwSW5wdXRTdHJlYW0gemluID0gbmV3IFppcElucHV0U3RyZWFtKGJpbik7CisJCVppcEVudHJ5IGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpOworCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgeworCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisJCQltb25pdG9yLnNldFRhc2tOYW1lKCJVbnppcHBpbmc6ICIgKyBuYW1lKTsKKwkJCWlmIChhcmNoaXZlUGF0aCAhPSBudWxsICYmIG5hbWUuc3RhcnRzV2l0aChhcmNoaXZlUGF0aCkpIHsKKwkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoYXJjaGl2ZVBhdGgubGVuZ3RoKCkpOworCQkJCWlmIChuYW1lLmxlbmd0aCgpID4gMSkKKwkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOworCQkJfQorCQkJCisJCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7CisJCQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpCisJCQkJCXBhdGguYXBwZW5kKG5hbWUpLnRvRmlsZSgpLm1rZGlycygpOworCQkJCWVsc2UgeworCQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoLmFwcGVuZChuYW1lKS50b0ZpbGUoKSk7CisJCQkJCWNvcHkoemluLCBmb3V0KTsKKwkJCQkJZm91dC5jbG9zZSgpOworCQkJCX0KKwkJCX0KKwkJCXppbi5jbG9zZUVudHJ5KCk7CisJCQllbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKTsKKwkJfQorCQl6aW4uY2xvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBVbnRhciB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIGdpdmVuIHBhdGguCisJICogCisJICogQHBhcmFtIGluCisJICogQHBhcmFtIHBhdGgKKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1bnRhcihJbnB1dFN0cmVhbSBpbiwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgYXJjaGl2ZVBhdGggPSBnZXRBcmNoaXZlUGF0aCgpOworCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluKTsKKwkJVGFySW5wdXRTdHJlYW0gemluID0gbmV3IFRhcklucHV0U3RyZWFtKGJpbik7CisJCVRhckVudHJ5IGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpOworCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgeworCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisJCQltb25pdG9yLnNldFRhc2tOYW1lKCJVbnRhcnJpbmc6ICIgKyBuYW1lKTsKKwkJCWlmIChhcmNoaXZlUGF0aCAhPSBudWxsICYmIG5hbWUuc3RhcnRzV2l0aChhcmNoaXZlUGF0aCkpIHsKKwkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoYXJjaGl2ZVBhdGgubGVuZ3RoKCkpOworCQkJCWlmIChuYW1lLmxlbmd0aCgpID4gMSkKKwkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOworCQkJfQorCQkJCisJCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7CisJCQkJaWYgKGVudHJ5LmdldEZpbGVUeXBlKCkgPT0gVGFyRW50cnkuRElSRUNUT1JZKQorCQkJCQlwYXRoLmFwcGVuZChuYW1lKS50b0ZpbGUoKS5ta2RpcnMoKTsKKwkJCQllbHNlIHsKKwkJCQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aC5hcHBlbmQobmFtZSkudG9GaWxlKCkpOworCQkJCQljb3B5KHppbiwgZm91dCk7CisJCQkJCWZvdXQuY2xvc2UoKTsKKwkJCQl9CisJCQl9CisJCQl6aW4uY2xvc2UoKTsKKwkJCWVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpOworCQl9CisJCXppbi5jbG9zZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiSW5zdGFsbGFibGVSdW50aW1lMlsiICsgZ2V0SWQoKSArICJdIjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSW5zdGFsbGFibGVTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlU2VydmVyLmphdmEKaW5kZXggNWE5ZTE2OS4uZmQ5M2E3ZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSW5zdGFsbGFibGVTZXJ2ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVNlcnZlci5qYXZhCkBAIC0xMzQsNyArMTM0LDExIEBACiAJCUlTaXRlIHNpdGUgPSBJbnN0YWxsYWJsZVJ1bnRpbWUuZ2V0U2l0ZShmcm9tU2l0ZSwgbW9uaXRvcik7CiAJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWZzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZUlkLmVxdWFscyhmZWF0dXJlUmVmc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSAmJiBmZWF0dXJlVmVyc2lvbi5lcXVhbHMoZmVhdHVyZVJlZnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpKSkgeworCQkJU3RyaW5nIHZlciA9IGZlYXR1cmVSZWZzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQkJaW50IGluZCA9IHZlci5pbmRleE9mKCJfIik7CisJCQlpZiAoaW5kID49IDApCisJCQkJdmVyID0gdmVyLnN1YnN0cmluZyhpbmQrMSk7CisJCQlpZiAoZmVhdHVyZUlkLmVxdWFscyhmZWF0dXJlUmVmc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSAmJiBmZWF0dXJlVmVyc2lvbi5lcXVhbHModmVyKSkgewogCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlUmVmc1tpXS5nZXRGZWF0dXJlKG1vbml0b3IpOwogCQkJCUlVUkxFbnRyeSBsaWNlbnNlID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7CiAJCQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCkKQEAgLTE2Niw3ICsxNzAsMTEgQEAKIAkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewogCQkJCWlmIChmZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhmZWF0dXJlSWQpKSB7Ci0JCQkJCVZlcnNpb24gbmV4dENhbmQgPSBuZXcgVmVyc2lvbihmZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOworCQkJCQlTdHJpbmcgdmVyID0gZmVhdHVyZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisJCQkJCWludCBpbmQgPSB2ZXIuaW5kZXhPZigiXyIpOworCQkJCQlpZiAoaW5kID49IDApCisJCQkJCQl2ZXIgPSB2ZXIuc3Vic3RyaW5nKGluZCsxKTsKKwkJCQkJVmVyc2lvbiBuZXh0Q2FuZCA9IG5ldyBWZXJzaW9uKHZlcik7CiAJCQkJCWlmIChuZXh0Q2FuZC5jb21wYXJlVG8obGF0ZXN0VmVyc2lvbikgPj0gMCkgewogCQkJCQkJbGF0ZXN0VmVyc2lvbiA9IG5leHRDYW5kOwogCQkJCQkJbGFzdCA9IGZlYXR1cmVzW2ldOwpAQCAtMjMzLDcgKzI0MSwxMSBAQAogCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKGZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGZlYXR1cmVJZCkpIHsKLQkJCQkJVmVyc2lvbiBuZXh0Q2FuZCA9IG5ldyBWZXJzaW9uKGZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7CisJCQkJCVN0cmluZyB2ZXIgPSBmZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKwkJCQkJaW50IGluZCA9IHZlci5pbmRleE9mKCJfIik7CisJCQkJCWlmIChpbmQgPj0gMCkKKwkJCQkJCXZlciA9IHZlci5zdWJzdHJpbmcoaW5kKzEpOworCQkJCQlWZXJzaW9uIG5leHRDYW5kID0gbmV3IFZlcnNpb24odmVyKTsKIAkJCQkJaWYgKG5leHRDYW5kLmNvbXBhcmVUbyhsYXRlc3RWZXJzaW9uKSA+IDApIHsKIAkJCQkJCWxhdGVzdFZlcnNpb24gPSBuZXh0Q2FuZDsKIAkJCQkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTGF1bmNoYWJsZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0xhdW5jaGFibGVBZGFwdGVyLmphdmEKaW5kZXggMGNiMDM5Mi4uZjExODg2NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTGF1bmNoYWJsZUFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9MYXVuY2hhYmxlQWRhcHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM2LDE4ICszNiwzMSBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgTGF1bmNoYWJsZUFkYXB0ZXIuCiAJICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcmV0dXJuIGFuIGlkCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKIAkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwogCX0KIAorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlbGF0aXZlIHByaW9yaXR5IG9mIHRoaXMgYWRhcHRlci4KKwkgKgorCSAqIEByZXR1cm4gYSBwcmlvcml0eQorCSAqLworCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgicHJpb3JpdHkiKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwogCXB1YmxpYyBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIGdldERlbGVnYXRlKCkgewogCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewogCQkJdHJ5IHsKIAkJCQlkZWxlZ2F0ZSA9IChMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CiAJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUiICsgdG9TdHJpbmcoKSArICI6ICIgKyB0LmdldE1lc3NhZ2UoKSk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpLCB0KTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gZGVsZWdhdGU7CkBAIC02Miw3ICs3NSw3IEBACiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKIAkJCXRocm93IGNlOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKIAkJCXJldHVybiBudWxsOwogCQl9CiAJfQpAQCAtNzAsNyArODMsNyBAQAogCS8qKgogCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KIAkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcmV0dXJuIGEgc3RyaW5nCiAJICovCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuICJMYXVuY2hhYmxlQWRhcHRlclsiICsgZ2V0SWQoKSArICJdIjsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmluZGV4IGIzNmU0OTUuLmJjMzhkNDcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpAQCAtMzksNyArMzksNiBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaE5vUnVudGltZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hOb0NvbmZpZ3VyYXRpb247CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb0NvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ1N0YXR1c09rOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdTdGF0dXNJbmZvOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdTdGF0dXNXYXJuaW5nOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdTdGF0dXNFcnJvcjsKQEAgLTQ5LDYgKzQ4LDggQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoZWRNb2R1bGU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTdGFydFRpbWVvdXQ7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTdGFydEZhaWxlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0b3BGYWlsZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZXN0YXJ0RmFpbGVkOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTW9kdWxlUmVzdGFydEZhaWxlZDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckluc3RhbGxpbmdTZXJ2ZXI7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnN0YWxsaW5nU2VydmVyRmVhdHVyZTsKQEAgLTU5LDExICs2MCwxMSBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3RvcEFscmVhZHlTdG9wcGVkOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZHVsZVR5cGVVbmtub3duOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYlN0YXJ0aW5nU2VydmVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYlN0b3BwaW5nU2VydmVyOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYlJlc3RhcnRpbmdTZXJ2ZXI7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgam9iVXBkYXRlU2VydmVyOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYkluc3RhbGxpbmdSdW50aW1lOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTWlzc2luZ0FkYXB0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViUmVzb3VyY2U7CiAJCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3B5aW5nRmlsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlbGV0aW5nOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggY2QxZWVhNC4uOGY5NmMyZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDcgKzE3LDYgQEAKIHRhc2tNb2RpZnlNb2R1bGVzPUFkZGluZyBhbmQvb3IgcmVtb3ZpbmcgcHJvamVjdHMuCiAKIHB1Ymxpc2hpbmc9UHVibGlzaGluZyB0byB7MH0uLi4KLXB1Ymxpc2hpbmdTdGF0dXNPaz1QdWJsaXNoaW5nIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQogcHVibGlzaGluZ1N0YXR1c0luZm89UHVibGlzaGluZyBjb21wbGV0ZWQgd2l0aCBpbmZvcm1hdGlvbgogcHVibGlzaGluZ1N0YXR1c1dhcm5pbmc9UHVibGlzaGluZyBjb21wbGV0ZWQgd2l0aCBhIHdhcm5pbmcKIHB1Ymxpc2hpbmdTdGF0dXNFcnJvcj1QdWJsaXNoaW5nIGZhaWxlZApAQCAtMjYsMTUgKzI1LDE0IEBACiBwdWJsaXNoaW5nTW9kdWxlPVB1Ymxpc2hpbmc6IHswfQogcHVibGlzaGVkTW9kdWxlPXswfSBwdWJsaXNoZWQgc3VjY2Vzc2Z1bGx5CiAKLWpvYlN0YXJ0aW5nU2VydmVyPVN0YXJ0aW5nIHNlcnZlciAtIHswfQotam9iUmVzdGFydGluZ1NlcnZlcj1SZXN0YXJ0aW5nIHNlcnZlciAtIHswfQoram9iU3RhcnRpbmdTZXJ2ZXI9U3RhcnRpbmcgezB9Citqb2JTdG9wcGluZ1NlcnZlcj1TdG9wcGluZyB7MH0KK2pvYlJlc3RhcnRpbmdTZXJ2ZXI9UmVzdGFydGluZyB7MH0KIGpvYlVwZGF0ZVNlcnZlcj1VcGRhdGluZyBzdGF0dXMgZm9yIHswfS4uLgotam9iSW5zdGFsbGluZ1J1bnRpbWU9SW5zdGFsbGluZyBzZXJ2ZXIgcnVudGltZQoram9iSW5zdGFsbGluZ1J1bnRpbWU9SW5zdGFsbGluZyBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudAogCiAjIC0tLS0tLS0tLS0tLS0tLSBNaXNjIFVJIC0tLS0tLS0tLS0tLS0tLQogCi13ZWJSZXNvdXJjZT1XZWIgcmVzb3VyY2UKLQogIyBFcnJvciBNZXNzYWdlcwogZXJyb3JQdWJsaXNoaW5nPUNvdWxkIG5vdCBwdWJsaXNoIHRvIHRoZSBzZXJ2ZXIuCiBlcnJvck5vQ29uZmlndXJhdGlvbj1UaGUgc2VydmVyIGhhcyBubyBjb25maWd1cmF0aW9uLgpAQCAtNDIsMTAgKzQwLDEyIEBACiBlcnJvclNhdmluZz1Db3VsZCBub3Qgc2F2ZSB0byB7MH0uCiBlcnJvck1vZHVsZVJlc3RhcnRGYWlsZWQ9Q291bGQgbm90IHJlc3RhcnQgdGhlIG1vZHVsZS4KIGVycm9yV29ya2luZ0NvcHlUaW1lc3RhbXA9Q291bGQgbm90IHNhdmUgYmVjYXVzZSB0aGUgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgc3RhcnQgb2YgZWRpdGluZy4KLWVycm9yUnVudGltZU5hbWU9RW50ZXIgYSBuYW1lIGZvciB0aGUgcnVudGltZS4KLWVycm9yRHVwbGljYXRlUnVudGltZU5hbWU9TmFtZSBpcyBhbHJlYWR5IGluIHVzZS4KLWVycm9yU3RhcnRUaW1lb3V0PVRpbWVvdXQgd2FpdGluZyBmb3IgezB9IHRvIHN0YXJ0LiBTZXJ2ZXIgZGlkIG5vdCBzdGFydCBhZnRlciB7MX1zLiAKK2Vycm9yUnVudGltZU5hbWU9RW50ZXIgYSBuYW1lIGZvciB0aGUgcnVudGltZSBlbnZpcm9ubWVudC4KK2Vycm9yRHVwbGljYXRlUnVudGltZU5hbWU9VGhlIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuIFNwZWNpZnkgYSBkaWZmZXJlbnQgbmFtZS4KK2Vycm9yU3RhcnRUaW1lb3V0PVNlcnZlciB7MH0gd2FzIHVuYWJsZSB0byBzdGFydCB3aXRoaW4gezF9IHNlY29uZHMuIElmIHRoZSBzZXJ2ZXIgcmVxdWlyZXMgbW9yZSB0aW1lLCB0cnkgaW5jcmVhc2luZyB0aGUgdGltZW91dCBpbiB0aGUgc2VydmVyIGVkaXRvci4KIGVycm9yU3RhcnRGYWlsZWQ9U2VydmVyIHswfSBmYWlsZWQgdG8gc3RhcnQuCitlcnJvclN0b3BGYWlsZWQ9U2VydmVyIHswfSBmYWlsZWQgdG8gc3RvcC4KK2Vycm9yUmVzdGFydEZhaWxlZD1TZXJ2ZXIgezB9IGZhaWxlZCB0byByZXN0YXJ0LgogZXJyb3JDYW5ub3RBZGRNb2R1bGU9VGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHZlcnNpb24gezF9IG9mIHRoZSB7MH0gc3BlY2lmaWNhdGlvbi4KIGVycm9ySW5zdGFsbGluZ1NlcnZlcj1FcnJvciBvY2N1cnJlZCBpbnN0YWxsaW5nIHNlcnZlcjogezB9CiBlcnJvckluc3RhbGxpbmdTZXJ2ZXJGZWF0dXJlPUNvdWxkIG5vdCBkb3dubG9hZCBhbmQgaW5zdGFsbCB1cGRhdGUgZmVhdHVyZS4KQEAgLTY1LDEzICs2NSwxMyBAQAogZGVmYXVsdFZlcnNpb249Tm9uZQogbW9kdWxlVHlwZVVua25vd249VW5rbm93biBtb2R1bGUKIAotY2FuU3RhcnRFcnJvclN0YXRlPVRoZSBzZXJ2ZXIgY2Fubm90IGJlIHN0YXJ0ZWQgYmVjYXVzZSBpdCBpcyBjdXJyZW50IHN0YXJ0aW5nIG9yIHN0b3BwaW5nLgorY2FuU3RhcnRFcnJvclN0YXRlPVRoZSBzZXJ2ZXIgY2Fubm90IHN0YXJ0IGJlY2F1c2UgaXQgaXMgY3VycmVudGx5IHN0YXJ0aW5nIG9yIHN0b3BwaW5nLiBXYWl0IGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24gdG8gY29tcGxldGUuCiBlcnJvckxhdW5jaE1vZGU9VGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBnaXZlbiBsYXVuY2ggbW9kZS4KIGVycm9yUmVzdGFydE5vdFN0YXJ0ZWQ9Q2Fubm90IHJlc3RhcnQgdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgcnVubmluZy4KIGVycm9yUHVibGlzaFN0YXJ0aW5nPUNhbm5vdCBwdWJsaXNoIHRvIHRoZSBzZXJ2ZXIgYmVjYXVzZSBpdCBpcyBjdXJyZW50bHkgc3RhcnRpbmcgb3Igc3RvcHBpbmcuCi1lcnJvclB1Ymxpc2hOb1J1bnRpbWU9Q2Fubm90IHB1Ymxpc2ggdG8gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIG1pc3NpbmcgaXRzIHJ1bnRpbWUuCitlcnJvclB1Ymxpc2hOb1J1bnRpbWU9Q2Fubm90IHB1Ymxpc2ggdG8gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIG1pc3NpbmcgaXRzIHJ1bnRpbWUgZW52aXJvbm1lbnQuCiBlcnJvclB1Ymxpc2hOb0NvbmZpZ3VyYXRpb249Q2Fubm90IHB1Ymxpc2ggdG8gdGhlIHNlcnZlciBiZWNhdXNlIHRoZSBjb25maWd1cmF0aW9uIGlzIG1pc3NpbmcuCi1lcnJvclN0b3BBbHJlYWR5U3RvcHBlZD1UaGUgc2VydmVyIGNhbm5vdCBiZSBzdG9wcGVkIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzdG9wcGVkLgorZXJyb3JTdG9wQWxyZWFkeVN0b3BwZWQ9VGhlIHNlcnZlciBjYW5ub3QgYmUgc3RvcHBlZCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgc3RvcHBlZCBvciBzdG9wcGluZy4KIGVycm9yUmVzdGFydE1vZHVsZT1UaGUgbW9kdWxlIGNhbm5vdCBiZSByZXN0YXJ0ZWQuCiBlcnJvck1pc3NpbmdBZGFwdGVyPUNvdWxkIG5vdCBsb2FkIHNlcnZlciBhZGFwdGVyLiBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlLgogCkBAIC04NSw1ICs4NSw1IEBACiBlcnJvclJlbmFtZT1Db3VsZCBub3QgcmVwbGFjZSB3aXRoIHRlbXAgZmlsZSB7MH0uCiBlcnJvck5vdEFEaXJlY3Rvcnk9Q291bGQgbm90IGRlbGV0ZSB7MH0gc2luY2UgaXQgaXMgbm90IGEgZGlyZWN0b3J5LgogCi1lcnJvck5vUnVudGltZT1DYW5ub3QgdmVyaWZ5IGZhY2V0cyBiZWNhdXNlIHRoZXJlIGlzIG5vIHJ1bnRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuCitlcnJvck5vUnVudGltZT1DYW5ub3QgdmVyaWZ5IGZhY2V0cyBiZWNhdXNlIHRoZXJlIGlzIG5vIHJ1bnRpbWUgZW52aXJvbm1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuCiBlcnJvckZhY2V0PVByb2plY3QgZmFjZXQgezB9IHZlcnNpb24gezF9IGlzIG5vdCBzdXBwb3J0ZWQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGUuamF2YQppbmRleCBjNzZjYTA4Li4wMjFmZjk3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGUuamF2YQpAQCAtMTE3LDcgKzExNyw3IEBACiAJCQkJCWRlbGVnYXRlLmluaXRpYWxpemUodGhpcyk7CiAJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiTW9kdWxlLmdldERlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiICIgKyBmYWN0b3J5LmdldElkKCkpOwogCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgdCk7CiAJCQkJfQogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVBcnRpZmFjdEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUFydGlmYWN0QWRhcHRlci5qYXZhCmluZGV4IGE4MjhlNDkuLjFjZDM5ZTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUFydGlmYWN0QWRhcHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUFydGlmYWN0QWRhcHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM4LDcgKzM4LDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIE1vZHVsZUFydGlmYWN0QWRhcHRlci4KIAkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZworCSAqIEByZXR1cm4gYW4gaWQKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldElkKCkgewogCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7CkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJCXRyeSB7CiAJCQkJZGVsZWdhdGUgPSAoTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKIAkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpICsgIjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIHQpOwogCQkJfQogCQl9CiAJCXJldHVybiBkZWxlZ2F0ZTsKQEAgLTE4OCw3ICsxODgsNyBAQAogCS8qKgogCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KIAkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcmV0dXJuIGEgc3RyaW5nCiAJICovCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuICJNb2R1bGVBcnRpZmFjdEFkYXB0ZXJbIiArIGdldElkKCkgKyAiXSI7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGYWN0b3J5LmphdmEKaW5kZXggNTljZTcwOC4uMGUwNzc5MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZhY3RvcnkuamF2YQpAQCAtMjcsNyArMjcsNyBAQAogcHVibGljIGNsYXNzIE1vZHVsZUZhY3RvcnkgaW1wbGVtZW50cyBJT3JkZXJlZCB7CiAJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKIAlwdWJsaWMgTW9kdWxlRmFjdG9yeURlbGVnYXRlIGRlbGVnYXRlOwotCXByaXZhdGUgTGlzdCBtb2R1bGVUeXBlczsKKwlwcml2YXRlIExpc3Q8SU1vZHVsZVR5cGU+IG1vZHVsZVR5cGVzOwogCiAJLyoqCiAJICogTW9kdWxlRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgpAQCAtOTUsNyArOTUsNyBAQAogCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZU1vZHVsZUZhY3RvcnlEZWxlZ2F0ZShkZWxlZ2F0ZSwgdGhpcywgbW9uaXRvcik7CiAJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJNb2R1bGVGYWN0b3J5LmdldERlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0SWQoKSk7CiAJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgdC5nZXRNZXNzYWdlKCkpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwogCQkJfQogCQl9CiAJCXJldHVybiBkZWxlZ2F0ZTsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQkJcmV0dXJuIG1vZHVsZXM7CiAJCQogCQlnZXRNb2R1bGVUeXBlcygpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKIAkJCiAJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEKaW5kZXggNGYwYjZjZC4uY2IxM2Q5MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmlsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZpbGUuamF2YQpAQCAtMTQsMTI2ICsxNCwyNiBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKIC8qKgotICogCisgKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRmlsZSBpbnN0ZWFkCiAgKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVGaWxlIGltcGxlbWVudHMgSU1vZHVsZUZpbGUgewotCXByb3RlY3RlZCBJRmlsZSBmaWxlOwotCXByb3RlY3RlZCBGaWxlIGZpbGUyOwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgSVBhdGggcGF0aDsKLQlwcm90ZWN0ZWQgbG9uZyBzdGFtcCA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdvcmtzcGFjZSBtb2R1bGUgZmlsZSB3aXRoIHRoZSBjdXJyZW50IG1vZGlmaWNhdGlvbiBzdGFtcC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KK3B1YmxpYyBjbGFzcyBNb2R1bGVGaWxlIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRmlsZSB7CiAJcHVibGljIE1vZHVsZUZpbGUoSUZpbGUgZmlsZSwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgpIHsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCXN0YW1wID0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICsgZmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpOworCQlzdXBlcihmaWxlLCBuYW1lLCBwYXRoKTsKIAl9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVybmFsIG1vZHVsZSBmaWxlIHdpdGggdGhlIGN1cnJlbnQgbW9kaWZpY2F0aW9uIHN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqLworCXB1YmxpYyBNb2R1bGVGaWxlKFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoLCBsb25nIHN0YW1wKSB7CisJCXN1cGVyKG5hbWUsIHBhdGgsIHN0YW1wKTsKKwl9CisKIAlwdWJsaWMgTW9kdWxlRmlsZShGaWxlIGZpbGUsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoKSB7Ci0JCXRoaXMuZmlsZTIgPSBmaWxlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJc3RhbXAgPSBmaWxlMi5sYXN0TW9kaWZpZWQoKTsKKwkJc3VwZXIoZmlsZSwgbmFtZSwgcGF0aCk7CiAJfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdvcmtzcGFjZSBtb2R1bGUgZmlsZSB3aXRoIGEgc3BlY2lmaWMgbW9kaWZpY2F0aW9uIHN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBzdGFtcAotCSAqIEBkZXByZWNhdGVkIHVzZSBvbmUgb2YgdGhlIHRvcCB0d28gY29uc3RydWN0b3JzIGluc3RlYWQKKwkvKgorCSAqIEBkZXByZWNhdGVkIHVzZSBhbm90aGVyIGNvbnN0cnVjdG9yCiAJICovCiAJcHVibGljIE1vZHVsZUZpbGUoSUZpbGUgZmlsZSwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgsIGxvbmcgc3RhbXApIHsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5zdGFtcCA9IHN0YW1wOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtb2R1bGUgZmlsZSB3aXRoIGEgc3BlY2lmaWMgbW9kaWZpY2F0aW9uIHN0YW1wIGFuZCBubwotCSAqIGZpbGUgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gc3RhbXAKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZShTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCwgbG9uZyBzdGFtcCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLnN0YW1wID0gc3RhbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlI2dldE1vZGlmaWNhdGlvblN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJcmV0dXJuIHN0YW1wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJTW9kdWxlRmlsZSBtZiA9IChJTW9kdWxlRmlsZSkgb2JqOwotCQlpZiAoIW5hbWUuZXF1YWxzKG1mLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghcGF0aC5lcXVhbHMobWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpICogMzcgKyBwYXRoLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGNsKSB7Ci0JCWlmIChJRmlsZS5jbGFzcy5lcXVhbHMoY2wpKQotCQkJcmV0dXJuIGZpbGU7Ci0JCWlmIChGaWxlLmNsYXNzLmVxdWFscyhjbCkpCi0JCQlyZXR1cm4gZmlsZTI7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlRmlsZSBbIiArIG5hbWUgKyAiLCAiICsgcGF0aCArICIsICIgKyBzdGFtcCArICJdIjsKKwkJc3VwZXIoZmlsZSwgbmFtZSwgcGF0aCwgc3RhbXApOwogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZvbGRlci5qYXZhCmluZGV4IGU0NjM4NTUuLmVkZjdhZjcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZvbGRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZvbGRlci5qYXZhCkBAIC0xMSwxMDIgKzExLDEyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKIC8qKgotICogCisgKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRm9sZGVyIGluc3RlYWQKICAqLwotcHVibGljIGNsYXNzIE1vZHVsZUZvbGRlciBpbXBsZW1lbnRzIElNb2R1bGVGb2xkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNb2R1bGVSZXNvdXJjZVtdIEVNUFRZX1JFU09VUkNFX0FSUkFZID0gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBjb250YWluZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBJUGF0aCBwYXRoOwotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdvcmtzcGFjZSBtb2R1bGUgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBwYXRoCi0JICovCitwdWJsaWMgY2xhc3MgTW9kdWxlRm9sZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRm9sZGVyIHsKIAlwdWJsaWMgTW9kdWxlRm9sZGVyKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgewotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd29ya3NwYWNlIG1vZHVsZSBmb2xkZXIgd2l0aCBubyBmb2xkZXIgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRm9sZGVyKFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVtYmVycyAoY29udGVudHMpIG9mIHRoaXMgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBtZW1iZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVtYmVycyhJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKSB7Ci0JCXRoaXMubWVtYmVycyA9IG1lbWJlcnM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZSNnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlciNtZW1iZXJzKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpIHsKLQkJaWYgKG1lbWJlcnMgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9SRVNPVVJDRV9BUlJBWTsKLQkJcmV0dXJuIG1lbWJlcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNb2R1bGVGb2xkZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJTW9kdWxlRm9sZGVyIG1mID0gKE1vZHVsZUZvbGRlcikgb2JqOwotCQlpZiAoIW5hbWUuZXF1YWxzKG1mLm5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIXBhdGguZXF1YWxzKG1mLnBhdGgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpICogMzcgKyBwYXRoLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGNsKSB7Ci0JCWlmIChJQ29udGFpbmVyLmNsYXNzLmVxdWFscyhjbCkgfHwgSUZvbGRlci5jbGFzcy5lcXVhbHMoY2wpKQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVGb2xkZXIgWyIgKyBuYW1lICsgIiwgIiArIHBhdGggKyAiXSI7CisJCXN1cGVyKGNvbnRhaW5lciwgbmFtZSwgcGF0aCk7CiAJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVByb3BlcnRpZXMuamF2YQppbmRleCBhNjI4ZjQ3Li5hYzAyNzlhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQcm9wZXJ0aWVzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUHJvcGVydGllcy5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9EQVRBX0ZJTEUgPSAibW9kdWxlcy54bWwiOwogCiAJcHJvdGVjdGVkIHN0YXRpYyBNb2R1bGVQcm9wZXJ0aWVzIGluc3RhbmNlOwotCXByb3RlY3RlZCBNYXAgbW9kdWxlczsKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBtb2R1bGVzOwogCiAJLyoqCiAJICogTW9kdWxlUHJvcGVydGllcyBjb25zdHJ1Y3Rvci4KQEAgLTUzLDcgKzUzLDcgQEAKIAlwcml2YXRlIHZvaWQgbG9hZCgpIHsKIAkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBtb2R1bGUgaW5mbyIpOwogCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKE1PRFVMRV9EQVRBX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkJbW9kdWxlcyA9IG5ldyBIYXNoTWFwKCk7CisJCW1vZHVsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKIAkJaWYgKCEobmV3IEZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKSkKIAkJCXJldHVybjsKIAkJCkBAIC02OSw3ICs2OSw3IEBACiAJCQkJbW9kdWxlcy5wdXQobW9kdWxlSWQsIHNlcnZlcklkKTsKIAkJCX0KIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBzZXJ2ZXJzOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHNlcnZlcnMiLCBlKTsKIAkJfQogCX0KIApAQCAtODIsNyArODIsNyBAQAogCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVzLmtleVNldCgpLml0ZXJhdG9yKCk7CiAJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CiAJCQkJU3RyaW5nIG1vZHVsZUlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZyBzZXJ2ZXJJZCA9IChTdHJpbmcpIG1vZHVsZXMuZ2V0KG1vZHVsZUlkKTsKKwkJCQlTdHJpbmcgc2VydmVySWQgPSBtb2R1bGVzLmdldChtb2R1bGVJZCk7CiAJCQkJCiAJCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtb2R1bGUiKTsKIAkJCQljaGlsZC5wdXRTdHJpbmcoIm1vZHVsZUlkIiwgbW9kdWxlSWQpOwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJCWlmIChtb2R1bGUgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IChTdHJpbmcpIG1vZHVsZXMuZ2V0KG1vZHVsZS5nZXRJZCgpKTsKKwkJU3RyaW5nIHNlcnZlcklkID0gbW9kdWxlcy5nZXQobW9kdWxlLmdldElkKCkpOwogCQlpZiAoc2VydmVySWQgPT0gbnVsbCB8fCBzZXJ2ZXJJZC5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuIG51bGw7CiAJCQpAQCAtMTIwLDcgKzEyMCw3IEBACiAJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKIAkJCW5ld1NlcnZlcklkID0gc2VydmVyLmdldElkKCk7CiAJCQotCQlTdHJpbmcgc2VydmVySWQgPSAoU3RyaW5nKSBtb2R1bGVzLmdldChtb2R1bGUuZ2V0SWQoKSk7CisJCVN0cmluZyBzZXJ2ZXJJZCA9IG1vZHVsZXMuZ2V0KG1vZHVsZS5nZXRJZCgpKTsKIAkJaWYgKHNlcnZlcklkID09IG51bGwgJiYgbmV3U2VydmVySWQgPT0gbnVsbCkKIAkJCXJldHVybjsKIAkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgc2VydmVySWQuZXF1YWxzKG5ld1NlcnZlcklkKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVB1Ymxpc2hJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQdWJsaXNoSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYzg3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQdWJsaXNoSW5mby5qYXZhCkBAIC0wLDAgKzEsNDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Nb2R1bGVGb2xkZXI7CisvKioKKyAqIFB1Ymxpc2ggaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgbW9kdWxlIG9uIGEgc3BlY2lmaWMgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgTW9kdWxlUHVibGlzaEluZm8geworCXByaXZhdGUgc3RhdGljIGZpbmFsIElNb2R1bGVSZXNvdXJjZVtdIEVNUFRZX01PRFVMRV9SRVNPVVJDRSA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBFTVBUWV9NT0RVTEVfUkVTT1VSQ0VfREVMVEEgPSBuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbMF07CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9JRCA9ICJtb2R1bGUtaWRzIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1RZUEVfSUQgPSAibW9kdWxlLXR5cGUtaWQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVFlQRV9WRVJTSU9OID0gIm1vZHVsZS10eXBlLXZlcnNpb24iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFNUCA9ICJzdGFtcCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEUgPSAiZmlsZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUiA9ICJmb2xkZXIiOworCisJcHJpdmF0ZSBTdHJpbmcgbW9kdWxlSWQ7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcyA9IEVNUFRZX01PRFVMRV9SRVNPVVJDRTsKKwlwcml2YXRlIElNb2R1bGVUeXBlIG1vZHVsZVR5cGU7CisKKwlwcml2YXRlIGJvb2xlYW4gdXNlQ2FjaGU7CisJcHJpdmF0ZSBJTW9kdWxlUmVzb3VyY2VbXSBjdXJyZW50UmVzb3VyY2VzID0gbnVsbDsKKwlwcml2YXRlIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBudWxsOworCXByaXZhdGUgYm9vbGVhbiBoYXNEZWx0YTsKKworCS8qKgorCSAqIE1vZHVsZVB1Ymxpc2hJbmZvIGNvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBtb2R1bGVJZCBhIG1vZHVsZSBpZAorCSAqIEBwYXJhbSBuYW1lIHRoZSBtb2R1bGUncyBuYW1lCisJICogQHBhcmFtIG1vZHVsZVR5cGUgdGhlIG1vZHVsZSB0eXBlCisJICovCisJcHVibGljIE1vZHVsZVB1Ymxpc2hJbmZvKFN0cmluZyBtb2R1bGVJZCwgU3RyaW5nIG5hbWUsIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUpIHsKKwkJc3VwZXIoKTsKKworCQl0aGlzLm1vZHVsZUlkID0gbW9kdWxlSWQ7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubW9kdWxlVHlwZSA9IG1vZHVsZVR5cGU7CisJfQorCisJLyoqCisJICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIG1lbWVudG8gYSBtZW1lbnRvCisJICovCisJcHVibGljIE1vZHVsZVB1Ymxpc2hJbmZvKElNZW1lbnRvIG1lbWVudG8pIHsKKwkJc3VwZXIoKTsKKwkJCisJCWxvYWQobWVtZW50byk7CisJfQorCisJLyoqCisJICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIGluIGFuIGlucHV0IHN0cmVhbQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGxvYWQgZmFpbHMKKwkgKi8KKwlwdWJsaWMgTW9kdWxlUHVibGlzaEluZm8oRGF0YUlucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlzdXBlcigpOworCQkKKwkJbG9hZChpbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNb2R1bGVJZCgpIHsKKwkJcmV0dXJuIG1vZHVsZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIElNb2R1bGVUeXBlIGdldE1vZHVsZVR5cGUoKSB7CisJCXJldHVybiBtb2R1bGVUeXBlOworCX0KKworCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoKSB7CisJCXJldHVybiByZXNvdXJjZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKElNb2R1bGVSZXNvdXJjZVtdIHJlcykgeworCQlyZXNvdXJjZXMgPSByZXM7CisJfQorCisJLyoqCisJICogVXNlZCBvbmx5IGZvciByZWFkaW5nIGZyb20gV1RQIDEueCB3b3Jrc3BhY2VzLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bykgeworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMb2FkaW5nIG1vZHVsZSBwdWJsaXNoIGluZm8gZm9yOiAiICsgbWVtZW50byk7CisJCQorCQl0cnkgeworCQkJbW9kdWxlSWQgPSBtZW1lbnRvLmdldFN0cmluZyhNT0RVTEVfSUQpOworCQkJbmFtZSA9IG1lbWVudG8uZ2V0U3RyaW5nKE5BTUUpOworCQkJU3RyaW5nIG10ID0gbWVtZW50by5nZXRTdHJpbmcoTU9EVUxFX1RZUEVfSUQpOworCQkJU3RyaW5nIG12ID0gbWVtZW50by5nZXRTdHJpbmcoTU9EVUxFX1RZUEVfVkVSU0lPTik7CisJCQlpZiAobXQgIT0gbnVsbCAmJiBtdC5sZW5ndGgoKSA+IDApCisJCQkJbW9kdWxlVHlwZSA9IE1vZHVsZVR5cGUuZ2V0TW9kdWxlVHlwZShtdCwgbXYpOworCQkJCisJCQlyZXNvdXJjZXMgPSBsb2FkUmVzb3VyY2UobWVtZW50bywgbmV3IFBhdGgoIiIpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBtb2R1bGUgcHVibGlzaCBpbmZvIGluZm9ybWF0aW9uIiwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBVc2VkIG9ubHkgZm9yIHJlYWRpbmcgZnJvbSBXVFAgMS54IHdvcmtzcGFjZXMuCisJICovCisJcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGxvYWRSZXNvdXJjZShJTWVtZW50byBtZW1lbnRvLCBJUGF0aCBwYXRoKSB7CisJCWlmIChtZW1lbnRvID09IG51bGwpCisJCQlyZXR1cm4gRU1QVFlfTU9EVUxFX1JFU09VUkNFOworCQkKKwkJTGlzdDxJTW9kdWxlUmVzb3VyY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVSZXNvdXJjZT4oMTApOworCQkKKwkJLy8gbG9hZCBmaWxlcworCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbihGSUxFKTsKKwkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlTdHJpbmcgbmFtZTIgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoTkFNRSk7CisJCQkJbG9uZyBzdGFtcCA9IExvbmcucGFyc2VMb25nKGNoaWxkcmVuW2ldLmdldFN0cmluZyhTVEFNUCkpOworCQkJCU1vZHVsZUZpbGUgZmlsZSA9IG5ldyBNb2R1bGVGaWxlKG5hbWUyLCBwYXRoLCBzdGFtcCk7CisJCQkJbGlzdC5hZGQoZmlsZSk7CisJCQl9CisJCX0KKwkJCisJCS8vIGxvYWQgZm9sZGVycworCQljaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oRk9MREVSKTsKKwkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlTdHJpbmcgbmFtZTIgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoTkFNRSk7CisJCQkJTW9kdWxlRm9sZGVyIGZvbGRlciA9IG5ldyBNb2R1bGVGb2xkZXIobnVsbCwgbmFtZTIsIHBhdGgpOworCQkJCWZvbGRlci5zZXRNZW1iZXJzKGxvYWRSZXNvdXJjZShjaGlsZHJlbltpXSwgcGF0aC5hcHBlbmQobmFtZTIpKSk7CisJCQkJbGlzdC5hZGQoZm9sZGVyKTsKKwkJCX0KKwkJfQorCQkKKwkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldOworCQlsaXN0LnRvQXJyYXkocmVzb3VyY2VzMik7CisJCXJldHVybiByZXNvdXJjZXMyOworCX0KKworCXByb3RlY3RlZCB2b2lkIGxvYWQoRGF0YUlucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMb2FkaW5nIG1vZHVsZSBwdWJsaXNoIGluZm8iKTsKKwkJCisJCW1vZHVsZUlkID0gaW4ucmVhZFVURigpOworCQlieXRlIGIgPSBpbi5yZWFkQnl0ZSgpOyAvLyA4PworCQkKKwkJaWYgKChiICYgMSkgIT0gMCkKKwkJCW5hbWUgPSBpbi5yZWFkVVRGKCk7CisJCWVsc2UKKwkJCW5hbWUgPSBudWxsOworCQkKKwkJaWYgKChiICYgMikgIT0gMCkgeworCQkJU3RyaW5nIG10ID0gaW4ucmVhZFVURigpOworCQkJU3RyaW5nIG12ID0gaW4ucmVhZFVURigpOworCQkJaWYgKG10ICE9IG51bGwgJiYgbXQubGVuZ3RoKCkgPiAwKQorCQkJCW1vZHVsZVR5cGUgPSBNb2R1bGVUeXBlLmdldE1vZHVsZVR5cGUobXQsIG12KTsKKwkJfSBlbHNlCisJCQltb2R1bGVUeXBlID0gbnVsbDsKKwkJCisJCXJlc291cmNlcyA9IGxvYWRSZXNvdXJjZShpbiwgbmV3IFBhdGgoIiIpKTsKKwl9CisKKwlwcml2YXRlIElNb2R1bGVSZXNvdXJjZVtdIGxvYWRSZXNvdXJjZShEYXRhSW5wdXQgaW4sIElQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWludCBzaXplID0gaW4ucmVhZEludCgpOworCQlpZiAoc2l6ZSA+IDEwMDAwMDApCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZvbGRlciBjYXBhY2l0eSBsaW1pdCByZWFjaGVkIik7CisJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIgPSBuZXcgSU1vZHVsZVJlc291cmNlW3NpemVdOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWJ5dGUgYiA9IGluLnJlYWRCeXRlKCk7CisJCQlpZiAoYiA9PSAwKSB7CisJCQkJU3RyaW5nIG5hbWUyID0gaW4ucmVhZFVURigpOworCQkJCWxvbmcgc3RhbXAgPSBpbi5yZWFkTG9uZygpOworCQkJCXJlc291cmNlczJbaV0gPSBuZXcgTW9kdWxlRmlsZShuYW1lMiwgcGF0aCwgc3RhbXApOworCQkJfSBlbHNlIGlmIChiID09IDEpIHsKKwkJCQlTdHJpbmcgbmFtZTIgPSBpbi5yZWFkVVRGKCk7CisJCQkJTW9kdWxlRm9sZGVyIGZvbGRlciA9IG5ldyBNb2R1bGVGb2xkZXIobnVsbCwgbmFtZTIsIHBhdGgpOworCQkJCWZvbGRlci5zZXRNZW1iZXJzKGxvYWRSZXNvdXJjZShpbiwgcGF0aC5hcHBlbmQobmFtZTIpKSk7CisJCQkJcmVzb3VyY2VzMltpXSA9IGZvbGRlcjsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHJlc291cmNlczI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2F2ZShEYXRhT3V0cHV0IG91dCkgeworCQl0cnkgeworCQkJb3V0LndyaXRlVVRGKG1vZHVsZUlkKTsKKwkJCWJ5dGUgYiA9IDA7CisJCQlpZiAobmFtZSAhPSBudWxsKQorCQkJCWIgfD0gMTsKKwkJCWlmIChtb2R1bGVUeXBlICE9IG51bGwpCisJCQkJYiB8PSAyOworCQkJb3V0LndyaXRlQnl0ZShiKTsKKwkJCQorCQkJaWYgKG5hbWUgIT0gbnVsbCkKKwkJCQlvdXQud3JpdGVVVEYobmFtZSk7CisJCQkKKwkJCWlmIChtb2R1bGVUeXBlICE9IG51bGwpIHsKKwkJCQlvdXQud3JpdGVVVEYobW9kdWxlVHlwZS5nZXRJZCgpKTsKKwkJCQlvdXQud3JpdGVVVEYobW9kdWxlVHlwZS5nZXRWZXJzaW9uKCkpOworCQkJfQorCQkJc2F2ZVJlc291cmNlKG91dCwgcmVzb3VyY2VzKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIG1vZHVsZSBwdWJsaXNoIGluZm8iLCBlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHNhdmVSZXNvdXJjZShEYXRhT3V0cHV0IG91dCwgSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKHJlc291cmNlczIgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaW50IHNpemUgPSByZXNvdXJjZXMyLmxlbmd0aDsKKwkJb3V0LndyaXRlSW50KHNpemUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJaWYgKHJlc291cmNlczJbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgeworCQkJCUlNb2R1bGVGaWxlIGZpbGUgPSAoSU1vZHVsZUZpbGUpIHJlc291cmNlczJbaV07CisJCQkJb3V0LndyaXRlQnl0ZSgwKTsKKwkJCQlvdXQud3JpdGVVVEYoZmlsZS5nZXROYW1lKCkpOworCQkJCW91dC53cml0ZUxvbmcoZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJSU1vZHVsZUZvbGRlciBmb2xkZXIgPSAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2VzMltpXTsKKwkJCQlvdXQud3JpdGVCeXRlKDEpOworCQkJCW91dC53cml0ZVVURihmb2xkZXIuZ2V0TmFtZSgpKTsKKwkJCQlJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMzID0gZm9sZGVyLm1lbWJlcnMoKTsKKwkJCQlzYXZlUmVzb3VyY2Uob3V0LCByZXNvdXJjZXMzKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFN0YXJ0IHVzaW5nIHRoZSBtb2R1bGUgY2FjaGUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc3RhcnRDYWNoaW5nKCkgeworCQl1c2VDYWNoZSA9IHRydWU7CisJCWN1cnJlbnRSZXNvdXJjZXMgPSBudWxsOworCQlkZWx0YSA9IG51bGw7CisJCWhhc0RlbHRhID0gZmFsc2U7CisJfQorCisJLyoqCisJICogRmlsbCB0aGUgbW9kdWxlIGNhY2hlLgorCSAqIAorCSAqIEBwYXJhbSBtb2R1bGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgZmlsbENhY2hlKElNb2R1bGVbXSBtb2R1bGUpIHsKKwkJaWYgKCF1c2VDYWNoZSkKKwkJCXJldHVybjsKKwkJCisJCWlmIChjdXJyZW50UmVzb3VyY2VzICE9IG51bGwpCisJCQlyZXR1cm47CisJCQorCQl0cnkgeworCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOworCQkJTW9kdWxlRGVsZWdhdGUgcG0gPSAoTW9kdWxlRGVsZWdhdGUpIG0ubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOworCQkJaWYgKHBtID09IG51bGwgfHwgKG0uZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIW0uZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSkKKwkJCQljdXJyZW50UmVzb3VyY2VzID0gRU1QVFlfTU9EVUxFX1JFU09VUkNFOworCQkJZWxzZQorCQkJCWN1cnJlbnRSZXNvdXJjZXMgPSBwbS5tZW1iZXJzKCk7CisJCQkKKwkJCWRlbHRhID0gU2VydmVyUHVibGlzaEluZm8uZ2V0RGVsdGEocmVzb3VyY2VzLCBjdXJyZW50UmVzb3VyY2VzKTsKKwkJCWhhc0RlbHRhID0gKGRlbHRhICE9IG51bGwgJiYgZGVsdGEubGVuZ3RoID4gMCk7CisJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIkZpbGxpbmcgcHVibGlzaCBjYWNoZSBmb3IgIiArIG0uZ2V0TmFtZSgpICsgIjogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkbid0IGZpbGwgcHVibGlzaCBjYWNoZSBmb3IgIiArIG1vZHVsZSk7CisJCX0KKwkJaWYgKGRlbHRhID09IG51bGwpCisJCQlkZWx0YSA9IEVNUFRZX01PRFVMRV9SRVNPVVJDRV9ERUxUQTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjbGVhckNhY2hlKCkgeworCQl1c2VDYWNoZSA9IGZhbHNlOworCQljdXJyZW50UmVzb3VyY2VzID0gbnVsbDsKKwkJZGVsdGEgPSBudWxsOworCQloYXNEZWx0YSA9IGZhbHNlOworCX0KKworCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRNb2R1bGVSZXNvdXJjZXMoSU1vZHVsZVtdIG1vZHVsZSkgeworCQlpZiAobW9kdWxlID09IG51bGwpCisJCQlyZXR1cm4gRU1QVFlfTU9EVUxFX1JFU09VUkNFOworCQkKKwkJaWYgKHVzZUNhY2hlKSB7CisJCQlmaWxsQ2FjaGUobW9kdWxlKTsKKwkJCXJldHVybiBjdXJyZW50UmVzb3VyY2VzOworCQl9CisJCQorCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7CisJCUlNb2R1bGUgbSA9IG1vZHVsZVtzaXplIC0gMV07CisJCU1vZHVsZURlbGVnYXRlIHBtID0gKE1vZHVsZURlbGVnYXRlKSBtLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKKwkJaWYgKHBtID09IG51bGwgfHwgKG0uZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIW0uZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSkKKwkJCXJldHVybiBFTVBUWV9NT0RVTEVfUkVTT1VSQ0U7CisJCQorCQl0cnkgeworCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlJTW9kdWxlUmVzb3VyY2VbXSB4ID0gcG0ubWVtYmVycygpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJUaW1lIHRvIGdldCBtZW1iZXJzKCkgZm9yICIgKyBtb2R1bGVbc2l6ZSAtIDFdLmdldE5hbWUoKSArICI6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7CisJCQlyZXR1cm4geDsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlBvc3NpYmxlIGZhaWx1cmUgaW4gZ2V0TW9kdWxlUmVzb3VyY2VzIiwgY2UpOworCQl9CisJCXJldHVybiBFTVBUWV9NT0RVTEVfUkVTT1VSQ0U7CisJfQorCisJcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0RGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgeworCQlpZiAobW9kdWxlID09IG51bGwpCisJCQlyZXR1cm4gRU1QVFlfTU9EVUxFX1JFU09VUkNFX0RFTFRBOworCQkKKwkJaWYgKHVzZUNhY2hlKSB7CisJCQlmaWxsQ2FjaGUobW9kdWxlKTsKKwkJCXJldHVybiBkZWx0YTsKKwkJfQorCQkKKwkJSU1vZHVsZSBtID0gbW9kdWxlW21vZHVsZS5sZW5ndGggLSAxXTsKKwkJTW9kdWxlRGVsZWdhdGUgcG0gPSAoTW9kdWxlRGVsZWdhdGUpIG0ubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOworCQlpZiAocG0gPT0gbnVsbCB8fCAobS5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhbS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpKQorCQkJcmV0dXJuIEVNUFRZX01PRFVMRV9SRVNPVVJDRV9ERUxUQTsKKwkJCisJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIgPSBudWxsOworCQl0cnkgeworCQkJcmVzb3VyY2VzMiA9IHBtLm1lbWJlcnMoKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlBvc3NpYmxlIGZhaWx1cmUgaW4gZ2V0RGVsdGEiLCBjZSk7CisJCX0KKwkJaWYgKHJlc291cmNlczIgPT0gbnVsbCkKKwkJCXJlc291cmNlczIgPSBFTVBUWV9NT0RVTEVfUkVTT1VSQ0U7CisJCXJldHVybiBTZXJ2ZXJQdWJsaXNoSW5mby5nZXREZWx0YShnZXRSZXNvdXJjZXMoKSwgcmVzb3VyY2VzMik7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgeworCQlpZiAobW9kdWxlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpZiAodXNlQ2FjaGUpIHsKKwkJCWZpbGxDYWNoZShtb2R1bGUpOworCQkJcmV0dXJuIGhhc0RlbHRhOworCQl9CisJCQorCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOworCQlNb2R1bGVEZWxlZ2F0ZSBwbSA9IChNb2R1bGVEZWxlZ2F0ZSkgbS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7CisJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIgPSBudWxsOworCQlpZiAocG0gPT0gbnVsbCB8fCAobS5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhbS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJdHJ5IHsKKwkJCXJlc291cmNlczIgPSBwbS5tZW1iZXJzKCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJQb3NzaWJsZSBmYWlsdXJlIGluIGhhc0RlbHRhIiwgY2UpOworCQl9CisJCWlmIChyZXNvdXJjZXMyID09IG51bGwpCisJCQlyZXNvdXJjZXMyID0gRU1QVFlfTU9EVUxFX1JFU09VUkNFOworCQlyZXR1cm4gU2VydmVyUHVibGlzaEluZm8uaGFzRGVsdGEoZ2V0UmVzb3VyY2VzKCksIHJlc291cmNlczIpOworCX0KKworCXB1YmxpYyB2b2lkIGZpbGwoSU1vZHVsZVtdIG1vZHVsZSkgeworCQlpZiAobW9kdWxlID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlpZiAodXNlQ2FjaGUpIHsKKwkJCWZpbGxDYWNoZShtb2R1bGUpOworCQkJc2V0UmVzb3VyY2VzKGN1cnJlbnRSZXNvdXJjZXMpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOworCQlNb2R1bGVEZWxlZ2F0ZSBwbSA9IChNb2R1bGVEZWxlZ2F0ZSkgbS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7CisJCWlmIChwbSA9PSBudWxsIHx8IChtLmdldFByb2plY3QoKSAhPSBudWxsICYmICFtLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkpIHsKKwkJCXNldFJlc291cmNlcyhFTVBUWV9NT0RVTEVfUkVTT1VSQ0UpOworCQkJcmV0dXJuOworCQl9CisJCQorCQl0cnkgeworCQkJc2V0UmVzb3VyY2VzKHBtLm1lbWJlcnMoKSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJQb3NzaWJsZSBmYWlsdXJlIGluIGZpbGwiLCBjZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBkZWxldGVkIG1vZHVsZSB0aGF0IHJlcHJlc2VudHMgdGhpcyBtb2R1bGUuCisJICogCisJICogQHJldHVybiBhIG1vZHVsZQorCSAqLworCXByb3RlY3RlZCBJTW9kdWxlIGdldERlbGV0ZWRNb2R1bGUoKSB7CisJCVN0cmluZyBpZCA9IG1vZHVsZUlkOworCQlpbnQgaW5kZXggPSBpZC5sYXN0SW5kZXhPZigiIyIpOworCQlpZiAoaW5kZXggPiAwKQorCQkJaWQgPSBpZC5zdWJzdHJpbmcoaW5kZXgrMSk7CisJCXJldHVybiBuZXcgRGVsZXRlZE1vZHVsZShpZCwgbmFtZSwgbW9kdWxlVHlwZSk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJNb2R1bGVQdWJsaXNoSW5mbyBbIiArIG1vZHVsZUlkICsgIl0iOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVUeXBlLmphdmEKaW5kZXggNzJkZWQ5NC4uODIwZGNiZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiw5ICsyNiw5IEBACiAJcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwogCiAJLy8JY2FjaGVkIGNvcHkgb2YgYWxsIG1vZHVsZSBraW5kcwotCXByaXZhdGUgc3RhdGljIExpc3QgbW9kdWxlS2luZHM7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxNb2R1bGVLaW5kPiBtb2R1bGVLaW5kczsKIAotCXByaXZhdGUgc3RhdGljIExpc3QgbW9kdWxlVHlwZXM7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxNb2R1bGVUeXBlPiBtb2R1bGVUeXBlczsKIAogCXB1YmxpYyBNb2R1bGVUeXBlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKIAkJc3VwZXIoKTsKQEAgLTYxLDcgKzYxLDcgQEAKIAkgKi8KIAlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNb2R1bGVUeXBlIGdldE1vZHVsZVR5cGUoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbikgewogCQlpZiAobW9kdWxlVHlwZXMgPT0gbnVsbCkKLQkJCW1vZHVsZVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworCQkJbW9kdWxlVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZVR5cGU+KCk7CiAJCQogCQkvLyBsb29rIGZvciBhbiBleGlzdGluZyBvbmUgZmlyc3QKIAkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVUeXBlcy5pdGVyYXRvcigpOwpAQCAtMTE2LDcgKzExNiw3IEBACiAJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJtb2R1bGVUeXBlcyIpOwogCiAJCWludCBzaXplID0gY2YubGVuZ3RoOwotCQltb2R1bGVLaW5kcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisJCW1vZHVsZUtpbmRzID0gbmV3IEFycmF5TGlzdDxNb2R1bGVLaW5kPihzaXplKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKIAkJCXRyeSB7CiAJCQkJTW9kdWxlS2luZCBtb2R1bGVUeXBlID0gbmV3IE1vZHVsZUtpbmQoY2ZbaV0pOwpAQCAtMTQ3LDIzICsxNDcsMTUgQEAKIAkJCXJldHVybiBmYWxzZTsKIAkJCiAJCU1vZHVsZVR5cGUgbXQgPSAoTW9kdWxlVHlwZSkgb2JqOwotCQlpZiAoIW1hdGNoZXMoaWQsIG10LmlkKSkKKwkJaWYgKCFTZXJ2ZXJQbHVnaW4ubWF0Y2hlcyhpZCwgbXQuaWQpKQogCQkJcmV0dXJuIGZhbHNlOwogCQkKLQkJaWYgKCFtYXRjaGVzKHZlcnNpb24sIG10LnZlcnNpb24pKQorCQlpZiAoIVNlcnZlclBsdWdpbi5tYXRjaGVzKHZlcnNpb24sIG10LnZlcnNpb24pKQogCQkJcmV0dXJuIGZhbHNlOwogCQkKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCB8fCAiKiIuZXF1YWxzKGEpIHx8ICIqIi5lcXVhbHMoYikgfHwgYS5zdGFydHNXaXRoKGIpIHx8IGIuc3RhcnRzV2l0aChhKQotCQkJfHwgKGEuZW5kc1dpdGgoIi4qIikgJiYgYi5zdGFydHNXaXRoKGEuc3Vic3RyaW5nKDAsIGEubGVuZ3RoKCkgLSAxKSkpCi0JCQl8fCAoYi5lbmRzV2l0aCgiLioiKSAmJiBhLnN0YXJ0c1dpdGgoYi5zdWJzdHJpbmcoMCwgYi5sZW5ndGgoKSAtIDEpKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCXJldHVybiAiTW9kdWxlVHlwZVsiICsgaWQgKyAiLCAiICsgdmVyc2lvbiArICJdIjsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvamVjdFByb3BlcnRpZXMuamF2YQppbmRleCA4MzlkN2RjLi41M2VmN2RmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydGllcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2plY3RQcm9wZXJ0aWVzLmphdmEKQEAgLTc0LDcgKzc0LDcgQEAKIAkJCWVsc2UKIAkJCQlzZXJ2ZXJQcm9qZWN0ID0gZmFsc2U7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBwcmVmZXJlbmNlczogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIHByZWZlcmVuY2VzIiwgZSk7CiAJCX0gZmluYWxseSB7CiAJCQl0cnkgewogCQkJCWlmIChpbiAhPSBudWxsKQpAQCAtMTI0LDcgKzEyNCw4IEBACiAJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBlKSk7CiAJCX0gZmluYWxseSB7CiAJCQl0cnkgewotCQkJCWluLmNsb3NlKCk7CisJCQkJaWYgKGluICE9IG51bGwpCisJCQkJCWluLmNsb3NlKCk7CiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJCS8vIGlnbm9yZQogCQkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hJbmZvLmphdmEKaW5kZXggZjQ4OWEzMy4uOTA5ZjYwOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaEluZm8uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoSW5mby5qYXZhCkBAIC0xLDEzICsxLDEzIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuKjsKQEAgLTI1LDEwICsyNSwxMCBAQAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfRElSID0gInB1Ymxpc2giOwogCiAJLy8gbWFwIG9mIHNlcnZlciBpZHMgdG8gU3RyaW5ncyBvZiBmaWxlbmFtZSBjb250YWluaW5nIHB1Ymxpc2ggZGF0YQotCXByb3RlY3RlZCBNYXAgc2VydmVySWRUb1BhdGg7CisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gc2VydmVySWRUb1BhdGg7CiAKIAkvLyBtYXAgb2YgbG9hZGVkIHNlcnZlcklkcyB0byBwdWJsaXNoIGluZm8KLQlwcm90ZWN0ZWQgTWFwIHNlcnZlcklkVG9QdWJsaXNoSW5mbzsKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU2VydmVyUHVibGlzaEluZm8+IHNlcnZlcklkVG9QdWJsaXNoSW5mbzsKIAogCS8qKgogCSAqIFB1Ymxpc2hJbmZvIGNvbnN0cnVjdG9yIGNvbW1lbnQuCkBAIC0zNiw4ICszNiw4IEBACiAJcHJpdmF0ZSBQdWJsaXNoSW5mbygpIHsKIAkJc3VwZXIoKTsKIAkKLQkJc2VydmVySWRUb1BhdGggPSBuZXcgSGFzaE1hcCgpOwotCQlzZXJ2ZXJJZFRvUHVibGlzaEluZm8gPSBuZXcgSGFzaE1hcCgpOworCQlzZXJ2ZXJJZFRvUGF0aCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlzZXJ2ZXJJZFRvUHVibGlzaEluZm8gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZlclB1Ymxpc2hJbmZvPigpOwogCQlsb2FkKCk7CiAJfQogCkBAIC02NiwxMCArNjYsMTAgQEAKIAkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7CiAJCWlmIChzZXJ2ZXJJZFRvUGF0aC5jb250YWluc0tleShzZXJ2ZXJJZCkpIHsKIAkJCWlmIChzZXJ2ZXJJZFRvUHVibGlzaEluZm8uY29udGFpbnNLZXkoc2VydmVySWQpKQotCQkJCXJldHVybiAoU2VydmVyUHVibGlzaEluZm8pIHNlcnZlcklkVG9QdWJsaXNoSW5mby5nZXQoc2VydmVySWQpOworCQkJCXJldHVybiBzZXJ2ZXJJZFRvUHVibGlzaEluZm8uZ2V0KHNlcnZlcklkKTsKIAkJCQogCQkJLy8gZm9yY2UgLmRhdCBleHRlbnNpb24KLQkJCVN0cmluZyBwYXJ0aWFsUGF0aCA9IChTdHJpbmcpIHNlcnZlcklkVG9QYXRoLmdldChzZXJ2ZXJJZCk7CisJCQlTdHJpbmcgcGFydGlhbFBhdGggPSBzZXJ2ZXJJZFRvUGF0aC5nZXQoc2VydmVySWQpOwogCQkJcGFydGlhbFBhdGggPSBwYXJ0aWFsUGF0aC5zdWJzdHJpbmcoMCwgcGFydGlhbFBhdGgubGVuZ3RoKCkgLSAzKSArICJkYXQiOwogCQkJSVBhdGggcGF0aCA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoUFVCTElTSF9ESVIpLmFwcGVuZChwYXJ0aWFsUGF0aCk7CiAJCQlTZXJ2ZXJQdWJsaXNoSW5mbyBzcGkgPSBuZXcgU2VydmVyUHVibGlzaEluZm8ocGF0aCk7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJCXJldHVybjsKIAkJCiAJCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOwotCQlTdHJpbmcgcGF0aDIgPSAoU3RyaW5nKSBzZXJ2ZXJJZFRvUGF0aC5nZXQoc2VydmVySWQpOworCQlTdHJpbmcgcGF0aDIgPSBzZXJ2ZXJJZFRvUGF0aC5nZXQoc2VydmVySWQpOwogCQlzeW5jaHJvbml6ZWQgKFBVQkxJU0hfRElSKSB7CiAJCQlzZXJ2ZXJJZFRvUGF0aC5yZW1vdmUoc2VydmVySWQpOwogCQkJc2VydmVySWRUb1B1Ymxpc2hJbmZvLnJlbW92ZShzZXJ2ZXJJZCk7CkBAIC0xNDMsNyArMTQzLDcgQEAKIAkJCQogCQkJSU1lbWVudG9bXSBzZXJ2ZXJDaGlsZCA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNlcnZlciIpOwogCQkJaW50IHNpemUgPSBzZXJ2ZXJDaGlsZC5sZW5ndGg7Ci0JCQlzZXJ2ZXJJZFRvUGF0aCA9IG5ldyBIYXNoTWFwKHNpemUgKyAyKTsKKwkJCXNlcnZlcklkVG9QYXRoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KHNpemUgKyAyKTsKIAkJCQogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKIAkJCQlTdHJpbmcgaWQgPSBzZXJ2ZXJDaGlsZFtpXS5nZXRTdHJpbmcoImlkIik7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAkJCQlzZXJ2ZXJJZFRvUGF0aC5wdXQoaWQsIHBhcnRpYWxQYXRoKTsKIAkJCX0KIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBnbG9iYWwgcHVibGlzaCBpbmZvOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIGdsb2JhbCBwdWJsaXNoIGluZm8iLCBlKTsKIAkJfQogCX0KIApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlcklkVG9QYXRoLmtleVNldCgpLml0ZXJhdG9yKCk7CiAJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CiAJCQkJU3RyaW5nIHNlcnZlcklkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZyBwYXJ0aWFsUGF0aCA9IChTdHJpbmcpIHNlcnZlcklkVG9QYXRoLmdldChzZXJ2ZXJJZCk7CisJCQkJU3RyaW5nIHBhcnRpYWxQYXRoID0gc2VydmVySWRUb1BhdGguZ2V0KHNlcnZlcklkKTsKIAkJCQkKIAkJCQlJTWVtZW50byBzZXJ2ZXIgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJzZXJ2ZXIiKTsKIAkJCQlzZXJ2ZXIucHV0U3RyaW5nKCJpZCIsIHNlcnZlcklkKTsKQEAgLTE3OSw0ICsxNzksNCBAQAogCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgZ2xvYmFsIHB1Ymxpc2ggaW5mbyIsIGUpOwogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hTZXJ2ZXJKb2IuamF2YQppbmRleCBkODZmOWIzLi45M2RiZGViIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoU2VydmVySm9iLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaFNlcnZlckpvYi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDQ4ICsxMCw3OSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVJ1bGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwogLyoqCiAgKiBKb2IgdG8gcHVibGlzaCB0byBhIHBhcnRpY3VsYXIgc2VydmVyLgorICogCisgKiBAZGVwcmVjYXRlZCAtIHVzZSBBUEkgZGlyZWN0bHksIGl0IHdpbGwga2ljayBvZmYgam9icyBhcyByZXF1aXJlZAogICovCiBwdWJsaWMgY2xhc3MgUHVibGlzaFNlcnZlckpvYiBleHRlbmRzIENoYWluZWRKb2IgewogCXByb3RlY3RlZCBpbnQga2luZDsKIAlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjazsKKwlwcm90ZWN0ZWQgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXM7CisJcHJvdGVjdGVkIElBZGFwdGFibGUgaW5mbzsKIAogCS8qKgogCSAqIENyZWF0ZSBhIG5ldyBwdWJsaXNoaW5nIGpvYi4KIAkgKiAKIAkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcHVibGlzaCB0bwogCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHB1Ymxpc2gKLQkgKiBAcGFyYW0gY2hlY2sgdG8gY2hlY2sgaWYgYXV0b3B1Ymxpc2hpbmcgaXMgYWxyZWFkeSBjb3ZlcmluZyB0aGUgcHVibGlzaAorCSAqIEBwYXJhbSBpbmZvIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCisJICogICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQorCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAorCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgorCSAqICAgIGZvciB0aGUgU2hlbGwgY2xhc3MuCiAJICovCi0JcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBib29sZWFuIGNoZWNrKSB7Ci0JCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLnB1Ymxpc2hpbmcsIHNlcnZlci5nZXROYW1lKCkpLCBzZXJ2ZXIpOwotCQl0aGlzLmtpbmQgPSBraW5kOwotCQl0aGlzLmNoZWNrID0gY2hlY2s7Ci0JCQotCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQkKLQkJLy8gMTAyMjI3IC0gbG9jayBlbnRpcmUgd29ya3NwYWNlIGR1cmluZyBwdWJsaXNoCQkKLQkJSVNjaGVkdWxpbmdSdWxlW10gcnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlWzJdOwotCQlydWxlc1swXSA9IHJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCXJ1bGVzWzFdID0gbmV3IFNlcnZlclNjaGVkdWxpbmdSdWxlKHNlcnZlcik7Ci0JCQotCQlzZXRSdWxlKE11bHRpUnVsZS5jb21iaW5lKHJ1bGVzKSk7CisJcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBJQWRhcHRhYmxlIGluZm8pIHsKKwkJdGhpcyhzZXJ2ZXIsIGtpbmQsIG51bGwsIGluZm8pOwogCX0KIAogCS8qKgogCSAqIENyZWF0ZSBhIG5ldyBwdWJsaXNoaW5nIGpvYi4KIAkgKiAKIAkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcHVibGlzaCB0bworCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHB1Ymxpc2gKKwkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3Qgb2YgbW9kdWxlcyB0byBwdWJsaXNoLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bworCSAqICAgIHB1Ymxpc2ggYWxsIG1vZHVsZXMKKwkgKiBAcGFyYW0gaW5mbyB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQorCSAqICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKKwkgKiAgICB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKKwkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKKwkgKiAgICBmb3IgdGhlIFNoZWxsIGNsYXNzLgorCSAqLworCXB1YmxpYyBQdWJsaXNoU2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXMsIElBZGFwdGFibGUgaW5mbykgeworCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5wdWJsaXNoaW5nLCBzZXJ2ZXIuZ2V0TmFtZSgpKSwgc2VydmVyKTsKKwkJdGhpcy5raW5kID0ga2luZDsKKwkJdGhpcy5tb2R1bGVzID0gbW9kdWxlczsKKwkJdGhpcy5pbmZvID0gaW5mbzsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgcHVibGlzaGluZyBqb2IuCisJICogCisJICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHB1Ymxpc2ggdG8KKwkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoCisJICogQHBhcmFtIGNoZWNrIHRvIGNoZWNrIGlmIGF1dG8tcHVibGlzaGluZyBpcyBhbHJlYWR5IGNvdmVyaW5nIHRoZSBwdWJsaXNoCisJICovCisJcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBib29sZWFuIGNoZWNrKSB7CisJCXRoaXMoc2VydmVyLCBraW5kLCBudWxsLCBudWxsKTsKKwkJdGhpcy5jaGVjayA9IGNoZWNrOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBwdWJsaXNoaW5nIGpvYi4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcHVibGlzaCB0bworCSAqIEBkZXByZWNhdGVkIHVzZSBvbmUgb2YgdGhlIG90aGVyIGNvbnN0cnVjdG9ycyBpbnN0ZWFkCiAJICovCiAJcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIpIHsKIAkJdGhpcyhzZXJ2ZXIsIElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgdHJ1ZSk7CkBAIC02MSwxNCArOTIsMzMgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4oSVByb2dyZXNzTW9uaXRvcikKIAkgKi8KIAlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChjaGVjaykgewotCQkJLy8gZG9uJ3QgcnVuIGlmIHdlJ3JlIGF1dG9wdWJsaXNoaW5nIGFuZCB0aGVyZSBpcyBubyBuZWVkIGZvciBhIHB1Ymxpc2guCisJCS8vaWYgKCFnZXRTZXJ2ZXIoKS5zaG91bGRQdWJsaXNoKCkpCisJCS8vCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkKKwkJaWYgKGNoZWNrICYmICFTZXJ2ZXJDb3JlLmlzQXV0b1B1Ymxpc2hpbmcoKSkgeworCQkJLy8gZG9uJ3QgcnVuIGlmIHdlJ3JlIGF1dG8tcHVibGlzaGluZyBhbmQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBwdWJsaXNoLgogCQkJLy8gY2FuJ3QgZXhlY3V0ZSB0aGlzIGNvZGUgaW4gc2hvdWxkUnVuKCkgYmVjYXVzZSBpdCB3aWxsIGNhbmNlbCB0aGUgam9iCiAJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyBpbW1lZGlhdGVseQotCQkJaWYgKCFTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmlzQXV0b1B1Ymxpc2hpbmcoKSB8fCAhKChTZXJ2ZXIpZ2V0U2VydmVyKCkpLnNob3VsZFB1Ymxpc2goKSkKIAkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKIAkJfQogCQkKLQkJcmV0dXJuIGdldFNlcnZlcigpLnB1Ymxpc2goa2luZCwgbW9uaXRvcik7CisJCWZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKKwkJZ2V0U2VydmVyKCkucHVibGlzaChraW5kLCBtb2R1bGVzLCBpbmZvLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7CisJCQkJc3RhdHVzWzBdID0gcmVzdWx0OworCQkJfQorCQl9KTsKKwkJCisJCXdoaWxlIChzdGF0dXNbMF0gPT0gbnVsbCAmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJdHJ5IHsKKwkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKwkJaWYgKHN0YXR1c1swXSAhPSBudWxsKQorCQkJcmV0dXJuIHN0YXR1c1swXTsKKwkJCisJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaFRhc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hUYXNrLmphdmEKaW5kZXggNTE5ZjA2ZS4uMTYzOTZmNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaFRhc2suamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoVGFzay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDkgKzEzLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaFRhc2tEZWxlZ2F0ZTsKIC8qKgogICogCiAgKi8KQEAgLTMzLDE2ICszMywxMCBAQAogCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogCX0KIAotCS8qCi0JICogQHNlZQotCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CiAJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKIAl9CiAKLQkvKgotCSAqIEBzZWUKLQkgKi8KIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKIAkJdHJ5IHsKIAkJCXJldHVybiBTZXJ2ZXJQbHVnaW4udG9rZW5pemUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKQEAgLTUxLDExICs0NSw4IEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIEBzZWUKLQkgKi8KIAlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBTZXJ2ZXJQbHVnaW4uc3VwcG9ydHNUeXBlKGdldFR5cGVJZHMoKSwgaWQpOworCQlyZXR1cm4gU2VydmVyUGx1Z2luLmNvbnRhaW5zKGdldFR5cGVJZHMoKSwgaWQpOwogCX0KIAogCS8qCkBAIC02OCw3ICs1OSw3IEBACiAJCQkJZGVsZWdhdGUgPSAoUHVibGlzaFRhc2tEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwogCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiUHVibGlzaFRhc2suZ2V0RGVsZWdhdGUoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICI+ICIgKyBnZXRJZCgpKTsKIAkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpICsgIjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIHQpOwogCQkJfQogCQl9CiAJCXJldHVybiBkZWxlZ2F0ZTsKQEAgLTg0LDcgKzc1LDcgQEAKIAkJCWlmIChwbyAhPSBudWxsKQogCQkJCXJldHVybiBwbzsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7CiAJCX0KIAkJcmV0dXJuIG5ldyBQdWJsaXNoT3BlcmF0aW9uWzBdOwogCX0KQEAgLTk5LDcgKzkwLDcgQEAKIAkJCWlmIChwbyAhPSBudWxsKQogCQkJCXJldHVybiBwbzsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7CiAJCX0KIAkJcmV0dXJuIG5ldyBQdWJsaXNoT3BlcmF0aW9uWzBdOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlODc4MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hlci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hlckRlbGVnYXRlOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFB1Ymxpc2hlciB7CisJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKKwlwcml2YXRlIFB1Ymxpc2hlckRlbGVnYXRlIGRlbGVnYXRlOworCisJLyoqCisJICogUHVibGlzaGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICogCisJICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgCisJICovCisJcHVibGljIFB1Ymxpc2hlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQlzdXBlcigpOworCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworCX0KKworCS8qCisJICogQHNlZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBTZXJ2ZXJQbHVnaW4udG9rZW5pemUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgeworCQlyZXR1cm4gU2VydmVyUGx1Z2luLmNvbnRhaW5zKGdldFR5cGVJZHMoKSwgaWQpOworCX0KKworCS8qCisJICogQHNlZSBJUHVibGlzaGVyI2dldERlbGVnYXRlKCkKKwkgKi8KKwlwdWJsaWMgUHVibGlzaGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7CisJCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7CisJCQl0cnkgeworCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCWRlbGVnYXRlID0gKFB1Ymxpc2hlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJQdWJsaXNoVGFzay5nZXREZWxlZ2F0ZSgpOiA8IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGdldElkKCkpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIHQpOworCQkJfQorCQl9CisJCXJldHVybiBkZWxlZ2F0ZTsKKwl9CisKKwlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0cnkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiVGFzay5pbml0ICIgKyB0aGlzKTsKKwkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmV4ZWN1dGUoa2luZCwgbW9uaXRvciwgaW5mbyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJFcnJvciBpbiBkZWxlZ2F0ZSIsIGUpOyAvLyBUT0RPCisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgeworCQl0cnkgeworCQkJZ2V0RGVsZWdhdGUoKS5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorCSAqIAorCSAqIEByZXR1cm4gYSBzdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlB1Ymxpc2hlclsiICsgZ2V0SWQoKSArICJdIjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXNvdXJjZU1hbmFnZXIuamF2YQppbmRleCBkNTkzODU0Li4xY2E3ZDU1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXNvdXJjZU1hbmFnZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXNvdXJjZU1hbmFnZXIuamF2YQpAQCAtMzIsMjMgKzMyLDIzIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnZXIgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfREFUQV9GSUxFID0gInNlcnZlcnMueG1sIjsKLQkKKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRVZFTlRfQURERUQgPSAwOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRVZFTlRfQ0hBTkdFRCA9IDE7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFVkVOVF9SRU1PVkVEID0gMjsKIAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlTWFuYWdlciBpbnN0YW5jZTsKKwlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgaW5zdGFuY2UgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyKCk7CiAKIAkvLyBjdXJyZW50bHkgYWN0aXZlIHJ1bnRpbWVzIGFuZCBzZXJ2ZXJzCi0JcHJvdGVjdGVkIExpc3QgcnVudGltZXM7Ci0JcHJvdGVjdGVkIExpc3Qgc2VydmVyczsKKwlwcm90ZWN0ZWQgTGlzdDxJUnVudGltZT4gcnVudGltZXM7CisJcHJvdGVjdGVkIExpc3Q8SVNlcnZlcj4gc2VydmVyczsKIAogCS8vIGxpZmVjeWNsZSBsaXN0ZW5lcnMKLQlwcm90ZWN0ZWQgTGlzdCBydW50aW1lTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgzKTsKLQlwcm90ZWN0ZWQgTGlzdCBzZXJ2ZXJMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDMpOworCXByb3RlY3RlZCBMaXN0PElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI+IHJ1bnRpbWVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI+KDMpOworCXByb3RlY3RlZCBMaXN0PElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcj4gc2VydmVyTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXI+KDMpOwogCiAJLy8gY2FjaGUgZm9yIGRpc3Bvc2luZyBzZXJ2ZXJzICYgcnVudGltZXMKLQlwcm90ZWN0ZWQgTGlzdCBhY3RpdmVCdW5kbGVzOworCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYWN0aXZlQnVuZGxlczsKIAogCS8vIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lcnMKIAlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CkBAIC02MCw4ICs2MCw4IEBACiAKIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkOwogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6aW5nOwotCQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBzZXJ2ZXJQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKKworCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxTdHJpbmc+IHNlcnZlclByb2plY3RzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAKIAkvKioKIAkgKiBTZXJ2ZXIgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyLgpAQCAtMTc1LDcgKzE3NSw2IEBACiAJICovCiAJcHJpdmF0ZSBSZXNvdXJjZU1hbmFnZXIoKSB7CiAJCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKIAl9CiAKIAkvKioKQEAgLTE5Nyw3ICsxOTYsNyBAQAogCQkJCX0KIAkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBzdGFydHVwOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKIAkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBzdGFydHVwOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKKwkJCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZShjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwogCQkJfQogCQl9CiAJCQpAQCAtMjE3LDggKzIxNiw4IEBACiAJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQl9Ki8KIAkJCi0JCXNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFjdGl2ZUJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7CisJCWFjdGl2ZUJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKIAkJCiAJCWxvYWRSdW50aW1lc0xpc3QoKTsKIAkJbG9hZFNlcnZlcnNMaXN0KCk7CkBAIC0zMDIsOSArMzAxLDYgQEAKIAl9CiAKIAlwdWJsaWMgc3RhdGljIFJlc291cmNlTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQluZXcgUmVzb3VyY2VNYW5hZ2VyKCk7Ci0KIAkJcmV0dXJuIGluc3RhbmNlOwogCX0KIApAQCAtMzIwLDYgKzMxNiw4IEBACiAJfQogCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNBY3RpdmVCdW5kbGUoU3RyaW5nIGJ1bmRsZUlkKSB7CisJCWlmIChhY3RpdmVCdW5kbGVzID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiBhY3RpdmVCdW5kbGVzLmNvbnRhaW5zKGJ1bmRsZUlkKTsKIAl9CiAKQEAgLTM4Miw3ICszODAsNyBAQAogCQkJcnVudGltZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwogCQl9CiAJfQotCQorCiAJLyoKIAkgKgogCSAqLwpAQCAtMzkzLDcgKzM5MSw3IEBACiAJCQlydW50aW1lTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CiAJCX0KIAl9Ci0JCisKIAkvKgogCSAqIAogCSAqLwpAQCAtNDA0LDcgKzQwMiw3IEBACiAJCQlzZXJ2ZXJMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKIAkJfQogCX0KLQkKKwogCS8qCiAJICoKIAkgKi8KQEAgLTQxNSwxOSArNDEzLDE2IEBACiAJCQlzZXJ2ZXJMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIERlcmVnaXN0ZXIgYW4gZXhpc3RpbmcgcnVudGltZS4KIAkgKgogCSAqIEBwYXJhbSBydW50aW1lCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZGVyZWdpc3RlclJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgeworCXByaXZhdGUgdm9pZCBkZXJlZ2lzdGVyUnVudGltZShJUnVudGltZSBydW50aW1lKSB7CiAJCWlmIChydW50aW1lID09IG51bGwpCiAJCQlyZXR1cm47CiAJCQotCQlpZiAoIWluaXRpYWxpemVkKQotCQkJaW5pdCgpOwotCQkKIAkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiRGVyZWdpc3RlcmluZyBydW50aW1lOiAiICsgcnVudGltZS5nZXROYW1lKCkpOwogCQkKIAkJcnVudGltZXMucmVtb3ZlKHJ1bnRpbWUpOwpAQCAtNDQwLDEzICs0MzUsMTAgQEAKIAkgKgogCSAqIEBwYXJhbSBzZXJ2ZXIKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZXJlZ2lzdGVyU2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7CisJcHJpdmF0ZSB2b2lkIGRlcmVnaXN0ZXJTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKIAkJaWYgKHNlcnZlciA9PSBudWxsKQogCQkJcmV0dXJuOwogCQkKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCiAJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIkRlcmVnaXN0ZXJpbmcgc2VydmVyOiAiICsgc2VydmVyLmdldE5hbWUoKSk7CiAJCQogCQkoKFNlcnZlcikgc2VydmVyKS5kZWxldGVNZXRhZGF0YSgpOwpAQCAtNDY2LDIxICs0NTgsMTcgQEAKIAkJCXJldHVybjsKIAkJCiAJCXN5bmNocm9uaXplZCAocnVudGltZUxpc3RlbmVycykgewotCQkJaW50IHNpemUgPSBydW50aW1lTGlzdGVuZXJzLnNpemUoKTsKLQkJCUlSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJbXSBzcmwgPSBuZXcgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcltzaXplXTsKLQkJCXJ1bnRpbWVMaXN0ZW5lcnMudG9BcnJheShzcmwpOwotCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiICBGaXJpbmcgcnVudGltZSBldmVudCB0byAiICsgc3JsW2ldKTsKKwkJCWZvciAoSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBzcmwgOiBydW50aW1lTGlzdGVuZXJzKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiICBGaXJpbmcgcnVudGltZSBldmVudCB0byAiICsgc3JsKTsKIAkJCQl0cnkgewogCQkJCQlpZiAoYiA9PSBFVkVOVF9BRERFRCkKLQkJCQkJCXNybFtpXS5ydW50aW1lQWRkZWQocnVudGltZSk7CisJCQkJCQlzcmwucnVudGltZUFkZGVkKHJ1bnRpbWUpOwogCQkJCQllbHNlIGlmIChiID09IEVWRU5UX0NIQU5HRUQpCi0JCQkJCQlzcmxbaV0ucnVudGltZUNoYW5nZWQocnVudGltZSk7CisJCQkJCQlzcmwucnVudGltZUNoYW5nZWQocnVudGltZSk7CiAJCQkJCWVsc2UKLQkJCQkJCXNybFtpXS5ydW50aW1lUmVtb3ZlZChydW50aW1lKTsKKwkJCQkJCXNybC5ydW50aW1lUmVtb3ZlZChydW50aW1lKTsKIAkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIEVycm9yIGZpcmluZyBydW50aW1lIGV2ZW50IHRvICIgKyBzcmxbaV0sIGUpOworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIEVycm9yIGZpcmluZyBydW50aW1lIGV2ZW50IHRvICIgKyBzcmwsIGUpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNDk3LDI2ICs0ODUsMjIgQEAKIAkJCXJldHVybjsKIAkJCiAJCXN5bmNocm9uaXplZCAoc2VydmVyTGlzdGVuZXJzKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlckxpc3RlbmVycy5zaXplKCk7Ci0JCQlJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXJbXSBzcmwgPSBuZXcgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyW3NpemVdOwotCQkJc2VydmVyTGlzdGVuZXJzLnRvQXJyYXkoc3JsKTsKLQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIiAgRmlyaW5nIHNlcnZlciBldmVudCB0byAiICsgc3JsW2ldKTsKKwkJCWZvciAoSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIHNybCA6IHNlcnZlckxpc3RlbmVycykgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIiAgRmlyaW5nIHNlcnZlciBldmVudCB0byAiICsgc3JsKTsKIAkJCQl0cnkgewogCQkJCQlpZiAoYiA9PSBFVkVOVF9BRERFRCkKLQkJCQkJCXNybFtpXS5zZXJ2ZXJBZGRlZChzZXJ2ZXIpOworCQkJCQkJc3JsLnNlcnZlckFkZGVkKHNlcnZlcik7CiAJCQkJCWVsc2UgaWYgKGIgPT0gRVZFTlRfQ0hBTkdFRCkKLQkJCQkJCXNybFtpXS5zZXJ2ZXJDaGFuZ2VkKHNlcnZlcik7CisJCQkJCQlzcmwuc2VydmVyQ2hhbmdlZChzZXJ2ZXIpOwogCQkJCQllbHNlCi0JCQkJCQlzcmxbaV0uc2VydmVyUmVtb3ZlZChzZXJ2ZXIpOworCQkJCQkJc3JsLnNlcnZlclJlbW92ZWQoc2VydmVyKTsKIAkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIEVycm9yIGZpcmluZyBzZXJ2ZXIgZXZlbnQgdG8gIiArIHNybFtpXSwgZSk7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIHNlcnZlciBldmVudCB0byAiICsgc3JsLCBlKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLTwtIERvbmUgZmlyaW5nIHNlcnZlciBldmVudCAtPC0iKTsKLQl9CQorCX0KIAogCXByb3RlY3RlZCB2b2lkIHNhdmVSdW50aW1lc0xpc3QoKSB7CiAJCXRyeSB7CkBAIC01NDEsNyArNTI1LDcgQEAKIAkJaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlU2VydmVyc0xpc3QoKSB7CisJcHJpdmF0ZSB2b2lkIHNhdmVTZXJ2ZXJzTGlzdCgpIHsKIAkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChTRVJWRVJfREFUQV9GSUxFKS50b09TU3RyaW5nKCk7CiAJCQogCQl0cnkgewpAQCAtNTY4LDcgKzU1Miw3IEBACiAJCVByZWZlcmVuY2VzIHByZWZzID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKIAkJU3RyaW5nIHhtbFN0cmluZyA9IHByZWZzLmdldFN0cmluZygicnVudGltZXMiKTsKIAkJCi0JCXJ1bnRpbWVzID0gbmV3IEFycmF5TGlzdCgpOworCQlydW50aW1lcyA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7CiAJCWlmICh4bWxTdHJpbmcgIT0gbnVsbCAmJiB4bWxTdHJpbmcubGVuZ3RoKCkgPiAwKSB7CiAJCQl0cnkgewogCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygiVVRGLTgiKSk7CkBAIC01ODMsNyArNTY3LDcgQEAKIAkJCQkJcnVudGltZXMuYWRkKHJ1bnRpbWUpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHJ1bnRpbWVzOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBydW50aW1lcyIsIGUpOwogCQkJfQogCQl9CiAJfQpAQCAtNjA0LDE2ICs1ODgsNyBAQAogCQkJCXNlcnZlcnMuYWRkKHNlcnZlcik7CiAJCQl9CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgc2VydmVyczogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkKLQkJaWYgKFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuaXNTeW5jT25TdGFydHVwKCkpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlVcGRhdGVTZXJ2ZXJKb2Igam9iID0gbmV3IFVwZGF0ZVNlcnZlckpvYihzZXJ2ZXIpOwotCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJfQorCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHNlcnZlcnMiLCBlKTsKIAkJfQogCX0KIApAQCAtNjc4LDcgKzY1Myw3IEBACiAJCWlmICghaW5pdGlhbGl6ZWQpCiAJCQlpbml0KCk7CiAJCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHJ1bnRpbWVzKTsKKwkJTGlzdDxJUnVudGltZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KHJ1bnRpbWVzKTsKIAkJCiAJCUlSdW50aW1lW10gciA9IG5ldyBJUnVudGltZVtsaXN0LnNpemUoKV07CiAJCWxpc3QudG9BcnJheShyKTsKQEAgLTc5NSw4ICs3NzAsNiBAQAogCQkJCQloYW5kbGVSZW1vdmVkRmlsZShmaWxlKTsKIAkJCQllbHNlCiAJCQkJCWhhbmRsZUNoYW5nZWRGaWxlKGZpbGUsIG1vbml0b3IpOwotCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCW1vbml0b3IuZG9uZSgpOwogCQkJfQogCQkJcmV0dXJuIGZhbHNlOwogCQl9CkBAIC04NjIsNyArODM1LDcgQEAKIAkgKiBAcGFyYW0gbW9uaXRvcgogCSAqIEByZXR1cm4gYm9vbGVhbgogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZU1vdmVkRmlsZShJRmlsZSBmaWxlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJcHJpdmF0ZSBib29sZWFuIGhhbmRsZU1vdmVkRmlsZShJRmlsZSBmaWxlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgImhhbmRsZU1vdmVkRmlsZTogIiArIGZpbGUpOwogCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7CiAJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyMDAwKTsKQEAgLTkyNiw3ICs4OTksNyBAQAogCSAqIEBwYXJhbSBtb25pdG9yCiAJICogQHJldHVybiBib29sZWFuCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlQ2hhbmdlZEZpbGUoSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJcHJpdmF0ZSBib29sZWFuIGhhbmRsZUNoYW5nZWRGaWxlKElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCQlUcmFjZS50cmFjZShUcmFjZS5SRVNPVVJDRVMsICJoYW5kbGVDaGFuZ2VkRmlsZTogIiArIGZpbGUpOwogCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7CiAJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMDAwKTsKQEAgLTk0MCw4ICs5MTMsOCBAQAogCQkJCSgoU2VydmVyKSBzZXJ2ZXIpLmxvYWRGcm9tRmlsZShtb25pdG9yKTsKIAkJCQlmaXJlU2VydmVyRXZlbnQoc2VydmVyLCBFVkVOVF9DSEFOR0VEKTsKIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVsb2FkaW5nIHNlcnZlciAiICsgc2VydmVyLmdldE5hbWUoKSArICIgZnJvbSAiICsgZmlsZSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJZGVyZWdpc3RlclNlcnZlcihzZXJ2ZXIpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlbG9hZGluZyBzZXJ2ZXIgIiArIHNlcnZlci5nZXROYW1lKCkgKyAiIGZyb20gIiArIGZpbGUsIGUpOworCQkJCXJlbW92ZVNlcnZlcihzZXJ2ZXIpOwogCQkJfQogCQl9IGVsc2UKIAkJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIk5vIHNlcnZlciBmb3VuZCBhdDogIiArIGZpbGUpOwpAQCAtOTU3LDcgKzkzMCw3IEBACiAJICogQHBhcmFtIGZpbGUgYSBmaWxlCiAJICogQHJldHVybiBib29sZWFuCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlUmVtb3ZlZEZpbGUoSUZpbGUgZmlsZSkgeworCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVSZW1vdmVkRmlsZShJRmlsZSBmaWxlKSB7CiAJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgImhhbmRsZVJlbW92ZWRGaWxlOiAiICsgZmlsZSk7CiAJCQogCQlJU2VydmVyIHNlcnZlciA9IGZpbmRTZXJ2ZXIoZmlsZSk7CkBAIC0xMDUwLDE1ICsxMDIzLDEyIEBACiAJLyoqCiAJICogUmVnaXN0ZXJzIGEgbmV3IHJ1bnRpbWUuCiAJICoKLQkgKiBAcGFyYW0gcnVudGltZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWUKKwkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgeworCXByaXZhdGUgdm9pZCByZWdpc3RlclJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewogCQlpZiAocnVudGltZSA9PSBudWxsKQogCQkJcmV0dXJuOwogCQkKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCiAJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIlJlZ2lzdGVyaW5nIHJ1bnRpbWU6ICIgKyBydW50aW1lLmdldE5hbWUoKSk7CiAJCQogCQlydW50aW1lcy5hZGQocnVudGltZSk7CkBAIC0xMDY2LDIyICsxMDM2LDE5IEBACiAJCQogCQlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChSdW50aW1lVHlwZSkgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwogCQlTdHJpbmcgYnVuZGxlSWQgPSBydW50aW1lVHlwZS5nZXROYW1lc3BhY2UoKTsKLQkJaWYgKCFhY3RpdmVCdW5kbGVzLmNvbnRhaW5zKGJ1bmRsZUlkKSkKKwkJaWYgKGFjdGl2ZUJ1bmRsZXMgIT0gbnVsbCAmJiAhYWN0aXZlQnVuZGxlcy5jb250YWlucyhidW5kbGVJZCkpCiAJCQlhY3RpdmVCdW5kbGVzLmFkZChidW5kbGVJZCk7CiAJfQogCiAJLyoqCiAJICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZlci4KIAkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKKwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKIAkJaWYgKHNlcnZlciA9PSBudWxsKQogCQkJcmV0dXJuOwogCQkKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCiAJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIlJlZ2lzdGVyaW5nIHNlcnZlcjogIiArIHNlcnZlci5nZXROYW1lKCkpOwogCQkKIAkJc2VydmVycy5hZGQoc2VydmVyKTsKQEAgLTEwODksNyArMTA1Niw3IEBACiAJCQogCQlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSAoU2VydmVyVHlwZSkgc2VydmVyLmdldFNlcnZlclR5cGUoKTsKIAkJU3RyaW5nIGJ1bmRsZUlkID0gc2VydmVyVHlwZS5nZXROYW1lc3BhY2UoKTsKLQkJaWYgKCFhY3RpdmVCdW5kbGVzLmNvbnRhaW5zKGJ1bmRsZUlkKSkKKwkJaWYgKGFjdGl2ZUJ1bmRsZXMgIT0gbnVsbCAmJiAhYWN0aXZlQnVuZGxlcy5jb250YWlucyhidW5kbGVJZCkpCiAJCQlhY3RpdmVCdW5kbGVzLmFkZChidW5kbGVJZCk7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXN0YXJ0U2VydmVySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXN0YXJ0U2VydmVySm9iLmphdmEKaW5kZXggN2YwMDY2Yy4uZmUwZjJiZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUmVzdGFydFNlcnZlckpvYi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Jlc3RhcnRTZXJ2ZXJKb2IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywxMCArMTMsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyU2NoZWR1bGluZ1J1bGU7CiAvKioKICAqIEEgam9iIGZvciByZXN0YXJ0aW5nIGEgc2VydmVyLgorICogCisgKiBAZGVwcmVjYXRlZCAtIHVzZSBBUEkgZGlyZWN0bHksIGl0IHdpbGwga2ljayBvZmYgam9icyBhcyByZXF1aXJlZAogICovCiBwdWJsaWMgY2xhc3MgUmVzdGFydFNlcnZlckpvYiBleHRlbmRzIENoYWluZWRKb2IgewogCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKQEAgLTI2LDM2ICsyNiwyNiBAQAogCXB1YmxpYyBSZXN0YXJ0U2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewogCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JSZXN0YXJ0aW5nU2VydmVyLCBzZXJ2ZXIuZ2V0TmFtZSgpKSwgc2VydmVyKTsKIAkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQkJc2V0UnVsZShuZXcgU2VydmVyU2NoZWR1bGluZ1J1bGUoc2VydmVyKSk7CiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLkludGVybmFsSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKIAkgKi8KIAlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgSU9wZXJhdGlvbkxpc3RlbmVyKCkgeworCQlmaW5hbCBJU3RhdHVzW10gc3RhdHVzID0gbmV3IElTdGF0dXNbMV07CisJCWdldFNlcnZlcigpLnJlc3RhcnQobGF1bmNoTW9kZSwgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewogCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCWlzUmVzdGFydENvbXBsZXRlZCA9IHRydWU7Ci0JCQkJcmVzdWx0U3RhdHVzID0gcmVzdWx0OworCQkJCXN0YXR1c1swXSA9IHJlc3VsdDsKIAkJCX0KLQkJfTsKLQkJZ2V0U2VydmVyKCkucmVzdGFydChsYXVuY2hNb2RlLCBsaXN0ZW5lcjIpOworCQl9KTsKIAkJCi0JCS8vIGJsb2NrIHV0aWwgdGhlIHJlc3RhcnQgaXMgY29tcGxldGVkCi0JCXdoaWxlICghaXNSZXN0YXJ0Q29tcGxldGVkKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCisJCXdoaWxlIChzdGF0dXNbMF0gPT0gbnVsbCAmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewogCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nLgorCQkJCVRocmVhZC5zbGVlcCgyMDApOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKIAkJCX0KIAkJfQotCQkKLQkJaWYgKHJlc3VsdFN0YXR1cyAhPSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdFN0YXR1czsKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQlyZXR1cm4gc3RhdHVzWzBdOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUxvY2F0b3IuamF2YQppbmRleCAwZjgzZTc4Li5jMTAxNmU4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lTG9jYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVMb2NhdG9yLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCisgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMSwxNiArMzEsMTAgQEAKIAkJcmV0dXJuIGVsZW1lbnQ7CiAJfQogCi0JLyoKLQkgKiBAc2VlIElSdW50aW1lTG9jYXRvciNnZXRJZCgpCi0JICovCiAJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKIAkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwogCX0KIAotCS8qCi0JICogQHNlZSBJUnVudGltZUxvY2F0b3IKLQkgKi8KIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKIAkJdHJ5IHsKIAkJCXJldHVybiBTZXJ2ZXJQbHVnaW4udG9rZW5pemUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKQEAgLTQ5LDExICs0Myw4IEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIEBzZWUgSVJ1bnRpbWVMb2NhdG9yCi0JICovCiAJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLnN1cHBvcnRzVHlwZShnZXRUeXBlSWRzKCksIGlkKTsKKwkJcmV0dXJuIFNlcnZlclBsdWdpbi5jb250YWlucyhnZXRUeXBlSWRzKCksIGlkKTsKIAl9CiAKIAlwcm90ZWN0ZWQgUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKQEAgLTYxLDcgKzUyLDcgQEAKIAkJCXRyeSB7CiAJCQkJZGVsZWdhdGUgPSAoUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwogCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gZGVsZWdhdGU7CkBAIC03OSwxMSArNzAsMTEgQEAKIAkJCQl9CiAJCQl9LCBtb25pdG9yKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7CiAJCX0KIAl9CiAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlyZXR1cm4gIlJ1bnRpbWVMb2NhdG9yWyIgKyBnZXRJZCgpICsgIl0iOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZVR5cGUuamF2YQppbmRleCBjNzRmMjhiLi5kMWQxZGVmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVUeXBlLmphdmEKQEAgLTIyLDcgKzIyLDcgQEAKICAqLwogcHVibGljIGNsYXNzIFJ1bnRpbWVUeXBlIGltcGxlbWVudHMgSVJ1bnRpbWVUeXBlIHsKIAlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgTGlzdCBtb2R1bGVUeXBlczsKKwlwcml2YXRlIExpc3Q8SU1vZHVsZVR5cGU+IG1vZHVsZVR5cGVzOwogCiAJcHVibGljIFJ1bnRpbWVUeXBlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CiAJCXN1cGVyKCk7CkBAIC0xNDMsNiArMTQzLDcgQEAKIAkJCXJldHVybiBudWxsOwogCQkKIAkJUnVudGltZVdvcmtpbmdDb3B5IHJ3YyA9IG5ldyBSdW50aW1lV29ya2luZ0NvcHkobnVsbCwgaWQsIHRoaXMpOworCQlTZXJ2ZXJVdGlsLnNldFJ1bnRpbWVEZWZhdWx0TmFtZShyd2MpOwogCQlyd2Muc2V0RGVmYXVsdHMobW9uaXRvcik7CiAJCXJldHVybiByd2M7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZVdvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lV29ya2luZ0NvcHkuamF2YQppbmRleCAyOTY4ZjJkLi5mOTMwNTFhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lV29ya2luZ0NvcHkuamF2YQpAQCAtMjksNyArMjksNiBAQAogICogCiAgKi8KIHB1YmxpYyBjbGFzcyBSdW50aW1lV29ya2luZ0NvcHkgZXh0ZW5kcyBSdW50aW1lIGltcGxlbWVudHMgSVJ1bnRpbWVXb3JraW5nQ29weSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBQUk9QX0lEX1NFVCA9ICJpZC1zZXQiOwogCXByb3RlY3RlZCBSdW50aW1lIHJ1bnRpbWU7CiAJcHJvdGVjdGVkIFdvcmtpbmdDb3B5SGVscGVyIHdjaDsKIAkKQEAgLTQ2LDEwICs0NSwxMCBAQAogCQkKIAkJcnVudGltZVR5cGUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCk7CiAJCQotCQltYXAgPSBuZXcgSGFzaE1hcChydW50aW1lLm1hcCk7CisJCW1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PihydW50aW1lLm1hcCk7CiAJCXdjaCA9IG5ldyBXb3JraW5nQ29weUhlbHBlcih0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBDcmVhdGUgYSBuZXcgcnVudGltZSB3b3JraW5nIGNvcHkgZm9yIGEgbmV3IHJ1bnRpbWUuCiAJICogCkBAIC02MSwxNCArNjAsNiBAQAogCQlzdXBlcihmaWxlLCBpZCwgcnVudGltZVR5cGUpOwogCQl3Y2ggPSBuZXcgV29ya2luZ0NvcHlIZWxwZXIodGhpcyk7CiAJCXdjaC5zZXREaXJ0eSh0cnVlKTsKLQkJCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApIHsKLQkJCWlkID0gU2VydmVyUGx1Z2luLmdlbmVyYXRlSWQoKTsKLQkJCW1hcC5wdXQoUFJPUF9JRCwgaWQpOwotCQl9IGVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgdHJ1ZSk7Ci0JCQotCQkvLyB0aHJvdyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBpZCBhbHJlYWR5IGV4aXN0cwogCX0KIAogCS8qKgpAQCAtOTIsMTIgKzgzLDEyIEBACiAJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIHZhbHVlKSB7CiAJCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHZhbHVlKSB7CiAJCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwogCX0KIAotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCB2YWx1ZSkgeworCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdDxTdHJpbmc+IHZhbHVlKSB7CiAJCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwogCX0KIApAQCAtMTE4LDcgKzEwOSw3IEBACiAJcHVibGljIHZvaWQgc2V0VGVzdEVudmlyb25tZW50KGJvb2xlYW4gYikgewogCQlzZXRBdHRyaWJ1dGUoUFJPUF9URVNUX0VOVklST05NRU5ULCBiKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElSdW50aW1lV29ya2luZ0NvcHkjc2V0U3R1Yihib29sZWFuKQogCSAqLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXIuamF2YQppbmRleCBhNjYxOWRlLi4wYzAzOTZkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwxNSArMTQsMTIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLio7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7CisKIC8qKgogICogCiAgKi8KQEAgLTM2LDcgKzMzLDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NFUlZFUl9JRCA9ICJzZXJ2ZXItaWQiOwogCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMaXN0IEVNUFRZX0xJU1QgPSBuZXcgQXJyYXlMaXN0KDApOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEVNUFRZX0xJU1QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCk7CiAKIAkvKioKIAkgKiBGaWxlIGV4dGVuc2lvbiAodmFsdWUgInNlcnZlciIpIGZvciBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIG9mCkBAIC01Miw5ICs0OSw4IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFRFTlNJT04gPSAic2VydmVyIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fUFVCTElTSF9ERUZBVUxUID0gMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX1BVQkxJU0hfRElTQUJMRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19QVUJMSVNIX09WRVJSSURFID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX1BVQkxJU0hfRU5BQkxFID0gMjsKIAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSE9TVE5BTUUgPSAiaG9zdG5hbWUiOwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9JRCA9ICJzZXJ2ZXItaWQiOwpAQCAtNjMsOCArNTksMTEgQEAKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTElTVCA9ICJtb2R1bGVzIjsKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RJU0FCTEVEX1BFUkZFUlJFRF9UQVNLUyA9ICJkaXNhYmxlZC1wcmVmZXJyZWQtcHVibGlzaC10YXNrcyI7CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9FTkFCTEVEX09QVElPTkFMX1RBU0tTID0gImVuYWJsZWQtb3B0aW9uYWwtcHVibGlzaC10YXNrcyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QVUJMSVNIRVJTID0gInB1Ymxpc2hlcnMiOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19QVUJMSVNIX1RJTUUgPSAiYXV0by1wdWJsaXNoLXRpbWUiOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19QVUJMSVNIX1NFVFRJTkcgPSAiYXV0by1wdWJsaXNoLXNldHRpbmciOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU1RBUlRfVElNRU9VVCA9ICJzdGFydC10aW1lb3V0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NUT1BfVElNRU9VVCA9ICJzdG9wLXRpbWVvdXQiOwkKIAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhcltdIElOVkFMSURfQ0hBUlMgPSBuZXcgY2hhcltdIHsnXFwnLCAnLycsICc6JywgJyonLCAnPycsICciJywgJzwnLCAnPicsICd8JywgJ1wwJywgJ0AnLCAnJid9OwogCkBAIC03NiwxMCArNzUsMTAgQEAKIAlwcm90ZWN0ZWQgSUZvbGRlciBjb25maWd1cmF0aW9uOwogCiAJLy8gdGhlIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGFyZSB0byBiZSBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlcgotCXByb3RlY3RlZCBMaXN0IG1vZHVsZXM7CisJcHJvdGVjdGVkIExpc3Q8SU1vZHVsZT4gbW9kdWxlczsKIAogCS8vIHRoZSBsaXN0IG9mIGV4dGVybmFsIG1vZHVsZXMKLQlwcm90ZWN0ZWQgTGlzdCBleHRlcm5hbE1vZHVsZXM7CisJcHJvdGVjdGVkIExpc3Q8SU1vZHVsZT4gZXh0ZXJuYWxNb2R1bGVzOwogCiAJLy8gdHJhbnNpZW50IGZpZWxkcwogCXByb3RlY3RlZCB0cmFuc2llbnQgU3RyaW5nIG1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKQEAgLTg3LDI1ICs4NiwzMCBAQAogCXByb3RlY3RlZCB0cmFuc2llbnQgaW50IHNlcnZlclN5bmNTdGF0ZTsKIAlwcm90ZWN0ZWQgdHJhbnNpZW50IGJvb2xlYW4gc2VydmVyUmVzdGFydE5lZWRlZDsKIAotCXByb3RlY3RlZCB0cmFuc2llbnQgTWFwIG1vZHVsZVN0YXRlID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcCBtb2R1bGVQdWJsaXNoU3RhdGUgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCB0cmFuc2llbnQgTWFwIG1vZHVsZVJlc3RhcnRTdGF0ZSA9IG5ldyBIYXNoTWFwKCk7CisJcHJvdGVjdGVkIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtb2R1bGVTdGF0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKwlwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcDxTdHJpbmcsIEludGVnZXI+IG1vZHVsZVB1Ymxpc2hTdGF0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKwlwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1vZHVsZVJlc3RhcnRTdGF0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKIAogCXByb3RlY3RlZCB0cmFuc2llbnQgSVN0YXR1cyBzZXJ2ZXJTdGF0dXM7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBNYXAgbW9kdWxlU3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKKwlwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcDxTdHJpbmcsIElTdGF0dXM+IG1vZHVsZVN0YXR1cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVN0YXR1cz4oKTsKIAogCXByb3RlY3RlZCB0cmFuc2llbnQgU2VydmVyUHVibGlzaEluZm8gcHVibGlzaEluZm87CiAJcHJvdGVjdGVkIHRyYW5zaWVudCBBdXRvUHVibGlzaFRocmVhZCBhdXRvUHVibGlzaFRocmVhZDsKIAorCS8qKgorCSAqIFRoZSBtb3N0IHJlY2VudCBsYXVuY2ggdXNlZCB0byBzdGFydCB0aGUgc2VydmVyLgorCSAqLworCXByb3RlY3RlZCB0cmFuc2llbnQgSUxhdW5jaCBsYXVuY2g7CisKIC8qCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0YXRlU3RyaW5ncyA9IG5ldyBTdHJpbmdbXSB7CiAJCSJ1bmtub3duIiwgInN0YXJ0aW5nIiwgInN0YXJ0ZWQiLCAic3RhcnRlZF9kZWJ1ZyIsCiAJCSJzdG9wcGluZyIsICJzdG9wcGVkIiwgInN0YXJ0ZWRfdW5zdXBwb3J0ZWQiLCAic3RhcnRlZF9wcm9maWxlIgogCX07Ki8KIAogCS8vIHB1Ymxpc2ggbGlzdGVuZXJzCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBMaXN0IHB1Ymxpc2hMaXN0ZW5lcnM7CisJcHJvdGVjdGVkIHRyYW5zaWVudCBMaXN0PElQdWJsaXNoTGlzdGVuZXI+IHB1Ymxpc2hMaXN0ZW5lcnM7CiAKLQkvLyBTZXJ2ZXIgbGlzdGVuZXJzCisJLy8gc2VydmVyIGxpc3RlbmVycwogCXByb3RlY3RlZCB0cmFuc2llbnQgU2VydmVyTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyOwogCiAJcHVibGljIGNsYXNzIEF1dG9QdWJsaXNoVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKQEAgLTEzNSwzNiArMTM5LDQzIEBACiAJCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCiAJCQkJcmV0dXJuOwogCQkJCi0JCQlQdWJsaXNoU2VydmVySm9iIHB1Ymxpc2hKb2IgPSBuZXcgUHVibGlzaFNlcnZlckpvYihTZXJ2ZXIudGhpcywgSVNlcnZlci5QVUJMSVNIX0FVVE8sIGZhbHNlKTsKLQkJCXB1Ymxpc2hKb2Iuc2NoZWR1bGUoKTsKKwkJCXB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0FVVE8sIG51bGwsIG51bGwsIG51bGwpOwogCQl9CiAJfQogCi0JcHVibGljIGNsYXNzIFJlc291cmNlQ2hhbmdlSm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7CisJcHVibGljIGNsYXNzIFJlc291cmNlQ2hhbmdlSm9iIGV4dGVuZHMgSm9iIHsKIAkJcHJpdmF0ZSBJTW9kdWxlIG1vZHVsZTsKIAotCQlwdWJsaWMgUmVzb3VyY2VDaGFuZ2VKb2IoSU1vZHVsZSBtb2R1bGUsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JVcGRhdGVTZXJ2ZXIsIHNlcnZlci5nZXROYW1lKCkpLCBzZXJ2ZXIpOworCQlwdWJsaWMgUmVzb3VyY2VDaGFuZ2VKb2IoSU1vZHVsZSBtb2R1bGUpIHsKKwkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlVwZGF0ZVNlcnZlciwgU2VydmVyLnRoaXMuZ2V0TmFtZSgpKSk7CiAJCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKIAkJCQogCQkJaWYgKG1vZHVsZS5nZXRQcm9qZWN0KCkgPT0gbnVsbCkKLQkJCQlzZXRSdWxlKG5ldyBTZXJ2ZXJTY2hlZHVsaW5nUnVsZShzZXJ2ZXIpKTsKKwkJCQlzZXRSdWxlKFNlcnZlci50aGlzKTsKIAkJCWVsc2UgewogCQkJCUlTY2hlZHVsaW5nUnVsZVtdIHJ1bGVzID0gbmV3IElTY2hlZHVsaW5nUnVsZVsyXTsKIAkJCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwogCQkJCXJ1bGVzWzBdID0gcnVsZUZhY3RvcnkuY3JlYXRlUnVsZShtb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQkJCQlydWxlc1sxXSA9IG5ldyBTZXJ2ZXJTY2hlZHVsaW5nUnVsZShzZXJ2ZXIpOworCQkJCXJ1bGVzWzFdID0gU2VydmVyLnRoaXM7CiAJCQkJc2V0UnVsZShNdWx0aVJ1bGUuY29tYmluZShydWxlcykpOwogCQkJfQogCQl9CiAKKwkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKKwkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOworCQl9CisKKwkJcHJvdGVjdGVkIElTZXJ2ZXIgZ2V0U2VydmVyKCkgeworCQkJcmV0dXJuIFNlcnZlci50aGlzOworCQl9CisKIAkJcHJvdGVjdGVkIElNb2R1bGUgZ2V0TW9kdWxlKCkgewogCQkJcmV0dXJuIG1vZHVsZTsKIAkJfQogCiAJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJCWZpbmFsIGJvb2xlYW5bXSBjaGFuZ2VkID0gbmV3IGJvb2xlYW5bMV07Ci0JCQlmaW5hbCBMaXN0IG1vZHVsZXMyID0gbmV3IEFycmF5TGlzdCgpOworCQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXMyID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7CiAJCQkKIAkJCUlNb2R1bGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSU1vZHVsZVZpc2l0b3IoKSB7CiAJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZTIpIHsKQEAgLTIwMiwxMSArMjEzLDEzNSBAQAogCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJCX0KIAl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBQVUJMSVNIX09QRVJBVElPTl9DT01QQVJUT1IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbGVmdE9wLCBPYmplY3QgcmlnaHRPcCkgewotICAgICAgICAgIFB1Ymxpc2hPcGVyYXRpb24gbGVmdCA9IChQdWJsaXNoT3BlcmF0aW9uKSBsZWZ0T3A7Ci0gICAgICAgICAgUHVibGlzaE9wZXJhdGlvbiByaWdodCA9IChQdWJsaXNoT3BlcmF0aW9uKSByaWdodE9wOworCisJcHVibGljIGNsYXNzIFB1Ymxpc2hKb2IgZXh0ZW5kcyBKb2IgeworCQlwcm90ZWN0ZWQgaW50IGtpbmQ7CisJCXByb3RlY3RlZCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlczQ7CisJCXByb3RlY3RlZCBJQWRhcHRhYmxlIGluZm87CisJCXByb3RlY3RlZCBib29sZWFuIHN0YXJ0OworCisJCS8qKgorCQkgKiBDcmVhdGUgYSBuZXcgcHVibGlzaGluZyBqb2IuCisJCSAqIAorCQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoCisJCSAqIEBwYXJhbSBtb2R1bGVzNCBhIGxpc3Qgb2YgbW9kdWxlcyB0byBwdWJsaXNoLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bworCQkgKiAgICBwdWJsaXNoIGFsbCBtb2R1bGVzCisJCSAqIEBwYXJhbSBzdGFydCB0cnVlIGlmIHdlIG5lZWQgdG8gc3RhcnQgdGhlIHNlcnZlciBmaXJzdAorCQkgKiBAcGFyYW0gaW5mbyB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQorCQkgKiAgICBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5IFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlCisJCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAorCQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKKwkJICogICAgZm9yIHRoZSBTaGVsbCBjbGFzcy4KKwkJICovCisJCXB1YmxpYyBQdWJsaXNoSm9iKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlczQsIGJvb2xlYW4gc3RhcnQsIElBZGFwdGFibGUgaW5mbykgeworCQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZywgU2VydmVyLnRoaXMuZ2V0TmFtZSgpKSk7CisJCQl0aGlzLmtpbmQgPSBraW5kOworCQkJdGhpcy5tb2R1bGVzNCA9IG1vZHVsZXM0OworCQkJdGhpcy5zdGFydCA9IHN0YXJ0OworCQkJdGhpcy5pbmZvID0gaW5mbzsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7CisJCQlyZXR1cm4gU2VydmVyVXRpbC5TRVJWRVJfSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKKwkJfQorCisJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCWlmIChzdGFydCkgeworCQkJCXRyeXsKKwkJCQkJLy8gMjM3MjIyIC0gQXBwbHkgdGhlIHJ1bGVzIG9ubHkgd2hlbiB0aGUgam9iIGhhcyBzdGFydGVkCisJCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuYmVnaW5SdWxlKFNlcnZlci50aGlzLCBtb25pdG9yKTsKKwkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzdGFydEltcGwoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG1vbml0b3IpOworCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKKwkJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJfQorCQkJCWZpbmFsbHl7CisJCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuZW5kUnVsZShTZXJ2ZXIudGhpcyk7CisJCQkJfQorCQkJfQorCQkJCisJCQkvLyAxMDIyMjcgLSBsb2NrIGVudGlyZSB3b3Jrc3BhY2UgZHVyaW5nIHB1Ymxpc2gKKwkJCUlTY2hlZHVsaW5nUnVsZSBwdWJsaXNoUnVsZSA9IE11bHRpUnVsZS5jb21iaW5lKG5ldyBJU2NoZWR1bGluZ1J1bGVbXSB7CisJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgU2VydmVyLnRoaXMKKwkJCX0pOworCQkJCisJCQl0cnl7CisJCQkJLy8gMjM3MjIyIC0gQXBwbHkgdGhlIHJ1bGVzIG9ubHkgd2hlbiB0aGUgam9iIGhhcyBzdGFydGVkCisJCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5iZWdpblJ1bGUocHVibGlzaFJ1bGUsIG1vbml0b3IpOwkKKwkJCQlyZXR1cm4gcHVibGlzaEltcGwoa2luZCwgbW9kdWxlczQsIGluZm8sIG1vbml0b3IpOworCQkJfSBmaW5hbGx5IHsKKwkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmVuZFJ1bGUocHVibGlzaFJ1bGUpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIGNsYXNzIFN0YXJ0Sm9iIGV4dGVuZHMgSm9iIHsKKwkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIFBVQkxJU0hfTk9ORSA9IDA7CisJCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBQVUJMSVNIX0JFRk9SRSA9IDE7CisJCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBQVUJMSVNIX0FGVEVSID0gMjsKKworCQlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGU7CisKKwkJcHVibGljIFN0YXJ0Sm9iKFN0cmluZyBsYXVuY2hNb2RlKSB7CisJCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JTdGFydGluZ1NlcnZlciwgU2VydmVyLnRoaXMuZ2V0TmFtZSgpKSk7CisJCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOworCQkJCisJCQlzZXRSdWxlKFNlcnZlci50aGlzKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7CisJCQlyZXR1cm4gU2VydmVyVXRpbC5TRVJWRVJfSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKKwkJfQorCisJCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKKwkJCXJldHVybiBTZXJ2ZXIudGhpczsKKwkJfQorCisJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCUlTdGF0dXMgc3RhdCA9IHN0YXJ0SW1wbChsYXVuY2hNb2RlLCBtb25pdG9yKTsKKwkJCXJldHVybiBzdGF0OworCQl9CisJfQorCisJcHVibGljIGNsYXNzIFJlc3RhcnRKb2IgZXh0ZW5kcyBKb2IgeworCQlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGU7CisKKwkJcHVibGljIFJlc3RhcnRKb2IoU3RyaW5nIGxhdW5jaE1vZGUpIHsKKwkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlJlc3RhcnRpbmdTZXJ2ZXIsIFNlcnZlci50aGlzLmdldE5hbWUoKSkpOworCQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKKwkJCXNldFJ1bGUoU2VydmVyLnRoaXMpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKKwkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOworCQl9CisKKwkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJcmV0dXJuIHJlc3RhcnRJbXBsKGxhdW5jaE1vZGUsIG1vbml0b3IpOworCQl9CisJfQorCisJcHVibGljIGNsYXNzIFN0b3BKb2IgZXh0ZW5kcyBKb2IgeworCQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JjZTsKKworCQlwdWJsaWMgU3RvcEpvYihib29sZWFuIGZvcmNlKSB7CisJCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JTdG9wcGluZ1NlcnZlciwgU2VydmVyLnRoaXMuZ2V0TmFtZSgpKSk7CisJCQlzZXRSdWxlKFNlcnZlci50aGlzKTsKKwkJCXRoaXMuZm9yY2UgPSBmb3JjZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7CisJCQlyZXR1cm4gU2VydmVyVXRpbC5TRVJWRVJfSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKKwkJfQorCisJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCXJldHVybiBzdG9wSW1wbChmb3JjZSwgbW9uaXRvcik7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFB1Ymxpc2hPcGVyYXRpb24+IFBVQkxJU0hfT1BFUkFUSU9OX0NPTVBBUlRPUiA9IG5ldyBDb21wYXJhdG9yPFB1Ymxpc2hPcGVyYXRpb24+KCkgeworICAgICAgcHVibGljIGludCBjb21wYXJlKFB1Ymxpc2hPcGVyYXRpb24gbGVmdE9wLCBQdWJsaXNoT3BlcmF0aW9uIHJpZ2h0T3ApIHsKKyAgICAgICAgICBQdWJsaXNoT3BlcmF0aW9uIGxlZnQgPSBsZWZ0T3A7CisgICAgICAgICAgUHVibGlzaE9wZXJhdGlvbiByaWdodCA9IHJpZ2h0T3A7CiAgICAgICAgICAgaWYgKGxlZnQuZ2V0T3JkZXIoKSA+IHJpZ2h0LmdldE9yZGVyKCkpCiAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgIGlmIChsZWZ0LmdldE9yZGVyKCkgPCByaWdodC5nZXRPcmRlcigpKQpAQCAtMjI4LDYgKzM2Myw4IEBACiAJCXRoaXMuc2VydmVyVHlwZSA9IHNlcnZlclR5cGU7CiAJCW1hcC5wdXQoInNlcnZlci10eXBlLWlkIiwgc2VydmVyVHlwZS5nZXRJZCgpKTsKIAkJbWFwLnB1dChQUk9QX0hPU1ROQU1FLCAibG9jYWxob3N0Iik7CisJCW1hcC5wdXQoUFJPUF9TVEFSVF9USU1FT1VULCAoKFNlcnZlclR5cGUpc2VydmVyVHlwZSkuZ2V0U3RhcnRUaW1lb3V0KCkvMTAwMCArICIiKTsKKwkJbWFwLnB1dChQUk9QX1NUT1BfVElNRU9VVCwgKChTZXJ2ZXJUeXBlKXNlcnZlclR5cGUpLmdldFN0b3BUaW1lb3V0KCkvMTAwMCArICIiKTsKIAkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCkgewogCQkJU3RyaW5nIG5hbWUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpOwogCQkJbWFwLnB1dChQUk9QX05BTUUsIG5hbWUpOwpAQCAtMjU2LDYgKzM5MywxMSBAQAogCQlSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVTZXJ2ZXIodGhpcyk7CiAJfQogCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlzdXBlci5kb1NhdmUobW9uaXRvcik7CisJCWZpcmVTZXJ2ZXJDaGFuZ2VFdmVudCgpOworCX0KKwogCXByb3RlY3RlZCB2b2lkIHNhdmVUb0ZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCXN1cGVyLnNhdmVUb0ZpbGUobW9uaXRvcik7CiAJCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFNlcnZlcih0aGlzKTsKQEAgLTI5MywxMCArNDM1LDExIEBACiAJCQkJdHJ5IHsKIAkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAJCQkJCWRlbGVnYXRlID0gKChTZXJ2ZXJUeXBlKSBzZXJ2ZXJUeXBlKS5jcmVhdGVTZXJ2ZXJEZWxlZ2F0ZSgpOwotCQkJCQlJbnRlcm5hbEluaXRpYWxpemVyLmluaXRpYWxpemVTZXJ2ZXJEZWxlZ2F0ZShkZWxlZ2F0ZSwgU2VydmVyLnRoaXMsIG1vbml0b3IpOworCQkJCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkKKwkJCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZVNlcnZlckRlbGVnYXRlKGRlbGVnYXRlLCBTZXJ2ZXIudGhpcywgbW9uaXRvcik7CiAJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiU2VydmVyLmdldERlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwogCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOworCQkJCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCB0KTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTMxMiwxMyArNDU1LDE0IEBACiAJCQkJdHJ5IHsKIAkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAJCQkJCWJlaGF2aW91ckRlbGVnYXRlID0gKChTZXJ2ZXJUeXBlKSBzZXJ2ZXJUeXBlKS5jcmVhdGVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSgpOwotCQkJCQlJbnRlcm5hbEluaXRpYWxpemVyLmluaXRpYWxpemVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZShiZWhhdmlvdXJEZWxlZ2F0ZSwgU2VydmVyLnRoaXMsIG1vbml0b3IpOworCQkJCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkKKwkJCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZVNlcnZlckJlaGF2aW91ckRlbGVnYXRlKGJlaGF2aW91ckRlbGVnYXRlLCBTZXJ2ZXIudGhpcywgbW9uaXRvcik7CiAJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiU2VydmVyLmdldEJlaGF2aW91ckRlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwogCQkJCQkKIAkJCQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKQogCQkJCQkJYXV0b1B1Ymxpc2goKTsKIAkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGJlaGF2aW91ciBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgdCk7CisJCQkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIHQpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMzQxLDExICs0ODUsMTkgQEAKIAl9CiAKIAlwdWJsaWMgaW50IGdldEF1dG9QdWJsaXNoVGltZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX0FVVE9fUFVCTElTSF9USU1FLCAtMSk7CisJCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9BVVRPX1BVQkxJU0hfVElNRSwgMTUpOwogCX0KIAogCXB1YmxpYyBpbnQgZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfQVVUT19QVUJMSVNIX1NFVFRJTkcsIEFVVE9fUFVCTElTSF9ERUZBVUxUKTsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX0FVVE9fUFVCTElTSF9TRVRUSU5HLCBBVVRPX1BVQkxJU0hfRU5BQkxFKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFN0YXJ0VGltZW91dCgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1NUQVJUX1RJTUVPVVQsICgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLmdldFN0YXJ0VGltZW91dCgpLzEwMDApOworCX0KKworCXB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXQoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9TVE9QX1RJTUVPVVQsICgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLmdldFN0b3BUaW1lb3V0KCkvMTAwMCk7CiAJfQogCiAJLyoqCkBAIC0zNTQsNyArNTA2LDcgQEAKICAgICAqIAogICAgICogQHJldHVybiBhIGxpc3Qgb2YgcHVibGlzaCBvcGVyYXRpb24gaWRzCiAgICAgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNhYmxlZFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25JZHMoKSB7CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXREaXNhYmxlZFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25JZHMoKSB7CiAJCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9ESVNBQkxFRF9QRVJGRVJSRURfVEFTS1MsIEVNUFRZX0xJU1QpOwkJCiAJfQogCkBAIC0zNjQsMTEgKzUxNiw0MiBAQAogICAgICogCiAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBwdWJsaXNoIG9wZXJhdGlvbiBpZHMKICAgICAqLwotCXB1YmxpYyBMaXN0IGdldEVuYWJsZWRPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25JZHMoKSB7CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFbmFibGVkT3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9uSWRzKCkgewogCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUywgRU1QVFlfTElTVCk7CiAJfQogCiAJLyoqCisgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBpZCAoU3RyaW5nKSBvZiBwdWJsaXNoZXJzIGFuZCBzdGF0ZSAodHJ1ZSBvciBmYWxzZSkuCisgICAgKiAKKyAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHB1Ymxpc2hlcnMKKyAgICAqLworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHVibGlzaGVySWRzKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfUFVCTElTSEVSUywgRU1QVFlfTElTVCk7CQkKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hlckVuYWJsZWQoUHVibGlzaGVyIHB1YikgeworCQlpZiAocHViID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQkvLyBjaGVjayBmb3IgZXhpc3RpbmcgZW5hYmxlbWVudAorCQlMaXN0PFN0cmluZz4gbGlzdCA9IGdldEF0dHJpYnV0ZShQUk9QX1BVQkxJU0hFUlMsIEVNUFRZX0xJU1QpOworCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJU3RyaW5nIGlkID0gaXRlci5uZXh0KCk7CisJCQlpbnQgaW5kID0gaWQuaW5kZXhPZigiOiIpOworCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7CisJCQlpZiAoInRydWUiLmVxdWFscyhpZC5zdWJzdHJpbmcoaW5kKzEpKSkKKwkJCQllbmFibGVkID0gdHJ1ZTsKKwkJCWlkID0gaWQuc3Vic3RyaW5nKDAsIGluZCk7CisJCQlpZiAocHViLmdldElkKCkuZXF1YWxzKGlkKSkKKwkJCQlyZXR1cm4gZW5hYmxlZDsKKwkJfQorCQkKKwkJLy8gb3RoZXJ3aXNlIHVzZSB0aGUgZGVmYXVsdCBlbmFibGVtZW50CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNlcnZlci4gKHNlZSBTRVJWRVJfWFhYIGNvbnN0YW50cykKIAkgKgogCSAqIEByZXR1cm4gaW50CkBAIC0zODQsNyArNTY3LDExIEBACiAJcHVibGljIHZvaWQgc2V0U2VydmVyU3RhdGUoaW50IHN0YXRlKSB7CiAJCWlmIChzdGF0ZSA9PSBzZXJ2ZXJTdGF0ZSkKIAkJCXJldHVybjsKLQorCQkKKwkJLy8gZW5zdXJlIHRoYXQgYW55IHNlcnZlciBtb25pdG9ycyBhcmUgc3RhcnRlZAorCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKQorCQkJU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwkJCiAJCXRoaXMuc2VydmVyU3RhdGUgPSBzdGF0ZTsKIAkJZmlyZVNlcnZlclN0YXRlQ2hhbmdlRXZlbnQoKTsKIAl9CkBAIC00MjUsMTQgKzYxMiwxNCBAQAogCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICJSZW1vdmluZyBzZXJ2ZXIgbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiBmcm9tICIgKyB0aGlzKTsKIAkJZ2V0U2VydmVyTm90aWZpY2F0aW9uTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBGaXJlIGEgc2VydmVyIGxpc3RlbmVyIHJlc3RhcnQgc3RhdGUgY2hhbmdlIGV2ZW50LgogCSAqLwogCXByb3RlY3RlZCB2b2lkIGZpcmVSZXN0YXJ0U3RhdGVDaGFuZ2VFdmVudCgpIHsKIAkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLT4tIEZpcmluZyBzZXJ2ZXIgcmVzdGFydCBjaGFuZ2UgZXZlbnQ6ICIgKyBnZXROYW1lKCkgKyAiIC0+LSIpOwogCQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc0xpc3RlbmVyRW50cmllcygpKQorCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTm9MaXN0ZW5lcnMoKSkKIAkJCXJldHVybjsKIAkJCiAJCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKApAQCAtNDQ1LDIyICs2MzIsMzYgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VydmVyU3RhdGVDaGFuZ2VFdmVudCgpIHsKIAkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLT4tIEZpcmluZyBzZXJ2ZXIgc3RhdGUgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldFNlcnZlclN0YXRlKCkgKyAiIC0+LSIpOwotCQotCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTGlzdGVuZXJFbnRyaWVzKCkpCisJCQorCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTm9MaXN0ZW5lcnMoKSkKIAkJCXJldHVybjsKLQkKKwkJCiAJCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKAogCQkJbmV3IFNlcnZlckV2ZW50KFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UsIHRoaXMsIGdldFNlcnZlclN0YXRlKCksIAogCQkJCWdldFNlcnZlclB1Ymxpc2hTdGF0ZSgpLCBnZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkpOwogCX0KIAogCS8qKgorCSAqIEZpcmUgYSBzZXJ2ZXIgbGlzdGVuZXIgY2hhbmdlIGV2ZW50LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGZpcmVTZXJ2ZXJDaGFuZ2VFdmVudCgpIHsKKwkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLT4tIEZpcmluZyBzZXJ2ZXIgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldFNlcnZlclN0YXRlKCkgKyAiIC0+LSIpOworCQkKKwkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCisJCQlyZXR1cm47CisJCQorCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKKwkJCW5ldyBTZXJ2ZXJFdmVudChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFLCB0aGlzLCBnZXRTZXJ2ZXJTdGF0ZSgpLCAKKwkJCQlnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSwgZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkpKTsKKwl9CisKKwkvKioKIAkgKiBGaXJlIGEgc2VydmVyIGxpc3RlbmVyIG1vZHVsZSBzdGF0ZSBjaGFuZ2UgZXZlbnQuCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgZmlyZU1vZHVsZVN0YXRlQ2hhbmdlRXZlbnQoSU1vZHVsZVtdIG1vZHVsZSkgewogCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPi0gRmlyaW5nIG1vZHVsZSBzdGF0ZSBjaGFuZ2UgZXZlbnQ6ICIgKyBnZXROYW1lKCkgKyAiLCAiICsgZ2V0U2VydmVyU3RhdGUoKSArICIgLT4tIik7CiAJCQotCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTGlzdGVuZXJFbnRyaWVzKCkpCisJCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNOb0xpc3RlbmVycygpKQogCQkJcmV0dXJuOwogCQkKIAkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCkBAIC00NzQsNyArNjc1LDcgQEAKIAlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kdWxlUHVibGlzaFN0YXRlQ2hhbmdlRXZlbnQoSU1vZHVsZVtdIG1vZHVsZSkgewogCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPi0gRmlyaW5nIG1vZHVsZSBwdWJsaXNoIHN0YXRlIGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIsICIgKyBnZXRTZXJ2ZXJTdGF0ZSgpICsgIiAtPi0iKTsKIAkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNMaXN0ZW5lckVudHJpZXMoKSkKKwkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCiAJCQlyZXR1cm47CiAJCQogCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKQEAgLTQ4OCw3ICs2ODksNyBAQAogCXByb3RlY3RlZCB2b2lkIGZpcmVNb2R1bGVSZXN0YXJ0Q2hhbmdlRXZlbnQoSU1vZHVsZVtdIG1vZHVsZSkgewogCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPi0gRmlyaW5nIG1vZHVsZSByZXN0YXJ0IGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIsICIgKyBnZXRTZXJ2ZXJTdGF0ZSgpICsgIiAtPi0iKTsKIAkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNMaXN0ZW5lckVudHJpZXMoKSkKKwkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCiAJCQlyZXR1cm47CiAJCQogCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKQEAgLTUzOCwxMiArNzM5LDEyIEBACiAJCQlyZXR1cm47CiAJCQogCQlCb29sZWFuIGIgPSBuZXcgQm9vbGVhbihyKTsKLQkJbW9kdWxlU3RhdGUucHV0KGdldEtleShtb2R1bGUpLCBiKTsKKwkJbW9kdWxlUmVzdGFydFN0YXRlLnB1dChnZXRLZXkobW9kdWxlKSwgYik7CiAJCWZpcmVNb2R1bGVSZXN0YXJ0Q2hhbmdlRXZlbnQobW9kdWxlKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZXMpIHsKLQkJZXh0ZXJuYWxNb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOworCQlleHRlcm5hbE1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CiAJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKIAkJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKQEAgLTU1MSw3ICs3NTIsNyBAQAogCQl9CiAJfQogCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXh0ZXJuYWxNb2R1bGVzKCkgeworCXByb3RlY3RlZCBMaXN0PElNb2R1bGU+IGdldEV4dGVybmFsTW9kdWxlcygpIHsKIAkJcmV0dXJuIGV4dGVybmFsTW9kdWxlczsKICAJfQogCkBAIC01NzEsNyArNzcyLDcgQEAKIAkJCX0KIAkJfQogCQkKLQkJUmVzb3VyY2VDaGFuZ2VKb2Igam9iID0gbmV3IFJlc291cmNlQ2hhbmdlSm9iKG1vZHVsZSwgdGhpcyk7CisJCVJlc291cmNlQ2hhbmdlSm9iIGpvYiA9IG5ldyBSZXNvdXJjZUNoYW5nZUpvYihtb2R1bGUpOwogCQlqb2Iuc2V0U3lzdGVtKHRydWUpOwogCQlqb2Iuc2V0UHJpb3JpdHkoSm9iLkJVSUxEKTsKIAkJam9iLnNjaGVkdWxlKCk7CkBAIC01OTgsMzQgKzc5OSwzMCBAQAogCQlpZiAoZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCkgPT0gQVVUT19QVUJMSVNIX0RJU0FCTEUpCiAJCQlyZXR1cm47CiAJCQotCQlpbnQgdGltZSA9IDA7Ci0JCWlmIChnZXRBdXRvUHVibGlzaFNldHRpbmcoKSA9PSBBVVRPX1BVQkxJU0hfREVGQVVMVCkgewotCQkJU2VydmVyUHJlZmVyZW5jZXMgcHJlZiA9IFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCk7Ci0JCQlib29sZWFuIGxvY2FsID0gU29ja2V0VXRpbC5pc0xvY2FsaG9zdChnZXRIb3N0KCkpOwotCQkJaWYgKGxvY2FsICYmIHByZWYuZ2V0QXV0b1B1Ymxpc2hMb2NhbCgpKQotCQkJCXRpbWUgPSBwcmVmLmdldEF1dG9QdWJsaXNoTG9jYWxUaW1lKCk7Ci0JCQllbHNlIGlmICghbG9jYWwgJiYgcHJlZi5nZXRBdXRvUHVibGlzaFJlbW90ZSgpKQotCQkJCXRpbWUgPSBwcmVmLmdldEF1dG9QdWJsaXNoUmVtb3RlVGltZSgpOwotCQl9IGVsc2UKLQkJCXRpbWUgPSBnZXRBdXRvUHVibGlzaFRpbWUoKTsKLQkJCi0JCWlmICh0aW1lID4gMCkgeworCQlpbnQgdGltZSA9IGdldEF1dG9QdWJsaXNoVGltZSgpOworCQlpZiAodGltZSA+PSAwKSB7CiAJCQlhdXRvUHVibGlzaFRocmVhZCA9IG5ldyBBdXRvUHVibGlzaFRocmVhZCgpOwogCQkJYXV0b1B1Ymxpc2hUaHJlYWQudGltZSA9IHRpbWU7CiAJCQlhdXRvUHVibGlzaFRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZICsgMSk7CisJCQlhdXRvUHVibGlzaFRocmVhZC5zZXREYWVtb24odHJ1ZSk7CiAJCQlhdXRvUHVibGlzaFRocmVhZC5zdGFydCgpOwogCQl9CiAJfQogCisJLyoqCisJICogUmV0dXJucyB0aGUgZXZlbnQgbm90aWZpY2F0aW9uIG1hbmFnZXIuCisJICogCisJICogQHJldHVybiB0aGUgbm90aWZpY2F0aW9uIG1hbmFnZXIKKwkgKi8KIAlwcml2YXRlIFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIgZ2V0U2VydmVyTm90aWZpY2F0aW9uTWFuYWdlcigpIHsKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCkgeworCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKQogCQkJbm90aWZpY2F0aW9uTWFuYWdlciA9IG5ldyBTZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyKCk7Ci0JCX0KKwkJCiAJCXJldHVybiBub3RpZmljYXRpb25NYW5hZ2VyOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24ncyBzeW5jIHN0YXRlLgorCSAqIFJldHVybnMgdGhlIHNlcnZlcidzIHB1Ymxpc2ggc3luYyBzdGF0ZS4KIAkgKgogCSAqIEByZXR1cm4gaW50CiAJICovCkBAIC02MzQsNyArODMxLDcgQEAKIAl9CiAKIAkvKioKLQkgKiBTZXRzIHRoZSBjb25maWd1cmF0aW9uIHN5bmMgc3RhdGUuCisJICogU2V0cyB0aGUgc2VydmVyJ3MgcHVibGlzaCBzeW5jIHN0YXRlLgogCSAqCiAJICogQHBhcmFtIHN0YXRlIGludAogCSAqLwpAQCAtNjU2LDkgKzg1Myw5IEBACiAJCWlmIChsaXN0ZW5lciA9PSBudWxsKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKIAkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiQWRkaW5nIHB1Ymxpc2ggbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB0byAiICsgdGhpcyk7Ci0KKwkJCiAJCWlmIChwdWJsaXNoTGlzdGVuZXJzID09IG51bGwpCi0JCQlwdWJsaXNoTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworCQkJcHVibGlzaExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVB1Ymxpc2hMaXN0ZW5lcj4oKTsKIAkJcHVibGlzaExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwogCX0KIApAQCAtNjgxLDcgKzg3OCw3IEBACiAJLyoqCiAJICogRmlyZSBhIHB1Ymxpc2ggc3RhcnQgZXZlbnQuCiAJICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVQdWJsaXNoU3RhcnRlZCgpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHVibGlzaFN0YXJ0ZWQoKSB7CiAJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBGaXJpbmcgcHVibGlzaCBzdGFydGVkIGV2ZW50IC0+LSIpOwogCQogCQlpZiAocHVibGlzaExpc3RlbmVycyA9PSBudWxsIHx8IHB1Ymxpc2hMaXN0ZW5lcnMuaXNFbXB0eSgpKQpAQCAtNzA4LDcgKzkwNSw3IEBACiAJICoKIAkgKiBAcGFyYW0gc3RhdHVzIHB1Ymxpc2hpbmcgc3RhdHVzCiAJICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVQdWJsaXNoRmluaXNoZWQoSVN0YXR1cyBzdGF0dXMpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHVibGlzaEZpbmlzaGVkKElTdGF0dXMgc3RhdHVzKSB7CiAJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBGaXJpbmcgcHVibGlzaGluZyBmaW5pc2hlZCBldmVudDogIiArIHN0YXR1cyArICIgLT4tIik7CiAJCiAJCWlmIChwdWJsaXNoTGlzdGVuZXJzID09IG51bGwgfHwgcHVibGlzaExpc3RlbmVycy5pc0VtcHR5KCkpCkBAIC03MzYsNyArOTMzLDcgQEAKIAlwcm90ZWN0ZWQgdm9pZCBmaXJlUHVibGlzaFN0YXRlQ2hhbmdlKCkgewogCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gRmlyaW5nIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50IC0+LSIpOwogCQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc0xpc3RlbmVyRW50cmllcygpKQorCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTm9MaXN0ZW5lcnMoKSkKIAkJCXJldHVybjsKIAkJCiAJCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKApAQCAtNzUwLDcgKzk0Nyw3IEBACiAJcHJvdGVjdGVkIHZvaWQgZmlyZVB1Ymxpc2hTdGF0ZUNoYW5nZShJTW9kdWxlW10gbW9kdWxlKSB7CiAJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBGaXJpbmcgcHVibGlzaCBzdGF0ZSBjaGFuZ2UgZXZlbnQ6ICIgKyBtb2R1bGUgKyAiIC0+LSIpOwogCQotCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTGlzdGVuZXJFbnRyaWVzKCkpCisJCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNOb0xpc3RlbmVycygpKQogCQkJcmV0dXJuOwogCQogCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKQEAgLTc3Nyw2ICs5NzQsOSBAQAogCQlpZiAoZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBjb25maWd1cmF0aW9uID09IG51bGwpCiAJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hOb0NvbmZpZ3VyYXRpb24sIG51bGwpOwogCQkKKwkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpCisJCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGUuY2FuUHVibGlzaCgpOworCQkKIAkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJfQogCkBAIC04MDksNiArMTAwOSwyNiBAQAogCQlyZXR1cm4gcHVibGlzaFswXTsKIAl9CiAKKwlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hVbmtub3duKCkgeworCQlpZiAoZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkgIT0gUFVCTElTSF9TVEFURV9VTktOT1dOKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJZmluYWwgYm9vbGVhbltdIHB1Ymxpc2ggPSBuZXcgYm9vbGVhblsxXTsKKwkJcHVibGlzaFswXSA9IHRydWU7CisJCQorCQl2aXNpdChuZXcgSU1vZHVsZVZpc2l0b3IoKSB7CisJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlKSB7CisJCQkJaWYgKGdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpICE9IFBVQkxJU0hfU1RBVEVfVU5LTk9XTikgeworCQkJCQlwdWJsaXNoWzBdID0gZmFsc2U7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0sIG51bGwpOworCQkKKwkJcmV0dXJuIHB1Ymxpc2hbMF07CisJfQorCiAJLyoqCiAJICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHJlc3RhcnRlZC4gVGhpcyBpcyA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBzZXJ2ZXIKIAkgKiBjYW4gYmUgcmVzdGFydGVkIGFuZCB0aGUgc2VydmVyJ3MgcmVzdGFydCBzdGF0ZSBvciBhbnkgbW9kdWxlJ3MgcmVzdGFydCBzdGF0ZXMgaXMgbm90CkBAIC04NDksMTAgKzEwNjksMTAgQEAKIAkgKiBQdWJsaXNoIHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIHByb2dyZXNzIG1vbml0b3IuIFRoZSByZXN1bHQgb2YgdGhlCiAJICogcHVibGlzaCBvcGVyYXRpb24gaXMgcmV0dXJuZWQgYXMgYW4gSVN0YXR1cy4KIAkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwdWJsaXNoKGZpbmFsIGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwlwdWJsaWMgSVN0YXR1cyBwdWJsaXNoKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQogCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JNaXNzaW5nQWRhcHRlciwgbnVsbCk7Ci0KKwkJCiAJCS8vIGNoZWNrIHdoYXQgaXMgb3V0IG9mIHN5bmMgYW5kIHB1Ymxpc2gKIAkJaWYgKGdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgJiYgY29uZmlndXJhdGlvbiA9PSBudWxsKQogCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JOb0NvbmZpZ3VyYXRpb24sIG51bGwpOwpAQCAtODYxLDU1ICsxMDgxLDUxIEBACiAJCWxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBtb25pdG9yKTsKIAkJCiAJCWlmICgoKFNlcnZlclR5cGUpZ2V0U2VydmVyVHlwZSgpKS5zdGFydEJlZm9yZVB1Ymxpc2goKSAmJiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpKSB7Ci0JCQl0cnkgewotCQkJCXN5bmNocm9ub3VzU3RhcnQoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN0YXJ0aW5nIHNlcnZlciIsIGNlKTsKLQkJCQlyZXR1cm4gY2UuZ2V0U3RhdHVzKCk7Ci0JCQl9CisJCQlJU3RhdHVzIHN0YXR1cyA9IHN0YXJ0SW1wbChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbW9uaXRvcik7CisJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKKwkJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAJCQotCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJZmlyZVB1Ymxpc2hTdGFydGVkKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gZG9QdWJsaXNoKGtpbmQsIG1vbml0b3IpOwotCQlmaXJlUHVibGlzaEZpbmlzaGVkKHN0YXR1cyk7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiU2VydmVyLnB1Ymxpc2goKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICI+ICIgKyBnZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0JCXJldHVybiBzdGF0dXM7CisJCXJldHVybiBwdWJsaXNoSW1wbChraW5kLCBudWxsLCBudWxsLCBtb25pdG9yKTsKIAl9CiAKLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1B1Ymxpc2goaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItLT4tLSBQdWJsaXNoaW5nIHRvIHNlcnZlcjogIiArIHRvU3RyaW5nKCkgKyAiIC0tPi0tIik7Ci0JCQotCQlzdG9wQXV0b1B1Ymxpc2goKTsKLQkJCi0JCXRyeSB7Ci0JCQlnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLnN0YXJ0Q2FjaGluZygpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yKS5wdWJsaXNoKGtpbmQsIG1vbml0b3IpOwotCQkJCi0JCQlmaW5hbCBMaXN0IG1vZHVsZXMyID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdmlzaXQobmV3IElNb2R1bGVWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJCQkJaWYgKGdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKQotCQkJCQkJZ2V0U2VydmVyUHVibGlzaEluZm8oKS5maWxsKG1vZHVsZSk7Ci0JCQkJCQotCQkJCQltb2R1bGVzMi5hZGQobW9kdWxlKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSwgbW9uaXRvcik7Ci0JCQkKLQkJCWdldFNlcnZlclB1Ymxpc2hJbmZvKCkucmVtb3ZlRGVsZXRlZE1vZHVsZVB1Ymxpc2hJbmZvKHRoaXMsIG1vZHVsZXMyKTsKLQkJCWdldFNlcnZlclB1Ymxpc2hJbmZvKCkuY2xlYXJDYWNoZSgpOwotCQkJZ2V0U2VydmVyUHVibGlzaEluZm8oKS5zYXZlKCk7Ci0JCQkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHB1Ymxpc2goKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIGUpOworCS8qCisJICogUHVibGlzaCB0aGUgZ2l2ZW4gbW9kdWxlcyB0byB0aGUgc2VydmVyLgorCSAqLworCXB1YmxpYyB2b2lkIHB1Ymxpc2goZmluYWwgaW50IGtpbmQsIGZpbmFsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzMiwgZmluYWwgSUFkYXB0YWJsZSBpbmZvLCBmaW5hbCBJT3BlcmF0aW9uTGlzdGVuZXIgb3BMaXN0ZW5lcikgeworCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpIHsKKwkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCisJCQkJb3BMaXN0ZW5lci5kb25lKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JNaXNzaW5nQWRhcHRlciwgbnVsbCkpOworCQkJcmV0dXJuOwogCQl9CisJCQorCQkvLyBjaGVjayB3aGF0IGlzIG91dCBvZiBzeW5jIGFuZCBwdWJsaXNoCisJCWlmIChnZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgeworCQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkKKwkJCQlvcExpc3RlbmVyLmRvbmUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vQ29uZmlndXJhdGlvbiwgbnVsbCkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgbG9hZGVkIGFuZCB0aGUgc2VydmVyIHN0YXRlIGlzIGNvcnJlY3QKKwkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG51bGwpOworCQkKKwkJYm9vbGVhbiBzdGFydCA9IGZhbHNlOworCQlpZiAoKChTZXJ2ZXJUeXBlKWdldFNlcnZlclR5cGUoKSkuc3RhcnRCZWZvcmVQdWJsaXNoKCkgJiYgKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSkKKwkJCXN0YXJ0ID0gdHJ1ZTsKKwkJCisJCVB1Ymxpc2hKb2IgcHVibGlzaEpvYiA9IG5ldyBQdWJsaXNoSm9iKGtpbmQsIG1vZHVsZXMyLCBzdGFydCwgaW5mbyk7CisJCWlmIChvcExpc3RlbmVyICE9IG51bGwpIHsKKwkJCXB1Ymxpc2hKb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJb3BMaXN0ZW5lci5kb25lKGV2ZW50LmdldFJlc3VsdCgpKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCQlwdWJsaXNoSm9iLnNjaGVkdWxlKCk7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGlzaCB0YXNrcyB0aGF0IGhhdmUgYmVlbiB0YXJnZXR0ZWQgdG8gdGhpcyBzZXJ2ZXIuCisJICogUmV0dXJucyB0aGUgcHVibGlzaCB0YXNrcyB0aGF0IGhhdmUgYmVlbiB0YXJnZXRlZCB0byB0aGlzIHNlcnZlci4KIAkgKiBUaGVzZSB0YXNrcyBzaG91bGQgYmUgcnVuIGR1cmluZyBwdWJsaXNoaW5nIGFuZCB3aWxsIGJlIGluaXRpYWxpemVkCiAJICogd2l0aCBhIHRhc2sgbW9kZWwuCiAJICogCkBAIC05MTksNyArMTEzNSw3IEBACiAJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIElPcHRpb25hbFRhc2tzCiAJICovCiAJcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRUYXNrcyhpbnQga2luZCwgTGlzdCBtb2R1bGVMaXN0LCBMaXN0IGtpbmRMaXN0KSB7Ci0JCUxpc3QgdGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUxpc3Q8UHVibGlzaE9wZXJhdGlvbj4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFB1Ymxpc2hPcGVyYXRpb24+KCk7CiAJCQogCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7CiAJCQpAQCAtOTYzLDExICsxMTc5LDY5IEBACiAJCQogCQlDb2xsZWN0aW9ucy5zb3J0KHRhc2tzLCBQVUJMSVNIX09QRVJBVElPTl9DT01QQVJUT1IpOwogCQkKLQkJcmV0dXJuIChQdWJsaXNoT3BlcmF0aW9uW10pIHRhc2tzLnRvQXJyYXkobmV3IFB1Ymxpc2hPcGVyYXRpb25bdGFza3Muc2l6ZSgpXSk7CisJCXJldHVybiB0YXNrcy50b0FycmF5KG5ldyBQdWJsaXNoT3BlcmF0aW9uW3Rhc2tzLnNpemUoKV0pOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgYWxsIHB1Ymxpc2ggdGFza3MgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0dGVkIHRvIHRoaXMgc2VydmVyIHR5cGUuCisJICogUmV0dXJucyBhbGwgdGhlIHB1Ymxpc2hlcnMgdGhhdCBhcmUgYXZhaWxhYmxlIHdpdGggdGhpcyBzZXJ2ZXIsCisJICogd2hldGhlciBvciBub3QgdGhleSBhcmUgY3VycmVudGx5IGVuYWJsZWQuCisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIFB1Ymxpc2hlcnMKKwkgKi8KKwlwdWJsaWMgUHVibGlzaGVyW10gZ2V0QWxsUHVibGlzaGVycygpIHsKKwkJTGlzdDxQdWJsaXNoZXI+IHB1YnMgPSBuZXcgQXJyYXlMaXN0PFB1Ymxpc2hlcj4oKTsKKwkJCisJCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBnZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKKwkJCisJCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7CisJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCB0aGlzKTsKKwkJCisJCVB1Ymxpc2hlcltdIHB1Ymxpc2hlcnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHVibGlzaGVycygpOworCQlpZiAocHVibGlzaGVycyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IHB1Ymxpc2hlcnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlQdWJsaXNoZXIgcHViID0gcHVibGlzaGVyc1tpXTsKKwkJCQlpZiAocHViLnN1cHBvcnRzVHlwZShzZXJ2ZXJUeXBlSWQpKSB7CisJCQkJCXB1Yi5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKKwkJCQkJcHVicy5hZGQocHViKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBwdWJzLnRvQXJyYXkobmV3IFB1Ymxpc2hlcltwdWJzLnNpemUoKV0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHB1Ymxpc2hlcnMgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0ZWQgdG8gdGhpcyBzZXJ2ZXIgYW5kCisJICogYXJlIGVuYWJsZWQuCisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIFB1Ymxpc2hlcnMKKwkgKi8KKwlwdWJsaWMgUHVibGlzaGVyW10gZ2V0RW5hYmxlZFB1Ymxpc2hlcnMoKSB7CisJCUxpc3Q8UHVibGlzaGVyPiBwdWJzID0gbmV3IEFycmF5TGlzdDxQdWJsaXNoZXI+KCk7CisJCQorCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7CisJCQorCQlUYXNrTW9kZWwgdGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOworCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgdGhpcyk7CisJCQorCQlQdWJsaXNoZXJbXSBwdWJsaXNoZXJzID0gU2VydmVyUGx1Z2luLmdldFB1Ymxpc2hlcnMoKTsKKwkJaWYgKHB1Ymxpc2hlcnMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBwdWJsaXNoZXJzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJUHVibGlzaGVyIHB1YiA9IHB1Ymxpc2hlcnNbaV07CisJCQkJaWYgKHB1Yi5zdXBwb3J0c1R5cGUoc2VydmVyVHlwZUlkKSAmJiBpc1B1Ymxpc2hlckVuYWJsZWQocHViKSkgeworCQkJCQlwdWIuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7CisJCQkJCXB1YnMuYWRkKHB1Yik7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gcHVicy50b0FycmF5KG5ldyBQdWJsaXNoZXJbcHVicy5zaXplKCldKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBwdWJsaXNoIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIHRhcmdldGVkIHRvIHRoaXMgc2VydmVyIHR5cGUuCiAJICogVGhlIHRhc2tzIHdpbGwgbm90IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YXNrIG1vZGVsLiAKIAkgKiAKIAkgKiBAcGFyYW0gbW9kdWxlTGlzdCBhIGxpc3Qgb2YgbW9kdWxlcwpAQCAtOTc4LDcgKzEyNTIsNyBAQAogCQlpZiAoc2VydmVyVHlwZUlkID09IG51bGwpCiAJCQlyZXR1cm4gbmV3IFB1Ymxpc2hPcGVyYXRpb25bMF07CiAJCQotCQlMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOworCQlMaXN0PFB1Ymxpc2hPcGVyYXRpb24+IHRhc2tzID0gbmV3IEFycmF5TGlzdDxQdWJsaXNoT3BlcmF0aW9uPigpOwogCQkKIAkJSVB1Ymxpc2hUYXNrW10gcHVibGlzaFRhc2tzID0gU2VydmVyUGx1Z2luLmdldFB1Ymxpc2hUYXNrcygpOwogCQlpZiAocHVibGlzaFRhc2tzICE9IG51bGwpIHsKQEAgLTk5NCw3ICsxMjY4LDcgQEAKIAkJCiAJCUNvbGxlY3Rpb25zLnNvcnQodGFza3MsIFBVQkxJU0hfT1BFUkFUSU9OX0NPTVBBUlRPUik7CiAJCQotCQlyZXR1cm4gKFB1Ymxpc2hPcGVyYXRpb25bXSl0YXNrcy50b0FycmF5KG5ldyBQdWJsaXNoT3BlcmF0aW9uW3Rhc2tzLnNpemUoKV0pOworCQlyZXR1cm4gdGFza3MudG9BcnJheShuZXcgUHVibGlzaE9wZXJhdGlvblt0YXNrcy5zaXplKCldKTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hPcGVyYXRpb25JZChQdWJsaXNoT3BlcmF0aW9uIG9wKSB7CkBAIC0xMDA3LDggKzEyODEsOCBAQAogCSAqIAogCSAqIEByZXR1cm4gYSBsaXN0IG9mIElNb2R1bGVbXQogCSAqLwotCXB1YmxpYyBMaXN0IGdldEFsbE1vZHVsZXMoKSB7Ci0JCWZpbmFsIExpc3QgbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwlwdWJsaWMgTGlzdDxJTW9kdWxlW10+IGdldEFsbE1vZHVsZXMoKSB7CisJCWZpbmFsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVMaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7CiAJCQogCQlJTW9kdWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IElNb2R1bGVWaXNpdG9yKCkgewogCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZSkgewpAQCAtMTA5OSwxMCArMTM3Myw2IEBACiAJCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIuZ2V0TmFtZSgpKTsKIAl9CiAKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQogCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIGlzIGluIGEgc3RhdGUgdGhhdCBpdCBjYW4KIAkgKiBiZSBzdGFydGVkLCBhbmQgc3VwcG9ydHMgdGhlIGdpdmVuIG1vZGUuCkBAIC0xMTIxLDI5ICsxMzkxLDE1IEBACiAJCWlmICghZ2V0U2VydmVyVHlwZSgpLnN1cHBvcnRzTGF1bmNoTW9kZShtb2RlMikpCiAJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckxhdW5jaE1vZGUsIG51bGwpOwogCQkKKwkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpCisJCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGUuY2FuU3RhcnQobW9kZTIpOworCQkKIAkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJfQogCi0JcHVibGljIElMYXVuY2ggZ2V0RXhpc3RpbmdMYXVuY2goKSB7Ci0JCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQkKLQkJSUxhdW5jaFtdIGxhdW5jaGVzID0gbGF1bmNoTWFuYWdlci5nZXRMYXVuY2hlcygpOwotCQlpbnQgc2l6ZSA9IGxhdW5jaGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZyA9IGxhdW5jaGVzW2ldLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGxhdW5jaENvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzZXJ2ZXJJZCA9IGxhdW5jaENvbmZpZy5nZXRBdHRyaWJ1dGUoU0VSVkVSX0lELCAoU3RyaW5nKSBudWxsKTsKLQkJCQkJaWYgKGdldElkKCkuZXF1YWxzKHNlcnZlcklkKSkgewotCQkJCQkJaWYgKCFsYXVuY2hlc1tpXS5pc1Rlcm1pbmF0ZWQoKSkKLQkJCQkJCQlyZXR1cm4gbGF1bmNoZXNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQkKKwlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKSB7CisJCWlmIChsYXVuY2ggIT0gbnVsbCAmJiAhbGF1bmNoLmlzVGVybWluYXRlZCgpKQorCQkJcmV0dXJuIGxhdW5jaDsKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC0xMjUwLDI3ICsxNTA2LDYgQEAKIAl9CiAKIAkvKioKLQkgKiBAc2VlIElTZXJ2ZXIjc3RhcnQoU3RyaW5nLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KFN0cmluZyBtb2RlMiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlN0YXJ0aW5nIHNlcnZlcjogIiArIHRvU3RyaW5nKCkgKyAiLCBsYXVuY2hNb2RlOiAiICsgbW9kZTIpOwotCQotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgbG9hZGVkIGFuZCB0aGUgc2VydmVyIHN0YXRlIGlzIGNvcnJlY3QKLQkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG1vbml0b3IpOwotCQkKLQkJdHJ5IHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24odHJ1ZSwgbW9uaXRvcik7Ci0JCQkvL2lmIChsYXVuY2hDb25maWcgPT0gbnVsbCkKLQkJCS8vCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCk7Ci0JCQlJTGF1bmNoIGxhdW5jaCA9IGxhdW5jaENvbmZpZy5sYXVuY2gobW9kZTIsIG1vbml0b3IpOyAvLyAsIHRydWUpOyAtIGNhdXNlcyB3b3Jrc3BhY2UgbG9jawotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTGF1bmNoOiAiICsgbGF1bmNoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzdGFydGluZyBzZXJ2ZXIgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgogCSAqIENsZWFuIHVwIGFueSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlciwgdHlwaWNhbGx5IGluIHByZXBhcmF0aW9uIGZvcgogCSAqIGRlbGV0aW9uLgogCSAqLwpAQCAtMTMxNiwxMiArMTU1MSwxNCBAQAogCQkKIAkJaWYgKCFnZXRTZXJ2ZXJUeXBlKCkuc3VwcG9ydHNMYXVuY2hNb2RlKG1vZGUyKSkKIAkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTGF1bmNoTW9kZSwgbnVsbCk7Ci0KLQkJaW50IHN0YXRlID0gZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IFNUQVRFX1NUQVJURUQpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKIAkJCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUmVzdGFydE5vdFN0YXJ0ZWQsIG51bGwpOworCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSAhPSBTVEFURV9TVEFSVEVEKQorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JSZXN0YXJ0Tm90U3RhcnRlZCwgbnVsbCk7CisJCQorCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkKKwkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZS5jYW5SZXN0YXJ0KG1vZGUyKTsKKwkJCisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwogCX0KIAogCS8qKgpAQCAtMTM1NSw2OCArMTU5MiwxNyBAQAogCXB1YmxpYyB2b2lkIHJlc3RhcnQoZmluYWwgU3RyaW5nIG1vZGUyLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsIHx8IGdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBFRCkKIAkJCXJldHVybjsKLQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUmVzdGFydGluZyBzZXJ2ZXI6ICIgKyBnZXROYW1lKCkpOwotCQotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShudWxsKS5yZXN0YXJ0KG1vZGUyKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSByZXN0YXJ0KCkgIiArIHRvU3RyaW5nKCkpOwotCQkJfQogCQkKLQkJCS8vIGFkZCBsaXN0ZW5lciB0byBzdGFydCBpdCBhcyBzb29uIGFzIGl0IGlzIHN0b3BwZWQKLQkJCWFkZFNlcnZlckxpc3RlbmVyKG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOwotCQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpIHsKLQkJCQkJCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIodGhpcyk7Ci0KLQkJCQkJCQkvLyByZXN0YXJ0IGluIGEgcXVhcnRlciBzZWNvbmQgKGdpdmUgb3RoZXIgbGlzdGVuZXJzIGEgY2hhbmNlCi0JCQkJCQkJLy8gdG8gaGVhciB0aGUgc3RvcHBlZCBtZXNzYWdlKQotCQkJCQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gaWdub3JlCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlTZXJ2ZXJUeXBlIHN0ID0gKFNlcnZlclR5cGUpIGdldFNlcnZlclR5cGUoKTsKLQkJCQkJCQkJCWlmIChzdC5zdGFydEJlZm9yZVB1Ymxpc2goKSkgewotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCVNlcnZlci50aGlzLnN0YXJ0KG1vZGUyLCBtb25pdG9yKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aGlsZSByZXN0YXJ0aW5nIHNlcnZlciIsIGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmlzQXV0b1B1Ymxpc2hpbmcoKSAmJiBzaG91bGRQdWJsaXNoKCkpIHsKLQkJCQkJCQkJCQlwdWJsaXNoKFBVQkxJU0hfSU5DUkVNRU5UQUwsIG51bGwpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKGdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJU2VydmVyLnRoaXMuc3RhcnQobW9kZTIsIG1vbml0b3IpOwotCQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdoaWxlIHJlc3RhcnRpbmcgc2VydmVyIiwgZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfTsKLQkJCQkJCQl0LnNldERhZW1vbih0cnVlKTsKLQkJCQkJCQl0LnNldFByaW9yaXR5KFRocmVhZC5OT1JNX1BSSU9SSVRZIC0gMik7Ci0JCQkJCQkJdC5zdGFydCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCS8vIHN0b3AgdGhlIHNlcnZlcgotCQkJc3RvcChmYWxzZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZXN0YXJ0aW5nIHNlcnZlciIsIGUpOwotCQl9CisJCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpCisJCQlyZXR1cm47CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJSZXN0YXJ0aW5nIHNlcnZlcjogIiArIGdldE5hbWUoKSk7CisJCQorCQlSZXN0YXJ0Sm9iIHJlc3RhcnRKb2IgPSBuZXcgUmVzdGFydEpvYihtb2RlMik7CisJCXJlc3RhcnRKb2Iuc2NoZWR1bGUoKTsKIAl9CiAKIAkvKioKQEAgLTE0MjksMTIgKzE2MTUsMTUgQEAKIAkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQogCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JNaXNzaW5nQWRhcHRlciwgbnVsbCk7CiAJCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKQorCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEIHx8IGdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBJTkcpCiAJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclN0b3BBbHJlYWR5U3RvcHBlZCwgbnVsbCk7CiAJCQogCQlpZiAoIWdldFNlcnZlclR5cGUoKS5zdXBwb3J0c0xhdW5jaE1vZGUoZ2V0TW9kZSgpKSkKIAkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTGF1bmNoTW9kZSwgbnVsbCk7CiAJCQorCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkKKwkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZS5jYW5TdG9wKCk7CisJCQogCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKIAl9CiAKQEAgLTE0NDUsMjU3ICsxNjM0LDE4NSBAQAogCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKQogCQkJcmV0dXJuOwogCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU3RvcHBpbmcgc2VydmVyOiAiICsgdG9TdHJpbmcoKSk7Ci0JCQotCQl0cnkgewotCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkuc3RvcChmb3JjZSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHN0b3AoKSAiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCX0KKwkJU3RvcEpvYiBqb2IgPSBuZXcgU3RvcEpvYihmb3JjZSk7CisJCWpvYi5zY2hlZHVsZSgpOwogCX0KIAotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNzdGFydChTdHJpbmcsIElPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgbW9kZTIsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcjIpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuOworCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hCZWZvcmVTdGFydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gc3luY2hyb25vdXMpeworCisJCS8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gcHVibGlzaAorCQlieXRlIHB1YiA9IFN0YXJ0Sm9iLlBVQkxJU0hfTk9ORTsKKwkJaWYgKFNlcnZlckNvcmUuaXNBdXRvUHVibGlzaGluZygpICYmIHNob3VsZFB1Ymxpc2goKSkgeworCQkJaWYgKCgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLnN0YXJ0QmVmb3JlUHVibGlzaCgpKQorCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJcHViID0gU3RhcnRKb2IuUFVCTElTSF9CRUZPUkU7CisJCX0KIAkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgMSIpOwotCQlmaW5hbCBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7CisJCWZpbmFsIElTdGF0dXMgW10gcHViU3RhdHVzID0gbmV3IElTdGF0dXNbXXtTdGF0dXMuT0tfU1RBVFVTfTsKKwkJCisJCS8vIHB1Ymxpc2ggYmVmb3JlIHN0YXJ0CisJCWJ5dGUgcHVibGlzaCA9IHB1YjsKKwkJaWYgKHB1Ymxpc2ggPT0gU3RhcnRKb2IuUFVCTElTSF9CRUZPUkUpIHsKKwkJCVB1Ymxpc2hKb2IgcHViSm9iID0gbmV3IFB1Ymxpc2hKb2IoSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLGZhbHNlLCBudWxsKTsKKwkJCXB1YkpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpeworCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJCUlTdGF0dXMgc3RhdHVzID0gZXZlbnQuZ2V0UmVzdWx0KCk7CisJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQorCQkJCQkJcHViU3RhdHVzWzBdID0gc3RhdHVzOyAKKwkJCQl9CisJCQkJCisJCQl9KTsKKwkJCQorCQkJcHViSm9iLnNjaGVkdWxlKCk7CisJCQkKKwkJCXRyeXsKKwkJCQlpZiAoc3luY2hyb25vdXMpCisJCQkJCXB1YkpvYi5qb2luKCk7CisJCQkJCQorCQkJfQorCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKXsKKwkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1YlN0YXR1c1swXTsKKwl9CisJCisJcHJvdGVjdGVkIElTdGF0dXMgcHVibGlzaEFmdGVyU3RhcnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBib29sZWFuIHN5bmNocm9ub3VzLCBmaW5hbCBJT3BlcmF0aW9uTGlzdGVuZXIgb3ApeworCQkKKwkJLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBwdWJsaXNoCisJCWJ5dGUgcHViID0gU3RhcnRKb2IuUFVCTElTSF9OT05FOworCQlpZiAoU2VydmVyQ29yZS5pc0F1dG9QdWJsaXNoaW5nKCkgJiYgc2hvdWxkUHVibGlzaCgpKSB7CisJCQlpZiAoKChTZXJ2ZXJUeXBlKWdldFNlcnZlclR5cGUoKSkuc3RhcnRCZWZvcmVQdWJsaXNoKCkpCisJCQkJcHViID0gU3RhcnRKb2IuUFVCTElTSF9BRlRFUjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJfQorCQkKKwkJZmluYWwgSVN0YXR1cyBbXSBwdWJTdGF0dXMgPSBuZXcgSVN0YXR1c1tde1N0YXR1cy5PS19TVEFUVVN9OworCQkKKwkJLy8gcHVibGlzaCBhZnRlciBzdGFydAorCQlieXRlIHB1Ymxpc2ggPSBwdWI7CisJCWlmIChwdWJsaXNoID09IFN0YXJ0Sm9iLlBVQkxJU0hfQUZURVIpIHsKKwkJCVB1Ymxpc2hKb2IgcHViSm9iID0gbmV3IFB1Ymxpc2hKb2IoSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLGZhbHNlLCBudWxsKTsKKwkJCXB1YkpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpeworCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJCUlTdGF0dXMgc3RhdHVzID0gZXZlbnQuZ2V0UmVzdWx0KCk7CisJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQorCQkJCQkJcHViU3RhdHVzWzBdID0gc3RhdHVzOyAKKwkJCQkJaWYgKG9wICE9IG51bGwpeworCQkJCQkJb3AuZG9uZShzdGF0dXMpOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJfSk7CisJCQkKKwkJCXB1YkpvYi5zY2hlZHVsZSgpOworCQkJCisJCQl0cnl7CisJCQkJaWYgKHN5bmNocm9ub3VzKQorCQkJCQlwdWJKb2Iuam9pbigpOworCQkJfQorCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKXsKKwkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1YlN0YXR1c1swXTsKKwl9CisJCisJLyoqCisJICogQHNlZSBJU2VydmVyI3N0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgbW9kZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTdGFydGluZyBzZXJ2ZXI6ICIgKyB0b1N0cmluZygpICsgIiwgbGF1bmNoTW9kZTogIiArIG1vZGUyKTsKIAkJCiAJCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWxlZ2F0ZSBpcyBsb2FkZWQgYW5kIHRoZSBzZXJ2ZXIgc3RhdGUgaXMgY29ycmVjdAogCQlsb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7CiAJCQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIHNlcnZlcgotCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQkJCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IG5vdGlmeSIpOwotCQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0YXJ0IiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQljbGFzcyBUaW1lciB7Ci0JCQlib29sZWFuIHRpbWVvdXQ7Ci0JCQlib29sZWFuIGFscmVhZHlEb25lOwotCQl9Ci0JCWZpbmFsIFRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCQotCQlmaW5hbCBpbnQgc2VydmVyVGltZW91dCA9ICgoU2VydmVyVHlwZSkgZ2V0U2VydmVyVHlwZSgpKS5nZXRTdGFydFRpbWVvdXQoKTsKLQkJaWYgKHNlcnZlclRpbWVvdXQgPiAwKSB7Ci0JCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgiU2VydmVyIHN0YXJ0IHRpbWVvdXQiKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHNlcnZlclRpbWVvdXQpOwotCQkJCQkJaWYgKCF0aW1lci5hbHJlYWR5RG9uZSkgewotCQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN0YXJ0IG5vdGlmeSB0aW1lb3V0Iik7Ci0JCQkJCQkJCWlmICghdGltZXIuYWxyZWFkeURvbmUpCi0JCQkJCQkJCQl0aW1lci50aW1lb3V0ID0gdHJ1ZTsKLQkJCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIHNlcnZlciBzdGFydCB0aW1lb3V0IiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJCXRocmVhZC5zdGFydCgpOwotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDIiKTsKLQkJCi0JCS8vIHN0YXJ0IHRoZSBzZXJ2ZXIKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJdHJ5IHsKLQkJCXN0YXJ0KG1vZGUyLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCQlsaXN0ZW5lcjIuZG9uZShlLmdldFN0YXR1cygpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJCWxpc3RlbmVyMi5kb25lKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCAzIik7Ci0JCQotCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhIC4uLgotCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQl0cnkgewotCQkJCXdoaWxlICghdGltZXIudGltZW91dCAmJiAhKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8IGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSkKLQkJCQkJbXV0ZXgud2FpdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3YWl0aW5nIGZvciBzZXJ2ZXIgc3RhcnQiLCBlKTsKLQkJCX0KLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlpZiAodGltZXIudGltZW91dCkgewotCQkJbGlzdGVuZXIyLmRvbmUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0VGltZW91dCwgbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZSgpLCAoc2VydmVyVGltZW91dCAvIDEwMDApICsgIiIgfSksIG51bGwpKTsKLQkJCXN0b3AoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCWxpc3RlbmVyMi5kb25lKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTdGFydEZhaWxlZCwgZ2V0TmFtZSgpKSwgbnVsbCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDQiKTsKLQkJbGlzdGVuZXIyLmRvbmUoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25vdXNTdGFydChTdHJpbmcgbW9kZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCiAJCQlyZXR1cm47CiAJCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDEiKTsKKwkJSVN0YXR1cyBzdGF0dXMgPSBwdWJsaXNoQmVmb3JlU3RhcnQobW9uaXRvcixmYWxzZSk7CiAJCQotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgbG9hZGVkIGFuZCB0aGUgc2VydmVyIHN0YXRlIGlzIGNvcnJlY3QKLQkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG1vbml0b3IpOwotCQkKLQkJZmluYWwgYm9vbGVhbltdIG5vdGlmaWVkID0gbmV3IGJvb2xlYW5bMV07Ci0JCQotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIHNlcnZlcgotCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQkJCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IG5vdGlmeSIpOwotCQkJCQkJCQlub3RpZmllZFswXSA9IHRydWU7Ci0JCQkJCQkJCW5vdGlmaWVkLm5vdGlmeUFsbCgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgc3RhcnQiLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCWZpbmFsIGludCBzZXJ2ZXJUaW1lb3V0ID0gKChTZXJ2ZXJUeXBlKSBnZXRTZXJ2ZXJUeXBlKCkpLmdldFN0YXJ0VGltZW91dCgpOwotCQljbGFzcyBUaW1lciB7Ci0JCQlib29sZWFuIHRpbWVvdXQ7Ci0JCQlib29sZWFuIGFscmVhZHlEb25lOwotCQl9Ci0JCWZpbmFsIFRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCQotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyID0gbW9uaXRvcjsKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoIlN5bmNocm9ub3VzIFNlcnZlciBTdGFydCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgdG90YWxUaW1lb3V0ID0gc2VydmVyVGltZW91dDsKLQkJCQkJaWYgKHRvdGFsVGltZW91dCA8IDApCi0JCQkJCQl0b3RhbFRpbWVvdXQgPSAxOwotCQkJCQlib29sZWFuIHVzZXJDYW5jZWxsZWQgPSBmYWxzZTsKLQkJCQkJaW50IHJldHJ5UGVyaW9kID0gMjUwMDsKLQkJCQkJd2hpbGUgKCFub3RpZmllZFswXSAmJiB0b3RhbFRpbWVvdXQgPiAwICYmICF1c2VyQ2FuY2VsbGVkICYmICF0aW1lci5hbHJlYWR5RG9uZSkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHJldHJ5UGVyaW9kKTsKLQkJCQkJCWlmIChzZXJ2ZXJUaW1lb3V0ID4gMCkKLQkJCQkJCQl0b3RhbFRpbWVvdXQgLT0gcmV0cnlQZXJpb2Q7Ci0JCQkJCQlpZiAoIW5vdGlmaWVkWzBdICYmICF0aW1lci5hbHJlYWR5RG9uZSAmJiBtb25pdG9yMi5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQkvLyB1c2VyIGNhbmNlbGxlZCAtIHNldCB0aGUgc2VydmVyIHN0YXRlIHRvIHN0b3BwZWQKLQkJCQkJCQl1c2VyQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCQkJCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgdXNlciBjYW5jZWxsZWQuIik7Ci0JCQkJCQkJCW5vdGlmaWVkWzBdID0gdHJ1ZTsKLQkJCQkJCQkJbm90aWZpZWQubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghdXNlckNhbmNlbGxlZCAmJiAhdGltZXIuYWxyZWFkeURvbmUgJiYgIW5vdGlmaWVkWzBdKSB7Ci0JCQkJCQkvLyBub3RpZnkgd2FpdGVyCi0JCQkJCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCBub3RpZnkgdGltZW91dCIpOwotCQkJCQkJCWlmICghdGltZXIuYWxyZWFkeURvbmUgJiYgdG90YWxUaW1lb3V0IDw9IDApCi0JCQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOwotCQkJCQkJCW5vdGlmaWVkWzBdID0gdHJ1ZTsKLQkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgc3RhcnQgdGltZW91dCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgMiIpOwotCQotCQkvLyBzdGFydCB0aGUgc2VydmVyCi0JCXRyeSB7Ci0JCQlzdGFydChtb2RlMiwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQkJdGhyb3cgZTsKLQkJfQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKKwkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpeworCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCJGYWlsZWQgcHVibGlzaCBqb2IgZHVyaW5nIHN0YXJ0IHJvdXRpbmUiKTsKIAkJCXJldHVybjsKIAkJfQogCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCAzIik7CisJCVN0YXJ0Sm9iIHN0YXJ0Sm9iID0gbmV3IFN0YXJ0Sm9iKG1vZGUyKTsKKwkJc3RhcnRKb2Iuc2NoZWR1bGUoKTsKIAkJCi0JCS8vIHdhaXQgZm9yIGl0ISB3YWl0IGZvciBpdCEgLi4uCi0JCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKCFub3RpZmllZFswXSAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgIXRpbWVyLnRpbWVvdXQKLQkJCQkJCSYmICEoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpKSB7Ci0JCQkJCW5vdGlmaWVkLndhaXQoKTsKKwkJcHVibGlzaEFmdGVyU3RhcnQobW9uaXRvcixmYWxzZSxudWxsKTsKKworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElTZXJ2ZXIjc3RhcnQoU3RyaW5nLCBJT3BlcmF0aW9uTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgc3RhcnQoU3RyaW5nIG1vZGUyLCBmaW5hbCBJT3BlcmF0aW9uTGlzdGVuZXIgb3BMaXN0ZW5lcikgeworCQkKKwkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGxvYWRlZCBhbmQgdGhlIHNlcnZlciBzdGF0ZSBpcyBjb3JyZWN0CisJCWxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKKwkJCisJCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkgeworCQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkKKwkJCQlvcExpc3RlbmVyLmRvbmUoU3RhdHVzLk9LX1NUQVRVUyk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaEJlZm9yZVN0YXJ0KG51bGwsZmFsc2UpOworCQkKKwkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpeworCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCJGYWlsZWQgcHVibGlzaCBqb2IgZHVyaW5nIHN0YXJ0IHJvdXRpbmUiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGNoZWNrIHRoZSBwdWJsaXNoIGZsYWcgKGFnYWluKSB0byBkZXRlcm1pbmUgd2hlbiB0byBjYWxsIG9wTGlzdGVuZXIuZG9uZSAKKwkJYnl0ZSBwdWIgPSBTdGFydEpvYi5QVUJMSVNIX05PTkU7CisJCWlmIChTZXJ2ZXJDb3JlLmlzQXV0b1B1Ymxpc2hpbmcoKSAmJiBzaG91bGRQdWJsaXNoKCkpIHsKKwkJCWlmICgoKFNlcnZlclR5cGUpZ2V0U2VydmVyVHlwZSgpKS5zdGFydEJlZm9yZVB1Ymxpc2goKSkKKwkJCQlwdWIgPSBTdGFydEpvYi5QVUJMSVNIX0FGVEVSOworCQkJZWxzZQorCQkJCXB1YiA9IFN0YXJ0Sm9iLlBVQkxJU0hfQkVGT1JFOworCQl9CisKKwkJU3RhcnRKb2Igc3RhcnRKb2IgPSBuZXcgU3RhcnRKb2IobW9kZTIpOworCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsICYmIHB1YiAhPSBTdGFydEpvYi5QVUJMSVNIX0FGVEVSKSB7CisJCQlzdGFydEpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCQlvcExpc3RlbmVyLmRvbmUoZXZlbnQuZ2V0UmVzdWx0KCkpOwogCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2FpdGluZyBmb3Igc2VydmVyIHN0YXJ0IiwgZSk7Ci0JCQl9Ci0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7CisJCQl9KTsKIAkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisJCXN0YXJ0Sm9iLnNjaGVkdWxlKCk7CiAJCQotCQlpZiAodGltZXIudGltZW91dCkgewotCQkJc3RvcChmYWxzZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU3RhcnRUaW1lb3V0LCBuZXcgU3RyaW5nW10geyBnZXROYW1lKCksIChzZXJ2ZXJUaW1lb3V0IC8gMTAwMCkgKyAiIiB9KSwgbnVsbCkpOworCQlwdWJsaXNoQWZ0ZXJTdGFydChudWxsLGZhbHNlLCBvcExpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1N0YXJ0KFN0cmluZyBtb2RlMiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQorCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgbG9hZGVkIGFuZCB0aGUgc2VydmVyIHN0YXRlIGlzIGNvcnJlY3QKKwkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG51bGwpOworCQkKKwkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJSVN0YXR1cyBzdGF0dXMgPSBwdWJsaXNoQmVmb3JlU3RhcnQobW9uaXRvcix0cnVlKTsKKwkJCisJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKXsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwiRmFpbGVkIHB1Ymxpc2ggam9iIGR1cmluZyBzdGFydCByb3V0aW5lIik7CisJCQlyZXR1cm47CiAJCX0KIAkJCi0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTdGFydEZhaWxlZCwgZ2V0TmFtZSgpKSwgbnVsbCkpOworCQlTdGFydEpvYiBzdGFydEpvYiA9IG5ldyBTdGFydEpvYihtb2RlMik7CisJCXN0YXJ0Sm9iLnNjaGVkdWxlKCk7CiAJCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDQiKTsKKwkJdHJ5IHsKKwkJCXN0YXJ0Sm9iLmpvaW4oKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIHdhaXRpbmcgZm9yIGpvYiIsIGUpOworCQl9CisJCQorCQlwdWJsaXNoQWZ0ZXJTdGFydChtb25pdG9yLHRydWUsbnVsbCk7CiAJfQogCiAJLyoKQEAgLTE3MDksMTgxICsxODI2LDU1IEBACiAJLyoKIAkgKiBAc2VlIElTZXJ2ZXIjcmVzdGFydChTdHJpbmcsIElPcGVyYXRpb25MaXN0ZW5lcikKIAkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KFN0cmluZyBtb2RlMiwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKKwlwdWJsaWMgdm9pZCByZXN0YXJ0KFN0cmluZyBtb2RlMiwgZmluYWwgSU9wZXJhdGlvbkxpc3RlbmVyIG9wTGlzdGVuZXIpIHsKKwkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKSB7CisJCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKQorCQkJCW9wTGlzdGVuZXIuZG9uZShTdGF0dXMuT0tfU1RBVFVTKTsKIAkJCXJldHVybjsKKwkJfQogCQkKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBFRCkKKwkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBFRCkgeworCQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkKKwkJCQlvcExpc3RlbmVyLmRvbmUoU3RhdHVzLk9LX1NUQVRVUyk7CiAJCQlyZXR1cm47CisJCX0KIAkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlc3RhcnRpbmcgc2VydmVyOiAiICsgZ2V0TmFtZSgpKTsKLQkJCi0JCXRyeSB7Ci0JCQlmaW5hbCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIyID0gbGlzdGVuZXI7Ci0JCQlJU2VydmVyTGlzdGVuZXIgY3VyTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVEFSVEVEKSB7Ci0JCQkJCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHRoaXMpOwotCQkJCQkJCWxpc3RlbmVyMi5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJYWRkU2VydmVyTGlzdGVuZXIoY3VyTGlzdGVuZXIpOwotCQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG51bGwpLnJlc3RhcnQobW9kZTIpOwotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHJlc3RhcnQoKSAiICsgdG9TdHJpbmcoKSk7Ci0JCQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIoY3VyTGlzdGVuZXIpOwotCQkJfQotCQkKLQkJCWZpbmFsIFN0cmluZyBtb2RlMyA9IG1vZGUyOwotCQkJLy8gYWRkIGxpc3RlbmVyIHRvIHN0YXJ0IGl0IGFzIHNvb24gYXMgaXQgaXMgc3RvcHBlZAotCQkJYWRkU2VydmVyTGlzdGVuZXIobmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJCWlmIChldmVudEtpbmQgPT0gKFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpKSB7Ci0JCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBFRCkgewotCQkJCQkJCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcih0aGlzKTsKLQotCQkJCQkJCS8vIHJlc3RhcnQgaW4gYSBxdWFydGVyIHNlY29uZCAoZ2l2ZSBvdGhlciBsaXN0ZW5lcnMgYSBjaGFuY2UKLQkJCQkJCQkvLyB0byBoZWFyIHRoZSBzdG9wcGVkIG1lc3NhZ2UpCi0JCQkJCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCJSZXN0YXJ0IHRocmVhZCIpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gaWdub3JlCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlTZXJ2ZXJUeXBlIHN0ID0gKFNlcnZlclR5cGUpIGdldFNlcnZlclR5cGUoKTsKLQkJCQkJCQkJCWlmIChzdC5zdGFydEJlZm9yZVB1Ymxpc2goKSkgewotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCVNlcnZlci50aGlzLnN0YXJ0KG1vZGUzLCBsaXN0ZW5lcjIpOwotCQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdoaWxlIHJlc3RhcnRpbmcgc2VydmVyIiwgZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuaXNBdXRvUHVibGlzaGluZygpICYmIHNob3VsZFB1Ymxpc2goKSkgewotCQkJCQkJCQkJCXB1Ymxpc2goUFVCTElTSF9JTkNSRU1FTlRBTCwgbnVsbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlTZXJ2ZXIudGhpcy5zdGFydChtb2RlMywgbGlzdGVuZXIyKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aGlsZSByZXN0YXJ0aW5nIHNlcnZlciIsIGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX07Ci0JCQkJCQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCQkJCQkJdC5zZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSAtIDIpOwotCQkJCQkJCXQuc3RhcnQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKKwkJUmVzdGFydEpvYiByZXN0YXJ0Sm9iID0gbmV3IFJlc3RhcnRKb2IobW9kZTIpOworCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKSB7CisJCQlyZXN0YXJ0Sm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJCW9wTGlzdGVuZXIuZG9uZShldmVudC5nZXRSZXN1bHQoKSk7CiAJCQkJfQogCQkJfSk7Ci0JCi0JCQkvLyBzdG9wIHRoZSBzZXJ2ZXIKLQkJCXN0b3AoZmFsc2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVzdGFydGluZyBzZXJ2ZXIiLCBlKTsKLQkJCWxpc3RlbmVyLmRvbmUobnVsbCk7CiAJCX0KKwkJcmVzdGFydEpvYi5zY2hlZHVsZSgpOwogCX0KLQkKKwogCS8qCiAJICogQHNlZSBJU2VydmVyI3N0b3AoYm9vbGVhbiwgSU9wZXJhdGlvbkxpc3RlbmVyKQogCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyMikgewotCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCisJcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlLCBmaW5hbCBJT3BlcmF0aW9uTGlzdGVuZXIgb3BMaXN0ZW5lcikgeworCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpIHsKKwkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCisJCQkJb3BMaXN0ZW5lci5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwogCQkJcmV0dXJuOworCQl9CiAJCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCisJCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgeworCQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkKKwkJCQlvcExpc3RlbmVyLmRvbmUoU3RhdHVzLk9LX1NUQVRVUyk7CiAJCQlyZXR1cm47CisJCX0KIAkJCi0JCWZpbmFsIE9iamVjdCBtdXRleCA9IG5ldyBPYmplY3QoKTsKLQkKLQkJLy8gYWRkIGxpc3RlbmVyIHRvIHRoZSBzZXJ2ZXIKLQkJSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCQkJCWlmIChTZXJ2ZXIudGhpcyA9PSBzZXJ2ZXIgJiYgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkvLyBub3RpZnkgd2FpdGVyCi0JCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIHNlcnZlciBzdG9wIiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CisJCVN0b3BKb2Igam9iID0gbmV3IFN0b3BKb2IoZm9yY2UpOworCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKSB7CisJCQlqb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJb3BMaXN0ZW5lci5kb25lKGV2ZW50LmdldFJlc3VsdCgpKTsKIAkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCWNsYXNzIFRpbWVyIHsKLQkJCWJvb2xlYW4gdGltZW91dDsKLQkJCWJvb2xlYW4gYWxyZWFkeURvbmU7CisJCQl9KTsKIAkJfQotCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQkKLQkJZmluYWwgaW50IHNlcnZlclRpbWVvdXQgPSAoKFNlcnZlclR5cGUpIGdldFNlcnZlclR5cGUoKSkuZ2V0U3RvcFRpbWVvdXQoKTsKLQkJaWYgKHNlcnZlclRpbWVvdXQgPiAwKSB7Ci0JCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgiU2VydmVyIHN0b3AgdGltZW91dCIpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoc2VydmVyVGltZW91dCk7Ci0JCQkJCQlpZiAoIXRpbWVyLmFscmVhZHlEb25lKSB7Ci0JCQkJCQkJdGltZXIudGltZW91dCA9IHRydWU7Ci0JCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3RvcCBub3RpZnkgdGltZW91dCIpOwotCQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0b3AgdGltZW91dCIsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCQl0aHJlYWQuc3RhcnQoKTsKLQkJfQotCQotCQkvLyBzdG9wIHRoZSBzZXJ2ZXIKLQkJc3RvcChmb3JjZSk7Ci0JCi0JCS8vIHdhaXQgZm9yIGl0ISB3YWl0IGZvciBpdCEKLQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoIXRpbWVyLnRpbWVvdXQgJiYgZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJCW11dGV4LndhaXQoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2FpdGluZyBmb3Igc2VydmVyIHN0b3AiLCBlKTsKLQkJCX0KLQkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQkvKgotCQkvL2Nhbid0IHRocm93IGV4Y2VwdGlvbnMKLQkJaWYgKHRpbWVyLnRpbWVvdXQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmUuUExVR0lOX0lELCAwLCBTZXJ2ZXJQbHVnaW4uZ2V0UmVzb3VyY2UoIiVlcnJvclN0YXJ0RmFpbGVkIiwgZ2V0TmFtZSgpKSwgbnVsbCkpOwotCQllbHNlCi0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmUuUExVR0lOX0lELCAwLCBTZXJ2ZXJQbHVnaW4uZ2V0UmVzb3VyY2UoIiVlcnJvclN0YXJ0RmFpbGVkIiwgZ2V0TmFtZSgpKSwgbnVsbCkpOyovCi0JCWxpc3RlbmVyMi5kb25lKFN0YXR1cy5PS19TVEFUVVMpOworCQlqb2Iuc2NoZWR1bGUoKTsKIAl9CiAKIAkvKgpAQCAtMTg5Niw4NCArMTg4NywxNSBAQAogCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCiAJCQlyZXR1cm47CiAJCQotCQlmaW5hbCBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIHNlcnZlcgotCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQkJCQkJaWYgKFNlcnZlci50aGlzID09IHNlcnZlciAmJiBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0b3AiLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCWNsYXNzIFRpbWVyIHsKLQkJCWJvb2xlYW4gdGltZW91dDsKLQkJCWJvb2xlYW4gYWxyZWFkeURvbmU7CisJCVN0b3BKb2Igam9iID0gbmV3IFN0b3BKb2IoZm9yY2UpOworCQlqb2Iuc2NoZWR1bGUoKTsKKwkJdHJ5IHsKKwkJCWpvYi5qb2luKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciB3YWl0aW5nIGZvciBqb2IiLCBlKTsKIAkJfQotCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQkKLQkJZmluYWwgaW50IHNlcnZlclRpbWVvdXQgPSAoKFNlcnZlclR5cGUpIGdldFNlcnZlclR5cGUoKSkuZ2V0U3RvcFRpbWVvdXQoKTsKLQkJaWYgKHNlcnZlclRpbWVvdXQgPiAwKSB7Ci0JCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgiU3luY2hyb25vdXMgc2VydmVyIHN0b3AiKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHNlcnZlclRpbWVvdXQpOwotCQkJCQkJaWYgKCF0aW1lci5hbHJlYWR5RG9uZSkgewotCQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOwotCQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN0b3Agbm90aWZ5IHRpbWVvdXQiKTsKLQkJCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIHNlcnZlciBzdG9wIHRpbWVvdXQiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCX0KLQkKLQkJLy8gc3RvcCB0aGUgc2VydmVyCi0JCXN0b3AoZm9yY2UpOwotCQotCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhCi0JCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKCF0aW1lci50aW1lb3V0ICYmIGdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQltdXRleC53YWl0KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdhaXRpbmcgZm9yIHNlcnZlciBzdG9wIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJLyoKLQkJLy9jYW4ndCB0aHJvdyBleGNlcHRpb25zCi0JCWlmICh0aW1lci50aW1lb3V0KQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlLlBMVUdJTl9JRCwgMCwgU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlZXJyb3JTdGFydEZhaWxlZCIsIGdldE5hbWUoKSksIG51bGwpKTsKLQkJZWxzZQotCQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQkKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlLlBMVUdJTl9JRCwgMCwgU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlZXJyb3JTdGFydEZhaWxlZCIsIGdldE5hbWUoKSksIG51bGwpKTsqLwogCX0KLQkKKwogCS8qCiAJICogVHJpZ2dlciBhIHJlc3RhcnQgb2YgdGhlIGdpdmVuIG1vZHVsZSBhbmQgd2FpdCB1bnRpbCBpdCBoYXMgZmluaXNoZWQgcmVzdGFydGluZy4KIAkgKgpAQCAtMjA4MCw2ICsyMDAyLDE0IEBACiAJCXJlc29sdmUoKTsKIAl9CiAKKwlwdWJsaWMgdm9pZCBzZXJpYWxpemUoSU1lbWVudG8gbWVtZW50bykgeworCQlzYXZlKG1lbWVudG8pOworCX0KKworCXB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKElNZW1lbnRvIG1lbWVudG8pIHsKKwkJbG9hZChtZW1lbnRvKTsKKwl9CisKIAlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlKCkgewogCQlJU2VydmVyVHlwZSBvbGRTZXJ2ZXJUeXBlID0gc2VydmVyVHlwZTsKIAkJU3RyaW5nIHNlcnZlclR5cGVJZCA9IGdldEF0dHJpYnV0ZSgic2VydmVyLXR5cGUtaWQiLCAoU3RyaW5nKW51bGwpOwpAQCAtMjA5OCwxMCArMjAyOCwxNSBAQAogCQljb25maWd1cmF0aW9uID0gbnVsbDsKIAkJaWYgKGNvbmZpZ1BhdGggIT0gbnVsbCkKIAkJCWNvbmZpZ3VyYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChjb25maWdQYXRoKSk7CisKKwkJLy8gZm9yIG1pZ3JhdGlvbiBmcm9tIFdUUCAyLjAgLT4gV1RQIDMuMAorCQlpbnQgYXV0b1B1YlNldHRpbmcgPSBnZXRBdHRyaWJ1dGUoUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORywgQVVUT19QVUJMSVNIX0VOQUJMRSk7CisJCWlmIChhdXRvUHViU2V0dGluZyA9PSAwKQorCQkJbWFwLnB1dChQUk9QX0FVVE9fUFVCTElTSF9TRVRUSU5HLCBBVVRPX1BVQkxJU0hfRU5BQkxFKTsKIAl9CiAKIAlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbChTZXJ2ZXJXb3JraW5nQ29weSB3YykgewotCQltYXAgPSBuZXcgSGFzaE1hcCh3Yy5tYXApOworCQltYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4od2MubWFwKTsKIAkJY29uZmlndXJhdGlvbiA9IHdjLmNvbmZpZ3VyYXRpb247CiAJCXJ1bnRpbWUgPSB3Yy5ydW50aW1lOwogCQlzZXJ2ZXJTeW5jU3RhdGUgPSB3Yy5zZXJ2ZXJTeW5jU3RhdGU7CkBAIC0yMTc3LDggKzIxMTIsOCBAQAogCQl0cnkgewogCQkJcmV0dXJuIGdldERlbGVnYXRlKG1vbml0b3IpLmNhbk1vZGlmeU1vZHVsZXMoYWRkLCByZW1vdmUpOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBjYW5Nb2RpZnlNb2R1bGVzKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgZS5nZXRNZXNzYWdlKCksIG51bGwpOworCQkJU2VydmVyUGx1Z2luLmxvZ0V4dGVuc2lvbkZhaWx1cmUodG9TdHJpbmcoKSwgZSk7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7CiAJCX0KIAl9CiAKQEAgLTIxODgsMTEgKzIxMjMsMTEgQEAKIAlwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoKSB7CiAJCWlmIChtb2R1bGVzID09IG51bGwpIHsKIAkJCS8vIGNvbnZlcnQgZnJvbSBhdHRyaWJ1dGUKLQkJCUxpc3QgbGlzdCA9IGdldEF0dHJpYnV0ZShNT0RVTEVfTElTVCwgKExpc3QpIG51bGwpOworCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBnZXRBdHRyaWJ1dGUoTU9EVUxFX0xJU1QsIChMaXN0PFN0cmluZz4pIG51bGwpOwogCQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKKwkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOwogCQkJCi0JCQltb2R1bGVzID0gbmV3IEFycmF5TGlzdChsaXN0LnNpemUoKSArIDEpOworCQkJbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4obGlzdC5zaXplKCkgKyAxKTsKIAkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwogCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewogCQkJCVN0cmluZyBtb2R1bGVJZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKQEAgLTIyNDcsNyArMjE4Miw3IEBACiAJCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKIAkJdHJ5IHsKLQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgbW9kdWxlU3RhdGUuZ2V0KGdldEtleShtb2R1bGUpKTsKKwkJCUludGVnZXIgaW4gPSBtb2R1bGVTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOwogCQkJaWYgKGluICE9IG51bGwpCiAJCQkJcmV0dXJuIGluLmludFZhbHVlKCk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CkBAIC0yMjYzLDcgKzIxOTgsNyBAQAogCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CiAJCXRyeSB7Ci0JCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIG1vZHVsZVB1Ymxpc2hTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOworCQkJSW50ZWdlciBpbiA9IG1vZHVsZVB1Ymxpc2hTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOwogCQkJaWYgKGluICE9IG51bGwpCiAJCQkJcmV0dXJuIGluLmludFZhbHVlKCk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CkBAIC0yMjkxLDcgKzIyMjYsNyBAQAogCQkJCXJldHVybiBudWxsOwogCQkJcmV0dXJuIGNoaWxkcmVuOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBnZXRDaGlsZE1vZHVsZXMoKSAiICsgdG9TdHJpbmcoKSwgZSk7CisJCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCBlKTsKIAkJCXJldHVybiBudWxsOwogCQl9CiAJfQpAQCAtMjMwNSwxMCArMjI0MCwxMCBAQAogCQl0cnkgewogCQkJcmV0dXJuIGdldERlbGVnYXRlKG1vbml0b3IpLmdldFJvb3RNb2R1bGVzKG1vZHVsZSk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gc2UpIHsKLQkJCS8vVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJDb3JlRXhjZXB0aW9uIGNhbGxpbmcgZGVsZWdhdGUgZ2V0UGFyZW50TW9kdWxlcygpICIgKyB0b1N0cmluZygpICsgIjogIiArIHNlLmdldE1lc3NhZ2UoKSk7CisJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQ29yZUV4Y2VwdGlvbiBjYWxsaW5nIGRlbGVnYXRlIGdldFBhcmVudE1vZHVsZXMoKSAiICsgdG9TdHJpbmcoKSwgc2UpOwogCQkJdGhyb3cgc2U7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIGdldFBhcmVudE1vZHVsZXMoKSAiICsgdG9TdHJpbmcoKSwgZSk7CisJCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCBlKTsKIAkJCXJldHVybiBudWxsOwogCQl9CiAJfQpAQCAtMjMzMiw3ICsyMjY3LDcgQEAKIAkJCWlmIChiKQogCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBjYW5SZXN0YXJ0UnVudGltZSgpICIgKyB0b1N0cmluZygpLCBlKTsKKwkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIGUpOwogCQl9CiAJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUmVzdGFydE1vZHVsZSwgbnVsbCk7CiAJfQpAQCAtMjM0OSw3ICsyMjg0LDcgQEAKIAkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwogCQl0cnkgewotCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIG1vZHVsZVJlc3RhcnRTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOworCQkJQm9vbGVhbiBiID0gbW9kdWxlUmVzdGFydFN0YXRlLmdldChnZXRLZXkobW9kdWxlKSk7CiAJCQlpZiAoYiAhPSBudWxsKQogCQkJCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtMjM2Nyw3ICsyMzAyLDcgQEAKIAkJdHJ5IHsKIAkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG51bGwpLnN0YXJ0TW9kdWxlKG1vZHVsZSwgbnVsbCk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHJlc3RhcnRNb2R1bGUoKSAiICsgdG9TdHJpbmcoKSwgZSk7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHN0YXJ0TW9kdWxlKCkgIiArIHRvU3RyaW5nKCksIGUpOwogCQl9CiAJfQogCkBAIC0yMzgwLDcgKzIzMTUsNyBAQAogCQl0cnkgewogCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkuc3RvcE1vZHVsZShtb2R1bGUsIG51bGwpOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSByZXN0YXJ0TW9kdWxlKCkgIiArIHRvU3RyaW5nKCksIGUpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBzdG9wTW9kdWxlKCkgIiArIHRvU3RyaW5nKCksIGUpOwogCQl9CiAJfQogCkBAIC0yNDA3LDcgKzIzNDIsNyBAQAogCQl0cnkgewogCQkJcmV0dXJuIGdldERlbGVnYXRlKG1vbml0b3IpLmdldFNlcnZlclBvcnRzKCk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIGdldFNlcnZlclBvcnRzKCkgIiArIHRvU3RyaW5nKCksIGUpOworCQkJU2VydmVyUGx1Z2luLmxvZ0V4dGVuc2lvbkZhaWx1cmUodG9TdHJpbmcoKSwgZSk7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX0KQEAgLTI0ODgsNyArMjQyMyw3IEBACiAJCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKIAkJdHJ5IHsKLQkJCXJldHVybiAoSVN0YXR1cykgbW9kdWxlU3RhdHVzLmdldChnZXRLZXkobW9kdWxlKSk7CisJCQlyZXR1cm4gbW9kdWxlU3RhdHVzLmdldChnZXRLZXkobW9kdWxlKSk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQpAQCAtMjU0MSw0ICsyNDc2LDUwOCBAQAogCQlsb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5jbGFzcywgbW9uaXRvcik7CiAJCXJldHVybiBnZXRTZXJ2ZXJTdGF0ZSgpOwogCX0KKworCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hJbXBsKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlczQsIElBZGFwdGFibGUgaW5mbywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0tPi0tIFB1Ymxpc2hpbmcgdG8gc2VydmVyOiAiICsgU2VydmVyLnRoaXMudG9TdHJpbmcoKSArICIgLS0+LS0iKTsKKwkJCisJCXN0b3BBdXRvUHVibGlzaCgpOworCQkKKwkJdHJ5IHsKKwkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJZmlyZVB1Ymxpc2hTdGFydGVkKCk7CisJCQkKKwkJCWdldFNlcnZlclB1Ymxpc2hJbmZvKCkuc3RhcnRDYWNoaW5nKCk7CisJCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7CisJCQl0cnkgeworCQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG1vbml0b3IpLnB1Ymxpc2goa2luZCwgbW9kdWxlczQsIG1vbml0b3IsIGluZm8pOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBkdXJpbmcgcHVibGlzaGluZyIsIGNlKTsKKwkJCQlzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKKwkJCX0KKwkJCQorCQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXMyID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7CisJCQl2aXNpdChuZXcgSU1vZHVsZVZpc2l0b3IoKSB7CisJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZSkgeworCQkJCQlpZiAoZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSkgPT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpCisJCQkJCQlnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmZpbGwobW9kdWxlKTsKKwkJCQkJCisJCQkJCW1vZHVsZXMyLmFkZChtb2R1bGUpOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9LCBtb25pdG9yKTsKKwkJCQorCQkJZ2V0U2VydmVyUHVibGlzaEluZm8oKS5yZW1vdmVEZWxldGVkTW9kdWxlUHVibGlzaEluZm8oU2VydmVyLnRoaXMsIG1vZHVsZXMyKTsKKwkJCWdldFNlcnZlclB1Ymxpc2hJbmZvKCkuY2xlYXJDYWNoZSgpOworCQkJZ2V0U2VydmVyUHVibGlzaEluZm8oKS5zYXZlKCk7CisJCQkKKwkJCWZpcmVQdWJsaXNoRmluaXNoZWQoU3RhdHVzLk9LX1NUQVRVUyk7CisJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlNlcnZlci5wdWJsaXNoKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgcHVibGlzaCgpICIgKyBTZXJ2ZXIudGhpcy50b1N0cmluZygpLCBlKTsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaGluZywgZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgSVN0YXR1cyByZXN0YXJ0SW1wbChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlc3RhcnRpbmcgc2VydmVyOiAiICsgZ2V0TmFtZSgpKTsKKwkJCisJCS8vZmluYWwgSVN0YXR1c1tdIHN0YXR1czIgPSBuZXcgSVN0YXR1c1sxXTsKKwkJCisJCXRyeSB7CisJCQlJU2VydmVyTGlzdGVuZXIgY3VyTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKKwkJCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKKwkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKKwkJCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKKwkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVEFSVEVEKSB7CisJCQkJCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHRoaXMpOworCQkJCQkJCS8vc3RhdHVzMlswXSA9IFN0YXR1cy5PS19TVEFUVVM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQkJCisJCQl0cnkgeworCQkJCWFkZFNlcnZlckxpc3RlbmVyKGN1ckxpc3RlbmVyKTsKKwkJCQkKKwkJCQkvLyBTeW5jaHJvbmVvdXMgcmVzdGFydAorCQkJCXJlc3RhcnRJbXBsMihsYXVuY2hNb2RlLCBtb25pdG9yKTsKKwkJCQkKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihjdXJMaXN0ZW5lcik7CisJCQkJaWYgKGNlLmdldFN0YXR1cygpLmdldENvZGUoKSAhPSAtMSkgeworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHJlc3RhcnQoKSAiICsgU2VydmVyLnRoaXMudG9TdHJpbmcoKSk7CisJCQkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWZpbmFsIFN0cmluZyBtb2RlMyA9IGxhdW5jaE1vZGU7CisJCQkvLyBhZGQgbGlzdGVuZXIgdG8gc3RhcnQgaXQgYXMgc29vbiBhcyBpdCBpcyBzdG9wcGVkCisJCQlhZGRTZXJ2ZXJMaXN0ZW5lcihuZXcgSVNlcnZlckxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKKwkJCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKKwkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKKwkJCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKKwkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKSB7CisJCQkJCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHRoaXMpOworCisJCQkJCQkJLy8gcmVzdGFydCBpbiBhIHF1YXJ0ZXIgc2Vjb25kIChnaXZlIG90aGVyIGxpc3RlbmVycyBhIGNoYW5jZQorCQkJCQkJCS8vIHRvIGhlYXIgdGhlIHN0b3BwZWQgbWVzc2FnZSkKKwkJCQkJCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlNlcnZlciBSZXN0YXJ0IikgeworCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJCVRocmVhZC5zbGVlcCgyNTApOworCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCQkvLyBpZ25vcmUKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCQorCQkJCQkJCQkJU2VydmVyLnRoaXMuc3RhcnQobW9kZTMsIChJT3BlcmF0aW9uTGlzdGVuZXIpbnVsbCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9OworCQkJCQkJCXQuc2V0RGFlbW9uKHRydWUpOworCQkJCQkJCXQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgLSAyKTsKKwkJCQkJCQl0LnN0YXJ0KCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJLy8gc3RvcCB0aGUgc2VydmVyCisJCQlzdG9wKGZhbHNlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc3RhcnRpbmcgc2VydmVyIiwgZSk7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0RmFpbGVkLCBnZXROYW1lKCkpLCBudWxsKTsKKwkJfQorCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwl9CisKKwkvKioKKwkgKiBTeW5jaHJvbmVvdXMgcmVzdGFydC4gVGhyb3dzIGEgY29yZSBleGNlcHRpb24gaW4gY2FzZSB0aGUgdGhlIGFkb3B0ZXIgZG9lc24ndCBpbXBsZW1lbnQgcmVzdGFydCAKKwkgKiBAcGFyYW0gbGF1bmNoTW9kZQorCSAqIEBwYXJhbSBtb25pdG9yCisJICogQHJldHVybiBJU3RhdHVzIAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCBJU3RhdHVzIHJlc3RhcnRJbXBsMihTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKKwkJZmluYWwgYm9vbGVhbltdIG5vdGlmaWVkID0gbmV3IGJvb2xlYW5bMV07CisJCQorCQkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIHNlcnZlcgorCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgeworCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7CisJCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKKwkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgeworCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKKwkJCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgeworCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgorCQkJCQkJc3luY2hyb25pemVkIChub3RpZmllZCkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzUmVzdGFydCBub3RpZnkiKTsKKwkJCQkJCQkJbm90aWZpZWRbMF0gPSB0cnVlOworCQkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKKwkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHJlc3RhcnQiLCBlKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisJCWFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWZpbmFsIGludCByZXN0YXJ0VGltZW91dCA9IChnZXRTdGFydFRpbWVvdXQoKSAqIDEwMDApICsgKGdldFN0b3BUaW1lb3V0KCkgKiAxMDAwKTsKKwkJY2xhc3MgVGltZXIgeworCQkJYm9vbGVhbiB0aW1lb3V0OworCQkJYm9vbGVhbiBhbHJlYWR5RG9uZTsKKwkJfQorCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOworCQkKKwkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMiA9IG1vbml0b3I7CisJCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCJTZXJ2ZXIgUmVzdGFydCBUaW1lb3V0IikgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyeSB7CisJCQkJCWludCB0b3RhbFRpbWVvdXQgPSByZXN0YXJ0VGltZW91dDsKKwkJCQkJaWYgKHRvdGFsVGltZW91dCA8IDApCisJCQkJCQl0b3RhbFRpbWVvdXQgPSAxOworCQkJCQlib29sZWFuIHVzZXJDYW5jZWxsZWQgPSBmYWxzZTsKKwkJCQkJaW50IHJldHJ5UGVyaW9kID0gMjUwMDsKKwkJCQkJd2hpbGUgKCFub3RpZmllZFswXSAmJiB0b3RhbFRpbWVvdXQgPiAwICYmICF1c2VyQ2FuY2VsbGVkICYmICF0aW1lci5hbHJlYWR5RG9uZSkgeworCQkJCQkJVGhyZWFkLnNsZWVwKHJldHJ5UGVyaW9kKTsKKwkJCQkJCWlmIChyZXN0YXJ0VGltZW91dCA+IDApCisJCQkJCQkJdG90YWxUaW1lb3V0IC09IHJldHJ5UGVyaW9kOworCQkJCQkJaWYgKCFub3RpZmllZFswXSAmJiAhdGltZXIuYWxyZWFkeURvbmUgJiYgbW9uaXRvcjIuaXNDYW5jZWxlZCgpKSB7CisJCQkJCQkJLy8gdXNlciBjYW5jZWxlZCAtIHNldCB0aGUgc2VydmVyIHN0YXRlIHRvIHN0b3BwZWQKKwkJCQkJCQl1c2VyQ2FuY2VsbGVkID0gdHJ1ZTsKKwkJCQkJCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQRUQpOworCQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKKwkJCQkJCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7CisJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzUmVzdGFydCB1c2VyIGNhbmNlbGxlZCIpOworCQkJCQkJCQlub3RpZmllZFswXSA9IHRydWU7CisJCQkJCQkJCW5vdGlmaWVkLm5vdGlmeUFsbCgpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoIXVzZXJDYW5jZWxsZWQgJiYgIXRpbWVyLmFscmVhZHlEb25lICYmICFub3RpZmllZFswXSkgeworCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgorCQkJCQkJc3luY2hyb25pemVkIChub3RpZmllZCkgeworCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzUmVzdGFydCBub3RpZnkgdGltZW91dCIpOworCQkJCQkJCWlmICghdGltZXIuYWxyZWFkeURvbmUgJiYgdG90YWxUaW1lb3V0IDw9IDApCisJCQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOworCQkJCQkJCW5vdGlmaWVkWzBdID0gdHJ1ZTsKKwkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgcmVzdGFydCB0aW1lb3V0IiwgZSk7CisJCQkJfQorCQkJfQorCQl9OworCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOworCQl0aHJlYWQuc3RhcnQoKTsKKwkKKwkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNSZXN0YXJ0IDIiKTsKKwkKKwkJLy8gY2FsbCB0aGUgZGVsZWdhdGUgcmVzdGFydAorCQl0cnkgeworCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkucmVzdGFydChsYXVuY2hNb2RlKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihlLmdldFN0YXR1cygpKTsKKwkJfQorCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKKwkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKwkJfQorCQkKKwkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNSZXN0YXJ0IDMiKTsKKwkJCisJCS8vIHdhaXQgZm9yIGl0ISB3YWl0IGZvciBpdCEgLi4uCisJCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKKwkJCXRyeSB7CisJCQkJd2hpbGUgKCFub3RpZmllZFswXSAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgIXRpbWVyLnRpbWVvdXQKKwkJCQkJCSYmICEoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpKSB7CisJCQkJCW5vdGlmaWVkLndhaXQoKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdhaXRpbmcgZm9yIHNlcnZlciByZXN0YXJ0IiwgZSk7CisJCQl9CisJCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7CisJCX0KKwkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOworCQkKKwkJaWYgKHRpbWVyLnRpbWVvdXQpIHsKKwkJCXN0b3AoZmFsc2UpOworCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JSZXN0YXJ0RmFpbGVkLCBuZXcgU3RyaW5nW10geyBnZXROYW1lKCksIChyZXN0YXJ0VGltZW91dCAvIDEwMDApICsgIiIgfSksIG51bGwpOworCQl9CisJCQorCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclJlc3RhcnRGYWlsZWQsIGdldE5hbWUoKSksIG51bGwpOworCQkKKwkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNSZXN0YXJ0IDQiKTsKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCQorCXByb3RlY3RlZCBJU3RhdHVzIHN0YXJ0SW1wbChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWZpbmFsIGJvb2xlYW5bXSBub3RpZmllZCA9IG5ldyBib29sZWFuWzFdOworCQkKKwkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOworCQkKKwkJLy8gYWRkIGxpc3RlbmVyIHRvIHRoZSBzZXJ2ZXIKKwkJSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKKwkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOworCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7CisJCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKKwkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7CisJCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7CisJCQkJCQkvLyBub3RpZnkgd2FpdGVyCisJCQkJCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCBub3RpZnkiKTsKKwkJCQkJCQkJbm90aWZpZWRbMF0gPSB0cnVlOworCQkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKKwkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0YXJ0IiwgZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCQlhZGRTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlmaW5hbCBpbnQgc2VydmVyVGltZW91dCA9IGdldFN0YXJ0VGltZW91dCgpICogMTAwMDsKKwkJY2xhc3MgVGltZXIgeworCQkJYm9vbGVhbiB0aW1lb3V0OworCQkJYm9vbGVhbiBhbHJlYWR5RG9uZTsKKwkJfQorCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOworCQkKKwkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMiA9IG1vbml0b3I7CisJCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCJTZXJ2ZXIgU3RhcnQgVGltZW91dCIpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlpbnQgdG90YWxUaW1lb3V0ID0gc2VydmVyVGltZW91dDsKKwkJCQkJaWYgKHRvdGFsVGltZW91dCA8IDApCisJCQkJCQl0b3RhbFRpbWVvdXQgPSAxOworCQkJCQlib29sZWFuIHVzZXJDYW5jZWxsZWQgPSBmYWxzZTsKKwkJCQkJaW50IHJldHJ5UGVyaW9kID0gMTAwMDsKKwkJCQkJd2hpbGUgKCFub3RpZmllZFswXSAmJiB0b3RhbFRpbWVvdXQgPiAwICYmICF1c2VyQ2FuY2VsbGVkICYmICF0aW1lci5hbHJlYWR5RG9uZSkgeworCQkJCQkJVGhyZWFkLnNsZWVwKHJldHJ5UGVyaW9kKTsKKwkJCQkJCWlmIChzZXJ2ZXJUaW1lb3V0ID4gMCkKKwkJCQkJCQl0b3RhbFRpbWVvdXQgLT0gcmV0cnlQZXJpb2Q7CisJCQkJCQlpZiAoIW5vdGlmaWVkWzBdICYmICF0aW1lci5hbHJlYWR5RG9uZSAmJiBtb25pdG9yMi5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJCQkvLyB1c2VyIGNhbmNlbGVkIC0gc2V0IHRoZSBzZXJ2ZXIgc3RhdGUgdG8gc3RvcHBlZAorCQkJCQkJCXVzZXJDYW5jZWxsZWQgPSB0cnVlOworCQkJCQkJCWlmIChsYXVuY2ggIT0gbnVsbCAmJiAhbGF1bmNoLmlzVGVybWluYXRlZCgpKQorCQkJCQkJCQlsYXVuY2gudGVybWluYXRlKCk7CisJCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgorCQkJCQkJCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKKwkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCB1c2VyIGNhbmNlbGxlZCIpOworCQkJCQkJCQlub3RpZmllZFswXSA9IHRydWU7CisJCQkJCQkJCW5vdGlmaWVkLm5vdGlmeUFsbCgpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoIXVzZXJDYW5jZWxsZWQgJiYgIXRpbWVyLmFscmVhZHlEb25lICYmICFub3RpZmllZFswXSkgeworCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgorCQkJCQkJc3luY2hyb25pemVkIChub3RpZmllZCkgeworCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgbm90aWZ5IHRpbWVvdXQiKTsKKwkJCQkJCQlpZiAoIXRpbWVyLmFscmVhZHlEb25lICYmIHRvdGFsVGltZW91dCA8PSAwKQorCQkJCQkJCQl0aW1lci50aW1lb3V0ID0gdHJ1ZTsKKwkJCQkJCQlub3RpZmllZFswXSA9IHRydWU7CisJCQkJCQkJbm90aWZpZWQubm90aWZ5QWxsKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0YXJ0IHRpbWVvdXQiLCBlKTsKKwkJCQl9CisJCQl9CisJCX07CisJCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisJCXRocmVhZC5zdGFydCgpOworCQorCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDIiKTsKKwkKKwkJLy8gc3RhcnQgdGhlIHNlcnZlcgorCQl0cnkgeworCQkJc3RhcnRJbXBsMihsYXVuY2hNb2RlLCBtb25pdG9yKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7CisJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKKwkJfQorCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKKwkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKwkJfQorCQkKKwkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCAzIik7CisJCQorCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhIC4uLgorCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7CisJCQl0cnkgeworCQkJCXdoaWxlICghbm90aWZpZWRbMF0gJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmICF0aW1lci50aW1lb3V0CisJCQkJCQkmJiAhKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8IGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSkgeworCQkJCQlub3RpZmllZC53YWl0KCk7CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3YWl0aW5nIGZvciBzZXJ2ZXIgc3RhcnQiLCBlKTsKKwkJCX0KKwkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKKwkJfQorCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlpZiAodGltZXIudGltZW91dCkgeworCQkJc3RvcChmYWxzZSk7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0VGltZW91dCwgbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZSgpLCAoc2VydmVyVGltZW91dCAvIDEwMDApICsgIiIgfSksIG51bGwpOworCQl9CisJCQorCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmIGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTdGFydEZhaWxlZCwgZ2V0TmFtZSgpKSwgbnVsbCk7CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDQiKTsKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc3RhcnRJbXBsMihTdHJpbmcgbW9kZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTdGFydGluZyBzZXJ2ZXI6ICIgKyBTZXJ2ZXIudGhpcy50b1N0cmluZygpICsgIiwgbGF1bmNoTW9kZTogIiArIG1vZGUyKTsKKwkJCisJCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWxlZ2F0ZSBpcyBsb2FkZWQgYW5kIHRoZSBzZXJ2ZXIgc3RhdGUgaXMgY29ycmVjdAorCQlsb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5jbGFzcywgbW9uaXRvcik7CisJCQorCQl0cnkgeworCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbih0cnVlLCBtb25pdG9yKTsKKwkJCS8vaWYgKGxhdW5jaENvbmZpZyA9PSBudWxsKQorCQkJLy8JdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oKTsKKwkJCWxhdW5jaCA9IGxhdW5jaENvbmZpZy5sYXVuY2gobW9kZTIsIG1vbml0b3IpOyAvLyAsIHRydWUpOyAtIGNhdXNlcyB3b3Jrc3BhY2UgbG9jaworCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTGF1bmNoOiAiICsgbGF1bmNoKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzdGFydGluZyBzZXJ2ZXIgIiArIFNlcnZlci50aGlzLnRvU3RyaW5nKCksIGUpOworCQkJdGhyb3cgZTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBJU3RhdHVzIHN0b3BJbXBsKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlmaW5hbCBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7CisJCQorCQkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIHNlcnZlcgorCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgeworCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7CisJCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKKwkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgeworCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKKwkJCQkJaWYgKFNlcnZlci50aGlzID09IHNlcnZlciAmJiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkpIHsKKwkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKKwkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKKwkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0b3AiLCBlKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisJCWFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWNsYXNzIFRpbWVyIHsKKwkJCWJvb2xlYW4gdGltZW91dDsKKwkJCWJvb2xlYW4gYWxyZWFkeURvbmU7CisJCX0KKwkJZmluYWwgVGltZXIgdGltZXIgPSBuZXcgVGltZXIoKTsKKwkJCisJCWZpbmFsIGludCBzZXJ2ZXJUaW1lb3V0ID0gZ2V0U3RvcFRpbWVvdXQoKSAqIDEwMDA7CisJCWlmIChzZXJ2ZXJUaW1lb3V0ID4gMCkgeworCQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoIlNlcnZlciBTdG9wIFRpbWVvdXQiKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQl0cnkgeworCQkJCQkJVGhyZWFkLnNsZWVwKHNlcnZlclRpbWVvdXQpOworCQkJCQkJaWYgKCF0aW1lci5hbHJlYWR5RG9uZSkgeworCQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOworCQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKKwkJCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN0b3Agbm90aWZ5IHRpbWVvdXQiKTsKKwkJCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIHNlcnZlciBzdG9wIHRpbWVvdXQiLCBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX07CisJCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOworCQkJdGhyZWFkLnN0YXJ0KCk7CisJCX0KKwkJCisJCS8vIHN0b3AgdGhlIHNlcnZlcgorCQlzdG9wSW1wbDIoZm9yY2UpOworCQkKKwkJLy8gd2FpdCBmb3IgaXQhIHdhaXQgZm9yIGl0IQorCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisJCQl0cnkgeworCQkJCXdoaWxlICghdGltZXIudGltZW91dCAmJiBnZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCAmJgorCQkJCQkJZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCisJCQkJCW11dGV4LndhaXQoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2FpdGluZyBmb3Igc2VydmVyIHN0b3AiLCBlKTsKKwkJCX0KKwkJfQorCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQkvL2Nhbid0IHRocm93IGV4Y2VwdGlvbnMKKwkJLyppZiAodGltZXIudGltZW91dCkKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yU3RhcnRUaW1lb3V0LCBnZXROYW1lKCkpLCBudWxsKTsKKwkJZWxzZQorCQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOworCQkqLworCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0b3BGYWlsZWQsIGdldE5hbWUoKSksIG51bGwpOworCQkKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc3RvcEltcGwyKGJvb2xlYW4gZm9yY2UpIHsKKwkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBFRCkKKwkJCXJldHVybjsKKwkJCisJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlN0b3BwaW5nIHNlcnZlcjogIiArIFNlcnZlci50aGlzLnRvU3RyaW5nKCkpOworCQkKKwkJdHJ5IHsKKwkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG51bGwpLnN0b3AoZm9yY2UpOworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgc3RvcCgpICIgKyBTZXJ2ZXIudGhpcy50b1N0cmluZygpLCBlKTsKKwkJCXRocm93IGU7CisJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHN0b3AoKSAiICsgU2VydmVyLnRoaXMudG9TdHJpbmcoKSwgdCk7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7CisJCXJldHVybiAocnVsZSBpbnN0YW5jZW9mIElTZXJ2ZXIgfHwgcnVsZSBpbnN0YW5jZW9mIFNlcnZlclNjaGVkdWxpbmdSdWxlKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7CisJCWlmICghKHJ1bGUgaW5zdGFuY2VvZiBJU2VydmVyKSAmJiAhKHJ1bGUgaW5zdGFuY2VvZiBTZXJ2ZXJTY2hlZHVsaW5nUnVsZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpZiAocnVsZSBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKwkJCUlTZXJ2ZXIgcyA9IChJU2VydmVyKSBydWxlOworCQkJcmV0dXJuIHRoaXMuZXF1YWxzKHMpOworCQl9CisJCVNlcnZlclNjaGVkdWxpbmdSdWxlIHNzcnVsZSA9IChTZXJ2ZXJTY2hlZHVsaW5nUnVsZSkgcnVsZTsKKwkJcmV0dXJuIHNzcnVsZS5zZXJ2ZXIuZXF1YWxzKHRoaXMpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBnZXROYW1lKCk7CisJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3IuamF2YQppbmRleCAyM2EwMDlhLi4zMGRjNmI5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvci5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjYsNyArNjYsNyBAQAogCQkJdHJ5IHsKIAkJCQlkZWxlZ2F0ZSA9IChTZXJ2ZXJNb25pdG9yRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKIAkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpICsgIjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIHQpOwogCQkJfQogCQl9CiAJCXJldHVybiBkZWxlZ2F0ZTsKQEAgLTg4LDcgKzg4LDcgQEAKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewogCQkJdGhyb3cgY2U7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtMTAzLDcgKzEwMyw3IEBACiAJCXRyeSB7CiAJCQlnZXREZWxlZ2F0ZSgpLnN0b3BNb25pdG9yaW5nKHNlcnZlciwgcG9ydCk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwogCQl9CiAJfQogCkBAIC0xMTUsNCArMTE1LDQgQEAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlyZXR1cm4gIk1vbml0b3JbIiArIGdldElkKCkgKyAiXSI7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yTWFuYWdlci5qYXZhCmluZGV4IDk5NmI3OGUuLmY1NDE3MDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvck1hbmFnZXIuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI1LDcgKzI1LDcgQEAKIAkKIAlwcm90ZWN0ZWQgc3RhdGljIFNlcnZlck1vbml0b3JNYW5hZ2VyIGluc3RhbmNlOwogCi0JcHJvdGVjdGVkIExpc3QgcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7IAorCXByb3RlY3RlZCBMaXN0PE1vbml0b3JlZFBvcnQ+IHBvcnRzID0gbmV3IEFycmF5TGlzdDxNb25pdG9yZWRQb3J0PigpOyAKIAlwcm90ZWN0ZWQgU2VydmVyTW9uaXRvciBtb25pdG9yOwogCQogCWNsYXNzIE1vbml0b3JlZFBvcnQgaW1wbGVtZW50cyBJTW9uaXRvcmVkU2VydmVyUG9ydCB7CkBAIC0yMTIsNyArMjEyLDcgQEAKIAkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgbW9uaXRvcmVkIHNlcnZlciBwb3J0cwogCSAqLwogCXB1YmxpYyBJTW9uaXRvcmVkU2VydmVyUG9ydFtdIGdldE1vbml0b3JlZFBvcnRzKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdDxJTW9uaXRvcmVkU2VydmVyUG9ydD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vbml0b3JlZFNlcnZlclBvcnQ+KCk7CiAJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydHMuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewogCQkJTW9uaXRvcmVkUG9ydCBtcCA9IChNb25pdG9yZWRQb3J0KSBpdGVyYXRvci5uZXh0KCk7CkBAIC0yMjAsOSArMjIwLDcgQEAKIAkJCQlsaXN0LmFkZChtcCk7CiAJCX0KIAkJCi0JCUlNb25pdG9yZWRTZXJ2ZXJQb3J0W10gbXNwID0gbmV3IElNb25pdG9yZWRTZXJ2ZXJQb3J0W2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KG1zcCk7Ci0JCXJldHVybiBtc3A7CisJCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb25pdG9yZWRTZXJ2ZXJQb3J0W2xpc3Quc2l6ZSgpXSk7CiAJfQogCiAJLyoqCkBAIC0zNjUsNyArMzYzLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9uaXRvciBpbmZvOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIG1vbml0b3IgaW5mbyIsIGUpOwogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQppbmRleCA1ZmYyYjFmLi4zMDkyZjU0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTm90aWZpY2F0aW9uTWFuYWdlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIwLDcgKzIwLDcgQEAKICAqIE5vdGlmaWNhdGlvbiBtYW5hZ2VyIGZvciBzZXJ2ZXIuCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyIHsKLQlwcml2YXRlIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCXByaXZhdGUgTGlzdDxMaXN0ZW5lckVudHJ5PiBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RlbmVyRW50cnk+KCk7CiAKIAkvKioKIAkgKiBGb3IgbWFza2luZyBldmVudCBvbiBhbGwgY2hhbmdlcy4KQEAgLTkxLDEyICs5MSwxMiBAQAogCQlMaXN0ZW5lckVudHJ5W10gbGlzdGVuZXJzOwogCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTGlzdCkgewogCQkJc2l6ZSA9IGxpc3RlbmVyTGlzdC5zaXplKCk7Ci0JCQlsaXN0ZW5lcnMgPSAoTGlzdGVuZXJFbnRyeVtdKSBsaXN0ZW5lckxpc3QudG9BcnJheShuZXcgTGlzdGVuZXJFbnRyeVtzaXplXSk7CisJCQlsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QudG9BcnJheShuZXcgTGlzdGVuZXJFbnRyeVtzaXplXSk7CiAJCX0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKIAkJCUxpc3RlbmVyRW50cnkgY3VyRW50cnkgPSBsaXN0ZW5lcnNbaV07CiAJCQlpbnQgbWFzayA9IGN1ckVudHJ5LmdldEV2ZW50TWFzaygpOwotCisJCQkKIAkJCS8vIGNoZWNrIGlmIHRoZSB0eXBlIG9mIHRoZSBldmVudCBtYXRjaGVzIHRoZSBtYXNrLCBlLmcuIHNlcnZlciBvciBtb2R1bGUgY2hhbmdlCiAJCQlib29sZWFuIGlzVHlwZU1hdGNoID0gKChtYXNrICYgZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSkgIT0gMCkgCiAJCQkJCXx8ICgobWFzayAmIGV2ZW50S2luZCAmIFNlcnZlckV2ZW50Lk1PRFVMRV9DSEFOR0UpICE9IDApOwpAQCAtMTExLDIxICsxMTEsMjEgQEAKIAkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIEVycm9yIGZpcmluZyBzZXJ2ZXIgZXZlbnQ6ICIgKyBjdXJFbnRyeS5nZXRMaXN0ZW5lcigpLCBlKTsKIAkJCQl9Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLTwtIERvbmUgRmlyaW5nIHNlcnZlciBldmVudCAtPC0iKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPC0gRG9uZSBmaXJpbmcgc2VydmVyIGV2ZW50IC08LSIpOwogCQkJfQogCQl9CiAJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi08LSBEb25lIGJyb2FkY2FzdGluZyBzZXJ2ZXIgZXZlbnQgLTwtIik7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIG5vdCBlbXB0eTsgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eSwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBub3QgZW1wdHk7IG90aGVyd2lzZSwgcmV0dXJucyBmYWxzZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eSwgb3IgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJFbnRyaWVzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJMaXN0LnNpemUoKSA9PSAwOworCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgeworCQlyZXR1cm4gbGlzdGVuZXJMaXN0LmlzRW1wdHkoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZW1vdmUgYSBsaXN0ZW5lciBmcm9tIG5vdGlmaWNhdGlvbi4KIAkgKiAKQEAgLTEzMywyMSArMTMzLDIwIEBACiAJICovCiAJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGN1ckxpc3RlbmVyKSB7CiAJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBSZW1vdmluZyBzZXJ2ZXIgbGlzdGVuZXIgZnJvbSBub3RpZmljYXRpb24gbWFuYWdlcjogIiArIGN1ckxpc3RlbmVyICsgIiAtPi0iKTsKLQkJaWYgKGN1ckxpc3RlbmVyID09IG51bGwpIHsKKwkJaWYgKGN1ckxpc3RlbmVyID09IG51bGwpCiAJCQlyZXR1cm47Ci0JCX0KLQkJTGlzdGVuZXJFbnRyeSBtYXRjaGVkTGlzdGVuZXJFbnRyeSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGxpc3RlbmVySXRlciA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAobWF0Y2hlZExpc3RlbmVyRW50cnkgPT0gbnVsbCAmJiBsaXN0ZW5lckl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlMaXN0ZW5lckVudHJ5IGN1ckVudHJ5ID0gKExpc3RlbmVyRW50cnkpbGlzdGVuZXJJdGVyLm5leHQoKTsKLQkJCWlmIChjdXJMaXN0ZW5lci5lcXVhbHMoY3VyRW50cnkuZ2V0TGlzdGVuZXIoKSkpIHsKLQkJCQltYXRjaGVkTGlzdGVuZXJFbnRyeSA9IGN1ckVudHJ5OworCQkKKwkJc3luY2hyb25pemVkIChsaXN0ZW5lckxpc3QpIHsKKwkJCUxpc3RlbmVyRW50cnkgbWF0Y2hlZExpc3RlbmVyRW50cnkgPSBudWxsOworCQkJSXRlcmF0b3IgbGlzdGVuZXJJdGVyID0gbGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7CisJCQl3aGlsZSAobWF0Y2hlZExpc3RlbmVyRW50cnkgPT0gbnVsbCAmJiBsaXN0ZW5lckl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJTGlzdGVuZXJFbnRyeSBjdXJFbnRyeSA9IChMaXN0ZW5lckVudHJ5KWxpc3RlbmVySXRlci5uZXh0KCk7CisJCQkJaWYgKGN1ckxpc3RlbmVyLmVxdWFscyhjdXJFbnRyeS5nZXRMaXN0ZW5lcigpKSkgeworCQkJCQltYXRjaGVkTGlzdGVuZXJFbnRyeSA9IGN1ckVudHJ5OworCQkJCX0KIAkJCX0KLQkJfQotCQlpZiAobWF0Y2hlZExpc3RlbmVyRW50cnkgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxpc3QpIHsKKwkJCWlmIChtYXRjaGVkTGlzdGVuZXJFbnRyeSAhPSBudWxsKQogCQkJCWxpc3RlbmVyTGlzdC5yZW1vdmUobWF0Y2hlZExpc3RlbmVyRW50cnkpOwotCQkJfQogCQl9CiAJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUGx1Z2luLmphdmEKaW5kZXggODVhNmY3Mi4uM2I5MmY0MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUGx1Z2luLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUGx1Z2luLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksNyArMTksMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXZlbnQ7CkBAIC0yOSw2ICszNCw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUFJFRl9GSUxFID0gIi5zZXJ2ZXJQcmVmZXJlbmNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX1NFUlZFUl9BREFQVEVSUyA9ICJleGNsdWRlU2VydmVyQWRhcHRlcnMiOwogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIVVRET1dOX0pPQl9GQU1JTFkgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmZhbWlseSI7CiAJLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdJU1RSWV9KT0JfRkFNSUxZID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucmVnaXN0cnkuZmFtaWx5IjsKQEAgLTM3LDM0ICs0MywzNyBAQAogCXByb3RlY3RlZCBzdGF0aWMgaW50IG51bSA9IDA7CiAKIAkvLyBjYWNoZWQgY29weSBvZiBhbGwgbGF1bmNoYWJsZSBhZGFwdGVycwotCXByaXZhdGUgc3RhdGljIExpc3QgbGF1bmNoYWJsZUFkYXB0ZXJzOworCXByaXZhdGUgc3RhdGljIExpc3Q8TGF1bmNoYWJsZUFkYXB0ZXI+IGxhdW5jaGFibGVBZGFwdGVyczsKIAogCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBsYXVuY2hhYmxlIGNsaWVudHMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGNsaWVudHM7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxJQ2xpZW50PiBjbGllbnRzOwogCiAJLy8gY2FjaGVkIGNvcHkgb2YgYWxsIG1vZHVsZSBmYWN0b3JpZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IG1vZHVsZUZhY3RvcmllczsKKwlwcml2YXRlIHN0YXRpYyBMaXN0PE1vZHVsZUZhY3Rvcnk+IG1vZHVsZUZhY3RvcmllczsKIAogCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCiAJcHJpdmF0ZSBzdGF0aWMgU2VydmVyUGx1Z2luIHNpbmdsZXRvbjsKIAogCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBwdWJsaXNoIHRhc2tzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBwdWJsaXNoVGFza3M7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxJUHVibGlzaFRhc2s+IHB1Ymxpc2hUYXNrczsKKworCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBwdWJsaXNoZXJzCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxQdWJsaXNoZXI+IHB1Ymxpc2hlcnM7CiAKIAkvLwljYWNoZWQgY29weSBvZiBhbGwgc2VydmVyIG1vbml0b3JzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBtb25pdG9yczsKKwlwcml2YXRlIHN0YXRpYyBMaXN0PElTZXJ2ZXJNb25pdG9yPiBtb25pdG9yczsKIAogCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIGxvY2F0b3JzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBydW50aW1lTG9jYXRvcnM7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxJUnVudGltZUxvY2F0b3I+IHJ1bnRpbWVMb2NhdG9yczsKIAogCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBtb2R1bGUgYXJ0aWZhY3QgYWRhcHRlcnMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IG1vZHVsZUFydGlmYWN0QWRhcHRlcnM7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxNb2R1bGVBcnRpZmFjdEFkYXB0ZXI+IG1vZHVsZUFydGlmYWN0QWRhcHRlcnM7CiAKIAkvLwljYWNoZWQgY29weSBvZiBhbGwgaW5zdGFsbGFibGUgc2VydmVycwotCXByaXZhdGUgc3RhdGljIExpc3QgaW5zdGFsbGFibGVTZXJ2ZXJzOworCXByaXZhdGUgc3RhdGljIExpc3Q8SUluc3RhbGxhYmxlU2VydmVyPiBpbnN0YWxsYWJsZVNlcnZlcnM7CiAKIAkvLwljYWNoZWQgY29weSBvZiBhbGwgaW5zdGFsbGFibGUgcnVudGltZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGluc3RhbGxhYmxlUnVudGltZXM7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxJSW5zdGFsbGFibGVSdW50aW1lPiBpbnN0YWxsYWJsZVJ1bnRpbWVzOwogCiAJLy8gcmVnaXN0cnkgbGlzdGVuZXIKIAlwcml2YXRlIHN0YXRpYyBJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciByZWdpc3RyeUxpc3RlbmVyOwpAQCAtODIsNyArOTEsNyBAQAogCX0KIAogCS8vIHRlbXAgZGlyZWN0b3JpZXMgLSBTdHJpbmcga2V5IHRvIFRlbXBEaXIKLQlwcm90ZWN0ZWQgTWFwIHRlbXBEaXJIYXNoOworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBUZW1wRGlyPiB0ZW1wRGlySGFzaDsKIAogCS8qKgogCSAqIHNlcnZlciBjb3JlIHBsdWdpbiBpZApAQCAtMTMyLDcgKzE0MSw3IEBACiAJCS8vIGZpcnN0LCBsb29rIHRocm91Z2ggaGFzaCBvZiBjdXJyZW50IGRpcmVjdG9yaWVzCiAJCUlQYXRoIHN0YXRlUGF0aCA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKTsKIAkJdHJ5IHsKLQkJCVRlbXBEaXIgZGlyID0gKFRlbXBEaXIpIHRlbXBEaXJIYXNoLmdldChrZXkpOworCQkJVGVtcERpciBkaXIgPSB0ZW1wRGlySGFzaC5nZXQoa2V5KTsKIAkJCWlmIChkaXIgIT0gbnVsbCkgewogCQkJCWRpci5hZ2UgPSAwOwogCQkJCXJldHVybiBzdGF0ZVBhdGguYXBwZW5kKGRpci5wYXRoKTsKQEAgLTE3Miw3ICsxODEsNyBAQAogCQkKIAkJSVBhdGggc3RhdGVQYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpOwogCQl0cnkgewotCQkJVGVtcERpciBkaXIgPSAoVGVtcERpcikgdGVtcERpckhhc2guZ2V0KGtleSk7CisJCQlUZW1wRGlyIGRpciA9IHRlbXBEaXJIYXNoLmdldChrZXkpOwogCQkJaWYgKGRpciAhPSBudWxsKSB7CiAJCQkJdGVtcERpckhhc2gucmVtb3ZlKGtleSk7CiAJCQkJc2F2ZVRlbXBEaXJJbmZvKCk7CkBAIC0xOTEsNyArMjAwLDcgQEAKIAkJSVBhdGggc3RhdGVQYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpOwogCQlTdHJpbmcgZmlsZW5hbWUgPSBzdGF0ZVBhdGguYXBwZW5kKFRFTVBfREFUQV9GSUxFKS50b09TU3RyaW5nKCk7CiAJCQotCQl0ZW1wRGlySGFzaCA9IG5ldyBIYXNoTWFwKCk7CisJCXRlbXBEaXJIYXNoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUZW1wRGlyPigpOwogCQl0cnkgewogCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZmlsZW5hbWUpOwogCQkJCkBAIC0yMDgsNyArMjE3LDcgQEAKIAkJCQl0ZW1wRGlySGFzaC5wdXQoa2V5LCBkKTsKIAkJCX0KIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluZm9ybWF0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW5mb3JtYXRpb24iLCBlKTsKIAkJfQogCX0KIApAQCAtMjM1LDcgKzI0NCw3IEBACiAJCQlJdGVyYXRvciBpdGVyYXRvciA9IHRlbXBEaXJIYXNoLmtleVNldCgpLml0ZXJhdG9yKCk7CiAJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CiAJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlUZW1wRGlyIGQgPSAoVGVtcERpcikgdGVtcERpckhhc2guZ2V0KGtleSk7CisJCQkJVGVtcERpciBkID0gdGVtcERpckhhc2guZ2V0KGtleSk7CiAJCiAJCQkJaWYgKGQuYWdlIDwgNSkgewogCQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoInRlbXAtZGlyZWN0b3J5Iik7CkBAIC0zMjMsNiArMzMyLDcwIEBACiAJfQogCiAJLyoqCisJICogTG9ncyBhbiBlcnJvciBtZXNzYWdlIGNhdXNlZCBieSBhIG1pc3Npbmcgb3IgZmFpbGVkIGV4dGVuc2lvbgorCSAqIChzZXJ2ZXIgYWRhcHRlcnMsIHJ1bnRpbWUsIGNsYXNzLXBhdGggcHJvdmlkZXIsIGV0Yy4pLiBBIHNpbmdsZQorCSAqIGVycm9yIGlzIG91dHB1dCB0byB0aGUgLmxvZyAob25jZSBwZXIgc2Vzc2lvbikgYW5kIHRoZSBmdWxsCisJICogZXhjZXB0aW9uIGlzIG91dHB1dCB0byB0cmFjaW5nLgorCSAqIAorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIG1pc3NpbmcvZmFpbGVkIGV4dGVuc2lvbgorCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlIG9yIGV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeHRlbnNpb25GYWlsdXJlKFN0cmluZyBpZCwgVGhyb3dhYmxlIHQpIHsKKwkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiTWlzc2luZyBvciBmYWlsZWQgc2VydmVyIGV4dGVuc2lvbjogIiArIGlkICsgIi4gRW5hYmxlIHRyYWNpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24iKTsKKwkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkV4Y2VwdGlvbiBpbiBzZXJ2ZXIgZGVsZWdhdGUiLCB0KTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFsbChMaXN0PE9iamVjdD4gbGlzdCwgT2JqZWN0W10gb2JqKSB7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWludCBzaXplID0gb2JqLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWxpc3QuYWRkKG9ialtpXSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgYSBzZXJ2ZXIgb3IgcnVudGltZSBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50IGFuIG9iamVjdAorCSAqIEBwYXJhbSBuYW1lIGEgbmFtZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5hbWUgaXMgaW4gdXNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogICAgb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZUluVXNlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgbmFtZSkgeworCQlpZiAobmFtZSA9PSBudWxsKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkKKwkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWUpCisJCQlhZGRBbGwobGlzdCwgU2VydmVyQ29yZS5nZXRSdW50aW1lcygpKTsKKwkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlckF0dHJpYnV0ZXMpCisJCQlhZGRBbGwobGlzdCwgU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCkpOworCQkKKwkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgeworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZVdvcmtpbmdDb3B5KQorCQkJCWVsZW1lbnQgPSAoKElSdW50aW1lV29ya2luZ0NvcHkpIGVsZW1lbnQpLmdldE9yaWdpbmFsKCk7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJXb3JraW5nQ29weSkKKwkJCQllbGVtZW50ID0gKChJU2VydmVyV29ya2luZ0NvcHkpIGVsZW1lbnQpLmdldE9yaWdpbmFsKCk7CisJCQlpZiAobGlzdC5jb250YWlucyhlbGVtZW50KSkKKwkJCQlsaXN0LnJlbW92ZShlbGVtZW50KTsKKwkJfQorCQkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7CisJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlckF0dHJpYnV0ZXMgJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCgoSVNlcnZlckF0dHJpYnV0ZXMpb2JqKS5nZXROYW1lKCkpKQorCQkJCXJldHVybiB0cnVlOworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSdW50aW1lICYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKElSdW50aW1lKW9iaikuZ2V0TmFtZSgpKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgogCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHRva2VuaXplIGEgc3RyaW5nIGludG8gYW4gYXJyYXkuCiAJICogCiAJICogQHBhcmFtIHN0ciBhIHN0cmluZyB0byBiZSBwYXJzZWQKQEAgLTMzMyw3ICs0MDYsNyBAQAogCQlpZiAoc3RyID09IG51bGwpCiAJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKIAkJCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKIAkJCiAJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCBkZWxpbSk7CiAJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKQEAgLTM0Nyw4ICs0MjAsOCBAQAogCQlyZXR1cm4gczsKIAl9CiAKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2V0TW9kdWxlVHlwZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU+IGdldE1vZHVsZVR5cGVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzKSB7CisJCUxpc3Q8SU1vZHVsZVR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVUeXBlPigpOwogCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKIAkJCXJldHVybiBsaXN0OwogCQkKQEAgLTM2NiwyMyArNDM5LDE2IEBACiAJCXJldHVybiBsaXN0OwogCX0KIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlSWQoKSB7Ci0JCVN0cmluZyBzID0gZGYuZm9ybWF0KG5ldyBEYXRlKCkpLnRvU3RyaW5nKCkgKyBudW0rKzsKLQkJcyA9IHMucmVwbGFjZSgnICcsICdfJyk7Ci0JCXMgPSBzLnJlcGxhY2UoJzonLCAnXycpOwotCQlzID0gcy5yZXBsYWNlKCcvJywgJ18nKTsKLQkJcyA9IHMucmVwbGFjZSgnXFwnLCAnXycpOwotCQlyZXR1cm4gczsKLQl9Ci0KIAkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgaWRzIGNvbnRhaW5zIGlkLgorCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbnMgYSBzcGVjaWZpYworCSAqIHN0cmluZywgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KIAkgKiAKLQkgKiBAcGFyYW0gaWRzCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBpZCBpcyBzdXBwb3J0ZWQKKwkgKiBAcGFyYW0gaWRzIGFuIGFycmF5IG9mIHN0cmluZ3MsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIGlkIGEgc3RyaW5nCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJyYXkgb2Ygc3RyaW5ncyBjb250YWlucyBhIHNwZWNpZmljCisJICogICAgc3RyaW5nLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmdbXSBpZHMsIFN0cmluZyBpZCkgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmdbXSBpZHMsIFN0cmluZyBpZCkgewogCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuIGZhbHNlOwogCkBAIC0zOTksMTEgKzQ2NSwxMSBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkuCiAJICoKLQkgKiBAcGFyYW0gZGlyIGphdmEuaW8uRmlsZQorCSAqIEBwYXJhbSBkaXIgYSBmb2xkZXIKIAkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzCiAJICogICAgcmVwb3J0aW5nIGlzIHJlcXVpcmVkCiAJICovCkBAIC00NzgsNyArNTQ0LDcgQEAKIAkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgImxhdW5jaGFibGVBZGFwdGVycyIpOwogCiAJCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworCQlMaXN0PExhdW5jaGFibGVBZGFwdGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMYXVuY2hhYmxlQWRhcHRlcj4oc2l6ZSk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCQl0cnkgewogCQkJCWxpc3QuYWRkKG5ldyBMYXVuY2hhYmxlQWRhcHRlcihjZltpXSkpOwpAQCAtNDg3LDYgKzU1MywxOSBAQAogCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgbGF1bmNoYWJsZUFkYXB0ZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwogCQkJfQogCQl9CisJCQorCQkvLyBzb3J0IGJ5IHByaW9yaXR5IHRvIHB1dCBoaWdoZXIgbnVtYmVycyBmaXJzdAorCQlzaXplID0gbGlzdC5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZS0xOyBpKyspIHsKKwkJCWZvciAoaW50IGogPSBpKzE7IGogPCBzaXplOyBqKyspIHsKKwkJCQlMYXVuY2hhYmxlQWRhcHRlciBhID0gbGlzdC5nZXQoaSk7CisJCQkJTGF1bmNoYWJsZUFkYXB0ZXIgYiA9IGxpc3QuZ2V0KGopOworCQkJCWlmIChhLmdldFByaW9yaXR5KCkgPCBiLmdldFByaW9yaXR5KCkpIHsKKwkJCQkJbGlzdC5zZXQoaSwgYik7CisJCQkJCWxpc3Quc2V0KGosIGEpOworCQkJCX0KKwkJCX0KKwkJfQogCQlsYXVuY2hhYmxlQWRhcHRlcnMgPSBsaXN0OwogCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5sYXVuY2hhYmxlQWRhcHRlcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwogCX0KQEAgLTUwMiw3ICs1ODEsNyBAQAogCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiY2xpZW50cyIpOwogCQkKIAkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisJCUxpc3Q8SUNsaWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUNsaWVudD4oc2l6ZSk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCQl0cnkgewogCQkJCWxpc3QuYWRkKG5ldyBDbGllbnQoY2ZbaV0pKTsKQEAgLTUxMiw3ICs1OTEsNyBAQAogCQkJfQogCQl9CiAJCQotCQkvLyBzb3J0IGJ5IGluZGV4IHRvIHB1dCBsb3dlciBudW1iZXJzIGZpcnN0IGluIG9yZGVyCisJCS8vIHNvcnQgYnkgcHJpb3JpdHkgdG8gcHV0IGhpZ2hlciBudW1iZXJzIGZpcnN0CiAJCXNpemUgPSBsaXN0LnNpemUoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplLTE7IGkrKykgewogCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgewpAQCAtNTU2LDcgKzYzNSw3IEBACiAJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJwdWJsaXNoVGFza3MiKTsKIAkJCiAJCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworCQlMaXN0PElQdWJsaXNoVGFzaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVB1Ymxpc2hUYXNrPihzaXplKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKIAkJCXRyeSB7CiAJCQkJbGlzdC5hZGQobmV3IFB1Ymxpc2hUYXNrKGNmW2ldKSk7CkBAIC01NzEsNiArNjUwLDczIEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcHVibGlzaGVycy4KKwkgKiA8cD4KKwkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcHVibGlzaGVyIGluc3RhbmNlcyB7QGxpbmsgUHVibGlzaGVyfQorCSAqLworCXB1YmxpYyBzdGF0aWMgUHVibGlzaGVyW10gZ2V0UHVibGlzaGVycygpIHsKKwkJaWYgKHB1Ymxpc2hlcnMgPT0gbnVsbCkKKwkJCWxvYWRQdWJsaXNoZXJzKCk7CisJCVB1Ymxpc2hlcltdIHB1YiA9IG5ldyBQdWJsaXNoZXJbcHVibGlzaGVycy5zaXplKCldOworCQlwdWJsaXNoZXJzLnRvQXJyYXkocHViKTsKKwkJcmV0dXJuIHB1YjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwdWJsaXNoZXIgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KKwkgKiBwdWJsaXNoZXIgKHtAbGluayAjZ2V0UHVibGlzaGVycygpfSkgZm9yIHRoZSBvbmUgYSBtYXRjaGluZworCSAqIHB1Ymxpc2hlciBpZCAoe0BsaW5rIFB1Ymxpc2hlciNnZXRJZCgpfSkuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCisJICoKKwkgKiBAcGFyYW0gaWQgdGhlIHB1Ymxpc2hlciBpZAorCSAqIEByZXR1cm4gdGhlIHB1Ymxpc2hlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcHVibGlzaGVycworCSAqICAgIHdpdGggdGhlIGdpdmVuIGlkCisJICovCisJcHVibGljIHN0YXRpYyBQdWJsaXNoZXIgZmluZFB1Ymxpc2hlcihTdHJpbmcgaWQpIHsKKwkJaWYgKGlkID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQorCQlpZiAocHVibGlzaGVycyA9PSBudWxsKQorCQkJbG9hZFB1Ymxpc2hlcnMoKTsKKwkJCisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcHVibGlzaGVycy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlQdWJsaXNoZXIgcHViID0gKFB1Ymxpc2hlcikgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKGlkLmVxdWFscyhwdWIuZ2V0SWQoKSkpCisJCQkJcmV0dXJuIHB1YjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBMb2FkIHRoZSBwdWJsaXNoZXIgZXh0ZW5zaW9uIHBvaW50LgorCSAqLworCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRQdWJsaXNoZXJzKCkgeworCQlpZiAocHVibGlzaGVycyAhPSBudWxsKQorCQkJcmV0dXJuOworCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAucHVibGlzaGVycyBleHRlbnNpb24gcG9pbnQgLT4tIik7CisJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJwdWJsaXNoZXJzIik7CisJCQorCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKKwkJTGlzdDxQdWJsaXNoZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFB1Ymxpc2hlcj4oc2l6ZSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQl0cnkgeworCQkJCWxpc3QuYWRkKG5ldyBQdWJsaXNoZXIoY2ZbaV0pKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBwdWJsaXNoZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHB1Ymxpc2hlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7CisJCQl9CisJCX0KKwkJcHVibGlzaGVycyA9IGxpc3Q7CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5wdWJsaXNoZXJzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBtb2R1bGUgbW9kdWxlIGZhY3Rvcmllcy4KIAkgKiA8cD4KIAkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgpAQCAtNjc2LDcgKzgyMiw3IEBACiAJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJtb2R1bGVGYWN0b3JpZXMiKTsKIAkJCiAJCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworCQlMaXN0PE1vZHVsZUZhY3Rvcnk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZUZhY3Rvcnk+KHNpemUpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogCQkJdHJ5IHsKIAkJCQlsaXN0LmFkZChuZXcgTW9kdWxlRmFjdG9yeShjZltpXSkpOwpAQCAtNjg5LDggKzgzNSw4IEBACiAJCXNpemUgPSBsaXN0LnNpemUoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CiAJCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBzaXplOyBqKyspIHsKLQkJCQlNb2R1bGVGYWN0b3J5IGEgPSAoTW9kdWxlRmFjdG9yeSkgbGlzdC5nZXQoaSk7Ci0JCQkJTW9kdWxlRmFjdG9yeSBiID0gKE1vZHVsZUZhY3RvcnkpIGxpc3QuZ2V0KGopOworCQkJCU1vZHVsZUZhY3RvcnkgYSA9IGxpc3QuZ2V0KGkpOworCQkJCU1vZHVsZUZhY3RvcnkgYiA9IGxpc3QuZ2V0KGopOwogCQkJCWlmIChhLmdldE9yZGVyKCkgPiBiLmdldE9yZGVyKCkpIHsKIAkJCQkJbGlzdC5zZXQoaSwgYik7CiAJCQkJCWxpc3Quc2V0KGosIGEpOwpAQCAtNzI5LDcgKzg3NSw3IEBACiAJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJpbnRlcm5hbFNlcnZlck1vbml0b3JzIik7CiAKIAkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisJCUxpc3Q8SVNlcnZlck1vbml0b3I+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXJNb25pdG9yPihzaXplKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKIAkJCXRyeSB7CiAJCQkJbGlzdC5hZGQobmV3IFNlcnZlck1vbml0b3IoY2ZbaV0pKTsKQEAgLTc3MCw3ICs5MTYsNyBAQAogCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAicnVudGltZUxvY2F0b3JzIik7CiAKIAkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisJCUxpc3Q8SVJ1bnRpbWVMb2NhdG9yPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZUxvY2F0b3I+KHNpemUpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogCQkJdHJ5IHsKIAkJCQlsaXN0LmFkZChuZXcgUnVudGltZUxvY2F0b3IoY2ZbaV0pKTsKQEAgLTgwOSw3ICs5NTUsNyBAQAogCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAibW9kdWxlQXJ0aWZhY3RBZGFwdGVycyIpOwogCiAJCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworCQlMaXN0PE1vZHVsZUFydGlmYWN0QWRhcHRlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlQXJ0aWZhY3RBZGFwdGVyPihzaXplKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKIAkJCXRyeSB7CiAJCQkJbGlzdC5hZGQobmV3IE1vZHVsZUFydGlmYWN0QWRhcHRlcihjZltpXSkpOwpAQCAtODIzLDggKzk2OSw4IEBACiAJCXNpemUgPSBsaXN0LnNpemUoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplLTE7IGkrKykgewogCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgewotCQkJCU1vZHVsZUFydGlmYWN0QWRhcHRlciBhID0gKE1vZHVsZUFydGlmYWN0QWRhcHRlcikgbGlzdC5nZXQoaSk7Ci0JCQkJTW9kdWxlQXJ0aWZhY3RBZGFwdGVyIGIgPSAoTW9kdWxlQXJ0aWZhY3RBZGFwdGVyKSBsaXN0LmdldChqKTsKKwkJCQlNb2R1bGVBcnRpZmFjdEFkYXB0ZXIgYSA9IGxpc3QuZ2V0KGkpOworCQkJCU1vZHVsZUFydGlmYWN0QWRhcHRlciBiID0gbGlzdC5nZXQoaik7CiAJCQkJaWYgKGEuZ2V0UHJpb3JpdHkoKSA8IGIuZ2V0UHJpb3JpdHkoKSkgewogCQkJCQlsaXN0LnNldChpLCBiKTsKIAkJCQkJbGlzdC5zZXQoaiwgYSk7CkBAIC05MTcsNyArMTA2Myw3IEBACiAJCWlmIChpbnN0YWxsYWJsZVNlcnZlcnMgPT0gbnVsbCkKIAkJCWxvYWRJbnN0YWxsYWJsZVNlcnZlcnMoKTsKIAkJCi0JCUxpc3QgYXZhaWxhYmxlU2VydmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdDxJSW5zdGFsbGFibGVTZXJ2ZXI+IGF2YWlsYWJsZVNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVNlcnZlcj4oKTsKIAkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnN0YWxsYWJsZVNlcnZlcnMuaXRlcmF0b3IoKTsKIAkJSVJ1bnRpbWVUeXBlW10gcnVudGltZVR5cGVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lVHlwZXMoKTsKIAkJaW50IHNpemUgPSBydW50aW1lVHlwZXMubGVuZ3RoOwpAQCAtOTcwLDE0ICsxMTE2LDE0IEBACiAJCQlsb2FkSW5zdGFsbGFibGVSdW50aW1lcygpOwogCQkKIAkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnN0YWxsYWJsZVJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0JCUlSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZVR5cGVzKCk7Ci0JCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKKwkJLy9JUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVUeXBlcygpOworCQkvL2ludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKIAkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewogCQkJSUluc3RhbGxhYmxlUnVudGltZSBydW50aW1lID0gKElJbnN0YWxsYWJsZVJ1bnRpbWUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkvL2ZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCQkJaWYgKHJ1bnRpbWUuZ2V0SWQoKS5lcXVhbHMocnVudGltZVR5cGVJZCkpCiAJCQkJCXJldHVybiBydW50aW1lOwotCQkJfQorCQkJLy99CiAJCX0KIAkJCiAJCXJldHVybiBudWxsOwpAQCAtOTk1LDcgKzExNDEsNyBAQAogCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiaW5zdGFsbGFibGVTZXJ2ZXJzIik7CiAJCQogCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKKwkJTGlzdDxJSW5zdGFsbGFibGVTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVNlcnZlcj4oc2l6ZSk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCQl0cnkgewogCQkJCWxpc3QuYWRkKG5ldyBJbnN0YWxsYWJsZVNlcnZlcihjZltpXSkpOwpAQCAtMTAyMSwxMCArMTE2NywxNSBAQAogCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiaW5zdGFsbGFibGVSdW50aW1lcyIpOwogCQkKIAkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisJCUxpc3Q8SUluc3RhbGxhYmxlUnVudGltZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlUnVudGltZT4oc2l6ZSk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBJbnN0YWxsYWJsZVJ1bnRpbWUoY2ZbaV0pKTsKKwkJCQlpZiAoInJ1bnRpbWUiLmVxdWFscyhjZltpXS5nZXROYW1lKCkpKSB7CisJCQkJCVN0cmluZyBvcyA9IGNmW2ldLmdldEF0dHJpYnV0ZSgib3MiKTsKKwkJCQkJaWYgKG9zID09IG51bGwgfHwgb3MuY29udGFpbnMoUGxhdGZvcm0uZ2V0T1MoKSkpCisJCQkJCQlsaXN0LmFkZChuZXcgSW5zdGFsbGFibGVSdW50aW1lMihjZltpXSkpOworCQkJCX0gZWxzZQorCQkJCQlsaXN0LmFkZChuZXcgSW5zdGFsbGFibGVSdW50aW1lKGNmW2ldKSk7CiAJCQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgaW5zdGFsbGFibGVSdW50aW1lOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKIAkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CiAJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBpbnN0YWxsYWJsZVJ1bnRpbWU6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwpAQCAtMTA1MSw0ICsxMjAyLDM5IEBACiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCXJldHVybiBuZXcgUHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7CiAJfQorCisJLyoqCisJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGFuZCBiIG1hdGNoLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKiBTdHJpbmdzIG1hdGNoIGlmIHRoZXkgYXJlIGVxdWFsLCBpZiBlaXRoZXIgaXMgbnVsbCwgaWYgZWl0aGVyIGlzICIqIiwgb3IgaWYKKwkgKiBvbmUgZW5kcyB3aXRoICIuKiIgYW5kIHRoZSBiZWdpbm5pbmcgbWF0Y2hlcyB0aGUgb3RoZXIgc3RyaW5nLgorCSAqIAorCSAqIEBwYXJhbSBhIGEgc3RyaW5nIHRvIG1hdGNoCisJICogQHBhcmFtIGIgYW5vdGhlciBzdHJpbmcgdG8gbWF0Y2gKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgYW5kIGIgbWF0Y2gsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsIHx8IGEuZXF1YWxzKGIpIHx8ICIqIi5lcXVhbHMoYSkgfHwgIioiLmVxdWFscyhiKQorCQkJfHwgKGEuZW5kc1dpdGgoIi4qIikgJiYgYi5zdGFydHNXaXRoKGEuc3Vic3RyaW5nKDAsIGEubGVuZ3RoKCkgLSAxKSkpCisJCQl8fCAoYi5lbmRzV2l0aCgiLioiKSAmJiBhLnN0YXJ0c1dpdGgoYi5zdWJzdHJpbmcoMCwgYi5sZW5ndGgoKSAtIDEpKSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKGEuc3RhcnRzV2l0aChiKSB8fCBiLnN0YXJ0c1dpdGgoYSkpIHsKKwkJCVNlcnZlclBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiSW52YWxpZCBtYXRjaGluZyBydWxlcyB1c2VkOiAiICsgYSArICIvIiArIGIpKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJJbnZhbGlkIG1hdGNoaW5nIHJ1bGVzIHVzZWQ6ICIgKyBhICsgIi8iICsgYik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZFNlcnZlckFkYXB0ZXJzKCkgeworCQlyZXR1cm4gdG9rZW5pemUoZ2V0UHJvcGVydHkoRVhDTFVERV9TRVJWRVJfQURBUFRFUlMpLCAiLCIpOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisJCWlmIChrZXkgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQlpZiAoUGxhdGZvcm0uZ2V0UHJvZHVjdCgpICE9IG51bGwpCisJCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldFByb3BlcnR5KGtleSk7CisJCXJldHVybiB2YWx1ZTsKKwl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VzLmphdmEKaW5kZXggNDJlMjFhZS4uYTBlODY2NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHJlZmVyZW5jZXMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQcmVmZXJlbmNlcy5qYXZhCkBAIC0xNywxNiArMTcsNyBAQAogcHVibGljIGNsYXNzIFNlcnZlclByZWZlcmVuY2VzIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1BVQkxJU0ggPSAiYXV0by1wdWJsaXNoIjsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9NT0RVTEVfU1RBUlRfVElNRU9VVCA9ICJtb2R1bGUtc3RhcnQtdGltZW91dCI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMID0gImF1dG8tcHVibGlzaC1sb2NhbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMX1RJTUUgPSAiYXV0by1wdWJsaXNoLWxvY2FsLXRpbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEUgPSAiYXV0by1wdWJsaXNoLXJlbW90ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URV9USU1FID0gImF1dG8tcHVibGlzaC1yZW1vdGUtdGltZSI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTUFDSElORV9TUEVFRCA9ICJtYWNoaW5lLXNwZWVkIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NZTkNfT05fU1RBUlRVUCA9ICJzeW5jLW9uLXN0YXJ0dXAiOwotCisJCQogCXByaXZhdGUgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXM7CiAKIAlwcm90ZWN0ZWQgc3RhdGljIFNlcnZlclByZWZlcmVuY2VzIGluc3RhbmNlOwpAQCAtMTAwLDE5MCArOTEsMTEgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbGF0aXZlIG1hY2hpbmUgc3BlZWQgaW5kZXgsIGZyb20gMSB0byA5LiBBIHZhbHVlIG9mIC0xIG1lYW5zCi0JICogbm8gdGltZW91dHMsIGFuZCBhIHZhbHVlIG9mIDUgaXMgYW4gYXZlcmFnZSBtYWNoaW5lLiAxLTQgYXJlIHNsb3dlcgotCSAqIG1hY2hpbmVzIGFuZCA2LTkgYXJlIGZhc3RlciBtYWNoaW5lcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWxhdGl2ZSBzcGVlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWFjaGluZVNwZWVkKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfTUFDSElORV9TUEVFRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHJlbGF0aXZlIG1hY2hpbmUgc3BlZWQgaW5kZXgsIDUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBzcGVlZCBpbmRleAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdE1hY2hpbmVTcGVlZCgpIHsKLQkJcmV0dXJuIDU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVsYXRpdmUgbWFjaGluZSBzcGVlZCBpbmRleCwgZnJvbSAxIHRvIDkuIEEgdmFsdWUgb2YgLTEgbWVhbnMKLQkgKiBubyB0aW1lb3V0cywgYW5kIGEgdmFsdWUgb2YgNSBpcyBhbiBhdmVyYWdlIG1hY2hpbmUuIDEtNCBhcmUgc2xvd2VyCi0JICogbWFjaGluZXMgYW5kIDYtOSBhcmUgZmFzdGVyIG1hY2hpbmVzLgotCSAqIAotCSAqIEBwYXJhbSBzcGVlZCB0aGUgcmVsYXRpdmUgc3BlZWQgCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFjaGluZVNwZWVkKGludCBzcGVlZCkgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX01BQ0hJTkVfU1BFRUQsIHNwZWVkKTsKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzeW5jIG9uIHN0YXJ0dXAgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgc3luYyBvbiBzdGFydHVwIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jT25TdGFydHVwKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX1NZTkNfT05fU1RBUlRVUCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHN5bmMgb24gc3RhcnR1cCB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHN5bmMgb24gc3RhcnR1cCB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRTeW5jT25TdGFydHVwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3luYyBvbiBzdGFydHVwIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBzeW5jIHRoZSBzeW5jIG9uIHN0YXJ0dXAgdmFsdWUgCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY09uU3RhcnR1cChib29sZWFuIHN5bmMpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9TWU5DX09OX1NUQVJUVVAsIHN5bmMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEF1dG9QdWJsaXNoTG9jYWwoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIGxvY2FsIGF1dG8tcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEF1dG9QdWJsaXNoTG9jYWwoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBhdXRvCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b1B1Ymxpc2hMb2NhbChib29sZWFuIGF1dG8pIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9BVVRPX1BVQkxJU0hfTE9DQUwsIGF1dG8pOwotCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIGxvY2FsIGF1dG8tcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEF1dG9QdWJsaXNoTG9jYWxUaW1lKCkgewotCQlyZXR1cm4gNTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciBsb2NhbCBhdXRvLXB1Ymxpc2hpbmcuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF1dG9QdWJsaXNoTG9jYWxUaW1lKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMX1RJTUUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciBsb2NhbCBhdXRvLXB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIGF1dG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaExvY2FsVGltZShpbnQgYXV0bykgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0FVVE9fUFVCTElTSF9MT0NBTF9USU1FLCBhdXRvKTsKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEF1dG9QdWJsaXNoUmVtb3RlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QXV0b1B1Ymxpc2hSZW1vdGUoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIHJlbW90ZSBhdXRvLXB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIGF1dG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaFJlbW90ZShib29sZWFuIGF1dG8pIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9BVVRPX1BVQkxJU0hfUkVNT1RFLCBhdXRvKTsKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0QXV0b1B1Ymxpc2hSZW1vdGVUaW1lKCkgewotCQlyZXR1cm4gNjA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXV0b1B1Ymxpc2hSZW1vdGVUaW1lKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URV9USU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYXV0bwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9QdWJsaXNoUmVtb3RlVGltZShpbnQgYXV0bykgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEVfVElNRSwgYXV0byk7Ci0JCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgogCSAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMuCiAJICovCiAJcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7CiAJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9BVVRPX1BVQkxJU0gsIGlzRGVmYXVsdEF1dG9QdWJsaXNoaW5nKCkpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfTUFDSElORV9TUEVFRCwgZ2V0RGVmYXVsdE1hY2hpbmVTcGVlZCgpKTsKLQkJCi0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9BVVRPX1BVQkxJU0hfTE9DQUwsIGdldERlZmF1bHRBdXRvUHVibGlzaExvY2FsKCkpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMX1RJTUUsIGdldERlZmF1bHRBdXRvUHVibGlzaExvY2FsVGltZSgpKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEUsIGdldERlZmF1bHRBdXRvUHVibGlzaFJlbW90ZSgpKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEVfVElNRSwgZ2V0RGVmYXVsdEF1dG9QdWJsaXNoUmVtb3RlVGltZSgpKTsKLQkJCi0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9TWU5DX09OX1NUQVJUVVAsIGdldERlZmF1bHRTeW5jT25TdGFydHVwKCkpOwotCQkKKwkJCQogCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQsIDMwMDAwMSk7CiAJCWJvb2xlYW4gc2F2ZSA9IGZhbHNlOwogCQlpZiAocHJlZmVyZW5jZXMuaXNEZWZhdWx0KFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQpKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQdWJsaXNoSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHVibGlzaEluZm8uamF2YQppbmRleCBjNjUwMDMyLi5jMmNlODA2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQdWJsaXNoSW5mby5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclB1Ymxpc2hJbmZvLmphdmEKQEAgLTMyLDcgKzMyLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7CiAvKioKICAqIEhlbHBlciB0byBvYnRhaW4gYW5kIHN0b3JlIHRoZSBwdWJsaXNoaW5nIGluZm9ybWF0aW9uICh3aGF0IGZpbGVzCiAgKiB3ZXJlIHB1Ymxpc2hlZCBhbmQgd2hlbikgZm9yIGEgc2luZ2xlIHNlcnZlci4KQEAgLTQzLDcgKzQyLDcgQEAKIAlwcm90ZWN0ZWQgSVBhdGggcGF0aDsKIAogCS8vIG1hcCBvZiBtb2R1bGUgaWRzIHRvIE1vZHVsZVB1Ymxpc2hJbmZvCi0JcHJvdGVjdGVkIE1hcCBtb2R1bGVQdWJsaXNoSW5mbzsKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgTW9kdWxlUHVibGlzaEluZm8+IG1vZHVsZVB1Ymxpc2hJbmZvOwogCiAJLyoqCiAJICogU2VydmVyUHVibGlzaEluZm8gY29uc3RydWN0b3IgY29tbWVudC4KQEAgLTUyLDcgKzUxLDcgQEAKIAkJc3VwZXIoKTsKIAkJCiAJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCW1vZHVsZVB1Ymxpc2hJbmZvID0gbmV3IEhhc2hNYXAoKTsKKwkJbW9kdWxlUHVibGlzaEluZm8gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1vZHVsZVB1Ymxpc2hJbmZvPigpOwogCQlsb2FkKCk7CiAJfQogCkBAIC04Miw3ICs4MSw3IEBACiAJCWlmIChtb2R1bGVJZCA9PSBudWxsIHx8IG1vZHVsZUlkLmxlbmd0aCgpID09IDApCiAJCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07CiAJCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKIAkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2R1bGVJZCwgIiMiKTsKIAkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewogCQkJU3RyaW5nIG1pZCA9IHN0Lm5leHRUb2tlbigpOwpAQCAtMTAxLDcgKzEwMCw5IEBACiAKIAlwdWJsaWMgYm9vbGVhbiBoYXNNb2R1bGVQdWJsaXNoSW5mbyhJTW9kdWxlW10gbW9kdWxlKSB7CiAJCVN0cmluZyBrZXkgPSBnZXRLZXkobW9kdWxlKTsKLQkJcmV0dXJuIG1vZHVsZVB1Ymxpc2hJbmZvLmNvbnRhaW5zS2V5KGtleSk7CisJCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKKwkJCXJldHVybiBtb2R1bGVQdWJsaXNoSW5mby5jb250YWluc0tleShrZXkpOworCQl9CiAJfQogCiAJLypwdWJsaWMgdm9pZCByZW1vdmVNb2R1bGVQdWJsaXNoSW5mbyhJTW9kdWxlW10gbW9kdWxlKSB7CkBAIC0xMzEsMzggKzEzMiw0MCBAQAogCSAqLwogCXB1YmxpYyB2b2lkIHJlbW92ZURlbGV0ZWRNb2R1bGVQdWJsaXNoSW5mbyhTZXJ2ZXIgc2VydmVyLCBMaXN0IG1vZHVsZUxpc3QpIHsKIAkJaW50IHNpemUgPSBtb2R1bGVMaXN0LnNpemUoKTsKLQkJTGlzdCByZW1vdmVkID0gbmV3IEFycmF5TGlzdCgpOworCQlMaXN0PFN0cmluZz4gcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVbXSBtb2R1bGUgPSAoSU1vZHVsZVtdKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCQlTdHJpbmcga2V5MiA9IGdldEtleShtb2R1bGUpOwotCQkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkuZXF1YWxzKGtleTIpKQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgc2VydmVyLm1vZHVsZVB1Ymxpc2hTdGF0ZS5nZXQoa2V5KTsKLQkJCQkJaWYgKGluICE9IG51bGwgJiYgaW4uaW50VmFsdWUoKSAhPSBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSkKKwkJc3luY2hyb25pemVkIChtb2R1bGVQdWJsaXNoSW5mbykgeworCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCisJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJCUlNb2R1bGVbXSBtb2R1bGUgPSAoSU1vZHVsZVtdKSBtb2R1bGVMaXN0LmdldChpKTsKKwkJCQkJU3RyaW5nIGtleTIgPSBnZXRLZXkobW9kdWxlKTsKKwkJCQkJaWYgKGtleSAhPSBudWxsICYmIGtleS5lcXVhbHMoa2V5MikpCiAJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCiAJCQkJfQorCQkJCQorCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgeworCQkJCQl0cnkgeworCQkJCQkJSW50ZWdlciBpbiA9IHNlcnZlci5tb2R1bGVQdWJsaXNoU3RhdGUuZ2V0KGtleSk7CisJCQkJCQlpZiAoaW4gIT0gbnVsbCAmJiBpbi5pbnRWYWx1ZSgpICE9IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKQorCQkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCS8vIGlnbm9yZQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmICghZm91bmQpCisJCQkJCXJlbW92ZWQuYWRkKGtleSk7CiAJCQl9CiAJCQkKLQkJCWlmICghZm91bmQpCi0JCQkJcmVtb3ZlZC5hZGQoa2V5KTsKLQkJfQotCQkKLQkJaXRlcmF0b3IgPSByZW1vdmVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQltb2R1bGVQdWJsaXNoSW5mby5yZW1vdmUoa2V5KTsKKwkJCWl0ZXJhdG9yID0gcmVtb3ZlZC5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJbW9kdWxlUHVibGlzaEluZm8ucmVtb3ZlKGtleSk7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTE3Myw2NCArMTc2LDY2IEBACiAJCVN0cmluZyBrZXkgPSBnZXRLZXkobW9kdWxlKTsKIAkJCiAJCS8vIGNoZWNrIGlmIGl0IG5vdyBleGlzdHMKLQkJaWYgKG1vZHVsZVB1Ymxpc2hJbmZvLmNvbnRhaW5zS2V5KGtleSkpCi0JCQlyZXR1cm4gKE1vZHVsZVB1Ymxpc2hJbmZvKSBtb2R1bGVQdWJsaXNoSW5mby5nZXQoa2V5KTsKLQkJCi0JCS8vIGhhdmUgdG8gY3JlYXRlIGEgbmV3IG9uZQotCQlJTW9kdWxlIG1vZCA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IG5ldyBNb2R1bGVQdWJsaXNoSW5mbyhnZXRLZXkobW9kdWxlKSwgbW9kLmdldE5hbWUoKSwgbW9kLmdldE1vZHVsZVR5cGUoKSk7Ci0JCW1vZHVsZVB1Ymxpc2hJbmZvLnB1dChrZXksIG1waSk7Ci0JCXJldHVybiBtcGk7CisJCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKKwkJCWlmIChtb2R1bGVQdWJsaXNoSW5mby5jb250YWluc0tleShrZXkpKQorCQkJCXJldHVybiBtb2R1bGVQdWJsaXNoSW5mby5nZXQoa2V5KTsKKwkJCQorCQkJLy8gaGF2ZSB0byBjcmVhdGUgYSBuZXcgb25lCisJCQlJTW9kdWxlIG1vZCA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07CisJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSBuZXcgTW9kdWxlUHVibGlzaEluZm8oZ2V0S2V5KG1vZHVsZSksIG1vZC5nZXROYW1lKCksIG1vZC5nZXRNb2R1bGVUeXBlKCkpOworCQkJbW9kdWxlUHVibGlzaEluZm8ucHV0KGtleSwgbXBpKTsKKwkJCXJldHVybiBtcGk7CisJCX0KIAl9CiAKLQlwdWJsaWMgdm9pZCBhZGRSZW1vdmVkTW9kdWxlcyhMaXN0IG1vZHVsZUxpc3QsIExpc3Qga2luZExpc3QpIHsKKwlwdWJsaWMgdm9pZCBhZGRSZW1vdmVkTW9kdWxlcyhMaXN0PElNb2R1bGVbXT4gbW9kdWxlTGlzdCkgewogCQlpbnQgc2l6ZSA9IG1vZHVsZUxpc3Quc2l6ZSgpOwotCQlMaXN0IHJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlUHVibGlzaEluZm8ua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCi0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVbXSBtb2R1bGUgPSAoSU1vZHVsZVtdKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCQlTdHJpbmcga2V5MiA9IGdldEtleShtb2R1bGUpOwotCQkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkuZXF1YWxzKGtleTIpKQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gKE1vZHVsZVB1Ymxpc2hJbmZvKSBtb2R1bGVQdWJsaXNoSW5mby5nZXQoa2V5KTsKLQkJCQlyZW1vdmVkLmFkZChtcGkpOwotCQkJfQotCQl9Ci0JCQotCQlpdGVyYXRvciA9IHJlbW92ZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gKE1vZHVsZVB1Ymxpc2hJbmZvKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTW9kdWxlW10gbW9kdWxlMiA9IGdldE1vZHVsZShtcGkuZ2V0TW9kdWxlSWQoKSk7Ci0JCQlpZiAobW9kdWxlMiA9PSBudWxsIHx8IG1vZHVsZTIubGVuZ3RoID09IDApIHsKLQkJCQlTdHJpbmcgbW9kdWxlSWQgPSBtcGkuZ2V0TW9kdWxlSWQoKTsKLQkJCQlpZiAobW9kdWxlSWQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmdbXSBpZHMgPSBnZXRNb2R1bGVJZHMobW9kdWxlSWQpOwotCQkJCQlpbnQgZGVwdGggPSBpZHMubGVuZ3RoOwotCQkJCQkKLQkJCQkJbW9kdWxlMiA9IG5ldyBJTW9kdWxlW2RlcHRoXTsKLQkJCQkJU3RyaW5nIHMgPSAiIjsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7Ci0JCQkJCQlzICs9IGlkc1tpXTsKLQkJCQkJCWlmIChpID09IGRlcHRoIC0gMSkKLQkJCQkJCQltb2R1bGUyW2ldID0gbXBpLmdldERlbGV0ZWRNb2R1bGUoKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waTIgPSAoTW9kdWxlUHVibGlzaEluZm8pIG1vZHVsZVB1Ymxpc2hJbmZvLmdldChzKTsKLQkJCQkJCQlpZiAobXBpMiAhPSBudWxsKQotCQkJCQkJCQltb2R1bGUyW2ldID0gbXBpMi5nZXREZWxldGVkTW9kdWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlzICs9ICIjIjsKLQkJCQkJfQorCQlMaXN0PE1vZHVsZVB1Ymxpc2hJbmZvPiByZW1vdmVkID0gbmV3IEFycmF5TGlzdDxNb2R1bGVQdWJsaXNoSW5mbz4oKTsKKwkJc3luY2hyb25pemVkIChtb2R1bGVQdWJsaXNoSW5mbykgeworCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQkKKwkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkJSU1vZHVsZVtdIG1vZHVsZSA9IG1vZHVsZUxpc3QuZ2V0KGkpOworCQkJCQlTdHJpbmcga2V5MiA9IGdldEtleShtb2R1bGUpOworCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhrZXkyKSkKKwkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQl9CisJCQkJaWYgKCFmb3VuZCkgeworCQkJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSBtb2R1bGVQdWJsaXNoSW5mby5nZXQoa2V5KTsKKwkJCQkJcmVtb3ZlZC5hZGQobXBpKTsKIAkJCQl9CiAJCQl9Ci0JCQlpZiAobW9kdWxlMiAhPSBudWxsICYmIG1vZHVsZTIubGVuZ3RoID4gMCkgewotCQkJCW1vZHVsZUxpc3QuYWRkKG1vZHVsZTIpOwotCQkJCWtpbmRMaXN0LmFkZChuZXcgSW50ZWdlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVEKSk7CisJCQkKKwkJCWl0ZXJhdG9yID0gcmVtb3ZlZC5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IChNb2R1bGVQdWJsaXNoSW5mbykgaXRlcmF0b3IubmV4dCgpOworCQkJCUlNb2R1bGVbXSBtb2R1bGUyID0gZ2V0TW9kdWxlKG1waS5nZXRNb2R1bGVJZCgpKTsKKwkJCQlpZiAobW9kdWxlMiA9PSBudWxsIHx8IG1vZHVsZTIubGVuZ3RoID09IDApIHsKKwkJCQkJU3RyaW5nIG1vZHVsZUlkID0gbXBpLmdldE1vZHVsZUlkKCk7CisJCQkJCWlmIChtb2R1bGVJZCAhPSBudWxsKSB7CisJCQkJCQlTdHJpbmdbXSBpZHMgPSBnZXRNb2R1bGVJZHMobW9kdWxlSWQpOworCQkJCQkJaW50IGRlcHRoID0gaWRzLmxlbmd0aDsKKwkJCQkJCQorCQkJCQkJbW9kdWxlMiA9IG5ldyBJTW9kdWxlW2RlcHRoXTsKKwkJCQkJCVN0cmluZyBzID0gIiI7CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKwkJCQkJCQlzICs9IGlkc1tpXTsKKwkJCQkJCQlpZiAoaSA9PSBkZXB0aCAtIDEpCisJCQkJCQkJCW1vZHVsZTJbaV0gPSBtcGkuZ2V0RGVsZXRlZE1vZHVsZSgpOworCQkJCQkJCWVsc2UgeworCQkJCQkJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkyID0gbW9kdWxlUHVibGlzaEluZm8uZ2V0KHMpOworCQkJCQkJCQlpZiAobXBpMiAhPSBudWxsKQorCQkJCQkJCQkJbW9kdWxlMltpXSA9IG1waTIuZ2V0RGVsZXRlZE1vZHVsZSgpOworCQkJCQkJCX0KKwkJCQkJCQlzICs9ICIjIjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAobW9kdWxlMiAhPSBudWxsICYmIG1vZHVsZTIubGVuZ3RoID4gMCkKKwkJCQkJbW9kdWxlTGlzdC5hZGQobW9kdWxlMik7CiAJCQl9CiAJCX0KIAl9CkBAIC0yNDIsNyArMjQ3LDcgQEAKIAkgKi8KIAlwcml2YXRlIFN0cmluZ1tdIGdldE1vZHVsZUlkcyhTdHJpbmcgbW9kdWxlSWQpIHsKIAkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2R1bGVJZCwgIiMiKTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKKwkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMik7CiAJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKIAkJCWxpc3QuYWRkKHN0Lm5leHRUb2tlbigpKTsKIAkJfQpAQCAtMjc3LDcgKzI4Miw3IEBACiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBwdWJsaXNoIGluZm9ybWF0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBwdWJsaXNoIGluZm9ybWF0aW9uIiwgZSk7CiAJCQl9CiAJCX0KIAkJCkBAIC0yOTksNyArMzA0LDcgQEAKIAkJCQkJbW9kdWxlUHVibGlzaEluZm8ucHV0KGdldEtleShtcGkuZ2V0TW9kdWxlSWQoKSksIG1waSk7CiAJCQkJfQogCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgcHVibGlzaCBpbmZvcm1hdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgcHVibGlzaCBpbmZvcm1hdGlvbiIsIGUpOwogCQkJfQogCQl9CiAJfQpAQCAtMzE5LDE4ICszMjQsMjEgQEAKIAkJCS8vIHZlcnNpb24KIAkJCW91dC53cml0ZUJ5dGUoMSk7CiAJCQkKLQkJCW91dC53cml0ZUludChtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5zaXplKCkpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBjb250cm9sUmVmID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IChNb2R1bGVQdWJsaXNoSW5mbykgbW9kdWxlUHVibGlzaEluZm8uZ2V0KGNvbnRyb2xSZWYpOwotCQkJCW1waS5zYXZlKG91dCk7CisJCQlzeW5jaHJvbml6ZWQgKG1vZHVsZVB1Ymxpc2hJbmZvKSB7CisJCQkJb3V0LndyaXRlSW50KG1vZHVsZVB1Ymxpc2hJbmZvLmtleVNldCgpLnNpemUoKSk7CisJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJU3RyaW5nIGNvbnRyb2xSZWYgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IG1vZHVsZVB1Ymxpc2hJbmZvLmdldChjb250cm9sUmVmKTsKKwkJCQkJbXBpLnNhdmUob3V0KTsKKwkJCQl9CiAJCQl9CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBwdWJsaXNoIGluZm9ybWF0aW9uIiwgZSk7CiAJCX0gZmluYWxseSB7CiAJCQl0cnkgewotCQkJCW91dC5jbG9zZSgpOworCQkJCWlmIChvdXQgIT0gbnVsbCkKKwkJCQkJb3V0LmNsb3NlKCk7CiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJCS8vIGlnbm9yZQogCQkJfQpAQCAtMzcxLDE3ICszNzksMTcgQEAKIAkJaWYgKG9yaWdpbmFsID09IG51bGwgfHwgY3VycmVudCA9PSBudWxsKQogCQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VEZWx0YVswXTsKIAkJCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdDxNb2R1bGVSZXNvdXJjZURlbHRhPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2R1bGVSZXNvdXJjZURlbHRhPigpOwogCQlpbnQgc2l6ZSA9IG9yaWdpbmFsLmxlbmd0aDsKIAkJaW50IHNpemUyID0gY3VycmVudC5sZW5ndGg7CiAJCQotCQlNYXAgb3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcChzaXplKTsKKwkJTWFwPElNb2R1bGVSZXNvdXJjZSwgSU1vZHVsZVJlc291cmNlPiBvcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwPElNb2R1bGVSZXNvdXJjZSwgSU1vZHVsZVJlc291cmNlPihzaXplKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAJCQlvcmlnaW5hbE1hcC5wdXQob3JpZ2luYWxbaV0sIG9yaWdpbmFsW2ldKTsKIAkJCiAJCS8vIGFkZGVkIGFuZCBjaGFuZ2VkIHJlc291cmNlcwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCUlNb2R1bGVSZXNvdXJjZSBvbGQgPSAoSU1vZHVsZVJlc291cmNlKSBvcmlnaW5hbE1hcC5yZW1vdmUoY3VycmVudFtpXSk7CisJCQlJTW9kdWxlUmVzb3VyY2Ugb2xkID0gb3JpZ2luYWxNYXAucmVtb3ZlKGN1cnJlbnRbaV0pOwogCQkJaWYgKG9sZCA9PSBudWxsKSB7CiAJCQkJTW9kdWxlUmVzb3VyY2VEZWx0YSBkZWx0YSA9IG5ldyBNb2R1bGVSZXNvdXJjZURlbHRhKGN1cnJlbnRbaV0sIElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEKTsKIAkJCQlpZiAoY3VycmVudFtpXSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKQEAgLTQyMyw3ICs0MzEsNyBAQAogCQkJfQogCQl9CiAJCQotCQlyZXR1cm4gKElNb2R1bGVSZXNvdXJjZURlbHRhW10pIGxpc3QudG9BcnJheShuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbbGlzdC5zaXplKCldKTsKKwkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbbGlzdC5zaXplKCldKTsKIAl9CiAKIAlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7CkBAIC00NDEsMTMgKzQ0OSwxMyBAQAogCQlpbnQgc2l6ZSA9IG9yaWdpbmFsLmxlbmd0aDsKIAkJaW50IHNpemUyID0gY3VycmVudC5sZW5ndGg7CiAJCQotCQlNYXAgb3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcChzaXplKTsKKwkJTWFwPElNb2R1bGVSZXNvdXJjZSwgSU1vZHVsZVJlc291cmNlPiBvcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwPElNb2R1bGVSZXNvdXJjZSwgSU1vZHVsZVJlc291cmNlPihzaXplKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAJCQlvcmlnaW5hbE1hcC5wdXQob3JpZ2luYWxbaV0sIG9yaWdpbmFsW2ldKTsKIAkJCiAJCS8vIGFkZGVkIGFuZCBjaGFuZ2VkIHJlc291cmNlcwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCUlNb2R1bGVSZXNvdXJjZSBvbGQgPSAoSU1vZHVsZVJlc291cmNlKSBvcmlnaW5hbE1hcC5yZW1vdmUoY3VycmVudFtpXSk7CisJCQlJTW9kdWxlUmVzb3VyY2Ugb2xkID0gb3JpZ2luYWxNYXAucmVtb3ZlKGN1cnJlbnRbaV0pOwogCQkJaWYgKG9sZCA9PSBudWxsKQogCQkJCXJldHVybiB0cnVlOwogCQkJCkBAIC00NzcsNyArNDg1LDcgQEAKIAkJaWYgKHJlc291cmNlcyA9PSBudWxsKQogCQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VEZWx0YVswXTsKIAkJCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdDxNb2R1bGVSZXNvdXJjZURlbHRhPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2R1bGVSZXNvdXJjZURlbHRhPigpOwogCQkKIAkJLy8gbG9vayBmb3IgZHVwbGljYXRlcwogCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5sZW5ndGg7CkBAIC00OTAsOSArNDk4LDcgQEAKIAkJCWxpc3QuYWRkKG1yZCk7CiAJCX0KIAkJCi0JCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoZGVsdGEpOwotCQlyZXR1cm4gZGVsdGE7CisJCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVSZXNvdXJjZURlbHRhW2xpc3Quc2l6ZSgpXSk7CiAJfQogCiAJLyoqCkBAIC01MDYsMTcgKzUxMiwyMSBAQAogCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTdHJ1Y3R1cmVDaGFuZ2VkKExpc3QgbW9kdWxlcykgewotCQlyZXR1cm4gbW9kdWxlcy5zaXplKCkgIT0gbW9kdWxlUHVibGlzaEluZm8ua2V5U2V0KCkuc2l6ZSgpOworCQlzeW5jaHJvbml6ZWQgKG1vZHVsZVB1Ymxpc2hJbmZvKSB7CisJCQlyZXR1cm4gbW9kdWxlcy5zaXplKCkgIT0gbW9kdWxlUHVibGlzaEluZm8ua2V5U2V0KCkuc2l6ZSgpOworCQl9CiAJfQogCiAJLyoqCiAJICogRmlsbCB0aGUgbW9kdWxlIGNhY2hlLgogCSAqLwogCXB1YmxpYyB2b2lkIHN0YXJ0Q2FjaGluZygpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSAoTW9kdWxlUHVibGlzaEluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1waS5zdGFydENhY2hpbmcoKTsKKwkJc3luY2hyb25pemVkIChtb2R1bGVQdWJsaXNoSW5mbykgeworCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby52YWx1ZXMoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IChNb2R1bGVQdWJsaXNoSW5mbykgaXRlcmF0b3IubmV4dCgpOworCQkJCW1waS5zdGFydENhY2hpbmcoKTsKKwkJCX0KIAkJfQogCX0KIApAQCAtNTI0LDEwICs1MzQsMTIgQEAKIAkgKiBDbGVhcnMgYWxsIGNhY2hlcyBvZiBjdXJyZW50IG1vZHVsZSByZXNvdXJjZXMgYW5kIGRlbHRhcy4KIAkgKi8KIAlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZVB1Ymxpc2hJbmZvLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IChNb2R1bGVQdWJsaXNoSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCQkJbXBpLmNsZWFyQ2FjaGUoKTsKKwkJc3luY2hyb25pemVkIChtb2R1bGVQdWJsaXNoSW5mbykgeworCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby52YWx1ZXMoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IChNb2R1bGVQdWJsaXNoSW5mbykgaXRlcmF0b3IubmV4dCgpOworCQkJCW1waS5jbGVhckNhY2hlKCk7CisJCQl9CiAJCX0KIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyU2NoZWR1bGluZ1J1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclNjaGVkdWxpbmdSdWxlLmphdmEKaW5kZXggMDQ3YzZjYy4uNDRjNzkwYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyU2NoZWR1bGluZ1J1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJTY2hlZHVsaW5nUnVsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDYgKzE1LDggQEAKIC8qKgogICogU2ltcGxlIGpvYiBzY2hlZHVsaW5nIHJ1bGUgdGhhdCBzdG9wcyBhIHNlcnZlciBmcm9tIHN0YXJ0aW5nLAogICogcHVibGlzaGluZywgb3Igc3RvcHBpbmcgYXQgdGhlIHNhbWUgdGltZS4KKyAqIAorICogQGRlcHJlY2F0ZWQgdXNlIElTZXJ2ZXIgaW5zdGFuY2UgZGlyZWN0bHkKICAqLwogcHVibGljIGNsYXNzIFNlcnZlclNjaGVkdWxpbmdSdWxlIGltcGxlbWVudHMgSVNjaGVkdWxpbmdSdWxlIHsKIAlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7CkBAIC0yNCwxNiArMjYsMTggQEAKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlpZiAoIShydWxlIGluc3RhbmNlb2YgU2VydmVyU2NoZWR1bGluZ1J1bGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiAocnVsZSBpbnN0YW5jZW9mIElTZXJ2ZXIgfHwgcnVsZSBpbnN0YW5jZW9mIFNlcnZlclNjaGVkdWxpbmdSdWxlKTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCWlmICghKHJ1bGUgaW5zdGFuY2VvZiBTZXJ2ZXJTY2hlZHVsaW5nUnVsZSkpCisJCWlmICghKHJ1bGUgaW5zdGFuY2VvZiBJU2VydmVyKSAmJiAhKHJ1bGUgaW5zdGFuY2VvZiBTZXJ2ZXJTY2hlZHVsaW5nUnVsZSkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCQorCQlpZiAocnVsZSBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKwkJCUlTZXJ2ZXIgcyA9IChJU2VydmVyKSBydWxlOworCQkJcmV0dXJuIHNlcnZlci5lcXVhbHMocyk7CisJCX0KKwkJCiAJCVNlcnZlclNjaGVkdWxpbmdSdWxlIHNzcnVsZSA9IChTZXJ2ZXJTY2hlZHVsaW5nUnVsZSkgcnVsZTsKIAkJcmV0dXJuIHNzcnVsZS5zZXJ2ZXIuZXF1YWxzKHNlcnZlcik7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZS5qYXZhCmluZGV4IDkyNzNjYWUuLmIxY2E4NmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJUeXBlLmphdmEKQEAgLTI5LDggKzI5LDYgQEAKICAqLwogcHVibGljIGNsYXNzIFNlcnZlclR5cGUgaW1wbGVtZW50cyBJU2VydmVyVHlwZSB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVCA9IDEwMDAgKiA2MCAqIDQ7IC8vIDQgbWludXRlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0W10gU0VSVkVSX1RJTUVPVVRTID0KLQkJbmV3IGZsb2F0W10geyA0ZiwgM2YsIDJmLCAxLjVmLCAxZiwgMC43NWYsIDAuNWYsIDAuMzVmLCAwLjI1ZiB9OwogCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7CiAKIAkvKioKQEAgLTE4NywxMSArMTg1LDEwIEBACiAJCWlmIChlbGVtZW50ID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKIAkJCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCi0JCQlpZCA9IFNlcnZlclBsdWdpbi5nZW5lcmF0ZUlkKCk7CiAJCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IG5ldyBTZXJ2ZXJXb3JraW5nQ29weShpZCwgZmlsZSwgcnVudGltZSwgdGhpcyk7CiAJCWlmIChoYXNSdW50aW1lKCkpCiAJCQlzd2Muc2V0UnVudGltZShydW50aW1lKTsKKwkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzd2MpOwogCQlzd2Muc2V0RGVmYXVsdHMobW9uaXRvcik7CiAJCQogCQlpZiAoaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lLmdldExvY2F0aW9uKCkgIT0gbnVsbCAmJiAhcnVudGltZS5nZXRMb2NhdGlvbigpLmlzRW1wdHkoKSkKQEAgLTIxNSw3ICsyMTIsNyBAQAogCSAqIG9mIHRoZSBnaXZlbiBydW50aW1lIHR5cGUKIAkgKi8KIAlwcm90ZWN0ZWQgc3RhdGljIElSdW50aW1lW10gZ2V0UnVudGltZXMoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdDxJUnVudGltZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7CiAJCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7CiAJCWlmIChydW50aW1lcyAhPSBudWxsKSB7CiAJCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKQEAgLTIzNCw5ICsyMzEsNiBAQAogCQlpZiAoZWxlbWVudCA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7CiAJCQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJaWQgPSBTZXJ2ZXJQbHVnaW4uZ2VuZXJhdGVJZCgpOwotCQkKIAkJSVJ1bnRpbWUgcnVudGltZSA9IG51bGw7CiAJCWlmIChoYXNSdW50aW1lKCkpIHsKIAkJCS8vIGxvb2sgZm9yIGV4aXN0aW5nIHJ1bnRpbWUKQEAgLTI0Nyw3ICsyNDEsNyBAQAogCQkJZWxzZSB7CiAJCQkJLy8gY3JlYXRlIHJ1bnRpbWUKIAkJCQl0cnkgewotCQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXQyA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoaWQgKyAiLXJ1bnRpbWUiLCBtb25pdG9yKTsKKwkJCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV0MgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKGlkLCBtb25pdG9yKTsKIAkJCQkJU2VydmVyVXRpbC5zZXRSdW50aW1lRGVmYXVsdE5hbWUocnVudGltZVdDKTsKIAkJCQkJcnVudGltZSA9IHJ1bnRpbWVXQzsKIAkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtMjU1LDExICsyNDksMTEgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQorCQkKIAkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gbmV3IFNlcnZlcldvcmtpbmdDb3B5KGlkLCBmaWxlLCBydW50aW1lLCB0aGlzKTsKLQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzd2MpOwogCQlpZiAocnVudGltZSAhPSBudWxsKQogCQkJc3djLnNldFJ1bnRpbWUocnVudGltZSk7CisJCVNlcnZlclV0aWwuc2V0U2VydmVyRGVmYXVsdE5hbWUoc3djKTsKIAkJCiAJCXN3Yy5zZXREZWZhdWx0cyhtb25pdG9yKTsKIAkJaWYgKHN3Yy5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpKQpAQCAtMzA1LDE1ICsyOTksMTEgQEAKIAkgKiBSZXR1cm4gdGhlIHRpbWVvdXQgKGluIG1zKSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc3RhcnQuCiAJICogVGhlIGRlZmF1bHQgaXMgMiBtaW51dGVzLgogCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBzdGFydHVwIHRpbWVvdXQsIG9yIC0xIGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQKKwkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgc3RhcnR1cCB0aW1lb3V0CiAJICovCiAJcHVibGljIGludCBnZXRTdGFydFRpbWVvdXQoKSB7CiAJCXRyeSB7Ci0JCQlpbnQgaSA9IEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInN0YXJ0VGltZW91dCIpKTsKLQkJCWludCBzID0gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5nZXRNYWNoaW5lU3BlZWQoKTsKLQkJCWlmIChzIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gKGludCkgKGkgKiBTRVJWRVJfVElNRU9VVFNbcy0xXSk7CisJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgic3RhcnRUaW1lb3V0IikpOwogCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogCQkJLy8gaWdub3JlCiAJCX0KQEAgLTMyNCwxNSArMzE0LDExIEBACiAJICogUmV0dXJuIHRoZSB0aW1lb3V0IChpbiBtcykgdG8gd2FpdCBiZWZvcmUgYXNzdW1pbmcgdGhhdCB0aGUgc2VydmVyCiAJICogaGFzIGZhaWxlZCB0byBzdG9wLiBUaGUgZGVmYXVsdCBpcyAyIG1pbnV0ZXMuCiAJICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHNodXRkb3duIHRpbWVvdXQsIG9yIC0xIGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQKKwkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgc2h1dGRvd24gdGltZW91dAogCSAqLwogCXB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXQoKSB7CiAJCXRyeSB7Ci0JCQlpbnQgaSA9IEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInN0b3BUaW1lb3V0IikpOwotCQkJaW50IHMgPSBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmdldE1hY2hpbmVTcGVlZCgpOwotCQkJaWYgKHMgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiAoaW50KSAoaSAqIFNFUlZFUl9USU1FT1VUU1tzLTFdKTsKKwkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzdG9wVGltZW91dCIpKTsKIAkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKIAkJCS8vIGlnbm9yZQogCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyV29ya2luZ0NvcHkuamF2YQppbmRleCBkZGQ5MDZlLi4yNzBjMTRkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJXb3JraW5nQ29weS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlcldvcmtpbmdDb3B5LmphdmEKQEAgLTIyLDYgKzIyLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSW50ZXJuYWxJbml0aWFsaXplcjsKQEAgLTM0LDI0ICszNiwyMyBAQAogcHVibGljIGNsYXNzIFNlcnZlcldvcmtpbmdDb3B5IGV4dGVuZHMgU2VydmVyIGltcGxlbWVudHMgSVNlcnZlcldvcmtpbmdDb3B5IHsKIAlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKIAlwcm90ZWN0ZWQgV29ya2luZ0NvcHlIZWxwZXIgd2NoOwotCQorCiAJcHJvdGVjdGVkIFNlcnZlckRlbGVnYXRlIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0JCisKIAkvLyB3b3JraW5nIGNvcHkKIAlwdWJsaWMgU2VydmVyV29ya2luZ0NvcHkoU2VydmVyIHNlcnZlcikgewogCQlzdXBlcihzZXJ2ZXIuZ2V0RmlsZSgpKTsKIAkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CiAJCQotCQltYXAgPSBuZXcgSGFzaE1hcChzZXJ2ZXIubWFwKTsKKwkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHNlcnZlci5tYXApOwogCQl3Y2ggPSBuZXcgV29ya2luZ0NvcHlIZWxwZXIodGhpcyk7CiAJCQogCQlyZXNvbHZlKCk7CiAJfQotCQorCiAJLy8gY3JlYXRpb24KIAlwdWJsaWMgU2VydmVyV29ya2luZ0NvcHkoU3RyaW5nIGlkLCBJRmlsZSBmaWxlLCBJUnVudGltZSBydW50aW1lLCBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7CiAJCXN1cGVyKGlkLCBmaWxlLCBydW50aW1lLCBzZXJ2ZXJUeXBlKTsKLQkJLy9zZXJ2ZXIgPSB0aGlzOwogCQl3Y2ggPSBuZXcgV29ya2luZ0NvcHlIZWxwZXIodGhpcyk7CiAJCXdjaC5zZXREaXJ0eSh0cnVlKTsKIAkJc2VydmVyU3RhdGUgPSAoKFNlcnZlclR5cGUpc2VydmVyVHlwZSkuZ2V0SW5pdGlhbFN0YXRlKCk7CkBAIC0xODUsNyArMTg2LDcgQEAKIAkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IHZhbHVlKSB7CisJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0PFN0cmluZz4gdmFsdWUpIHsKIAkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7CiAJfQogCkBAIC0xOTgsNiArMTk5LDkgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CiAJCXNldEF0dHJpYnV0ZShQUk9QX05BTUUsIG5hbWUpOworCQlib29sZWFuIHNldCA9IGdldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgZmFsc2UpOworCQlpZiAoc2VydmVyID09IG51bGwgJiYgIXNldCkKKwkJCXNldEF0dHJpYnV0ZShQUk9QX0lELCBuYW1lKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIGIpIHsKQEAgLTIyNiw2ICsyMzAsMTQgQEAKIAkJc2V0QXR0cmlidXRlKFBST1BfQVVUT19QVUJMSVNIX1RJTUUsIHApOwogCX0KIAorCXB1YmxpYyB2b2lkIHNldFN0YXJ0VGltZW91dChpbnQgcCkgeworCQlzZXRBdHRyaWJ1dGUoUFJPUF9TVEFSVF9USU1FT1VULCBwKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdG9wVGltZW91dChpbnQgcCkgeworCQlzZXRBdHRyaWJ1dGUoUFJPUF9TVE9QX1RJTUVPVVQsIHApOworCX0KKwogCXB1YmxpYyB2b2lkIHNldEF1dG9QdWJsaXNoU2V0dGluZyhpbnQgcykgewogCQlzZXRBdHRyaWJ1dGUoUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORywgcyk7CiAJfQpAQCAtMjQ1LDkgKzI1Nyw5IEBACiAJICogQHJldHVybiB0cnVlIGlmIGNoYW5nZSBpcyBtYWRlLiAKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlUHJlZmVycmVkUHVibGlzaE9wZXJhdGlvbnMoUHVibGlzaE9wZXJhdGlvbiBvcCkgewotCQlMaXN0IGxpc3QgPSBnZXRBdHRyaWJ1dGUoUFJPUF9ESVNBQkxFRF9QRVJGRVJSRURfVEFTS1MsIChMaXN0KW51bGwpOworCQlMaXN0PFN0cmluZz4gbGlzdCA9IGdldEF0dHJpYnV0ZShQUk9QX0RJU0FCTEVEX1BFUkZFUlJFRF9UQVNLUywgKExpc3Q8U3RyaW5nPiludWxsKTsKIAkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAJCQogCQlTdHJpbmcgb3BJZCA9IGdldFB1Ymxpc2hPcGVyYXRpb25JZChvcCk7CiAJCWlmIChsaXN0LmNvbnRhaW5zKG9wSWQpKQpAQCAtMjY0LDkgKzI3Niw5IEBACiAJICogQHJldHVybiB0cnVlIGlmIGNoYW5nZSBpcyBtYWRlLiAKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBlbmFibGVPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25zKFB1Ymxpc2hPcGVyYXRpb24gb3ApIHsKLQkJTGlzdCBsaXN0ID0gZ2V0QXR0cmlidXRlKFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUywgKExpc3QpbnVsbCk7CisJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gZ2V0QXR0cmlidXRlKFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUywgKExpc3Q8U3RyaW5nPiludWxsKTsKIAkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAJCQogCQlTdHJpbmcgb3BJZCA9IGdldFB1Ymxpc2hPcGVyYXRpb25JZChvcCk7CiAJCWlmIChsaXN0LmNvbnRhaW5zKG9wSWQpKQpAQCAtMjgwLDE0ICsyOTIsMzggQEAKIAkgKiBSZXNldCBhbGwgcHJlZmVycmVkIG9wZXJhdGlvbnMgdG8gZGVmYXVsdAogCSAqLwogCXB1YmxpYyB2b2lkIHJlc2V0UHJlZmVycmVkUHVibGlzaE9wZXJhdGlvbnMoKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX0RJU0FCTEVEX1BFUkZFUlJFRF9UQVNLUywgKExpc3QpbnVsbCk7CisJCXNldEF0dHJpYnV0ZShQUk9QX0RJU0FCTEVEX1BFUkZFUlJFRF9UQVNLUywgKExpc3Q8U3RyaW5nPiludWxsKTsKIAl9CiAKIAkvKioKIAkgKiBSZXNldCBhbGwgb3B0aW9uYWwgb3BlcmF0aW9ucyB0byBkZWZhdWx0CiAJICovCiAJcHVibGljIHZvaWQgcmVzZXRPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25zKCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9FTkFCTEVEX09QVElPTkFMX1RBU0tTLCAoTGlzdCludWxsKTsKKwkJc2V0QXR0cmlidXRlKFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUywgKExpc3Q8U3RyaW5nPiludWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoZXJFbmFibGVkKFB1Ymxpc2hlciBwdWIsIGJvb2xlYW4gZW5hYmxlZCkgeworCQlpZiAocHViID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQkvLyBjb3B5IG92ZXIgYWxsIGVsZW1lbnRzIGV4Y2VwdCB0aGUgdXBkYXRlZCBwdWJsaXNoZXIKKwkJTGlzdDxTdHJpbmc+IGxpc3QgPSBnZXRBdHRyaWJ1dGUoUFJPUF9QVUJMSVNIRVJTLCBFTVBUWV9MSVNUKTsKKwkJTGlzdDxTdHJpbmc+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBpZCA9IGl0ZXIubmV4dCgpOworCQkJaW50IGluZCA9IGlkLmluZGV4T2YoIjoiKTsKKwkJCWlmICghcHViLmdldElkKCkuZXF1YWxzKGlkLnN1YnN0cmluZygwLCBpbmQpKSkKKwkJCQluZXdMaXN0LmFkZChpZCk7CisJCX0KKwkJCisJCVN0cmluZyBzID0gcHViLmdldElkKCkgKyAiOiI7CisJCWlmIChlbmFibGVkKQorCQkJcyArPSAidHJ1ZSI7CisJCWVsc2UKKwkJCXMgKz0gImZhbHNlIjsKKwkJbmV3TGlzdC5hZGQocyk7CisJCXNldEF0dHJpYnV0ZShQUk9QX1BVQkxJU0hFUlMsIG5ld0xpc3QpOwogCX0KIAogCS8qKgpAQCAtNTMwLDcgKzU2Niw3IEBACiAJCQl9CiAJCQkKIAkJCS8vIGNvbnZlcnQgdG8gYXR0cmlidXRlCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVzLml0ZXJhdG9yKCk7CiAJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CiAJCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwpAQCAtNjM2LDYgKzY3MiwyNiBAQAogCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIG51bGwpOwogCX0KIAorCXB1YmxpYyB2b2lkIHB1Ymxpc2goaW50IGtpbmQsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzMiwgSUFkYXB0YWJsZSBpbmZvLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQlzZXJ2ZXIucHVibGlzaChraW5kLCBtb2R1bGVzMiwgaW5mbywgbGlzdGVuZXIpOworCQkJcmV0dXJuOworCQl9CisJCWxpc3RlbmVyLmRvbmUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIG51bGwpKTsKKwl9CisKKwlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKSB7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCXJldHVybiBzZXJ2ZXIuZ2V0TGF1bmNoKCk7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJcmV0dXJuIHNlcnZlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uKGNyZWF0ZSwgbW9uaXRvcik7CisJCXJldHVybiBudWxsOworCX0KKwogCS8qKgogCSAqIFNldHMgdGhlIHNlcnZlciByZXN0YXJ0IHN0YXRlLgogCSAqCkBAIC03MjcsMTIgKzc4MywyNCBAQAogCQlzdXBlci5zZXRFeHRlcm5hbE1vZHVsZXMobW9kdWxlcyk7CiAJfQogCi0JcHVibGljIExpc3QgZ2V0RXh0ZXJuYWxNb2R1bGVzKCkgeworCXB1YmxpYyBMaXN0PElNb2R1bGU+IGdldEV4dGVybmFsTW9kdWxlcygpIHsKIAkJaWYgKHNlcnZlciAhPSBudWxsKQogCQkJcmV0dXJuIHNlcnZlci5nZXRFeHRlcm5hbE1vZHVsZXMoKTsKIAkJcmV0dXJuIHN1cGVyLmdldEV4dGVybmFsTW9kdWxlcygpOwogCX0KIAorCS8qCisJICogQnJlYWsgY29ubmVjdGlvbiB3aXRoIHRoZSBvcmlnaW5hbCBzZXJ2ZXIgc28gdGhhdCB0aGlzIHdvcmtpbmcgY29weSBjYW4KKwkgKiBiZSBkdXBsaWNhdGVkLiBUaGUgbmFtZSAqbXVzdCogYmUgc2V0IGFmdGVyd2FyZHMgdG8gY2hhbmdlIHRoZSBpZC4gCisJICovCisJcHVibGljIHZvaWQgZGlzYXNzb2NpYXRlKCkgeworCQlzZXJ2ZXIgPSBudWxsOworCQlpZiAoZ2V0QXR0cmlidXRlKFBST1BfTE9DS0VELCBmYWxzZSkpCisJCQlzZXRBdHRyaWJ1dGUoUFJPUF9MT0NLRUQsIGZhbHNlKTsKKwkJaWYgKGdldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgZmFsc2UpKQorCQkJc2V0QXR0cmlidXRlKFBST1BfSURfU0VULCBmYWxzZSk7CisJfQorCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuICJTZXJ2ZXJXb3JraW5nQ29weSAiICsgZ2V0SWQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TdGFydFNlcnZlckpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU3RhcnRTZXJ2ZXJKb2IuamF2YQppbmRleCBlZTdjZmViLi45MDEyMGQ1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TdGFydFNlcnZlckpvYi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0YXJ0U2VydmVySm9iLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsOSArMTMsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJTY2hlZHVsaW5nUnVsZTsKIC8qKgogICogQSBqb2IgZm9yIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuCisgKiAKKyAqIEBkZXByZWNhdGVkIC0gdXNlIEFQSSBkaXJlY3RseSwgaXQgd2lsbCBraWNrIG9mZiBqb2JzIGFzIHJlcXVpcmVkCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGFydFNlcnZlckpvYiBleHRlbmRzIENoYWluZWRKb2IgewogCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKQEAgLTIzLDE4ICsyNCwzMCBAQAogCXB1YmxpYyBTdGFydFNlcnZlckpvYihJU2VydmVyIHNlcnZlciwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKIAkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMuam9iU3RhcnRpbmdTZXJ2ZXIsIHNlcnZlci5nZXROYW1lKCkpLCBzZXJ2ZXIpOwogCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwotCQlzZXRSdWxlKG5ldyBTZXJ2ZXJTY2hlZHVsaW5nUnVsZShzZXJ2ZXIpKTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuSW50ZXJuYWxKb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQogCSAqLwogCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWdldFNlcnZlcigpLnN5bmNocm9ub3VzU3RhcnQobGF1bmNoTW9kZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKKwkJZmluYWwgSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOworCQlnZXRTZXJ2ZXIoKS5zdGFydChsYXVuY2hNb2RlLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7CisJCQkJc3RhdHVzWzBdID0gcmVzdWx0OworCQkJfQorCQl9KTsKKwkJCisJCXdoaWxlIChzdGF0dXNbMF0gPT0gbnVsbCAmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJdHJ5IHsKKwkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CiAJCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCWlmIChzdGF0dXNbMF0gIT0gbnVsbCkKKwkJCXJldHVybiBzdGF0dXNbMF07CisJCQorCQlnZXRTZXJ2ZXIoKS5zdG9wKHRydWUsIG51bGwpOworCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CiAJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0b3BTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0b3BTZXJ2ZXJKb2IuamF2YQppbmRleCBlNjY1M2Y2Li43NGJmNzViIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TdG9wU2VydmVySm9iLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU3RvcFNlcnZlckpvYi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDE4ICsxMSwxNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJTY2hlZHVsaW5nUnVsZTsKIC8qKgogICogQSBqb2IgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIuCiAgKiAKLSAqIE5vdGU6IFRoaXMgaXMgYSBiYWNrcG9ydCBmb3IgYnVnIDIwMDcxNS4gSXQgaXMgbm90IEFQSSBjb21wYXRpYmxlIHdpdGggdGhlCi0gKiBXVFAgMy4wIHZlcnNpb24gZHVlIHRvIG1pc3NpbmcgdHJhbnNsYXRlZCBzdHJpbmdzLgorICogQGRlcHJlY2F0ZWQgLSB1c2UgQVBJIGRpcmVjdGx5LCBpdCB3aWxsIGtpY2sgb2ZmIGpvYnMgYXMgcmVxdWlyZWQKICAqLwogcHVibGljIGNsYXNzIFN0b3BTZXJ2ZXJKb2IgZXh0ZW5kcyBDaGFpbmVkSm9iIHsKLQlwdWJsaWMgU3RvcFNlcnZlckpvYihJU2VydmVyIHNlcnZlciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSwgc2VydmVyKTsKLQkJc2V0UnVsZShuZXcgU2VydmVyU2NoZWR1bGluZ1J1bGUoc2VydmVyKSk7CisJcHVibGljIFN0b3BTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMuam9iU3RvcHBpbmdTZXJ2ZXIsIHNlcnZlci5nZXROYW1lKCkpLCBzZXJ2ZXIpOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTQ1LDQgKzQzLDQgQEAKIAkJfQogCQlyZXR1cm4gc3RhdHVzWzBdOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQppbmRleCAyNDk4Y2NkLi5lYTJmZDdmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKQEAgLTEyLDYgKzEyLDggQEAKIAogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwpAQCAtMzYsMTEgKzM4LDEwIEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV2ZWxOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CiAJCSJDT05GSUcgICAiLCAiSU5GTyAgICAgIiwgIldBUk5JTkcgICIsICJTRVZFUkUgICAiLCAiRklORVIgICAgIiwgIkZJTkVTVCAgICIsCiAJCSJSRVNPVVJDRVMiLCAiRVhURU5TSU9OIiwgIkxJU1RFTkVSUyIsICJUQVJHRVQgICAiLCAiUEVSRiAgICAgIiwgIlBVQkxJU0ggICJ9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzcGFjZXIgPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQvTU0veXkgSEg6bW0uc3MuU1NTIik7CiAKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBwbHVnaW5MZW5ndGggPSAtMTsKKwlwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBsb2dnZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAKIAkvKioKIAkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgpAQCAtNjcsMzEgKzY4LDIwIEBACiAJICogQHBhcmFtIHQgYSB0aHJvd2FibGUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoaW50IGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJdHJhY2UoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgbGV2ZWwsIHMsIHQpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgYSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgcGx1Z2luSWQsIGludCBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChwbHVnaW5JZCA9PSBudWxsIHx8IHMgPT0gbnVsbCkKKwkJaWYgKHMgPT0gbnVsbCkKIAkJCXJldHVybjsKIAkJCi0JCWlmIChsZXZlbCA9PSBTRVZFUkUpCi0JCQlTZXJ2ZXJQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSWQsIHMsIHQpKTsKKwkJaWYgKGxldmVsID09IFNFVkVSRSkgeworCQkJaWYgKCFsb2dnZWQuY29udGFpbnMocykpIHsKKwkJCQlTZXJ2ZXJQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgcywgdCkpOworCQkJCWxvZ2dlZC5hZGQocyk7CisJCQl9CisJCX0KIAkJCiAJCWlmICghU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKIAkJCXJldHVybjsKIAkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocGx1Z2luSWQpOwotCQlpZiAocGx1Z2luSWQubGVuZ3RoKCkgPiBwbHVnaW5MZW5ndGgpCi0JCQlwbHVnaW5MZW5ndGggPSBwbHVnaW5JZC5sZW5ndGgoKTsKLQkJZWxzZSBpZiAocGx1Z2luSWQubGVuZ3RoKCkgPCBwbHVnaW5MZW5ndGgpCi0JCQlzYi5hcHBlbmQoc3BhY2VyLnN1YnN0cmluZygwLCBwbHVnaW5MZW5ndGggLSBwbHVnaW5JZC5sZW5ndGgoKSkpOworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQpOwogCQlzYi5hcHBlbmQoIiAiKTsKIAkJc2IuYXBwZW5kKGxldmVsTmFtZXNbbGV2ZWxdKTsKIAkJc2IuYXBwZW5kKCIgIik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Xb3JraW5nQ29weUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvV29ya2luZ0NvcHlIZWxwZXIuamF2YQppbmRleCBlMTY1YTRmLi5kNWRlMGNhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Xb3JraW5nQ29weUhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1dvcmtpbmdDb3B5SGVscGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjksNyArMjksNyBAQAogCXByb3RlY3RlZCBib29sZWFuIGlzRGlydHk7CiAKIAkvLyBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdCBwcm9wZXJ0eUxpc3RlbmVyczsKKwlwcml2YXRlIHRyYW5zaWVudCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHByb3BlcnR5TGlzdGVuZXJzOwogCiAJcHVibGljIFdvcmtpbmdDb3B5SGVscGVyKEJhc2UgYmFzZSkgewogCQl0aGlzLmJhc2UgPSBiYXNlOwpAQCAtNjgsOCArNjgsOCBAQAogCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChhdHRyaWJ1dGVOYW1lLCBjdXJyZW50LCB2YWx1ZSk7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IHZhbHVlKSB7Ci0JCUxpc3QgY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIChMaXN0KW51bGwpOworCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdDxTdHJpbmc+IHZhbHVlKSB7CisJCUxpc3QgY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIChMaXN0PFN0cmluZz4pbnVsbCk7CiAJCWlmIChiYXNlLmlzQXR0cmlidXRlU2V0KGF0dHJpYnV0ZU5hbWUpICYmIGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50LmVxdWFscyh2YWx1ZSkpCiAJCQlyZXR1cm47CiAJCQpAQCAtMTI1LDcgKzEyNSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CiAJCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQotCQkJcHJvcGVydHlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDIpOworCQkJcHJvcGVydHlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KDIpOwogCQlwcm9wZXJ0eUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwogCX0KIApAQCAtMTY5LDQgKzE2OSw0IEBACiAJcHJvdGVjdGVkIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewogCQlpc0RpcnR5ID0gZGlydHk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YQppbmRleCAxMDI5MjJjLi4wZmRhZDY3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTU4LDE2ICs1OCw2IEBACiAJCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBjaGlsZCk7CiAJfQogCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHsKLQkJRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJY2hpbGQuc2V0QXR0cmlidXRlKFRBR19JRCwgaWQpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGNoaWxkKTsKLQl9Ci0KIAkvKioKIAkgKiBDcmVhdGUgYSBEb2N1bWVudCBmcm9tIGEgUmVhZGVyIGFuZCBhbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHJlYWRpbmcgCiAJICogYSBkb2N1bWVudC4KQEAgLTE0Niw3ICsxMzYsNyBAQAogCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKIAkKIAkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisJCUxpc3Q8RWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oc2l6ZSk7CiAJCWZvciAoaW50IG5YID0gMDsgblggPCBzaXplOyBuWCArKykgewogCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShuWCk7CiAJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKQEAgLTE2MCw3ICsxNTAsNyBAQAogCQlzaXplID0gbGlzdC5zaXplKCk7CiAJCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07CiAJCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgewotCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIChFbGVtZW50KWxpc3QuZ2V0KHgpKTsKKwkJCXJlc3VsdHNbeF0gPSBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBsaXN0LmdldCh4KSk7CiAJCX0KIAkJcmV0dXJuIHJlc3VsdHM7CiAJfQpAQCAtMjA3LDIwICsxOTcsNiBAQAogCS8qCiAJICogQHNlZSBJTWVtZW50bwogCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShUQUdfSUQpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCiAJcHVibGljIEludGVnZXIgZ2V0SW50ZWdlcihTdHJpbmcga2V5KSB7CiAJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwogCQlpZiAoYXR0ciA9PSBudWxsKQpAQCAtMjQyLDExICsyMTgsMTEgQEAKIAkJCXJldHVybiBudWxsOyAKIAkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKIAl9Ci0JCi0JcHVibGljIExpc3QgZ2V0TmFtZXMoKSB7CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWVzKCkgewogCQlOYW1lZE5vZGVNYXAgbWFwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7CiAJCWludCBzaXplID0gbWFwLmdldExlbmd0aCgpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCQlOb2RlIG5vZGUgPSBtYXAuaXRlbShpKTsKIAkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwpAQCAtMjkwLDM1ICsyNjYsNiBAQAogCS8qCiAJICogQHNlZSBJTWVtZW50bwogCSAqLwotCXByaXZhdGUgdm9pZCBwdXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudDIpIHsKLQkJTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlbGVtZW50Mi5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBzaXplID0gbm9kZU1hcC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspewotCQkJQXR0ciBhdHRyID0gKEF0dHIpbm9kZU1hcC5pdGVtKGkpOwotCQkJcHV0U3RyaW5nKGF0dHIuZ2V0TmFtZSgpLGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudDIuZ2V0Q2hpbGROb2RlcygpOwotCQlzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCVhNTE1lbWVudG8gY2hpbGQgPSAoWE1MTWVtZW50byljcmVhdGVDaGlsZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCWNoaWxkLnB1dEVsZW1lbnQoKEVsZW1lbnQpbm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRGbG9hdChTdHJpbmcga2V5LCBmbG9hdCBmKSB7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nLnZhbHVlT2YoZikpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwogCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IG4pIHsKIAkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcudmFsdWVPZihuKSk7CiAJfQpAQCAtMzI2LDE0ICsyNzMsNiBAQAogCS8qCiAJICogQHNlZSBJTWVtZW50bwogCSAqLwotCXB1YmxpYyB2b2lkIHB1dE1lbWVudG8oSU1lbWVudG8gbWVtZW50bykgewotCQlYTUxNZW1lbnRvIHhtbE1lbWVudG8gPSAoWE1MTWVtZW50bykgbWVtZW50bzsKLQkJcHV0RWxlbWVudCh4bWxNZW1lbnRvLmVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwogCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKIAkJaWYgKHZhbHVlID09IG51bGwpCiAJCQlyZXR1cm47CkBAIC0zNDIsOCArMjgxLDEwIEBACiAJCiAJLyoqCiAJICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYSBXcml0ZXIuCisJICogCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2F2aW5nCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKIAkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZmFjdG9yeSk7CiAJCXRyeSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvRmFjZXRNYXBwaW5nVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL0ZhY2V0TWFwcGluZ1V0aWwuamF2YQppbmRleCAwNGVmYTQyLi4wMTk3ODRjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvRmFjZXRNYXBwaW5nVXRpbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9GYWNldE1hcHBpbmdVdGlsLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwpAQCAtMjMsMTAgKzI0LDEwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBGYWNldE1hcHBpbmdVdGlsIGV4dGVuZHMgUGx1Z2luIHsKIAkvLwljYWNoZWQgY29weSBvZiBhbGwgcnVudGltZSBjb21wb25lbnQgcHJvdmlkZXJzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBydW50aW1lQ29tcG9uZW50UHJvdmlkZXJzOworCXByaXZhdGUgc3RhdGljIExpc3Q8UnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlcj4gcnVudGltZUNvbXBvbmVudFByb3ZpZGVyczsKIAogCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIGZhY2V0IG1hcHBpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBydW50aW1lRmFjZXRNYXBwaW5nczsKKwlwcml2YXRlIHN0YXRpYyBMaXN0PFJ1bnRpbWVGYWNldE1hcHBpbmc+IHJ1bnRpbWVGYWNldE1hcHBpbmdzOwogCiAJLyoqCiAJICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcnVudGltZSBmYWNldCBtYXBwaW5nIGluc3RhbmNlcy4KQEAgLTU0LDE4ICs1NSwxOCBAQAogCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQogCSAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBleGlzdGluZyBsaXN0IG9mIGNvbXBvbmVudHMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXRSdW50aW1lQ29tcG9uZW50cyhJUnVudGltZSBydW50aW1lLCBMaXN0IGNvbXBvbmVudHMpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXRSdW50aW1lQ29tcG9uZW50cyhJUnVudGltZSBydW50aW1lLCBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBjb21wb25lbnRzKSB7CiAJCWlmIChydW50aW1lID09IG51bGwgfHwgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCQogCQlpZiAocnVudGltZUNvbXBvbmVudFByb3ZpZGVycyA9PSBudWxsKQogCQkJbG9hZFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMoKTsKIAkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZUNvbXBvbmVudFByb3ZpZGVycy5pdGVyYXRvcigpOworCQlJdGVyYXRvcjxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyPiBpdGVyYXRvciA9IHJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlciBydW50aW1lQ29tcG9uZW50UHJvdmlkZXIgPSAoUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlcikgaXRlcmF0b3IubmV4dCgpOworCQkJUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlciBydW50aW1lQ29tcG9uZW50UHJvdmlkZXIgPSBpdGVyYXRvci5uZXh0KCk7CiAJCQlpZiAocnVudGltZUNvbXBvbmVudFByb3ZpZGVyLnN1cHBvcnRzUnVudGltZVR5cGUocnVudGltZS5nZXRSdW50aW1lVHlwZSgpKSkgewotCQkJCUxpc3QgbGlzdCA9IHJ1bnRpbWVDb21wb25lbnRQcm92aWRlci5nZXRDb21wb25lbnRzKHJ1bnRpbWUpOworCQkJCUxpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGxpc3QgPSBydW50aW1lQ29tcG9uZW50UHJvdmlkZXIuZ2V0Q29tcG9uZW50cyhydW50aW1lKTsKIAkJCQlpZiAobGlzdCAhPSBudWxsKQogCQkJCQljb21wb25lbnRzLmFkZEFsbChsaXN0KTsKIAkJCX0KQEAgLTgzLDI3ICs4NCwyNSBAQAogCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAicnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzIik7CiAJCQogCQkvLyBsb2FkIG5ldyB3c3QgZXh0ZW5zaW9uIHBvaW50Ci0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlMaXN0PFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXI+KGNmLmxlbmd0aCk7CisJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlIDogY2YpIHsKIAkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7CisJCQkJbGlzdC5hZGQobmV3IFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIoY2UpKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcjogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7CiAJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXI6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwogCQkJfQogCQl9CiAJCQogCQkvLyBsb2FkIG9sZCBqc3QgZXh0ZW5zaW9uIHBvaW50CiAJCWNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzIik7CiAJCQotCQlzaXplID0gY2YubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7CiAJCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyKGNmW2ldKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOworCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyKGNlKSk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXI6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIikpOwogCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKIAkJCX0KIAkJfQogCQlydW50aW1lQ29tcG9uZW50UHJvdmlkZXJzID0gbGlzdDsKQEAgLTEyMSwxNCArMTIwLDEzIEBACiAJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CiAJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0TWFwcGluZ3MiKTsKIAkJCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlMaXN0PFJ1bnRpbWVGYWNldE1hcHBpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJ1bnRpbWVGYWNldE1hcHBpbmc+KGNmLmxlbmd0aCk7CisJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlIDogY2YpIHsKIAkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFJ1bnRpbWVGYWNldE1hcHBpbmcoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBydW50aW1lRmFjZXRNYXBwaW5nOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkIikpOworCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lRmFjZXRNYXBwaW5nKGNlKSk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgcnVudGltZUZhY2V0TWFwcGluZzogIiArIGNlLmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZCIpKTsKIAkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBydW50aW1lRmFjZXRNYXBwaW5nOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHJ1bnRpbWVGYWNldE1hcHBpbmc6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwogCQkJfQogCQl9CiAJCXJ1bnRpbWVGYWNldE1hcHBpbmdzID0gbGlzdDsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9GYWNldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9GYWNldFV0aWwuamF2YQppbmRleCAzMWM2ZjAyLi5mMmNjNmJmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvRmFjZXRVdGlsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL0ZhY2V0VXRpbC5qYXZhCkBAIC0xNCw3ICsxNCw5IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CkBAIC0yNyw2ICsyOSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwogLyoqCiAgKiBVdGlsaXR5IGNsYXNzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gZmFjZXQgcnVudGltZXMgYW5kIHNlcnZlciBydW50aW1lcy4KICAqIDxwPgpAQCAtNjUsMTAgKzY4LDkgQEAKIAkJCXJldHVybiBudWxsOwogCQkKIAkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaWQuZXF1YWxzKHJ1bnRpbWVzW2ldLmdldElkKCkpKQotCQkJCXJldHVybiBydW50aW1lc1tpXTsKKwkJZm9yIChJUnVudGltZSByIDogcnVudGltZXMpIHsKKwkJCWlmIChpZC5lcXVhbHMoci5nZXRJZCgpKSkKKwkJCQlyZXR1cm4gcjsKIAkJfQogCQkKIAkJcmV0dXJuIG51bGw7CkBAIC0xMzUsNCArMTM3LDYzIEBACiAJCX0KIAkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJfQorCQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcnVudGltZSBpcyBiZWluZyB0YXJnZXRlZCBieSB0aGUgZmFjZXQKKwkgKiBmcmFtZXdvcmssIGFuZCBmYWxzZSBvdGhlcndpc2UuCisJICogCisJICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcnVudGltZSBpcyBpbiB1c2UsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KKwkgKiAgICBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSdW50aW1lVGFyZ2V0ZWQoSVJ1bnRpbWUgcnVudGltZSkgeworCQl0cnkgeworCQkJb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBydW50aW1lMiA9IGdldFJ1bnRpbWUocnVudGltZSk7CisJCQkKKwkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7CisJCQlpZiAocHJvamVjdHMgIT0gbnVsbCkgeworCQkJCWZvciAoSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7CisJCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKKwkJCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwpIHsKKwkJCQkJCVNldDxvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lPiBzZXQgPSBmYWNldGVkUHJvamVjdC5nZXRUYXJnZXRlZFJ1bnRpbWVzKCk7CisJCQkJCQlpZiAoc2V0ICE9IG51bGwgJiYgc2V0LmNvbnRhaW5zKHJ1bnRpbWUyKSkKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZGV0ZXJtaW5lIGlmIHJ1bnRpbWUgaXMgaW4gdXNlIiwgdCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHJ1bnRpbWUgZnJvbSB0aGUgdGFyZ2V0IG9mIGFsbCBwcm9qZWN0cy4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIGZvciBhbnkgcmVhc29uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVRhcmdldHMoSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIHJ1bnRpbWUyID0gZ2V0UnVudGltZShydW50aW1lKTsKKwkJCQorCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKwkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7CisJCQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMpIHsKKwkJCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOworCQkJCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCkgeworCQkJCQkJU2V0PG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU+IHNldCA9IGZhY2V0ZWRQcm9qZWN0LmdldFRhcmdldGVkUnVudGltZXMoKTsKKwkJCQkJCWlmIChzZXQgIT0gbnVsbCAmJiBzZXQuY29udGFpbnMocnVudGltZTIpKQorCQkJCQkJCWZhY2V0ZWRQcm9qZWN0LnJlbW92ZVRhcmdldGVkUnVudGltZShydW50aW1lMiwgbW9uaXRvcik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCXRocm93IGNlOworCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCByZW1vdmUgcnVudGltZSB0YXJnZXQiLCB0KTsKKwkJfQorCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUJyaWRnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL1J1bnRpbWVCcmlkZ2UuamF2YQppbmRleCAzZmNjMDFjLi4wMDBiODEwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUJyaWRnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQnJpZGdlLmphdmEKQEAgLTE5LDMzICsxOSwzNyBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQnJpZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZVR5cGU7CiAvKioKICAqIAogICovCiBwdWJsaWMgY2xhc3MgUnVudGltZUJyaWRnZSBpbXBsZW1lbnRzIElSdW50aW1lQnJpZGdlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisJcHJvdGVjdGVkIHN0YXRpYyBNYXA8U3RyaW5nLCBMaXN0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4+KCk7CiAKIAlzdGF0aWMgewogCQlpbml0aWFsaXplKCk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBpZCwgU3RyaW5nIGlkMiwgU3RyaW5nIHZlcnNpb24pIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBudWxsOworCQlMaXN0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gbGlzdCA9IG51bGw7CiAJCXRyeSB7Ci0JCQlsaXN0ID0gKEFycmF5TGlzdCkgbWFwcGluZ3MuZ2V0KGlkKTsKKwkJCWxpc3QgPSBtYXBwaW5ncy5nZXQoaWQpOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJLy8gaWdub3JlCiAJCX0KIAkJCiAJCWlmIChsaXN0ID09IG51bGwpCi0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKKwkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4oMik7CiAJCQogCQl0cnkgewogCQkJbGlzdC5hZGQoUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoaWQyKS5nZXRWZXJzaW9uKHZlcnNpb24pKTsKQEAgLTgzLDkgKzg3LDkgQEAKIAkJYWRkTWFwcGluZygib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlLjYiLCAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIiwgIjYuMCIpOwogCX0KIAotCXB1YmxpYyBTZXQgZ2V0RXhwb3J0ZWRSdW50aW1lTmFtZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJcHVibGljIFNldDxTdHJpbmc+IGdldEV4cG9ydGVkUnVudGltZU5hbWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotCQlTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQocnVudGltZXMubGVuZ3RoKTsKKwkJU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihydW50aW1lcy5sZW5ndGgpOwogCQkKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lcy5sZW5ndGg7IGkrKykgewogCQkJSVJ1bnRpbWUgcnVudGltZSA9IHJ1bnRpbWVzW2ldOwpAQCAtMTA3LDI0ICsxMTEsMjYgQEAKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKIAkJCWlmIChydW50aW1lc1tpXS5nZXRJZCgpLmVxdWFscyhuYW1lKSkKIAkJCQlyZXR1cm4gbmV3IFN0dWIocnVudGltZXNbaV0pOworCQkJaWYgKHJ1bnRpbWVzW2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCisJCQkJcmV0dXJuIG5ldyBTdHViKHJ1bnRpbWVzW2ldKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHViIGltcGxlbWVudHMgSVN0dWIgeworCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0dWIgZXh0ZW5kcyBJUnVudGltZUJyaWRnZS5TdHViIHsKIAkJcHJpdmF0ZSBJUnVudGltZSBydW50aW1lOwogCiAJCXB1YmxpYyBTdHViKElSdW50aW1lIHJ1bnRpbWUpIHsKIAkJCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7CiAJCX0KIAotCQlwdWJsaWMgTGlzdCBnZXRSdW50aW1lQ29tcG9uZW50cygpIHsKLQkJCUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoMik7CisJCXB1YmxpYyBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRSdW50aW1lQ29tcG9uZW50cygpIHsKKwkJCUxpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ29tcG9uZW50PigyKTsKIAkJCWlmIChydW50aW1lID09IG51bGwpCiAJCQkJcmV0dXJuIGNvbXBvbmVudHM7CiAJCQkKIAkJCS8vIGRlZmluZSBzZXJ2ZXIgcnVudGltZSBjb21wb25lbnQKLQkJCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoNSk7CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oNSk7CiAJCQlpZiAocnVudGltZS5nZXRMb2NhdGlvbigpICE9IG51bGwpCiAJCQkJcHJvcGVydGllcy5wdXQoImxvY2F0aW9uIiwgcnVudGltZS5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKSk7CiAJCQllbHNlCkBAIC0xNTEsMTMgKzE1NywyMCBAQAogCQkJcmV0dXJuIGNvbXBvbmVudHM7CiAJCX0KIAotCQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7Ci0JCSAgICBmaW5hbCBNYXAgcHJvcHMgPSBuZXcgSGFzaE1hcCgpOworCQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCkgeworCQkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewogCQkJCXByb3BzLnB1dCgiaWQiLCBydW50aW1lLmdldElkKCkpOwogCQkJCXByb3BzLnB1dCgibG9jYWxpemVkLW5hbWUiLCBydW50aW1lLmdldE5hbWUoKSk7CisJCQkJU3RyaW5nIHMgPSAoKFJ1bnRpbWUpcnVudGltZSkuZ2V0QXR0cmlidXRlKCJhbHRlcm5hdGUtbmFtZXMiLCAoU3RyaW5nKW51bGwpOworCQkJCWlmIChzICE9IG51bGwpCisJCQkJICAgIHByb3BzLnB1dCgiYWx0ZXJuYXRlLW5hbWVzIiwgcyk7CiAJCQl9CiAJCQlyZXR1cm4gcHJvcHM7CiAJCX0KKwkJCisJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkgICAgcmV0dXJuIHJ1bnRpbWUudmFsaWRhdGUoIG1vbml0b3IgKTsKKwkJfQogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL1J1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIuamF2YQppbmRleCA0NDAyMjcwLi41NTY0NTBkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKQEAgLTQ5LDcgKzUwLDcgQEAKIAogCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVHlwZUlkcygpIHsKIAkJdHJ5IHsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkcyIpLCAiLCIpOwogCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewogCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKQEAgLTEwMyw3ICsxMDQsNyBAQAogCQkJdHJ5IHsKIAkJCQlkZWxlZ2F0ZSA9IChSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CiAJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgdC5nZXRNZXNzYWdlKCkpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwogCQkJfQogCQl9CiAJCXJldHVybiBkZWxlZ2F0ZTsKQEAgLTExMiw3ICsxMTMsNyBAQAogCS8qCiAJICogQHNlZSBSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlI2dldFJ1bnRpbWVDb21wb25lbnRzKElSdW50aW1lKQogCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbXBvbmVudHMoSVJ1bnRpbWUgcnVudGltZSkgeworCXB1YmxpYyBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRDb21wb25lbnRzKElSdW50aW1lIHJ1bnRpbWUpIHsKIAkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL1J1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlLmphdmEKaW5kZXggM2E5NjllYy4uZjk0M2MzZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL1J1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZS5qYXZhCkBAIC0xMiw2ICsxMiw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwogLyoqCiAgKiBBIHJ1bnRpbWUgY29tcG9uZW50IHByb3ZpZGVyIGNhbiBwcm92aWRlIGFkZGl0aW9uYWwgcnVudGltZSBjb21wb25lbnRzIGZvciBhIGZhY2V0IHJ1bnRpbWUuCkBAIC00Miw1ICs0Myw1IEBACiAJICogQHBhcmFtIHJ1bnRpbWUgYSBzZXJ2ZXIgcnVudGltZQogCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJ1bnRpbWVzLCBvciBhbiBlbXB0eSBsaXN0IG9yIG51bGwgaWYgdGhlcmUgYXJlIG5vIGFkZGl0aW9uYWwgY29tcG9uZW50cwogCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldFJ1bnRpbWVDb21wb25lbnRzKElSdW50aW1lIHJ1bnRpbWUpOworCXB1YmxpYyBhYnN0cmFjdCBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRSdW50aW1lQ29tcG9uZW50cyhJUnVudGltZSBydW50aW1lKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYmQ4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRW50cnkuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnRhcjsKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSBmaWxlIGluIGEgdGFyIGFyY2hpdmUuCisgKiA8cD4KKyAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgVGFyRW50cnkgaW1wbGVtZW50cyBDbG9uZWFibGUgeworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBsb25nIG1vZGUsIHRpbWUsIHNpemU7CisJcHJpdmF0ZSBpbnQgdHlwZTsKKwlpbnQgZmlsZXBvczsKKworCS8qKgorCSAqIEVudHJ5IHR5cGUgZm9yIG5vcm1hbCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFID0gJzAnOworCisJLyoqCisJICogRW50cnkgdHlwZSBmb3IgZGlyZWN0b3JpZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUT1JZID0gJzUnOworCQorCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBUYXJFbnRyeSBmb3IgYSBmaWxlIG9mIHRoZSBnaXZlbiBuYW1lIGF0IHRoZQorCSAqIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBmaWxlLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIGZpbGVuYW1lCisJICogQHBhcmFtIHBvcyBwb3NpdGlvbiBpbiB0aGUgZmlsZSBpbiBieXRlcworCSAqLworCVRhckVudHJ5KFN0cmluZyBuYW1lLCBpbnQgcG9zKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCW1vZGUgPSAwNjQ0OworCQl0eXBlID0gRklMRTsKKwkJZmlsZXBvcyA9IHBvczsKKwkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC8gMTAwMDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgVGFyRW50cnkgZm9yIGEgZmlsZSBvZiB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSBmaWxlbmFtZQorCSAqLworCXB1YmxpYyBUYXJFbnRyeShTdHJpbmcgbmFtZSkgeworCQl0aGlzKG5hbWUsIC0xKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZmlsZSwgb25lIG9mIEZJTEUsIExJTkssIFNZTV9MSU5LLAorCSAqIENIQVJfREVWSUNFLCBCTE9DS19ERVZJQ0UsIERJUkVDVE9SWSBvciBGSUZPLgorCSAqIAorCSAqIEByZXR1cm4gZmlsZSB0eXBlCisJICovCisJcHVibGljIGludCBnZXRGaWxlVHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbW9kZSBvZiB0aGUgZmlsZSBpbiBVTklYIHBlcm1pc3Npb25zIGZvcm1hdC4KKwkgKiAKKwkgKiBAcmV0dXJuIGZpbGUgbW9kZQorCSAqLworCXB1YmxpYyBsb25nIGdldE1vZGUoKSB7CisJCXJldHVybiBtb2RlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisJICogCisJICogQHJldHVybiBmaWxlbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBpbiBieXRlcy4KKwkgKiAKKwkgKiBAcmV0dXJuIGZpbGVzaXplCisJICovCisJcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKKwkJcmV0dXJuIHNpemU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGUgaW4gc2Vjb25kcyBzaW5jZSBKYW51YXJ5CisJICogMXN0IDE5NzAuCisJICogCisJICogQHJldHVybiB0aW1lCisJICovCisJcHVibGljIGxvbmcgZ2V0VGltZSgpIHsKKwkJcmV0dXJuIHRpbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdHlwZSBvZiB0aGUgZmlsZSwgb25lIG9mIEZJTEUsIExJTkssIFNZTUxJTkssIENIQVJfREVWSUNFLAorCSAqIEJMT0NLX0RFVklDRSwgb3IgRElSRUNUT1JZLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlCisJICovCisJcHVibGljIHZvaWQgc2V0RmlsZVR5cGUoaW50IHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBtb2RlIG9mIHRoZSBmaWxlIGluIFVOSVggcGVybWlzc2lvbnMgZm9ybWF0LgorCSAqIAorCSAqIEBwYXJhbSBtb2RlCisJICovCisJcHVibGljIHZvaWQgc2V0TW9kZShsb25nIG1vZGUpIHsKKwkJdGhpcy5tb2RlID0gbW9kZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBmaWxlIGluIGJ5dGVzLgorCSAqIAorCSAqIEBwYXJhbSBzaXplCisJICovCisJcHVibGljIHZvaWQgc2V0U2l6ZShsb25nIHNpemUpIHsKKwkJdGhpcy5zaXplID0gc2l6ZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZSBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkKKwkgKiAxc3QgMTk3MC4KKwkgKiAKKwkgKiBAcGFyYW0gdGltZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFRpbWUobG9uZyB0aW1lKSB7CisJCXRoaXMudGltZSA9IHRpbWU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNiMWZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC50YXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworLyoqCisgKiBFeGNlcHRpb24gZ2VuZXJhdGVkIHVwb24gZW5jb3VudGVyaW5nIGNvcnJ1cHRlZCB0YXIgZmlsZXMuCisgKiA8cD4KKyAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgVGFyRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24geworCS8qKgorCSAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjg4NjY3MTI1NDUxODg1MzUyOEw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgVGFyRXhjZXB0aW9uIHdpdGhvdXQgYSBkZXRhaWwgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBUYXJFeGNlcHRpb24oKSB7CisgICAgCXN1cGVyKCk7CisgICAgfQorCQorCS8qKgorICAgICAqIENvbnN0cnVjdHMgYSBUYXJFeGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgZGV0YWlsIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBUYXJFeGNlcHRpb24oU3RyaW5nIHMpIHsKKyAgICAJc3VwZXIocyk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOTc0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRmlsZS5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwudGFyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07CisvKioKKyAqIFJlYWRzIGEgLnRhciBvciAudGFyLmd6IGFyY2hpdmUgZmlsZSwgcHJvdmlkaW5nIGFuIGluZGV4IGVudW1lcmF0aW9uCisgKiBhbmQgYWxsb3dzIGZvciBhY2Nlc3NpbmcgYW4gSW5wdXRTdHJlYW0gZm9yIGFyYml0cmFyeSBmaWxlcyBpbiB0aGUKKyAqIGFyY2hpdmUuCisgKiA8cD4KKyAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgVGFyRmlsZSB7CisJcHJpdmF0ZSBGaWxlIGZpbGU7CisJcHJvdGVjdGVkIFRhcklucHV0U3RyZWFtIGVudHJ5RW51bWVyYXRpb25TdHJlYW07CisJcHJvdGVjdGVkIFRhckVudHJ5IGN1ckVudHJ5OworCXByaXZhdGUgVGFySW5wdXRTdHJlYW0gZW50cnlTdHJlYW07CisJCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IFRhckZpbGUgZm9yIHRoZSBnaXZlbiBmaWxlLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlCisJICogQHRocm93cyBUYXJFeGNlcHRpb24KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIFRhckZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXRoaXMuZmlsZSA9IGZpbGU7CisKKwkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworCQkvLyBGaXJzdCwgY2hlY2sgaWYgaXQncyBhIEdaSVBJbnB1dFN0cmVhbS4KKwkJdHJ5IHsKKwkJCWluID0gbmV3IEdaSVBJbnB1dFN0cmVhbShpbik7CisJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCQkJLy9JZiBpdCBpcyBub3QgY29tcHJlc3NlZCB3ZSBjbG9zZQorCQkJLy90aGUgb2xkIG9uZSBhbmQgcmVjcmVhdGUKKwkJCWluLmNsb3NlKCk7CQkKKwkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKwkJfQorCQllbnRyeUVudW1lcmF0aW9uU3RyZWFtID0gbmV3IFRhcklucHV0U3RyZWFtKGluKTsKKwkJY3VyRW50cnkgPSBlbnRyeUVudW1lcmF0aW9uU3RyZWFtLmdldE5leHRFbnRyeSgpOworCX0KKwkKKwkvKioKKwkgKiBDbG9zZSB0aGUgdGFyIGZpbGUgaW5wdXQgc3RyZWFtLgorCSAqIAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUgY2Fubm90IGJlIHN1Y2Nlc3NmdWxseSBjbG9zZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWVudHJ5RW51bWVyYXRpb25TdHJlYW0uY2xvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgVGFyRmlsZSBmb3IgdGhlIGdpdmVuIHBhdGggbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gZmlsZW5hbWUKKwkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgVGFyRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJdGhpcyhuZXcgRmlsZShmaWxlbmFtZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gY2F0YWxvZ3VpbmcgdGhlIHRhciBhcmNoaXZlLgorCSAqIAorCSAqIEByZXR1cm4gZW51bWVyYXRpb24gb2YgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlCisJICovCisJcHVibGljIEVudW1lcmF0aW9uIGVudHJpZXMoKSB7CisJCXJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7CQkJCisJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CisJCQkJcmV0dXJuIChjdXJFbnRyeSAhPSBudWxsKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKwkJCQlUYXJFbnRyeSBvbGRFbnRyeSA9IGN1ckVudHJ5OworCQkJCXRyeSB7CisJCQkJCWN1ckVudHJ5ID0gZW50cnlFbnVtZXJhdGlvblN0cmVhbS5nZXROZXh0RW50cnkoKTsKKwkJCQl9IGNhdGNoKFRhckV4Y2VwdGlvbiBlKSB7CisJCQkJCWN1ckVudHJ5ID0gbnVsbDsKKwkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJY3VyRW50cnkgPSBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gb2xkRW50cnk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBJbnB1dFN0cmVhbSBmb3IgdGhlIGdpdmVuIGZpbGUgaW4gdGhlIHRhciBhcmNoaXZlLgorCSAqIAorCSAqIEBwYXJhbSBlbnRyeQorCSAqIEByZXR1cm4gYW4gaW5wdXQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gZmlsZQorCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShUYXJFbnRyeSBlbnRyeSkgdGhyb3dzIFRhckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlpZihlbnRyeVN0cmVhbSA9PSBudWxsIHx8ICFlbnRyeVN0cmVhbS5za2lwVG9FbnRyeShlbnRyeSkpIHsKKwkJCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKwkJCS8vIEZpcnN0LCBjaGVjayBpZiBpdCdzIGEgR1pJUElucHV0U3RyZWFtLgorCQkJdHJ5IHsKKwkJCQlpbiA9IG5ldyBHWklQSW5wdXRTdHJlYW0oaW4pOworCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworCQkJfQorCQkJZW50cnlTdHJlYW0gPSBuZXcgVGFySW5wdXRTdHJlYW0oaW4sIGVudHJ5KSB7CisJCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7CisJCQkJCS8vIElnbm9yZSBjbG9zZSgpIHNpbmNlIHdlIHdhbnQgdG8gcmV1c2UgdGhlIHN0cmVhbS4KKwkJCQl9CisJCQl9OworCQl9CisJCWlmKGVudHJ5U3RyZWFtID09IG51bGwpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiaHVoPyIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIGVudHJ5U3RyZWFtOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhdGggbmFtZSBvZiB0aGUgZmlsZSB0aGlzIGFyY2hpdmUgcmVwcmVzZW50cy4KKwkgKiAKKwkgKiBAcmV0dXJuIHBhdGgKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBmaWxlLmdldFBhdGgoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhcklucHV0U3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFySW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWIxNmYzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhcklucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwzNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC50YXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKy8qKgorICogSW5wdXQgc3RyZWFtIGZvciByZWFkaW5nIGZpbGVzIGluIHVzdGFyIGZvcm1hdCAodGFyKSBjb21wYXRpYmxlCisgKiB3aXRoIHRoZSBzcGVjaWZpY2F0aW9uIGluIElFRUUgU3RkIDEwMDMuMS0yMDAxLiAgQWxzbyBzdXBwb3J0cworICogbG9uZyBmaWxlbmFtZXMgZW5jb2RlZCB1c2luZyB0aGUgR05VIEBMb25nTGluayBleHRlbnNpb24uCisgKiA8cD4KKyAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgVGFySW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7CisJcHJpdmF0ZSBpbnQgbmV4dEVudHJ5ID0gMDsKKwlwcml2YXRlIGludCBuZXh0RU9GID0gMDsKKwlwcml2YXRlIGludCBmaWxlcG9zID0gMDsKKwlwcml2YXRlIGludCBieXRlc3JlYWQgPSAwOworCXByaXZhdGUgVGFyRW50cnkgZmlyc3RFbnRyeSA9IG51bGw7CisJcHJpdmF0ZSBTdHJpbmcgbG9uZ0xpbmtOYW1lID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdGFyIGlucHV0IHN0cmVhbSBvbiB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLgorCSAqIAorCSAqIEBwYXJhbSBpbiBpbnB1dCBzdHJlYW0KKwkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgVGFySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJc3VwZXIoaW4pOworCisJCS8vIFJlYWQgaW4gdGhlIGZpcnN0IFRhckVudHJ5IHRvIG1ha2Ugc3VyZQorCQkvLyB0aGUgaW5wdXQgaXMgYSB2YWxpZCB0YXIgZmlsZSBzdHJlYW0uCisJCWZpcnN0RW50cnkgPSBnZXROZXh0RW50cnkoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgdGFyIGlucHV0IHN0cmVhbSwgc2tpcHBpbmcgYWhlYWQgdG8gdGhlIGdpdmVuIGVudHJ5CisJICogaW4gdGhlIGZpbGUuCisJICogCisJICogQHBhcmFtIGluIGlucHV0IHN0cmVhbQorCSAqIEBwYXJhbSBlbnRyeSBza2lwcyB0byB0aGlzIGVudHJ5IGluIHRoZSBmaWxlCisJICogQHRocm93cyBUYXJFeGNlcHRpb24KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJVGFySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIFRhckVudHJ5IGVudHJ5KSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXN1cGVyKGluKTsKKwkJc2tpcFRvRW50cnkoZW50cnkpOworCX0KKworCS8qKgorCSAqICBUaGUgY2hlY2tzdW0gb2YgYSB0YXIgZmlsZSBoZWFkZXIgaXMgc2ltcGx5IHRoZSBzdW0gb2YgdGhlIGJ5dGVzIGluCisJICogIHRoZSBoZWFkZXIuCisJICogCisJICogQHBhcmFtIGhlYWRlcgorCSAqIEByZXR1cm4gY2hlY2tzdW0KKwkgKi8KKwlwcml2YXRlIGxvbmcgaGVhZGVyQ2hlY2tzdW0oYnl0ZVtdIGhlYWRlcikgeworCQlsb25nIHN1bSA9IDA7CisJCWZvcihpbnQgaSA9IDA7IGkgPCA1MTI7IGkrKykgeworCQkJc3VtICs9IGhlYWRlcltpXSAmIDB4ZmY7CisJCX0KKwkJcmV0dXJuIHN1bTsKKwl9CisKKwkvKioKKwkgKiBTa2lwcyBhaGVhZCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGdpdmVuIGVudHJ5IGluIHRoZSBmaWxlLgorCSAqIAorCSAqIEBwYXJhbSBlbnRyeQorCSAqIEByZXR1cm5zIGZhbHNlIGlmIHRoZSBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHBhc3NlZAorCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCWJvb2xlYW4gc2tpcFRvRW50cnkoVGFyRW50cnkgZW50cnkpIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJaW50IGJ5dGVzdG9za2lwID0gZW50cnkuZmlsZXBvcyAtIGJ5dGVzcmVhZDsKKwkJaWYoYnl0ZXN0b3NraXAgPCAwKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJd2hpbGUoYnl0ZXN0b3NraXAgPiAwKSB7CisJCQlsb25nIHJldCA9IGluLnNraXAoYnl0ZXN0b3NraXApOworCQkJaWYocmV0IDwgMCkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiZWFybHkgZW5kIG9mIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlieXRlc3Rvc2tpcCAtPSByZXQ7CisJCQlieXRlc3JlYWQgKz0gcmV0OworCQl9CisJCWZpbGVwb3MgPSBlbnRyeS5maWxlcG9zOworCQluZXh0RW50cnkgPSAwOworCQluZXh0RU9GID0gMDsKKwkJLy8gUmVhZCBuZXh0IGhlYWRlciB0byBzZWVrIHRvIGZpbGUgZGF0YS4KKwkJZ2V0TmV4dEVudHJ5KCk7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaGVhZGVyIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisJICogCisJICogQHBhcmFtIGhlYWRlcgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGhlYWRlciBoYXMgYSB2YWxpZCBjaGVja3N1bQorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVGFySGVhZGVyKGJ5dGVbXSBoZWFkZXIpIHsKKwkJbG9uZyBmaWxlQ2hlY2tzdW0sIGNhbGN1bGF0ZWRDaGVja3N1bTsKKwkJaW50IHBvcywgaTsKKwkJCisJCXBvcyA9IDE0ODsKKwkJU3RyaW5nQnVmZmVyIGNoZWNrc3VtU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmKGhlYWRlcltwb3MgKyBpXSA9PSAnICcpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmKGhlYWRlcltwb3MgKyBpXSA9PSAwIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhcikgaGVhZGVyW3BvcyArIGldKSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJY2hlY2tzdW1TdHJpbmcuYXBwZW5kKChjaGFyKSBoZWFkZXJbcG9zICsgaV0pOworCQl9CisJCWlmKGNoZWNrc3VtU3RyaW5nLmxlbmd0aCgpID09IDApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZihjaGVja3N1bVN0cmluZy5jaGFyQXQoMCkgIT0gJzAnKSB7CisJCQljaGVja3N1bVN0cmluZy5pbnNlcnQoMCwgJzAnKTsKKwkJfQorCQl0cnkgeworCQkJZmlsZUNoZWNrc3VtID0gTG9uZy5kZWNvZGUoY2hlY2tzdW1TdHJpbmcudG9TdHJpbmcoKSkubG9uZ1ZhbHVlKCk7CisJCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJLy9UaGlzIGlzIG5vdCB2YWxpZCBpZiBpdCBjYW5ub3QgYmUgcGFyc2VkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBCbGFuayBvdXQgdGhlIGNoZWNrc3VtLgorCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWhlYWRlcltwb3MgKyBpXSA9ICcgJzsKKwkJfQorCQljYWxjdWxhdGVkQ2hlY2tzdW0gPSBoZWFkZXJDaGVja3N1bShoZWFkZXIpOworCisJCXJldHVybiAoZmlsZUNoZWNrc3VtID09IGNhbGN1bGF0ZWRDaGVja3N1bSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgdGFyIGZpbGUuICBEb2VzIG5vdCBoYW5kbGUKKwkgKiBHTlUgQExvbmdMaW5rIGV4dGVuc2lvbnMuCisJICogCisJICogQHJldHVybiB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgdGFyIGZpbGUKKwkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlUYXJFbnRyeSBnZXROZXh0RW50cnlJbnRlcm5hbCgpIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlWzUxMl07CisJCWludCBwb3MgPSAwOworCQlpbnQgaTsKKworCQlpZihmaXJzdEVudHJ5ICE9IG51bGwpIHsKKwkJCVRhckVudHJ5IGVudHJ5UmV0dXJuID0gZmlyc3RFbnRyeTsKKwkJCWZpcnN0RW50cnkgPSBudWxsOworCQkJcmV0dXJuIGVudHJ5UmV0dXJuOworCQl9CisKKwkJd2hpbGUobmV4dEVudHJ5ID4gMCkgeworCQkJbG9uZyByZXQgPSBpbi5za2lwKG5leHRFbnRyeSk7CisJCQlpZihyZXQgPCAwKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJlYXJseSBlbmQgb2Ygc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCW5leHRFbnRyeSAtPSByZXQ7CisJCQlieXRlc3JlYWQgKz0gcmV0OworCQl9CisKKwkJaW50IGJ5dGVzdG9yZWFkID0gNTEyOworCQl3aGlsZShieXRlc3RvcmVhZCA+IDApIHsKKwkJCWludCByZXQgPSBzdXBlci5yZWFkKGhlYWRlciwgNTEyIC0gYnl0ZXN0b3JlYWQsIGJ5dGVzdG9yZWFkKTsKKwkJCWlmKCByZXQgPCAwICkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiZWFybHkgZW5kIG9mIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlieXRlc3RvcmVhZCAtPSByZXQ7CisJCQlieXRlc3JlYWQgKz0gcmV0OworCQl9CisKKwkJLy8gSWYgd2UgaGF2ZSBhIGhlYWRlciBvZiBhbGwgemVyb3MsIHRoaXMgbWFya3MgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkJaWYoaGVhZGVyQ2hlY2tzdW0oaGVhZGVyKSA9PSAwKSB7CisJCQkvLyBXZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkJCWlmKGZpbGVwb3MgPiAwKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQkKKwkJCS8vIEludmFsaWQgc3RyZWFtLgorCQkJdGhyb3cgbmV3IFRhckV4Y2VwdGlvbigibm90IGluIHRhciBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQkvLyBWYWxpZGF0ZSBjaGVja3N1bS4KKwkJaWYoIWlzVmFsaWRUYXJIZWFkZXIoaGVhZGVyKSkgeworCQkJdGhyb3cgbmV3IFRhckV4Y2VwdGlvbigibm90IGluIHRhciBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJd2hpbGUgKHBvcyA8IDEwMCAmJiBoZWFkZXJbcG9zXSAhPSAwKSB7CisJCQlwb3MrKzsKKwkJfQorCQlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcoaGVhZGVyLCAwLCBwb3MsICJVVEY4Iik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gUHJlcGVuZCB0aGUgcHJlZml4IGhlcmUuCisJCXBvcyA9IDM0NTsKKwkJaWYoaGVhZGVyW3Bvc10gIT0gMCkgeworCQkJd2hpbGUgKHBvcyA8IDUwMCAmJiBoZWFkZXJbcG9zXSAhPSAwKSB7CisJCQkJcG9zKys7CisJCQl9CisJCQlTdHJpbmcgcHJlZml4ID0gbmV3IFN0cmluZyhoZWFkZXIsIDM0NSwgcG9zIC0gMzQ1LCAiVVRGOCIpOyAvLyROT04tTkxTLTEkCisJCQluYW1lID0gcHJlZml4ICsgIi8iICsgbmFtZTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQlUYXJFbnRyeSBlbnRyeTsKKwkJaWYobG9uZ0xpbmtOYW1lICE9IG51bGwpIHsKKwkJCWVudHJ5ID0gbmV3IFRhckVudHJ5KGxvbmdMaW5rTmFtZSwgZmlsZXBvcyk7CisJCQlsb25nTGlua05hbWUgPSBudWxsOworCQl9IGVsc2UgeworCQkJZW50cnkgPSBuZXcgVGFyRW50cnkobmFtZSwgZmlsZXBvcyk7CisJCX0KKwkJaWYoaGVhZGVyWzE1Nl0gIT0gMCkgeworCQkJZW50cnkuc2V0RmlsZVR5cGUoaGVhZGVyWzE1Nl0pOworCQl9CisJCQorCQlwb3MgPSAxMDA7CisJCVN0cmluZ0J1ZmZlciBtb2RlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmKGhlYWRlcltwb3MgKyBpXSA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZihoZWFkZXJbcG9zICsgaV0gPT0gJyAnKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQltb2RlLmFwcGVuZCgoY2hhcikgaGVhZGVyW3BvcyArIGldKTsKKwkJfQorCQlpZihtb2RlLmxlbmd0aCgpID4gMCAmJiBtb2RlLmNoYXJBdCgwKSAhPSAnMCcpIHsKKwkJCW1vZGUuaW5zZXJ0KDAsICcwJyk7CisJCX0KKwkJdHJ5IHsKKwkJCWxvbmcgZmlsZU1vZGUgPSBMb25nLmRlY29kZShtb2RlLnRvU3RyaW5nKCkpLmxvbmdWYWx1ZSgpOworCQkJZW50cnkuc2V0TW9kZShmaWxlTW9kZSk7CisJCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeyAvLyBUT0RPCisJCQl0aHJvdyBuZXcgVGFyRXhjZXB0aW9uKCJUYXJJbXBvcnRfaW52YWxpZF90YXJfZm9ybWF0IiArIG5mZSk7CisJCX0KKwkJCisJCXBvcyA9IDEwMCArIDI0OworCQlTdHJpbmdCdWZmZXIgc2l6ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQkJaWYoaGVhZGVyW3BvcyArIGldID09IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmKGhlYWRlcltwb3MgKyBpXSA9PSAnICcpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNpemUuYXBwZW5kKChjaGFyKSBoZWFkZXJbcG9zICsgaV0pOworCQl9CisJCWlmKHNpemUuY2hhckF0KDApICE9ICcwJykgeworCQkJc2l6ZS5pbnNlcnQoMCwgJzAnKTsKKwkJfQorCQlpbnQgZmlsZVNpemU7CisJCXRyeSB7CisJCQlmaWxlU2l6ZSA9IEludGVnZXIuZGVjb2RlKHNpemUudG9TdHJpbmcoKSkuaW50VmFsdWUoKTsKKwkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7IC8vIFRPRE8KKwkJCXRocm93IG5ldyBUYXJFeGNlcHRpb24oIkRhdGFUcmFuc2Zlck1lc3NhZ2VzLlRhckltcG9ydF9pbnZhbGlkX3Rhcl9mb3JtYXQiICsgbmZlKTsKKwkJfQorCisJCWVudHJ5LnNldFNpemUoZmlsZVNpemUpOworCQluZXh0RU9GID0gZmlsZVNpemU7CisJCWlmKGZpbGVTaXplICUgNTEyID4gMCkgeworCQkJbmV4dEVudHJ5ID0gZmlsZVNpemUgKyAoNTEyIC0gKGZpbGVTaXplICUgNTEyKSk7CisJCX0gZWxzZSB7CisJCQluZXh0RW50cnkgPSBmaWxlU2l6ZTsKKwkJfQorCQlmaWxlcG9zICs9IChuZXh0RW50cnkgKyA1MTIpOworCQlyZXR1cm4gZW50cnk7CisJfQorCisJLyoqCisJICogTW92ZXMgYWhlYWQgdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUgdGFyIGFyY2hpdmUgYW5kIHJldHVybnMKKwkgKiBhIFRhckVudHJ5IG9iamVjdCBkZXNjcmliaW5nIGl0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5leHQgZW50cnkgaW4gdGhlIHRhciBmaWxlCisJICogQHRocm93cyBUYXJFeGNlcHRpb24KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIFRhckVudHJ5IGdldE5leHRFbnRyeSgpIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJVGFyRW50cnkgZW50cnkgPSBnZXROZXh0RW50cnlJbnRlcm5hbCgpOworCisJCWlmKGVudHJ5ICE9IG51bGwgJiYgZW50cnkuZ2V0TmFtZSgpLmVxdWFscygiLi8uL0BMb25nTGluayIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uIGZvciBkb2luZyBsb25nIGZpbGVuYW1lcy4KKwkJCS8vIFdlIGdldCBhIGZpbGUgY2FsbGVkIC4vLi9ATG9uZ0xpbmsgd2hpY2gganVzdCBjb250YWlucworCQkJLy8gdGhlIHJlYWwgcGF0aG5hbWUuCisJCQlieXRlW10gbG9uZ05hbWVEYXRhID0gbmV3IGJ5dGVbKGludCkgZW50cnkuZ2V0U2l6ZSgpXTsKKwkJCWludCBieXRlc3JlYWQyID0gMDsKKwkJCXdoaWxlIChieXRlc3JlYWQyIDwgbG9uZ05hbWVEYXRhLmxlbmd0aCkgeworCQkJCWludCBjdXIgPSByZWFkKGxvbmdOYW1lRGF0YSwgYnl0ZXNyZWFkMiwgbG9uZ05hbWVEYXRhLmxlbmd0aCAtIGJ5dGVzcmVhZCk7CisJCQkJaWYgKGN1ciA8IDApIHsKKwkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJlYXJseSBlbmQgb2Ygc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJYnl0ZXNyZWFkMiArPSBjdXI7CisJCQl9CisKKwkJCWludCBwb3MgPSAwOworCQkJd2hpbGUgKHBvcyA8IGxvbmdOYW1lRGF0YS5sZW5ndGggJiYgbG9uZ05hbWVEYXRhW3Bvc10gIT0gMCkgeworCQkJCXBvcysrOworCQkJfQorCQkJbG9uZ0xpbmtOYW1lID0gbmV3IFN0cmluZyhsb25nTmFtZURhdGEsIDAsIHBvcywgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIGdldE5leHRFbnRyeUludGVybmFsKCk7CisJCX0KKwkJcmV0dXJuIGVudHJ5OworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQorCSAqLworCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYobmV4dEVPRiA9PSAwKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYobGVuID4gbmV4dEVPRikgeworCQkJbGVuID0gbmV4dEVPRjsKKwkJfQorCQlpbnQgc2l6ZSA9IHN1cGVyLnJlYWQoYiwgb2ZmLCBsZW4pOworCQluZXh0RW50cnkgLT0gc2l6ZTsKKwkJbmV4dEVPRiAtPSBzaXplOworCQlieXRlc3JlYWQgKz0gc2l6ZTsKKwkJcmV0dXJuIHNpemU7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNyZWFkKCkKKwkgKi8KKwlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlieXRlW10gZGF0YSA9IG5ldyBieXRlWzFdOworCQlpbnQgc2l6ZSA9IHJlYWQoZGF0YSwgMCwgMSk7CisJCWlmIChzaXplIDwgMCkgeworCQkJcmV0dXJuIHNpemU7CisJCX0KKwkJcmV0dXJuIGRhdGFbMF07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVSZXNvdXJjZURlbHRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlUmVzb3VyY2VEZWx0YS5qYXZhCmluZGV4IDRlMGZhMWYuLjQ3NDUwODAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVSZXNvdXJjZURlbHRhLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZVJlc291cmNlRGVsdGEuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC05NSw2NyArOTUsNCBAQAogCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlI2dldE1vZHVsZVJlbGF0aXZlUGF0aCgpCiAJICovCiAJcHVibGljIElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpOwotCQotCS8qKgotCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBkZXNjZW5kZW50IGRlbHRhIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHBhdGggaW4KLQkgKiB0aGlzIGRlbHRhLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGRlc2NlbmRlbnQgZXhpc3RzLgotCSAqIFRoZSBzdXBwbGllZCBwYXRoIG1heSBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZTsgaW4gZWl0aGVyIGNhc2UsIGl0IGlzCi0JICogaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhpcyBkZWx0YS4gICBUcmFpbGluZyBzZXBhcmF0b3JzIGFyZSBpZ25vcmVkLgotCSAqIElmIHRoZSBwYXRoIGlzIGVtcHR5IHRoaXMgZGVsdGEgaXMgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBhdm9pZCBtYW51YWwgdHJhdmVyc2FsIG9mIHRoZSBkZWx0YQotCSAqIHRyZWUgaW4gY2FzZXMgd2hlcmUgdGhlIGxpc3RlbmVyIGlzIG9ubHkgaW50ZXJlc3RlZCBpbiBjaGFuZ2VzIHRvCi0JICogcGFydGljdWxhciByZXNvdXJjZXMuICBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhbGx5IGJlCi0JICogZmFzdGVyIHRoYW4gbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgZGVsdGEgdG8gYSBwYXJ0aWN1bGFyIGRlc2NlbmRlbnQuCi0JICogPC9wPgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBkZXNpcmVkIGRlc2NlbmRlbnQgZGVsdGEKLQkgKiBAcmV0dXJuIHRoZSBkZXNjZW5kZW50IGRlbHRhLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogCQlkZXNjZW5kZW50IGV4aXN0cyBpbiB0aGUgZGVsdGEKLQkgKiBAcGxhbm5lZGZvciAyLjAKLQkgKi8KLQkvL3B1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YSBmaW5kTWVtYmVyKElQYXRoIHBhdGgpOwotCQotCS8qKgotCSAqIFJldHVybnMgcmVzb3VyY2UgZGVsdGFzIGZvciBhbGwgY2hpbGRyZW4gb2YgdGhpcyByZXNvdXJjZSAKLQkgKiB3aG9zZSBraW5kIGlzIGluY2x1ZGVkIGluIHRoZSBnaXZlbiBtYXNrLiBLaW5kIG1hc2tzIGFyZSBmb3JtZWQKLQkgKiBieSB0aGUgYml0d2lzZSBvciBvZiA8Y29kZT5JUmVzb3VyY2VEZWx0YTwvY29kZT4ga2luZCBjb25zdGFudHMuCi0JICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm8gYWZmZWN0ZWQgY2hpbGRyZW4uCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgZnVsbHkgZXF1aXZhbGVudCB0bzoKLQkgKiA8cHJlPgotCSAqICAgZ2V0QWZmZWN0ZWRDaGlsZHJlbihraW5kTWFzaywgSVJlc291cmNlLk5PTkUpOwotCSAqIDwvcHJlPgotCSAqIFRlYW0tcHJpdmF0ZSBtZW1iZXIgcmVzb3VyY2VzIGFyZSA8Yj5ub3Q8L2I+IGluY2x1ZGVkIGluIHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGtpbmRNYXNrIGEgbWFzayBmb3JtZWQgYnkgdGhlIGJpdHdpc2Ugb3Igb2YgPGNvZGU+SVJlc291cmNlRGVsdGEgPC9jb2RlPiAKLQkgKiAgICBkZWx0YSBraW5kIGNvbnN0YW50cwotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIGRlbHRhcyBmb3IgYWxsIGFmZmVjdGVkIGNoaWxkcmVuCi0JICogQHNlZSBJUmVzb3VyY2VEZWx0YSNBRERFRAotCSAqIEBzZWUgSVJlc291cmNlRGVsdGEjUkVNT1ZFRAotCSAqIEBzZWUgSVJlc291cmNlRGVsdGEjQ0hBTkdFRAotCSAqIEBzZWUgI2dldEFmZmVjdGVkQ2hpbGRyZW4oaW50KQotCSAqLwotCS8vcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0QWZmZWN0ZWRDaGlsZHJlbihpbnQga2luZE1hc2spOwotCQotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3IuCi0JICogVGhlIG9ubHkga2luZHMgb2YgcmVzb3VyY2UgZGVsdGFzIHZpc2l0ZWQgCi0JICogYXJlIDxjb2RlPkFEREVEPC9jb2RlPiwgPGNvZGU+UkVNT1ZFRDwvY29kZT4sIAotCSAqIGFuZCA8Y29kZT5DSEFOR0VEPC9jb2RlPi4KLQkgKiBUaGUgdmlzaXRvcidzIDxjb2RlPnZpc2l0PC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhpcwotCSAqIHJlc291cmNlIGRlbHRhIGlmIGFwcGxpY2FibGUuIElmIHRoZSB2aXNpdG9yIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogdGhlIHJlc291cmNlIGRlbHRhJ3MgY2hpbGRyZW4gYXJlIGFsc28gdmlzaXRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBmdWxseSBlcXVpdmFsZW50IHRvIAotCSAqIDxjb2RlPmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuTk9ORSk8L2NvZGU+LgotCSAqIEFsdGhvdWdoIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZCBmb3IgdGhpcyByZXNvdXJjZSBkZWx0YSwgaXQgd2lsbCBub3QgYmUKLQkgKiBpbnZva2VkIGZvciBhbnkgdGVhbS1wcml2YXRlIG1lbWJlciByZXNvdXJjZXMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlIHZpc2l0b3IgZmFpbGVkIHdpdGggdGhpcyBleGNlcHRpb24uCi0JICogQHNlZSBJUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQoSVJlc291cmNlRGVsdGEpCi0JICovCi0JLy9wdWJsaWMgdm9pZCBhY2NlcHQoSU1vZHVsZVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKaW5kZXggZjM0ZThkNS4uZmMwZWE4YyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKQEAgLTE2Miw3ICsxNjIsNyBAQAogCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7CiAJCUlNb2R1bGVbXSBtb2R1bGVzID0gZ2V0TW9kdWxlcygpOwogCQlpZiAocHJvamVjdCAhPSBudWxsICYmIG1vZHVsZXMgIT0gbnVsbCkgewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChtb2R1bGVzLmxlbmd0aCk7CisJCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KG1vZHVsZXMubGVuZ3RoKTsKIAkJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogCQkJCWlmIChwcm9qZWN0LmVxdWFscyhtb2R1bGVzW2ldLmdldFByb2plY3QoKSkpCkBAIC0yMDAsNyArMjAwLDcgQEAKIAkJCXJldHVybiBudWxsOwogCQkKIAkJSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXRNb2R1bGVzKCk7Ci0JCWlmIChpZCAhPSBudWxsICYmIG1vZHVsZXMgIT0gbnVsbCkgeworCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7CiAJCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKIAkJCQlTdHJpbmcgaWQyID0gbW9kdWxlc1tpXS5nZXRJZCgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaE9wZXJhdGlvbi5qYXZhCmluZGV4IDI5MjJmNjIuLjFiNDVkZjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hPcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoT3BlcmF0aW9uLmphdmEKQEAgLTEyMiwxMiArMTIyLDEzIEBACiAJICogUmV0dXJuIHRoZSB0YXNrIG1vZGVsLgogCSAqIDxwPgogCSAqIEEgdGFzayBtb2RlbCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3ZlcmFsbCB0YXNrIGZsb3cgYW5kIGFsbG93cwotCSAqIHRhc2tzIHRvIHN0b3JlIGFuZCByZXRyZWl2ZSBkYXRhLiBJdHMgdXNhZ2UgYWxsb3dzIG11dGxpcGxlIHRhc2tzIHRvIGJlCisJICogdGFza3MgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgdGFza3MgdG8gYmUKIAkgKiBjaGFpbmVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBkYXRhIGZyb20gdGhlIG91dHB1dCBvZiBvbmUgdGFzayB0byB0aGUgaW5wdXQKIAkgKiBvZiBhbm90aGVyLgogCSAqIDwvcD4KIAkgKiAKIAkgKiBAcmV0dXJuIHRoZSB0YXNrIG1vZGVsCisJICogQHNlZSAjc2V0VGFza01vZGVsKFRhc2tNb2RlbCkKIAkgKi8KIAlwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKIAkJcmV0dXJuIG1vZGVsOwpAQCAtMTM3LDEyICsxMzgsMTMgQEAKIAkgKiBTZXQgdGhlIHRhc2sgbW9kZWwuCiAJICogPHA+CiAJICogQSB0YXNrIG1vZGVsIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIHRhc2sgZmxvdyBhbmQgYWxsb3dzCi0JICogdGFza3MgdG8gc3RvcmUgYW5kIHJldHJlaXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXV0bGlwbGUgdGFza3MgdG8gYmUKKwkgKiB0YXNrcyB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdWx0aXBsZSB0YXNrcyB0byBiZQogCSAqIGNoYWluZWQgdG9nZXRoZXIgYW5kIHNoYXJlIGRhdGEgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSB0YXNrIHRvIHRoZSBpbnB1dAogCSAqIG9mIGFub3RoZXIuCiAJICogPC9wPgogCSAqIAogCSAqIEBwYXJhbSB0YXNrTW9kZWwgdGhlIHRhc2sgbW9kZWwKKwkgKiBAc2VlICNnZXRUYXNrTW9kZWwoKQogCSAqLwogCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7CiAJCXRoaXMubW9kZWwgPSB0YXNrTW9kZWw7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaGVyRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2NjMzgwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaGVyRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7CisvKioKKyAqIEFuIG9wZXJhdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgZHVyaW5nIHB1Ymxpc2hpbmcuIAorICogPHA+CisgKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAorICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAorICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCisgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPC9wPgorICogQHBsYW5uZWRmb3IgMy4xCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQdWJsaXNoZXJEZWxlZ2F0ZSB7CisJcHJpdmF0ZSBUYXNrTW9kZWwgbW9kZWw7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgb3BlcmF0aW9uLiBUaGUgbGFiZWwgYW5kIGRlc2NyaXB0aW9uIG11c3QgYmUgc3VwcGxpZWQKKwkgKiBieSBvdmVycmlkaW5nIHRoZSBnZXRMYWJlbCgpIGFuZCBnZXREZXNjcmlwdGlvbigpIG1ldGhvZHMuCisJICovCisJcHVibGljIFB1Ymxpc2hlckRlbGVnYXRlKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSB0YXNrIG1vZGVsLgorCSAqIDxwPgorCSAqIEEgdGFzayBtb2RlbCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3ZlcmFsbCB0YXNrIGZsb3cgYW5kIGFsbG93cworCSAqIHRhc2tzIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBkYXRhLiBJdHMgdXNhZ2UgYWxsb3dzIG11bHRpcGxlIHRhc2tzIHRvIGJlCisJICogY2hhaW5lZCB0b2dldGhlciBhbmQgc2hhcmUgZGF0YSBmcm9tIHRoZSBvdXRwdXQgb2Ygb25lIHRhc2sgdG8gdGhlIGlucHV0CisJICogb2YgYW5vdGhlci4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgdGFzayBtb2RlbAorCSAqIEBzZWUgI3NldFRhc2tNb2RlbChUYXNrTW9kZWwpCisJICovCisJcHVibGljIFRhc2tNb2RlbCBnZXRUYXNrTW9kZWwoKSB7CisJCXJldHVybiBtb2RlbDsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIHRhc2sgbW9kZWwuCisJICogPHA+CisJICogQSB0YXNrIG1vZGVsIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIHRhc2sgZmxvdyBhbmQgYWxsb3dzCisJICogdGFza3MgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgdGFza3MgdG8gYmUKKwkgKiBjaGFpbmVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBkYXRhIGZyb20gdGhlIG91dHB1dCBvZiBvbmUgdGFzayB0byB0aGUgaW5wdXQKKwkgKiBvZiBhbm90aGVyLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gdGFza01vZGVsIHRoZSB0YXNrIG1vZGVsCisJICogQHNlZSAjZ2V0VGFza01vZGVsKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgeworCQl0aGlzLm1vZGVsID0gdGFza01vZGVsOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGUgKHBlcmZvcm0pIHRoZSBvcGVyYXRpb24uCisJICogCisJICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgcHVibGlzaCBiZWluZyByZXF1ZXN0ZWQuIFZhbGlkIHZhbHVlcyBhcmU6CisJICogICAgPHVsPgorCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0ZVTEw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBmdWxsIHB1Ymxpc2guPC9saT4KKwkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9JTkNSRU1FTlRBTDwvY29kZT4tIGluZGljYXRlcyBhIGluY3JlbWVudGFsIHB1Ymxpc2guCisJICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQ0xFQU48L2NvZGU+LSBpbmRpY2F0ZXMgYSBjbGVhbiByZXF1ZXN0LiBDbGVhbiB0aHJvd3MKKwkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKKwkgKiAgICAgIGZ1bGwgcHVibGlzaC4KKwkgKiAgICA8L3VsPgorCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcGFyYW0gaW5mbyB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQorCSAqICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKKwkgKiAgICB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKKwkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKKwkgKiAgICBmb3IgdGhlIFNoZWxsIGNsYXNzLgorCSAqIEByZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgd2hhdCAoaWYgYW55dGhpbmcpIHdlbnQgd3JvbmcKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGFzaworCSAqLworCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIGV4ZWN1dGUoaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9SdW50aW1lRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVEZWxlZ2F0ZS5qYXZhCmluZGV4IDNjYWM4ZjUuLmU5ODBiYjUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVEZWxlZ2F0ZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVEZWxlZ2F0ZS5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTI5LDEwICsxMjksMTAgQEAKIAlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKIAkJaWYgKHJ1bnRpbWUuZ2V0TmFtZSgpID09IG51bGwgfHwgcnVudGltZS5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkKIAkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUnVudGltZU5hbWUsIG51bGwpOwotCisJCQogCQlpZiAoaXNOYW1lSW5Vc2UoKSkKIAkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yRHVwbGljYXRlUnVudGltZU5hbWUsIG51bGwpOwotCQorCQkKIAkJSVBhdGggcGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKIAkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmlzRW1wdHkoKSkKIAkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQogCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIExpc3QpCiAJICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTGlzdCBkZWZhdWx0VmFsdWUpIHsKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBMaXN0PFN0cmluZz4gZGVmYXVsdFZhbHVlKSB7CiAJCXJldHVybiBydW50aW1lLmdldEF0dHJpYnV0ZShpZCwgZGVmYXVsdFZhbHVlKTsKIAl9CiAKQEAgLTI5Myw3ICsyOTMsNyBAQAogCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKIAkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBMaXN0KQogCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIExpc3QgdmFsdWUpIHsKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBMaXN0PFN0cmluZz4gdmFsdWUpIHsKIAkJcnVudGltZVdDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwogCX0KIApAQCAtMzA4LDQgKzMwOCw0IEBACiAJcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTWFwIHZhbHVlKSB7CiAJCXJ1bnRpbWVXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckJlaGF2aW91ckRlbGVnYXRlLmphdmEKaW5kZXggNWI1NDY4NS4uMWE4MjJlZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDE1ICsxNSwxMyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLkV4dGVybmFsTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHJvZ3Jlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC4qOwogLyoqCiAgKiBBIHNlcnZlciBkZWxlZ2F0ZSBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMgCiAgKiBnZW5lcmljIGFuZCBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHR5cGUgb2Ygc2VydmVyLgpAQCAtNDYsOCArNDQsOCBAQAogICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgogICogPC9wPgogICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHkKKyAqIEBzZWUgSVNlcnZlcgorICogQHNlZSBJU2VydmVyV29ya2luZ0NvcHkKICAqIEBzaW5jZSAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIHsKQEAgLTE1Myw3ICsxNTEsNyBAQAogCSAqIGl0IGNoYW5nZXMuCiAJICogCiAJICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgaXMgcnVubmluZywgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cwotCSAqICAgIGRlZmluZWQgYnkge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9CisJICogICAgZGVmaW5lZCBieSB7QGxpbmsgSUxhdW5jaE1hbmFnZXJ9CiAJICovCiAJcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TW9kZShTdHJpbmcgbW9kZSkgewogCQlzZXJ2ZXIuc2V0TW9kZShtb2RlKTsKQEAgLTI0MSw3ICsyMzksNyBAQAogCS8qKgogCSAqIERpc3Bvc2VzIG9mIHRoaXMgc2VydmVyIGRlbGVnYXRlLgogCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KIAkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgogCSAqIDwvcD4KIAkgKiA8cD4KQEAgLTM3OSw0MCArMzc3LDE0NyBAQAogCX0KIAogCS8qKgotCSAqIFJlc3RhcnQgdGhpcyBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgc2hvdWxkIHVzZSB0aGUgc2VydmVyCi0JICogbGlzdGVuZXIgdG8gbm90aWZ5IHByb2dyZXNzLiBJdCBtdXN0IHVzZSB0aGUgc2FtZSBkZWJ1ZwotCSAqIGZsYWdzIGFzIHdhcyBvcmlnaW5hbGx5IHBhc3NlZCBpbnRvIHRoZSBzdGFydCgpIG1ldGhvZC4KKwkgKiBSZXN0YXJ0IHRoaXMgc2VydmVyIHVzaW5nIGEgbW9yZSBvcHRpbWl6ZWQgYmVoYXZpb3IgdGhhbiBhIGZ1bGwgc3RvcAorCSAqIGFuZCBzdGFydC4gVGhlIHNlcnZlciBzaG91bGQgdXNlIHRoZSBzZXJ2ZXIgbGlzdGVuZXIgdG8gbm90aWZ5IHByb2dyZXNzLgogCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaWYgdGhlcmUgaXMgYSBxdWljay9iZXR0ZXIgd2F5IHRvIHJlc3RhcnQKLQkgKiB0aGUgc2VydmVyLiBJZiBpdCB0aHJvd3MgYSBDb3JlRXhjZXB0aW9uLCB0aGUgbm9ybWFsIHN0b3Avc3RhcnQKLQkgKiBhY3Rpb25zIHdpbGwgYmUgdXNlZC4KKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGZpbmQgb3V0IGlmIHRoZXJlIGlzIGFuIG9wdGltaXplZCBwYXRoIHRvIHJlc3RhcnQKKwkgKiB0aGUgc2VydmVyIHRoYXQncyBiZXR0ZXIgdGhhbiBhIGZ1bGwgc3RvcCBhbmQgc3RhcnQgKGxhdW5jaCkuIElmIHRoaXMKKwkgKiBtZXRob2QgdGhyb3dzIGEgQ29yZUV4Y2VwdGlvbiB3aXRoIGEgc3RhdHVzIGNvZGUgb2YgLTEsIGl0IGlzIGEgc2lnbgorCSAqIHRoYXQgZWl0aGVyIHRoZXJlIGlzIG5vIG9wdGltaXplZCBwYXRoLCBvciB0aGF0IHRoZSBwYXRoIGhhcyBmYWlsZWQsCisJICogYW5kIGluIGVpdGhlciBjYXNlIHRoZSBmcmFtZXdvcmsgd2lsbCB1c2UgdGhlIHJlZ3VsYXIgc3RvcC9zdGFydAorCSAqIGJlaGF2aW9yLgogCSAqIAogCSAqIEBwYXJhbSBsYXVuY2hNb2RlIHRoZSBtb2RlIHRvIHJlc3RhcnQgaW4sIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMKLQkgKiAgICBkZWZpbmVkIGJ5IHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQorCSAqICAgIGRlZmluZWQgYnkge0BsaW5rIElMYXVuY2hNYW5hZ2VyfQogCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlc3RhcnRpbmcKIAkgKi8KIAlwdWJsaWMgdm9pZCByZXN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCSB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICJDb3VsZCBub3QgcmVzdGFydCIsIG51bGwpKTsKKwkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIC0xLCAiUmVzdGFydCBub3Qgc3VwcG9ydGVkIiwgbnVsbCkpOwogCX0KIAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZSByZXN0YXJ0ZWQuCiAJICogPHA+Ci0JICogW2lzc3VlOiBJdCdzIHVuY2xlYXIgd2hldGhlciB0aGlzIG9wZXJhdGlvbnMgaXMgZ3VhcmFudGVlZCB0byBiZSBmYXN0Ci0JICogb3Igd2hldGhlciBpdCBjb3VsZCBpbnZvbHZlIGNvbW11bmljYXRpb24gd2l0aCBhbnkgYWN0dWFsCi0JICogc2VydmVyLiBJZiBpdCBpcyBub3QgZmFzdCwgdGhlIG1ldGhvZCBzaG91bGQgdGFrZSBhIHByb2dyZXNzCi0JICogbW9uaXRvci5dCisJICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KKwkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKKwkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCisJICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBpbiB0aGUgeHhNb2R1bGUgbWV0aG9kcy4KIAkgKiA8L3A+CiAJICogCiAJICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZQotCSAqIHJlc3RhcnRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UgCisJICogICAgcmVzdGFydGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZSAKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBjYW5Db250cm9sTW9kdWxlKElNb2R1bGVbXSBtb2R1bGUpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCisJICogYmUgc3RhcnRlZCBpbiB0aGUgZ2l2ZW4gbW9kZS4KKwkgKiA8cD4KKwkgKiBUaGlzIGNhbGwgc2hvdWxkIGNvbXBsZXRlIHJlYXNvbmFibHkgZmFzdCBhbmQgbm90IHJlcXVpcmUgY29tbXVuaWNhdGlvbgorCSAqIHdpdGggdGhlIChwb3RlbnRpYWxseSByZW1vdGUpIHNlcnZlci4gSWYgY29tbXVuaWNhdGlvbiBpcyByZXF1aXJlZCBpdAorCSAqIHNob3VsZCBiZSBkb25lIGFzeW5jaHJvbm91c2x5IGFuZCB0aGlzIG1ldGhvZCBzaG91bGQgZWl0aGVyIGZhaWwgdW50aWwKKwkgKiB0aGF0IGlzIGNvbXBsZXRlIG9yIHN1Y2NlZWQgYW5kIGhhbmRsZSBmYWlsdXJlIGR1cmluZyBzdGFydC4KKwkgKiA8L3A+PHA+CisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCisJICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIuY2FuU3RhcnQoKTwvY29kZT4uCisJICogVGhlIGZyYW1ld29yayBoYXMgYWxyZWFkeSBmaWx0ZXJlZCBvdXQgb2J2aW91c2x5IGludmFsaWQgc2l0dWF0aW9ucywKKwkgKiBzdWNoIGFzIHN0YXJ0aW5nIGEgc2VydmVyIHRoYXQgaXMgYWxyZWFkeSBydW5uaW5nLgorCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCisJICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5CisJICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9CisJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgY2FuCisJICogICAgYmUgc3RhcnRlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeSBpdCBjYW4ndAorICAgICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBJU3RhdHVzIGNhblN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlKSB7CisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCisJICogYmUgcmVzdGFydGVkIGluIHRoZSBnaXZlbiBtb2RlLiBOb3RlIHRoYXQgb25seSBzZXJ2ZXJzCisJICogdGhhdCBhcmUgY3VycmVudGx5IHJ1bm5pbmcgY2FuIGJlIHJlc3RhcnRlZC4KKwkgKiA8cD4KKwkgKiBUaGlzIGNhbGwgc2hvdWxkIGNvbXBsZXRlIHJlYXNvbmFibHkgZmFzdCBhbmQgbm90IHJlcXVpcmUgY29tbXVuaWNhdGlvbgorCSAqIHdpdGggdGhlIChwb3RlbnRpYWxseSByZW1vdGUpIHNlcnZlci4gSWYgY29tbXVuaWNhdGlvbiBpcyByZXF1aXJlZCBpdAorCSAqIHNob3VsZCBiZSBkb25lIGFzeW5jaHJvbm91c2x5IGFuZCB0aGlzIG1ldGhvZCBzaG91bGQgZWl0aGVyIGZhaWwgdW50aWwKKwkgKiB0aGF0IGlzIGNvbXBsZXRlIG9yIHN1Y2NlZWQgYW5kIGhhbmRsZSBmYWlsdXJlIGR1cmluZyByZXN0YXJ0LgorCSAqIDwvcD48cD4KKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKKwkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5jYW5SZXN0YXJ0KCk8L2NvZGU+LgorCSAqIFRoZSBmcmFtZXdvcmsgaGFzIGFscmVhZHkgZmlsdGVyZWQgb3V0IG9idmlvdXNseSBpbnZhbGlkIHNpdHVhdGlvbnMsCisJICogc3VjaCBhcyByZXN0YXJ0aW5nIGEgc3RvcHBlZCBzZXJ2ZXIuCisJICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKKwkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKKwkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KKwkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHNlcnZlciBjYW4KKwkgKiAgICBiZSByZXN0YXJ0ZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkgaXQgY2FuJ3QKKyAgICAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgSVN0YXR1cyBjYW5SZXN0YXJ0KFN0cmluZyBtb2RlKSB7CisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCisJICogYmUgc3RvcHBlZC4KKwkgKiBTZXJ2ZXJzIGNhbiBiZSBzdG9wcGVkIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHN0b3BwZWQgYW5kIGlmCisJICogdGhleSBiZWxvbmcgdG8gYSBzdGF0ZS1zZXQgdGhhdCBjYW4gYmUgc3RvcHBlZC4KKwkgKiA8cD4KKwkgKiBUaGlzIGNhbGwgc2hvdWxkIGNvbXBsZXRlIHJlYXNvbmFibHkgZmFzdCBhbmQgbm90IHJlcXVpcmUgY29tbXVuaWNhdGlvbgorCSAqIHdpdGggdGhlIChwb3RlbnRpYWxseSByZW1vdGUpIHNlcnZlci4gSWYgY29tbXVuaWNhdGlvbiBpcyByZXF1aXJlZCBpdAorCSAqIHNob3VsZCBiZSBkb25lIGFzeW5jaHJvbm91c2x5IGFuZCB0aGlzIG1ldGhvZCBzaG91bGQgZWl0aGVyIGZhaWwgdW50aWwKKwkgKiB0aGF0IGlzIGNvbXBsZXRlIG9yIHN1Y2NlZWQgYW5kIGhhbmRsZSBmYWlsdXJlIGR1cmluZyBzdG9wLgorCSAqIDwvcD48cD4KKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKKwkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5jYW5TdG9wKCk8L2NvZGU+LgorCSAqIFRoZSBmcmFtZXdvcmsgaGFzIGFscmVhZHkgZmlsdGVyZWQgb3V0IG9idmlvdXNseSBpbnZhbGlkIHNpdHVhdGlvbnMsCisJICogc3VjaCBhcyBzdG9wcGluZyBhIHNlcnZlciB0aGF0IGlzIGFscmVhZHkgc3RvcHBlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHNlcnZlciBjYW4KKwkgKiAgIGJlIHN0b3BwZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkgaXQgY2FuJ3QKKyAgICAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgSVN0YXR1cyBjYW5TdG9wKCkgeworCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgorCSAqIGJlIHB1Ymxpc2hlZCB0by4KKwkgKiA8cD4KKwkgKiBUaGlzIGNhbGwgc2hvdWxkIGNvbXBsZXRlIHJlYXNvbmFibHkgZmFzdCBhbmQgbm90IHJlcXVpcmUgY29tbXVuaWNhdGlvbgorCSAqIHdpdGggdGhlIChwb3RlbnRpYWxseSByZW1vdGUpIHNlcnZlci4gSWYgY29tbXVuaWNhdGlvbiBpcyByZXF1aXJlZCBpdAorCSAqIHNob3VsZCBiZSBkb25lIGFzeW5jaHJvbm91c2x5IGFuZCB0aGlzIG1ldGhvZCBzaG91bGQgZWl0aGVyIGZhaWwgdW50aWwKKwkgKiB0aGF0IGlzIGNvbXBsZXRlIG9yIHN1Y2NlZWQgYW5kIGhhbmRsZSBmYWlsdXJlIGR1cmluZyBwdWJsaXNoLgorCSAqIDwvcD48cD4KKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKKwkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5jYW5QdWJsaXNoKCk8L2NvZGU+LgorCSAqIFRoZSBmcmFtZXdvcmsgaGFzIGFscmVhZHkgZmlsdGVyZWQgb3V0IG9idmlvdXNseSBpbnZhbGlkIHNpdHVhdGlvbnMsCisJICogc3VjaCBhcyBwdWJsaXNoaW5nIHRvIGEgc2VydmVyIGluIHRoZSB3cm9uZyBtb2RlLgorCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgc2VydmVyIGNhbgorCSAqICAgYmUgcHVibGlzaGVkIHRvLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZworICAgICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBJU3RhdHVzIGNhblB1Ymxpc2goKSB7CisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KKworCS8qKgogCSAqIFN0YXJ0cyB0aGUgZ2l2ZW4gbW9kdWxlIG9uIHRoZSBzZXJ2ZXIuIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBvZiAKIAkgKiB7QGxpbmsgSVNlcnZlciNzdGFydE1vZHVsZShJTW9kdWxlW10sIElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKX0KIAkgKiBmb3IgZnVydGhlciBkZXRhaWxzLiAKQEAgLTQyNSw3ICs1MzAsNyBAQAogCSAqIHRoZSBzZXJ2ZXIuCiAJICogPC9wPgogCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgdGhpcyBtZXRob2QgaXMgYXNjeW5jaHJvbm91cywgaXMgdGhlcmUKKwkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cywgaXMgdGhlcmUKIAkgKiBhbnkgbmVlZCBmb3IgdGhlIHByb2dyZXNzIG1vbml0b3I/XQogCSAqIDwvcD4KIAkgKiAKQEAgLTQ1MSw3ICs1NTYsNyBAQAogCSAqIHRoZSBzZXJ2ZXIuCiAJICogPC9wPgogCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgdGhpcyBtZXRob2QgaXMgYXNjeW5jaHJvbm91cywgaXMgdGhlcmUKKwkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cywgaXMgdGhlcmUKIAkgKiBhbnkgbmVlZCBmb3IgdGhlIHByb2dyZXNzIG1vbml0b3I/XQogCSAqIDwvcD4KIAkgKiAKQEAgLTQ3Nyw3ICs1ODIsNyBAQAogCSAqIHRoZSBzZXJ2ZXIuCiAJICogPC9wPgogCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgdGhpcyBtZXRob2QgaXMgYXNjeW5jaHJvbm91cywgaXMgdGhlcmUKKwkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cywgaXMgdGhlcmUKIAkgKiBhbnkgbmVlZCBmb3IgdGhlIHByb2dyZXNzIG1vbml0b3I/XQogCSAqIDwvcD4KIAkgKiAKQEAgLTUwMiw3ICs2MDcsNyBAQAogCSAqIDxwPgogCSAqIFtpc3N1ZTogVGhlcmUgaXMgbm8gd2F5IHRvIGNvbW11bmljYXRlIGZhaWx1cmUgdG8gdGhlCiAJICogY2xpZW50LiBHaXZlbiB0aGF0IHRoaXMgb3BlcmF0aW9uIGNhbiBnbyBhd3J5LCB0aGVyZSBwcm9iYWJseQotCSAqIHNob3VsZCBiZSBhIG1lY2hhbmlzbSB0aGF0IGFsbG93cyBmYWlsaW5nIGFzeW5jaCBvcGVyYXRpb25zCisJICogc2hvdWxkIGJlIGEgbWVjaGFuaXNtIHRoYXQgYWxsb3dzIGZhaWxpbmcgYXN5bmMgb3BlcmF0aW9ucwogCSAqIHRvIGJlIGRpYWdub3NlZC5dCiAJICogPC9wPgogCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgpAQCAtNTQ4LDcgKzY1Myw3IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB0aGUgcmVxdWVzdG9yIGNhbiB1c2UKKwkgKiBSZXR1cm5zIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHRoZSByZXF1ZXN0ZXIgY2FuIHVzZQogCSAqIHRocm91Z2hvdXQgaXQncyBsaWZlY3ljbGUuIFRoaXMgaXMgcHJpbWFyeSB0byBiZSB1c2VkIGJ5CiAJICogc2VydmVycyBmb3Igd29ya2luZyBkaXJlY3Rvcmllcywgc2VydmVyIHNwZWNpZmljCiAJICogZmlsZXMsIGV0Yy4KQEAgLTU5MSw2ICs2OTYsMTA5IEBACiAJICogUHVibGlzaCB0byB0aGUgc2VydmVyLgogCSAqIAogCSAqIEBwYXJhbSBraW5kIHRoZSBwdWJsaXNoIGtpbmQKKwkgKiBAcGFyYW0gbW9kdWxlcworCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcGFyYW0gaW5mbworCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHB1Ymxpc2goaW50IGtpbmQsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpbmZvMiA9IGluZm87CisJCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaChraW5kLCBtb25pdG9yKTsKKwkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0sgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5DQU5DRUwpCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworCX0KKworCXByaXZhdGUgSUFkYXB0YWJsZSBpbmZvMjsKKworCS8qcHVibGljIHZvaWQgcHVibGlzaDIoaW50IGtpbmQsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItLT4tLSBQdWJsaXNoaW5nIHRvIHNlcnZlcjogIiArIHRvU3RyaW5nKCkgKyAiIC0tPi0tIik7CisJCQorCQlpZiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyVHlwZSgpLmhhc1J1bnRpbWUoKSAmJiBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoTm9SdW50aW1lLCBudWxsKSk7CisJCQorCQlmaW5hbCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlTGlzdCA9IGdldEFsbE1vZHVsZXMoKTsKKwkJYWRkUmVtb3ZlZE1vZHVsZXMobW9kdWxlTGlzdCwgbnVsbCk7CisJCQorCQlQdWJsaXNoT3BlcmF0aW9uW10gdGFza3MgPSBnZXRUYXNrcyhraW5kLCBtb2R1bGVMaXN0LCBudWxsKTsKKwkJaW50IHNpemUgPSAyMDAwICsgMzUwMCAqIG1vZHVsZUxpc3Quc2l6ZSgpICsgNTAwICogdGFza3MubGVuZ3RoOworCQkKKwkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOworCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChNZXNzYWdlcy5wdWJsaXNoaW5nLCBnZXRTZXJ2ZXIoKS5nZXROYW1lKCkpLCBzaXplKTsKKwkJCisJCU11bHRpU3RhdHVzIHRlbXBNdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7CisJCQorCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQlyZXR1cm47CisJCQorCQl0cnkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU3RhcnRpbmcgcHVibGlzaCIpOworCQkJcHVibGlzaFN0YXJ0KFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMDApKTsKKwkJCQorCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybjsKKwkJCQorCQkJLy8gZXhlY3V0ZSBwdWJsaXNoZXJzCisJCQlleGVjdXRlUHVibGlzaGVycyhraW5kLCBtb2R1bGVzLCBtb25pdG9yLCBpbmZvKTsKKwkJCQorCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybjsKKwkJCQorCQkJLy8gcHVibGlzaCB0aGUgc2VydmVyCisJCQlwdWJsaXNoU2VydmVyKGtpbmQsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMDApKTsKKwkJCQorCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybjsKKwkJCQorCQkJLy8gcHVibGlzaCBtb2R1bGVzCisJCQlJc3B1Ymxpc2hNb2R1bGVzKGtpbmQsIG1vZHVsZUxpc3QsIG1vbml0b3IpOworCQkJCisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuOworCQkJCisJCQltb25pdG9yLmRvbmUoKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuSU5GTywgIkNvcmVFeGNlcHRpb24gcHVibGlzaGluZyB0byAiICsgdG9TdHJpbmcoKSwgY2UpOworCQkJdGhyb3cgY2U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBwdWJsaXNoaW5nICB0byAiICsgdG9TdHJpbmcoKSwgZSk7CisJCQl0ZW1wTXVsdGkuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKSk7CisJCX0gZmluYWxseSB7CisJCQkvLyBlbmQgdGhlIHB1Ymxpc2hpbmcKKwkJCXRyeSB7CisJCQkJcHVibGlzaEZpbmlzaChQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA1MDApKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5JTkZPLCAiQ29yZUV4Y2VwdGlvbiBwdWJsaXNoaW5nIHRvICIgKyB0b1N0cmluZygpLCBjZSk7CisJCQkJdGVtcE11bHRpLmFkZChjZS5nZXRTdGF0dXMoKSk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN0b3BwaW5nIHB1Ymxpc2ggdG8gIiArIHRvU3RyaW5nKCksIGUpOworCQkJCXRlbXBNdWx0aS5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIGUpKTsKKwkJCX0KKwkJfQorCQkKKwkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLS08LS0gRG9uZSBwdWJsaXNoaW5nIC0tPC0tIik7CisJCQorCQlpZiAodGVtcE11bHRpLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDEpCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbih0ZW1wTXVsdGkuZ2V0Q2hpbGRyZW4oKVswXSk7CisJCQorCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG51bGw7CisJCWlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQorCQkJcmV0dXJuOworCQllbHNlIGlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pCisJCQltdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoaW5nU3RhdHVzSW5mbywgbnVsbCk7CisJCWVsc2UgaWYgKHRlbXBNdWx0aS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKKwkJCW11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hpbmdTdGF0dXNXYXJuaW5nLCBudWxsKTsKKwkJZWxzZSBpZiAodGVtcE11bHRpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKKwkJCW11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hpbmdTdGF0dXNFcnJvciwgbnVsbCk7CisJCQorCQlpZiAobXVsdGkgIT0gbnVsbCkKKwkJCW11bHRpLmFkZEFsbCh0ZW1wTXVsdGkpOworCX0qLworCisJLyoqCisJICogUHVibGlzaCB0byB0aGUgc2VydmVyLgorCSAqIAorCSAqIEBwYXJhbSBraW5kIHRoZSBwdWJsaXNoIGtpbmQKIAkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCiAJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCiAJICogQHJldHVybiB0aGUgcHVibGlzaCBzdGF0dXMKQEAgLTYwMSw4ICs4MDksOCBAQAogCQlpZiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyVHlwZSgpLmhhc1J1bnRpbWUoKSAmJiBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKIAkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaE5vUnVudGltZSwgbnVsbCk7CiAJCQotCQlmaW5hbCBMaXN0IG1vZHVsZUxpc3QgPSBnZXRBbGxNb2R1bGVzKCk7Ci0JCWZpbmFsIExpc3QgZGVsdGFLaW5kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QgPSBnZXRBbGxNb2R1bGVzKCk7CisJCWZpbmFsIExpc3Q8SW50ZWdlcj4gZGVsdGFLaW5kTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKIAkJCiAJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlTGlzdC5pdGVyYXRvcigpOwogCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CkBAIC02MTgsMTEgKzgyNiw5IEBACiAJCQkJZGVsdGFLaW5kTGlzdC5hZGQobmV3IEludGVnZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuQURERUQpKTsKIAkJfQogCQkKLQkJYWRkUmVtb3ZlZE1vZHVsZXMobW9kdWxlTGlzdCwgZGVsdGFLaW5kTGlzdCk7Ci0JCQotCQl3aGlsZSAobW9kdWxlTGlzdC5zaXplKCkgPiBkZWx0YUtpbmRMaXN0LnNpemUoKSkgeworCQlhZGRSZW1vdmVkTW9kdWxlcyhtb2R1bGVMaXN0LCBudWxsKTsKKwkJd2hpbGUgKGRlbHRhS2luZExpc3Quc2l6ZSgpIDwgbW9kdWxlTGlzdC5zaXplKCkpCiAJCQlkZWx0YUtpbmRMaXN0LmFkZChuZXcgSW50ZWdlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVEKSk7Ci0JCX0KIAkJCiAJCVB1Ymxpc2hPcGVyYXRpb25bXSB0YXNrcyA9IGdldFRhc2tzKGtpbmQsIG1vZHVsZUxpc3QsIGRlbHRhS2luZExpc3QpOwogCQlpbnQgc2l6ZSA9IDIwMDAgKyAzNTAwICogbW9kdWxlTGlzdC5zaXplKCkgKyA1MDAgKiB0YXNrcy5sZW5ndGg7CkBAIC02MzUsNjEgKzg0MSw1OCBAQAogCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCiAJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CiAJCQotCQkvLyBzdGFydCBwdWJsaXNoaW5nCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNhbGxpbmcgcHVibGlzaFN0YXJ0KCkiKTsKIAkJdHJ5IHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlN0YXJ0aW5nIHB1Ymxpc2giKTsKIAkJCXB1Ymxpc2hTdGFydChQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sICJDb3JlRXhjZXB0aW9uIHB1Ymxpc2hpbmcgdG8gIiArIHRvU3RyaW5nKCksIGNlKTsKLQkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKLQkJfQotCQkKLQkJLy8gcGVyZm9ybSB0YXNrcwotCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCQkKKwkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCQkKKwkJCS8vIGV4ZWN1dGUgdGFza3MKIAkJCU11bHRpU3RhdHVzIHRhc2tTdGF0dXMgPSBwZXJmb3JtVGFza3ModGFza3MsIG1vbml0b3IpOwogCQkJaWYgKHRhc2tTdGF0dXMgIT0gbnVsbCAmJiAhdGFza1N0YXR1cy5pc09LKCkpCiAJCQkJdGVtcE11bHRpLmFkZEFsbCh0YXNrU3RhdHVzKTsKLQkJfQotCQkKLQkJLy8gcHVibGlzaCB0aGUgc2VydmVyCi0JCXRyeSB7Ci0JCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXB1Ymxpc2hTZXJ2ZXIoa2luZCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOworCQkJCisJCQkvLyBleGVjdXRlIHB1Ymxpc2hlcnMKKwkJCXRhc2tTdGF0dXMgPSBleGVjdXRlUHVibGlzaGVycyhraW5kLCBtb2R1bGVMaXN0LCBtb25pdG9yLCBpbmZvMik7CisJCQlpZiAodGFza1N0YXR1cyAhPSBudWxsICYmICF0YXNrU3RhdHVzLmlzT0soKSkKKwkJCQl0ZW1wTXVsdGkuYWRkQWxsKHRhc2tTdGF0dXMpOwkJCQorCQkJCisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOworCQkJCisJCQkvLyBwdWJsaXNoIHRoZSBzZXJ2ZXIKKwkJCXB1Ymxpc2hTZXJ2ZXIoa2luZCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOworCQkJCisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOworCQkJCisJCQkvLyBwdWJsaXNoIG1vZHVsZXMKKwkJCXB1Ymxpc2hNb2R1bGVzKGtpbmQsIG1vZHVsZUxpc3QsIGRlbHRhS2luZExpc3QsIHRlbXBNdWx0aSwgbW9uaXRvcik7CisJCQkKKwkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCQkKKwkJCW1vbml0b3IuZG9uZSgpOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CiAJCQlUcmFjZS50cmFjZShUcmFjZS5JTkZPLCAiQ29yZUV4Y2VwdGlvbiBwdWJsaXNoaW5nIHRvICIgKyB0b1N0cmluZygpLCBjZSk7Ci0JCQl0ZW1wTXVsdGkuYWRkKGNlLmdldFN0YXR1cygpKTsKKwkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHB1Ymxpc2hpbmcgY29uZmlndXJhdGlvbiB0byAiICsgdG9TdHJpbmcoKSwgZSk7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBwdWJsaXNoaW5nICB0byAiICsgdG9TdHJpbmcoKSwgZSk7CiAJCQl0ZW1wTXVsdGkuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKSk7Ci0JCX0KLQkJCi0JCS8vIHB1Ymxpc2ggbW9kdWxlcwotCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCX0gZmluYWxseSB7CisJCQkvLyBlbmQgdGhlIHB1Ymxpc2hpbmcKIAkJCXRyeSB7Ci0JCQkJcHVibGlzaE1vZHVsZXMoa2luZCwgbW9kdWxlTGlzdCwgZGVsdGFLaW5kTGlzdCwgdGVtcE11bHRpLCBtb25pdG9yKTsKKwkJCQlwdWJsaXNoRmluaXNoKFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDUwMCkpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sICJDb3JlRXhjZXB0aW9uIHB1Ymxpc2hpbmcgdG8gIiArIHRvU3RyaW5nKCksIGNlKTsKKwkJCQl0ZW1wTXVsdGkuYWRkKGNlLmdldFN0YXR1cygpKTsKIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIHdoaWxlIHB1Ymxpc2hpbmcgbW9kdWxlcyIsIGUpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN0b3BwaW5nIHB1Ymxpc2ggdG8gIiArIHRvU3RyaW5nKCksIGUpOwogCQkJCXRlbXBNdWx0aS5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIGUpKTsKIAkJCX0KIAkJfQogCQkKLQkJLy8gZW5kIHRoZSBwdWJsaXNoaW5nCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNhbGxpbmcgcHVibGlzaEZpbmlzaCgpIik7Ci0JCXRyeSB7Ci0JCQlwdWJsaXNoRmluaXNoKFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDUwMCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5JTkZPLCAiQ29yZUV4Y2VwdGlvbiBwdWJsaXNoaW5nIHRvICIgKyB0b1N0cmluZygpLCBjZSk7Ci0JCQl0ZW1wTXVsdGkuYWRkKGNlLmdldFN0YXR1cygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN0b3BwaW5nIHB1Ymxpc2ggdG8gIiArIHRvU3RyaW5nKCksIGUpOwotCQkJdGVtcE11bHRpLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaGluZywgZSkpOwotCQl9Ci0JCQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQotCQltb25pdG9yLmRvbmUoKTsKLQkJCiAJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0tPC0tIERvbmUgcHVibGlzaGluZyAtLTwtLSIpOwogCQkKIAkJaWYgKHRlbXBNdWx0aS5nZXRDaGlsZHJlbigpLmxlbmd0aCA9PSAxKQpAQCAtNjk3LDE0ICs5MDAsMTYgQEAKIAkJCiAJCU11bHRpU3RhdHVzIG11bHRpID0gbnVsbDsKIAkJaWYgKHRlbXBNdWx0aS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spCi0JCQltdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoaW5nU3RhdHVzT2ssIG51bGwpOworCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJCWVsc2UgaWYgKHRlbXBNdWx0aS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKIAkJCW11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hpbmdTdGF0dXNJbmZvLCBudWxsKTsKIAkJZWxzZSBpZiAodGVtcE11bHRpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQogCQkJbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaGluZ1N0YXR1c1dhcm5pbmcsIG51bGwpOwogCQllbHNlIGlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQogCQkJbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaGluZ1N0YXR1c0Vycm9yLCBudWxsKTsKLQkJbXVsdGkuYWRkQWxsKHRlbXBNdWx0aSk7CisJCQorCQlpZiAobXVsdGkgIT0gbnVsbCkKKwkJCW11bHRpLmFkZEFsbCh0ZW1wTXVsdGkpOwogCQkKIAkJcmV0dXJuIG11bHRpOwogCX0KQEAgLTczOCwzMiArOTQzLDE3IEBACiAJCUlNb2R1bGUgbSA9IG1vZHVsZVtzaXplIC0gMV07CiAJCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnB1Ymxpc2hpbmdNb2R1bGUsIG0uZ2V0TmFtZSgpKSwgMTAwMCk7CiAJCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7CiAJCXRyeSB7Ci0JCQkvKklNb2R1bGVSZXNvdXJjZVtdIHJlcyA9IGdldFJlc291cmNlcyhtb2R1bGUpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLSIgKyBtb2R1bGVbMF0uZ2V0TmFtZSgpKTsKLQkJCXByaW50TW9kdWxlKHJlcywgIiIpOyovCi0JCQlpbnQga2luZDIgPSBraW5kOwotCQkJaWYgKGdldFNlcnZlcigpLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9VTktOT1dOKQotCQkJCWtpbmQyID0gSVNlcnZlci5QVUJMSVNIX0ZVTEw7Ci0JCQlwdWJsaXNoTW9kdWxlKGtpbmQyLCBkZWx0YUtpbmQsIG1vZHVsZSwgbW9uaXRvcik7CisJCQlwdWJsaXNoTW9kdWxlKGtpbmQsIGRlbHRhS2luZCwgbW9kdWxlLCBtb25pdG9yKTsKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKKwkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKTsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaGluZywgZSk7CisJCX0gZmluYWxseSB7CisJCQltb25pdG9yLmRvbmUoKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkRvbmUgcHVibGlzaGluZzogIiArIG1vZHVsZSk7CiAJCX0KLQkJCi0JCS8qVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRGVsdGE6Iik7Ci0JCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmdldERlbHRhKHBhcmVudHMsIG1vZHVsZSk7Ci0JCWludCBzaXplID0gZGVsdGEubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJKChNb2R1bGVSZXNvdXJjZURlbHRhKWRlbHRhW2ldKS50cmFjZSgiPiAgIik7Ci0JCX0qLwotCQkKLQkJbW9uaXRvci5kb25lKCk7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJEb25lIHB1Ymxpc2hpbmc6ICIgKyBtb2R1bGUpOwotCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCS8qKgpAQCAtNzgyLDEwICs5NzIsMTAgQEAKIAkgKiBBZGRzIHJlbW92ZWQgbW9kdWxlcy4KIAkgKiAKIAkgKiBAcGFyYW0gbW9kdWxlTGlzdCBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEBwYXJhbSBraW5kTGlzdCBhIGxpc3Qgb2YgcHVibGlzaCBraW5kcworCSAqIEBwYXJhbSBraW5kTGlzdCBkZXByZWNhdGVkLCBzaG91bGQgYmUgbnVsbAogCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlbW92ZWRNb2R1bGVzKExpc3QgbW9kdWxlTGlzdCwgTGlzdCBraW5kTGlzdCkgewotCQlzZXJ2ZXIuZ2V0U2VydmVyUHVibGlzaEluZm8oKS5hZGRSZW1vdmVkTW9kdWxlcyhtb2R1bGVMaXN0LCBraW5kTGlzdCk7CisJcHJvdGVjdGVkIHZvaWQgYWRkUmVtb3ZlZE1vZHVsZXMoTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QsIExpc3Q8SW50ZWdlcj4ga2luZExpc3QpIHsKKwkJc2VydmVyLmdldFNlcnZlclB1Ymxpc2hJbmZvKCkuYWRkUmVtb3ZlZE1vZHVsZXMobW9kdWxlTGlzdCk7CiAJfQogCiAJLyoqCkBAIC04MDIsMTggKzk5MiwxOCBAQAogCiAJLyoqCiAJICogUHVibGlzaGVzIHRoZSBnaXZlbiBtb2R1bGVzLiBSZXR1cm5zIHRydWUgaWYgdGhlIHB1Ymxpc2hpbmcKLQkgKiBzaG91bGQgY29udGludWUsIG9yIGZhbHNlIGlmIHB1Ymxpc2hpbmcgaGFzIGZhaWxlZCBvciBpcyBjYW5jZWxsZWQuCisJICogc2hvdWxkIGNvbnRpbnVlLCBvciBmYWxzZSBpZiBwdWJsaXNoaW5nIGhhcyBmYWlsZWQgb3IgaXMgY2FuY2VsZWQuCiAJICogCiAJICogVXNlcyA1MDAgdGlja3MgcGx1cyAzNTAwIHRpY2tzIHBlciBtb2R1bGUKIAkgKiAKIAkgKiBAcGFyYW0ga2luZCB0aGUgcHVibGlzaCBraW5kCiAJICogQHBhcmFtIG1vZHVsZXMgYSBsaXN0IG9mIG1vZHVsZXMKLQkgKiBAcGFyYW0gZGVsdGFLaW5kIGEgbGlzdCBvZiBkZWx0YSBraW5kcworCSAqIEBwYXJhbSBkZWx0YUtpbmQyIGEgbGlzdCBvZiBkZWx0YSBraW5kcwogCSAqIEBwYXJhbSBtdWx0aSBhIG11bHRpc3RhdHVzIHRvIGFkZCB0aGUgc3RhdHVzIHRvCiAJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwogCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAogCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hNb2R1bGVzKGludCBraW5kLCBMaXN0IG1vZHVsZXMsIExpc3QgZGVsdGFLaW5kLCBNdWx0aVN0YXR1cyBtdWx0aSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJcHJvdGVjdGVkIHZvaWQgcHVibGlzaE1vZHVsZXMoaW50IGtpbmQsIExpc3QgbW9kdWxlcywgTGlzdCBkZWx0YUtpbmQyLCBNdWx0aVN0YXR1cyBtdWx0aSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCWlmIChtb2R1bGVzID09IG51bGwpCiAJCQlyZXR1cm47CiAJCQpAQCAtODMyLDE0ICsxMDIyLDI2IEBACiAJCQlpZiAobS5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhbS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCiAJCQkJY29udGludWU7CiAJCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaE1vZHVsZShraW5kLCBtb2R1bGUsICgoSW50ZWdlcilkZWx0YUtpbmQuZ2V0KGkpKS5pbnRWYWx1ZSgpLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAzMDAwKSk7CisJCQlpbnQga2luZDIgPSBraW5kOworCQkJaWYgKGdldFNlcnZlcigpLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9VTktOT1dOKQorCQkJCWtpbmQyID0gSVNlcnZlci5QVUJMSVNIX0ZVTEw7CisJCQkKKwkJCS8qaW50IGRlbHRhS2luZCA9IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLkFEREVEOworCQkJaWYgKGhhc0JlZW5QdWJsaXNoZWQobW9kdWxlKSkgeworCQkJCWlmIChnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSkubGVuZ3RoID09IDApCisJCQkJCWRlbHRhS2luZCA9IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLk5PX0NIQU5HRTsKKwkJCQllbHNlCisJCQkJCWRlbHRhS2luZCA9IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLkNIQU5HRUQ7CisJCQl9IC8vIFRPRE8gUkVNT1ZFRCovCisJCQkKKwkJCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaE1vZHVsZShraW5kMiwgbW9kdWxlLCAoKEludGVnZXIpZGVsdGFLaW5kMi5nZXQoaSkpLmludFZhbHVlKCksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDMwMDApKTsKIAkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKIAkJCQltdWx0aS5hZGQoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2ggdGFza3MgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0dGVkIHRvIHRoaXMgc2VydmVyLgorCSAqIFJldHVybnMgdGhlIHB1Ymxpc2ggdGFza3MgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0ZWQgdG8gdGhpcyBzZXJ2ZXIuCiAJICogVGhlc2UgdGFza3Mgc2hvdWxkIGJlIHJ1biBkdXJpbmcgcHVibGlzaGluZy4KIAkgKiAKIAkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMKQEAgLTg1MiwxMiArMTA1NCw1OCBAQAogCX0KIAogCS8qKgorCSAqIEV4ZWN1dGUgcHVibGlzaGVycy4KKwkgKiAKKwkgKiBAcGFyYW0ga2luZCB0aGUgcHVibGlzaCBraW5kCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcworCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAorCSAqIEBwYXJhbSBpbmZvIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCisJICogICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQorCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwKKwkgKiAgICBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlciBmb3IgdGhlCisJICogICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgTXVsdGlTdGF0dXMgZXhlY3V0ZVB1Ymxpc2hlcnMoaW50IGtpbmQsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlQdWJsaXNoZXJbXSBwdWJsaXNoZXJzID0gKChTZXJ2ZXIpZ2V0U2VydmVyKCkpLmdldEVuYWJsZWRQdWJsaXNoZXJzKCk7CisJCWludCBzaXplID0gcHVibGlzaGVycy5sZW5ndGg7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkV4ZWN1dGluZyBwdWJsaXNoZXJzOiAiICsgc2l6ZSk7CisJCQorCQlpZiAoc2l6ZSA9PSAwKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy50YXNrUGVyZm9ybWluZywgbnVsbCk7CisJCQorCQlUYXNrTW9kZWwgdGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOworCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgZ2V0U2VydmVyKCkpOworCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX01PRFVMRVMsIG1vZHVsZXMpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCVB1Ymxpc2hlciBwdWIgPSBwdWJsaXNoZXJzW2ldOworCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnRhc2tQZXJmb3JtaW5nLCBwdWIuZ2V0TmFtZSgpKSk7CisJCQl0cnkgeworCQkJCXB1Yi5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKKwkJCQlJU3RhdHVzIHB1YlN0YXR1cyA9IHB1Yi5leGVjdXRlKGtpbmQsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDUwMCksIGluZm8pOworCQkJCW11bHRpLmFkZChwdWJTdGF0dXMpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIlB1Ymxpc2hlciBmYWlsZWQiLCBjZSk7CisJCQkJdGhyb3cgY2U7CisJCQl9CisJCQkKKwkJCS8vIHJldHVybiBlYXJseSBpZiB0aGUgbW9uaXRvciBoYXMgYmVlbiBjYW5jZWxlZAorCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybiBtdWx0aTsKKwkJfQorCQlyZXR1cm4gbXVsdGk7CisJfQorCisJLyoqCiAJICogUmV0dXJucyBhbGwgdGhlIG1vZHVsZXMgdGhhdCBhcmUgb24gdGhlIHNlcnZlciwgaW5jbHVkaW5nIHJvb3QKIAkgKiBtb2R1bGVzIGFuZCBhbGwgdGhlaXIgY2hpbGRyZW4uCiAJICogCiAJICogQHJldHVybiBhIGxpc3Qgb2YgSU1vZHVsZVtdcwogCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGdldEFsbE1vZHVsZXMoKSB7CisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8SU1vZHVsZVtdPiBnZXRBbGxNb2R1bGVzKCkgewogCQlyZXR1cm4gc2VydmVyLmdldEFsbE1vZHVsZXMoKTsKIAl9CiAKQEAgLTg4OCw3ICsxMTM2LDcgQEAKIAkJCQltdWx0aS5hZGQoY2UuZ2V0U3RhdHVzKCkpOwogCQkJfQogCQkJCi0JCQkvLyByZXR1cm4gZWFybHkgaWYgdGhlIG1vbml0b3IgaGFzIGJlZW4gY2FuY2VsbGVkCisJCQkvLyByZXR1cm4gZWFybHkgaWYgdGhlIG1vbml0b3IgaGFzIGJlZW4gY2FuY2VsZWQKIAkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKIAkJCQlyZXR1cm4gbXVsdGk7CiAJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9TZXJ2ZXJEZWxlZ2F0ZS5qYXZhCmluZGV4IDQ3MTQxY2IuLmMwMTFmMjEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckRlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvU2VydmVyRGVsZWdhdGUuamF2YQpAQCAtMTUzLDcgKzE1Myw3IEBACiAJICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCiAJICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgTGlzdCkKIAkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBMaXN0IGRlZmF1bHRWYWx1ZSkgeworCXByb3RlY3RlZCBmaW5hbCBMaXN0IGdldEF0dHJpYnV0ZShTdHJpbmcgaWQsIExpc3Q8U3RyaW5nPiBkZWZhdWx0VmFsdWUpIHsKIAkJcmV0dXJuIHNlcnZlci5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7CiAJfQogCkBAIC0zMDksNyArMzA5LDcgQEAKIAkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCiAJICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZywgTGlzdCkKIAkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBMaXN0IHZhbHVlKSB7CisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IHZhbHVlKSB7CiAJCXNlcnZlcldDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9IdHRwTGF1bmNoYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9IdHRwTGF1bmNoYWJsZS5qYXZhCmluZGV4IGRhNGFjYzUuLjNjZjY1MzEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvSHR0cExhdW5jaGFibGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL0h0dHBMYXVuY2hhYmxlLmphdmEKQEAgLTQyLDYgKzQyLDYgQEAKIAkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCiAJICovCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJIdHRwTGF1bmNoYWJsZVt1cmw9IiArIHVybC50b1N0cmluZygpICsgIl0iOworCQlyZXR1cm4gIkh0dHBMYXVuY2hhYmxlW3VybD0iICsgdXJsICsgIl0iOwogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL01vZHVsZUZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvTW9kdWxlRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjlmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL01vZHVsZUZpbGUuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNb2R1bGVGaWxlfSBmb3IgcGh5c2ljYWwgZmlsZXMgb24gZGlzayBvciBpbiB0aGUKKyAqIHdvcmtzcGFjZS4KKyAqCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBjbGFzcyBNb2R1bGVGaWxlIGltcGxlbWVudHMgSU1vZHVsZUZpbGUgeworCXByaXZhdGUgSUZpbGUgZmlsZTsKKwlwcml2YXRlIEZpbGUgZmlsZTI7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIElQYXRoIHBhdGg7CisJcHJpdmF0ZSBsb25nIHN0YW1wID0gLTE7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgd29ya3NwYWNlIG1vZHVsZSBmaWxlIHdpdGggdGhlIGN1cnJlbnQgbW9kaWZpY2F0aW9uIHN0YW1wLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlIGEgZmlsZSBpbiB0aGUgd29ya3NwYWNlCisJICogQHBhcmFtIG5hbWUgYSBuYW1lCisJICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGZpbGUKKwkgKi8KKwlwdWJsaWMgTW9kdWxlRmlsZShJRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgeworCQlpZiAobmFtZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl0aGlzLmZpbGUgPSBmaWxlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnBhdGggPSBwYXRoOworCQlpZiAoZmlsZSAhPSBudWxsKQorCQkJc3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgKyBmaWxlLmdldExvY2FsVGltZVN0YW1wKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBleHRlcm5hbCBtb2R1bGUgZmlsZSB3aXRoIHRoZSBjdXJyZW50IG1vZGlmaWNhdGlvbiBzdGFtcC4KKwkgKiAKKwkgKiBAcGFyYW0gZmlsZQorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIHBhdGgKKwkgKi8KKwlwdWJsaWMgTW9kdWxlRmlsZShGaWxlIGZpbGUsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoKSB7CisJCWlmIChuYW1lID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCXRoaXMuZmlsZTIgPSBmaWxlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnBhdGggPSBwYXRoOworCQlpZiAoZmlsZTIgIT0gbnVsbCkKKwkJCXN0YW1wID0gZmlsZTIubGFzdE1vZGlmaWVkKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG1vZHVsZSBmaWxlIHdpdGggYSBzcGVjaWZpYyBtb2RpZmljYXRpb24gc3RhbXAgYW5kIG5vCisJICogZmlsZSByZWZlcmVuY2UuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gcGF0aAorCSAqIEBwYXJhbSBzdGFtcAorCSAqLworCXB1YmxpYyBNb2R1bGVGaWxlKFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoLCBsb25nIHN0YW1wKSB7CisJCWlmIChuYW1lID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJCXRoaXMuc3RhbXAgPSBzdGFtcDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgd29ya3NwYWNlIG1vZHVsZSBmaWxlIHdpdGggYSBzcGVjaWZpYyBtb2RpZmljYXRpb24gc3RhbXAuCisJICogCisJICogQHBhcmFtIGZpbGUKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBwYXRoCisJICogQHBhcmFtIHN0YW1wCisJICogQGRlcHJlY2F0ZWQgdXNlIG9uZSBvZiB0aGUgdG9wIHR3byBjb25zdHJ1Y3RvcnMgaW5zdGVhZAorCSAqLworCXB1YmxpYyBNb2R1bGVGaWxlKElGaWxlIGZpbGUsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoLCBsb25nIHN0YW1wKSB7CisJCXRoaXMuZmlsZSA9IGZpbGU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJCXRoaXMuc3RhbXAgPSBzdGFtcDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGUjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKQorCSAqLworCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgeworCQlyZXR1cm4gc3RhbXA7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZSNnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKQorCSAqLworCXB1YmxpYyBJUGF0aCBnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSB7CisJCXJldHVybiBwYXRoOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAob2JqID09IHRoaXMpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCWlmICghKG9iaiBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCUlNb2R1bGVGaWxlIG1mID0gKElNb2R1bGVGaWxlKSBvYmo7CisJCWlmICghbmFtZS5lcXVhbHMobWYuZ2V0TmFtZSgpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFwYXRoLmVxdWFscyhtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBuYW1lLmhhc2hDb2RlKCkgKiAzNyArIHBhdGguaGFzaENvZGUoKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2wpIHsKKwkJaWYgKElGaWxlLmNsYXNzLmVxdWFscyhjbCkpCisJCQlyZXR1cm4gZmlsZTsKKwkJaWYgKEZpbGUuY2xhc3MuZXF1YWxzKGNsKSkKKwkJCXJldHVybiBmaWxlMjsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJNb2R1bGVGaWxlIFsiICsgbmFtZSArICIsICIgKyBwYXRoICsgIiwgIiArIHN0YW1wICsgIl0iOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL01vZHVsZUZvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Nb2R1bGVGb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkxNDdmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Nb2R1bGVGb2xkZXIuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSU1vZHVsZUZvbGRlcn0gZm9yIHBoeXNpY2FsIGZvbGRlcnMgb24gZGlzayBvciBpbiB0aGUKKyAqIHdvcmtzcGFjZS4KKyAqCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBjbGFzcyBNb2R1bGVGb2xkZXIgaW1wbGVtZW50cyBJTW9kdWxlRm9sZGVyIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTW9kdWxlUmVzb3VyY2VbXSBFTVBUWV9SRVNPVVJDRV9BUlJBWSA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07CisKKwlwcml2YXRlIElDb250YWluZXIgY29udGFpbmVyOworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBJUGF0aCBwYXRoOworCXByaXZhdGUgSU1vZHVsZVJlc291cmNlW10gbWVtYmVyczsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBtb2R1bGUgZm9sZGVyLgorCSAqIAorCSAqIEBwYXJhbSBjb250YWluZXIgdGhlIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHVua25vd24gY29udGFpbmVyCisJICogQHBhcmFtIG5hbWUgYSBuYW1lCisJICogQHBhcmFtIHBhdGggdGhlIG1vZHVsZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmb2xkZXIKKwkgKi8KKwlwdWJsaWMgTW9kdWxlRm9sZGVyKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgeworCQlpZiAobmFtZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5wYXRoID0gcGF0aDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBtZW1iZXJzIChjb250ZW50cykgb2YgdGhpcyBmb2xkZXIuCisJICogCisJICogQHBhcmFtIG1lbWJlcnMgdGhlIG1lbWJlcnMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZW1iZXJzKElNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnMpIHsKKwkJdGhpcy5tZW1iZXJzID0gbWVtYmVyczsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlI2dldE1vZHVsZVJlbGF0aXZlUGF0aCgpCisJICovCisJcHVibGljIElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpIHsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZSNnZXROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRm9sZGVyI21lbWJlcnMoKQorCSAqLworCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgeworCQlpZiAobWVtYmVycyA9PSBudWxsKQorCQkJcmV0dXJuIEVNUFRZX1JFU09VUkNFX0FSUkFZOworCQlyZXR1cm4gbWVtYmVyczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAob2JqID09IHRoaXMpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vZHVsZUZvbGRlcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlNb2R1bGVGb2xkZXIgbWYgPSAoTW9kdWxlRm9sZGVyKSBvYmo7CisJCWlmICghbmFtZS5lcXVhbHMobWYubmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghcGF0aC5lcXVhbHMobWYucGF0aCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBuYW1lLmhhc2hDb2RlKCkgKiAzNyArIHBhdGguaGFzaENvZGUoKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2wpIHsKKwkJaWYgKElDb250YWluZXIuY2xhc3MuZXF1YWxzKGNsKSB8fCBJRm9sZGVyLmNsYXNzLmVxdWFscyhjbCkpCisJCQlyZXR1cm4gY29udGFpbmVyOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIk1vZHVsZUZvbGRlciBbIiArIG5hbWUgKyAiLCAiICsgcGF0aCArICJdIjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Qcm9qZWN0TW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGUuamF2YQppbmRleCAyNzM5Mjc1Li4zMDY3NjRiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwxMiArMTQsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogCiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVEZWxlZ2F0ZTsKIC8qKgogICogQSBzaW1wbGUgSU1vZHVsZVByb2plY3QgdGhhdCBtYXBzIGEgZm9sZGVyIHdpdGhpbiBhIHByb2plY3QKICAqIChvciB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBpdHNlbGYpIHRvIHRoZSBtb2R1bGUuCkBAIC0xNTgsMTQgKzE2MCwxNCBAQAogCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb250YWluZXIubWVtYmVycygpOwogCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKIAkJCWludCBzaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisJCQlMaXN0PElNb2R1bGVSZXNvdXJjZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZVJlc291cmNlPihzaXplKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwogCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7CiAJCQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwogCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7CiAJCQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lcjIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7Ci0JCQkJCQlNb2R1bGVGb2xkZXIgbWYgPSBuZXcgTW9kdWxlRm9sZGVyKGNvbnRhaW5lcjIsIG5hbWUsIHBhdGgpOworCQkJCQkJTW9kdWxlRm9sZGVyIG1mID0gbmV3IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGb2xkZXIoY29udGFpbmVyMiwgbmFtZSwgcGF0aCk7CiAJCQkJCQltZi5zZXRNZW1iZXJzKGdldE1vZHVsZVJlc291cmNlcyhwYXRoLmFwcGVuZChuYW1lKSwgY29udGFpbmVyMikpOwogCQkJCQkJbGlzdC5hZGQobWYpOwogCQkJCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKQEAgLTE3OSw0ICsxODEsNCBAQAogCQl9CiAJCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhCmluZGV4IDcyOTVhODkuLmYxZTFiYTYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhCkBAIC0yNyw4ICsyNyw3IEBACiAgKiBAc2luY2UgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIGV4dGVuZHMgTW9kdWxlRmFjdG9yeURlbGVnYXRlIHsKLQkvLyBtYXAgb2YgSVByb2plY3QgdG8gSU1vZHVsZVtdCi0JcHJpdmF0ZSBNYXAgbW9kdWxlcyA9IG5ldyBIYXNoTWFwKCk7CisJcHJpdmF0ZSBNYXA8SVByb2plY3QsIElNb2R1bGVbXT4gbW9kdWxlcyA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBJTW9kdWxlW10+KCk7CiAKIAkvKioKIAkgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS4KQEAgLTQ5LDcgKzQ4LDcgQEAKIAkJCiAJCUlNb2R1bGVbXSBtID0gbnVsbDsKIAkJdHJ5IHsKLQkJCW0gPSAoSU1vZHVsZVtdKSBtb2R1bGVzLmdldChwcm9qZWN0KTsKKwkJCW0gPSBtb2R1bGVzLmdldChwcm9qZWN0KTsKIAkJCWlmIChtICE9IG51bGwpCiAJCQkJcmV0dXJuIG07CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CkBAIC0xMTcsNyArMTE2LDcgQEAKIAlwdWJsaWMgZmluYWwgSU1vZHVsZVtdIGdldE1vZHVsZXMoKSB7CiAJCWNhY2hlTW9kdWxlcygpOwogCQkKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CiAJCUl0ZXJhdG9yIGl0ZXIgPSBtb2R1bGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7CiAJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewogCQkJSU1vZHVsZVtdIG0gPSAoSU1vZHVsZVtdKSBpdGVyLm5leHQoKTsKQEAgLTIwNyw4ICsyMDYsNyBAQAogCSAqIEBzaW5jZSAyLjAKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBjbGVhckNhY2hlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy9tb2R1bGVzLnB1dChwcm9qZWN0LCBudWxsKTsKLQkJbW9kdWxlcyA9IG5ldyBIYXNoTWFwKCk7CisJCW1vZHVsZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgSU1vZHVsZVtdPigpOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1B1Ymxpc2hIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjhkOTc5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoSGVscGVyLmphdmEKQEAgLTAsMCArMSw4MDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Qcm9ncmVzc1V0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGE7CisvKioKKyAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBhbiBhc3NvcnRtZW50IG9mIHVzZWZ1bCBwdWJsaXNoaW5nIGZpbGUgbWV0aG9kcy4KKyAqCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoSGVscGVyIHsKKwkvLyBzaXplIG9mIHRoZSBidWZmZXIKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gNjU1MzY7CisKKwkvLyB0aGUgYnVmZmVyCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl07CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzW10gRU1QVFlfU1RBVFVTID0gbmV3IElTdGF0dXNbMF07CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlIGRlZmF1bHRUZW1wRGlyID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvRmlsZSgpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBGSUxFX1BSRUZJWCA9ICJ0bXAiOworCisJcHJpdmF0ZSBGaWxlIHRlbXBEaXI7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgUHVibGlzaEhlbHBlci4KKwkgKiAKKwkgKiBAcGFyYW0gdGVtcERpcmVjdG9yeSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGR1cmluZyBwdWJsaXNoaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqICAgIHRvIHVzZSB0aGUgZGVmYXVsdC4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIHRoZSBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkCisJICovCisJcHVibGljIFB1Ymxpc2hIZWxwZXIoRmlsZSB0ZW1wRGlyZWN0b3J5KSB7CisJCXRoaXMudGVtcERpciA9IHRlbXBEaXJlY3Rvcnk7CisJCWlmICh0ZW1wRGlyID09IG51bGwpCisJCQl0ZW1wRGlyID0gZGVmYXVsdFRlbXBEaXI7CisJCWVsc2UgaWYgKCF0ZW1wRGlyLmV4aXN0cygpKQorCQkJdGVtcERpci5ta2RpcnMoKTsKKwl9CisKKwkvKioKKwkgKiBDb3B5IGEgZmlsZSBmcm9tIGEgdG8gYi4gQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgdXNlLgorCSAqIAorCSAqIEBwYXJhbSBpbiBhbiBpbnB1dCBzdHJlYW0KKwkgKiBAcGFyYW0gdG8gYSBwYXRoIHRvIGNvcHkgdG8uIHRoZSBkaXJlY3RvcnkgbXVzdCBhbHJlYWR5IGV4aXN0CisJICogQHBhcmFtIHRzIHRpbWVzdGFtcAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCisJICovCisJcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBJUGF0aCB0bywgbG9uZyB0cywgSU1vZHVsZUZpbGUgbWYpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisJCQorCQlGaWxlIHRlbXBGaWxlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUZpbGUgZmlsZSA9IHRvLnRvRmlsZSgpOworCQkJdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKFRFTVBGSUxFX1BSRUZJWCwgIi4iICsgdG8uZ2V0RmlsZUV4dGVuc2lvbigpLCB0ZW1wRGlyKTsKKwkJCQorCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOworCQkJCisJCQlpbnQgYXZhaWwgPSBpbi5yZWFkKGJ1Zik7CisJCQl3aGlsZSAoYXZhaWwgPiAwKSB7CisJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgYXZhaWwpOworCQkJCWF2YWlsID0gaW4ucmVhZChidWYpOworCQkJfQorCQkJCisJCQlvdXQuY2xvc2UoKTsKKwkJCW91dCA9IG51bGw7CisJCQkKKwkJCW1vdmVUZW1wRmlsZSh0ZW1wRmlsZSwgZmlsZSk7CisJCQkKKwkJCWlmICh0cyAhPSBJUmVzb3VyY2UuTlVMTF9TVEFNUCAmJiB0cyAhPSAwKQorCQkJCWZpbGUuc2V0TGFzdE1vZGlmaWVkKHRzKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJSVBhdGggcGF0aCA9IG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmFwcGVuZChtZi5nZXROYW1lKCkpOworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29weWluZyBmaWxlOiAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiIHRvICIgKyB0by50b09TU3RyaW5nKCksIGUpOworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvcHlpbmdGaWxlLCBwYXRoLnRvT1NTdHJpbmcoKSwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBudWxsKSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAodGVtcEZpbGUgIT0gbnVsbCAmJiB0ZW1wRmlsZS5leGlzdHMoKSkKKwkJCQl0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKKwkJCXRyeSB7CisJCQkJaWYgKGluICE9IG51bGwpCisJCQkJCWluLmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJCXRyeSB7CisJCQkJaWYgKG91dCAhPSBudWxsKQorCQkJCQlvdXQuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVXRpbGl0eSBtZXRob2QgdG8gcmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5LgorCSAqCisJICogQHBhcmFtIGRpciBhIGRpcmVjdG9yeQorCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzW10gZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKCFkaXIuZXhpc3RzKCkgfHwgIWRpci5pc0RpcmVjdG9yeSgpKQorCQkJcmV0dXJuIG5ldyBJU3RhdHVzW10geyBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTm90QURpcmVjdG9yeSwgZGlyLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCkgfTsKKwkJCisJCUxpc3Q8SVN0YXR1cz4gc3RhdHVzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigyKTsKKwkJCisJCXRyeSB7CisJCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7CisJCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKKwkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKKwkJCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nVGFzaywgbmV3IFN0cmluZ1tdIHsgZGlyLmdldEFic29sdXRlUGF0aCgpIH0pLCBzaXplICogMTApOworCQkJCisJCQkvLyBjeWNsZSB0aHJvdWdoIGZpbGVzCisJCQlib29sZWFuIGRlbGV0ZUN1cnJlbnQgPSB0cnVlOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlGaWxlIGN1cnJlbnQgPSBmaWxlc1tpXTsKKwkJCQlpZiAoY3VycmVudC5pc0ZpbGUoKSkgeworCQkJCQlpZiAoIWN1cnJlbnQuZGVsZXRlKCkpIHsKKwkJCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKKwkJCQkJCWRlbGV0ZUN1cnJlbnQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCQltb25pdG9yLndvcmtlZCgxMCk7CisJCQkJfSBlbHNlIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKKwkJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldEFic29sdXRlUGF0aCgpfSkpOworCQkJCQlJU3RhdHVzW10gc3RhdCA9IGRlbGV0ZURpcmVjdG9yeShjdXJyZW50LCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMCkpOworCQkJCQlpZiAoc3RhdCAhPSBudWxsICYmIHN0YXQubGVuZ3RoID4gMCkgeworCQkJCQkJZGVsZXRlQ3VycmVudCA9IGZhbHNlOworCQkJCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChkZWxldGVDdXJyZW50ICYmICFkaXIuZGVsZXRlKCkpCisJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKKwkJCW1vbml0b3IuZG9uZSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZGVsZXRpbmcgZGlyZWN0b3J5ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOworCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBudWxsKSk7CisJCX0KKwkJCisJCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07CisJCXN0YXR1cy50b0FycmF5KHN0YXQpOworCQlyZXR1cm4gc3RhdDsKKwl9CisKKwkvKioKKwkgKiBTbWFydCBjb3B5IHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzIHRvIHRoZSBnaXZlbiBwYXRoLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcworCSAqIEBwYXJhbSBwYXRoIGFuIGV4dGVybmFsIHBhdGggdG8gY29weSB0bworCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzIAorCSAqLworCXB1YmxpYyBJU3RhdHVzW10gcHVibGlzaFNtYXJ0KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXJldHVybiBwdWJsaXNoU21hcnQocmVzb3VyY2VzLCBwYXRoLCBudWxsLCBtb25pdG9yKTsKKwl9CisKKwkvKioKKwkgKiBTbWFydCBjb3B5IHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzIHRvIHRoZSBnaXZlbiBwYXRoLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcworCSAqIEBwYXJhbSBwYXRoIGFuIGV4dGVybmFsIHBhdGggdG8gY29weSB0bworCSAqIEBwYXJhbSBpZ25vcmUgYW4gYXJyYXkgb2YgcGF0aHMgcmVsYXRpdmUgdG8gcGF0aCB0byBpZ25vcmUsIGkuZS4gbm90IGRlbGV0ZSBvciBjb3B5IG92ZXIKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cyAKKwkgKi8KKwlwdWJsaWMgSVN0YXR1c1tdIHB1Ymxpc2hTbWFydChJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgsIElQYXRoW10gaWdub3JlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKHJlc291cmNlcyA9PSBudWxsKQorCQkJcmV0dXJuIEVNUFRZX1NUQVRVUzsKKwkJCisJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKKwkJCisJCUxpc3Q8SVN0YXR1cz4gc3RhdHVzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigyKTsKKwkJRmlsZSB0b0RpciA9IHBhdGgudG9GaWxlKCk7CisJCWludCBmcm9tU2l6ZSA9IHJlc291cmNlcy5sZW5ndGg7CisJCVN0cmluZ1tdIGZyb21GaWxlTmFtZXMgPSBuZXcgU3RyaW5nW2Zyb21TaXplXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tU2l6ZTsgaSsrKQorCQkJZnJvbUZpbGVOYW1lc1tpXSA9IHJlc291cmNlc1tpXS5nZXROYW1lKCk7CisJCUxpc3Q8U3RyaW5nPiBpZ25vcmVGaWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJaWYgKGlnbm9yZSAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGlnbm9yZS5sZW5ndGg7IGkrKykgeworCQkJCWlmIChpZ25vcmVbaV0uc2VnbWVudENvdW50KCkgPT0gMSkgeworCQkJCQlpZ25vcmVGaWxlTmFtZXMuYWRkKGlnbm9yZVtpXS50b09TU3RyaW5nKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8JY2FjaGUgZmlsZXMgYW5kIGZpbGUgbmFtZXMgZm9yIHBlcmZvcm1hbmNlCisJCUZpbGVbXSB0b0ZpbGVzID0gbnVsbDsKKwkJU3RyaW5nW10gdG9GaWxlTmFtZXMgPSBudWxsOworCQkKKwkJYm9vbGVhbiBmb3VuZEV4aXN0aW5nRGlyID0gZmFsc2U7CisJCWlmICh0b0Rpci5leGlzdHMoKSkgeworCQkJaWYgKHRvRGlyLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQlmb3VuZEV4aXN0aW5nRGlyID0gdHJ1ZTsKKwkJCQl0b0ZpbGVzID0gdG9EaXIubGlzdEZpbGVzKCk7CisJCQkJaW50IHRvU2l6ZSA9IHRvRmlsZXMubGVuZ3RoOworCQkJCXRvRmlsZU5hbWVzID0gbmV3IFN0cmluZ1t0b1NpemVdOworCQkJCQorCQkJCS8vIGNoZWNrIGlmIHRoaXMgZXhhY3QgZmlsZSBleGlzdHMgaW4gdGhlIG5ldyBkaXJlY3RvcnkKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvU2l6ZTsgaSsrKSB7CisJCQkJCXRvRmlsZU5hbWVzW2ldID0gdG9GaWxlc1tpXS5nZXROYW1lKCk7CisJCQkJCWJvb2xlYW4gaXNEaXIgPSB0b0ZpbGVzW2ldLmlzRGlyZWN0b3J5KCk7CisJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmcm9tU2l6ZTsgaisrKSB7CisJCQkJCQlpZiAodG9GaWxlTmFtZXNbaV0uZXF1YWxzKGZyb21GaWxlTmFtZXNbal0pICYmIGlzRGlyID09IHJlc291cmNlc1tqXSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKKwkJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJCisJCQkJCS8vIGRlbGV0ZSBmaWxlIGlmIGl0IGNhbid0IGJlIGZvdW5kIG9yIGlzbid0IHRoZSBjb3JyZWN0IHR5cGUKKwkJCQkJaWYgKCFmb3VuZCkgeworCQkJCQkJYm9vbGVhbiBkZWxldGUgPSB0cnVlOworCQkJCQkJLy8gaWYgc2hvdWxkIGJlIHByZXNlcnZlZCwgZG9uJ3QgZGVsZXRlIGFuZCBkb24ndCB0cnkgdG8gY29weQorCQkJCQkJZm9yIChTdHJpbmcgcHJlc2VydmVGaWxlTmFtZSA6IGlnbm9yZUZpbGVOYW1lcykgeworCQkJCQkJCWlmICh0b0ZpbGVOYW1lc1tpXS5lcXVhbHMocHJlc2VydmVGaWxlTmFtZSkpIHsKKwkJCQkJCQkJZGVsZXRlID0gZmFsc2U7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmIChkZWxldGUpIHsKKwkJCQkJCQlpZiAoaXNEaXIpIHsKKwkJCQkJCQkJSVN0YXR1c1tdIHN0YXQgPSBkZWxldGVEaXJlY3RvcnkodG9GaWxlc1tpXSwgbnVsbCk7CisJCQkJCQkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYgKCF0b0ZpbGVzW2ldLmRlbGV0ZSgpKQorCQkJCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIHRvRmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpLCBudWxsKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJdG9GaWxlc1tpXSA9IG51bGw7CisJCQkJCQl0b0ZpbGVOYW1lc1tpXSA9IG51bGw7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeyAvL2lmICh0b0Rpci5pc0ZpbGUoKSkKKwkJCQlpZiAoIXRvRGlyLmRlbGV0ZSgpKSB7CisJCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCB0b0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKKwkJCQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKKwkJCQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7CisJCQkJCXJldHVybiBzdGF0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kRXhpc3RpbmdEaXIgJiYgIXRvRGlyLm1rZGlycygpKSB7CisJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JNa2RpciwgdG9EaXIuZ2V0QWJzb2x1dGVQYXRoKCkpLCBudWxsKSk7CisJCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOworCQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7CisJCQlyZXR1cm4gc3RhdDsKKwkJfQorCQkKKwkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJcmV0dXJuIG5ldyBJU3RhdHVzW10geyBTdGF0dXMuQ0FOQ0VMX1NUQVRVUyB9OworCQkKKwkJbW9uaXRvci53b3JrZWQoNTApOworCQkKKwkJLy8gY3ljbGUgdGhyb3VnaCBmaWxlcyBhbmQgb25seSBjb3B5IHdoZW4gaXQgZG9lc24ndCBleGlzdAorCQkvLyBvciBpcyBuZXdlcgorCQlpZiAodG9GaWxlcyA9PSBudWxsKSB7CisJCQl0b0ZpbGVzID0gdG9EaXIubGlzdEZpbGVzKCk7CisJCQlpZiAodG9GaWxlcyA9PSBudWxsKQorCQkJCXRvRmlsZXMgPSBuZXcgRmlsZVswXTsKKwkJfQorCQlpbnQgdG9TaXplID0gdG9GaWxlcy5sZW5ndGg7CisJCQorCQlpbnQgZHcgPSAwOworCQlpZiAodG9TaXplID4gMCkKKwkJCWR3ID0gNTAwIC8gdG9TaXplOworCQkKKwkJLy8gY2FjaGUgZmlsZSBuYW1lcyBhbmQgbGFzdCBtb2RpZmllZCBkYXRlcyBmb3IgcGVyZm9ybWFuY2UKKwkJaWYgKHRvRmlsZU5hbWVzID09IG51bGwpCisJCQl0b0ZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbdG9TaXplXTsKKwkJbG9uZ1tdIHRvRmlsZU1vZCA9IG5ldyBsb25nW3RvU2l6ZV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9TaXplOyBpKyspIHsKKwkJCWlmICh0b0ZpbGVzW2ldICE9IG51bGwpIHsKKwkJCQlpZiAodG9GaWxlTmFtZXNbaV0gIT0gbnVsbCkKKwkJCQkJdG9GaWxlTmFtZXNbaV0gPSB0b0ZpbGVzW2ldLmdldE5hbWUoKTsKKwkJCQl0b0ZpbGVNb2RbaV0gPSB0b0ZpbGVzW2ldLmxhc3RNb2RpZmllZCgpOworCQkJfQorCQl9CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IGZyb21TaXplOyBpKyspIHsKKwkJCUlNb2R1bGVSZXNvdXJjZSBjdXJyZW50ID0gcmVzb3VyY2VzW2ldOworCQkJU3RyaW5nIG5hbWUgPSBmcm9tRmlsZU5hbWVzW2ldOworCQkJYm9vbGVhbiBjdXJyZW50SXNEaXIgPSBjdXJyZW50IGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcjsKKwkJCQorCQkJaWYgKCFjdXJyZW50SXNEaXIpIHsKKwkJCQkvLyBjaGVjayBpZiB0aGlzIGlzIGEgbmV3IG9yIG5ld2VyIGZpbGUKKwkJCQlib29sZWFuIGNvcHkgPSB0cnVlOworCQkJCUlNb2R1bGVGaWxlIG1mID0gKElNb2R1bGVGaWxlKSBjdXJyZW50OworCQkJCQorCQkJCWxvbmcgbW9kID0gLTE7CisJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgbWYuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7CisJCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCQltb2QgPSBmaWxlLmdldExvY2FsVGltZVN0YW1wKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJRmlsZSBmaWxlMiA9IChGaWxlKSBtZi5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOworCQkJCQltb2QgPSBmaWxlMi5sYXN0TW9kaWZpZWQoKTsKKwkJCQl9CisJCQkJCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0b1NpemU7IGorKykgeworCQkJCQlpZiAobmFtZS5lcXVhbHModG9GaWxlTmFtZXNbal0pICYmIG1vZCA9PSB0b0ZpbGVNb2Rbal0pIHsKKwkJCQkJCWNvcHkgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmIChjb3B5KSB7CisJCQkJCXRyeSB7CisJCQkJCQljb3B5RmlsZShtZiwgcGF0aC5hcHBlbmQobmFtZSkpOworCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCQlzdGF0dXMuYWRkKGNlLmdldFN0YXR1cygpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQltb25pdG9yLndvcmtlZChkdyk7CisJCQl9IGVsc2UgeyAvL2lmIChjdXJyZW50SXNEaXIpIHsKKwkJCQlJTW9kdWxlRm9sZGVyIGZvbGRlciA9IChJTW9kdWxlRm9sZGVyKSBjdXJyZW50OworCQkJCUlNb2R1bGVSZXNvdXJjZVtdIGNoaWxkcmVuID0gZm9sZGVyLm1lbWJlcnMoKTsKKworCQkJCS8vIGJ1aWxkIGFycmF5IG9mIGlnbm9yZWQgUGF0aHMgdGhhdCBhcHBseSB0byB0aGlzIGZvbGRlcgorCQkJCUlQYXRoW10gaWdub3JlQ2hpbGRyZW4gPSBudWxsOworCQkJCWlmIChpZ25vcmUgIT0gbnVsbCkgeworCQkJCQlMaXN0PElQYXRoPiBpZ25vcmVDaGlsZFBhdGhzID0gbmV3IEFycmF5TGlzdDxJUGF0aD4oKTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpZ25vcmUubGVuZ3RoOyBqKyspIHsKKwkJCQkJCUlQYXRoIHByZXNlcnZlUGF0aCA9IGlnbm9yZVtqXTsKKwkJCQkJCWlmIChwcmVzZXJ2ZVBhdGguc2VnbWVudCgwKS5lcXVhbHMobmFtZSkpIHsKKwkJCQkJCQlpZ25vcmVDaGlsZFBhdGhzLmFkZChwcmVzZXJ2ZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGlnbm9yZUNoaWxkUGF0aHMuc2l6ZSgpID4gMCkKKwkJCQkJCWlnbm9yZUNoaWxkcmVuID0gaWdub3JlQ2hpbGRQYXRocy50b0FycmF5KG5ldyBQYXRoW2lnbm9yZUNoaWxkUGF0aHMuc2l6ZSgpXSk7CisJCQkJfQorCQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5jb3B5aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtuYW1lLCBuYW1lfSkpOworCQkJCUlTdGF0dXNbXSBzdGF0ID0gcHVibGlzaFNtYXJ0KGNoaWxkcmVuLCBwYXRoLmFwcGVuZChuYW1lKSwgaWdub3JlQ2hpbGRyZW4sIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIGR3KSk7CisJCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKKwkJCX0KKwkJfQorCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IFN0YXR1cy5DQU5DRUxfU1RBVFVTIH07CisJCQorCQltb25pdG9yLndvcmtlZCg1MDAgLSBkdyAqIHRvU2l6ZSk7CisJCW1vbml0b3IuZG9uZSgpOworCQkKKwkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKKwkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7CisJCXJldHVybiBzdGF0OworCX0KKworCS8qKgorCSAqIEhhbmRsZSBhIGRlbHRhIHB1Ymxpc2guCisJICogCisJICogQHBhcmFtIGRlbHRhIGEgbW9kdWxlIHJlc291cmNlIGRlbHRhCisJICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gcHVibGlzaCB0bworCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCisJICovCisJcHVibGljIElTdGF0dXNbXSBwdWJsaXNoRGVsdGEoSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWlmIChkZWx0YSA9PSBudWxsKQorCQkJcmV0dXJuIEVNUFRZX1NUQVRVUzsKKwkJCisJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKKwkJCisJCUxpc3Q8SVN0YXR1cz4gc3RhdHVzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigyKTsKKwkJaW50IHNpemUyID0gZGVsdGEubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKKwkJCUlTdGF0dXNbXSBzdGF0ID0gcHVibGlzaERlbHRhKGRlbHRhW2ldLCBwYXRoLCBtb25pdG9yKTsKKwkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7CisJCX0KKwkJCisJCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07CisJCXN0YXR1cy50b0FycmF5KHN0YXQpOworCQlyZXR1cm4gc3RhdDsKKwl9CisKKwkvKioKKwkgKiBIYW5kbGUgYSBkZWx0YSBwdWJsaXNoLgorCSAqIAorCSAqIEBwYXJhbSBkZWx0YSBhIG1vZHVsZSByZXNvdXJjZSBkZWx0YQorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHB1Ymxpc2ggdG8KKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cworCSAqLworCXB1YmxpYyBJU3RhdHVzW10gcHVibGlzaERlbHRhKElNb2R1bGVSZXNvdXJjZURlbHRhIGRlbHRhLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJTGlzdDxJU3RhdHVzPiBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KDIpOworCQkKKwkJSU1vZHVsZVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0TW9kdWxlUmVzb3VyY2UoKTsKKwkJaW50IGtpbmQyID0gZGVsdGEuZ2V0S2luZCgpOworCQkKKwkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpIHsKKwkJCUlNb2R1bGVGaWxlIGZpbGUgPSAoSU1vZHVsZUZpbGUpIHJlc291cmNlOworCQkJdHJ5IHsKKwkJCQlpZiAoa2luZDIgPT0gSU1vZHVsZVJlc291cmNlRGVsdGEuUkVNT1ZFRCkKKwkJCQkJZGVsZXRlRmlsZShwYXRoLCBmaWxlKTsKKwkJCQllbHNlIHsKKwkJCQkJSVBhdGggcGF0aDIgPSBwYXRoLmFwcGVuZChmaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQoZmlsZS5nZXROYW1lKCkpOworCQkJCQlGaWxlIGYgPSBwYXRoMi50b0ZpbGUoKS5nZXRQYXJlbnRGaWxlKCk7CisJCQkJCWlmICghZi5leGlzdHMoKSkKKwkJCQkJCWYubWtkaXJzKCk7CisJCQkJCQorCQkJCQljb3B5RmlsZShmaWxlLCBwYXRoMik7CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCXN0YXR1cy5hZGQoY2UuZ2V0U3RhdHVzKCkpOworCQkJfQorCQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKKwkJCXN0YXR1cy50b0FycmF5KHN0YXQpOworCQkJcmV0dXJuIHN0YXQ7CisJCX0KKwkJCisJCWlmIChraW5kMiA9PSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5BRERFRCkgeworCQkJSVBhdGggcGF0aDIgPSBwYXRoLmFwcGVuZChyZXNvdXJjZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkuYXBwZW5kKHJlc291cmNlLmdldE5hbWUoKSk7CisJCQlGaWxlIGZpbGUgPSBwYXRoMi50b0ZpbGUoKTsKKwkJCWlmICghZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5ta2RpcnMoKSkgeworCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvck1rZGlyLCBwYXRoMiksIG51bGwpKTsKKwkJCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOworCQkJCXN0YXR1cy50b0FycmF5KHN0YXQpOworCQkJCXJldHVybiBzdGF0OworCQkJfQorCQl9CisJCQorCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGNoaWxkRGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQlpbnQgc2l6ZSA9IGNoaWxkRGVsdGFzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCUlTdGF0dXNbXSBzdGF0ID0gcHVibGlzaERlbHRhKGNoaWxkRGVsdGFzW2ldLCBwYXRoLCBtb25pdG9yKTsKKwkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7CisJCX0KKwkJCisJCWlmIChraW5kMiA9PSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisJCQlJUGF0aCBwYXRoMiA9IHBhdGguYXBwZW5kKHJlc291cmNlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCUZpbGUgZmlsZSA9IHBhdGgyLnRvRmlsZSgpOworCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgIWZpbGUuZGVsZXRlKCkpIHsKKwkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgcGF0aDIpLCBudWxsKSk7CisJCQl9CisJCX0KKwkJCisJCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07CisJCXN0YXR1cy50b0FycmF5KHN0YXQpOworCQlyZXR1cm4gc3RhdDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZUZpbGUoSVBhdGggcGF0aCwgSU1vZHVsZUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlUcmFjZS50cmFjZShUcmFjZS5QVUJMSVNISU5HLCAiRGVsZXRpbmc6ICIgKyBmaWxlLmdldE5hbWUoKSArICIgZnJvbSAiICsgcGF0aC50b1N0cmluZygpKTsKKwkJSVBhdGggcGF0aDIgPSBwYXRoLmFwcGVuZChmaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQoZmlsZS5nZXROYW1lKCkpOworCQlpZiAocGF0aDIudG9GaWxlKCkuZXhpc3RzKCkgJiYgIXBhdGgyLnRvRmlsZSgpLmRlbGV0ZSgpKQorCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCBwYXRoMiksIG51bGwpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY29weUZpbGUoSU1vZHVsZUZpbGUgbWYsIElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJVHJhY2UudHJhY2UoVHJhY2UuUFVCTElTSElORywgIkNvcHlpbmc6ICIgKyBtZi5nZXROYW1lKCkgKyAiIHRvICIgKyBwYXRoLnRvU3RyaW5nKCkpOworCQkKKwkJSUZpbGUgZmlsZSA9IChJRmlsZSkgbWYuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7CisJCWlmIChmaWxlICE9IG51bGwpCisJCQljb3B5RmlsZShmaWxlLmdldENvbnRlbnRzKCksIHBhdGgsIGZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKSwgbWYpOworCQllbHNlIHsKKwkJCUZpbGUgZmlsZTIgPSAoRmlsZSkgbWYuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKKwkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUmVhZGluZywgZmlsZTIuZ2V0QWJzb2x1dGVQYXRoKCkpLCBlKSk7CisJCQl9CisJCQljb3B5RmlsZShpbiwgcGF0aCwgZmlsZTIubGFzdE1vZGlmaWVkKCksIG1mKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFB1Ymxpc2ggdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCisJICogCisJICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCisJICogQHBhcmFtIHBhdGggYSBwYXRoIHRvIHB1Ymxpc2ggdG8KKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cworCSAqLworCXB1YmxpYyBJU3RhdHVzW10gcHVibGlzaEZ1bGwoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKHJlc291cmNlcyA9PSBudWxsKQorCQkJcmV0dXJuIEVNUFRZX1NUQVRVUzsKKwkJCisJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKKwkJCisJCUxpc3Q8SVN0YXR1cz4gc3RhdHVzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigyKTsKKwkJaW50IHNpemUgPSByZXNvdXJjZXMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJSVN0YXR1c1tdIHN0YXQgPSBjb3B5KHJlc291cmNlc1tpXSwgcGF0aCwgbW9uaXRvcik7CisJCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOworCQl9CisJCQorCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOworCQlzdGF0dXMudG9BcnJheShzdGF0KTsKKwkJcmV0dXJuIHN0YXQ7CisJfQorCisJcHJpdmF0ZSBJU3RhdHVzW10gY29weShJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2UsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKKwkJVHJhY2UudHJhY2UoVHJhY2UuUFVCTElTSElORywgIkNvcHlpbmc6ICIgKyBuYW1lICsgIiB0byAiICsgcGF0aC50b1N0cmluZygpKTsKKwkJTGlzdDxJU3RhdHVzPiBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KDIpOworCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7CisJCQlJTW9kdWxlRm9sZGVyIGZvbGRlciA9IChJTW9kdWxlRm9sZGVyKSByZXNvdXJjZTsKKwkJCUlTdGF0dXNbXSBzdGF0ID0gcHVibGlzaEZ1bGwoZm9sZGVyLm1lbWJlcnMoKSwgcGF0aCwgbW9uaXRvcik7CisJCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOworCQl9IGVsc2UgeworCQkJSU1vZHVsZUZpbGUgbWYgPSAoSU1vZHVsZUZpbGUpIHJlc291cmNlOworCQkJcGF0aCA9IHBhdGguYXBwZW5kKG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQobmFtZSk7CisJCQlGaWxlIGYgPSBwYXRoLnRvRmlsZSgpLmdldFBhcmVudEZpbGUoKTsKKwkJCWlmICghZi5leGlzdHMoKSkKKwkJCQlmLm1rZGlycygpOworCQkJdHJ5IHsKKwkJCQljb3B5RmlsZShtZiwgcGF0aCk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJc3RhdHVzLmFkZChjZS5nZXRTdGF0dXMoKSk7CisJCQl9CisJCX0KKwkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKKwkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7CisJCXJldHVybiBzdGF0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgemlwIGZpbGUgY29udGFpbmluZyB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcy4gRGVsZXRlcyB0aGUgZXhpc3RpbmcgZmlsZQorCSAqIChhbmQgZG9lc24ndCBjcmVhdGUgYSBuZXcgb25lKSBpZiByZXNvdXJjZXMgaXMgbnVsbCBvciBlbXB0eS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB3aGVyZSB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQgCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcworCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAorCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKKwkgKi8KKwlwdWJsaWMgSVN0YXR1c1tdIHB1Ymxpc2haaXAoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKHJlc291cmNlcyA9PSBudWxsIHx8IHJlc291cmNlcy5sZW5ndGggPT0gMCkgeworCQkJLy8gc2hvdWxkIGFsc28gY2hlY2sgaWYgcmVzb3VyY2VzIGNvbnNpc3RzIG9mIGFsbCBlbXB0eSBkaXJlY3RvcmllcworCQkJRmlsZSBmaWxlID0gcGF0aC50b0ZpbGUoKTsKKwkJCWlmIChmaWxlLmV4aXN0cygpKQorCQkJCWZpbGUuZGVsZXRlKCk7CisJCQlyZXR1cm4gRU1QVFlfU1RBVFVTOworCQl9CisJCQorCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7CisJCQorCQlGaWxlIHRlbXBGaWxlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUZpbGUgZmlsZSA9IHBhdGgudG9GaWxlKCk7CisJCQl0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoVEVNUEZJTEVfUFJFRklYLCAiLiIgKyBwYXRoLmdldEZpbGVFeHRlbnNpb24oKSwgdGVtcERpcik7CisJCQkKKwkJCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpKTsKKwkJCVppcE91dHB1dFN0cmVhbSB6b3V0ID0gbmV3IFppcE91dHB1dFN0cmVhbShib3V0KTsKKwkJCWFkZFppcEVudHJpZXMoem91dCwgcmVzb3VyY2VzKTsKKwkJCXpvdXQuY2xvc2UoKTsKKwkJCQorCQkJbW92ZVRlbXBGaWxlKHRlbXBGaWxlLCBmaWxlKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IGUuZ2V0U3RhdHVzKCkgfTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHppcHBpbmciLCBlKTsKKwkJCXJldHVybiBuZXcgU3RhdHVzW10geyBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ3JlYXRpbmdaaXBGaWxlLCBwYXRoLmxhc3RTZWdtZW50KCksIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwgZSkgfTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmICh0ZW1wRmlsZSAhPSBudWxsICYmIHRlbXBGaWxlLmV4aXN0cygpKQorCQkJCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworCQl9CisJCXJldHVybiBFTVBUWV9TVEFUVVM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRaaXBFbnRyaWVzKFppcE91dHB1dFN0cmVhbSB6b3V0LCBJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAocmVzb3VyY2VzID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAocmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgeworCQkJCUlNb2R1bGVGb2xkZXIgbWYgPSAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2VzW2ldOworCQkJCUlNb2R1bGVSZXNvdXJjZVtdIHJlcyA9IG1mLm1lbWJlcnMoKTsKKwkJCQkKKwkJCQlJUGF0aCBwYXRoID0gbWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuYXBwZW5kKG1mLmdldE5hbWUoKSk7CisJCQkJU3RyaW5nIGVudHJ5UGF0aCA9IHBhdGgudG9Qb3J0YWJsZVN0cmluZygpOworCQkJCWlmICghZW50cnlQYXRoLmVuZHNXaXRoKCIvIikpCisJCQkJCWVudHJ5UGF0aCArPSAnLyc7CisJCQkJCisJCQkJWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoZW50cnlQYXRoKTsKKwkJCQkKKwkJCQlsb25nIHRzID0gMDsKKwkJCQlJQ29udGFpbmVyIGZvbGRlciA9IChJQ29udGFpbmVyKSBtZi5nZXRBZGFwdGVyKElDb250YWluZXIuY2xhc3MpOworCQkJCWlmIChmb2xkZXIgIT0gbnVsbCkKKwkJCQkJdHMgPSBmb2xkZXIuZ2V0TG9jYWxUaW1lU3RhbXAoKTsKKwkJCQkKKwkJCQlpZiAodHMgIT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgdHMgIT0gMCkKKwkJCQkJemUuc2V0VGltZSh0cyk7CisJCQkJCisJCQkJem91dC5wdXROZXh0RW50cnkoemUpOworCQkJCXpvdXQuY2xvc2VFbnRyeSgpOworCQkJCQorCQkJCWFkZFppcEVudHJpZXMoem91dCwgcmVzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorCQkJSU1vZHVsZUZpbGUgbWYgPSAoSU1vZHVsZUZpbGUpIHJlc291cmNlc1tpXTsKKwkJCUlQYXRoIHBhdGggPSBtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5hcHBlbmQobWYuZ2V0TmFtZSgpKTsKKwkJCQorCQkJWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkocGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOworCQkJCisJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisJCQlsb25nIHRzID0gMDsKKwkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIG1mLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOworCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCXRzID0gZmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpOworCQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOworCQkJfSBlbHNlIHsKKwkJCQlGaWxlIGZpbGUyID0gKEZpbGUpIG1mLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7CisJCQkJdHMgPSBmaWxlMi5sYXN0TW9kaWZpZWQoKTsKKwkJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTIpOworCQkJfQorCQkJCisJCQlpZiAodHMgIT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgdHMgIT0gMCkKKwkJCQl6ZS5zZXRUaW1lKHRzKTsKKwkJCQorCQkJem91dC5wdXROZXh0RW50cnkoemUpOworCQkJCisJCQl0cnkgeworCQkJCWludCBuID0gMDsKKwkJCQl3aGlsZSAobiA+IC0xKSB7CisJCQkJCW4gPSBpbi5yZWFkKGJ1Zik7CisJCQkJCWlmIChuID4gMCkKKwkJCQkJCXpvdXQud3JpdGUoYnVmLCAwLCBuKTsKKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCWluLmNsb3NlKCk7CisJCQl9CisJCQkKKwkJCXpvdXQuY2xvc2VFbnRyeSgpOworCQl9CisJfQorCisJLyoqCisJICogVXRpbGl0eSBtZXRob2QgdG8gbW92ZSBhIHRlbXAgZmlsZSBpbnRvIHBvc2l0aW9uIGJ5IGRlbGV0aW5nIHRoZSBvcmlnaW5hbCBhbmQKKwkgKiBzd2FwcGluZyBpbiBhIG5ldyBjb3B5LgorCSAqICAKKwkgKiBAcGFyYW0gdGVtcEZpbGUKKwkgKiBAcGFyYW0gZmlsZQorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBtb3ZlVGVtcEZpbGUoRmlsZSB0ZW1wRmlsZSwgRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChmaWxlLmV4aXN0cygpKSB7CisJCQlpZiAoIXNhZmVEZWxldGUoZmlsZSwgMikpIHsKKwkJCQkvLyBhdHRlbXB0IHRvIHJld3JpdGUgYW4gZXhpc3RpbmcgZmlsZSB3aXRoIHRoZSB0ZW1wRmlsZSBjb250ZW50cyBpZgorCQkJCS8vIHRoZSBleGlzdGluZyBmaWxlIGNhbid0IGJlIGRlbGV0ZWQgdG8gcGVybWl0IHRoZSBtb3ZlCisJCQkJdHJ5IHsKKwkJCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKTsKKwkJCQkJSVN0YXR1cyBzdGF0dXMgPSBjb3B5RmlsZShpbiwgZmlsZS5nZXRQYXRoKCkpOworCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKKwkJCQkJCU11bHRpU3RhdHVzIHN0YXR1czIgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgZmlsZS50b1N0cmluZygpKSwgbnVsbCk7CisJCQkJCQlzdGF0dXMyLmFkZChzdGF0dXMpOworCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzMik7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIHNob3VsZG4ndCBvY2N1cgorCQkJCX0gZmluYWxseSB7CisJCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOworCQkJCX0KKwkJCQkvKmlmICghc2FmZURlbGV0ZShmaWxlLCA4KSkgeworCQkJCQl0ZW1wRmlsZS5kZWxldGUoKTsKKwkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCBmaWxlLnRvU3RyaW5nKCkpLCBudWxsKSk7CisJCQkJfSovCisJCQl9CisJCX0KKwkJaWYgKCFzYWZlUmVuYW1lKHRlbXBGaWxlLCBmaWxlLCAxMCkpCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUmVuYW1lLCB0ZW1wRmlsZS50b1N0cmluZygpKSwgbnVsbCkpOworCX0KKworCS8qKgorCSAqIENvcHkgYSBmaWxlIGZyb20gYSB0byBiLiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbSBhZnRlciB1c2UuCisJICoKKwkgKiBAcGFyYW0gaW4gYW4gSW5wdXRTdHJlYW0KKwkgKiBAcGFyYW0gdG8gdGhlIGZpbGUgdG8gY29weSB0bworCSAqIEByZXR1cm4gYSBzdGF0dXMKKwkgKi8KKwlwcml2YXRlIElTdGF0dXMgY29weUZpbGUoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyB0bykgeworCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKwkJCisJCXRyeSB7CisJCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0byk7CisJCQkKKwkJCWludCBhdmFpbCA9IGluLnJlYWQoYnVmKTsKKwkJCXdoaWxlIChhdmFpbCA+IDApIHsKKwkJCQlvdXQud3JpdGUoYnVmLCAwLCBhdmFpbCk7CisJCQkJYXZhaWwgPSBpbi5yZWFkKGJ1Zik7CisJCQl9CisJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNvcHlpbmcgZmlsZSIsIGUpOworCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3B5aW5nRmlsZSwgbmV3IFN0cmluZ1tdIHt0bywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChpbiAhPSBudWxsKQorCQkJCQlpbi5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCQl0cnkgeworCQkJCWlmIChvdXQgIT0gbnVsbCkKKwkJCQkJb3V0LmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNhZmUgZGVsZXRlLiBUcmllcyB0byBkZWxldGUgbXVsdGlwbGUgdGltZXMgYmVmb3JlIGdpdmluZyB1cC4KKwkgKiAKKwkgKiBAcGFyYW0gZgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgc3VjY2VlZHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhZmVEZWxldGUoRmlsZSBmLCBpbnQgcmV0cnlzKSB7CisJCWludCBjb3VudCA9IDA7CisJCXdoaWxlIChjb3VudCA8IHJldHJ5cykgeworCQkJaWYgKCFmLmV4aXN0cygpKQorCQkJCXJldHVybiB0cnVlOworCQkJCisJCQlmLmRlbGV0ZSgpOworCQkJCisJCQlpZiAoIWYuZXhpc3RzKCkpCisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCWNvdW50Kys7CisJCQkvLyBkZWxheSBpZiB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGFnYWluCisJCQlpZiAoY291bnQgPCByZXRyeXMpIHsKKwkJCQl0cnkgeworCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFNhZmUgcmVuYW1lLiBXaWxsIHRyeSBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgZ2l2aW5nIHVwLgorCSAqIAorCSAqIEBwYXJhbSBmcm9tCisJICogQHBhcmFtIHRvCisJICogQHBhcmFtIHJldHJ5cyBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnkKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IHN1Y2NlZWRzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzYWZlUmVuYW1lKEZpbGUgZnJvbSwgRmlsZSB0bywgaW50IHJldHJ5cykgeworCQkvLyBtYWtlIHN1cmUgcGFyZW50IGRpciBleGlzdHMKKwkJRmlsZSBkaXIgPSB0by5nZXRQYXJlbnRGaWxlKCk7CisJCWlmIChkaXIgIT0gbnVsbCAmJiAhZGlyLmV4aXN0cygpKQorCQkJZGlyLm1rZGlycygpOworCQkKKwkJaW50IGNvdW50ID0gMDsKKwkJd2hpbGUgKGNvdW50IDwgcmV0cnlzKSB7CisJCQlpZiAoZnJvbS5yZW5hbWVUbyh0bykpCisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCWNvdW50Kys7CisJCQkvLyBkZWxheSBpZiB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGFnYWluCisJCQlpZiAoY291bnQgPCByZXRyeXMpIHsKKwkJCQl0cnkgeworCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQXJyYXlUb0xpc3QoTGlzdDxJU3RhdHVzPiBsaXN0LCBJU3RhdHVzW10gYSkgeworCQlpZiAobGlzdCA9PSBudWxsIHx8IGEgPT0gbnVsbCB8fCBhLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuOworCQkKKwkJaW50IHNpemUgPSBhLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQlsaXN0LmFkZChhW2ldKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoVXRpbC5qYXZhCmluZGV4IGRmM2RhM2IuLjY2ZTAyNDcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHVibGlzaFV0aWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1B1Ymxpc2hVdGlsLmphdmEKQEAgLTExLDIyICsxMSw4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwogCiBpbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHJvZ3Jlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwogLyoqCkBAIC0zNSwyNiArMjEsMTAgQEAKICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggc3RhdGljIG1lbWJlcnMuCiAgKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvciBpbnN0YW50aWF0ZWQuCiAgKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgUHVibGlzaFV0aWwgewotCS8vIHNpemUgb2YgdGhlIGJ1ZmZlcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVIgPSA2NTUzNjsKLQotCS8vIHRoZSBidWZmZXIKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYnVmID0gbmV3IGJ5dGVbQlVGRkVSXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXNbXSBFTVBUWV9TVEFUVVMgPSBuZXcgSVN0YXR1c1swXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdGVtcERpciA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS50b0ZpbGUoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUEZJTEVfUFJFRklYID0gInRtcCI7CisJcHJpdmF0ZSBzdGF0aWMgUHVibGlzaEhlbHBlciBwdWJsaXNoSGVscGVyID0gbmV3IFB1Ymxpc2hIZWxwZXIobnVsbCk7CiAKIAkvKioKIAkgKiBQdWJsaXNoVXRpbCBjYW5ub3QgYmUgY3JlYXRlZC4gVXNlIHN0YXRpYyBtZXRob2RzLgpAQCAtNjQsNjEgKzM0LDYgQEAKIAl9CiAKIAkvKioKLQkgKiBDb3B5IGEgZmlsZSBmcm9tIGEgdG8gYi4gQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgdXNlLgotCSAqIAotCSAqIEBwYXJhbSBpbiBhbiBpbnB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gdG8gYSBwYXRoIHRvIGNvcHkgdG8uIHRoZSBkaXJlY3RvcnkgbXVzdCBhbHJlYWR5IGV4aXN0Ci0JICogQHBhcmFtIHRzIHRpbWVzdGFtcAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5RmlsZShJbnB1dFN0cmVhbSBpbiwgSVBhdGggdG8sIGxvbmcgdHMsIElNb2R1bGVGaWxlIG1mKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQkKLQkJRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSB0by50b0ZpbGUoKTsKLQkJCXRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShURU1QRklMRV9QUkVGSVgsICIuIiArIHRvLmdldEZpbGVFeHRlbnNpb24oKSwgdGVtcERpcik7Ci0JCQkKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKLQkJCQotCQkJaW50IGF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJd2hpbGUgKGF2YWlsID4gMCkgewotCQkJCW91dC53cml0ZShidWYsIDAsIGF2YWlsKTsKLQkJCQlhdmFpbCA9IGluLnJlYWQoYnVmKTsKLQkJCX0KLQkJCQotCQkJb3V0LmNsb3NlKCk7Ci0JCQlvdXQgPSBudWxsOwotCQkJCi0JCQltb3ZlVGVtcEZpbGUodGVtcEZpbGUsIGZpbGUpOwotCQkJCi0JCQlpZiAodHMgIT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgdHMgIT0gMCkKLQkJCQlmaWxlLnNldExhc3RNb2RpZmllZCh0cyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUlQYXRoIHBhdGggPSBtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5hcHBlbmQobWYuZ2V0TmFtZSgpKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNvcHlpbmcgZmlsZTogIiArIHRvLnRvT1NTdHJpbmcoKSArICIgdG8gIiArIHBhdGgudG9PU1N0cmluZygpLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3B5aW5nRmlsZSwgcGF0aC50b09TU3RyaW5nKCksIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwgbnVsbCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRlbXBGaWxlICE9IG51bGwgJiYgdGVtcEZpbGUuZXhpc3RzKCkpCi0JCQkJdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qKgogCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeS4KIAkgKgogCSAqIEBwYXJhbSBkaXIgYSBkaXJlY3RvcnkKQEAgLTEyNyw0NyArNDIsNyBAQAogCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoIWRpci5leGlzdHMoKSB8fCAhZGlyLmlzRGlyZWN0b3J5KCkpCi0JCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JOb3RBRGlyZWN0b3J5LCBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpLCBudWxsKSB9OwotCQkKLQkJTGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQkKLQkJdHJ5IHsKLQkJCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLQkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdUYXNrLCBuZXcgU3RyaW5nW10geyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgfSksIHNpemUgKiAxMCk7Ci0JCQkKLQkJCS8vIGN5Y2xlIHRocm91Z2ggZmlsZXMKLQkJCWJvb2xlYW4gZGVsZXRlQ3VycmVudCA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUZpbGUgY3VycmVudCA9IGZpbGVzW2ldOwotCQkJCWlmIChjdXJyZW50LmlzRmlsZSgpKSB7Ci0JCQkJCWlmICghY3VycmVudC5kZWxldGUoKSkgewotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCkpOwotCQkJCQkJZGVsZXRlQ3VycmVudCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEwKTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnQuaXNEaXJlY3RvcnkoKSkgewotCQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdUYXNrLCBuZXcgU3RyaW5nW10ge2N1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCl9KSk7Ci0JCQkJCUlTdGF0dXNbXSBzdGF0ID0gZGVsZXRlRGlyZWN0b3J5KGN1cnJlbnQsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwKSk7Ci0JCQkJCWlmIChzdGF0ICE9IG51bGwgJiYgc3RhdC5sZW5ndGggPiAwKSB7Ci0JCQkJCQlkZWxldGVDdXJyZW50ID0gZmFsc2U7Ci0JCQkJCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRlbGV0ZUN1cnJlbnQgJiYgIWRpci5kZWxldGUoKSkKLQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgZGlyLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCkpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBkZWxldGluZyBkaXJlY3RvcnkgIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgZSk7Ci0JCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJfQotCQkKLQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCXJldHVybiBzdGF0OworCQlyZXR1cm4gUHVibGlzaEhlbHBlci5kZWxldGVEaXJlY3RvcnkoZGlyLCBtb25pdG9yKTsKIAl9CiAKIAkvKioKQEAgLTE4MCwxNDcgKzU1LDIxIEBACiAJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cyAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoU21hcnQoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZX1NUQVRVUzsKLQkJCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCi0JCUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJRmlsZSB0b0RpciA9IHBhdGgudG9GaWxlKCk7Ci0JCWludCBmcm9tU2l6ZSA9IHJlc291cmNlcy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGZyb21GaWxlTmFtZXMgPSBuZXcgU3RyaW5nW2Zyb21TaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tU2l6ZTsgaSsrKQotCQkJZnJvbUZpbGVOYW1lc1tpXSA9IHJlc291cmNlc1tpXS5nZXROYW1lKCk7Ci0JCQotCQkvLwljYWNoZSBmaWxlcyBhbmQgZmlsZSBuYW1lcyBmb3IgcGVyZm9ybWFuY2UKLQkJRmlsZVtdIHRvRmlsZXMgPSBudWxsOwotCQlTdHJpbmdbXSB0b0ZpbGVOYW1lcyA9IG51bGw7Ci0JCQotCQlib29sZWFuIGZvdW5kRXhpc3RpbmdEaXIgPSBmYWxzZTsKLQkJaWYgKHRvRGlyLmV4aXN0cygpKSB7Ci0JCQlpZiAodG9EaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCWZvdW5kRXhpc3RpbmdEaXIgPSB0cnVlOwotCQkJCXRvRmlsZXMgPSB0b0Rpci5saXN0RmlsZXMoKTsKLQkJCQlpbnQgdG9TaXplID0gdG9GaWxlcy5sZW5ndGg7Ci0JCQkJdG9GaWxlTmFtZXMgPSBuZXcgU3RyaW5nW3RvU2l6ZV07Ci0JCQkJCi0JCQkJLy8gY2hlY2sgaWYgdGhpcyBleGFjdCBmaWxlIGV4aXN0cyBpbiB0aGUgbmV3IGRpcmVjdG9yeQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9TaXplOyBpKyspIHsKLQkJCQkJdG9GaWxlTmFtZXNbaV0gPSB0b0ZpbGVzW2ldLmdldE5hbWUoKTsKLQkJCQkJYm9vbGVhbiBpc0RpciA9IHRvRmlsZXNbaV0uaXNEaXJlY3RvcnkoKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZyb21TaXplOyBqKyspIHsKLQkJCQkJCWlmICh0b0ZpbGVOYW1lc1tpXS5lcXVhbHMoZnJvbUZpbGVOYW1lc1tqXSkgJiYgaXNEaXIgPT0gcmVzb3VyY2VzW2pdIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIGRlbGV0ZSBmaWxlIGlmIGl0IGNhbid0IGJlIGZvdW5kIG9yIGlzbid0IHRoZSBjb3JyZWN0IHR5cGUKLQkJCQkJaWYgKCFmb3VuZCkgewotCQkJCQkJaWYgKGlzRGlyKSB7Ci0JCQkJCQkJSVN0YXR1c1tdIHN0YXQgPSBkZWxldGVEaXJlY3RvcnkodG9GaWxlc1tpXSwgbnVsbCk7Ci0JCQkJCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKCF0b0ZpbGVzW2ldLmRlbGV0ZSgpKQotCQkJCQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgdG9GaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKLQkJCQkJCX0KLQkJCQkJCXRvRmlsZXNbaV0gPSBudWxsOwotCQkJCQkJdG9GaWxlTmFtZXNbaV0gPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy9pZiAodG9EaXIuaXNGaWxlKCkpCi0JCQkJaWYgKCF0b0Rpci5kZWxldGUoKSkgewotCQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgdG9EaXIuZ2V0QWJzb2x1dGVQYXRoKCkpLCBudWxsKSk7Ci0JCQkJCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCQkJCXN0YXR1cy50b0FycmF5KHN0YXQpOwotCQkJCQlyZXR1cm4gc3RhdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZEV4aXN0aW5nRGlyICYmICF0b0Rpci5ta2RpcnMoKSkgewotCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTWtkaXIsIHRvRGlyLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCkpOwotCQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJCXN0YXR1cy50b0FycmF5KHN0YXQpOwotCQkJcmV0dXJuIHN0YXQ7Ci0JCX0KLQkJCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybiBuZXcgSVN0YXR1c1tdIHsgU3RhdHVzLkNBTkNFTF9TVEFUVVMgfTsKLQkJCi0JCW1vbml0b3Iud29ya2VkKDUwKTsKLQkJCi0JCS8vIGN5Y2xlIHRocm91Z2ggZmlsZXMgYW5kIG9ubHkgY29weSB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QKLQkJLy8gb3IgaXMgbmV3ZXIKLQkJaWYgKHRvRmlsZXMgPT0gbnVsbCkKLQkJCXRvRmlsZXMgPSB0b0Rpci5saXN0RmlsZXMoKTsKLQkJaW50IHRvU2l6ZSA9IDA7Ci0JCWlmICh0b0ZpbGVzICE9IG51bGwpCi0JCQl0b1NpemUgPSB0b0ZpbGVzLmxlbmd0aDsKLQkJCi0JCWludCBkdyA9IDA7Ci0JCWlmICh0b1NpemUgPiAwKQotCQkJZHcgPSA1MDAgLyB0b1NpemU7Ci0JCQotCQkvLyBjYWNoZSBmaWxlIG5hbWVzIGFuZCBsYXN0IG1vZGlmaWVkIGRhdGVzIGZvciBwZXJmb3JtYW5jZQotCQlpZiAodG9GaWxlTmFtZXMgPT0gbnVsbCkKLQkJCXRvRmlsZU5hbWVzID0gbmV3IFN0cmluZ1t0b1NpemVdOwotCQlsb25nW10gdG9GaWxlTW9kID0gbmV3IGxvbmdbdG9TaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1NpemU7IGkrKykgewotCQkJaWYgKHRvRmlsZXNbaV0gIT0gbnVsbCkgewotCQkJCWlmICh0b0ZpbGVOYW1lc1tpXSAhPSBudWxsKQotCQkJCQl0b0ZpbGVOYW1lc1tpXSA9IHRvRmlsZXNbaV0uZ2V0TmFtZSgpOwotCQkJCXRvRmlsZU1vZFtpXSA9IHRvRmlsZXNbaV0ubGFzdE1vZGlmaWVkKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJvbVNpemU7IGkrKykgewotCQkJSU1vZHVsZVJlc291cmNlIGN1cnJlbnQgPSByZXNvdXJjZXNbaV07Ci0JCQlTdHJpbmcgbmFtZSA9IGZyb21GaWxlTmFtZXNbaV07Ci0JCQlib29sZWFuIGN1cnJlbnRJc0RpciA9IGN1cnJlbnQgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyOwotCQkJCi0JCQlpZiAoIWN1cnJlbnRJc0RpcikgewotCQkJCS8vIGNoZWNrIGlmIHRoaXMgaXMgYSBuZXcgb3IgbmV3ZXIgZmlsZQotCQkJCWJvb2xlYW4gY29weSA9IHRydWU7Ci0JCQkJSU1vZHVsZUZpbGUgbWYgPSAoSU1vZHVsZUZpbGUpIGN1cnJlbnQ7Ci0JCQkJCi0JCQkJbG9uZyBtb2QgPSAtMTsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtZi5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCW1vZCA9IGZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlGaWxlIGZpbGUyID0gKEZpbGUpIG1mLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7Ci0JCQkJCW1vZCA9IGZpbGUyLmxhc3RNb2RpZmllZCgpOwotCQkJCX0KLQkJCQkKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRvU2l6ZTsgaisrKSB7Ci0JCQkJCWlmIChuYW1lLmVxdWFscyh0b0ZpbGVOYW1lc1tqXSkgJiYgbW9kID09IHRvRmlsZU1vZFtqXSkKLQkJCQkJCWNvcHkgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGNvcHkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvcHlGaWxlKG1mLCBwYXRoLmFwcGVuZChuYW1lKSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCXN0YXR1cy5hZGQoY2UuZ2V0U3RhdHVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1vbml0b3Iud29ya2VkKGR3KTsKLQkJCX0gZWxzZSB7IC8vaWYgKGN1cnJlbnRJc0RpcikgewotCQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIGN1cnJlbnQ7Ci0JCQkJSU1vZHVsZVJlc291cmNlW10gY2hpbGRyZW4gPSBmb2xkZXIubWVtYmVycygpOwotCQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5jb3B5aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtuYW1lLCBuYW1lfSkpOwotCQkJCUlTdGF0dXNbXSBzdGF0ID0gcHVibGlzaFNtYXJ0KGNoaWxkcmVuLCBwYXRoLmFwcGVuZChuYW1lKSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgZHcpKTsKLQkJCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQkJfQotCQl9Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybiBuZXcgSVN0YXR1c1tdIHsgU3RhdHVzLkNBTkNFTF9TVEFUVVMgfTsKLQkJCi0JCW1vbml0b3Iud29ya2VkKDUwMCAtIGR3ICogdG9TaXplKTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JCQotCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJcmV0dXJuIHN0YXQ7CisJCXJldHVybiBwdWJsaXNoSGVscGVyLnB1Ymxpc2hTbWFydChyZXNvdXJjZXMsIHBhdGgsIG1vbml0b3IpOworCX0KKworCS8qKgorCSAqIFNtYXJ0IGNvcHkgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCisJICogCisJICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCisJICogQHBhcmFtIHBhdGggYW4gZXh0ZXJuYWwgcGF0aCB0byBjb3B5IHRvCisJICogQHBhcmFtIGlnbm9yZSBhbiBhcnJheSBvZiBwYXRocyByZWxhdGl2ZSB0byBwYXRoIHRvIGlnbm9yZSwgaS5lLiBub3QgZGVsZXRlIG9yIGNvcHkgb3ZlcgorCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKKwkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKKwkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzIAorCSAqLworCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIHB1Ymxpc2hTbWFydChJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgsIElQYXRoW10gaWdub3JlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJcmV0dXJuIHB1Ymxpc2hIZWxwZXIucHVibGlzaFNtYXJ0KHJlc291cmNlcywgcGF0aCwgaWdub3JlLCBtb25pdG9yKTsKIAl9CiAKIAkvKioKQEAgLTMzMywyMSArODIsNyBAQAogCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoRGVsdGEoSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChkZWx0YSA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZX1NUQVRVUzsKLQkJCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCi0JCUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJaW50IHNpemUyID0gZGVsdGEubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCUlTdGF0dXNbXSBzdGF0ID0gcHVibGlzaERlbHRhKGRlbHRhW2ldLCBwYXRoLCBtb25pdG9yKTsKLQkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCX0KLQkJCi0JCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCXN0YXR1cy50b0FycmF5KHN0YXQpOwotCQlyZXR1cm4gc3RhdDsKKwkJcmV0dXJuIHB1Ymxpc2hIZWxwZXIucHVibGlzaERlbHRhKGRlbHRhLCBwYXRoLCBtb25pdG9yKTsKIAl9CiAKIAkvKioKQEAgLTM2MCw4NiArOTUsNyBAQAogCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoRGVsdGEoSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRNb2R1bGVSZXNvdXJjZSgpOwotCQlpbnQga2luZDIgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJSU1vZHVsZUZpbGUgZmlsZSA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2U7Ci0JCQl0cnkgewotCQkJCWlmIChraW5kMiA9PSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQotCQkJCQlkZWxldGVGaWxlMihwYXRoLCBmaWxlKTsKLQkJCQllbHNlIHsKLQkJCQkJSVBhdGggcGF0aDIgPSBwYXRoLmFwcGVuZChmaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQoZmlsZS5nZXROYW1lKCkpOwotCQkJCQlGaWxlIGYgPSBwYXRoMi50b0ZpbGUoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCWlmICghZi5leGlzdHMoKSkKLQkJCQkJCWYubWtkaXJzKCk7Ci0JCQkJCQotCQkJCQljb3B5RmlsZShmaWxlLCBwYXRoMik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCXN0YXR1cy5hZGQoY2UuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJCXN0YXR1cy50b0FycmF5KHN0YXQpOwotCQkJcmV0dXJuIHN0YXQ7Ci0JCX0KLQkJCi0JCWlmIChraW5kMiA9PSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5BRERFRCkgewotCQkJSVBhdGggcGF0aDIgPSBwYXRoLmFwcGVuZChyZXNvdXJjZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkuYXBwZW5kKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQlGaWxlIGZpbGUgPSBwYXRoMi50b0ZpbGUoKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5ta2RpcnMoKSkgewotCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvck1rZGlyLCBwYXRoMiksIG51bGwpKTsKLQkJCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQkJCXN0YXR1cy50b0FycmF5KHN0YXQpOwotCQkJCXJldHVybiBzdGF0OwotCQkJfQotCQl9Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGNoaWxkRGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQlpbnQgc2l6ZSA9IGNoaWxkRGVsdGFzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlTdGF0dXNbXSBzdGF0ID0gcHVibGlzaERlbHRhKGNoaWxkRGVsdGFzW2ldLCBwYXRoLCBtb25pdG9yKTsKLQkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCX0KLQkJCi0JCWlmIChraW5kMiA9PSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQlJUGF0aCBwYXRoMiA9IHBhdGguYXBwZW5kKHJlc291cmNlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCUZpbGUgZmlsZSA9IHBhdGgyLnRvRmlsZSgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgIWZpbGUuZGVsZXRlKCkpIHsKLQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgcGF0aDIpLCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCXN0YXR1cy50b0FycmF5KHN0YXQpOwotCQlyZXR1cm4gc3RhdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZUZpbGUyKElQYXRoIHBhdGgsIElNb2R1bGVGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUFVCTElTSElORywgIkRlbGV0aW5nOiAiICsgZmlsZS5nZXROYW1lKCkgKyAiIGZyb20gIiArIHBhdGgudG9TdHJpbmcoKSk7Ci0JCUlQYXRoIHBhdGgyID0gcGF0aC5hcHBlbmQoZmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkuYXBwZW5kKGZpbGUuZ2V0TmFtZSgpKTsKLQkJaWYgKHBhdGgyLnRvRmlsZSgpLmV4aXN0cygpICYmICFwYXRoMi50b0ZpbGUoKS5kZWxldGUoKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgcGF0aDIpLCBudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5RmlsZShJTW9kdWxlRmlsZSBtZiwgSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5QVUJMSVNISU5HLCAiQ29weWluZzogIiArIG1mLmdldE5hbWUoKSArICIgdG8gIiArIHBhdGgudG9TdHJpbmcoKSk7Ci0JCQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtZi5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCWNvcHlGaWxlKGZpbGUuZ2V0Q29udGVudHMoKSwgcGF0aCwgZmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpLCBtZik7Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlMiA9IChGaWxlKSBtZi5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JSZWFkaW5nLCBmaWxlMi5nZXRBYnNvbHV0ZVBhdGgoKSksIGUpKTsKLQkJCX0KLQkJCWNvcHlGaWxlKGluLCBwYXRoLCBmaWxlMi5sYXN0TW9kaWZpZWQoKSwgbWYpOwotCQl9CisJCXJldHVybiBwdWJsaXNoSGVscGVyLnB1Ymxpc2hEZWx0YShkZWx0YSwgcGF0aCwgbW9uaXRvcik7CiAJfQogCiAJLyoqCkBAIC00NTIsNDYgKzEwOCw3IEBACiAJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cwogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIHB1Ymxpc2hGdWxsKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9TVEFUVVM7Ci0JCQotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQotCQlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCWludCBzaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlTdGF0dXNbXSBzdGF0ID0gY29weShyZXNvdXJjZXNbaV0sIHBhdGgsIG1vbml0b3IpOwotCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJfQotCQkKLQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCXJldHVybiBzdGF0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIElTdGF0dXNbXSBjb3B5KElNb2R1bGVSZXNvdXJjZSByZXNvdXJjZSwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQlUcmFjZS50cmFjZShUcmFjZS5QVUJMSVNISU5HLCAiQ29weWluZzogIiArIG5hbWUgKyAiIHRvICIgKyBwYXRoLnRvU3RyaW5nKCkpOwotCQlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIHJlc291cmNlOwotCQkJSVN0YXR1c1tdIHN0YXQgPSBwdWJsaXNoRnVsbChmb2xkZXIubWVtYmVycygpLCBwYXRoLCBtb25pdG9yKTsKLQkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCX0gZWxzZSB7Ci0JCQlJTW9kdWxlRmlsZSBtZiA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2U7Ci0JCQlwYXRoID0gcGF0aC5hcHBlbmQobWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChuYW1lKTsKLQkJCUZpbGUgZiA9IHBhdGgudG9GaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKCFmLmV4aXN0cygpKQotCQkJCWYubWtkaXJzKCk7Ci0JCQl0cnkgewotCQkJCWNvcHlGaWxlKG1mLCBwYXRoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlzdGF0dXMuYWRkKGNlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfQotCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJcmV0dXJuIHN0YXQ7CisJCXJldHVybiBwdWJsaXNoSGVscGVyLnB1Ymxpc2hGdWxsKHJlc291cmNlcywgcGF0aCwgbW9uaXRvcik7CiAJfQogCiAJLyoqCkBAIC01MDUsMjUxICsxMjIsNiBAQAogCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoWmlwKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMubGVuZ3RoID09IDApIHsKLQkJCS8vIHNob3VsZCBhbHNvIGNoZWNrIGlmIHJlc291cmNlcyBjb25zaXN0cyBvZiBhbGwgZW1wdHkgZGlyZWN0b3JpZXMKLQkJCUZpbGUgZmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJcmV0dXJuIEVNUFRZX1NUQVRVUzsKLQkJfQotCQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkKLQkJRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBwYXRoLnRvRmlsZSgpOwotCQkJdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKFRFTVBGSUxFX1BSRUZJWCwgIi4iICsgcGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCksIHRlbXBEaXIpOwotCQkJCi0JCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKSk7Ci0JCQlaaXBPdXRwdXRTdHJlYW0gem91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oYm91dCk7Ci0JCQlhZGRaaXBFbnRyaWVzKHpvdXQsIHJlc291cmNlcyk7Ci0JCQl6b3V0LmNsb3NlKCk7Ci0JCQkKLQkJCW1vdmVUZW1wRmlsZSh0ZW1wRmlsZSwgZmlsZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBJU3RhdHVzW10geyBlLmdldFN0YXR1cygpIH07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB6aXBwaW5nIiwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1c1tdIHsgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNyZWF0aW5nWmlwRmlsZSwgcGF0aC5sYXN0U2VnbWVudCgpLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIGUpIH07Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodGVtcEZpbGUgIT0gbnVsbCAmJiB0ZW1wRmlsZS5leGlzdHMoKSkKLQkJCQl0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkWmlwRW50cmllcyhaaXBPdXRwdXRTdHJlYW0gem91dCwgSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaW50IHNpemUgPSByZXNvdXJjZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCQlJTW9kdWxlRm9sZGVyIG1mID0gKElNb2R1bGVGb2xkZXIpIHJlc291cmNlc1tpXTsKLQkJCQlJTW9kdWxlUmVzb3VyY2VbXSByZXMgPSBtZi5tZW1iZXJzKCk7Ci0JCQkJCi0JCQkJSVBhdGggcGF0aCA9IG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmFwcGVuZChtZi5nZXROYW1lKCkpOwotCQkJCVN0cmluZyBlbnRyeVBhdGggPSBwYXRoLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCQlpZiAoIWVudHJ5UGF0aC5lbmRzV2l0aCgiLyIpKQotCQkJCQllbnRyeVBhdGggKz0gJy8nOwotCQkJCQotCQkJCVppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KGVudHJ5UGF0aCk7Ci0JCQkJCi0JCQkJbG9uZyB0cyA9IDA7Ci0JCQkJSUNvbnRhaW5lciBmb2xkZXIgPSAoSUNvbnRhaW5lcikgbWYuZ2V0QWRhcHRlcihJQ29udGFpbmVyLmNsYXNzKTsKLQkJCQlpZiAoZm9sZGVyICE9IG51bGwpCi0JCQkJCXRzID0gZm9sZGVyLmdldExvY2FsVGltZVN0YW1wKCk7Ci0JCQkJCi0JCQkJaWYgKHRzICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QICYmIHRzICE9IDApCi0JCQkJCXplLnNldFRpbWUodHMpOwotCQkJCQotCQkJCXpvdXQucHV0TmV4dEVudHJ5KHplKTsKLQkJCQl6b3V0LmNsb3NlRW50cnkoKTsKLQkJCQkKLQkJCQlhZGRaaXBFbnRyaWVzKHpvdXQsIHJlcyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUlNb2R1bGVGaWxlIG1mID0gKElNb2R1bGVGaWxlKSByZXNvdXJjZXNbaV07Ci0JCQlJUGF0aCBwYXRoID0gbWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuYXBwZW5kKG1mLmdldE5hbWUoKSk7Ci0JCQkKLQkJCVppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KHBhdGgudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJbG9uZyB0cyA9IDA7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtZi5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQl0cyA9IGZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKTsKLQkJCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRmlsZSBmaWxlMiA9IChGaWxlKSBtZi5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJCXRzID0gZmlsZTIubGFzdE1vZGlmaWVkKCk7Ci0JCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKLQkJCX0KLQkJCQotCQkJaWYgKHRzICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QICYmIHRzICE9IDApCi0JCQkJemUuc2V0VGltZSh0cyk7Ci0JCQkKLQkJCXpvdXQucHV0TmV4dEVudHJ5KHplKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlpbnQgbiA9IDA7Ci0JCQkJd2hpbGUgKG4gPiAtMSkgewotCQkJCQluID0gaW4ucmVhZChidWYpOwotCQkJCQlpZiAobiA+IDApCi0JCQkJCQl6b3V0LndyaXRlKGJ1ZiwgMCwgbik7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfQotCQkJCi0JCQl6b3V0LmNsb3NlRW50cnkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIG1vdmUgYSB0ZW1wIGZpbGUgaW50byBwb3NpdGlvbiBieSBkZWxldGluZyB0aGUgb3JpZ2luYWwgYW5kCi0JICogc3dhcHBpbmcgaW4gYSBuZXcgY29weS4KLQkgKiAgCi0JICogQHBhcmFtIHRlbXBGaWxlCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1vdmVUZW1wRmlsZShGaWxlIHRlbXBGaWxlLCBGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmICghc2FmZURlbGV0ZShmaWxlLCAyKSkgewotCQkJCS8vIGF0dGVtcHQgdG8gcmV3cml0ZSBhbiBleGlzdGluZyBmaWxlIHdpdGggdGhlIHRlbXBGaWxlIGNvbnRlbnRzIGlmCi0JCQkJLy8gdGhlIGV4aXN0aW5nIGZpbGUgY2FuJ3QgYmUgZGVsZXRlZCB0byBwZXJtaXQgdGhlIG1vdmUKLQkJCQl0cnkgewotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGVtcEZpbGUpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNvcHlGaWxlKGluLCBmaWxlLmdldFBhdGgoKSk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJTXVsdGlTdGF0dXMgc3RhdHVzMiA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCBmaWxlLnRvU3RyaW5nKCkpLCBudWxsKTsKLQkJCQkJCXN0YXR1czIuYWRkKHN0YXR1cyk7Ci0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMyKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gc2hvdWxkbid0IG9jY3VyCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdGVtcEZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCQkJCS8qaWYgKCFzYWZlRGVsZXRlKGZpbGUsIDgpKSB7Ci0JCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIGZpbGUudG9TdHJpbmcoKSksIG51bGwpKTsKLQkJCQl9Ki8KLQkJCX0KLQkJfQotCQlpZiAoIXNhZmVSZW5hbWUodGVtcEZpbGUsIGZpbGUsIDEwKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JSZW5hbWUsIHRlbXBGaWxlLnRvU3RyaW5nKCkpLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIGZpbGUgZnJvbSBhIHRvIGIuIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtIGFmdGVyIHVzZS4KLQkgKgotCSAqIEBwYXJhbSBpbiBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHBhcmFtIHRvIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGEgc3RhdHVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjb3B5RmlsZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHRvKSB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQkKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRvKTsKLQkJCQotCQkJaW50IGF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJd2hpbGUgKGF2YWlsID4gMCkgewotCQkJCW91dC53cml0ZShidWYsIDAsIGF2YWlsKTsKLQkJCQlhdmFpbCA9IGluLnJlYWQoYnVmKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29weWluZyBmaWxlIiwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvcHlpbmdGaWxlLCBuZXcgU3RyaW5nW10ge3RvLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2FmZSBkZWxldGUuIFRyaWVzIHRvIGRlbGV0ZSBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgZ2l2aW5nIHVwLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBzdWNjZWVkcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2FmZURlbGV0ZShGaWxlIGYsIGludCByZXRyeXMpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGNvdW50IDwgcmV0cnlzKSB7Ci0JCQlpZiAoIWYuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJCWYuZGVsZXRlKCk7Ci0JCQkKLQkJCWlmICghZi5leGlzdHMoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJY291bnQrKzsKLQkJCS8vIGRlbGF5IGlmIHdlIGFyZSBnb2luZyB0byB0cnkgYWdhaW4KLQkJCWlmIChjb3VudCA8IHJldHJ5cykgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2FmZSByZW5hbWUuIFdpbGwgdHJ5IG11bHRpcGxlIHRpbWVzIGJlZm9yZSBnaXZpbmcgdXAuCi0JICogCi0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gdG8KLQkgKiBAcGFyYW0gcmV0cnlzIG51bWJlciBvZiB0aW1lcyB0byByZXRyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgc3VjY2VlZHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhZmVSZW5hbWUoRmlsZSBmcm9tLCBGaWxlIHRvLCBpbnQgcmV0cnlzKSB7Ci0JCS8vIG1ha2Ugc3VyZSBwYXJlbnQgZGlyIGV4aXN0cwotCQlGaWxlIGRpciA9IHRvLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKGRpciAhPSBudWxsICYmICFkaXIuZXhpc3RzKCkpCi0JCQlkaXIubWtkaXJzKCk7Ci0JCQotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoY291bnQgPCByZXRyeXMpIHsKLQkJCWlmIChmcm9tLnJlbmFtZVRvKHRvKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJY291bnQrKzsKLQkJCS8vIGRlbGF5IGlmIHdlIGFyZSBnb2luZyB0byB0cnkgYWdhaW4KLQkJCWlmIChjb3VudCA8IHJldHJ5cykgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBcnJheVRvTGlzdChMaXN0IGxpc3QsIElTdGF0dXNbXSBhKSB7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgYSA9PSBudWxsIHx8IGEubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IGEubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCWxpc3QuYWRkKGFbaV0pOworCQlyZXR1cm4gcHVibGlzaEhlbHBlci5wdWJsaXNoWmlwKHJlc291cmNlcywgcGF0aCwgbW9uaXRvcik7CiAJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvU29ja2V0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Tb2NrZXRVdGlsLmphdmEKaW5kZXggNjMxYTA0MS4uMWM2ODBkYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Tb2NrZXRVdGlsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Tb2NrZXRVdGlsLmphdmEKQEAgLTE1LDExICsxNSwxNCBAQAogaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CiBpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwogaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7CiAvKioKQEAgLTM0LDkgKzM3LDc2IEBACiAKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwogCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBsb2NhbEhvc3RDYWNoZTsKKwlwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBsb2NhbEhvc3RDYWNoZTsKKwlwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBub3RMb2NhbEhvc3RDYWNoZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDYWNoZVRocmVhZD4gdGhyZWFkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDYWNoZVRocmVhZD4oKTsKIAotCXByaXZhdGUgc3RhdGljIExpc3QgYWRkcmVzc0NhY2hlOworCXByaXZhdGUgc3RhdGljIFNldDxJbmV0QWRkcmVzcz4gYWRkcmVzc0NhY2hlOworCisJc3RhdGljIGNsYXNzIENhY2hlVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKwkJcHJpdmF0ZSBTZXQ8SW5ldEFkZHJlc3M+IGN1cnJlbnRBZGRyZXNzZXM7CisJCXByaXZhdGUgU2V0PFN0cmluZz4gYWRkcmVzc0xpc3Q7CisJCXByaXZhdGUgU3RyaW5nIGhvc3Q7CisJCXByaXZhdGUgU2V0PFN0cmluZz4gbm9uQWRkcmVzc0xpc3Q7CisJCXByaXZhdGUgTWFwIHRocmVhZE1hcDI7CisKKwkJcHVibGljIENhY2hlVGhyZWFkKFN0cmluZyBob3N0LCBTZXQ8SW5ldEFkZHJlc3M+IGN1cnJlbnRBZGRyZXNzZXMsIFNldDxTdHJpbmc+IGFkZHJlc3NMaXN0LCBTZXQ8U3RyaW5nPiBub25BZGRyZXNzTGlzdCwgTWFwIHRocmVhZE1hcDIpIHsKKwkJCXN1cGVyKCJDYWNoaW5nIGxvY2FsaG9zdCBpbmZvcm1hdGlvbiIpOworCQkJdGhpcy5ob3N0ID0gaG9zdDsKKwkJCXRoaXMuY3VycmVudEFkZHJlc3NlcyA9IGN1cnJlbnRBZGRyZXNzZXM7CisJCQl0aGlzLmFkZHJlc3NMaXN0ID0gYWRkcmVzc0xpc3Q7CisJCQl0aGlzLm5vbkFkZHJlc3NMaXN0ID0gbm9uQWRkcmVzc0xpc3Q7CisJCQl0aGlzLnRocmVhZE1hcDIgPSB0aHJlYWRNYXAyOworCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKGN1cnJlbnRBZGRyZXNzZXMgIT0gbnVsbCkgeworCQkJCUl0ZXJhdG9yIGl0ZXIyID0gY3VycmVudEFkZHJlc3Nlcy5pdGVyYXRvcigpOworCQkJCXdoaWxlIChpdGVyMi5oYXNOZXh0KCkpIHsKKwkJCQkJSW5ldEFkZHJlc3MgYWRkciA9IChJbmV0QWRkcmVzcykgaXRlcjIubmV4dCgpOworCQkJCQlTdHJpbmcgaG9zdG5hbWUgPSBhZGRyLmdldEhvc3ROYW1lKCk7CisJCQkJCVN0cmluZyBob3N0bmFtZTIgPSBhZGRyLmdldENhbm9uaWNhbEhvc3ROYW1lKCk7CisJCQkJCXN5bmNocm9uaXplZCAobG9jaykgeworCQkJCQkJaWYgKGhvc3RuYW1lICE9IG51bGwgJiYgIWFkZHJlc3NMaXN0LmNvbnRhaW5zKGhvc3RuYW1lKSkKKwkJCQkJCQlhZGRyZXNzTGlzdC5hZGQoaG9zdG5hbWUpOworCQkJCQkJaWYgKGhvc3RuYW1lMiAhPSBudWxsICYmICFhZGRyZXNzTGlzdC5jb250YWlucyhob3N0bmFtZTIpKQorCQkJCQkJCWFkZHJlc3NMaXN0LmFkZChob3N0bmFtZTIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCQl0cnkgeworCQkJCUluZXRBZGRyZXNzW10gYWRkcnMgPSBJbmV0QWRkcmVzcy5nZXRBbGxCeU5hbWUoaG9zdCk7CisJCQkJaW50IGxlbmd0aCA9IGFkZHJzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCUluZXRBZGRyZXNzIGFkZHIgPSBhZGRyc1swXTsKKwkJCQkJU3RyaW5nIGhvc3RuYW1lID0gYWRkci5nZXRIb3N0TmFtZSgpOworCQkJCQlTdHJpbmcgaG9zdG5hbWUyID0gYWRkci5nZXRDYW5vbmljYWxIb3N0TmFtZSgpOworCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKKwkJCQkJCWlmIChhZGRyLmlzTG9vcGJhY2tBZGRyZXNzKCkpIHsKKwkJCQkJCQlpZiAoaG9zdG5hbWUgIT0gbnVsbCAmJiAhYWRkcmVzc0xpc3QuY29udGFpbnMoaG9zdG5hbWUpKQorCQkJCQkJCQlhZGRyZXNzTGlzdC5hZGQoaG9zdG5hbWUpOworCQkJCQkJCWlmIChob3N0bmFtZTIgIT0gbnVsbCAmJiAhYWRkcmVzc0xpc3QuY29udGFpbnMoaG9zdG5hbWUyKSkKKwkJCQkJCQkJYWRkcmVzc0xpc3QuYWRkKGhvc3RuYW1lMik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChob3N0bmFtZSAhPSBudWxsICYmICFub25BZGRyZXNzTGlzdC5jb250YWlucyhob3N0bmFtZSkpCisJCQkJCQkJCW5vbkFkZHJlc3NMaXN0LmFkZChob3N0bmFtZSk7CisJCQkJCQkJaWYgKGhvc3RuYW1lMiAhPSBudWxsICYmICFub25BZGRyZXNzTGlzdC5jb250YWlucyhob3N0bmFtZTIpKQorCQkJCQkJCQlub25BZGRyZXNzTGlzdC5hZGQoaG9zdG5hbWUyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKwkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKKwkJCQkJaWYgKGhvc3QgIT0gbnVsbCAmJiAhbm9uQWRkcmVzc0xpc3QuY29udGFpbnMoaG9zdCkpCisJCQkJCQlub25BZGRyZXNzTGlzdC5hZGQoaG9zdCk7CisJCQkJfQorCQkJfQorCQkJc3luY2hyb25pemVkIChsb2NrKSB7CisJCQkJdGhyZWFkTWFwMi5yZW1vdmUoaG9zdCk7CisJCQl9CisJCX0KKwl9CiAKIAkvKioKIAkgKiBTdGF0aWMgdXRpbGl0eSBjbGFzcyAtIGNhbm5vdCBjcmVhdGUgYW4gaW5zdGFuY2UuCkBAIC01MCw3ICsxMjAsNyBAQAogCSAqIAogCSAqIEBwYXJhbSBsb3cgbG93ZXN0IHBvc3NpYmxlIHBvcnQgbnVtYmVyCiAJICogQHBhcmFtIGhpZ2ggaGlnaGVzdCBwb3NzaWJsZSBwb3J0IG51bWJlcgotCSAqIEByZXR1cm4gYW4gdXN1c2VkIHBvcnQgbnVtYmVyLCBvciA8Y29kZT4tMTwvY29kZT4gaWYgbm8gdXNlZCBwb3J0cyBjb3VsZCBiZSBmb3VuZAorCSAqIEByZXR1cm4gYW4gdW51c2VkIHBvcnQgbnVtYmVyLCBvciA8Y29kZT4tMTwvY29kZT4gaWYgbm8gdXNlZCBwb3J0cyBjb3VsZCBiZSBmb3VuZAogCSAqLwogCXB1YmxpYyBzdGF0aWMgaW50IGZpbmRVbnVzZWRQb3J0KGludCBsb3csIGludCBoaWdoKSB7CiAJCWlmIChoaWdoIDwgbG93KQpAQCAtMTU2LDc1ICsyMjYsMTA5IEBACiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gaG9zdCBpcyBsb2NhbGhvc3QsIGFuZAogCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NhbGhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJaWYgKGhvc3QgPT0gbnVsbCkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NhbGhvc3QoZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJaWYgKGhvc3QgPT0gbnVsbCB8fCBob3N0LmVxdWFscygiIikpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCQogCQlpZiAoImxvY2FsaG9zdCIuZXF1YWxzKGhvc3QpIHx8ICIxMjcuMC4wLjEiLmVxdWFscyhob3N0KSkKIAkJCXJldHVybiB0cnVlOwogCQkKLQkJLy8gY2hlY2sgaWYgY2FjaGUgaXMgb2sKKwkJLy8gY2hlY2sgc2ltcGxlIGNhc2VzCisJCXRyeSB7CisJCQlJbmV0QWRkcmVzcyBsb2NhbEhvc3RhZGRyID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisJCQlpZiAobG9jYWxIb3N0YWRkci5nZXRIb3N0TmFtZSgpLmVxdWFscyhob3N0KQorCQkJCQl8fCBob3N0LmVxdWFscyhsb2NhbEhvc3RhZGRyLmdldENhbm9uaWNhbEhvc3ROYW1lKCkpCisJCQkJCXx8IGxvY2FsSG9zdGFkZHIuZ2V0SG9zdEFkZHJlc3MoKS5lcXVhbHMoaG9zdCkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiTG9jYWxob3N0IGNhY2hpbmcgZmFpbHVyZSIsIGUpOworCQl9CisJCQorCQkvLyBjaGVjayBmb3IgY3VycmVudCB0aHJlYWQgYW5kIHdhaXQgaWYgbmVjZXNzYXJ5CisJCWJvb2xlYW4gY3VycmVudFRocmVhZCA9IGZhbHNlOworCQl0cnkgeworCQkJVGhyZWFkIHQgPSBudWxsOworCQkJc3luY2hyb25pemVkIChsb2NrKSB7CisJCQkJdCA9IHRocmVhZE1hcC5nZXQoaG9zdCk7CisJCQl9CisJCQlpZiAodCAhPSBudWxsICYmIHQuaXNBbGl2ZSgpKSB7CisJCQkJY3VycmVudFRocmVhZCA9IHRydWU7CisJCQkJdC5qb2luKDMwKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJMb2NhbGhvc3QgY2FjaGluZyBmYWlsdXJlIiwgZSk7CisJCX0KKwkJCisJCS8vIGNoZWNrIGlmIGNhY2hlIGlzIHN0aWxsIG9rCisJCWJvb2xlYW4gcmVmcmVzaGVkQ2FjaGUgPSBmYWxzZTsKIAkJdHJ5IHsKIAkJCS8vIGdldCBuZXR3b3JrIGludGVyZmFjZXMKLQkJCWZpbmFsIExpc3QgY3VycmVudEFkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWZpbmFsIFNldDxJbmV0QWRkcmVzcz4gY3VycmVudEFkZHJlc3NlcyA9IG5ldyBIYXNoU2V0PEluZXRBZGRyZXNzPigpOwogCQkJY3VycmVudEFkZHJlc3Nlcy5hZGQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOwogCQkJRW51bWVyYXRpb24gbmlzID0gTmV0d29ya0ludGVyZmFjZS5nZXROZXR3b3JrSW50ZXJmYWNlcygpOwogCQkJd2hpbGUgKG5pcy5oYXNNb3JlRWxlbWVudHMoKSkgewogCQkJCU5ldHdvcmtJbnRlcmZhY2UgaW50ZXIgPSAoTmV0d29ya0ludGVyZmFjZSkgbmlzLm5leHRFbGVtZW50KCk7Ci0JCQkJRW51bWVyYXRpb24gaWFzID0gaW50ZXIuZ2V0SW5ldEFkZHJlc3NlcygpOworCQkJCUVudW1lcmF0aW9uPEluZXRBZGRyZXNzPiBpYXMgPSBpbnRlci5nZXRJbmV0QWRkcmVzc2VzKCk7CiAJCQkJd2hpbGUgKGlhcy5oYXNNb3JlRWxlbWVudHMoKSkKIAkJCQkJY3VycmVudEFkZHJlc3Nlcy5hZGQoaWFzLm5leHRFbGVtZW50KCkpOwogCQkJfQogCQkJCiAJCQkvLyBjaGVjayBpZiBjYWNoZSBpcyBlbXB0eSBvciBvbGQgYW5kIHJlZmlsbCBpdCBpZiBuZWNlc3NhcnkKIAkJCWlmIChhZGRyZXNzQ2FjaGUgPT0gbnVsbCB8fCAhYWRkcmVzc0NhY2hlLmNvbnRhaW5zQWxsKGN1cnJlbnRBZGRyZXNzZXMpIHx8ICFjdXJyZW50QWRkcmVzc2VzLmNvbnRhaW5zQWxsKGFkZHJlc3NDYWNoZSkpIHsKLQkJCQlhZGRyZXNzQ2FjaGUgPSBjdXJyZW50QWRkcmVzc2VzOwotCQkJCWZpbmFsIExpc3QgYWRkcmVzc0xpc3QgPSBuZXcgQXJyYXlMaXN0KGN1cnJlbnRBZGRyZXNzZXMuc2l6ZSgpICogMyk7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGN1cnJlbnRBZGRyZXNzZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJSW5ldEFkZHJlc3MgYWRkciA9IChJbmV0QWRkcmVzcykgaXRlci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBhID0gYWRkci5nZXRIb3N0QWRkcmVzcygpOwotCQkJCQlpZiAoYSAhPSBudWxsICYmICFhZGRyZXNzTGlzdC5jb250YWlucyhhKSkKLQkJCQkJCWFkZHJlc3NMaXN0LmFkZChhKTsKLQkJCQl9Ci0JCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCWxvY2FsSG9zdENhY2hlID0gYWRkcmVzc0xpc3Q7Ci0JCQkJfQorCQkJCUNhY2hlVGhyZWFkIGNhY2hlVGhyZWFkID0gbnVsbDsKKwkJCQlyZWZyZXNoZWRDYWNoZSA9IHRydWU7CiAJCQkJCi0JCQkJVGhyZWFkIGNhY2hlVGhyZWFkID0gbmV3IFRocmVhZCgiQ2FjaGluZyBsb2NhbGhvc3QgaW5mb3JtYXRpb24iKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXIyID0gY3VycmVudEFkZHJlc3Nlcy5pdGVyYXRvcigpOwotCQkJCQkJd2hpbGUgKGl0ZXIyLmhhc05leHQoKSkgewotCQkJCQkJCUluZXRBZGRyZXNzIGFkZHIgPSAoSW5ldEFkZHJlc3MpIGl0ZXIyLm5leHQoKTsKLQkJCQkJCQlTdHJpbmcgaG9zdG5hbWUgPSBhZGRyLmdldEhvc3ROYW1lKCk7Ci0JCQkJCQkJU3RyaW5nIGhvc3RuYW1lMiA9IGFkZHIuZ2V0Q2Fub25pY2FsSG9zdE5hbWUoKTsKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJCQkJaWYgKGhvc3RuYW1lICE9IG51bGwgJiYgIWFkZHJlc3NMaXN0LmNvbnRhaW5zKGhvc3RuYW1lKSkKLQkJCQkJCQkJCWFkZHJlc3NMaXN0LmFkZChob3N0bmFtZSk7Ci0JCQkJCQkJCWlmIChob3N0bmFtZTIgIT0gbnVsbCAmJiAhYWRkcmVzc0xpc3QuY29udGFpbnMoaG9zdG5hbWUyKSkKLQkJCQkJCQkJCWFkZHJlc3NMaXN0LmFkZChob3N0bmFtZTIpOwotCQkJCQkJCX0KLQkJCQkJCX0KKwkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKKwkJCQkJYWRkcmVzc0NhY2hlID0gY3VycmVudEFkZHJlc3NlczsKKwkJCQkJbm90TG9jYWxIb3N0Q2FjaGUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCQkJCWxvY2FsSG9zdENhY2hlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihjdXJyZW50QWRkcmVzc2VzLnNpemUoKSAqIDMpOworCQkJCQkKKwkJCQkJSXRlcmF0b3IgaXRlciA9IGN1cnJlbnRBZGRyZXNzZXMuaXRlcmF0b3IoKTsKKwkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJCQlJbmV0QWRkcmVzcyBhZGRyID0gKEluZXRBZGRyZXNzKSBpdGVyLm5leHQoKTsKKwkJCQkJCVN0cmluZyBhID0gYWRkci5nZXRIb3N0QWRkcmVzcygpOworCQkJCQkJaWYgKGEgIT0gbnVsbCAmJiAhbG9jYWxIb3N0Q2FjaGUuY29udGFpbnMoYSkpCisJCQkJCQkJbG9jYWxIb3N0Q2FjaGUuYWRkKGEpOwogCQkJCQl9Ci0JCQkJfTsKLQkJCQljYWNoZVRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCQkJY2FjaGVUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgLSAxKTsKLQkJCQljYWNoZVRocmVhZC5zdGFydCgpOwotCQkJCWNhY2hlVGhyZWFkLmpvaW4oMjUwKTsKKwkJCQkJCisJCQkJCWNhY2hlVGhyZWFkID0gbmV3IENhY2hlVGhyZWFkKGhvc3QsIGN1cnJlbnRBZGRyZXNzZXMsIGxvY2FsSG9zdENhY2hlLCBub3RMb2NhbEhvc3RDYWNoZSwgdGhyZWFkTWFwKTsKKwkJCQkJdGhyZWFkTWFwLnB1dChob3N0LCBjYWNoZVRocmVhZCk7CisJCQkJCWNhY2hlVGhyZWFkLnNldERhZW1vbih0cnVlKTsKKwkJCQkJY2FjaGVUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgLSAxKTsKKwkJCQkJY2FjaGVUaHJlYWQuc3RhcnQoKTsKKwkJCQl9CisJCQkJY2FjaGVUaHJlYWQuam9pbigyMDApOwogCQkJfQogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCiAJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiTG9jYWxob3N0IGNhY2hpbmcgZmFpbHVyZSIsIGUpOwogCQl9CiAJCQotCQlpZiAobG9jYWxIb3N0Q2FjaGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCiAJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsb2NhbEhvc3RDYWNoZS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWlmIChob3N0LmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWlmIChsb2NhbEhvc3RDYWNoZS5jb250YWlucyhob3N0KSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWlmIChub3RMb2NhbEhvc3RDYWNoZS5jb250YWlucyhob3N0KSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCS8vIGlmIHRoZSBjYWNoZSBoYXNuJ3QgYmVlbiBjbGVhcmVkLCBtYXliZSB3ZSBzdGlsbCBuZWVkIHRvIGxvb2t1cCB0aGUgaG9zdCAgCisJCWlmICghcmVmcmVzaGVkQ2FjaGUgJiYgIWN1cnJlbnRUaHJlYWQpIHsKKwkJCXRyeSB7CisJCQkJQ2FjaGVUaHJlYWQgY2FjaGVUaHJlYWQgPSBudWxsOworCQkJCXN5bmNocm9uaXplZCAobG9jaykgeworCQkJCQljYWNoZVRocmVhZCA9IG5ldyBDYWNoZVRocmVhZChob3N0LCBudWxsLCBsb2NhbEhvc3RDYWNoZSwgbm90TG9jYWxIb3N0Q2FjaGUsIHRocmVhZE1hcCk7CisJCQkJCXRocmVhZE1hcC5wdXQoaG9zdCwgY2FjaGVUaHJlYWQpOworCQkJCQljYWNoZVRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisJCQkJCWNhY2hlVGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5OT1JNX1BSSU9SSVRZIC0gMSk7CisJCQkJCWNhY2hlVGhyZWFkLnN0YXJ0KCk7CisJCQkJfQorCQkJCWNhY2hlVGhyZWFkLmpvaW4oNzUpOworCQkJCQorCQkJCXN5bmNocm9uaXplZCAobG9jaykgeworCQkJCQlpZiAobG9jYWxIb3N0Q2FjaGUuY29udGFpbnMoaG9zdCkpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZmluZCBsb2NhbGhvc3QiLCBlKTsKIAkJCX0KIAkJfQogCQkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvV2ViUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvV2ViUmVzb3VyY2UuamF2YQppbmRleCAxNmIzMWQ5Li43NGEwN2YyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1dlYlJlc291cmNlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9XZWJSZXNvdXJjZS5qYXZhCkBAIC0xNCw3ICsxNCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0RGVsZWdhdGU7CiAvKioKICAqIEEgV2ViIG1vZHVsZSByZXNvdXJjZS4KQEAgLTUzLDcgKzUyLDcgQEAKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC50b1N0cmluZygpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gTWVzc2FnZXMud2ViUmVzb3VyY2U7CisJCQlyZXR1cm4gZ2V0TW9kdWxlKCkuZ2V0TmFtZSgpOwogCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTliZDMyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzZXJ2ZXJ1aS8iLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhNGMxNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsOCBAQAorYmluCitzZXJ2ZXJ1aS5qYXIKK2J1aWxkLnhtbAordGVtcC5mb2xkZXIKK29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWlfMy4wLjAuamFyCitAZG90CitzcmMuemlwCitqYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1YzVjZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8ub3B0aW9ucwpAQCAtMCwwICsxLDEwIEBACisjIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSBwbHVnaW4KKworIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCitvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2RlYnVnPXRydWUKKworIyBMb2FkaW5nIG9mIGV4dGVuc2lvbiBwb2ludHMKK29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvZXh0ZW5zaW9uX3BvaW50PWZhbHNlCisKKyMgUGVyZm9ybWFuY2Ugb2YgbG9hZGluZyBhbmQgY2FsbGluZyBkZWxlZ2F0ZXMKK29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvcGVyZm9ybWFuY2U9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlYmE3MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmU0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitlbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyMDg1MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3NyBAQAorI1RodSBTZXAgMTMgMTU6MjU6MDYgRURUIDIwMDcKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitpbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQxNmJlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSwzIEBACisjRnJpIEZlYiAyMyAyMToxNToyNiBFU1QgMjAwNworZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTYwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpAQCAtMCwwICsxLDE0IEBACisjU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgorY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCitjb21waWxlcnMucC5idWlsZD0wCitjb21waWxlcnMucC5kZXByZWNhdGVkPTEKK2NvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCitjb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCitjb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCitjb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKK2NvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKK2NvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjVjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw0MyBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7IHNpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMS41LnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSwKKyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmFjdGlvbnMsCisgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IsCisgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZXh0ZW5zaW9uO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UudWkuYnJvd3NlcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UudWkuY29uc29sZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAorIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTtleGNsdWRlOj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyIgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTlkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvYWJvdXQuaHRtbApAQCAtMCwwICsxLDM0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8SFRNTD4KKworPGhlYWQ+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPC9oZWFkPgorCis8Qk9EWSBsYW5nPSJFTi1VUyI+CisKKzxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgorCis8UD5KdW5lLCAyMDA4PC9QPgorCis8SDM+TGljZW5zZTwvSDM+CisKKzxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKKygiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAordW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAorKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Cis8QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgorCis8UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKK0NvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCit0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKK0NoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAorbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCit0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAorPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlMDRiMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2Jpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgLm9wdGlvbnMsXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAorICAgICAgICAgICAgICAgc2VydmVyQWRhcHRlclNpdGVzLnhtbAorYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKKyAgICAgICAgICAgICAgIEBkb3QvKiosXAorICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKK3NyYy5pbmNsdWRlcyA9IHNjaGVtYS8KK3NvdXJjZS4uID0gc2VydmVydWkvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kZWJ1Zy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kZWJ1Zy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxNGQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX2RlYnVnLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMGQzODMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9wcm9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YzMzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9wcm9maWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ODI3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3Jlc3RhcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGFjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9ydW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcnVuLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Y0MTAyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcnVuLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9zdG9wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjE2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9zdG9wLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY1MGJiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhOTUyMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9ydW5fb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDdkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9ydW5fb25fc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGY2YjMxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTA3MDEyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViYWNiMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZmQxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJfcGVyc3BlY3RpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N2aWV3MTYvc2VydmVyX3BlcnNwZWN0aXZlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI2NDhjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N2aWV3MTYvc2VydmVyX3BlcnNwZWN0aXZlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N2aWV3MTYvc2VydmVyc192aWV3LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFiZmJiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N2aWV3MTYvc2VydmVyc192aWV3LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmOWMzYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX2RlYnVnLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NTYwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wcm9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDliMGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wcm9maWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzIyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3Jlc3RhcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDkwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9ydW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcnVuLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzYyZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcnVuLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9zdG9wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzVmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9zdG9wLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9jbGVhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9jbGVhci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3NWVkZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L2NsZWFyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRjZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0Yzg5ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9ydW5fb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MjJhODYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9ydW5fb25fc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY1N2IzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTRmZWQxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbmV3X3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbmV3X3NlcnZlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2ZmNiMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTIzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxNGQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX2RlYnVnLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMGQzODMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9wcm9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YzMzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9wcm9maWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZTlhNmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3Jlc3RhcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGFjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9ydW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcnVuLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Y0MTAyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcnVuLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9zdG9wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjE2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9zdG9wLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9jbGVhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9jbGVhci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzMGE0MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L2NsZWFyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY1MGJiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhOTUyMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9ydW5fb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDdkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9ydW5fb25fc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGY2YjMxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTA3MDEyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViYWNiMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZmQxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXZpZXcxNi9zZXJ2ZXJfcGVyc3BlY3RpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyX3BlcnNwZWN0aXZlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI2NDhjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyX3BlcnNwZWN0aXZlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyc192aWV3LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFiZmJiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyc192aWV3LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXVkaW9fY2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX2NhdGVnb3J5LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGE1Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX2NhdGVnb3J5LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXVkaW9fc291bmQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX3NvdW5kLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWQ4NTUzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX3NvdW5kLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9taXNzaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9jb25maWd1cmF0aW9uX21pc3NpbmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZWY0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9taXNzaW5nLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9ub25lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9jb25maWd1cmF0aW9uX25vbmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDI3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9ub25lLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvaW50ZXJuYWxfYnJvd3Nlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvaW50ZXJuYWxfYnJvd3Nlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmNjA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9pbnRlcm5hbF9icm93c2VyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlNWYzMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9tb25pdG9yT2ZmLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjM5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHJvamVjdF9taXNzaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wcm9qZWN0X21pc3NpbmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjRjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHJvamVjdF9taXNzaW5nLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9kaXNhYmxlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9kaXNhYmxlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5Yjg0NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wdWJsaXNoX2Rpc2FibGVkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9lbmFibGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wdWJsaXNoX2VuYWJsZWQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTAwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9lbmFibGVkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcmVwYWlyX2NvbmZpZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcmVwYWlyX2NvbmZpZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2OTBlYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9yZXBhaXJfY29uZmlnLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWFlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzcwMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWRfZGVidWcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkX2RlYnVnLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWUxNzc4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkX2RlYnVnLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWRfcHJvZmlsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWRfcHJvZmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlMjU4NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZF9wcm9maWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNjNhYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmcxLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzYmJmZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmcyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1MWU1NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmczLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmMzYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGVkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2YzU3ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmcxLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjM2I2NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmcyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2YzU3ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmczLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc3RhdGVfc3RhcnRlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc3RhdGVfc3RhcnRlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2ZTA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zdGF0ZV9zdGFydGVkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc3RhdGVfc3RvcHBlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc3RhdGVfc3RvcHBlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiYmUzYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zdGF0ZV9zdG9wcGVkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyMGY3MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvZGVmYXVsdF9zZXJ2ZXJfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9kZWZhdWx0X3NlcnZlcl9vdnIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZmNiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvZGVmYXVsdF9zZXJ2ZXJfb3ZyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX292ci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZDUyZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfb3ZyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL2ltcG9ydF9jb25maWd1cmF0aW9uX3dpei5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL2ltcG9ydF9jb25maWd1cmF0aW9uX3dpei5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwYWQyMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vaW1wb3J0X2NvbmZpZ3VyYXRpb25fd2l6LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXoucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzU2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9jbGllbnRfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vc2VsZWN0X2NsaWVudF93aXoucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTc4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9jbGllbnRfd2l6LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9zZXJ2ZXJfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vc2VsZWN0X3NlcnZlcl93aXoucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjFiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9zZXJ2ZXJfd2l6LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljMTc3NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDEwNyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGx1Z2luTmFtZT1TZXJ2ZXIgVUkKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworCitleHRlbnNpb25Qb2ludEVkaXRvclBhZ2VzPUVkaXRvciBQYWdlcworZXh0ZW5zaW9uUG9pbnRFZGl0b3JQYWdlU2VjdGlvbnM9RWRpdG9yIFBhZ2UgU2VjdGlvbnMKK2V4dGVuc2lvblBvaW50RWRpdG9yQWN0aW9ucz1FZGl0b3IgQWN0aW9ucworZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJJbWFnZXM9U2VydmVyIEltYWdlcworZXh0ZW5zaW9uUG9pbnRXaXphcmRGcmFnbWVudHM9V2l6YXJkIEZyYWdtZW50cworZXh0ZW5zaW9uUG9pbnRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXI9SW5pdGlhbCBTZWxlY3Rpb24gUHJvdmlkZXIKK2V4dGVuc2lvblBvaW50QXVkaW89QXVkaW8KKworIyAtLS0tLS0tLS0tLS0tLS0gV2l6YXJkcyBhbmQgVmlld3MgLS0tLS0tLS0tLS0tLS0tCisKK2NhdGVnb3J5PVNlcnZlcgorY29udGV4dD1JbiBTZXJ2ZXJzIFZpZXcKK25ld1NlcnZlcj1TZXJ2ZXIKK25ld1NlcnZlckRlc2NyaXB0aW9uPURlZmluZSBhIG5ldyBzZXJ2ZXIKKwordmlld1NlcnZlcnM9U2VydmVycworCisjIC0tLS0tLS0tLS0tLS0tLSBBY3Rpb24gU2V0cyAodG9vbGJhciBpY29uIGdyb3VwcykgLS0tLS0tLS0tLS0tLS0tCisKKyMgU2VydmVycyBhY3Rpb24gc2V0CithY3Rpb25TZXRUaXRsZT1TZXJ2ZXIKK2FjdGlvblNldE5ld1NlcnZlcj1DcmVhdGUgU2VydmVyCisKKyMgUnVuIG9uIFNlcnZlciBhY3Rpb25zCithY3Rpb25SdW5PblNlcnZlcj1SdW4gb24gU2VydmVyCithY3Rpb25SdW5PblNlcnZlckRlc2NyaXB0aW9uPVJ1biB0aGUgY3VycmVudCBzZWxlY3Rpb24gb24gYSBzZXJ2ZXIKK2FjdGlvbkRlYnVnT25TZXJ2ZXI9RGVidWcgb24gU2VydmVyCithY3Rpb25EZWJ1Z09uU2VydmVyRGVzY3JpcHRpb249RGVidWcgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9uIGEgc2VydmVyCithY3Rpb25QdWJsaXNoPVB1Ymxpc2gKK2FjdGlvblB1Ymxpc2hEZXNjcmlwdGlvbj1QdWJsaXNoIHRvIHNlcnZlcgorYWN0aW9uUnVuPVJ1bgorYWN0aW9uUnVuRGVzY3JpcHRpb249UnVuIHNlcnZlcgorYWN0aW9uRGVidWc9RGVidWcKK2FjdGlvbkRlYnVnRGVzY3JpcHRpb249RGVidWcgc2VydmVyCithY3Rpb25Qcm9maWxlT25TZXJ2ZXI9UHJvZmlsZSBvbiBTZXJ2ZXIKK2FjdGlvblN0b3A9U3RvcAorYWN0aW9uU3RvcERlc2NyaXB0aW9uPVN0b3AgdGhlIHNlcnZlcgorCisjIC0tLS0tLS0tLS0tLS0tLSBQcmVmZXJlbmNlcyBhbmQgUHJvcGVydHkgcGFnZXMgLS0tLS0tLS0tLS0tLS0tCisKK3ByZWZlcmVuY2VTZXJ2ZXJzVGl0bGU9U2VydmVyCitwcmVmZXJlbmNlTGF1bmNoaW5nVGl0bGU9TGF1bmNoaW5nCitwcmVmZXJlbmNlUnVudGltZXNUaXRsZT1SdW50aW1lIEVudmlyb25tZW50cworcHJlZmVyZW5jZVNlcnZlcktleXdvcmRzPXNlcnZlcnMgcnVudGltZSBlbnZpcm9ubWVudCBidWlsZCBpbnN0YWxsZWQgcHVibGlzaGluZyBkZXBsb3kgYXNzZW1ibHkgbGF1bmNoaW5nIHJ1bm5pbmcgZGVidWdnaW5nIHByb2ZpbGluZworCitwcm9wZXJ0aWVzU2VydmVyPVNlcnZlcgorcHJvcGVydGllc1NlcnZlckluZm89R2VuZXJhbAorcHJvcGVydGllc01vbml0b3I9TW9uaXRvcmluZworCitydW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb249UnVuIG9uIFNlcnZlcgorbGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlTmFtZT1SdW4gb24gU2VydmVyCitsYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVEZXNjcmlwdGlvbj1SdW5zIGFwcGxpY2F0aW9ucyBvbiB0aGUgc2VydmVyCisKKyMgLS0tLS0tLS0tLS0tLS0tIEVkaXRvciAtLS0tLS0tLS0tLS0tLS0KKworc2VydmVyRWRpdG9yPVNlcnZlciBFZGl0b3IKK3NlcnZlckVkaXRvck92ZXJ2aWV3UGFnZT1PdmVydmlldworCisjIC0tLS0tLS0tLS0tLS0tLSBBdWRpbyAtLS0tLS0tLS0tLS0tLS0KKworZXh0ZW5zaW9uUG9pbnRBdWRpbz1BdWRpbworCithdWRpb1ByZWZlcmVuY2VUaXRsZT1BdWRpbworcHJlZmVyZW5jZUF1ZGlvS2V5d29yZHM9c291bmQgdm9sdW1lCisKK2xhdW5jaGFibGVXZWJCcm93c2VyPVdlYiBicm93c2VyCitsYXVuY2hhYmxlV2ViQnJvd3NlckRlc2NyaXB0aW9uPU9wZW4gdGhlIFJlc291cmNlIGluIGEgV2ViIEJyb3dzZXIKKworYXVkaW9DYXRlZ29yeVNlcnZlcj1TZXJ2ZXIKK2F1ZGlvU2VydmVyU3RhcnRlZD1TZXJ2ZXIgU3RhcnRlZAorYXVkaW9TZXJ2ZXJTdG9wcGVkPVNlcnZlciBTdG9wcGVkCisKK2F1ZGlvQ2F0ZWdvcnlQdWJsaXNoPVB1Ymxpc2hpbmcKK2F1ZGlvUHVibGlzaEZpbmlzaGVkPVB1Ymxpc2ggRmluaXNoZWQKKworIyAtLS0tLS0tLS0tLS0tLS0gT3RoZXIgLS0tLS0tLS0tLS0tLS0tCisKK21vbml0b3JMYWJlbD1UQ1AvSVAgbW9uaXRvcgorbW9uaXRvckRlc2NyaXB0aW9uPVVzZXMgdGhlIGludGVybmFsIFRDUC9JUCBtb25pdG9yIHRvIG1vbml0b3Igc2VydmVyIHJlcXVlc3RzLgorCittb2R1bGVQcm9qZWN0RGVjb3JhdG9yTGFiZWw9TW9kdWxlIFByb2plY3QKK21vZHVsZVByb2plY3REZWNvcmF0b3JEZXNjcmlwdGlvbj1EZWNvcmF0ZXMgc2VydmVyIG1vZHVsZXMgd2l0aCBpbmZvcm1hdGlvbiBvbiB0aGUgcHJvamVjdCB0aGF0IHRoZXkgY29tZSBmcm9tCisKKyMgLS0tLS0tLS0tLS0tLS0tIEFjdGlvbiBTZXRzICh0b29sYmFyIGljb24gZ3JvdXBzKSAtLS0tLS0tLS0tLS0tLS0KKworIyBXZWIgQnJvd3NlciBhY3Rpb24gc2V0CithY3Rpb25TZXRXZWJCcm93c2VyVGl0bGU9V2ViIEJyb3dzZXIKK2FjdGlvblNldE9wZW5XZWJCcm93c2VyPU9wZW4gV2ViIEJyb3dzZXIKK2FjdGlvblNldFN3aXRjaEJyb3dzZXI9V2ViIEJyb3dzZXIKKworIyAtLS0tLS0tLS0tLS0tLS0gUHJlZmVyZW5jZXMgLS0tLS0tLS0tLS0tLS0tCisKKyMgTmFtZSBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlcworcHJlZmVyZW5jZUludGVybmV0VGl0bGU9SW50ZXJuZXQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2NDdiZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNTA3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8cGx1Z2luPgorICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlZGl0b3JQYWdlcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50RWRpdG9yUGFnZXMiIHNjaGVtYT0ic2NoZW1hL2VkaXRvclBhZ2VzLmV4c2QiLz4KKyAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWRpdG9yUGFnZVNlY3Rpb25zIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRFZGl0b3JQYWdlU2VjdGlvbnMiIHNjaGVtYT0ic2NoZW1hL2VkaXRvclBhZ2VTZWN0aW9ucy5leHNkIi8+CisgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRvckFjdGlvbnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludEVkaXRvckFjdGlvbnMiIHNjaGVtYT0ic2NoZW1hL2VkaXRvckFjdGlvbnMuZXhzZCIvPgorICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJJbWFnZXMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlckltYWdlcyIgc2NoZW1hPSJzY2hlbWEvc2VydmVySW1hZ2VzLmV4c2QiLz4KKyAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2l6YXJkRnJhZ21lbnRzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRXaXphcmRGcmFnbWVudHMiIHNjaGVtYT0ic2NoZW1hL3dpemFyZEZyYWdtZW50cy5leHNkIi8+CisgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciIgbmFtZT0iJWV4dGVuc2lvblBvaW50SW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIiBzY2hlbWE9InNjaGVtYS9pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIuZXhzZCIvPgorICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhdWRpbyIgbmFtZT0iJWV4dGVuc2lvblBvaW50QXVkaW8iIHNjaGVtYT0ic2NoZW1hL2F1ZGlvLmV4c2QiLz4KKyAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVyVG9vbFRpcCIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVyVG9vbFRpcCIgc2NoZW1hPSJzY2hlbWEvc2VydmVyVG9vbFRpcC5leHNkIi8+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgorICA8Y2F0ZWdvcnkKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKKyAgICBuYW1lPSIlY2F0ZWdvcnkiLz4KKworICA8d2l6YXJkCisgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5uZXcuc2VydmVyIgorICAgICAgbmFtZT0iJW5ld1NlcnZlciIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5OZXdTZXJ2ZXJXaXphcmQiCisgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKKyAgICAgIGljb249Imljb25zL2N0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmIj4KKyAgICA8ZGVzY3JpcHRpb24+JW5ld1NlcnZlckRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KKyAgPC93aXphcmQ+Cis8L2V4dGVuc2lvbj4KKworPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPiAKKyAgPGNhdGVnb3J5CisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgbmFtZT0iJWNhdGVnb3J5Ii8+CisKKyAgPHZpZXcKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJzVmlldyIKKyAgICBuYW1lPSIldmlld1NlcnZlcnMiCisgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLlNlcnZlcnNWaWV3IgorICAgIGljb249Imljb25zL2N2aWV3MTYvc2VydmVyc192aWV3LmdpZiIvPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+CisgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgorICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1BlcnNwZWN0aXZlIj4KKyAgICA8dmlldworICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVmlldyIKKyAgICAgIHJlbGF0aW9uc2hpcD0ic3RhY2siCisgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJzVmlldyI+CisgICAgPC92aWV3PgorICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgIDxwYWdlCisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJlZmVyZW5jZVBhZ2UiCisgICAgbmFtZT0iJXByZWZlcmVuY2VTZXJ2ZXJzVGl0bGUiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJlZmVyZW5jZVBhZ2UiPgorICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJlZmVyZW5jZUtleXdvcmRzIi8+CisgIDwvcGFnZT4KKyAgPHBhZ2UKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5sYXVuY2hpbmcucHJlZmVyZW5jZVBhZ2UiCisgICAgbmFtZT0iJXByZWZlcmVuY2VMYXVuY2hpbmdUaXRsZSIKKyAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcmVmZXJlbmNlUGFnZSIKKyAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5MYXVuY2hpbmdQcmVmZXJlbmNlUGFnZSI+CisgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KKyAgPC9wYWdlPgorICA8cGFnZQorICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnJ1bnRpbWUucHJlZmVyZW5jZVBhZ2UiCisgICAgbmFtZT0iJXByZWZlcmVuY2VSdW50aW1lc1RpdGxlIgorICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByZWZlcmVuY2VQYWdlIgorICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlJ1bnRpbWVQcmVmZXJlbmNlUGFnZSI+CisgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KKyAgPC9wYWdlPgorICA8cGFnZQorICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuYXVkaW8ucHJlZmVyZW5jZVBhZ2UiCisgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJlZmVyZW5jZVBhZ2UiCisgICAgbmFtZT0iJWF1ZGlvUHJlZmVyZW5jZVRpdGxlIgorICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvLkF1ZGlvUHJlZmVyZW5jZVBhZ2UiPgorICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuYXVkaW8ucHJlZmVyZW5jZUtleXdvcmRzIi8+CisgIDwvcGFnZT4KKzwvZXh0ZW5zaW9uPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+CisgIDxrZXl3b3JkCisgICAgbGFiZWw9IiVwcmVmZXJlbmNlU2VydmVyS2V5d29yZHMiCisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJlZmVyZW5jZUtleXdvcmRzIi8+CisgIDxrZXl3b3JkCisgICAgbGFiZWw9IiVwcmVmZXJlbmNlQXVkaW9LZXl3b3JkcyIKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5hdWRpby5wcmVmZXJlbmNlS2V5d29yZHMiLz4KKzwvZXh0ZW5zaW9uPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IiCisgICAgbmFtZT0iJXNlcnZlckVkaXRvciIKKyAgICBpY29uPSJpY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmIgorICAgIGV4dGVuc2lvbnM9InNlcnZlciIKKyAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9yIgorICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIi8+Cis8L2V4dGVuc2lvbj4KKworPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWxlbWVudEZhY3RvcmllcyI+CisgIDxmYWN0b3J5IGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5pbnB1dC5mYWN0b3J5IgorICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJFZGl0b3JJbnB1dEZhY3RvcnkiLz4KKzwvZXh0ZW5zaW9uPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KKyAgPHBhZ2UKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9qZWN0LnByb3BlcnRpZXMiCisgICAgbmFtZT0iJXByb3BlcnRpZXNTZXJ2ZXIiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuUHJvamVjdFByb3BlcnR5UGFnZSI+CisgICAgIDxlbmFibGVkV2hlbj4KKyAgICAgICA8YW5kPgorICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+CisgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pc1J1bm5hYmxlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgIDwvYW5kPgorICAgICA8L2VuYWJsZWRXaGVuPgorICA8L3BhZ2U+CisgIDxwYWdlCisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydGllcyIKKyAgICBuYW1lPSIlcHJvcGVydGllc1NlcnZlckluZm8iCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlQYWdlIj4KKyAgICAgPGVuYWJsZWRXaGVuPgorICAgICAgIDxhbmQ+CisgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIiLz4KKyAgICAgICA8L2FuZD4KKyAgICAgPC9lbmFibGVkV2hlbj4KKyAgPC9wYWdlPgorICA8cGFnZQorICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb3BlcnRpZXMubW9uaXRvciIKKyAgICBuYW1lPSIlcHJvcGVydGllc01vbml0b3IiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vbml0b3JQcm9wZXJ0eVBhZ2UiPgorICAgICA8ZW5hYmxlZFdoZW4+CisgICAgICAgPGFuZD4KKyAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciIvPgorICAgICAgIDwvYW5kPgorICAgICA8L2VuYWJsZWRXaGVuPgorICA8L3BhZ2U+Cis8L2V4dGVuc2lvbj4KKworPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+CisgIDxhY3Rpb25TZXQKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5uZXcuYWN0aW9uU2V0IgorICAgIGxhYmVsPSIlYWN0aW9uU2V0VGl0bGUiCisgICAgdmlzaWJsZT0iZmFsc2UiPgorICAgIDxhY3Rpb24KKyAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmFjdGlvbi5uZXcuc2VydmVyIgorICAgICAgdG9vbGJhclBhdGg9InNlcnZlcnMiCisgICAgICBsYWJlbD0iJWFjdGlvblNldE5ld1NlcnZlciIKKyAgICAgIHRvb2x0aXA9IiVhY3Rpb25TZXROZXdTZXJ2ZXIiCisgICAgICBpY29uPSJpY29ucy9jdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZiIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuTmV3U2VydmVyQWN0aW9uIi8+CisgIDwvYWN0aW9uU2V0PgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaFNob3J0Y3V0cyI+CisgICA8c2hvcnRjdXQKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmxhdW5jaFNob3J0Y3V0IgorICAgICAgICAgbGFiZWw9IiVhY3Rpb25SdW5PblNlcnZlciIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSIlYWN0aW9uUnVuT25TZXJ2ZXJEZXNjcmlwdGlvbiIKKyAgICAgICAgIG1vZGVzPSJydW4sIGRlYnVnLCBwcm9maWxlIgorICAgICAgICAgcGF0aD0iYWEiCisgICAgICAgICBpY29uPSJpY29ucy9ldG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmIgorICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyTGF1bmNoU2hvcnRjdXQiPgorICAgICAgPGNvbnRleHR1YWxMYXVuY2g+CisgICAgICAgIDxlbmFibGVtZW50PgorICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KKyAgICAgICAgICAgICA8Y291bnQgdmFsdWU9IjEiLz4KKyAgICAgICAgICAgICA8aXRlcmF0ZT4KKyAgICAgICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pc1J1bm5hYmxlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgIDwvaXRlcmF0ZT4KKyAgICAgICAgICAgPC93aXRoPgorICAgICAgICAgPC9lbmFibGVtZW50PgorICAgICAgICA8Y29udGV4dExhYmVsCisgICAgICAgICAgIG1vZGU9InJ1biIKKyAgICAgICAgICAgbGFiZWw9IiVhY3Rpb25SdW5PblNlcnZlciIvPgorICAgICAgICA8Y29udGV4dExhYmVsCisgICAgICAgICAgIG1vZGU9ImRlYnVnIgorICAgICAgICAgICBsYWJlbD0iJWFjdGlvbkRlYnVnT25TZXJ2ZXIiLz4KKyAgICAgICAgPGNvbnRleHRMYWJlbAorICAgICAgICAgICBtb2RlPSJwcm9maWxlIgorICAgICAgICAgICBsYWJlbD0iJWFjdGlvblByb2ZpbGVPblNlcnZlciIvPgorICAgICAgPC9jb250ZXh0dWFsTGF1bmNoPgorICAgICAgPGNvbmZpZ3VyYXRpb25UeXBlCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KKyAgICAgIDwvY29uZmlndXJhdGlvblR5cGU+CisgICA8L3Nob3J0Y3V0PgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KKyAgIDxwcm9wZXJ0eVRlc3RlcgorICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydHlUZXN0ZXIiCisgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgICBwcm9wZXJ0aWVzPSJpc1J1bm5hYmxlIgorICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclByb3BlcnR5VGVzdGVyIj4KKyAgIDwvcHJvcGVydHlUZXN0ZXI+CisgICA8cHJvcGVydHlUZXN0ZXIKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb3BlcnR5VGVzdGVyIgorICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIgorICAgICAgcHJvcGVydGllcz0ic2VydmVyVHlwZSIKKyAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIgorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlUZXN0ZXIiPgorICAgPC9wcm9wZXJ0eVRlc3Rlcj4KKyAgIDxwcm9wZXJ0eVRlc3RlcgorICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydHlUZXN0ZXIiCisgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgICBwcm9wZXJ0aWVzPSJzZXJ2ZXJUeXBlIgorICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIgorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlUZXN0ZXIiPgorICAgPC9wcm9wZXJ0eVRlc3Rlcj4KKyAgIDxwcm9wZXJ0eVRlc3RlcgorICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydHlUZXN0ZXIiCisgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgICBwcm9wZXJ0aWVzPSJtb2R1bGVUeXBlIgorICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUiCisgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcm9wZXJ0eVRlc3RlciI+CisgICA8L3Byb3BlcnR5VGVzdGVyPgorICAgPHByb3BlcnR5VGVzdGVyCisgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0eVRlc3RlciIKKyAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKKyAgICAgIHByb3BlcnRpZXM9Im1vZHVsZVR5cGUiCisgICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXIiCisgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcm9wZXJ0eVRlc3RlciI+CisgICA8L3Byb3BlcnR5VGVzdGVyPgorICAgPHByb3BlcnR5VGVzdGVyCisgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0eVRlc3RlciIKKyAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKKyAgICAgIHByb3BlcnRpZXM9Im1vZHVsZVZlcnNpb24iCisgICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclByb3BlcnR5VGVzdGVyIj4KKyAgIDwvcHJvcGVydHlUZXN0ZXI+CisgICA8cHJvcGVydHlUZXN0ZXIKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb3BlcnR5VGVzdGVyIgorICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIgorICAgICAgcHJvcGVydGllcz0ibW9kdWxlVmVyc2lvbiIKKyAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlciIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclByb3BlcnR5VGVzdGVyIj4KKyAgIDwvcHJvcGVydHlUZXN0ZXI+Cis8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvclBhZ2VzIj4KKyAgICA8cGFnZQorICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3IgorICAgICAgb3JkZXI9Ii0xMDAwMCIKKyAgICAgIG5hbWU9IiVzZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2UiCisgICAgICB0eXBlSWRzPSIqIgorICAgICAgaW5zZXJ0aW9uSWRzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5sZWZ0LCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5yaWdodCIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5PdmVydmlld0VkaXRvclBhcnQiLz4KKyAgPC9leHRlbnNpb24+CisKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KKyAgICA8ZmFjdG9yeQorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyQWRhcHRlckZhY3RvcnkiCisgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciI+CisgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyIi8+CisgICAgPC9mYWN0b3J5PgorICAgIDxmYWN0b3J5CisgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJBZGFwdGVyRmFjdG9yeSIKKyAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlciI+CisgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyIi8+CisgICAgPC9mYWN0b3J5PgorICAgIDxmYWN0b3J5CisgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlckFkYXB0ZXJGYWN0b3J5Ij4KKyAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyIi8+CisgICAgPC9mYWN0b3J5PgorICA8L2V4dGVuc2lvbj4KKworPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmNsaWVudHMiPgorICA8Y2xpZW50CisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2ViIgorICAgIG5hbWU9IiVsYXVuY2hhYmxlV2ViQnJvd3NlciIKKyAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGFibGVXZWJCcm93c2VyRGVzY3JpcHRpb24iCisgICAgbGF1bmNoYWJsZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSHR0cExhdW5jaGFibGUiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuV2ViTGF1bmNoYWJsZUNsaWVudCIvPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbFN0YXJ0dXAiPgorICA8c3RhcnR1cAorICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnN0YXJ0dXAiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU3RhcnR1cCIvPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuYXVkaW8iPgorICA8Y2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQuc2VydmVyIgorICAgIG5hbWU9IiVhdWRpb0NhdGVnb3J5U2VydmVyIi8+CisgIDxzb3VuZCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXJTdGFydCIKKyAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXIiCisgICAgbmFtZT0iJWF1ZGlvU2VydmVyU3RhcnRlZCIvPgorICA8c291bmQgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQuc2VydmVyU3RvcCIKKyAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXIiCisgICAgbmFtZT0iJWF1ZGlvU2VydmVyU3RvcHBlZCIvPgorICA8Y2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQucHVibGlzaCIKKyAgICBuYW1lPSIlYXVkaW9DYXRlZ29yeVB1Ymxpc2giLz4KKyAgPHNvdW5kIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnB1Ymxpc2hGaW5pc2hlZCIKKyAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5wdWJsaXNoIgorICAgIG5hbWU9IiVhdWRpb1B1Ymxpc2hGaW5pc2hlZCIvPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbFNlcnZlck1vbml0b3JzIj4KKyAgPG1vbml0b3IKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5tb25pdG9yIgorICAgIG5hbWU9IiVtb25pdG9yTGFiZWwiCisgICAgZGVzY3JpcHRpb249IiVtb25pdG9yRGVzY3JpcHRpb24iCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRGVmYXVsdE1vbml0b3JEZWxlZ2F0ZSIvPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgorICA8YWN0aW9uU2V0CisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5hY3Rpb25TZXQiCisgICAgbGFiZWw9IiVhY3Rpb25TZXRXZWJCcm93c2VyVGl0bGUiCisgICAgdmlzaWJsZT0iZmFsc2UiPgorICAgIDxhY3Rpb24KKyAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXIuYWN0aW9uLm9wZW4iCisgICAgICB0b29sYmFyUGF0aD0iYnJvd3NlciIKKyAgICAgIGxhYmVsPSIlYWN0aW9uU2V0T3BlbldlYkJyb3dzZXIiCisgICAgICB0b29sdGlwPSIlYWN0aW9uU2V0T3BlbldlYkJyb3dzZXIiCisgICAgICBpY29uPSJpY29ucy9vYmoxNi9pbnRlcm5hbF9icm93c2VyLmdpZiIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXIuT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24iLz4KKyAgICA8YWN0aW9uCisgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyLmFjdGlvbi5zd2l0Y2giCisgICAgICBtZW51YmFyUGF0aD0id2luZG93L2Jyb3dzZXIiCisgICAgICBsYWJlbD0iJWFjdGlvblNldFN3aXRjaEJyb3dzZXIiCisgICAgICB0b29sdGlwPSIlYWN0aW9uU2V0U3dpdGNoQnJvd3NlciIKKyAgICAgIHN0eWxlPSJwdWxsZG93biIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXIuU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbiIvPgorICA8L2FjdGlvblNldD4KKzwvZXh0ZW5zaW9uPgorCis8IS0tCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hHcm91cHMiPgorICA8bGF1bmNoR3JvdXAKKyAgICAgbGFiZWw9IiVFeHRlcm5hbFRvb2xzTGF1bmNoR3JvdXAubGFiZWwiCisgICAgIGJhbm5lckltYWdlPSJpY29ucy9mdWxsL3dpemJhbi9leHRfdG9vbHNfd2l6LmdpZiIKKyAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMiCisgICAgIGltYWdlPSJpY29ucy9mdWxsL29iajE2L2V4dGVybmFsX3Rvb2xzLmdpZiIKKyAgICAgbW9kZT0icnVuIgorICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5sYXVuY2hHcm91cCIKKyAgICAgdGl0bGU9IiVFeHRlcm5hbFRvb2xzTGF1bmNoR3JvdXAudGl0bGUiPgorICA8L2xhdW5jaEdyb3VwPgorICA8bGF1bmNoR3JvdXAKKyAgICAgbGFiZWw9IiVFeHRlcm5hbFRvb2xzTGF1bmNoR3JvdXAubGFiZWwiCisgICAgIGJhbm5lckltYWdlPSJpY29ucy9mdWxsL3dpemJhbi9leHRfdG9vbHNfd2l6LmdpZiIKKyAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuYnVpbGRlciIKKyAgICAgaW1hZ2U9Imljb25zL2Z1bGwvb2JqMTYvZXh0ZXJuYWxfdG9vbHMuZ2lmIgorICAgICBwdWJsaWM9ImZhbHNlIgorICAgICBtb2RlPSJydW4iCisgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmxhdW5jaEdyb3VwLmJ1aWxkZXIiPgorICAgPC9sYXVuY2hHcm91cD4KKzwvZXh0ZW5zaW9uPgorLS0+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KKyAgPGNhdGVnb3J5CisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgbmFtZT0iJWNhdGVnb3J5IgorICAgIGRlc2NyaXB0aW9uPSIlY2F0ZWdvcnkiLz4KKyAgPGNvbW1hbmQKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5sYXVuY2hTaG9ydGN1dC5ydW4iCisgICAgbmFtZT0iJWFjdGlvblJ1bk9uU2VydmVyIgorICAgIGRlc2NyaXB0aW9uPSIlYWN0aW9uUnVuT25TZXJ2ZXJEZXNjcmlwdGlvbiIKKyAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jYXRlZ29yeS5ydW4iLz4KKyAgPGNvbW1hbmQKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5sYXVuY2hTaG9ydGN1dC5kZWJ1ZyIKKyAgICBuYW1lPSIlYWN0aW9uRGVidWdPblNlcnZlciIKKyAgICBkZXNjcmlwdGlvbj0iJWFjdGlvbkRlYnVnT25TZXJ2ZXJEZXNjcmlwdGlvbiIKKyAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jYXRlZ29yeS5ydW4iLz4KKyAgPGNvbW1hbmQKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5ydW4iCisgICAgbmFtZT0iJWFjdGlvblJ1biIKKyAgICBkZXNjcmlwdGlvbj0iJWFjdGlvblJ1bkRlc2NyaXB0aW9uIgorICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLlNlcnZlckFjdGlvbkhhbmRsZXIiLz4KKyAgPGNvbW1hbmQKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5kZWJ1ZyIKKyAgICBuYW1lPSIlYWN0aW9uRGVidWciCisgICAgZGVzY3JpcHRpb249IiVhY3Rpb25EZWJ1Z0Rlc2NyaXB0aW9uIgorICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLlNlcnZlckFjdGlvbkhhbmRsZXIiLz4KKyAgPGNvbW1hbmQKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zdG9wIgorICAgIG5hbWU9IiVhY3Rpb25TdG9wIgorICAgIGRlc2NyaXB0aW9uPSIlYWN0aW9uU3RvcERlc2NyaXB0aW9uIgorICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLlNlcnZlckFjdGlvbkhhbmRsZXIiLz4KKyAgPGNvbW1hbmQKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wdWJsaXNoIgorICAgIG5hbWU9IiVhY3Rpb25QdWJsaXNoIgorICAgIGRlc2NyaXB0aW9uPSIlYWN0aW9uUHVibGlzaERlc2NyaXB0aW9uIgorICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCisgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLlNlcnZlckFjdGlvbkhhbmRsZXIiLz4KKzwvZXh0ZW5zaW9uPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+CisgIDxjb250ZXh0CisgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnNlcnZlclZpZXdTY29wZSIKKyAgICBuYW1lPSIlY29udGV4dCIKKyAgICBkZXNjcmlwdGlvbj0iJWNvbnRleHQiCisgICAgcGFyZW50SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLndpbmRvdyI+CisgIDwvY29udGV4dD4KKzwvZXh0ZW5zaW9uPgorCis8IS0tIGNvbW1hbmRzIGFuZCB0aGVpciBiaW5kaW5ncworTk9URToKK00xID0gQ1RSTC9DT01NQU5ECitNMiA9IFNISUZUCitNMyA9IEFMVAorTTQgPSBQbGF0Zm9ybS1zcGVjaWZpYyBmb3VydGgga2V5CistLT4KKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4KKyAgPGtleQorICAgIHNlcXVlbmNlPSJNMytNMitYIFIiCisgICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5nbG9iYWxTY29wZSIKKyAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubGF1bmNoU2hvcnRjdXQucnVuIgorICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+CisgIDxrZXkKKyAgICBzZXF1ZW5jZT0iTTMrTTIrRCBSIgorICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuZ2xvYmFsU2NvcGUiCisgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmxhdW5jaFNob3J0Y3V0LmRlYnVnIgorICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+CisgIDxrZXkKKyAgICBzZXF1ZW5jZT0iTTErTTMrUiIKKyAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLnNlcnZlclZpZXdTY29wZSIKKyAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucnVuIgorICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+CisgIDxrZXkKKyAgICBzZXF1ZW5jZT0iTTErTTMrRCIKKyAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLnNlcnZlclZpZXdTY29wZSIKKyAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGVidWciCisgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KKyAgPGtleQorICAgIHNlcXVlbmNlPSJNMStNMytTIgorICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuc2VydmVyVmlld1Njb3BlIgorICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zdG9wIgorICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+CisgIDxrZXkKKyAgICBzZXF1ZW5jZT0iTTErTTMrUCIKKyAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLnNlcnZlclZpZXdTY29wZSIKKyAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHVibGlzaCIKKyAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KKyAgPGltYWdlCisgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndlYiIKKyAgICAgdHlwZUlkcz0id3N0LndlYiIKKyAgICAgaWNvbj0iaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYiLz4KKzwvZXh0ZW5zaW9uPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+CisgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yCisgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCisgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnZhbGlkYXRpb24ubWFya2VyIi8+Cis8L2V4dGVuc2lvbj4KKworPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+CisgIDxkZWNvcmF0b3IKKyAgICAgYWRhcHRhYmxlPSJ0cnVlIgorICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Nb2R1bGVMYWJlbERlY29yYXRvciIKKyAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZGVjb3JhdG9yIgorICAgICBsYWJlbD0iJW1vZHVsZVByb2plY3REZWNvcmF0b3JMYWJlbCIKKyAgICAgbGlnaHR3ZWlnaHQ9ImZhbHNlIgorICAgICBzdGF0ZT0iZmFsc2UiPgorICAgIDxkZXNjcmlwdGlvbj4lbW9kdWxlUHJvamVjdERlY29yYXRvckRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KKyAgICA8ZW5hYmxlbWVudD4KKyAgICAgIDxvcj4KKyAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlIi8+CisgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXIiLz4KKyAgICAgIDwvb3I+CisgICAgPC9lbmFibGVtZW50PgorICA8L2RlY29yYXRvcj4KKzwvZXh0ZW5zaW9uPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlcyI+CisgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZQorICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgorICAgIGRlbGVnYXRlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiCisgICAgZGVsZWdhdGVOYW1lPSIlbGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlTmFtZSIKKyAgICBkZWxlZ2F0ZURlc2NyaXB0aW9uPSIlbGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlRGVzY3JpcHRpb24iCisgICAgcHVibGljPSJmYWxzZSIKKyAgICBtb2Rlcz0icnVuLGRlYnVnLHByb2ZpbGUiCisgICAgbmFtZT0iJXJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbiIvPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2VzIj4KKyAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKKyAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlIgorICAgIGNvbmZpZ1R5cGVJRD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKKyAgICBpY29uPSJpY29ucy9ldG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmIj4KKyAgPC9sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlPgorPC9leHRlbnNpb24+CisKKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVyVG9vbFRpcCI+CisgIDxzZXJ2ZXJUb29sVGlwCisgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuR2VuZXJhbFRvb2xUaXAiCisgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuR2VuZXJhbFRvb2xUaXAiCisgICAgc2VydmVyVHlwZXM9IioiLz4KKzwvZXh0ZW5zaW9uPgorCis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KKyAgPGxhdW5jaGFibGVBZGFwdGVyCisgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luJERlZmF1bHRMYXVuY2hhYmxlQWRhcHRlciIKKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubGF1bmNoYWJsZS5hZGFwdGVyLmRlZmF1bHQiCisgICAgICAgIHByaW9yaXR5PSItOTk5OTk5Ii8+Cis8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2F1ZGlvLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2F1ZGlvLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5ZWRmOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvYXVkaW8uZXhzZApAQCAtMCwwICsxLDE1MSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9ImF1ZGlvIiBuYW1lPSJBdWRpbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBzb3J0IHJ1bnRpbWUgdHlwZXMsIHJ1bnRpbWVzLCBzZXJ2ZXIgdHlwZXMsIGFuZCBzZXJ2ZXJzLiBUaGUgZmlyc3QgZXh0ZW5zaW9uIGZvdW5kIGlzIGFsd2F5cyB1c2VkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkgb25lIGNvbXBhcmF0b3IgZXhpc3RzIGluIGFuIGluc3RhbGxhdGlvbi4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic291bmQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgorICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjYXRlZ29yeQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgY2F0ZWdvcnkKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0ic291bmQiPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBzb3VuZAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgY2F0ZWdvcnkgaWQKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHNvdW5kCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzb3J0ZXIgZXh0ZW5zaW9uIHBvaW50OgorCismbHQ7cHJlJmd0OworICAgJmx0O2V4dGVuc2lvbiAKKyAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc29ydGVyJnF1b3Q7Jmd0OworICAgICAgJmx0O2ltYWdlCisgICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZSZxdW90OworICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZS5NeUNvbXBhcmF0b3ImcXVvdDsvJmd0OworICAgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvckFjdGlvbnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yQWN0aW9ucy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Y2ZjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvckFjdGlvbnMuZXhzZApAQCAtMCwwICsxLDE1OSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0iZWRpdG9yQWN0aW9ucyIgbmFtZT0iRWRpdG9yIEFjdGlvbnMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gYWRkIGFjdGlvbnMgdG8gdGhlIHRvb2xiYXIgb2YgYW4gZXhpc3Rpbmcgc2VydmVyIGVkaXRvci4NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZT4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRvckFjdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZWRpdG9yQWN0aW9uIj4NCisgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQorICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgYWN0aW9uDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlIi8+DQorICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzZXJ2ZXIgdHlwZSBpZHMuIE1heSBpbmNsdWRlIHdpbGRjYXJkcyAoKikgYXQgdGhlIGVuZCBvZiBhbiBpZA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIGFjdGlvbg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQorICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgYW4gYWJzb2x1dGUgb3JkZXJpbmcgb2YgdGhlIGFjdGlvbiByZWxhdGl2ZSB0byBvdGhlciBhY3Rpb25zDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZWRpdG9yIGFjdGlvbiBleHRlbnNpb24gcG9pbnQ6DQorDQorJmx0O3ByZSZndDsNCisgICAmbHQ7ZXh0ZW5zaW9uDQorICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3JBY3Rpb25zJnF1b3Q7Jmd0Ow0KKyAgICAgICZsdDtwYWdlDQorICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsNCisgICAgICAgICAgICBvcmRlcj0mcXVvdDsyMCZxdW90Ow0KKyAgICAgICAgICAgIG5hbWU9JnF1b3Q7JWVkaXRvckFjdGlvbiZxdW90Ow0KKyAgICAgICAgICAgIHR5cGVJZHM9JnF1b3Q7Y29tLmV4YW1wbGUuKiZxdW90Ow0KKyAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVFZGl0b3JBY3Rpb24mcXVvdDsvJmd0Ow0KKyAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KKyZsdDsvcHJlJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIA0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yUGFnZVNlY3Rpb25zLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VTZWN0aW9ucy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZmE4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VTZWN0aW9ucy5leHNkCkBAIC0wLDAgKzEsMTU2IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJlZGl0b3JQYWdlU2VjdGlvbnMiIG5hbWU9IkVkaXRvciBQYWdlIFNlY3Rpb25zIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBhZGRpdGlvbmFsIHNlY3Rpb25zIGludG8gYW4gZXhpc3Rpbmcgc2VydmVyIGVkaXRvciBwYWdlIHRoYXQgY29udGFpbnMgaW5zZXJ0aW9uIHBvaW50cy4NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZT4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlY3Rpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9InNlY3Rpb24iPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQorICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgc2VjdGlvbg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JTZWN0aW9uJmx0Oy9zYW1wJmd0Ow0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuU2VydmVyRWRpdG9yU2VjdGlvbiIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2VydmVyIHR5cGUgaWRzLiBNYXkgaW5jbHVkZSB3aWxkY2FyZHMgKCopIGF0IHRoZSBlbmQgb2YgYW4gaWQNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcyBhbiBhYnNvbHV0ZSBvcmRlcmluZyBvZiB0aGUgc2VjdGlvbiByZWxhdGl2ZSB0byBvdGhlciBzZWN0aW9ucw0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRpb25JZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICB0aGUgZWRpdG9yIHBhZ2UgaW5zZXJ0aW9uIGlkIHRoYXQgdGhpcyBzZWN0aW9uIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIDEuMA0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZWRpdG9yIHBhZ2Ugc2VjdGlvbiBleHRlbnNpb24gcG9pbnQ6DQorDQorJmx0O3ByZSZndDsNCisgICAmbHQ7ZXh0ZW5zaW9uIA0KKyAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yUGFnZVNlY3Rpb25zJnF1b3Q7Jmd0Ow0KKyAgICAgICZsdDtzZWN0aW9uDQorICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsNCisgICAgICAgICAgICBvcmRlcj0mcXVvdDswJnF1b3Q7DQorICAgICAgICAgICAgaW5zZXJ0aW9uSWQ9JnF1b3Q7Y29tLmV4YW1wbGUubGVmdCZxdW90Ow0KKyAgICAgICAgICAgIHR5cGVJZHM9JnF1b3Q7Y29tLmV4YW1wbGUuKiZxdW90Ow0KKyAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVFZGl0b3JTZWN0aW9uRmFjdG9yeSZxdW90Oy8mZ3Q7DQorICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQorJmx0Oy9wcmUmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5RGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7Lg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yUGFnZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yUGFnZXMuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2E5ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9lZGl0b3JQYWdlcy5leHNkCkBAIC0wLDAgKzEsMTY2IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJlZGl0b3JQYWdlcyIgbmFtZT0iRWRpdG9yIFBhZ2VzIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBhbiBhZGRpdGlvbmFsIHBhZ2UgdG8gYSBzZXJ2ZXIgb3Igc2VydmVyIGNvbmZpZ3VyYXRpb24gZWRpdG9yLg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0icGFnZSI+DQorICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KKyAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZT4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBhZ2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQmbHQ7L3NhbXAmZ3Q7DQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHBhZ2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2VydmVyIHR5cGUgaWRzLiBNYXkgaW5jbHVkZSB3aWxkY2FyZHMgKCopIGF0IHRoZSBlbmQgb2YgYW4gaWQNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcyBhbiBhYnNvbHV0ZSBvcmRlcmluZyBvZiB0aGUgcGFnZSByZWxhdGl2ZSB0byBvdGhlciBwYWdlcw0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRpb25JZHMiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBpbnNlcnRpb24gaWRzIHRoYXQgYWxsb3cgc2VjdGlvbnMgdG8gYmUgcGx1Z2dlZCBpbg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAxLjANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGVkaXRvciBwYWdlIGV4dGVuc2lvbiBwb2ludDoNCisNCismbHQ7cHJlJmd0Ow0KKyAgICZsdDtleHRlbnNpb24NCisgICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvclBhZ2VzJnF1b3Q7Jmd0Ow0KKyAgICAgICZsdDtwYWdlDQorICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsNCisgICAgICAgICAgICBvcmRlcj0mcXVvdDsyMCZxdW90Ow0KKyAgICAgICAgICAgIG5hbWU9JnF1b3Q7JWVkaXRvclBhZ2UmcXVvdDsNCisgICAgICAgICAgICB0eXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLiomcXVvdDsNCisgICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlRWRpdG9yRmFjdG9yeSZxdW90Oy8mZ3Q7DQorICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQorJmx0Oy9wcmUmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeURlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQorYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCis8L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2luaXRpYWxTZWxlY3Rpb25Qcm92aWRlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTliY2EzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIuZXhzZApAQCAtMCwwICsxLDEyNyBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9ImluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciIgbmFtZT0iSW5pdGlhbCBTZWxlY3Rpb24gUHJvdmlkZXIiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gaW5pdGlhbGx5IHNlbGVjdCBydW50aW1lIHR5cGVzLCBydW50aW1lcywgc2VydmVyIHR5cGVzLCBhbmQgc2VydmVycyBpbiB0aGUgc2VydmVyIHdpemFyZHMuIFRoZSBmaXJzdCBleHRlbnNpb24gZm91bmQgaXMgYWx3YXlzIHVzZWQgYW5kIGl0IGlzIGV4cGVjdGVkIHRoYXQgb25seSBvbmUgaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIGV4aXN0cyBpbiBhbiBpbnN0YWxsYXRpb24uCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlbGVjdGlvblByb3ZpZGVyIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0ic2VsZWN0aW9uUHJvdmlkZXIiPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KKyAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciZsdDsvc2FtcCZndDsuIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludDoKKworJmx0O3ByZSZndDsKKyAgICZsdDtleHRlbnNpb24gCisgICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciZxdW90OyZndDsKKyAgICAgICZsdDtzZWxlY3Rpb25Qcm92aWRlcgorICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsKKyAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUuTXlTZWxlY3Rpb25Qcm92aWRlciZxdW90Oy8mZ3Q7CisgICAmbHQ7L2V4dGVuc2lvbiZndDsKKyZsdDsvcHJlJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7CitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAorYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCismbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVySW1hZ2VzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlckltYWdlcy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YWUwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlckltYWdlcy5leHNkCkBAIC0wLDAgKzEsMTM1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJzZXJ2ZXJJbWFnZXMiIG5hbWU9IlNlcnZlciBJbWFnZXMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gcHJvdmlkZSBhbiBpbWFnZSBmb3IgYSBydW50aW1lLCBzZXJ2ZXIsIHNlcnZlciBjb25maWd1cmF0aW9uIG9yIG1vZHVsZSB0eXBlLg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW1hZ2UiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImltYWdlIj4NCisgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KKyAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW1hZ2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhIGJ1bmRsZS1yZWxhdGl2ZSBwYXRoIHRvIHRoZSBpY29uIGltYWdlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcnVudGltZSwgc2VydmVyLCBvciBtb2R1bGUgdHlwZSBpZHMNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgMS4wDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHNlcnZlciBpbWFnZSBleHRlbnNpb24gcG9pbnQ6DQorDQorJmx0O3ByZSZndDsNCisgICAmbHQ7ZXh0ZW5zaW9uIA0KKyAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzJnF1b3Q7Jmd0Ow0KKyAgICAgICZsdDtpbWFnZQ0KKyAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7DQorICAgICAgICAgICAgaWNvbj0mcXVvdDtpY29ucy9vYmoxNi9ydW50aW1lLmdpZiZxdW90Ow0KKyAgICAgICAgICAgIHR5cGVJZHM9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZSZxdW90Oy8mZ3Q7DQorICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQorJmx0Oy9wcmUmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIA0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCit0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCismbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9zZXJ2ZXJUb29sVGlwLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlclRvb2xUaXAuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM0OTE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9zZXJ2ZXJUb29sVGlwLmV4c2QKQEAgLTAsMCArMSwxMzggQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9InNlcnZlclRvb2xUaXAiIG5hbWU9IlNlcnZlciBUb29sVGlwIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBhZGRpdGlvbmFsIHRleHQgd2hlbiB0aGUgbW91c2VvdmVyIGFjdGlvbiBpcyBkZXRlY3RlZAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZXJ2ZXJUb29sVGlwIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9InNlcnZlclRvb2xUaXAiPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+CisgICAgICAgICA8L2FwcGluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIFRvb2xUaXAgcHJvdmlkZXIKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLklTZXJ2ZXJUb29sVGlwJmx0Oy9zYW1wJmd0OworICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlcnZlclRvb2xUaXAiLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXJUeXBlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHR5cGUgaWRzIHRoYXQgdXNlIHRoaXMgU2VydmVyVG9vbFRpcAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAzLjAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHRoZSBleHRlbnNpb24gcG9pbnQ6CisKKyZsdDtwcmUmZ3Q7CisgICAmbHQ7ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlclRvb2xUaXAmcXVvdDsmZ3Q7CisgICAgICAmbHQ7c2VydmVyVG9vbFRpcAorICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsKKyAgICAgICAgICAgIHNlcnZlclR5cGVzPSZxdW90OyomcXVvdDsKKyAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVUb29sVGlwUHJvdmlkZXImcXVvdDsvJmd0OworICAgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7CitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAorYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCismbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvd2l6YXJkRnJhZ21lbnRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3dpemFyZEZyYWdtZW50cy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTg5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3dpemFyZEZyYWdtZW50cy5leHNkCkBAIC0wLDAgKzEsMTM1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJ3aXphcmRGcmFnbWVudHMiIG5hbWU9IldpemFyZCBGcmFnbWVudHMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gYWRkIHBhZ2VzIG9yIGxvZ2ljIGludG8gd2l6YXJkcyBmb3IgYSBzcGVjaWZpYyBydW50aW1lLCBzZXJ2ZXIsIG9yIHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUuDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2U+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmcmFnbWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZnJhZ21lbnQiPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQorICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBmcmFnbWVudA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudCZsdDsvc2FtcCZndDsNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50Ii8+DQorICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBydW50aW1lIG9yIHNlcnZlciB0eXBlIGlkcyB0aGF0IHRoaXMgZnJhZ21lbnQgYXBwbGllcyB0bw0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAxLjANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgd2l6YXJkIGZyYWdtZW50IGV4dGVuc2lvbiBwb2ludDoNCisNCismbHQ7cHJlJmd0Ow0KKyAgICZsdDtleHRlbnNpb24gDQorICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMmcXVvdDsmZ3Q7DQorICAgICAgJmx0O2ZyYWdtZW50DQorICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsNCisgICAgICAgICAgICB0eXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUmcXVvdDsNCisgICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlV2l6YXJkRnJhZ21lbnQmcXVvdDsvJmd0Ow0KKyAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KKyZsdDsvcHJlJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQmbHQ7L2NvZGUmZ3Q7Lg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJBZGFwdGVyU2l0ZXMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlckFkYXB0ZXJTaXRlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlYzVlMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJBZGFwdGVyU2l0ZXMueG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxleHRlbnNpb25zPgorICAgIDxzaXRlIHVybD0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvZ2Vyb25pbW8vZWNsaXBzZS91cGRhdGVzLyIvPgorICAgIDxzaXRlIHVybD0iaHR0cDovL2Rvd25sb2FkLmJvdWxkZXIuaWJtLmNvbS9pYm1kbC9wdWIvc29mdHdhcmUvd2Vic3BoZXJlL3dhc2NlL3VwZGF0ZXMvIi8+CisgICAgPHNpdGUgdXJsPSJodHRwOi8vd3d3LnByYW1hdGkuY29tL2Rvd25sb2Fkcy9lY2xpcHNlL3VwZGF0ZXMvIi8+CisgICAgPHNpdGUgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zLyIvPgorICAgIDxzaXRlIHVybD0iaHR0cDovL2Rvd25sb2FkLm9yYWNsZS5jb20vb3RuX3NvZnR3YXJlL29lcGUvZ2FueW1lZGUvd2xzLWFkYXB0ZXIvIi8+CisgICAgPHNpdGUgdXJsPSJodHRwczovL2FqYXguZGV2LmphdmEubmV0L2VjbGlwc2UiLz4KKyAgICA8c2l0ZSB1cmw9Imh0dHBzOi8vd3d3LnNkbi5zYXAuY29tL2Rvd25sb2Fkcy91cGRhdGVzL25ldHdlYXZlci9ud2RzL3NhcG53c2VydmVyLyIvPgorICAgIDxzaXRlIHVybD0iaHR0cDovL3d3dy53ZWJ0aWRlLmNvbS9lY2xpcHNlIi8+Cis8L2V4dGVuc2lvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvRmFjZXRSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvRmFjZXRSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZGZmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9GYWNldFJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXI7CisvKioKKyAqIEEgZmFjZXQgcnVudGltZSBsYWJlbCBwcm92aWRlciB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGltcGxlbWVudGF0aW9uIG9mCisgKiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIGluIHRoZQorICogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMgZXh0ZW5zaW9uIHBvaW50LgorICovCitwdWJsaWMgY2xhc3MgRmFjZXRSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBJUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIuY2xhc3MgfTsKKworCXB1YmxpYyBmaW5hbCBjbGFzcyBSdW50aW1lTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciB7CisJCXByaXZhdGUgZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmM7CisKKwkJcHVibGljIFJ1bnRpbWVMYWJlbFByb3ZpZGVyKElSdW50aW1lQ29tcG9uZW50IHJjKSB7CisJCQl0aGlzLnJjID0gcmM7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQkJcmV0dXJuIHJjLmdldFByb3BlcnR5KCJ0eXBlIik7CisJCX0KKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZSwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKKwkJSVJ1bnRpbWVDb21wb25lbnQgcmMgPSAoSVJ1bnRpbWVDb21wb25lbnQpIGFkYXB0YWJsZTsKKwkJcmV0dXJuIG5ldyBSdW50aW1lTGFiZWxQcm92aWRlcihyYyk7CisJfQorCisJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7CisJCXJldHVybiBBREFQVEVSX1RZUEVTOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9JU2VydmVyTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9JU2VydmVyTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljOTIxNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL0lTZXJ2ZXJNb2R1bGUuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKKy8qKgorICogQSBoZWxwZXIgaW50ZXJmYWNlIGZvciBtb2R1bGVzIHRoYXQgYXJlIGRlcGxveWVkIHRvIGEgc2VydmVyLCBjb21tb25seQorICogdXNlZCB0byBoZWxwIGFjdGlvbnMgaW50ZXJhY3Qgd2l0aCBtb2R1bGVzIGluIHRoZSBTZXJ2ZXJzIHZpZXcuCisgKgorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJNb2R1bGUgeworCS8qKgorCSAqIFJldHVybiB0aGUgc2VydmVyIHRoYXQgdGhlIG1vZHVsZSBiZWxvbmdzIHRvLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNlcnZlcgorCSAqLworCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbW9kdWxlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1vZHVsZQorCSAqLworCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxM2ZhZDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiLmphdmEKQEAgLTAsMCArMSwzMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuKjsKKy8qKgorICogU2VydmVyIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYi4KKyAqIAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYiBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYiB7CisJLy8gZmxhZyB0byBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGVuYWJsZSBjb21ibyBpbiBsYXVuY2ggY29uZmlnIGRpYWxvZworCS8vIGFmdGVyIHRoZSB1c2VyIHJlcXVlc3RzIGEgbGF1bmNoLCB0aGV5IGNhbm5vdCBjaGFuZ2UgaXQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9PTkxZID0gInJlYWQtb25seSI7CisKKwlwcml2YXRlIFN0cmluZ1tdIHNlcnZlclR5cGVJZHM7CisKKwlwcml2YXRlIENvbWJvIHNlcnZlckNvbWJvOworCisJcHJpdmF0ZSBMYWJlbCBydW50aW1lTGFiZWw7CisJcHJpdmF0ZSBMYWJlbCBob3N0bmFtZTsKKworCXByaXZhdGUgSVNlcnZlciBzZXJ2ZXI7CisKKwkvLyBsaXN0IG9mIHNlcnZlcnMgdGhhdCBhcmUgaW4gY29tYm8KKwlwcml2YXRlIExpc3Q8SVNlcnZlcj4gc2VydmVyczsKKworCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YzsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGFiLgorCSAqLworCXB1YmxpYyBTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiKCkgeworCQl0aGlzKG5ldyBTdHJpbmdbXSB7IioifSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IHNlcnZlciBsYXVuY2ggY29uZmlndXJhdGlvbiB0YWIgd2l0aCB0aGUgZ2l2ZW4gc2VydmVyIHR5cGUgaWRzLgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWRzIGFuIGFycmF5IG9mIHNlcnZlciB0eXBlIGlkcworCSAqLworCXB1YmxpYyBTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiKFN0cmluZ1tdIHNlcnZlclR5cGVJZHMpIHsKKwkJdGhpcy5zZXJ2ZXJUeXBlSWRzID0gc2VydmVyVHlwZUlkczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSA1OworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisKKwkJLy9HcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCS8vZGF0YS53aWR0aEhpbnQgPSAyMDA7CisJCS8vY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7CisJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuc2VydmVyTGF1bmNoRGVzY3JpcHRpb24pOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKKwkJZGF0YS53aWR0aEhpbnQgPSAzMDA7CisJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5zZXJ2ZXJMYXVuY2hTZXJ2ZXIpOworCQlzZXJ2ZXJDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7CisJCXNlcnZlckNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQlzZXJ2ZXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXdpZGdldFNlbGVjdGVkKGUpOworCQkJfQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWhhbmRsZVNlcnZlclNlbGVjdGlvbigpOworCQkJfQorCQl9KTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzZXJ2ZXJDb21ibywgQ29udGV4dElkcy5MQVVOQ0hfQ09ORklHVVJBVElPTl9TRVJWRVJfQ09NQk8pOworCisJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckxhdW5jaFJ1bnRpbWUpOworCQlydW50aW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXJ1bnRpbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJCisJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckxhdW5jaEhvc3QpOworCQlob3N0bmFtZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJaG9zdG5hbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQorCQkvLyBpbml0aWFsaXplCisJCUlTZXJ2ZXJbXSBzZXJ2ZXJzMiA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOworCQlzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOworCQlpZiAoc2VydmVyczIgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBzZXJ2ZXJzMi5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCUlTZXJ2ZXIgc2VydmVyMiA9IHNlcnZlcnMyW2ldOworCQkJCWlmIChzZXJ2ZXIyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIGlzU3VwcG9ydGVkU2VydmVyKHNlcnZlcjIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpKSB7CisJCQkJCXNlcnZlckNvbWJvLmFkZChzZXJ2ZXIyLmdldE5hbWUoKSk7CisJCQkJCXNlcnZlcnMuYWRkKHNlcnZlcjIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIHNlbGVjdCBmaXJzdCBpdGVtIGluIGxpc3QKKwkJaWYgKHNlcnZlckNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKKwkJCXNlcnZlckNvbWJvLnNlbGVjdCgwKTsKKworCQloYW5kbGVTZXJ2ZXJTZWxlY3Rpb24oKTsKKworCQlzZXJ2ZXJDb21iby5mb3JjZUZvY3VzKCk7CisKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOworCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBpc1N1cHBvcnRlZFNlcnZlcihTdHJpbmcgc2VydmVyVHlwZUlkKSB7CisJCWlmIChzZXJ2ZXJUeXBlSWRzID09IG51bGwpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlSWRzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmIChtYXRjaGVzKHNlcnZlclR5cGVJZCwgc2VydmVyVHlwZUlkc1tpXSkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsIHx8ICIqIi5lcXVhbHMoYSkgfHwgIioiLmVxdWFscyhiKSB8fCBhLnN0YXJ0c1dpdGgoYikgfHwgYi5zdGFydHNXaXRoKGEpKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogQ2FsbGVkIHdoZW4gYSBzZXJ2ZXIgaXMgc2VsZWN0ZWQuCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyU2VsZWN0aW9uKCkgeworCQlpZiAoc2VydmVycy5pc0VtcHR5KCkpCisJCQlzZXJ2ZXIgPSBudWxsOworCQllbHNlCisJCQlzZXJ2ZXIgPSBzZXJ2ZXJzLmdldChzZXJ2ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKKwkJSVJ1bnRpbWUgcnVudGltZSA9IG51bGw7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgeworCQkJcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7CisJCQlob3N0bmFtZS5zZXRUZXh0KHNlcnZlci5nZXRIb3N0KCkpOworCQl9IGVsc2UKKwkJCWhvc3RuYW1lLnNldFRleHQoIiIpOworCQkKKwkJLy8gY2hlY2sgaWYgInJ1bnRpbWUiIHByb3BlcnR5IGlzIHRydWUgb3IgZmFsc2UKKwkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNSdW50aW1lKCkpCisJCQlydW50aW1lTGFiZWwuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7CisJCWVsc2UKKwkJCXJ1bnRpbWVMYWJlbC5zZXRUZXh0KCIiKTsKKwkJCisJCXRyeSB7CisJCQlpZiAod2MgIT0gbnVsbCkKKwkJCQkoKFNlcnZlcilzZXJ2ZXIpLnNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3YywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUKKwkJfQorCQkKKwkJaWYgKHNlcnZlciA9PSBudWxsKQorCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmVycm9yTm9TZXJ2ZXJTZWxlY3RlZCk7CisJCWVsc2UgaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKKwkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5lcnJvclNlcnZlckFscmVhZHlSdW5uaW5nKTsKKwkJZWxzZQorCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQkKKwkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKKwkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQlpZiAoc2VydmVyQ29tYm8gIT0gbnVsbCkgewkKKwkJCXNlcnZlckNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7CisJCQlpZiAoc2VydmVyQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKQorCQkJCXNlcnZlckNvbWJvLnNlbGVjdCgwKTsKKwkJfQorCQkKKwkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgeworCQkJc2VydmVyID0gc2VydmVycy5nZXQoc2VydmVyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7CisJCQlpZiAoc2VydmVyICE9IG51bGwpCisJCQkJKChTZXJ2ZXIpIHNlcnZlcikuc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24sIG51bGwpOworCQl9CisJCXdjID0gY29uZmlndXJhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2luaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKwkJc2VydmVyQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKKwkJLy9yZW1vdmUgZXJyb3IgbWVzc2FnZSB0aGF0IG90aGVyIGluc3RhbmNlcyBtYXkgaGF2ZSBzZXQKKwkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQkKKwkJdHJ5IHsKKwkJCVN0cmluZyBzZXJ2ZXJJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFNlcnZlci5BVFRSX1NFUlZFUl9JRCwgIiIpOworCQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgIXNlcnZlcklkLmVxdWFscygiIikpIHsKKwkJCQlzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySWQpOworCQkJCQorCQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgeyAvLyBzZXJ2ZXIgbm8gbG9uZ2VyIGV4aXN0cwkJCQkKKwkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmVycm9ySW52YWxpZFNlcnZlcik7CisJCQkJCS8vc2VydmVyQ29tYm8uY2xlYXJTZWxlY3Rpb24oKTsgIC8vIGFwcGVhcnMgdG8gYmUgYnJva2VuLi4uZG9lc24ndCB3b3JrIHdpdGggcmVhZCBvbmx5PwkJCQkJCQkJCQkJCQorCQkJCQlzZXJ2ZXJDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQkKKwkJCQlzZXJ2ZXJDb21iby5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOworCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCisJCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5lcnJvclNlcnZlckFscmVhZHlSdW5uaW5nKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNlcnZlckNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKKwkJCQkJc2VydmVyQ29tYm8uc2VsZWN0KDApOworCQkJfQorCQkJLy8gZmxhZyBzaG91bGQgb25seSBiZSBzZXQgaWYgbGF1bmNoIGhhcyBiZWVuIGF0dGVtcHRlZCBvbiB0aGUgY29uZmlnCisJCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoUkVBRF9PTkxZLCBmYWxzZSkpCisJCQkJc2VydmVyQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3BlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQorCSAqLworCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKKwkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCBzZXJ2ZXIuZ2V0SWQoKSk7CisJCWVsc2UKKwkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFNlcnZlci5BVFRSX1NFUlZFUl9JRCwgKFN0cmluZyludWxsKTsKKwkJd2MgPSBjb25maWd1cmF0aW9uOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbikgCisJICovCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcpIHsKKwkJdHJ5IHsKKwkJCVN0cmluZyBpZCA9IGxhdW5jaENvbmZpZy5nZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCAiIik7CisJCQlpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKCIiKSkgeworCQkJCUlTZXJ2ZXIgc2VydmVyMiA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihpZCk7CisJCQkJaWYgKHNlcnZlcjIgPT0gbnVsbCkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCWlmIChzZXJ2ZXIyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXRJbWFnZSgpCisJICovCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gTWVzc2FnZXMuc2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJVSUNvcmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJQ29yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDkzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJVSUNvcmUuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlckxhYmVsUHJvdmlkZXI7CisvKioKKyAqIFNlcnZlciBVSSBjb3JlLgorICogPHA+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgorICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgorICogPC9wPgorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2VydmVyVUlDb3JlIHsKKwkvKioKKwkgKiBDYW5ub3QgaW5zdGFudGlhdGUgU2VydmVyVUlDb3JlIC0gdXNlIHN0YXRpYyBtZXRob2RzLgorCSAqLworCXByaXZhdGUgU2VydmVyVUlDb3JlKCkgeworCQkvLyBjYW4ndCBjcmVhdGUKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbGFiZWwgcHJvdmlkZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYWxsIHNlcnZlcgorCSAqIG9iamVjdHMgaW4gdGhlIFVJLgorCSAqIAorCSAqIEByZXR1cm4gYSBsYWJlbCBwcm92aWRlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBTZXJ2ZXJMYWJlbFByb3ZpZGVyKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyVUlVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0YTBmYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJVXRpbC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKy8qKgorICogU2VydmVyIFVJIHV0aWxpdHkgbWV0aG9kcy4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBzdGF0aWMgbWVtYmVycy4KKyAqIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9yIGluc3RhbnRpYXRlZC4KKyAqIDwvcD4KKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlcnZlclVJVXRpbCB7CisJLyoqCisJICogQ2Fubm90IGluc3RhbnRpYXRlIFNlcnZlclVJVXRpbCAtIHVzZSBzdGF0aWMgbWV0aG9kcy4KKwkgKi8KKwlwcml2YXRlIFNlcnZlclVJVXRpbCgpIHsKKwkJLy8gY2FuJ3QgY3JlYXRlCisJfQorCisJLyoqCisJICogT3BlbiB0aGUgbmV3IHJ1bnRpbWUgd2l6YXJkLiBUaGUgZ2l2ZW4gdHlwZUlkIGFuZCB2ZXJzaW9uSWQgYXJlIHVzZWQgdG8gZmlsdGVyCisJICogdGhlIHNldCBvZiBydW50aW1lcyBkaXNwbGF5ZWQuCisJICogCisJICogQHBhcmFtIHNoZWxsIGEgc2hlbGwgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIHdpemFyZAorCSAqIEBwYXJhbSB0eXBlSWQgYSBtb2R1bGUgdHlwZSBpZCwgb3IgbnVsbCBmb3IgYW55IG1vZHVsZSB0eXBlCisJICogQHBhcmFtIHZlcnNpb25JZCBhIG1vZHVsZSB2ZXJzaW9uLCBvciBudWxsIGZvciBhbnkgdmVyc2lvbgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBydW50aW1lIHdhcyBjcmVhdGVkLCBvcgorCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd05ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIFN0cmluZyB0eXBlSWQsIFN0cmluZyB2ZXJzaW9uSWQpIHsKKwkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLnNob3dOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCB0eXBlSWQsIHZlcnNpb25JZCwgbnVsbCk7CisJfQorCisJLyoqCisJICogT3BlbiB0aGUgbmV3IHJ1bnRpbWUgd2l6YXJkLiBUaGUgZ2l2ZW4gdHlwZUlkLCB2ZXJzaW9uSWQsIGFuZCBydW50aW1lVHlwZUlkIGFyZQorCSAqIHVzZWQgdG8gZmlsdGVyIHRoZSBzZXQgb2YgcnVudGltZXMgZGlzcGxheWVkLgorCSAqIAorCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSB3aXphcmQKKwkgKiBAcGFyYW0gdHlwZUlkIGEgbW9kdWxlIHR5cGUgaWQsIG9yIG51bGwgZm9yIGFueSBtb2R1bGUgdHlwZQorCSAqIEBwYXJhbSB2ZXJzaW9uSWQgYSBtb2R1bGUgdmVyc2lvbiwgb3IgbnVsbCBmb3IgYW55IHZlcnNpb24KKwkgKiBAcGFyYW0gcnVudGltZVR5cGVJZCBhIHNlcnZlciBydW50aW1lIHR5cGUsIG9yIG51bGwgZm9yIGFueSB0eXBlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHJ1bnRpbWUgd2FzIGNyZWF0ZWQsIG9yCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd05ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIFN0cmluZyB0eXBlSWQsIFN0cmluZyB2ZXJzaW9uSWQsIFN0cmluZyBydW50aW1lVHlwZUlkKSB7CisJCXJldHVybiBTZXJ2ZXJVSVBsdWdpbi5zaG93TmV3UnVudGltZVdpemFyZChzaGVsbCwgdHlwZUlkLCB2ZXJzaW9uSWQsIHJ1bnRpbWVUeXBlSWQpOwkJCisJfQorCisJLyoqCisJICogT3BlbiB0aGUgbmV3IHNlcnZlciB3aXphcmQuCisJICogCisJICogQHBhcmFtIHNoZWxsIGEgc2hlbGwgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIHdpemFyZAorCSAqIEBwYXJhbSB0eXBlSWQgYSBtb2R1bGUgdHlwZSBpZCwgb3IgbnVsbCBmb3IgYW55IG1vZHVsZSB0eXBlCisJICogQHBhcmFtIHZlcnNpb25JZCBhIG1vZHVsZSB2ZXJzaW9uLCBvciBudWxsIGZvciBhbnkgdmVyc2lvbgorCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQgYSBzZXJ2ZXIgcnVudGltZSB0eXBlLCBvciBudWxsIGZvciBhbnkgdHlwZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBzZXJ2ZXIgd2FzIGNyZWF0ZWQsIG9yCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd05ld1NlcnZlcldpemFyZChTaGVsbCBzaGVsbCwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHZlcnNpb25JZCwgU3RyaW5nIHNlcnZlclR5cGVJZCkgeworCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uc2hvd05ld1NlcnZlcldpemFyZChzaGVsbCwgdHlwZUlkLCB2ZXJzaW9uSWQsIHNlcnZlclR5cGVJZCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMzMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5hY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZTsKKy8qKgorICogIlJ1biBvbiBTZXJ2ZXIiIG1lbnUgYWN0aW9uLiBBbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGFuCisgKiBvYmplY3QsIGFuZCBoYXZlIGF1dG9tYXRpYyBzZXJ2ZXIgY3JlYXRpb24sIGxhdW5jaGluZywgYW5kCisgKiB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IHRvIGFwcGVhci4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhpcworICogYWN0aW9uIG11c3QgYmUgY3JlYXRlZCBmb3IgZWFjaCBvYmplY3QgdGhhdCB0aGUgdXNlciBzZWxlY3RzLgorICogPHA+CisgKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgorICogPC9wPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBSdW5PblNlcnZlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJcHJvdGVjdGVkIFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgZGVsZWdhdGU7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgUnVuIG9uIFNlcnZlciBhY3Rpb24gZm9yIHJ1biBtb2RlLgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhdHRlbXB0IHRvIHJ1bgorCSAqLworCXB1YmxpYyBSdW5PblNlcnZlckFjdGlvbihPYmplY3Qgb2JqZWN0KSB7CisJCXRoaXMob2JqZWN0LCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IFJ1biBvbiBTZXJ2ZXIgYWN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhdHRlbXB0IHRvIHJ1bgorCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEge0BsaW5rIElMYXVuY2hNYW5hZ2VyfSBsYXVuY2ggbW9kZQorCSAqLworCXB1YmxpYyBSdW5PblNlcnZlckFjdGlvbihPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbGF1bmNoTW9kZSkgeworCQlzdXBlcigpOworCQkKKwkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7CisJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnT25TZXJ2ZXIpOworCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRFRPT0xfREVCVUdfT05fU0VSVkVSKSk7CisJCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9ERUJVR19PTl9TRVJWRVIpKTsKKwkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9ERUJVR19PTl9TRVJWRVIpKTsKKwkJfSBlbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7CisJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGVPblNlcnZlcik7CisJCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9QUk9GSUxFX09OX1NFUlZFUikpOworCQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ1RPT0xfUFJPRklMRV9PTl9TRVJWRVIpKTsKKwkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9QUk9GSUxFX09OX1NFUlZFUikpOworCQl9IGVsc2UgeworCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25SdW5PblNlcnZlcik7CisJCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9SVU5fT05fU0VSVkVSKSk7CisJCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9SVU5fT05fU0VSVkVSKSk7CisJCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRVRPT0xfUlVOX09OX1NFUlZFUikpOworCQl9CisJCQorCQlkZWxlZ2F0ZSA9IG5ldyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCk7CisJCWRlbGVnYXRlLnNldExhdW5jaE1vZGUobGF1bmNoTW9kZSk7CisJCWlmIChvYmplY3QgIT0gbnVsbCkgeworCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpOworCQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLCBzZWwpOworCQl9IGVsc2UKKwkJCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgbnVsbCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJZGVsZWdhdGUucnVuKHRoaXMpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRjOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKKy8qKgorICogQW4gaW5wdXQgaW50byBhIHNlcnZlciBwYXJ0IG9yIHNlY3Rpb24gZWRpdG9yLgorICoKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJU2VydmVyRWRpdG9yUGFydElucHV0IGV4dGVuZHMgSUVkaXRvcklucHV0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdG8gYmUgZWRpdGVkLgorCSAqCisJICogQHJldHVybiBhIHdvcmtpbmcgY29weSBvZiB0aGUgc2VydmVyCisJICovCisJcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIGlzIHJlYWQtb25seS4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlcnZlciBpcyByZWFkLW9ubHksCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclJlYWRPbmx5KCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhZDA2NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0LmphdmEKQEAgLTAsMCArMSwzNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuKjsKKy8qKgorICogQW4gYWJzdHJhY3Qgc2VydmVyIGVkaXRvciB3aGljaCBpbXBsZW1lbnRzIHRoZSBtb3N0IGNvbW1vbiBtZXRob2RzCisgKiBmcm9tIElFZGl0b3JQYXJ0LgorICogCisgKiBUaGlzIGNsYXNzIGFsc28gcHJvdmlkZXMgZWFjaCBlZGl0b3IgcGFnZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2Ugd2hpY2gKKyAqIHdpbGwgYmUgZGlzcGxheWVkIG9uIHRoZSBzdGF0dXMgYmFyIG9mIHRoZSBlZGl0b3IuCisgKiAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckVkaXRvclBhcnQgZXh0ZW5kcyBFZGl0b3JQYXJ0IHsKKwkvKioKKwkgKiBQcm9wZXJ0eSBjaGFuZ2UgaWQgZm9yIHRoZSBlcnJvciBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BfRVJST1IgPSA1OworCisJcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4+IHNlY3Rpb25Ub0luc2VydGlvbklkID0gbnVsbDsKKwlwcml2YXRlIExpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4gc2VjdGlvbnMgPSBudWxsOworCXByaXZhdGUgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcjsKKwlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7CisJcHJpdmF0ZSBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm07CisKKwkvKioKKwkgKiBUaGUgc2VydmVyIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQuCisJICovCisJcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7CisKKwkvKioKKwkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJlYWQtb25seSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqIG90aGVyd2lzZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seTsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgZWRpdG9yIHBhcnQuCisJICovCisJcHVibGljIFNlcnZlckVkaXRvclBhcnQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNkb1NhdmUoSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2RvU2F2ZUFzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaXNEaXJ0eSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIG1hbmFnZWQgZm9ybSB0aGF0IHRoaXMgcGFydCBpcyB1c2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gbWFuYWdlZEZvcm0gYSBtYW5hZ2VkIGZvcm0KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlZEZvcm0oSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7CisJCXRoaXMubWFuYWdlZEZvcm0gPSBtYW5hZ2VkRm9ybTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtYW5hZ2VkIGZvcm0gdGhhdCB0aGlzIHBhcnQgaXMgdXNpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCisJICogbWFuYWdlZCBmb3JtIGhhcyBiZWVuIHNldC4KKwkgKiAKKwkgKiBAcmV0dXJuIG1hbmFnZWRGb3JtIHRoZSBtYW5hZ2VkIGZvcm0gdGhhdCB0aGlzIHBhcnQgaXMgdXNpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgaWYgbm8gbWFuYWdlZCBmb3JtIGhhcyBiZWVuIHNldAorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwcm90ZWN0ZWQgSU1hbmFnZWRGb3JtIGdldE1hbmFnZWRGb3JtKCkgeworCQlyZXR1cm4gbWFuYWdlZEZvcm07CisJfQorCisJLyoqCisJICogU2V0IGFuIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgcGFnZS4KKwkgKiAKKwkgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIG1lc3NhZ2UKKwkgKiBAc2VlICNnZXRNYW5hZ2VkRm9ybSgpIFVzZSBmb3JtcyBVSSBiYXNlZCBmb3IgZXJyb3JzIHZpYSB7QGxpbmsgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1lc3NhZ2VNYW5hZ2VyfQorCSAqICAgIG9uIHRoZSBtZXNzYWdlIGZvcm0gaW5zdGVhZCBvZiB0aGlzIG1ldGhvZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpIHsKKwkJaWYgKGVycm9yID09IG51bGwgJiYgZXJyb3JNZXNzYWdlID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5lcXVhbHMoZXJyb3JNZXNzYWdlKSkKKwkJCXJldHVybjsKKwkJCisJCWVycm9yTWVzc2FnZSA9IGVycm9yOworCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9FUlJPUik7CisJfQorCisJLyoqCisJICogVXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSBzaG93biBpbiB0aGUgZWRpdG9yLgorCSAqIAorCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9CisJICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgeworCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9FUlJPUik7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHBhZ2UuCisJICogCisJICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQorCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9CisJICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgeworCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJU2VydmVyRWRpdG9yU2VjdGlvbiBzZWN0aW9uID0gKFNlcnZlckVkaXRvclNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlTdHJpbmcgZXJyb3IgPSBzZWN0aW9uLmdldEVycm9yTWVzc2FnZSgpOworCQkJCWlmIChlcnJvciAhPSBudWxsKQorCQkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVycm9yTWVzc2FnZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGVycm9yIG9yIHN0YXR1cyBtZXNzYWdlcyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHdoZW4gdGhlCisJICogc2VydmVyIHJlc291cmNlIGlzIHNhdmVkLiBJZiB0aGVyZSBhcmUgYW55IGVycm9yIG1lc3NhZ2VzLCB0aGUKKwkgKiB1c2VyIHdpbGwgYmUgdW5hYmxlIHRvIHNhdmUgdGhlIGVkaXRvci4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgc2V0IG9mIHN0YXR1cworCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9CisJICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCisJICovCisJcHVibGljIElTdGF0dXNbXSBnZXRTYXZlU3RhdHVzKCkgeworCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsKKwkJTGlzdDxJU3RhdHVzPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb24gPSAoU2VydmVyRWRpdG9yU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOworCQkJSVN0YXR1c1tdIHN0YXR1cyA9IHNlY3Rpb24uZ2V0U2F2ZVN0YXR1cygpOworCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQkJaW50IHNpemUgPSBzdGF0dXMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJCWlmIChzdGF0dXNbaV0uZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKQorCQkJCQkJbGlzdC5hZGQoc3RhdHVzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCWludCBzaXplID0gbGlzdC5zaXplKCk7CisJCUlTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1tzaXplXTsKKwkJbGlzdC50b0FycmF5KHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHJpdmF0ZSBMaXN0IGdldFNlY3Rpb25zKCkgeworCQlpZiAoc2VjdGlvbnMgPT0gbnVsbCkgeworCQkJc2VjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFNlcnZlckVkaXRvclNlY3Rpb24+KCk7CisJCQlzZWN0aW9uVG9JbnNlcnRpb25JZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTZXJ2ZXJFZGl0b3JTZWN0aW9uPj4oKTsKKwkJCVNlcnZlckVkaXRvciBzZXJ2ZXJFZGl0b3IgPSBjb21tYW5kTWFuYWdlci5nZXRTZXJ2ZXJFZGl0b3IoKTsKKwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gU2VydmVyRWRpdG9yQ29yZS5nZXRTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcygpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSBmYWN0b3J5ID0gKElTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlTdHJpbmcgaW5zZXJ0aW9uSWQgPSBmYWN0b3J5LmdldEluc2VydGlvbklkKCk7CisJCQkJCisJCQkJSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5IHBhZ2VGYWN0b3J5ID0gc2VydmVyRWRpdG9yLmdldFBhZ2VGYWN0b3J5KHRoaXMpOworCQkJCWlmIChwYWdlRmFjdG9yeS5zdXBwb3J0c0luc2VydGlvbklkKGluc2VydGlvbklkKSkgeworCQkJCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gbnVsbDsKKwkJCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkKKwkJCQkJCXNlcnZlclR5cGVJZCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKKwkJCQkJaWYgKHNlcnZlclR5cGVJZCAhPSBudWxsICYmIGZhY3Rvcnkuc3VwcG9ydHNUeXBlKHNlcnZlclR5cGVJZCkKKwkJCQkJCQkmJiBmYWN0b3J5LnNob3VsZENyZWF0ZVNlY3Rpb24oc2VydmVyKSkgeworCQkJCQkJU2VydmVyRWRpdG9yU2VjdGlvbiBzZWN0aW9uID0gZmFjdG9yeS5jcmVhdGVTZWN0aW9uKCk7CisJCQkJCQlpZiAoc2VjdGlvbiAhPSBudWxsKSB7CisJCQkJCQkJc2VjdGlvbi5zZXRTZXJ2ZXJFZGl0b3JQYXJ0KHRoaXMpOworCQkJCQkJCXNlY3Rpb25zLmFkZChzZWN0aW9uKTsKKwkJCQkJCQlMaXN0PFNlcnZlckVkaXRvclNlY3Rpb24+IGxpc3QgPSBudWxsOworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWxpc3QgPSBzZWN0aW9uVG9JbnNlcnRpb25JZC5nZXQoaW5zZXJ0aW9uSWQpOworCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCS8vIGlnbm9yZQorCQkJCQkJCX0KKwkJCQkJCQlpZiAobGlzdCA9PSBudWxsKQorCQkJCQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJFZGl0b3JTZWN0aW9uPigpOworCQkJCQkJCWxpc3QuYWRkKHNlY3Rpb24pOworCQkJCQkJCXNlY3Rpb25Ub0luc2VydGlvbklkLnB1dChpbnNlcnRpb25JZCwgbGlzdCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHNlY3Rpb25zOworCX0KKworCXByaXZhdGUgTGlzdCBnZXRTZWN0aW9ucyhTdHJpbmcgaW5zZXJ0aW9uSWQpIHsKKwkJaWYgKGluc2VydGlvbklkID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCWdldFNlY3Rpb25zKCk7CisJCUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4oKTsKKwkJdHJ5IHsKKwkJCUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4gc2VjdGlvbnMyID0gc2VjdGlvblRvSW5zZXJ0aW9uSWQuZ2V0KGluc2VydGlvbklkKTsKKwkJCWlmIChzZWN0aW9uczIgIT0gbnVsbCkgeworCQkJCUl0ZXJhdG9yPFNlcnZlckVkaXRvclNlY3Rpb24+IGl0ZXJhdG9yID0gc2VjdGlvbnMyLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQlsaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJCXJldHVybiBsaXN0OworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7CisJCXNldFNpdGUoc2l0ZSk7CisJCXNldElucHV0KGlucHV0KTsKKwkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVNlcnZlckVkaXRvclBhcnRJbnB1dCkgeworCQkJSVNlcnZlckVkaXRvclBhcnRJbnB1dCBzZXBpID0gKElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpIGlucHV0OworCQkJc2VydmVyID0gc2VwaS5nZXRTZXJ2ZXIoKTsKKwkJCWNvbW1hbmRNYW5hZ2VyID0gKChTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpIHNlcGkpLmdldFNlcnZlckNvbW1hbmRNYW5hZ2VyKCk7CisJCQlyZWFkT25seSA9IHNlcGkuaXNTZXJ2ZXJSZWFkT25seSgpOworCQl9CisJCQorCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJU2VydmVyRWRpdG9yU2VjdGlvbiBzZWN0aW9uID0gKFNlcnZlckVkaXRvclNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKKwkJCXNlY3Rpb24uaW5pdChzaXRlLCBpbnB1dCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gb3BlcmF0aW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBvcGVyYXRpb24gaGlzdG9yeQorCSAqIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dC4KKwkgKiAKKwkgKiBAcGFyYW0gb3BlcmF0aW9uIGFuIG9wZXJhdGlvbiByZWFkeSB0byBiZSBleGVjdXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgeworCQljb21tYW5kTWFuYWdlci5leGVjdXRlKG9wZXJhdGlvbik7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBzZXJ2ZXIgdGhhdCBpcyBiZWluZyBlZGl0ZWQuCisJICogCisJICogQHJldHVybiBhIHNlcnZlciB3b3JraW5nIGNvcHkKKwkgKi8KKwlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKKwkJcmV0dXJuIHNlcnZlcjsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnRzIGVkaXRvciBzZWN0aW9ucyBpbnRvIHRoZSBnaXZlbiBjb21wb3NpdGUuCisJICogCisJICogQHBhcmFtIHBhcmVudCB0aGUgY29tcG9zaXRlIHRvIGFkZCB0aGUgc2VjdGlvbihzKSB0bworCSAqIEBwYXJhbSBpZCB0aGUgc2VjdGlvbiBpbnNlcnRpb24gaWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbnNlcnRTZWN0aW9ucyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgaWQpIHsKKwkJaWYgKGlkID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlY3Rpb25zKGlkKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb24gPSAoU2VydmVyRWRpdG9yU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOworCQkJc2VjdGlvbi5jcmVhdGVTZWN0aW9uKHBhcmVudCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBEaXNwb3NlIG9mIHRoZSBlZGl0b3IuCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCQkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVNlcnZlckVkaXRvclNlY3Rpb24gc2VjdGlvbiA9IChTZXJ2ZXJFZGl0b3JTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7CisJCQlzZWN0aW9uLmRpc3Bvc2UoKTsKKwkJfQorCQkKKwkJaWYgKHRvb2xraXQgIT0gbnVsbCkgeworCQkJdG9vbGtpdC5kaXNwb3NlKCk7CisJCQl0b29sa2l0ID0gbnVsbDsKKwkJfQorCQkKKwkJY29tbWFuZE1hbmFnZXIgPSBudWxsOworCQlzZWN0aW9uVG9JbnNlcnRpb25JZCA9IG51bGw7CisJCXNlY3Rpb25zID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBHZXQgYSBmb3JtIHRvb2xraXQgdG8gY3JlYXRlIHdpZGdldHMuIEl0IHdpbGwgYmUgZGlzcG9zZWQgYXV0b21hdGljYWxseQorCSAqIHdoZW4gdGhlIGVkaXRvciBpcyBjbG9zZWQuCisJICogCisJICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkKKwkgKiBAcmV0dXJuIEZvcm1Ub29sa2l0CisJICovCisJcHJvdGVjdGVkIEZvcm1Ub29sa2l0IGdldEZvcm1Ub29sa2l0KERpc3BsYXkgZGlzcGxheSkgeworCQlpZiAobWFuYWdlZEZvcm0gIT0gbnVsbCkKKwkJCXJldHVybiBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7CisJCQorCQlpZiAodG9vbGtpdCA9PSBudWxsKQorCQkJdG9vbGtpdCA9IG5ldyBGb3JtVG9vbGtpdChkaXNwbGF5KTsKKwkJcmV0dXJuIHRvb2xraXQ7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvU2VydmVyRWRpdG9yU2VjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWRhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvU2VydmVyRWRpdG9yU2VjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvclBhcnRJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyOworLyoqCisgKiBBbiBhYnN0cmFjdCBzZXJ2ZXIgZWRpdG9yIHNlY3Rpb24uCisgKiAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckVkaXRvclNlY3Rpb24geworCXByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7CisKKwlwcml2YXRlIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXI7CisKKwlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRDb21wOworCXByaXZhdGUgU2VydmVyRWRpdG9yUGFydCBlZGl0b3I7CisKKwkvKioKKwkgKiBUaGUgc2VydmVyIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQuCisJICovCisJcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7CisKKwkvKioKKwkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJlYWQtb25seSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqIG90aGVyd2lzZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seTsKKworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIHNlY3Rpb24uCisJICogCisJICogQHBhcmFtIHNpdGUgdGhlIGVkaXRvciBzaXRlCisJICogQHBhcmFtIGlucHV0IHRoZSBlZGl0b3IgaW5wdXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgeworCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU2VydmVyRWRpdG9yUGFydElucHV0KSB7CisJCQlJU2VydmVyRWRpdG9yUGFydElucHV0IHNlcGkgPSAoSVNlcnZlckVkaXRvclBhcnRJbnB1dCkgaW5wdXQ7CisJCQlzZXJ2ZXIgPSBzZXBpLmdldFNlcnZlcigpOworCQkJY29tbWFuZE1hbmFnZXIgPSAoKFNlcnZlckVkaXRvclBhcnRJbnB1dCkgc2VwaSkuZ2V0U2VydmVyQ29tbWFuZE1hbmFnZXIoKTsKKwkJCXJlYWRPbmx5ID0gc2VwaS5pc1NlcnZlclJlYWRPbmx5KCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gb3BlcmF0aW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBvcGVyYXRpb24gaGlzdG9yeQorCSAqIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dC4KKwkgKiAKKwkgKiBAcGFyYW0gb3BlcmF0aW9uIGFuIG9wZXJhdGlvbiByZWFkeSB0byBiZSBleGVjdXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgeworCQljb21tYW5kTWFuYWdlci5leGVjdXRlKG9wZXJhdGlvbik7CisJfQorCisJLyoqCisJICogQ3JlYXRlIHRoZSBzZWN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJdGhpcy5wYXJlbnRDb21wID0gcGFyZW50OworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgc2hlbGwgb2YgdGhlIHNlY3Rpb24uCisJICogCisJICogQHJldHVybiB0aGUgc2hlbGwKKwkgKi8KKwlwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7CisJCXJldHVybiBwYXJlbnRDb21wLmdldFNoZWxsKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHNlY3Rpb24uCisJICogCisJICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQorCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9CisJICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJCXJldHVybiBlcnJvck1lc3NhZ2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyBlcnJvciBvciBzdGF0dXMgbWVzc2FnZXMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIHRoZQorCSAqIHNlcnZlciByZXNvdXJjZSBpcyBzYXZlZC4gSWYgdGhlcmUgYXJlIGFueSBlcnJvciBtZXNzYWdlcywgdGhlCisJICogdXNlciB3aWxsIGJlIHVuYWJsZSB0byBzYXZlIHRoZSBlZGl0b3IuCisJICogCisJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoaXMKKwkgKiAgIHNlcnZlciBjYW4gYmUgc2F2ZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkKKwkgKiAgIGl0IGNhbid0IGJlCisJICogQHNlZSAjZ2V0TWFuYWdlZEZvcm0oKSBVc2UgZm9ybXMgVUkgYmFzZWQgZm9yIGVycm9ycyB2aWEge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNZXNzYWdlTWFuYWdlcn0KKwkgKiAgICBvbiB0aGUgbWVzc2FnZSBmb3JtIGluc3RlYWQgb2YgdGhpcyBtZXRob2QKKwkgKi8KKwlwdWJsaWMgSVN0YXR1c1tdIGdldFNhdmVTdGF0dXMoKSB7CisJCXJldHVybiBuZXcgSVN0YXR1c1tdIHsgU3RhdHVzLk9LX1NUQVRVUyB9OworCX0KKworCS8qKgorCSAqIFNldCB0aGUgZWRpdG9yIHBhcnQgdGhhdCB0aGlzIHNlY3Rpb24gYmVsb25ncyB0by4KKwkgKiAKKwkgKiBAcGFyYW0gZWRpdG9yIHRoZSBlZGl0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJFZGl0b3JQYXJ0KFNlcnZlckVkaXRvclBhcnQgZWRpdG9yKSB7CisJCXRoaXMuZWRpdG9yID0gZWRpdG9yOworCX0KKworCS8qKgorCSAqIFNldCBhbiBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHNlY3Rpb24uCisJICogCisJICogQHBhcmFtIGVycm9yIGFuIGVycm9yIG1lc3NhZ2UKKwkgKiBAc2VlICNnZXRNYW5hZ2VkRm9ybSgpIFVzZSBmb3JtcyBVSSBiYXNlZCBmb3IgZXJyb3JzIHZpYSB7QGxpbmsgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1lc3NhZ2VNYW5hZ2VyfQorCSAqICAgIG9uIHRoZSBtZXNzYWdlIGZvcm0gaW5zdGVhZCBvZiB0aGlzIG1ldGhvZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpIHsKKwkJaWYgKGVycm9yID09IG51bGwgJiYgZXJyb3JNZXNzYWdlID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5lcXVhbHMoZXJyb3JNZXNzYWdlKSkKKwkJCXJldHVybjsKKwkJCisJCWVycm9yTWVzc2FnZSA9IGVycm9yOworCQlpZiAoZWRpdG9yICE9IG51bGwpCisJCQllZGl0b3IudXBkYXRlRXJyb3JNZXNzYWdlKCk7CisJfQorCisJLyoqCisJICogR2V0IGEgZm9ybSB0b29sa2l0IHRvIGNyZWF0ZSB3aWRnZXRzLiBJdCB3aWxsIGJlIGRpc3Bvc2VkIGF1dG9tYXRpY2FsbHkKKwkgKiB3aGVuIHRoZSBlZGl0b3IgaXMgY2xvc2VkLgorCSAqIAorCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5CisJICogQHJldHVybiBhIEZvcm1Ub29sa2l0CisJICovCisJcHJvdGVjdGVkIEZvcm1Ub29sa2l0IGdldEZvcm1Ub29sa2l0KERpc3BsYXkgZGlzcGxheSkgeworCQlyZXR1cm4gZWRpdG9yLmdldEZvcm1Ub29sa2l0KGRpc3BsYXkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1hbmFnZWQgZm9ybSB0aGF0IHRoZSBlZGl0b3IgaXMgdXNpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCisJICogbWFuYWdlZCBmb3JtIGhhcyBiZWVuIHNldC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtYW5hZ2VkIGZvcm0gdGhhdCB0aGUgZWRpdG9yIGlzIHVzaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubworCSAqICAgIG1hbmFnZWQgZm9ybSBoYXMgYmVlbiBzZXQKKwkgKiBAc2luY2UgMy4wCisJICovCisJcHJvdGVjdGVkIElNYW5hZ2VkRm9ybSBnZXRNYW5hZ2VkRm9ybSgpIHsKKwkJcmV0dXJuIGVkaXRvci5nZXRNYW5hZ2VkRm9ybSgpOworCX0KKworCS8qKgorCSAqIERpc3Bvc2VzIG9mIHRoZSBzZWN0aW9uLgorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIGlnbm9yZQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDY0YzE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDIyIEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPlByb3ZpZGVzIGVkaXRvciBzdXBwb3J0IGZvciB0aGUgc2VydmVyIHRvb2xzIFVJLjwvcD4KKzx0YWJsZSB3aWR0aD0iNTAwIj4KKzx0cj4KKzx0ZD4KKzxwPlVzaW5nIGV4dGVuc2lvbiBwb2ludHMsIGNsaWVudHMgY2FuIHByb3ZpZGUgcGFnZXMsIHNlY3Rpb25zLCBhbmQKK2FjdGlvbnMgdG8gYmUgYWRkZWQgdG8gdGhlIGVkaXRvciBmb3IgYSBzcGVjaWZpYyBzZXJ2ZXIgdHlwZS4gVGhpcworcGFja2FnZSBjb250YWlucyB0aGUgZGVsZWdhdGUgY2xhc3NlcyBmb3IgdGhlc2UgZXh0ZW5zaW9uIHBvaW50cywgYXMKK3dlbGwgYXMgdGhlIEFQSSB0aGF0IHRoZXkgY2FuIHVzZSB0byBwdXQgY29tbWFuZHMgb24gdGhlIHNoYXJlZAorZWRpdG9yIGNvbW1hbmQgaGlzdG9yeSBzdGFjayBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgZWRpdGluZyBmcmFtZXdvcmsuPC9wPgorPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL3BhY2thZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNGM0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxodG1sPgorPGhlYWQ+CisJPCEtLSAgRXNjYXBlIHRvIHRoZSByb290IG9mIHlvdXIgc291cmNlIGZvbGRlciAgLS0+CisJPG1ldGEKKwkJbmFtZT0icm9vdCIKKwkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgorCTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxhYnN0cmFjdD5Qcm92aWRlcyBlZGl0b3Igc3VwcG9ydCBmb3IgdGhlIHNlcnZlciB0b29scyBVSS48L2Fic3RyYWN0PgorCis8cD5Vc2luZyBleHRlbnNpb24gcG9pbnRzLCBjbGllbnRzIGNhbiBwcm92aWRlIHBhZ2VzLCBzZWN0aW9ucywgYW5kCithY3Rpb25zIHRvIGJlIGFkZGVkIHRvIHRoZSBlZGl0b3IgZm9yIGEgc3BlY2lmaWMgc2VydmVyIHR5cGUuIFRoaXMKK3BhY2thZ2UgY29udGFpbnMgdGhlIGRlbGVnYXRlIGNsYXNzZXMgZm9yIHRoZXNlIGV4dGVuc2lvbiBwb2ludHMsIGFzCit3ZWxsIGFzIHRoZSBBUEkgdGhhdCB0aGV5IGNhbiB1c2UgdG8gcHV0IGNvbW1hbmRzIG9uIHRoZSBzaGFyZWQKK2VkaXRvciBjb21tYW5kIGhpc3Rvcnkgc3RhY2sgYW5kIGludGVyYWN0IHdpdGggdGhlIGVkaXRpbmcgZnJhbWV3b3JrLjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2NkOTVkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworLyoqCisgKiBDb250ZXh0IGhlbHAgaWQgY29uc3RhbnRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbnRleHRJZHMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAwMCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZFUl9FWElTVElORyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzaTAwMDIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfRVhJU1RJTkdfVEFCTEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3c2kwMDA0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU0VSVkVSX0NSRUFURSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzaTAwMTAiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfQ1JFQVRFX1RBQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAxMiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZFUl9QUkVGRVJFTkNFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAxNCI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQ0xJRU5UX1dJWkFSRCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzYzAwMDAiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9DTElFTlQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3c2MwMDAyIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19TRVJWRVJfV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd25zMDAwMCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NFUlZFUl9UWVBFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd25zMDAwNiI7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1BST1BFUlRZX1BBR0UgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN2Y3AwMDA0IjsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUlVOVElNRV9XSVpBUkQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3bnIwMDAwIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSF9DT05GSUdVUkFUSU9OX1NFUlZFUl9DT01CTyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzbDAwMDAiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1RBU0tfV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zc3R3MDAwMCI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRllfTU9EVUxFU19DT01QT1NJVEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3bW0wMDAwIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1JTkFURV9TRVJWRVJfRElBTE9HID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHRpMDAwMCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1NFUlZFUl9ESUFMT0cgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN2Y3AwMDAyIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMDAiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9QVUJMSVNIX0JFRk9SRV9TVEFSVCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMTIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9TSE9XX09OX0FDVElWSVRZID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zcGdlMDAyMiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9HRU5FUkFMX1NBVkVfRURJVE9SUyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMjQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMzAiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERV9ERUJVRyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMzEiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9FTkFCTEVfQlJFQUtQT0lOVFMgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNwZ2UwMDMyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0dFTkVSQUxfUkVTVEFSVCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMzQiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19TRVJWRVJTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zdmNwMDAwMCI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RFVEFJTFNfRElBTE9HID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwMCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9ERVRBSUxTX0RJQUxPR19TVEFUVVMgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNkcGQwMDAyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RFVEFJTFNfRElBTE9HX0RFVEFJTFNfQlVUVE9OID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwNCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9ERVRBSUxTX0RJQUxPR19ERVRBSUxTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwNiI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9NUFRfSVJSRVZFUlNJQkxFX0RJQUxPRyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2RwaTAwMDAiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX09WRVJWSUVXX1BBR0UgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDAwIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfU0VSVkVSID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZW9wMDAwMiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0NPTkZJR1VSQVRJT04gPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDA0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSE9TVE5BTUUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDA2IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfUlVOVElNRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VvcDAwMDgiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9BVVRPUFVCTElTSF9FTkFCTEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDEyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfQVVUT1BVQkxJU0hfRElTQUJMRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VvcDAwMTYiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9QVUJMSVNIVEFTS1NfQ09ORklHVVJBVElPTiA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VvcDAwMTgiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9USU1FT1VUX1NUQVJUID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgInNwZ2UwMDI2IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfVElNRU9VVF9TVE9QID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgInNwZ2UwMDI3IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwMCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfRU5BQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwMiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfVk9MVU1FID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwNCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfU09VTkRTX1RBQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwNiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfUExBWSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMDgiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX0JST1dTRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMTAiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX1JFU0VUID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAxMiI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdE1vbml0b3JEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdE1vbml0b3JEZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZmNhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWZhdWx0TW9uaXRvckRlbGVnYXRlLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3JMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Nb25pdG9yQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyTW9uaXRvckRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdE1vbml0b3JEZWxlZ2F0ZSBleHRlbmRzIFNlcnZlck1vbml0b3JEZWxlZ2F0ZSB7CisJcHJvdGVjdGVkIE1hcDxTZXJ2ZXJQb3J0LCBJTW9uaXRvcj4gbW9uaXRvcnMgPSBuZXcgSGFzaE1hcDxTZXJ2ZXJQb3J0LCBJTW9uaXRvcj4oKTsKKwlwcm90ZWN0ZWQgSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcjsKKworCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcigpIHsKKwkJaWYgKGxpc3RlbmVyICE9IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlsaXN0ZW5lciA9IG5ldyBJTW9uaXRvckxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9uaXRvckFkZGVkKElNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKworCQkJcHVibGljIHZvaWQgbW9uaXRvckNoYW5nZWQoSU1vbml0b3IgbW9uaXRvcikgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCisJCQlwdWJsaWMgdm9pZCBtb25pdG9yUmVtb3ZlZChJTW9uaXRvciBtb25pdG9yKSB7CisJCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKKwkJCQkJcmV0dXJuOworCQkJCQorCQkJCU9iamVjdCBtb25LZXkgPSBudWxsOworCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9uaXRvcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCU9iamVjdCBrZXkgPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCU9iamVjdCB2YWx1ZSA9IG1vbml0b3JzLmdldChrZXkpOworCQkJCQlpZiAobW9uaXRvci5lcXVhbHModmFsdWUpKQorCQkJCQkJbW9uS2V5ID0ga2V5OworCQkJCX0KKwkJCQlpZiAobW9uS2V5ICE9IG51bGwpCisJCQkJCW1vbml0b3JzLnJlbW92ZShtb25LZXkpOworCQkJCWlmIChtb25pdG9ycy5pc0VtcHR5KCkpIHsKKwkJCQkJTW9uaXRvckNvcmUucmVtb3ZlTW9uaXRvckxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCQkJbGlzdGVuZXIgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJTW9uaXRvckNvcmUuYWRkTW9uaXRvckxpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyTW9uaXRvckRlbGVnYXRlI3N0YXJ0TW9uaXRvcmluZyhvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydCkKKwkgKi8KKwlwdWJsaWMgaW50IHN0YXJ0TW9uaXRvcmluZyhJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0LCBpbnQgbW9uaXRvclBvcnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCUlNb25pdG9yIG1vbml0b3IgPSBtb25pdG9ycy5nZXQocG9ydCk7CisJCQlpbnQgbXBvcnQgPSAtMTsKKwkJCWlmIChtb25pdG9yID09IG51bGwgfHwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSAhPSBtb25pdG9yUG9ydCkgeworCQkJCW1wb3J0ID0gbW9uaXRvclBvcnQ7CisJCQkJaWYgKG1wb3J0ID09IC0xKQorCQkJCQltcG9ydCA9IFNvY2tldFV0aWwuZmluZFVudXNlZFBvcnQoNTAwMCwgMTUwMDApOworCQkJCQorCQkJCS8vIHNob3VsZCBzZWFyY2ggZm9yIGEgbW9uaXRvciBmaXJzdCAuLgorCQkJCUlNb25pdG9yV29ya2luZ0NvcHkgd2MgPSBNb25pdG9yQ29yZS5jcmVhdGVNb25pdG9yKCk7CisJCQkJd2Muc2V0TG9jYWxQb3J0KG1wb3J0KTsKKwkJCQl3Yy5zZXRSZW1vdGVIb3N0KHNlcnZlci5nZXRIb3N0KCkpOworCQkJCXdjLnNldFJlbW90ZVBvcnQocG9ydC5nZXRQb3J0KCkpOworCQkJCWlmICgiSFRUUCIuZXF1YWxzKHBvcnQuZ2V0UHJvdG9jb2woKSkpCisJCQkJCXdjLnNldFByb3RvY29sKCJIVFRQIik7CisJCQkJbW9uaXRvciA9IHdjLnNhdmUoKTsKKwkJCQlhZGRMaXN0ZW5lcigpOworCQkJfSBlbHNlCisJCQkJbXBvcnQgPSBtb25pdG9yLmdldExvY2FsUG9ydCgpOworCQkJbW9uaXRvci5zdGFydCgpOworCQkJbW9uaXRvcnMucHV0KHBvcnQsIG1vbml0b3IpOworCQkJcmV0dXJuIG1wb3J0OworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHN0YXJ0IG1vbml0b3JpbmciLCBlKTsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0aW5nTW9uaXRvciwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBudWxsKSk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyTW9uaXRvckRlbGVnYXRlI3N0b3BNb25pdG9yaW5nKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQpIHsKKwkJdHJ5IHsKKwkJCUlNb25pdG9yIG1vbml0b3IgPSBtb25pdG9ycy5nZXQocG9ydCk7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKQorCQkJCW1vbml0b3Iuc3RvcCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHN0b3AgbW9uaXRvcmluZyIsIGUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjViNmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CisvKioKKyAqIEEgT3ZlcmxheUltYWdlRGVzY3JpcHRvciBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgb25lIG9yIG1vcmUgb3ZlcmxheXMuCisgKiBUaGUgb3ZlcmxheXMgYXJlIGNvbXB1dGVkIGFjY29yZGluZyB0byBmbGFncyBzZXQgb24gY3JlYXRpb24gb2YgdGhlIGRlc2NyaXB0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKKwlwcml2YXRlIEltYWdlIGZCYXNlSW1hZ2U7CisJcHJpdmF0ZSBQb2ludCBmU2l6ZTsKKwlwcml2YXRlIEltYWdlIG92ZXJsYXk7CisJCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IE92ZXJsYXlJbWFnZURlc2NyaXB0b3IuCisJICogCisJICogQHBhcmFtIGJhc2VJbWFnZSBhbiBpbWFnZSBkZXNjcmlwdG9yIHVzZWQgYXMgdGhlIGJhc2UgaW1hZ2UKKwkgKi8KKwlwdWJsaWMgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcihJbWFnZSBiYXNlSW1hZ2UpIHsKKwkJdGhpcyhiYXNlSW1hZ2UsIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfREVGQVVMVF9TRVJWRVJfT1ZFUkxBWSkpOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBiYXNlSW1hZ2UKKwkgKiBAcGFyYW0gb3ZlcmxheQorCSAqLworCXB1YmxpYyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlIGJhc2VJbWFnZSwgSW1hZ2Ugb3ZlcmxheSkgeworCQlzZXRCYXNlSW1hZ2UoYmFzZUltYWdlKTsKKwkJdGhpcy5vdmVybGF5ID0gb3ZlcmxheTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNnZXRTaXplKCkKKwkgKi8KKwlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKKwkJaWYgKGZTaXplID09IG51bGwpIHsKKwkJCUltYWdlRGF0YSBkYXRhID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7CisJCQlzZXRTaXplKG5ldyBQb2ludChkYXRhLndpZHRoLCBkYXRhLmhlaWdodCkpOworCQl9CisJCXJldHVybiBmU2l6ZTsKKwl9CisJCisJLyoqCisJICogQHNlZSBPYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvciBvdGhlciA9IChEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKSBvYmplY3Q7CisJCXJldHVybiAoZ2V0QmFzZUltYWdlKCkuZXF1YWxzKG90aGVyLmdldEJhc2VJbWFnZSgpKSk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gZ2V0QmFzZUltYWdlKCkuaGFzaENvZGUoKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKwkJSW1hZ2VEYXRhIGJnID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7CisJCWlmIChiZyA9PSBudWxsKQorCQkJYmcgPSBERUZBVUxUX0lNQUdFX0RBVEE7CisKKwkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKKwkJZHJhd092ZXJsYXlzKCk7CisJfQorCisJLyoqCisJICogQWRkIGFueSBvdmVybGF5cyB0byB0aGUgaW1hZ2UgYXMgc3BlY2lmaWVkIGluIHRoZSBmbGFncy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkcmF3T3ZlcmxheXMoKSB7CisJCUltYWdlRGF0YSBkYXRhID0gb3ZlcmxheS5nZXRJbWFnZURhdGEoKTsKKwkJaW50IHggPSBnZXRTaXplKCkueCAtIGRhdGEud2lkdGg7CisJCWRyYXdJbWFnZShkYXRhLCB4LCAwKTsKKwl9CisJCisJcHJvdGVjdGVkIEltYWdlIGdldEJhc2VJbWFnZSgpIHsKKwkJcmV0dXJuIGZCYXNlSW1hZ2U7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFzZUltYWdlKEltYWdlIGJhc2VJbWFnZSkgeworCQlmQmFzZUltYWdlID0gYmFzZUltYWdlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgeworCQlmU2l6ZSA9IHNpemU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRTZXJ2ZXJMYWJlbERlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckxhYmVsRGVjb3JhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzZWFiMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRTZXJ2ZXJMYWJlbERlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdFNlcnZlckxhYmVsRGVjb3JhdG9yIGltcGxlbWVudHMgSUxhYmVsRGVjb3JhdG9yIHsKKwlwcm90ZWN0ZWQgTWFwPE9iamVjdCwgSW1hZ2U+IG1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgSW1hZ2U+KCk7CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvciNkZWNvcmF0ZUltYWdlKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSwgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJdHJ5IHsKKwkJCUltYWdlIGltZyA9IG1hcC5nZXQoZWxlbWVudCk7CisJCQlpZiAoaW1nICE9IG51bGwpCisJCQkJcmV0dXJuIGltZzsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJCQorCQlEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yIGRzaWQgPSBudWxsOworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlcikgeworCQkJSVN0YXR1cyBzdGF0dXMgPSAoKFNlcnZlcikgZWxlbWVudCkuZ2V0U2VydmVyU3RhdHVzKCk7CisJCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKKwkJCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7CisJCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCisJCQkJCWRzaWQgPSBuZXcgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcihpbWFnZSwgc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKSk7CisJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQorCQkJCQlkc2lkID0gbmV3IERlZmF1bHRTZXJ2ZXJJbWFnZURlc2NyaXB0b3IoaW1hZ2UsIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKSk7CisJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQorCQkJCQlkc2lkID0gbmV3IERlZmF1bHRTZXJ2ZXJJbWFnZURlc2NyaXB0b3IoaW1hZ2UsIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKSk7CisJCQl9CisJCX0KKwkJCisJCWlmIChkc2lkID09IG51bGwpCisJCQlkc2lkID0gbmV3IERlZmF1bHRTZXJ2ZXJJbWFnZURlc2NyaXB0b3IoaW1hZ2UpOworCQlJbWFnZSBpbWFnZTIgPSBkc2lkLmNyZWF0ZUltYWdlKCk7CisJCW1hcC5wdXQoZWxlbWVudCwgaW1hZ2UyKTsKKwkJcmV0dXJuIGltYWdlMjsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvciNkZWNvcmF0ZVRleHQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXRyeSB7CisJCQlJdGVyYXRvciBpdGVyYXRvciA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJaW1hZ2UuZGlzcG9zZSgpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBkaXNwb3NlIGltYWdlcyIsIGUpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWxldGVSdW50aW1lRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWxldGVSdW50aW1lRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0MDFlNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlbGV0ZVJ1bnRpbWVEaWFsb2cuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCitwdWJsaWMgY2xhc3MgRGVsZXRlUnVudGltZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgeworCXByb3RlY3RlZCBib29sZWFuIHByb21wdERlbGV0ZVNlcnZlcnM7CisJcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0UmVtb3ZlVGFyZ2V0czsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVTZXJ2ZXJzOworCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZVRhcmdldHM7CisKKwlwdWJsaWMgRGVsZXRlUnVudGltZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgYm9vbGVhbiBwcm9tcHREZWxldGVTZXJ2ZXJzLCBib29sZWFuIHByb21wdFJlbW92ZVRhcmdldHMpIHsKKwkJc3VwZXIocGFyZW50U2hlbGwsIE1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgbnVsbCwgTWVzc2FnZXMuZGlhbG9nUnVudGltZUluVXNlLCBRVUVTVElPTiwKKwkJCW5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOworCQl0aGlzLnByb21wdERlbGV0ZVNlcnZlcnMgPSBwcm9tcHREZWxldGVTZXJ2ZXJzOworCQl0aGlzLnByb21wdFJlbW92ZVRhcmdldHMgPSBwcm9tcHRSZW1vdmVUYXJnZXRzOworCX0KKworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQlpZiAoIXByb21wdERlbGV0ZVNlcnZlcnMgJiYgIXByb21wdFJlbW92ZVRhcmdldHMpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNCk7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQljb21wLnNldExheW91dChsYXlvdXQpOworCQljb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKKwkJCisJCWlmIChwcm9tcHREZWxldGVTZXJ2ZXJzKSB7CisJCQlkZWxldGVTZXJ2ZXJzID0gdHJ1ZTsKKwkJCWZpbmFsIEJ1dHRvbiBkZWxldGVTZXJ2ZXJzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOworCQkJZGVsZXRlU2VydmVyc0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ1J1bnRpbWVEZWxldGVTZXJ2ZXJzKTsKKwkJCWRlbGV0ZVNlcnZlcnNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOworCQkJZGVsZXRlU2VydmVyc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWRlbGV0ZVNlcnZlcnMgPSBkZWxldGVTZXJ2ZXJzQnV0dG9uLmdldFNlbGVjdGlvbigpOworCQkJCX0KKwkJCX0pOworCQl9CisJCQorCQlpZiAocHJvbXB0UmVtb3ZlVGFyZ2V0cykgeworCQkJcmVtb3ZlVGFyZ2V0cyA9IHRydWU7CisJCQlmaW5hbCBCdXR0b24gcmVtb3ZlVGFyZ2V0c0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKKwkJCXJlbW92ZVRhcmdldHNCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dSdW50aW1lUmVtb3ZlVGFyZ2V0cyk7CisJCQlyZW1vdmVUYXJnZXRzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKKwkJCXJlbW92ZVRhcmdldHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlyZW1vdmVUYXJnZXRzID0gcmVtb3ZlVGFyZ2V0c0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCQkKKwkJcmV0dXJuIGNvbXA7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNEZWxldGVTZXJ2ZXJzKCkgeworCQlyZXR1cm4gZGVsZXRlU2VydmVyczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZVRhcmdldHMoKSB7CisJCXJldHVybiByZW1vdmVUYXJnZXRzOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWxldGVTZXJ2ZXJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlbGV0ZVNlcnZlckRpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NWU4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWxldGVTZXJ2ZXJEaWFsb2cuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VSdWxlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXI7CisvKioKKyAqIERpYWxvZyB0aGF0IHByb21wdHMgYSB1c2VyIHRvIGRlbGV0ZSBzZXJ2ZXIocykgYW5kL29yIHNlcnZlciBjb25maWd1cmF0aW9uKHMpLgorICovCitwdWJsaWMgY2xhc3MgRGVsZXRlU2VydmVyRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7CisJcHJvdGVjdGVkIElTZXJ2ZXJbXSBzZXJ2ZXJzOworCXByb3RlY3RlZCBJRm9sZGVyW10gY29uZmlnczsKKworCXByb3RlY3RlZCBMaXN0PElTZXJ2ZXI+IHJ1bm5pbmdTZXJ2ZXJzTGlzdDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBydW5uaW5nU2VydmVyQ2FuU3RvcDsKKworCXByb3RlY3RlZCBCdXR0b24gY2hlY2tEZWxldGVDb25maWdzOworCXByb3RlY3RlZCBCdXR0b24gY2hlY2tEZWxldGVSdW5uaW5nOworCXByb3RlY3RlZCBCdXR0b24gY2hlY2tEZWxldGVSdW5uaW5nU3RvcDsKKworCS8qKgorCSAqIERlbGV0ZVNlcnZlckRpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCisJICogQHBhcmFtIHNlcnZlcnMgYW4gYXJyYXkgb2Ygc2VydmVycworCSAqIEBwYXJhbSBjb25maWdzIGFuIGFycmF5IG9mIHNlcnZlciBjb25maWd1cmF0aW9ucworCSAqLworCXB1YmxpYyBEZWxldGVTZXJ2ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTZXJ2ZXJbXSBzZXJ2ZXJzLCBJRm9sZGVyW10gY29uZmlncykgeworCQlzdXBlcihwYXJlbnRTaGVsbCwgTWVzc2FnZXMuZGVsZXRlU2VydmVyRGlhbG9nVGl0bGUsIG51bGwsIG51bGwsIFFVRVNUSU9OLAorCQkJCW5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOworCQkKKwkJaWYgKHNlcnZlcnMgPT0gbnVsbCB8fCBjb25maWdzID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQorCQl0aGlzLnNlcnZlcnMgPSBzZXJ2ZXJzOworCQl0aGlzLmNvbmZpZ3MgPSBjb25maWdzOworCQkKKwkJcnVubmluZ1NlcnZlcnNMaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOworCQlmb3IgKGludCBpID0gMCA7IGkgPCBzZXJ2ZXJzLmxlbmd0aCA7ICsraSkgeworCQkJaWYgKHNlcnZlcnNbaV0uZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCisJCQkJcnVubmluZ1NlcnZlcnNMaXN0LmFkZChzZXJ2ZXJzW2ldKTsKKwkJCQorCQkJaWYgKHNlcnZlcnNbaV0uY2FuU3RvcCgpLmlzT0soKSkKKwkJCQlydW5uaW5nU2VydmVyQ2FuU3RvcCA9IHRydWU7CisJCX0KKwkJCisJCWlmIChzZXJ2ZXJzLmxlbmd0aCA9PSAxKQorCQkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ01lc3NhZ2UsIHNlcnZlcnNbMF0uZ2V0TmFtZSgpKTsKKwkJZWxzZQorCQkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ01lc3NhZ2VNYW55LCBzZXJ2ZXJzLmxlbmd0aCArICIiKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLkRFTEVURV9TRVJWRVJfRElBTE9HKTsKKwkJCisJCWlmIChjb25maWdzLmxlbmd0aCA+IDApIHsKKwkJCWNoZWNrRGVsZXRlQ29uZmlncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOworCQkJY2hlY2tEZWxldGVDb25maWdzLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRlU2VydmVyRGlhbG9nTG9vc2VDb25maWd1cmF0aW9ucywgY29uZmlnc1swXS5nZXROYW1lKCkpKTsKKwkJCWNoZWNrRGVsZXRlQ29uZmlncy5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCX0KKwkJCisJCS8vIHByb21wdCBmb3Igc3RvcHBpbmcgcnVubmluZyBzZXJ2ZXJzCisJCWludCBzaXplID0gcnVubmluZ1NlcnZlcnNMaXN0LnNpemUoKTsKKwkJaWYgKHNpemUgPiAwKSB7CisJCQljaGVja0RlbGV0ZVJ1bm5pbmcgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKKwkJCWNoZWNrRGVsZXRlUnVubmluZy5zZXRUZXh0KE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXIpOworCQkJY2hlY2tEZWxldGVSdW5uaW5nLnNldFNlbGVjdGlvbih0cnVlKTsKKwkJCQorCQkJaWYgKHJ1bm5pbmdTZXJ2ZXJDYW5TdG9wKSB7CisJCQkJY2hlY2tEZWxldGVSdW5uaW5nU3RvcCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOworCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0VGV4dChNZXNzYWdlcy5kZWxldGVTZXJ2ZXJEaWFsb2dSdW5uaW5nU2VydmVyU3RvcCk7CisJCQkJY2hlY2tEZWxldGVSdW5uaW5nU3RvcC5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDE1OworCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCQkKKwkJCQljaGVja0RlbGV0ZVJ1bm5pbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0RW5hYmxlZChjaGVja0RlbGV0ZVJ1bm5pbmcuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQl9CisJCQkJfSk7CisJCQl9CisJCX0KKwkJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKKwkJCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKKwkJaWYgKGJ1dHRvbklkID09IE9LKSB7CisJCQlmaW5hbCBib29sZWFuIGNoZWNrZWQgPSAoY2hlY2tEZWxldGVDb25maWdzICE9IG51bGwgJiYgY2hlY2tEZWxldGVDb25maWdzLmdldFNlbGVjdGlvbigpKTsKKwkJCWZpbmFsIGJvb2xlYW4gZGVsZXRlUnVubmluZyA9IChjaGVja0RlbGV0ZVJ1bm5pbmcgIT0gbnVsbCAmJiBjaGVja0RlbGV0ZVJ1bm5pbmcuZ2V0U2VsZWN0aW9uKCkpOworCQkJZmluYWwgYm9vbGVhbiBkZWxldGVSdW5uaW5nU3RvcCA9IChjaGVja0RlbGV0ZVJ1bm5pbmdTdG9wICE9IG51bGwgJiYgY2hlY2tEZWxldGVSdW5uaW5nU3RvcC5nZXRTZWxlY3Rpb24oKSk7CisJCQkKKwkJCVRocmVhZCB0ID0gbmV3IFRocmVhZCgiRGVsZXRlIHNlcnZlcnMiKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQlpZiAocnVubmluZ1NlcnZlcnNMaXN0LnNpemUoKSA+IDApIHsKKwkJCQkJCS8vIHN0b3Agc2VydmVycyBhbmQvb3IgdXBkYXRlcyBzZXJ2ZXJzJyBsaXN0CisJCQkJCQlwcmVwYXJlRm9yRGVsZXRpb24oZGVsZXRlUnVubmluZywgZGVsZXRlUnVubmluZ1N0b3ApOworCQkJCQl9CisJCQkJCQorCQkJCQlKb2Igam9iID0gbmV3IEpvYihNZXNzYWdlcy5kZWxldGVTZXJ2ZXJUYXNrKSB7CisJCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCQkJaWYgKHNlcnZlcnMubGVuZ3RoID09IDApIHsKKwkJCQkJCQkJLy8gYWxsIHNlcnZlcnMgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSBsaXN0CisJCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJCQkJCX0KKwkJCQkJCQl0cnkgeworCQkJCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCQkJCQkJCQorCQkJCQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOworCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQkJCQkJCXNlcnZlcnNbaV0uZGVsZXRlKCk7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAoY2hlY2tlZCkgeworCQkJCQkJCQkJc2l6ZSA9IGNvbmZpZ3MubGVuZ3RoOworCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQkJCQkJCQkJY29uZmlnc1tpXS5kZWxldGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aGlsZSBkZWxldGluZyByZXNvdXJjZXMiLCBlKTsKKwkJCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7IAorCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQkJCisJCQkJCS8vIHNldCBydWxlIGZvciB3b3Jrc3BhY2UgYW5kIHNlcnZlcnMKKwkJCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKKwkJCQkJSVNjaGVkdWxpbmdSdWxlW10gcnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlW3NpemUrMV07CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCQkJcnVsZXNbaV0gPSBzZXJ2ZXJzW2ldOworCQkJCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOworCQkJCQlydWxlc1tzaXplXSA9IHJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7CisJCQkJCWpvYi5zZXRSdWxlKE11bHRpUnVsZS5jb21iaW5lKHJ1bGVzKSk7CisJCQkJCWpvYi5zZXRQcmlvcml0eShKb2IuQlVJTEQpOworCQkJCQkKKwkJCQkJam9iLnNjaGVkdWxlKCk7CisJCQkJfQorCQkJfTsKKwkJCXQuc2V0RGFlbW9uKHRydWUpOworCQkJdC5zdGFydCgpOworCQl9CisJCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOworCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgc2VydmVycycgJiBjb25maWdzJyBsaXN0cy4gSWYgPGNvZGU+ZGVsZXRlUnVubmluZzwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4KKwkgKiAJYW5kIGEgc2VydmVyIGNhbid0IGJlIHN0b3BwZWQsIGl0IGlzbid0IHJlbW92ZWQuCisJICogQHBhcmFtIGRlbGV0ZVJ1bm5pbmcgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gcnVubmluZyBzZXJ2ZXJzIHdpbGwgYmUgc3RvcHBlZAorCSAqIAliZWZvcmUgYmVpbmcgZGVsZXRlZCwgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IHJ1bm5pbmcgc2VydmVycyB3aWxsIGJlIHJlbW92ZWQKKwkgKiAgICBmcm9tIGRlbGV0aW9uIGxpc3QuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvckRlbGV0aW9uKGJvb2xlYW4gZGVsZXRlUnVubmluZywgYm9vbGVhbiBzdG9wUnVubmluZykgeworCQkvLyBjb252ZXJ0cyBzZXJ2ZXJzICYgY29uZmlncyB0byBsaXN0IHRvIGZhY2lsaXRhdGUgcmVtb3ZhbAorCQlMaXN0PElTZXJ2ZXI+IHNlcnZlcnNMaXN0ID0gbmV3IExpbmtlZExpc3Q8SVNlcnZlcj4oQXJyYXlzLmFzTGlzdChzZXJ2ZXJzKSk7CisJCUxpc3Q8SUZvbGRlcj4gY29uZmlnc0xpc3QgPSBuZXcgTGlua2VkTGlzdDxJRm9sZGVyPihBcnJheXMuYXNMaXN0KGNvbmZpZ3MpKTsKKwkJaWYgKCFkZWxldGVSdW5uaW5nKSB7CisJCQkvLyBkb24ndCBkZWxldGUgc2VydmVycyBvciBjb25maWd1cmF0aW9ucworCQkJaW50IHNpemUgPSBydW5uaW5nU2VydmVyc0xpc3Quc2l6ZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlJU2VydmVyIHNlcnZlciA9IHJ1bm5pbmdTZXJ2ZXJzTGlzdC5nZXQoaSk7CisJCQkJc2VydmVyc0xpc3QucmVtb3ZlKHNlcnZlcik7CisJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkKKwkJCQkJY29uZmlnc0xpc3QucmVtb3ZlKHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN0b3BSdW5uaW5nKSB7CisJCQkJLy8gc3RvcCBydW5uaW5nIHNlcnZlcnMgYW5kIHdhaXQgZm9yIHRoZW0gKHN0b3AgaXMgYXN5bmNocm9ub3VzKQorCQkJCUlTZXJ2ZXIgczsKKwkJCQlNdWx0aVNlcnZlclN0b3BMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNdWx0aVNlcnZlclN0b3BMaXN0ZW5lcigpOworCQkJCWludCBleHBlY3RlZCA9IDA7CisJCQkJSXRlcmF0b3IgaXRlciA9IHJ1bm5pbmdTZXJ2ZXJzTGlzdC5pdGVyYXRvcigpOworCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCQlzID0gKElTZXJ2ZXIpIGl0ZXIubmV4dCgpOworCQkJCQlpZiAocy5jYW5TdG9wKCkuaXNPSygpKSB7CisJCQkJCQkrK2V4cGVjdGVkOworCQkJCQkJcy5zdG9wKGZhbHNlLCBsaXN0ZW5lcik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBzZXJ2ZXIgY2FuJ3QgYmUgc3RvcHBlZCwgZG9uJ3QgZGVsZXRlIGl0CisJCQkJCQlzZXJ2ZXJzTGlzdC5yZW1vdmUocyk7CisJCQkJCQljb25maWdzTGlzdC5yZW1vdmUocy5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkpOworCQkJCQl9CisJCQkJfQorCQkJCXRyeSB7CisJCQkJCXdoaWxlIChleHBlY3RlZCAhPSBsaXN0ZW5lci5nZXROdW1iZXJTdG9wcGVkKCkpIHsKKwkJCQkJCVRocmVhZC5zbGVlcCgyMDApOworCQkJCQl9CisJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3Igc2VydmVycyBzdG9wIik7CisJCQkJfQorCQkJfQorCQl9CisJCXNlcnZlcnMgPSBuZXcgSVNlcnZlcltzZXJ2ZXJzTGlzdC5zaXplKCldOworCQlzZXJ2ZXJzTGlzdC50b0FycmF5KHNlcnZlcnMpOworCQljb25maWdzID0gbmV3IElGb2xkZXJbY29uZmlnc0xpc3Quc2l6ZSgpXTsKKwkJY29uZmlnc0xpc3QudG9BcnJheShjb25maWdzKTsKKwl9CisKKwkvKioKKwkgKiBDbGFzcyB1c2VkIHRvIHdhaXQgYWxsIHNlcnZlcnMgc3RvcC4gVXNlIG9uZSBpbnN0YW5jZQorCSAqIGZvciBhIGdyb3VwIG9mIHNlcnZlcnMgYW5kIGxvb3AgdG8gc2VlIGlmIHRoZSBudW1iZXIgc3RvcHBlZAorCSAqIGVxdWFscyB0aGUgbnVtYmVyIG9mIHNlcnZlcnMgd2FpdGluZyB0byBzdG9wLgorCSAqLworCWNsYXNzIE11bHRpU2VydmVyU3RvcExpc3RlbmVyIGltcGxlbWVudHMgSU9wZXJhdGlvbkxpc3RlbmVyIHsKKwkJcHJvdGVjdGVkIGludCBudW07IAorCisJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKKwkJCW51bSsrOworCQl9CisKKwkJcHVibGljIGludCBnZXROdW1iZXJTdG9wcGVkKCkgeworCQkJcmV0dXJuIG51bTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9FY2xpcHNlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRWNsaXBzZVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RhYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRWNsaXBzZVV0aWwuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKKy8qKgorICogRWNsaXBzZSB1dGlsaXR5IG1ldGhvZHMuCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlVXRpbCB7CisJLyoqCisJICogRWNsaXBzZVV0aWwgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VVdGlsKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHNlcnZlciBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuIElmIHBhdGggaXMKKwkgKiBudWxsLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYXRpb24uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCisJICogQHBhcmFtIHBhdGggb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZS5JUGF0aAorCSAqIEBwYXJhbSBtb25pdG9yCisJICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cworCSAqLworCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU2VydmVyUHJvamVjdChTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCS8vbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOworCQkvL21vbml0b3IuYmVnaW5UYXNrKFNlcnZlclBsdWdpbi5nZXRSZXNvdXJjZSgiJWNyZWF0ZVNlcnZlclByb2plY3RUYXNrIiksIDMwMDApOworCQkKKwkJdHJ5IHsKKwkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCQkJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKKwkJCQorCQkJLy8gZ2V0IGEgcHJvamVjdCBkZXNjcmlwdG9yCisJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gd29ya3NwYWNlLm5ld1Byb2plY3REZXNjcmlwdGlvbihuYW1lKTsKKwkJCWRlc2NyaXB0aW9uLnNldExvY2F0aW9uKHBhdGgpOworCQkJCisJCQlwcm9qZWN0LmNyZWF0ZShkZXNjcmlwdGlvbiwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOworCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybiBudWxsOworCQkJcHJvamVjdC5vcGVuKFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMDApKTsKKwkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCQorCQkJLy8gYWRkIHRoZSBzZXJ2ZXIgcHJvamVjdCBuYXR1cmUKKwkJCVNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5zZXRTZXJ2ZXJQcm9qZWN0KHRydWUsIG1vbml0b3IpOworCQkJCisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuIG51bGw7CisJCQkKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBwcm9qZWN0IG5hbWVkICIgKyBuYW1lLCBjZSk7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0U3RhdHVzLCBjZS5nZXRNZXNzYWdlKCkpLCBjZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBwcm9qZWN0ICgyKSBuYW1lZCAiICsgbmFtZSwgZSk7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0LCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCW1vbml0b3IuZG9uZSgpOworCQl9CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiBwYXRoIGlzCisJICogbnVsbCwgaXQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uLgorCSAqCisJICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKKwkgKiBAcGFyYW0gbmFtZSBhIG5hbWUKKwkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlTmV3U2VydmVyUHJvamVjdChmaW5hbCBTaGVsbCBzaGVsbCwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVNlcnZlclByb2plY3QobmFtZSwgcGF0aCwgbW9uaXRvcik7CisJCWlmICghc3RhdHVzLmlzT0soKSkgeworCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCVNoZWxsIHNoZWxsMiA9IHNoZWxsOworCQkJCQlpZiAoc2hlbGwgPT0gbnVsbCkKKwkJCQkJCXNoZWxsMiA9IGdldFNoZWxsKCk7CisJCQkJCW9wZW5FcnJvcihzaGVsbDIsIE1lc3NhZ2VzLmVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0LCBzdGF0dXMpOworCQkJCX0KKwkJCX0pOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIGEgcHJvamVjdC4KKwkgKgorCSAqIEBwYXJhbSBwcm9qZWN0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0CisJICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRQcm9qZWN0SW1hZ2VEZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QpIHsKKwkJaWYgKHByb2plY3QgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQorCQlJV29ya2JlbmNoQWRhcHRlciBhZGFwdGVyID0gKElXb3JrYmVuY2hBZGFwdGVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpOworCQorCQlpZiAoYWRhcHRlciAhPSBudWxsKQorCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKHByb2plY3QpOworCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgc2hlbGwgZm9yIHRoZSB3b3JrYmVuY2guCisJICoKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCisJICovCisJcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbCgpIHsKKwkJcmV0dXJuIGdldFN0YW5kYXJkRGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmCisJICogdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc3BsYXkuIElmIHNvLCB0aGlzCisJICogZGlzcGxheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkgeworCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKKwkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKKwkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKKworCQlyZXR1cm4gZGlzcGxheTsJCQorCX0JCisJCisJLyoqCisJICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCisJICoKKwkgKiBAcGFyYW0gbWVzc2FnZSBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSk7CisJCQl9CisJCX0pOworCX0KKworCS8qKgorCSAqIE9wZW4gYSBkaWFsb2cgd2luZG93LgorCSAqCisJICogQHBhcmFtIG1lc3NhZ2UgamF2YS5sYW5nLlN0cmluZworCSAqIEBwYXJhbSBzdGF0dXMgSVN0YXR1cworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIElTdGF0dXMgc3RhdHVzKSB7CisJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOworCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCisJICoKKwkgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsCisJICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSkgeworCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSk7CisJfQorCisJLyoqCisJICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCisJICoKKwkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAorCSAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZQorCSAqIEBwYXJhbSBzdGF0dXMgYSBzdGF0dXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzdGF0dXMpIHsKKwkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOworCX0KKworCS8qKgorCSAqIERvIGEgdmFsaWRhdGVFZGl0KCkgb24gdGhlIGdpdmVuIHNlcnZlci4KKwkgKiAKKwkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGUgZWRpdCB3b3JrZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFZGl0KFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcikgeworCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZlclV0aWwudmFsaWRhdGVFZGl0KHNoZWxsLCBzZXJ2ZXIpOworCQlyZXR1cm4gdmFsaWRhdGVFZGl0KHNoZWxsLCBzdGF0dXMpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUVkaXQoU2hlbGwgc2hlbGwsIElTdGF0dXMgc3RhdHVzKSB7CisJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7CisJCQkvLyBpbmZvcm0gdXNlcgorCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JWYWxpZGF0ZUVkaXRGYWlsdXJlTWVzc2FnZTsKKwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKKworCQkJLy8gZG8gbm90IGV4ZWN1dGUgY29tbWFuZAorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmFsVG9vbFRpcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvR2VuZXJhbFRvb2xUaXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzNjMzdiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvR2VuZXJhbFRvb2xUaXAuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLklTZXJ2ZXJUb29sVGlwOworCitwdWJsaWMgY2xhc3MgR2VuZXJhbFRvb2xUaXAgaW1wbGVtZW50cyBJU2VydmVyVG9vbFRpcCB7CisJcHVibGljIEdlbmVyYWxUb29sVGlwKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJcHVibGljIHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBJU2VydmVyIHNlcnZlcikgeworCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsU1dULk5PTkUpOworCQl0ZXh0LnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7CisJCVN0cmluZyBzID0gIiI7CisJCWlmIChzZXJ2ZXIuZ2V0UnVudGltZSgpICE9IG51bGwpCisJCQlzICs9IHNlcnZlci5nZXRSdW50aW1lKCkuZ2V0TmFtZSgpICsgIiAtICI7CisJCXMgKz0gTkxTLmJpbmQoTWVzc2FnZXMubW9kdWxlcywgc2VydmVyLmdldE1vZHVsZXMoKS5sZW5ndGggKyAiIik7CisJCXRleHQuc2V0VGV4dChzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW1hZ2VSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW1hZ2VSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzY1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgaW1hZ2UgcmVzb3VyY2VzLgorICovCitwdWJsaWMgY2xhc3MgSW1hZ2VSZXNvdXJjZSB7CisJLy8gdGhlIGltYWdlIHJlZ2lzdHJ5CisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OworCisJLy8gbWFwIG9mIGltYWdlIGRlc2NyaXB0b3JzIHNpbmNlIHRoZXNlCisJLy8gd2lsbCBiZSBsb3N0IGJ5IHRoZSBpbWFnZSByZWdpc3RyeQorCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEltYWdlRGVzY3JpcHRvcj4gaW1hZ2VEZXNjcmlwdG9yczsKKworCS8vIGJhc2UgdXJscyBmb3IgaW1hZ2VzCisJcHJpdmF0ZSBzdGF0aWMgVVJMIElDT05fQkFTRV9VUkw7CisKKwlzdGF0aWMgeworCQl0cnkgeworCQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvIjsKKwkJCUlDT05fQkFTRV9VUkwgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGhTdWZmaXgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNldCBpY29uIGJhc2UgVVJMIiwgZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0NMQ0wgPSAiY2xjbDE2LyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9DVE9PTCA9ICJjdG9vbDE2LyI7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTENMID0gImVsY2wxNi8iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRVRPT0wgPSAiZXRvb2wxNi8iOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRExDTCA9ICJkbGNsMTYvIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0RUT09MID0gImR0b29sMTYvIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfT0JKID0gIm9iajE2LyI7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9PVlIgPSAib3ZyMTYvIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfV0laQkFOID0gIndpemJhbi8iOworCisJLy8gLS0tIGNvbnN0YW50cyBmb3IgaW1hZ2VzIC0tLQorCisJLy8gU2VydmVyIFN0YXRlIEltYWdlcworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1NUQVJUID0gIklNR19DTENMX1NUQVJUIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9TVEFSVF9ERUJVRyA9ICJJTUdfQ0xDTF9TVEFSVF9ERUJVRyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfU1RBUlRfUFJPRklMRSA9ICJJTUdfQ0xDTF9TVEFSVF9QUk9GSUxFIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9TVE9QID0gIklNR19DTENMX1NUT1AiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1BVQkxJU0ggPSAiSU1HX0NMQ0xfUFVCTElTSCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfRElTQ09OTkVDVCA9ICJJTUdfQ0xDTF9ESVNDT05ORUNUIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1NUQVJUID0gIklNR19FTENMX1NUQVJUIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TVEFSVF9ERUJVRyA9ICJJTUdfRUxDTF9TVEFSVF9ERUJVRyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfU1RBUlRfUFJPRklMRSA9ICJJTUdfRUxDTF9TVEFSVF9QUk9GSUxFIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TVE9QID0gIklNR19FTENMX1NUT1AiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1BVQkxJU0ggPSAiSU1HX0VMQ0xfUFVCTElTSCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfRElTQ09OTkVDVCA9ICJJTUdfRUxDTF9ESVNDT05ORUNUIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NUQVJUID0gIklNR19ETENMX1NUQVJUIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TVEFSVF9ERUJVRyA9ICJJTUdfRExDTF9TVEFSVF9ERUJVRyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfU1RBUlRfUFJPRklMRSA9ICJJTUdfRExDTF9TVEFSVF9QUk9GSUxFIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TVE9QID0gIklNR19ETENMX1NUT1AiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1BVQkxJU0ggPSAiSU1HX0RMQ0xfUFVCTElTSCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfRElTQ09OTkVDVCA9ICJJTUdfRExDTF9ESVNDT05ORUNUIjsKKworCS8vIFdpemFyZCBCYW5uZXIgSW1hZ2VzCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9ORVdfUlVOVElNRSA9ICJuZXdTZXJ2ZXJXaXoiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fTkVXX1NFUlZFUiA9ICJuZXdTZXJ2ZXJXaXoiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fU0VMRUNUX1NFUlZFUl9DTElFTlQgPSAid2l6Q2xpZW50IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX1NFTEVDVF9TRVJWRVIgPSAic2VsZWN0U2VydmVyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX0lNUE9SVF9TRVJWRVJfQ09ORklHVVJBVElPTiA9ICJpbXBvcnRDb25maWdXaXoiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEID0gInN0YXRlU3RhcnRlZCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX0RFQlVHID0gInN0YXRlU3RhcnRlZERlYnVnIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRSA9ICJzdGF0ZVN0YXJ0ZWRQcm9maWxlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUT1BQRUQgPSAic3RhdGVTdG9wcGVkIjsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU1RBVEVfU1RBUlRFRCA9ICJzdGF0ZVN0YXJ0ZWQyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU1RBVEVfU1RPUFBFRCA9ICJzdGF0ZVN0b3BwZWQyIjsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzEgPSAic3RhdGVTdGFydGluZzEiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMiA9ICJzdGF0ZVN0YXJ0aW5nMiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18zID0gInN0YXRlU3RhcnRpbmczIjsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzEgPSAic3RhdGVTdG9wcGluZzEiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMiA9ICJzdGF0ZVN0b3BwaW5nMiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18zID0gInN0YXRlU3RvcHBpbmczIjsKKworCS8vIFNlcnZlciBDbGllbnQgSW1hZ2VzCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX1JVTl9PTl9TRVJWRVIgPSAiSU1HX0NUT09MX0NMSUVOVCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX0RFQlVHX09OX1NFUlZFUiA9ICJJTUdfQ1RPT0xfQ0xJRU5UMiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX1BST0ZJTEVfT05fU0VSVkVSID0gIklNR19DVE9PTF9DTElFTlQzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfTkVXX1NFUlZFUiA9ICJJTUdfQ1RPT0xfTkVXX1NFUlZFUiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX05FV19TRVJWRVJfSU5TVEFOQ0UgPSAiSU1HX0NUT09MX05FV19TRVJWRVJfSU5TVEFOQ0UiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9NT0RJRllfTU9EVUxFUyA9ICJJTUdfQ1RPT0xfTU9ESUZZX01PRFVMRVMiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1JVTl9PTl9TRVJWRVIgPSAiSU1HX0VUT09MX0NMSUVOVCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0RFQlVHX09OX1NFUlZFUiA9ICJJTUdfRVRPT0xfQ0xJRU5UMiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1BST0ZJTEVfT05fU0VSVkVSID0gIklNR19FVE9PTF9DTElFTlQzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfTU9ESUZZX01PRFVMRVMgPSAiSU1HX0VUT09MX01PRElGWV9NT0RVTEVTIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfUkVTRVRfREVGQVVMVCA9ICJJTUdfRVRPT0xfUkVTRVRfREVGQVVMVCI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfUlVOX09OX1NFUlZFUiA9ICJJTUdfRFRPT0xfQ0xJRU5UIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfREVCVUdfT05fU0VSVkVSID0gIklNR19EVE9PTF9DTElFTlQyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfUFJPRklMRV9PTl9TRVJWRVIgPSAiSU1HX0RUT09MX0NMSUVOVDMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9NT0RJRllfTU9EVUxFUyA9ICJJTUdfRFRPT0xfTU9ESUZZX01PRFVMRVMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9SRVNFVF9ERUZBVUxUID0gIklNR19EVE9PTF9SRVNFVF9ERUZBVUxUIjsKKworCS8vIEdlbmVyYWwgT2JqZWN0IEltYWdlcworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVIgPSAic2VydmVyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX0NPTkZJR1VSQVRJT05fTk9ORSA9ICJub0NvbmZpZ3VyYXRpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfQ09ORklHVVJBVElPTl9NSVNTSU5HID0gImNvbmZpZ3VyYXRpb25NaXNzaW5nIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPSkVDVF9NSVNTSU5HID0gInByb2plY3RNaXNzaW5nIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVQQUlSX0NPTkZJR1VSQVRJT04gPSAicmVwYWlyQ29uZmlndXJhdGlvbiI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFVCTElTSF9FTkFCTEVEID0gInB1Ymxpc2hFbmFibGVkIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFVCTElTSF9ESVNBQkxFRCA9ICJwdWJsaXNoRGlzYWJsZWQiOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NT05JVE9SX09OID0gIm1vbml0b3JPbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01PTklUT1JfT0ZGID0gIm1vbml0b3JPZmYiOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUZBVUxUX1NFUlZFUl9PVkVSTEFZID0gImRlZmF1bHRTZXJ2ZXJPdmVybGF5IjsKKwkKKwkvLyBBdWRpbyBpbWFnZXMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQVVESU9fU09VTkQgPSAic291bmQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BVURJT19DQVRFR09SWSA9ICJjYXRlZ29yeSI7CisKKwkvKioKKwkgKiBDYW5ub3QgY29uc3RydWN0IGFuIEltYWdlUmVzb3VyY2UuIFVzZSBzdGF0aWMgbWV0aG9kcyBvbmx5LgorCSAqLworCXByaXZhdGUgSW1hZ2VSZXNvdXJjZSgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKwkKKwkvKioKKwkgKiBEaXNwb3NlIG9mIGVsZW1lbnQgaW1hZ2VzIHRoYXQgd2VyZSBjcmVhdGVkLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkuCisJICoKKwkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgeworCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKQorCQkJaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoKTsKKwkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOworCQlpZiAoaW1hZ2UgPT0gbnVsbCkgeworCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKTsKKwkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKKwkJfQorCQlyZXR1cm4gaW1hZ2U7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGtleS4KKwkgKgorCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZworCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yCisJICovCisJcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKKwkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkKKwkJCWluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCk7CisJCUltYWdlRGVzY3JpcHRvciBpZCA9IGltYWdlRGVzY3JpcHRvcnMuZ2V0KGtleSk7CisJCWlmIChpZCAhPSBudWxsKQorCQkJcmV0dXJuIGlkOworCQkKKwkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgaW1hZ2UgcmVzb3VyY2VzLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpIHsKKwkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7CisJCWltYWdlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlRGVzY3JpcHRvcj4oKTsKKworCQkvLyB3aXphcmQgYmFubmVycworCQlyZWdpc3RlckltYWdlKElNR19XSVpCQU5fTkVXX1NFUlZFUiwgVVJMX1dJWkJBTiArICJuZXdfc2VydmVyX3dpei5wbmciKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfV0laQkFOX0lNUE9SVF9TRVJWRVJfQ09ORklHVVJBVElPTiwgVVJMX1dJWkJBTiArICJpbXBvcnRfY29uZmlndXJhdGlvbl93aXoucG5nIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSX0NMSUVOVCwgVVJMX1dJWkJBTiArICJzZWxlY3RfY2xpZW50X3dpei5wbmciKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfV0laQkFOX1NFTEVDVF9TRVJWRVIsIFVSTF9XSVpCQU4gKyAic2VsZWN0X3NlcnZlcl93aXoucG5nIik7CisKKwkJLy8gY2xpZW50IGltYWdlcworCQlyZWdpc3RlckltYWdlKElNR19FVE9PTF9SVU5fT05fU0VSVkVSLCBVUkxfRVRPT0wgKyAicnVuX29uX3NlcnZlci5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfRVRPT0xfREVCVUdfT05fU0VSVkVSLCBVUkxfRVRPT0wgKyAiZGVidWdfb25fc2VydmVyLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19FVE9PTF9QUk9GSUxFX09OX1NFUlZFUiwgVVJMX0VUT09MICsgInByb2ZpbGVfb25fc2VydmVyLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19FVE9PTF9NT0RJRllfTU9EVUxFUywgVVJMX0VUT09MICsgIndpel9tb2RpZnlfbW9kdWxlcy5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfRVRPT0xfUkVTRVRfREVGQVVMVCwgVVJMX0VUT09MICsgImNsZWFyLmdpZiIpOworCisJCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX1JVTl9PTl9TRVJWRVIsIFVSTF9DVE9PTCArICJydW5fb25fc2VydmVyLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19DVE9PTF9ERUJVR19PTl9TRVJWRVIsIFVSTF9DVE9PTCArICJkZWJ1Z19vbl9zZXJ2ZXIuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX1BST0ZJTEVfT05fU0VSVkVSLCBVUkxfQ1RPT0wgKyAicHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX05FV19TRVJWRVIsIFVSTF9DVE9PTCArICJ3aXpfbmV3X3NlcnZlci5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfQ1RPT0xfTkVXX1NFUlZFUl9JTlNUQU5DRSwgVVJMX0NUT09MICsgIndpel9uZXdfaW5zdGFuY2UuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX01PRElGWV9NT0RVTEVTLCBVUkxfQ1RPT0wgKyAid2l6X21vZGlmeV9tb2R1bGVzLmdpZiIpOworCisJCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX1JVTl9PTl9TRVJWRVIsIFVSTF9EVE9PTCArICJydW5fb25fc2VydmVyLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19EVE9PTF9ERUJVR19PTl9TRVJWRVIsIFVSTF9EVE9PTCArICJkZWJ1Z19vbl9zZXJ2ZXIuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX1BST0ZJTEVfT05fU0VSVkVSLCBVUkxfRFRPT0wgKyAicHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX01PRElGWV9NT0RVTEVTLCBVUkxfRFRPT0wgKyAid2l6X21vZGlmeV9tb2R1bGVzLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19EVE9PTF9SRVNFVF9ERUZBVUxULCBVUkxfRFRPT0wgKyAiY2xlYXIuZ2lmIik7CisJCisJCS8vIGxvYWQgc2VydmVyIHN0YXRlIGltYWdlcworCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RBUlRFRCwgVVJMX09CSiArICJzZXJ2ZXJfc3RhcnRlZC5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUcsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0ZWRfZGVidWcuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX1BST0ZJTEUsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0ZWRfcHJvZmlsZS5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUT1BQRUQsIFVSTF9PQkogKyAic2VydmVyX3N0b3BwZWQuZ2lmIik7CisJCQorCQlyZWdpc3RlckltYWdlKElNR19TVEFURV9TVEFSVEVELCBVUkxfT0JKICsgInN0YXRlX3N0YXJ0ZWQuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX1NUQVRFX1NUT1BQRUQsIFVSTF9PQkogKyAic3RhdGVfc3RvcHBlZC5naWYiKTsKKwkJCisJCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18xLCBVUkxfT0JKICsgInNlcnZlcl9zdGFydGluZzEuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18yLCBVUkxfT0JKICsgInNlcnZlcl9zdGFydGluZzIuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18zLCBVUkxfT0JKICsgInNlcnZlcl9zdGFydGluZzMuZ2lmIik7CisJCQorCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMSwgVVJMX09CSiArICJzZXJ2ZXJfc3RvcHBpbmcxLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMiwgVVJMX09CSiArICJzZXJ2ZXJfc3RvcHBpbmcyLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMywgVVJMX09CSiArICJzZXJ2ZXJfc3RvcHBpbmczLmdpZiIpOworCQorCQkvLyBsb2FkIGFjdGlvbiBpbWFnZXMKKwkJcmVnaXN0ZXJJbWFnZShJTUdfRUxDTF9QVUJMSVNILCBVUkxfRUxDTCArICJsYXVuY2hfcHVibGlzaC5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfRUxDTF9TVEFSVCwgVVJMX0VMQ0wgKyAibGF1bmNoX3J1bi5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfRUxDTF9TVEFSVF9ERUJVRywgVVJMX0VMQ0wgKyAibGF1bmNoX2RlYnVnLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19FTENMX1NUQVJUX1BST0ZJTEUsIFVSTF9FTENMICsgImxhdW5jaF9wcm9maWxlLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19FTENMX1NUT1AsIFVSTF9FTENMICsgImxhdW5jaF9zdG9wLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19FTENMX0RJU0NPTk5FQ1QsIFVSTF9FTENMICsgImxhdW5jaF9kaXNjb25uZWN0LmdpZiIpOworCQorCQlyZWdpc3RlckltYWdlKElNR19DTENMX1BVQkxJU0gsIFVSTF9DTENMICsgImxhdW5jaF9wdWJsaXNoLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19DTENMX1NUQVJULCBVUkxfQ0xDTCArICJsYXVuY2hfcnVuLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19DTENMX1NUQVJUX0RFQlVHLCBVUkxfQ0xDTCArICJsYXVuY2hfZGVidWcuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfU1RBUlRfUFJPRklMRSwgVVJMX0NMQ0wgKyAibGF1bmNoX3Byb2ZpbGUuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfU1RPUCwgVVJMX0NMQ0wgKyAibGF1bmNoX3N0b3AuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfRElTQ09OTkVDVCwgVVJMX0NMQ0wgKyAibGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmIik7CisJCisJCXJlZ2lzdGVySW1hZ2UoSU1HX0RMQ0xfUFVCTElTSCwgVVJMX0RMQ0wgKyAibGF1bmNoX3B1Ymxpc2guZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0RMQ0xfU1RBUlQsIFVSTF9ETENMICsgImxhdW5jaF9ydW4uZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX0RMQ0xfU1RBUlRfREVCVUcsIFVSTF9ETENMICsgImxhdW5jaF9kZWJ1Zy5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9TVEFSVF9QUk9GSUxFLCBVUkxfRExDTCArICJsYXVuY2hfcHJvZmlsZS5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9TVE9QLCBVUkxfRExDTCArICJsYXVuY2hfc3RvcC5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9ESVNDT05ORUNULCBVUkxfRExDTCArICJsYXVuY2hfZGlzY29ubmVjdC5naWYiKTsKKwkKKwkJLy8gbG9hZCBnZW5lcmFsIG9iamVjdCBpbWFnZXMKKwkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSLCBVUkxfT0JKICsgInNlcnZlci5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX0NPTkZJR1VSQVRJT05fTk9ORSwgVVJMX09CSiArICJjb25maWd1cmF0aW9uX25vbmUuZ2lmIik7CisJCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9DT05GSUdVUkFUSU9OX01JU1NJTkcsIFVSTF9PQkogKyAiY29uZmlndXJhdGlvbl9taXNzaW5nLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19QUk9KRUNUX01JU1NJTkcsIFVSTF9PQkogKyAicHJvamVjdF9taXNzaW5nLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19SRVBBSVJfQ09ORklHVVJBVElPTiwgVVJMX09CSiArICJyZXBhaXJfY29uZmlnLmdpZiIpOworCQorCQlyZWdpc3RlckltYWdlKElNR19QVUJMSVNIX0VOQUJMRUQsIFVSTF9PQkogKyAicHVibGlzaF9lbmFibGVkLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19QVUJMSVNIX0RJU0FCTEVELCBVUkxfT0JKICsgInB1Ymxpc2hfZGlzYWJsZWQuZ2lmIik7CisJCQorCQlyZWdpc3RlckltYWdlKElNR19NT05JVE9SX09OLCBVUkxfT0JKICsgIm1vbml0b3JPbi5naWYiKTsKKwkJcmVnaXN0ZXJJbWFnZShJTUdfTU9OSVRPUl9PRkYsIFVSTF9PQkogKyAibW9uaXRvck9mZi5naWYiKTsKKwkJCisJCXJlZ2lzdGVySW1hZ2UoSU1HX0RFRkFVTFRfU0VSVkVSX09WRVJMQVksIFVSTF9PVlIgKyAiZGVmYXVsdF9zZXJ2ZXJfb3ZyLmdpZiIpOworCQkKKwkJLy8gYXVkaW8gaW1hZ2VzCisJCXJlZ2lzdGVySW1hZ2UoSU1HX0FVRElPX1NPVU5ELCBVUkxfT0JKICsgImF1ZGlvX3NvdW5kLmdpZiIpOworCQlyZWdpc3RlckltYWdlKElNR19BVURJT19DQVRFR09SWSwgVVJMX09CSiArICJhdWRpb19jYXRlZ29yeS5naWYiKTsKKwkJCisJCWxvYWRTZXJ2ZXJJbWFnZXMoKTsKKwkJCisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucmVnaXN0ZXJJY29uRm9yRmFtaWx5KAorCQkJCWdldEltYWdlRGVzY3JpcHRvcihJTUdfU0VSVkVSKSwgU2VydmVyVXRpbC5TRVJWRVJfSk9CX0ZBTUlMWSk7CisJfQorCisJLyoqCisJICogUmVnaXN0ZXIgYW4gaW1hZ2Ugd2l0aCB0aGUgcmVnaXN0cnkuCisJICoKKwkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcGFyYW0gcGFydGlhbFVSTCBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlckltYWdlKFN0cmluZyBrZXksIFN0cmluZyBwYXJ0aWFsVVJMKSB7CisJCXRyeSB7CisJCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKElDT05fQkFTRV9VUkwsIHBhcnRpYWxVUkwpKTsKKwkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaWQpOworCQkJaW1hZ2VEZXNjcmlwdG9ycy5wdXQoa2V5LCBpZCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZWdpc3RlcmluZyBpbWFnZSAiICsga2V5ICsgIiBmcm9tICIgKyBwYXJ0aWFsVVJMLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIExvYWQgdGhlIHNlcnZlciBpbWFnZXMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkU2VydmVySW1hZ2VzKCkgeworCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAuc2VydmVySW1hZ2VzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKKwkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJbG9hZFNlcnZlckltYWdlcyhyZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBTZXJ2ZXJVSVBsdWdpbi5FWFRFTlNJT05fU0VSVkVSX0lNQUdFUykpOworCQlTZXJ2ZXJVSVBsdWdpbi5hZGRSZWdpc3RyeUxpc3RlbmVyKCk7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLnNlcnZlckltYWdlcyBleHRlbnNpb24gcG9pbnQgLTwtIik7CisJfQorCisJLyoqCisJICogTG9hZCB0aGUgc2VydmVyIGltYWdlcy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRTZXJ2ZXJJbWFnZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YpIHsKKwkJaW50IHNpemUgPSBjZi5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQl0cnkgeworCQkJCVN0cmluZyBuYW1lID0gY2ZbaV0uZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7CisJCQkJU3RyaW5nIGljb25QYXRoID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJpY29uIik7CisJCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihuYW1lLCBpY29uUGF0aCk7CisJCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsICYmIGljb25QYXRoICE9IG51bGwgJiYgaWNvblBhdGgubGVuZ3RoKCkgPiAwKQorCQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOworCQkJCQorCQkJCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgeworCQkJCQlTdHJpbmdbXSB0eXBlSWRzID0gU2VydmVyVUlQbHVnaW4udG9rZW5pemUoY2ZbaV0uZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIiksICIsIik7CisJCQkJCWludCBzaXplMiA9IHR5cGVJZHMubGVuZ3RoOworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQkJCWltYWdlUmVnaXN0cnkucHV0KHR5cGVJZHNbal0sIGltYWdlRGVzY3JpcHRvcik7CQkKKwkJCQkJCWltYWdlRGVzY3JpcHRvcnMucHV0KHR5cGVJZHNbal0sIGltYWdlRGVzY3JpcHRvcik7CisJCQkJCX0KKwkJCQl9CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgc2VydmVySW1hZ2U6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHNlcnZlckltYWdlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBoYW5kbGVTZXJ2ZXJJbWFnZURlbHRhKElFeHRlbnNpb25EZWx0YSBkZWx0YSkgeworCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSAvLyBub3QgbG9hZGVkIHlldAorCQkJcmV0dXJuOworCQkKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSBkZWx0YS5nZXRFeHRlbnNpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKKwkJCisJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKQorCQkJbG9hZFNlcnZlckltYWdlcyhjZik7CisJCWVsc2UgeworCQkJaW50IHNpemUgPSBjZi5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCVN0cmluZyB0eXBlSWQgPSBjZltpXS5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKTsKKwkJCQlpbWFnZVJlZ2lzdHJ5LnJlbW92ZSh0eXBlSWQpOworCQkJCWltYWdlRGVzY3JpcHRvcnMucmVtb3ZlKHR5cGVJZCk7CisJCQl9CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW5pdGlhbGl6ZUpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW5pdGlhbGl6ZUpvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMWJlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Jbml0aWFsaXplSm9iLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7CisvKioKKyAqIEpvYiB0byBpbml0aWFsaXplIHRoZSBzZXJ2ZXIgVUkuCisgKi8KK3B1YmxpYyBjbGFzcyBJbml0aWFsaXplSm9iIGV4dGVuZHMgSm9iIHsKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGpvYi4KKwkgKi8KKwlwdWJsaWMgSW5pdGlhbGl6ZUpvYigpIHsKKwkJc3VwZXIoTWVzc2FnZXMuam9iSW5pdGlhbGl6aW5nKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4oSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CisJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCXNlcnZlcnNbaV0uYWRkU2VydmVyTGlzdGVuZXIoU2VydmVyVUlQbHVnaW4uc2VydmVyTGlzdGVuZXIpOworCQkJCXNlcnZlcnNbaV0uYWRkUHVibGlzaExpc3RlbmVyKFNlcnZlclVJUGx1Z2luLnB1Ymxpc2hMaXN0ZW5lcik7CisJCQl9CisJCX0KKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0xhdW5jaENsaWVudEpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTGF1bmNoQ2xpZW50Sm9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzMWEzZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0xhdW5jaENsaWVudEpvYi5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC4qOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIExhdW5jaENsaWVudEpvYiBleHRlbmRzIENoYWluZWRKb2IgeworCXByb3RlY3RlZCBJTW9kdWxlW10gbW9kdWxlOworCXByb3RlY3RlZCBJQ2xpZW50IGNsaWVudDsKKwlwcm90ZWN0ZWQgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyOworCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKKwlwcm90ZWN0ZWQgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0OworCisJcHVibGljIExhdW5jaENsaWVudEpvYihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCwgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyLCBJQ2xpZW50IGNsaWVudCkgeworCQlzdXBlcihNZXNzYWdlcy5sYXVuY2hpbmdDbGllbnRUYXNrLCBzZXJ2ZXIpOworCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKKwkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKKwkJdGhpcy5tb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0OworCQl0aGlzLmxhdW5jaGFibGVBZGFwdGVyID0gbGF1bmNoYWJsZUFkYXB0ZXI7CisJCXRoaXMuY2xpZW50ID0gY2xpZW50OworCQlzZXRSdWxlKHNlcnZlcik7CisJfQorCisJLyoqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCisJICovCisJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkxhdW5jaENsaWVudCBqb2IiKTsKKworCQkvLyB3YWl0IGZvciB1cCB0byA1IG1pbnV0ZXMKKwkJZmluYWwgU2VydmVyIHNlcnZlciA9IChTZXJ2ZXIpIGdldFNlcnZlcigpOworCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKTsKKwkJaW50IGNvdW50ID0gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5nZXRNb2R1bGVTdGFydFRpbWVvdXQoKTsKKwkJd2hpbGUgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcgJiYgY291bnQgPiAwKSB7CisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOworCQkJCisJCQl0cnkgeworCQkJCVRocmVhZC5zbGVlcCgyMDAwKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCQljb3VudCAtPSAyMDAwOworCQkJc3RhdGUgPSBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKTsKKwkJfQorCQkKKwkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJMYXVuY2hDbGllbnQgam9iIDIgIiArIHN0YXRlKTsKKwkJCisJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKwkJCisJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQorCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkxhdW5jaENsaWVudCBqb2IgMyIpOworCQkKKwkJLy8gZGlzcGxheSBjbGllbnQgb24gVUkgdGhyZWFkCisJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQXR0ZW1wdGluZyB0byBsb2FkIGNsaWVudDogIiArIGNsaWVudC5nZXRJZCgpKTsKKwkJCQl0cnkgeworCQkJCQlPYmplY3QgbGF1bmNoYWJsZSA9IGxhdW5jaGFibGVBZGFwdGVyLmdldExhdW5jaGFibGUoc2VydmVyLCBtb2R1bGVBcnRpZmFjdCk7CisJCQkJCUlTdGF0dXMgc3RhdHVzID0gY2xpZW50LmxhdW5jaChzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUsIHNlcnZlci5nZXRMYXVuY2goKSk7CisJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQorCQkJCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKG51bGwsIHN0YXR1cyk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IobnVsbCwgY2UuZ2V0U3RhdHVzKCkpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIlNlcnZlciBjbGllbnQgZmFpbGVkIiwgZSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJMYXVuY2hDbGllbnQgam9iIDQiKTsKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0xhdW5jaGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9MYXVuY2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZTU3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9MYXVuY2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsMzc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKKy8qKgorICogVGhlIHByZWZlcmVuY2UgcGFnZSB0aGF0IGhvbGRzIHNlcnZlciBsYXVuY2hpbmcgcHJvcGVydGllcy4KKyAqLworcHVibGljIGNsYXNzIExhdW5jaGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCXByb3RlY3RlZCBTZXJ2ZXJQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKKwlwcm90ZWN0ZWQgU2VydmVyVUlQcmVmZXJlbmNlcyB1aVByZWZlcmVuY2VzOworCisJcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoQmVmb3JlU3RhcnQ7CisKKwlwcm90ZWN0ZWQgYnl0ZSBzYXZlRWRpdG9yczsKKwlwcm90ZWN0ZWQgQnV0dG9uW10gc2F2ZUJ1dHRvbnM7CisJcHJvdGVjdGVkIGludCBsYXVuY2hNb2RlOworCXByb3RlY3RlZCBCdXR0b25bXSBsYXVuY2hNb2RlQnV0dG9uczsKKwlwcm90ZWN0ZWQgaW50IGxhdW5jaE1vZGUyOworCXByb3RlY3RlZCBCdXR0b25bXSBsYXVuY2hNb2RlMkJ1dHRvbnM7CisJcHJvdGVjdGVkIGludCBicmVha3BvaW50RW5hYmxlbWVudDsKKwlwcm90ZWN0ZWQgQnV0dG9uW10gYnJlYWtwb2ludEJ1dHRvbnM7CisJcHJvdGVjdGVkIGludCByZXN0YXJ0RW5hYmxlbWVudDsKKwlwcm90ZWN0ZWQgQnV0dG9uW10gcmVzdGFydEJ1dHRvbnM7CisKKwkvKioKKwkgKiBTZXJ2ZXJQcmVmZXJlbmNlc1BhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgTGF1bmNoaW5nUHJlZmVyZW5jZVBhZ2UoKSB7CisJCXN1cGVyKCk7CisJCQorCQlwcmVmZXJlbmNlcyA9IFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCk7CisJCXVpUHJlZmVyZW5jZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0aGUgcHJlZmVyZW5jZSBvcHRpb25zLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOworCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwkJd2hzLnNldEhlbHAocGFyZW50LCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTCk7CisJCQorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyg0KTsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyg0KTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCXB1Ymxpc2hCZWZvcmVTdGFydCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOworCQlwdWJsaXNoQmVmb3JlU3RhcnQuc2V0VGV4dChNZXNzYWdlcy5wcmVmQXV0b1B1Ymxpc2gpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOworCQlwdWJsaXNoQmVmb3JlU3RhcnQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJcHVibGlzaEJlZm9yZVN0YXJ0LnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5pc0F1dG9QdWJsaXNoaW5nKCkpOworCQl3aHMuc2V0SGVscChwdWJsaXNoQmVmb3JlU3RhcnQsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX1BVQkxJU0hfQkVGT1JFX1NUQVJUKTsKKwkJCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJY3JlYXRlU2F2ZUVkaXRvckdyb3VwKGNvbXBvc2l0ZSk7CisJCQorCQljcmVhdGVMYXVuY2hNb2RlR3JvdXAoY29tcG9zaXRlKTsKKwkJCisJCWNyZWF0ZUxhdW5jaE1vZGUyR3JvdXAoY29tcG9zaXRlKTsKKwkJCisJCWNyZWF0ZUJyZWFrcG9pbnRzR3JvdXAoY29tcG9zaXRlKTsKKwkJCisJCWNyZWF0ZVJlc3RhcnRHcm91cChjb21wb3NpdGUpOworCQkKKwkJc2V0U2F2ZUVkaXRvclN0YXR1cyh1aVByZWZlcmVuY2VzLmdldFNhdmVFZGl0b3JzKCkpOworCQlzZXRMYXVuY2hNb2RlU3RhdHVzKHVpUHJlZmVyZW5jZXMuZ2V0TGF1bmNoTW9kZSgpKTsKKwkJc2V0TGF1bmNoTW9kZTJTdGF0dXModWlQcmVmZXJlbmNlcy5nZXRMYXVuY2hNb2RlMigpKTsKKwkJc2V0QnJlYWtwb2ludHNTdGF0dXModWlQcmVmZXJlbmNlcy5nZXRFbmFibGVCcmVha3BvaW50cygpKTsKKwkJc2V0UmVzdGFydFN0YXR1cyh1aVByZWZlcmVuY2VzLmdldFJlc3RhcnQoKSk7CisJCQorCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7CisJCQorCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNhdmVFZGl0b3JHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlncm91cC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZTYXZlRWRpdG9ycyk7CisJCQorCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CisJCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlTdHJpbmdbXSBtZXNzYWdlcyA9IG5ldyBTdHJpbmdbXSB7CisJCQlNZXNzYWdlcy5wcmVmU2F2ZUVkaXRvcnNBbHdheXMsIE1lc3NhZ2VzLnByZWZTYXZlRWRpdG9yc05ldmVyLAorCQkJTWVzc2FnZXMucHJlZlNhdmVFZGl0b3JzUHJvbXB0CisJCX07CisJCQorCQlmaW5hbCBieXRlW10gb3B0aW9ucyA9IG5ldyBieXRlW10geworCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5TQVZFX0VESVRPUlNfQUxXQVlTLAorCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5TQVZFX0VESVRPUlNfTkVWRVIsCisJCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19QUk9NUFQKKwkJfTsKKwkJCisJCUJ1dHRvbltdIGJ1dHRvbnMgPSBuZXcgQnV0dG9uWzNdOworCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWJ1dHRvbnNbaV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOworCQkJYnV0dG9uc1tpXS5zZXRUZXh0KG1lc3NhZ2VzW2ldKTsKKwkJCWZpbmFsIGludCBiID0gaTsKKwkJCWJ1dHRvbnNbaV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQkJc2F2ZUVkaXRvcnMgPSBvcHRpb25zW2JdOworCQkJCX0KKwkJCX0pOworCQkJd2hzLnNldEhlbHAoYnV0dG9uc1tpXSwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfU0FWRV9FRElUT1JTKTsKKwkJfQorCQlzYXZlQnV0dG9ucyA9IGJ1dHRvbnM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U2F2ZUVkaXRvclN0YXR1cyhieXRlIHN0YXR1cykgeworCQlzYXZlRWRpdG9ycyA9IHN0YXR1czsKKwkJc2F2ZUJ1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHNhdmVFZGl0b3JzID09IFNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX0FMV0FZUyk7CisJCXNhdmVCdXR0b25zWzFdLnNldFNlbGVjdGlvbihzYXZlRWRpdG9ycyA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19ORVZFUik7CisJCXNhdmVCdXR0b25zWzJdLnNldFNlbGVjdGlvbihzYXZlRWRpdG9ycyA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19QUk9NUFQpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxhdW5jaE1vZGVHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlncm91cC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZMYXVuY2hNb2RlKTsKKwkJCisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKKwkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCVN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1tdIHsKKwkJCU1lc3NhZ2VzLnByZWZMYXVuY2hNb2RlUmVzdGFydCwgTWVzc2FnZXMucHJlZkxhdW5jaE1vZGVDb250aW51ZSwKKwkJCU1lc3NhZ2VzLnByZWZMYXVuY2hNb2RlUHJvbXB0CisJCX07CisJCQorCQlmaW5hbCBieXRlW10gb3B0aW9ucyA9IG5ldyBieXRlW10geworCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERV9SRVNUQVJULAorCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERV9DT05USU5VRSwKKwkJCVNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfUFJPTVBUCisJCX07CisJCQorCQlCdXR0b25bXSBidXR0b25zID0gbmV3IEJ1dHRvblszXTsKKwkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlidXR0b25zW2ldID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKKwkJCWJ1dHRvbnNbaV0uc2V0VGV4dChtZXNzYWdlc1tpXSk7CisJCQlmaW5hbCBpbnQgYiA9IGk7CisJCQlidXR0b25zW2ldLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJCWxhdW5jaE1vZGUgPSBvcHRpb25zW2JdOworCQkJCX0KKwkJCX0pOworCQkJd2hzLnNldEhlbHAoYnV0dG9uc1tpXSwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfTEFVTkNIX01PREUpOworCQl9CisJCWxhdW5jaE1vZGVCdXR0b25zID0gYnV0dG9uczsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYXVuY2hNb2RlU3RhdHVzKGludCBtb2RlKSB7CisJCWxhdW5jaE1vZGUgPSBtb2RlOworCQlsYXVuY2hNb2RlQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZSA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX1JFU1RBUlQpOworCQlsYXVuY2hNb2RlQnV0dG9uc1sxXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZSA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX0NPTlRJTlVFKTsKKwkJbGF1bmNoTW9kZUJ1dHRvbnNbMl0uc2V0U2VsZWN0aW9uKGxhdW5jaE1vZGUgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERV9QUk9NUFQpOyAKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMYXVuY2hNb2RlMkdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWdyb3VwLnNldFRleHQoTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUyKTsKKwkJCisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OworCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKKwkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCVN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1tdIHsKKwkJCU1lc3NhZ2VzLnByZWZMYXVuY2hNb2RlMlJlc3RhcnQsIE1lc3NhZ2VzLnByZWZMYXVuY2hNb2RlMkJyZWFrcG9pbnRzLAorCQkJTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUyQ29udGludWUsIE1lc3NhZ2VzLnByZWZMYXVuY2hNb2RlMlByb21wdAorCQl9OworCQkKKwkJZmluYWwgYnl0ZVtdIG9wdGlvbnMgPSBuZXcgYnl0ZVtdIHsKKwkJCVNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX1JFU1RBUlQsCisJCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9ESVNBQkxFX0JSRUFLUE9JTlRTLAorCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfQ09OVElOVUUsCisJCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9QUk9NUFQKKwkJfTsKKwkJCisJCUJ1dHRvbltdIGJ1dHRvbnMgPSBuZXcgQnV0dG9uWzRdOworCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCWJ1dHRvbnNbaV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOworCQkJYnV0dG9uc1tpXS5zZXRUZXh0KG1lc3NhZ2VzW2ldKTsKKwkJCWZpbmFsIGludCBiID0gaTsKKwkJCWJ1dHRvbnNbaV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQkJbGF1bmNoTW9kZTIgPSBvcHRpb25zW2JdOworCQkJCX0KKwkJCX0pOworCQkJd2hzLnNldEhlbHAoYnV0dG9uc1tpXSwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfTEFVTkNIX01PREVfREVCVUcpOworCQl9CisJCWxhdW5jaE1vZGUyQnV0dG9ucyA9IGJ1dHRvbnM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0TGF1bmNoTW9kZTJTdGF0dXMoaW50IG1vZGUpIHsKKwkJbGF1bmNoTW9kZTIgPSBtb2RlOworCQlsYXVuY2hNb2RlMkJ1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKGxhdW5jaE1vZGUyID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX1JFU1RBUlQpOworCQlsYXVuY2hNb2RlMkJ1dHRvbnNbMV0uc2V0U2VsZWN0aW9uKGxhdW5jaE1vZGUyID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX0RJU0FCTEVfQlJFQUtQT0lOVFMpOworCQlsYXVuY2hNb2RlMkJ1dHRvbnNbMl0uc2V0U2VsZWN0aW9uKGxhdW5jaE1vZGUyID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX0NPTlRJTlVFKTsKKwkJbGF1bmNoTW9kZTJCdXR0b25zWzNdLnNldFNlbGVjdGlvbihsYXVuY2hNb2RlMiA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9QUk9NUFQpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJyZWFrcG9pbnRzR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5wcmVmQnJlYWtwb2ludHMpOworCQkKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7CisJCWdyb3VwLnNldExheW91dChsYXlvdXQpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOworCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJU3RyaW5nW10gbWVzc2FnZXMgPSBuZXcgU3RyaW5nW10geworCQkJTWVzc2FnZXMucHJlZkJyZWFrcG9pbnRzQWx3YXlzLCBNZXNzYWdlcy5wcmVmQnJlYWtwb2ludHNOZXZlciwKKwkJCU1lc3NhZ2VzLnByZWZCcmVha3BvaW50c1Byb21wdAorCQl9OworCQkKKwkJZmluYWwgYnl0ZVtdIG9wdGlvbnMgPSBuZXcgYnl0ZVtdIHsKKwkJCVNlcnZlclVJUHJlZmVyZW5jZXMuRU5BQkxFX0JSRUFLUE9JTlRTX0FMV0FZUywKKwkJCVNlcnZlclVJUHJlZmVyZW5jZXMuRU5BQkxFX0JSRUFLUE9JTlRTX05FVkVSLAorCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfUFJPTVBUCisJCX07CisJCQorCQlCdXR0b25bXSBidXR0b25zID0gbmV3IEJ1dHRvblszXTsKKwkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlidXR0b25zW2ldID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKKwkJCWJ1dHRvbnNbaV0uc2V0VGV4dChtZXNzYWdlc1tpXSk7CisJCQlmaW5hbCBpbnQgYiA9IGk7CisJCQlidXR0b25zW2ldLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJCWJyZWFrcG9pbnRFbmFibGVtZW50ID0gb3B0aW9uc1tiXTsKKwkJCQl9CisJCQl9KTsKKwkJCXdocy5zZXRIZWxwKGJ1dHRvbnNbaV0sIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX0VOQUJMRV9CUkVBS1BPSU5UUyk7CisJCX0KKwkJYnJlYWtwb2ludEJ1dHRvbnMgPSBidXR0b25zOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldEJyZWFrcG9pbnRzU3RhdHVzKGludCBtb2RlKSB7CisJCWJyZWFrcG9pbnRFbmFibGVtZW50ID0gbW9kZTsKKwkJYnJlYWtwb2ludEJ1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKGJyZWFrcG9pbnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuRU5BQkxFX0JSRUFLUE9JTlRTX0FMV0FZUyk7CisJCWJyZWFrcG9pbnRCdXR0b25zWzFdLnNldFNlbGVjdGlvbihicmVha3BvaW50RW5hYmxlbWVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19ORVZFUik7CisJCWJyZWFrcG9pbnRCdXR0b25zWzJdLnNldFNlbGVjdGlvbihicmVha3BvaW50RW5hYmxlbWVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19QUk9NUFQpOyAKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXN0YXJ0R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5wcmVmUmVzdGFydCk7CisJCQorCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CisJCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlTdHJpbmdbXSBtZXNzYWdlcyA9IG5ldyBTdHJpbmdbXSB7CisJCQlNZXNzYWdlcy5wcmVmUmVzdGFydEFsd2F5cywgTWVzc2FnZXMucHJlZlJlc3RhcnROZXZlciwgTWVzc2FnZXMucHJlZlJlc3RhcnRQcm9tcHQKKwkJfTsKKwkJCisJCWZpbmFsIGJ5dGVbXSBvcHRpb25zID0gbmV3IGJ5dGVbXSB7CisJCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfQUxXQVlTLAorCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5SRVNUQVJUX05FVkVSLAorCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5SRVNUQVJUX1BST01QVAorCQl9OworCQkKKwkJQnV0dG9uW10gYnV0dG9ucyA9IG5ldyBCdXR0b25bM107CisJCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCQkJYnV0dG9uc1tpXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7CisJCQlidXR0b25zW2ldLnNldFRleHQobWVzc2FnZXNbaV0pOworCQkJZmluYWwgaW50IGIgPSBpOworCQkJYnV0dG9uc1tpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCQlyZXN0YXJ0RW5hYmxlbWVudCA9IG9wdGlvbnNbYl07CisJCQkJfQorCQkJfSk7CisJCQl3aHMuc2V0SGVscChidXR0b25zW2ldLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9SRVNUQVJUKTsKKwkJfQorCQlyZXN0YXJ0QnV0dG9ucyA9IGJ1dHRvbnM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVzdGFydFN0YXR1cyhpbnQgbW9kZSkgeworCQlyZXN0YXJ0RW5hYmxlbWVudCA9IG1vZGU7CisJCXJlc3RhcnRCdXR0b25zWzBdLnNldFNlbGVjdGlvbihyZXN0YXJ0RW5hYmxlbWVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfQUxXQVlTKTsKKwkJcmVzdGFydEJ1dHRvbnNbMV0uc2V0U2VsZWN0aW9uKHJlc3RhcnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9ORVZFUik7CisJCXJlc3RhcnRCdXR0b25zWzJdLnNldFNlbGVjdGlvbihyZXN0YXJ0RW5hYmxlbWVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfUFJPTVBUKTsgCisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgdXNpbmcgdGhlIHBhc3NlZCB3b3JrYmVuY2guCisJICoKKwkgKiBAcGFyYW0gd29ya2JlbmNoIHRoZSBjdXJyZW50IHdvcmtiZW5jaAorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIFBlcmZvcm1zIHNwZWNpYWwgcHJvY2Vzc2luZyB3aGVuIHRoaXMgcGFnZSdzIERlZmF1bHRzIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKKwkJcHVibGlzaEJlZm9yZVN0YXJ0LnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5pc0RlZmF1bHRBdXRvUHVibGlzaGluZygpKTsKKwkJCisJCXNldFNhdmVFZGl0b3JTdGF0dXModWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0U2F2ZUVkaXRvcnMoKSk7CisJCXNldExhdW5jaE1vZGVTdGF0dXModWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0TGF1bmNoTW9kZSgpKTsKKwkJc2V0TGF1bmNoTW9kZTJTdGF0dXModWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0TGF1bmNoTW9kZTIoKSk7CisJCXNldEJyZWFrcG9pbnRzU3RhdHVzKHVpUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEVuYWJsZUJyZWFrcG9pbnRzKCkpOworCQlzZXRSZXN0YXJ0U3RhdHVzKHVpUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdFJlc3RhcnQoKSk7CisJCQorCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCisJICovCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgeworCQlwcmVmZXJlbmNlcy5zZXRBdXRvUHVibGlzaGluZyhwdWJsaXNoQmVmb3JlU3RhcnQuZ2V0U2VsZWN0aW9uKCkpOworCQl1aVByZWZlcmVuY2VzLnNldFNhdmVFZGl0b3JzKHNhdmVFZGl0b3JzKTsKKwkJdWlQcmVmZXJlbmNlcy5zZXRMYXVuY2hNb2RlKGxhdW5jaE1vZGUpOworCQl1aVByZWZlcmVuY2VzLnNldExhdW5jaE1vZGUyKGxhdW5jaE1vZGUyKTsKKwkJdWlQcmVmZXJlbmNlcy5zZXRFbmFibGVCcmVha3BvaW50cyhicmVha3BvaW50RW5hYmxlbWVudCk7CisJCXVpUHJlZmVyZW5jZXMuc2V0UmVzdGFydChyZXN0YXJ0RW5hYmxlbWVudCk7CisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NWEwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjI7CisKK3B1YmxpYyBjbGFzcyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyIHsKKwlwdWJsaWMgYm9vbGVhbiBoYXNSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgeworCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10geyBuZXcgUnVudGltZU1hcmtlclJlc29sdXRpb24oKSB9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWYyZjdhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworLyoqCisgKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JEZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQWRkRGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JWZXJzaW9uTGV2ZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZGluZ1Rhc2s7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlU2VydmVyUHJvamVjdERpYWxvZ01lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFNlcnZlclByb2plY3ROYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1pbmF0ZVNlcnZlckRpYWxvZ01lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW9uaXRvclBvcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nTWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVTZXJ2ZXJEaWFsb2dNZXNzYWdlTWFueTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVTZXJ2ZXJEaWFsb2dMb29zZUNvbmZpZ3VyYXRpb25zOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nUnVubmluZ1NlcnZlclN0b3A7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyVGFzazsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90Q3JlYXRlU2VydmVyUHJvamVjdFN0YXR1czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdUYXNrOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclNhdmVFcnJvckRpYWxvZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JTYXZlRXJyb3JNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlYWRPbmx5RmlsZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JFZGl0b3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yVW5kb0Rpc2FibGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclVuZG9FbmFibGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlZG9EaXNhYmxlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWRvRW5hYmxlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZURlbGV0ZVRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlc291cmNlRGVsZXRlU2VydmVyTWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZURlbGV0ZVNhdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VEaXJ0eURpYWxvZ01lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6U2VsZWN0Q2xpZW50VGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6U2VsZWN0Q2xpZW50RGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VEaXJ0eURpYWxvZ1RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlRGlydHlEaWFsb2dDb250aW51ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdSdW50aW1lV2l6YXJkVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTGF1bmNoRGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTGF1bmNoU2VydmVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaEhvc3Q7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTGF1bmNoUnVudGltZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vU2VydmVyU2VsZWN0ZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTZXJ2ZXJBbHJlYWR5UnVubmluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckludmFsaWRTZXJ2ZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBydW5PblNlcnZlckxhdW5jaENvbmZpZ05hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6U2VsZWN0Q2xpZW50TWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90Q3JlYXRlU2VydmVyUHJvamVjdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ1RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclZhbGlkYXRlRWRpdEZhaWx1cmVNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZQcm9qZWN0Tm90TW9kdWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZQcm9qZWN0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZQcm9qZWN0RGVmYXVsdFNlcnZlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdE5vdENvbmZpZ3VyZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlByb2plY3ROb1NlcnZlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wU2VydmVySW5mb05hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvcFNlcnZlckluZm9UeXBlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3BTZXJ2ZXJJbmZvVmVuZG9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUaXBFbmFibGVGb2N1czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVGlwRGlzYWJsZUZvY3VzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ291bGROb3RTYXZlUHJlZmVyZW5jZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlUnVudGltZXNEZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1J1bnRpbWVTZWFyY2hNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1J1bnRpbWVTZWFyY2hUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSdW50aW1lU2VhcmNoUHJvZ3Jlc3M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgaW5mb05vUnVudGltZXNGb3VuZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpFZGl0UnVudGltZVdpemFyZFRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VSdW50aW1lc1RhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1J1bnRpbWVJblVzZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSdW50aW1lRGVsZXRlU2VydmVyczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSdW50aW1lUmVtb3ZlVGFyZ2V0czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0RGlhbG9nVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZVJ1bnRpbWVzVGl0bGVMb25nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZBdXRvUHVibGlzaDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmTGF1bmNoTW9kZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmTGF1bmNoTW9kZVJlc3RhcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGVDb250aW51ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmTGF1bmNoTW9kZVByb21wdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmTGF1bmNoTW9kZTI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGUyUmVzdGFydDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmTGF1bmNoTW9kZTJDb250aW51ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmTGF1bmNoTW9kZTJCcmVha3BvaW50czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmTGF1bmNoTW9kZTJQcm9tcHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkJyZWFrcG9pbnRzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZCcmVha3BvaW50c0Fsd2F5czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmQnJlYWtwb2ludHNOZXZlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmQnJlYWtwb2ludHNQcm9tcHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlJlc3RhcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlJlc3RhcnRBbHdheXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlJlc3RhcnROZXZlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUmVzdGFydFByb21wdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmU2hvd09uQWN0aXZpdHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNhdmVFZGl0b3JzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZTYXZlRWRpdG9yc0Fsd2F5czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmU2F2ZUVkaXRvcnNOZXZlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmU2F2ZUVkaXRvcnNQcm9tcHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTmV3OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk5ld1NlcnZlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9wZXJ0aWVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk9wZW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU2hvd0luOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkNvcHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUGFzdGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uRGVidWdUb29sVGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkRlYnVnOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkRlYnVnUmVzdGFydDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25EZWJ1Z1Jlc3RhcnRUb29sVGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0YXJ0VG9vbFRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdGFydDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlVG9vbFRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblByb2ZpbGVSZXN0YXJ0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblByb2ZpbGVSZXN0YXJ0VG9vbFRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25SZXN0YXJ0VG9vbFRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25SZXN0YXJ0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblB1Ymxpc2hUb29sVGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblB1Ymxpc2g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHVibGlzaENsZWFuVG9vbFRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25QdWJsaXNoQ2xlYW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUmVuYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkRlbGV0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25SZW1vdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUmVtb3ZlTW9kdWxlQ29uZmlybTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtaW5hdGVTZXJ2ZXJEaWFsb2dUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25EZWJ1Z09uU2VydmVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblByb2ZpbGVPblNlcnZlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25SdW5PblNlcnZlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzTmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdG9wTW9kdWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0YXJ0TW9kdWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblJlc3RhcnRNb2R1bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU3dpdGNoU2VydmVyTG9jYXRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoU2VydmVyTG9jYXRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoU2VydmVyTG9jYXRpb25NZXRhZGF0YTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dBZGRSZW1vdmVNb2R1bGVzTm9uZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TZXROZXdTZXJ2ZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb0FydGlmYWN0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9Nb2R1bGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTGF1bmNoQ29uZmlnOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vZGVXYXJuaW5nUnVuOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vZGVXYXJuaW5nRGVidWc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9kZVdhcm5pbmdQcm9maWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vZGVXYXJuaW5nUmVzdGFydDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ0JyZWFrcG9pbnRzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vZGVXYXJuaW5nQ29udGludWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nQnJlYWtwb2ludHM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nQnJlYWtwb2ludHNSZWVuYWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dCcmVha3BvaW50c0NvbnRpbnVlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1JlbWVtYmVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1Jlc3RhcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUmVzdGFydFJlc3RhcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUmVzdGFydENvbnRpbnVlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1B1Ymxpc2hDbGVhbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vU2VydmVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUm9vdE1vZHVsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBob3N0bmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVEZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUF2YWlsYWJsZUxpc3Q7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlRGVwbG95ZWRMaXN0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUFkZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVSZW1vdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlQWRkQWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZVJlbW92ZUFsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVSZXF1aXJlZE1vZHVsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVSZXF1aXJlZE1vZHVsZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlUHVibGlzaEltbWVkaWF0ZWx5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelRhc2tUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpUYXNrRGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RXJyb3JJbnZhbGlkRm9sZGVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpekVycm9yQ2xvc2VkUHJvamVjdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVTZXJ2ZXJQcm9qZWN0RGlhbG9nVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyRGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyUnVuT25TZXJ2ZXJEZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJTZWxlY3Q7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyTWFudWFsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdFNlcnZlclByZWZlcnJlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJFeGlzdGluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJSdW50aW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlclJ1bnRpbWVDcmVhdGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RXJyb3JTZXJ2ZXJDcmVhdGlvbkVycm9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelJ1bk9uU2VydmVyVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RGVidWdPblNlcnZlclRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelByb2ZpbGVPblNlcnZlclRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUFydGlmYWN0c0Rlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUFydGlmYWN0c0F2YWlsYWJsZUxpc3Q7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlQXJ0aWZhY3RzTm9TZWxlY3Rpb25FcnJvcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdSdW50aW1lVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3UnVudGltZURlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1J1bnRpbWVDcmVhdGVTZXJ2ZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcGVyZm9ybWluZ1Rhc2tzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZVdpemFyZFRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlcldpemFyZFRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdENsaWVudFdpemFyZFRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelRhc2tXaXphcmRUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvck1vbml0b3JQb3J0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb2x1bW5TdGF0dXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbHVtblR5cGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbHVtblBvcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbHVtbk1vbml0b3JQb3J0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb2x1bW5Db250ZW50VHlwZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29udGVudFR5cGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlQWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29udGVudFR5cGVXZWJTZXJ2aWNlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yTm9uZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFydDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0ZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcHBlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5OYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtblR5cGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVDb21wVHJlZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmVSdW50aW1lczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRSdW50aW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlclNlbGVjdEV4aXN0aW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRVbmtub3duTmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJUeXBlQ29tcExhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlck5hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTmFtZURlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1NlcnZlcnM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld05vTW9kdWxlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U2VydmVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0b3BUb29sVGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0b3A7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW9kaWZ5TW9kdWxlc1Rvb2xUaXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW9kaWZ5TW9kdWxlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Nb25pdG9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdJbml0aWFsaXppbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNPa2F5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUmVzdGFydDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1B1Ymxpc2g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNSZXN0YXJ0UHVibGlzaDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1B1Ymxpc2hpbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNPa2F5MjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1Jlc3RhcnQyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUHVibGlzaDI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNSZXN0YXJ0UHVibGlzaDI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNQdWJsaXNoaW5nMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JTZXJ2ZXJFZGl0b3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUHJvbXB0SXJyZXZlcnNpYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlbmFtZUZpbGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRWRpdG9yQ2FudFNhdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEdXBsaWNhdGVOYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlYWRPbmx5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcldyaXRhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlc291cmNlTW9kaWZpZWRUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWFkT25seU1lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yU2VydmVyTW9kaWZpZWRNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlc291cmNlV2FyblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlc291cmNlV2Fybk1lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdHZW5lcmFsU2VjdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld0dlbmVyYWxEZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJIb3N0bmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lRWRpdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25QYXRoOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25Ccm93c2VNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaFNlY3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdQdWJsaXNoRGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaERpc2FibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWRJbnRlcnZhbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hDb21tYW5kOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dFNlY3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdUaW1lb3V0RGVzY3JpcHRpb247CQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dENvbW1hbmQ7CQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaGVyczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1N0YXJ0VGltZW91dDsJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTdG9wVGltZW91dDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWVDb21tYW5kOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZUNvbW1hbmQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdPcGVuTGF1bmNoQ29uZmlndXJhdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdDb25maWd1cmF0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGluZzQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0ZWQyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGluZzQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0b3BwZWQyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGluZzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0aW5nMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RhcnRpbmczOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGluZzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0b3BwaW5nMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RvcHBpbmczOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGVkRGVidWc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0ZWRQcm9maWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0b3BUb29sVGlwMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdG9wMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBsYXVuY2hpbmdDbGllbnRUYXNrOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld0luc3RhbGxhYmxlU2VydmVyVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJEZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdJbnN0YWxsYWJsZVNlcnZlck1lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJDb25maXJtOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld0luc3RhbGxhYmxlU2VydmVySm9iOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld0luc3RhbGxhYmxlU2VydmVyUmVzdGFydDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdJbnN0YWxsYWJsZVNlcnZlclNpdGVFcnJvcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsYWJsZVNlcnZlckNvbXBUcmVlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxhYmxlU2VydmVyTGluazsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsYWJsZVNlcnZlckxvY2FsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxhYmxlU2VydmVyU2VhcmNoaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpekxpY2Vuc2VUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpMaWNlbnNlRGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TGljZW5zZUFjY2VwdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpMaWNlbnNlRGVjbGluZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpMaWNlbnNlTm9uZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBqb2JJbml0aWFsaXppbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgam9iUmVzdGFydGluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGllbnREZWZhdWx0TmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGllbnREZWZhdWx0RGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kdWxlRGVjb3JhdG9yUHJvamVjdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBtaW51dGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZHVsZXM7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0YXJ0aW5nTW9uaXRvcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZTZWxlY3RGaWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZkVuYWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZWb2x1bWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmU291bmRzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZlNvdW5kOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZkZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmUGxheTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZCcm93c2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmUmVzZXQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9Vbmtub3duOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvTm9uZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb0RlZmF1bHQ7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRlcm5hbFdlYkJyb3dzZXJOYW1lOworCisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGI5MmJhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDUwNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyAtLS0tLS0tLS0tLS0tLS0gV2l6YXJkcyAtLS0tLS0tLS0tLS0tLS0KKyMgKElmIHRoZSBmaXJzdCB0d28gbGluZXMgaW4gYSBncm91cCBkbyBub3Qgc3RhcnQgd2l0aCAid2l6IiwgaXQgaXMgYmVjYXVzZQorIyB0aG9zZSBsaW5lcyBhcmUgZGlzcGxheWVkIGluIHRoZSB3b3JrYmVuY2ggIk5ldyIgd2l6YXJkLiBUaGUgcmVzdCBvZiB0aGUKKyMgdGV4dCBpcyBkaXNwbGF5ZWQgaW4gZWFjaCBhY3R1YWwgd2l6YXJkKQorCisjIE5ldyBTZXJ2ZXIgKGFuZCBDb25maWd1cmF0aW9uKSBXaXphcmQKK3dpek5ld1NlcnZlcldpemFyZFRpdGxlPU5ldyBTZXJ2ZXIKK3dpek5ld1NlcnZlclRpdGxlPURlZmluZSBhIE5ldyBTZXJ2ZXIKK3dpek5ld1NlcnZlckRlc2NyaXB0aW9uPUNob29zZSB0aGUgdHlwZSBvZiBzZXJ2ZXIgdG8gY3JlYXRlCit3aXpOZXdTZXJ2ZXJSdW5PblNlcnZlckRlc2NyaXB0aW9uPVNlbGVjdCB3aGljaCBzZXJ2ZXIgdG8gdXNlCit3aXpOZXdTZXJ2ZXJSdW50aW1lPVNlcnZlciAmcnVudGltZSBlbnZpcm9ubWVudDoKK3dpek5ld1NlcnZlclJ1bnRpbWVDcmVhdGU9Q3JlYXRlIGEgbmV3IHJ1bnRpbWUgZW52aXJvbm1lbnQKKword2l6TmV3U2VydmVyU2VsZWN0PUhvdyBkbyB5b3Ugd2FudCB0byBzZWxlY3QgdGhlIHNlcnZlcj8KK3dpek5ld1NlcnZlckV4aXN0aW5nPUNob29zZSBhbiBlJnhpc3Rpbmcgc2VydmVyCit3aXpOZXdTZXJ2ZXJNYW51YWw9Jk1hbnVhbGx5IGRlZmluZSBhIG5ldyBzZXJ2ZXIKK3dpek5ld1NlcnZlclNlbGVjdEV4aXN0aW5nPVNlbGVjdCB0aGUgc2VydmVyIHRoYXQgeW91IHdhbnQgdG8gdXNlOgorCisjIFNlbGVjdCBTZXJ2ZXIgd2l6YXJkCit3aXpSdW5PblNlcnZlclRpdGxlPVJ1biBPbiBTZXJ2ZXIKK3dpekRlYnVnT25TZXJ2ZXJUaXRsZT1EZWJ1ZyBPbiBTZXJ2ZXIKK3dpelByb2ZpbGVPblNlcnZlclRpdGxlPVByb2ZpbGUgT24gU2VydmVyCit3aXpTZWxlY3RTZXJ2ZXJQcmVmZXJyZWQ9QWx3YXlzIHVzZSB0aGlzIHNlcnZlciB3aGVuIHJ1bm5pbmcgdGhpcyAmcHJvamVjdAorCisjIFNlbGVjdCBTZXJ2ZXIgQ2xpZW50IFdpemFyZAord2l6U2VsZWN0Q2xpZW50V2l6YXJkVGl0bGU9U2VsZWN0IGEgU2VydmVyIENsaWVudAord2l6U2VsZWN0Q2xpZW50VGl0bGU9U2VsZWN0IGEgc2VydmVyIGNsaWVudAord2l6U2VsZWN0Q2xpZW50RGVzY3JpcHRpb249U2VsZWN0IGEgY2xpZW50IHRvIHVzZSB3aXRoIHRoaXMgc2VydmVyLgord2l6U2VsZWN0Q2xpZW50TWVzc2FnZT1NdWx0aXBsZSBjbGllbnRzIGNhbiBydW4gb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBTZWxlY3QgYSBjbGllbnQgZnJvbSB0aGUgbGlzdCBiZWxvdzoKKworIyBTZWxlY3QgTW9kdWxlQXJ0aWZhY3QgV2l6YXJkCit3aXpNb2R1bGVBcnRpZmFjdHNEZXNjcmlwdGlvbj1TcGVjaWZ5IGhvdyB0byBzdGFydCB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UuCit3aXpNb2R1bGVBcnRpZmFjdHNBdmFpbGFibGVMaXN0PUF2YWlsYWJsZSBsYXVuY2hlcnM6Cit3aXpNb2R1bGVBcnRpZmFjdHNOb1NlbGVjdGlvbkVycm9yPVlvdSBtdXN0IHNlbGVjdCBhIGxhdW5jaGVyLgorCisjIFRhc2sgV2l6YXJkCit3aXpUYXNrV2l6YXJkVGl0bGU9U2VsZWN0IFRhc2tzCit3aXpUYXNrVGl0bGU9U2VsZWN0IFRhc2tzCit3aXpUYXNrRGVzY3JpcHRpb249U2VsZWN0IHRoZSB0YXNrcyB0byBwZXJmb3JtIG9uIHRoZSBzZXJ2ZXIuCisKKyMgTmV3IFJ1bnRpbWUgV2l6YXJkCit3aXpOZXdSdW50aW1lV2l6YXJkVGl0bGU9TmV3IFNlcnZlciBSdW50aW1lIEVudmlyb25tZW50Cit3aXpOZXdSdW50aW1lVGl0bGU9TmV3IFNlcnZlciBSdW50aW1lIEVudmlyb25tZW50Cit3aXpOZXdSdW50aW1lRGVzY3JpcHRpb249RGVmaW5lIGEgbmV3IHNlcnZlciBydW50aW1lIGVudmlyb25tZW50Cit3aXpOZXdSdW50aW1lQ3JlYXRlU2VydmVyPSZDcmVhdGUgYSBuZXcgbG9jYWwgc2VydmVyCit3aXpFZGl0UnVudGltZVdpemFyZFRpdGxlPUVkaXQgU2VydmVyIFJ1bnRpbWUgRW52aXJvbm1lbnQKKworIyBOZXcgU2VydmVyIEFkYXB0ZXIgV2l6YXJkCit3aXpOZXdJbnN0YWxsYWJsZVNlcnZlclRpdGxlPUluc3RhbGwgTmV3IFNlcnZlciBBZGFwdGVyCit3aXpOZXdJbnN0YWxsYWJsZVNlcnZlckRlc2NyaXB0aW9uPURvd25sb2FkIGFuZCBpbnN0YWxsIHN1cHBvcnQgZm9yIGEgbmV3IHNlcnZlcgord2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJNZXNzYWdlPVRoZSBmb2xsb3dpbmcgc2VydmVyIGFkYXB0ZXJzIGhhdmUgYmVlbiBmb3VuZCBvbiByZW1vdGUgdXBkYXRlIG1hbmFnZXIgc2l0ZXMuIFNlbGVjdCBhIHNlcnZlciBhZGFwdGVyIHRvIGRvd25sb2FkIGFuZCBpbnN0YWxsLgord2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJDb25maXJtPVN1cHBvcnQgZm9yIHswfSB3aWxsIG5vdyBiZSBkb3dubG9hZGVkIGFuZCBpbnN0YWxsZWQuIFlvdSB3aWxsIGJlIHByb21wdGVkIHRvIHJlc3RhcnQgb25jZSB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlLgord2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJKb2I9SW5zdGFsbGluZyB7MH0KK3dpek5ld0luc3RhbGxhYmxlU2VydmVyUmVzdGFydD1JbnN0YWxsYXRpb24gY29tcGxldGUuIFRoZSBuZXcgc2VydmVyIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgd29ya2JlbmNoIGlzIHJlc3RhcnRlZC4gRG8geW91IHdhbnQgdG8gcmVzdGFydCBub3c/Cit3aXpOZXdJbnN0YWxsYWJsZVNlcnZlclNpdGVFcnJvcj1Db3VsZCBub3QgY29ubmVjdCB0byB7MH0KKworIyBMaWNlbnNlIHdpemFyZAord2l6TGljZW5zZVRpdGxlPUZlYXR1cmUgTGljZW5zZQord2l6TGljZW5zZURlc2NyaXB0aW9uPVRoaXMgbGljZW5zZSBtdXN0IGJlIGFjY2VwdGVkIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggdGhlIGluc3RhbGxhdGlvbi4KK3dpekxpY2Vuc2VBY2NlcHQ9SSAmYWNjZXB0IHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBhZ3JlZW1lbnQKK3dpekxpY2Vuc2VEZWNsaW5lPUkgJmRvIG5vdCBhY2NlcHQgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGFncmVlbWVudAord2l6TGljZW5zZU5vbmU9RmVhdHVyZSBkb2VzIG5vdCBjb250YWluIGEgbGljZW5zZS4KKworIyBBZGQvUmVtb3ZlIE1vZHVsZXMKK3dpek1vZHVsZVdpemFyZFRpdGxlPUFkZCBhbmQgUmVtb3ZlIFByb2plY3RzCit3aXpNb2R1bGVUaXRsZT1BZGQgYW5kIFJlbW92ZSBQcm9qZWN0cword2l6TW9kdWxlRGVzY3JpcHRpb249TW9kaWZ5IHRoZSBwcm9qZWN0cyB0aGF0IGFyZSBjb25maWd1cmVkIG9uIHRoZSBzZXJ2ZXIKK3dpek1vZHVsZU1lc3NhZ2U9TW92ZSBwcm9qZWN0cyB0byB0aGUgcmlnaHQgdG8gY29uZmlndXJlIHRoZW0gb24gdGhlIHNlcnZlcgord2l6TW9kdWxlQXZhaWxhYmxlTGlzdD0mQXZhaWxhYmxlIHByb2plY3RzOgord2l6TW9kdWxlRGVwbG95ZWRMaXN0PSZDb25maWd1cmVkIHByb2plY3RzOgord2l6TW9kdWxlQWRkPUEmZGQgPgord2l6TW9kdWxlQWRkQWxsPUFkZCBBJmxsID4+Cit3aXpNb2R1bGVSZW1vdmU9PCAmUmVtb3ZlCit3aXpNb2R1bGVSZW1vdmVBbGw9PDwgUmUmbW92ZSBBbGwKK3dpek1vZHVsZVJlcXVpcmVkTW9kdWxlPXswfSBpcyByZXF1aXJlZCBhbmQgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VydmVyCit3aXpNb2R1bGVSZXF1aXJlZE1vZHVsZXM9T25lIG9mIHRoZSByZXF1aXJlZCBtb2R1bGVzICh7MH0pIG11c3QgYmUgYWRkZWQgdG8gdGhlIHNlcnZlcgord2l6TW9kdWxlUHVibGlzaEltbWVkaWF0ZWx5PUlmIHNlcnZlciBpcyBzdGFydGVkLCBwdWJsaXNoIGNoYW5nZXMgJmltbWVkaWF0ZWx5CisKKyMgV2l6YXJkIGluZm8gYW5kIGVycm9yIG1lc3NhZ2VzCit3aXpFcnJvckludmFsaWRGb2xkZXI9VGhlIGZvbGRlciBtdXN0IGJlIGEgc2VydmVyIHByb2plY3Qgb3IgYSBmb2xkZXIgd2l0aGluIGEgc2VydmVyIHByb2plY3QKK3dpekVycm9yQ2xvc2VkUHJvamVjdD1UaGUgZm9sZGVyIG11c3Qgbm90IGJlIGluIGEgY2xvc2VkIHByb2plY3QKK3dpekVycm9yU2VydmVyQ3JlYXRpb25FcnJvcj1DYW5ub3QgY3JlYXRlIGEgc2VydmVyIHVzaW5nIHRoZSBzZWxlY3RlZCB0eXBlCisKKworIyAtLS0tLS0tLS0tLS0tLS0gVmlld3MgLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tIFNlcnZlciBDb25maWd1cmF0aW9uIHZpZXcgLS0tCit2aWV3U2VydmVycz1TZXJ2ZXJzCisKK3ZpZXdOb01vZHVsZXM9Tm90aGluZyBkZXBsb3llZAorCisjIEFjdGlvbnMKK2FjdGlvbkRlbGV0ZT1EZWxldGUKK2FjdGlvblJlbW92ZT1SZW1vdmUKK2FjdGlvbk9wZW49T3BlbgorYWN0aW9uU2hvd0luPVNob3cgSW4KK2FjdGlvbkNvcHk9Q29weQorYWN0aW9uUGFzdGU9UGFzdGUKK2FjdGlvbk1vbml0b3I9TW9uaXRvcmluJmcKK2FjdGlvbk1vbml0b3JQb3J0PU1vbml0b3IgcG9ydCB7MH0gKHsxfSkKK2FjdGlvblByb3BlcnRpZXM9UHJvcGVydGllcworYWN0aW9uTmV3PU5lJncKK2FjdGlvbk5ld1NlcnZlcj1TZXJ2ZXIKKworIyAtLS0gU2VydmVycyB2aWV3IC0tLQordmlld0luaXRpYWxpemluZz1Jbml0aWFsaXppbmcuLi4KKworIyBDb2x1bW4gdGl0bGVzCit2aWV3U2VydmVyPVNlcnZlcgordmlld1N0YXR1cz1TdGF0dXMKK3ZpZXdTdGF0ZT1TdGF0ZQorCisjIEFjdGlvbnMKK2FjdGlvblN0YXJ0PSZTdGFydAorYWN0aW9uU3RhcnRUb29sVGlwPVN0YXJ0IHRoZSBzZXJ2ZXIKK2FjdGlvbkRlYnVnPSZEZWJ1ZworYWN0aW9uRGVidWdUb29sVGlwPVN0YXJ0IHRoZSBzZXJ2ZXIgaW4gZGVidWcgbW9kZQorYWN0aW9uRGVidWdSZXN0YXJ0PVJlc3RhcnQgaW4gRGVidWcKK2FjdGlvbkRlYnVnUmVzdGFydFRvb2xUaXA9UmVzdGFydCB0aGUgc2VydmVyIGluIGRlYnVnIG1vZGUKK2FjdGlvblByb2ZpbGU9UHJvJmZpbGUKK2FjdGlvblByb2ZpbGVUb29sVGlwPVN0YXJ0IHRoZSBzZXJ2ZXIgaW4gcHJvZmlsaW5nIG1vZGUKK2FjdGlvblByb2ZpbGVSZXN0YXJ0PVJlc3RhcnQgaW4gUHJvZmlsZQorYWN0aW9uUHJvZmlsZVJlc3RhcnRUb29sVGlwPVJlc3RhcnQgdGhlIHNlcnZlciBpbiBwcm9maWxpbmcgbW9kZQorYWN0aW9uU3RvcD1TJnRvcAorYWN0aW9uU3RvcFRvb2xUaXA9U3RvcCB0aGUgc2VydmVyCithY3Rpb25SZXN0YXJ0PSZSZXN0YXJ0CithY3Rpb25SZXN0YXJ0VG9vbFRpcD1SZXN0YXJ0IHRoZSBzZXJ2ZXIKK2FjdGlvblB1Ymxpc2g9UHVibGlzaAorYWN0aW9uUHVibGlzaFRvb2xUaXA9UHVibGlzaCB0byB0aGUgc2VydmVyCithY3Rpb25QdWJsaXNoQ2xlYW49JkNsZWFuLi4uCithY3Rpb25QdWJsaXNoQ2xlYW5Ub29sVGlwPUNsZWFuIHByb2plY3RzIG9uIHRoZSBzZXJ2ZXIKK2FjdGlvbk1vZGlmeU1vZHVsZXM9QWRkIGFuZCBSZW1vdmUgJlByb2plY3RzLi4uCithY3Rpb25Nb2RpZnlNb2R1bGVzVG9vbFRpcD1BZGQgYW5kIHJlbW92ZSBwcm9qZWN0cworYWN0aW9uUmVzdGFydE1vZHVsZT0mUmVzdGFydAorYWN0aW9uU3RhcnRNb2R1bGU9JlN0YXJ0CithY3Rpb25TdG9wTW9kdWxlPVMmdG9wCithY3Rpb25Td2l0Y2hTZXJ2ZXJMb2NhdGlvbj1Td2l0Y2ggTG9jYXRpb24KK3N3aXRjaFNlcnZlckxvY2F0aW9uPUxvY2F0aW9uOgorc3dpdGNoU2VydmVyTG9jYXRpb25NZXRhZGF0YT1bd29ya3NwYWNlIG1ldGFkYXRhXQorYWN0aW9uUmVuYW1lPVJlJm5hbWUKKworIyBTdGF0dXMgY29sdW1uIHRleHQKK3ZpZXdTdGF0dXNTdGFydGVkPVN0YXJ0ZWQKK3ZpZXdTdGF0dXNTdGFydGVkRGVidWc9RGVidWdnaW5nCit2aWV3U3RhdHVzU3RhcnRlZFByb2ZpbGU9UHJvZmlsaW5nCit2aWV3U3RhdHVzU3RvcHBlZD1TdG9wcGVkCisKK3ZpZXdTdGF0dXNTdGFydGluZzE9U3RhcnRpbmcuCit2aWV3U3RhdHVzU3RhcnRpbmcyPVN0YXJ0aW5nLi4KK3ZpZXdTdGF0dXNTdGFydGluZzM9U3RhcnRpbmcuLi4KKwordmlld1N0YXR1c1N0b3BwaW5nMT1TdG9wcGluZy4KK3ZpZXdTdGF0dXNTdG9wcGluZzI9U3RvcHBpbmcuLgordmlld1N0YXR1c1N0b3BwaW5nMz1TdG9wcGluZy4uLgorCisjIFNlcnZlciBTdGF0ZSB0ZXh0Cit2aWV3U3luY09rYXk9U3luY2hyb25pemVkCit2aWV3U3luY1Jlc3RhcnQ9UmVzdGFydAordmlld1N5bmNQdWJsaXNoPVJlcHVibGlzaAordmlld1N5bmNSZXN0YXJ0UHVibGlzaD1SZXN0YXJ0ICYgcmVwdWJsaXNoCit2aWV3U3luY1B1Ymxpc2hpbmc9UHVibGlzaGluZy4uLgorCisjIC0tLSBzZXQgMiAtLS0KKyMgQWN0aW9ucworYWN0aW9uU3RvcDI9RGlzY29ubmVjdAorYWN0aW9uU3RvcFRvb2xUaXAyPURpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmVyCisKKyMgU3RhdHVzIGNvbHVtbiB0ZXh0Cit2aWV3U3RhdHVzU3RhcnRpbmc0PUNvbm5lY3RpbmcKK3ZpZXdTdGF0dXNTdGFydGVkMj1Db25uZWN0ZWQKK3ZpZXdTdGF0dXNTdG9wcGluZzQ9RGlzY29ubmVjdGluZwordmlld1N0YXR1c1N0b3BwZWQyPURpc2Nvbm5lY3RlZAorCisjIFNlcnZlciBTdGF0ZSB0ZXh0Cit2aWV3U3luY09rYXkyPVN5bmNocm9uaXplZAordmlld1N5bmNSZXN0YXJ0Mj1SZWNvbm5lY3QKK3ZpZXdTeW5jUHVibGlzaDI9UmVwdWJsaXNoCit2aWV3U3luY1Jlc3RhcnRQdWJsaXNoMj1SZWNvbm5lY3QgYW5kIHJlcHVibGlzaAordmlld1N5bmNQdWJsaXNoaW5nMj1QdWJsaXNoaW5nLi4uCisKKworIyAtLS0tLS0tLS0tLS0tLS0gQWN0aW9uIFNldHMgKHRvb2xiYXIgaWNvbiBncm91cHMpIC0tLS0tLS0tLS0tLS0tLQorCisjIFNlcnZlcnMgYWN0aW9uIHNldAorYWN0aW9uU2V0TmV3U2VydmVyPUNyZWF0ZSBTZXJ2ZXIKKworIyBSdW4gb24gU2VydmVyIGFjdGlvbnMKK2FjdGlvblJ1bk9uU2VydmVyPVJ1biBvbiBTZXJ2ZXIuLi4KK2FjdGlvbkRlYnVnT25TZXJ2ZXI9RGVidWcgb24gU2VydmVyLi4uCithY3Rpb25Qcm9maWxlT25TZXJ2ZXI9UHJvZmlsZSBvbiBTZXJ2ZXIuLi4KK3Byb2Nlc3NOYW1lPVJ1biBvbiBTZXJ2ZXIKKworCisjIC0tLS0tLS0tLS0tLS0tLSBQcmVmZXJlbmNlcyAtLS0tLS0tLS0tLS0tLS0KKworIyBOYW1lcyBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlcworcHJlZmVyZW5jZVJ1bnRpbWVzVGl0bGVMb25nPVNlcnZlciBSdW50aW1lIEVudmlyb25tZW50cworCisjIFNlcnZlciBwcmVmZXJlbmNlcworcHJlZkF1dG9QdWJsaXNoPUF1dG9tYXRpY2FsbHkgcHVibGlzaCB3JmhlbiBzdGFydGluZyBzZXJ2ZXJzCitwcmVmU2hvd09uQWN0aXZpdHk9U2hvdyAmU2VydmVycyB2aWV3IHdoZW4gc2VydmVyIHN0YXRlIGNoYW5nZXMKKworcHJlZlNhdmVFZGl0b3JzPVNhdmUgZGlydHkgZWRpdG9ycyBiZWZvcmUgc3RhcnRpbmcgdGhlIHNlcnZlcgorcHJlZlNhdmVFZGl0b3JzQWx3YXlzPUEmbHdheXMKK3ByZWZTYXZlRWRpdG9yc05ldmVyPSZOZXZlcgorcHJlZlNhdmVFZGl0b3JzUHJvbXB0PSZQcm9tcHQKKworcHJlZkxhdW5jaE1vZGU9V2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgc2VydmVyIG1vZGUKK3ByZWZMYXVuY2hNb2RlUmVzdGFydD1SZSZzdGFydAorcHJlZkxhdW5jaE1vZGVDb250aW51ZT0mQ29udGludWUKK3ByZWZMYXVuY2hNb2RlUHJvbXB0PVAmcm9tcHQKKworcHJlZkxhdW5jaE1vZGUyPVdoZW4gc3dpdGNoaW5nIHRoZSBzZXJ2ZXIgb3V0IG9mIGRlYnVnIG1vZGUKK3ByZWZMYXVuY2hNb2RlMlJlc3RhcnQ9UmVzdCZhcnQKK3ByZWZMYXVuY2hNb2RlMkJyZWFrcG9pbnRzPURpc2FibGUgJmJyZWFrcG9pbnRzCitwcmVmTGF1bmNoTW9kZTJDb250aW51ZT1Db250aW4mdWUKK3ByZWZMYXVuY2hNb2RlMlByb21wdD1QciZvbXB0CisKK3ByZWZCcmVha3BvaW50cz1XaGVuIHN3aXRjaGluZyB0aGUgc2VydmVyIGludG8gZGVidWcgbW9kZSwgcmUtZW5hYmxlIGJyZWFrcG9pbnRzCitwcmVmQnJlYWtwb2ludHNBbHdheXM9QWwmd2F5cworcHJlZkJyZWFrcG9pbnRzTmV2ZXI9TiZldmVyCitwcmVmQnJlYWtwb2ludHNQcm9tcHQ9UHJvJm1wdAorCitwcmVmUmVzdGFydD1XaGVuIHJlcXVpcmVkLCByZXN0YXJ0IHRoZSBzZXJ2ZXIKK3ByZWZSZXN0YXJ0QWx3YXlzPUFsd2EmeXMKK3ByZWZSZXN0YXJ0TmV2ZXI9TmUmdmVyCitwcmVmUmVzdGFydFByb21wdD1Qcm9tcCZ0CisKKyMgUHJvamVjdCBwcm9wZXJ0aWVzIHByZWZlcmVuY2VzCitwcmVmUHJvamVjdD1Qcm9qZWN0OgorcHJlZlByb2plY3REZWZhdWx0U2VydmVyPUFsd2F5cyB1c2UgdGhlICZmb2xsb3dpbmcgc2VydmVyIHdoZW4gcnVubmluZyB0aGlzIHByb2plY3Q6CitwcmVmUHJvamVjdE5vdE1vZHVsZT1UaGlzIHByb2plY3QgY2Fubm90IGJlIHVzZWQgd2l0aCBzZXJ2ZXJzLgorcHJlZlByb2plY3ROb3RDb25maWd1cmVkPVRoaXMgcHJvamVjdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBzZXJ2ZXJzLgorcHJlZlByb2plY3ROb1NlcnZlcj08Tm9uZT4KKworcHJvcFNlcnZlckluZm9OYW1lPU5hbWU6Citwcm9wU2VydmVySW5mb1R5cGU9VHlwZToKK3Byb3BTZXJ2ZXJJbmZvVmVuZG9yPVZlbmRvcjoKKworIyBUb29sdGlwCit0b29sVGlwRW5hYmxlRm9jdXM9UHJlc3MgJ0Y2JyBmb3IgRm9jdXMuCit0b29sVGlwRGlzYWJsZUZvY3VzPVByZXNzICdFU0MnIHRvIEhpZGUuCisKKyMgUnVudGltZSBFbnZpcm9ubWVudHMKK3ByZWZlcmVuY2VSdW50aW1lc0Rlc2NyaXB0aW9uPUFkZCwgcmVtb3ZlLCBvciBlZGl0IHNlcnZlciBydW50aW1lIGVudmlyb25tZW50cy4KK3ByZWZlcmVuY2VSdW50aW1lc1RhYmxlPVNlcnZlciBydW50aW1lIGUmbnZpcm9ubWVudHM6CisKKworIyAtLS0tLS0tLS0tLS0tLS0gVGFza3MgKHByb2dyZXNzIG1vbml0b3JzKSAtLS0tLS0tLS0tLS0tLS0KKworIyBHZW5lcmFsIHRhc2tzCitzYXZpbmdUYXNrPVNhdmluZyB7MH0uCitsb2FkaW5nVGFzaz1Mb2FkaW5nIHswfS4KK3BlcmZvcm1pbmdUYXNrcz1QZXJmb3JtaW5nIHRhc2tzLgorbGF1bmNoaW5nQ2xpZW50VGFzaz1MYXVuY2hpbmcgY2xpZW50Citqb2JJbml0aWFsaXppbmc9SW5pdGlhbGl6aW5nIFNlcnZlciBUb29scworam9iUmVzdGFydGluZz1SZXN0YXJ0aW5nIHswfQoram9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXc9SW5pdGlhbGl6aW5nIFNlcnZlcnMgdmlldworCisjIC0tLS0tLS0tLS0tLS0tLSBEaWFsb2dzIC0tLS0tLS0tLS0tLS0tLQorCisjIERlbGV0ZSBTZXJ2ZXIgZGlhbG9nCitkZWxldGVTZXJ2ZXJEaWFsb2dUaXRsZT1EZWxldGUgU2VydmVyCitkZWxldGVTZXJ2ZXJEaWFsb2dNZXNzYWdlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgezB9PworZGVsZXRlU2VydmVyRGlhbG9nTWVzc2FnZU1hbnk9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgezB9IHNlcnZlcnM/CitkZWxldGVTZXJ2ZXJEaWFsb2dMb29zZUNvbmZpZ3VyYXRpb25zPURlbGV0ZSB1bnVzZWQgc2VydmVyIGNvbmZpZ3VyYXRpb24ocykKK2RlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXI9RGVsZXRlIHJ1bm5pbmcgc2VydmVyKHMpCitkZWxldGVTZXJ2ZXJEaWFsb2dSdW5uaW5nU2VydmVyU3RvcD1TdG9wIHNlcnZlcihzKSBiZWZvcmUgZGVsZXRpbmcKK2RlbGV0ZVNlcnZlclRhc2s9RGVsZXRpbmcgc2VydmVyKHMpLi4uCisKKyMgQ3JlYXRlIFNlcnZlciBQcm9qZWN0IGRpYWxvZworY3JlYXRlU2VydmVyUHJvamVjdERpYWxvZ1RpdGxlPUNyZWF0ZSBTZXJ2ZXIgUHJvamVjdAorY3JlYXRlU2VydmVyUHJvamVjdERpYWxvZ01lc3NhZ2U9RG8geW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IHNlcnZlciBwcm9qZWN0IHdpdGggdGhlIG5hbWUgezB9PworCisjIFRlcm1pbmF0ZSBTZXJ2ZXIgZGlhbG9nCit0ZXJtaW5hdGVTZXJ2ZXJEaWFsb2dUaXRsZT1UZXJtaW5hdGUgU2VydmVyCit0ZXJtaW5hdGVTZXJ2ZXJEaWFsb2dNZXNzYWdlPVNlcnZlciB7MH0gaXMgbm90IHJlc3BvbmRpbmcuIERvIHlvdSB3YW50IHRvIHRlcm1pbmF0ZSB0aGlzIHNlcnZlcj8gQ2xpY2sgT0sgdG8gdGVybWluYXRlIHRoZSBzZXJ2ZXIgb3IgY2xpY2sgQ2FuY2VsIHRvIGNvbnRpbnVlIHdhaXRpbmcuCisKKyMgU2VydmVyIHJlc291cmNlIGRpcnR5IGRpYWxvZworcmVzb3VyY2VEaXJ0eURpYWxvZ1RpdGxlPVNlcnZlciBSZXNvdXJjZSBEaXJ0eQorcmVzb3VyY2VEaXJ0eURpYWxvZ01lc3NhZ2U9VGhlIHNlcnZlciByZXNvdXJjZSB7MH0gaGFzIHVuc2F2ZWQgY2hhbmdlcy4gRG8geW91IHdhbnQgdG8gY29udGludWU/CityZXNvdXJjZURpcnR5RGlhbG9nQ29udGludWU9Q29udGludWUKKworIyBHZW5lcmFsIGRpYWxvZ3MKK2RlZmF1bHREaWFsb2dUaXRsZT1TZXJ2ZXIKK2RpYWxvZ1JlbWVtYmVyPSZSZW1lbWJlciBteSBkZWNpc2lvbgorCisjIHJlc3RhcnQgd2FybmluZyBkaWFsb2cKK2RpYWxvZ01vZGVXYXJuaW5nUnVuPVRoZSBzZXJ2ZXIgaXMgbm90IGluIHJ1biBtb2RlLiBTZWxlY3QgZnJvbSBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorZGlhbG9nTW9kZVdhcm5pbmdEZWJ1Zz1UaGUgc2VydmVyIGlzIG5vdCBydW5uaW5nIGluIGRlYnVnIG1vZGUuIFNlbGVjdCBmcm9tIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CitkaWFsb2dNb2RlV2FybmluZ1Byb2ZpbGU9VGhlIHNlcnZlciBpcyBub3QgcnVubmluZyBpbiBwcm9maWxpbmcgbW9kZS4gU2VsZWN0IGZyb20gb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKK2RpYWxvZ01vZGVXYXJuaW5nUmVzdGFydD0mU3dpdGNoIG1vZGUgKHdpbGwgcmVzdGFydCBpZiBuZWNlc3NhcnkpCitkaWFsb2dNb2RlV2FybmluZ0JyZWFrcG9pbnRzPURpc2FibGUgJmJyZWFrcG9pbnRzIGFuZCBjb250aW51ZQorZGlhbG9nTW9kZVdhcm5pbmdDb250aW51ZT0mQ29udGludWUgaW4gdGhlIGN1cnJlbnQgbW9kZQorCitkaWFsb2dCcmVha3BvaW50cz1UaGUgc2VydmVyIGlzIHJ1bm5pbmcgaW4gZGVidWcgbW9kZSBidXQgYnJlYWtwb2ludHMgaGF2ZSBiZWVuIGRpc2FibGVkLiBTZWxlY3QgZnJvbSBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorZGlhbG9nQnJlYWtwb2ludHNSZWVuYWJsZT1SZS0mZW5hYmxlIGJyZWFrcG9pbnRzCitkaWFsb2dCcmVha3BvaW50c0NvbnRpbnVlPSZDb250aW51ZSB3aXRob3V0IGRlYnVnZ2luZworCitkaWFsb2dSZXN0YXJ0PVRoZSBzZXJ2ZXIgbWF5IG5lZWQgYmUgcmVzdGFydGVkLiBEbyB5b3Ugd2FudCB0byByZXN0YXJ0IHRoZSBzZXJ2ZXI/CitkaWFsb2dSZXN0YXJ0UmVzdGFydD1SZSZzdGFydCBzZXJ2ZXIKK2RpYWxvZ1Jlc3RhcnRDb250aW51ZT0mQ29udGludWUgd2l0aG91dCByZXN0YXJ0aW5nCisKKyMgTW9uaXRvciBkaWFsb2cKK2RpYWxvZ01vbml0b3JUaXRsZT1Nb25pdG9yaW5nIFBvcnRzCitkaWFsb2dNb25pdG9yRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyBwb3J0cyBhcmUgYmVpbmcgbW9uaXRvcmVkIG9uIHNlcnZlciB7MH06CitkaWFsb2dNb25pdG9yQWRkRGVzY3JpcHRpb249VGhlIHNlcnZlciB7MH0gaGFzIHRoZSBmb2xsb3dpbmcgcG9ydHMgdGhhdCBjYW4gYmUgbW9uaXRvcmVkOgorZGlhbG9nTW9uaXRvckNvbHVtblBvcnQ9U2VydmVyIFBvcnQKK2RpYWxvZ01vbml0b3JDb2x1bW5UeXBlPVR5cGUKK2RpYWxvZ01vbml0b3JDb2x1bW5Nb25pdG9yUG9ydD1Nb25pdG9yIFBvcnQKK2RpYWxvZ01vbml0b3JDb2x1bW5Db250ZW50VHlwZT1Db250ZW50IFR5cGUKK2RpYWxvZ01vbml0b3JDb2x1bW5TdGF0dXM9U3RhdHVzCitkaWFsb2dNb25pdG9yTW9uaXRvclBvcnQ9TW9uaXRvciBwb3J0OgorZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlPUNvbnRlbnQgdHlwZToKK2RpYWxvZ01vbml0b3JDb250ZW50VHlwZUFsbD1BbGwKK2RpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYj1XZWIKK2RpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYlNlcnZpY2VzPVdlYlNlcnZpY2VzCitkaWFsb2dNb25pdG9yTm9uZT08bm9uZT4KKworZGlhbG9nUHVibGlzaENsZWFuPUNsZWFuIHdpbGwgZGlzY2FyZCBhbGwgcHVibGlzaCBzdGF0ZSBhbmQgcmVwdWJsaXNoIGZyb20gc2NyYXRjaC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsZWFuIGFsbCBwdWJsaXNoZWQgcHJvamVjdHM/CisKK3N0YXJ0PVN0YXJ0CitzdG9wPVN0b3AKK3N0YXJ0ZWQ9U3RhcnRlZAorc3RvcHBlZD1TdG9wcGVkCisKKyMgQ29uZmlybSBydW50aW1lIHJlbW92YWwKK2RpYWxvZ1J1bnRpbWVJblVzZT1UaGUgcnVudGltZSBlbnZpcm9ubWVudCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCBhbmQgZGVsZXRpbmcgaXQgd2lsbCBjYXVzZSBjb21waWxhdGlvbiBvciBydW4gdGltZSBwcm9ibGVtcy4gRGVsZXRlIHRoZSBydW50aW1lIGVudmlyb25tZW50IGFueXdheT8KK2RpYWxvZ1J1bnRpbWVEZWxldGVTZXJ2ZXJzPURlbGV0ZSBhbGwgYWZmZWN0ZWQgc2VydmVycz8KK2RpYWxvZ1J1bnRpbWVSZW1vdmVUYXJnZXRzPVJlbW92ZSB0aGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgZnJvbSB0YXJnZXRlZCBwcm9qZWN0cz8KKworIyBydW50aW1lIGxvY2F0b3Igc2VhcmNoIGRpYWxvZworZGlhbG9nUnVudGltZVNlYXJjaFRpdGxlPVNlYXJjaCBGb3IgUnVudGltZSBFbnZpcm9ubWVudHMKK2RpYWxvZ1J1bnRpbWVTZWFyY2hNZXNzYWdlPVNlbGVjdCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHNlYXJjaCBmb3Igc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzOgorZGlhbG9nUnVudGltZVNlYXJjaFByb2dyZXNzPVNlYXJjaGluZyBmb3Igc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzLi4uCisKKyMgQ2FuJ3QgYWRkIHJlbW92ZQorZGlhbG9nQWRkUmVtb3ZlTW9kdWxlc05vbmU9VGhlcmUgYXJlIG5vIHByb2plY3RzIHRoYXQgY2FuIGJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgc2VydmVyLgorCitkaWFsb2dSZW1vdmVNb2R1bGVDb25maXJtPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIHByb2plY3QgZnJvbSB0aGUgc2VydmVyPworCisjIC0tLS0tLS0tLS0tLS0tLSBNaXNjIFVJIC0tLS0tLS0tLS0tLS0tLQorCisjIHJ1bnRpbWUgY29tcG9zaXRlCitydW50aW1lVHlwZUNvbXBUcmVlPVNlbGVjdCB0aGUgdHlwZSBvZiAmcnVudGltZSBlbnZpcm9ubWVudDoKK3NlcnZlclR5cGVDb21wTGFiZWw9U2VsZWN0IHRoZSAmc2VydmVyIHR5cGU6CitzZXJ2ZXJOYW1lPVNlcnZlciBuYSZtZToKK3NlcnZlck5hbWVEZWZhdWx0PVJlc2UmdCBkZWZhdWx0Citjb25maWd1cmVSdW50aW1lcz0mQ29uZmlndXJlIHJ1bnRpbWUgZW52aXJvbm1lbnRzLi4uCithZGRSdW50aW1lPSZBZGQuLi4KKworIyBpbnN0YWxsYWJsZSBzZXJ2ZXIgY29tcG9zaXRlCitpbnN0YWxsYWJsZVNlcnZlckNvbXBUcmVlPVNlbGVjdCB0aGUgJnNlcnZlciBzdXBwb3J0IHRvIGluc3RhbGw6CitpbnN0YWxsYWJsZVNlcnZlckxpbms9RG93bmxvYWQgYWRkaXRpb25hbCBzZXJ2ZXIgYWRhcHRlcnMKK2luc3RhbGxhYmxlU2VydmVyTG9jYWw9RXhhbWluaW5nIGxvY2FsIGNvbmZpZ3VyYXRpb24KK2luc3RhbGxhYmxlU2VydmVyU2VhcmNoaW5nPVNlYXJjaGluZyB7MH0KKworIyBtaXNjIGNvbXBvc2l0ZXMKK2hvc3RuYW1lPVNlcnZlcidzICZob3N0IG5hbWU6CisKKyMgU2VydmVyIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYgorc2VydmVyTGF1bmNoRGVzY3JpcHRpb249VGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCB0byBsYXVuY2ggdGhlIHNlcnZlciBzcGVjaWZpZWQgYmVsb3cuIFRvIGFjY2VzcyBmdXJ0aGVyIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXIsIG9wZW4gdGhlIHNlcnZlcidzIGVkaXRvciBmcm9tIHRoZSBTZXJ2ZXJzIHZpZXcuCitzZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiPVNlcnZlcgorc2VydmVyTGF1bmNoU2VydmVyPVNlcnZlcjoKK3NlcnZlckxhdW5jaFJ1bnRpbWU9UnVudGltZSBFbnZpcm9ubWVudDoKK3NlcnZlckxhdW5jaEhvc3Q9SG9zdCBuYW1lOgorcnVuT25TZXJ2ZXJMYXVuY2hDb25maWdOYW1lPXswfQorCisjIEVycm9yIE1lc3NhZ2VzCitlcnJvckRpYWxvZ1RpdGxlPVNlcnZlciBFcnJvcgorZXJyb3JTZXJ2ZXJBbHJlYWR5UnVubmluZz1TZXJ2ZXIgYWxyZWFkeSBydW5uaW5nCitlcnJvck5vU2VydmVyU2VsZWN0ZWQ9Tm8gc2VydmVyIHNlbGVjdGVkCitlcnJvckludmFsaWRTZXJ2ZXI9VGhlIHNlcnZlciBpcyBpbnZhbGlkIG9yIG1pc3NpbmcKK2Vycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0PUNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHByb2plY3QKK2Vycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0U3RhdHVzPUNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHByb2plY3Q6IHswfQorZXJyb3JOb0FydGlmYWN0PVRoZSBzZWxlY3Rpb24gZGlkIG5vdCBjb250YWluIGFueSByZXNvdXJjZXMgdGhhdCBjYW4gcnVuIG9uIGEgc2VydmVyLgorZXJyb3JMYXVuY2hDb25maWc9VGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIGFuZCBtYXkgYmUgb3V0IG9mIHN5bmMgd2l0aCB0aGUgd29ya3NwYWNlCitlcnJvck5vTW9kdWxlcz1UaGUgc2VsZWN0aW9uIGlzIG5vdCB3aXRoaW4gYSB2YWxpZCBtb2R1bGUuCitlcnJvck5vU2VydmVyPVRoZSBzZWxlY3Rpb24gY2Fubm90IGJlIHJ1biBvbiBhbnkgc2VydmVyLgorZXJyb3JDb3VsZE5vdFNhdmVQcmVmZXJlbmNlPUNvdWxkIG5vdCBzYXZlIHNlcnZlciBwcmVmZXJlbmNlIGluZm9ybWF0aW9uLgorZXJyb3JFZGl0b3JDYW50U2F2ZT1UaGUgc2VydmVyIGNhbm5vdCBiZSBzYXZlZCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOgorZXJyb3JFZGl0b3I9Q291bGQgbm90IG9wZW4gZWRpdG9yIGJlY2F1c2UgezB9IGlzIG5vdCBhIHZhbGlkIHNlcnZlci4gVXNlIE9wZW4gV2l0aCB0byBvcGVuIHRoaXMgZmlsZSB3aXRoIGEgZGlmZmVyZW50IGVkaXRvci4KK2Vycm9yVmVyc2lvbkxldmVsPVRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB2ZXJzaW9uIHsxfSBvZiB0aGUgezB9IHNwZWNpZmljYXRpb24uCitlcnJvck1pc3NpbmdDb25maWd1cmF0aW9uPVRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpcyBtaXNzaW5nIG9yIGludmFsaWQKK2Vycm9yUm9vdE1vZHVsZT1Db3VsZCBub3QgZmluZCBhIHZhbGlkIHBhcmVudCBtb2R1bGUgdG8gYWRkIHRvIHRoZSBzZXJ2ZXIuCitlcnJvckR1cGxpY2F0ZU5hbWU9VGhlIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuIFNwZWNpZnkgYSBkaWZmZXJlbnQgbmFtZS4KKworIyBJbmZvIG1lc3NhZ2VzCitpbmZvTm9SdW50aW1lc0ZvdW5kPU5vIG5ldyBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudHMgd2VyZSBmb3VuZC4KKworIyBEZWZhdWx0IHNlcnZlciBjcmVhdGlvbiBuYW1lcworIyB7MH0gd2lsbCBiZSByZXBsYWNlZCBieSBhIG51bWJlciBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGJlaW5nIHVzZWQKK2RlZmF1bHRTZXJ2ZXJQcm9qZWN0TmFtZT1TZXJ2ZXJzezB9CisKKyMgVXNlZCB3aGVuIGEgbmFtZSBjYW4ndCBiZSBmb3VuZAorZWxlbWVudFVua25vd25OYW1lPTx1bmtub3duPgorCitjb2x1bW5OYW1lPU5hbWUKK2NvbHVtblR5cGU9VHlwZQorCithZGQ9JkFkZC4uLgorZWRpdD0mRWRpdC4uLgorcmVtb3ZlPSZSZW1vdmUKK3NlYXJjaD0mU2VhcmNoLi4uCisKK2NsaWVudERlZmF1bHROYW1lPURvIG5vdGhpbmcKK2NsaWVudERlZmF1bHREZXNjcmlwdGlvbj1MYXVuY2ggdGhlIG1vZHVsZSBvbiB0aGUgc2VydmVyIGJ1dCBkbyBub3QgYnJpbmcgdXAgYSBjbGllbnQgYXBwbGljYXRpb24uCisKKyMgTW9kdWxlIGRlY29yYXRvcgorbW9kdWxlRGVjb3JhdG9yUHJvamVjdD17MH0gKHsxfSkKKworIyBVc2VkIGZvciBkaXNwbGF5aW5nIHRpbWUgKHNvIGZhciBvbmx5IHVzZWQgaW4gdG9vbHRpcCkKK21pbnV0ZXM9ezB9IG1pbnV0ZXMgCittb2R1bGVzPXswfSBtb2R1bGVzCisKKyMgLS0tLS0tLS0tLS0tLS0tIEVkaXRvciBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLQorCitzZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VUaXRsZT1PdmVydmlldworc2VydmVyRWRpdG9yT3ZlcnZpZXdHZW5lcmFsU2VjdGlvbj1HZW5lcmFsIEluZm9ybWF0aW9uCitzZXJ2ZXJFZGl0b3JPdmVydmlld0dlbmVyYWxEZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBob3N0IG5hbWUgYW5kIG90aGVyIGNvbW1vbiBzZXR0aW5ncy4KK3NlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyTmFtZT1TZXJ2ZXIgbmFtZToKK3NlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyTmFtZUNvbW1hbmQ9c2V0IHNlcnZlciBuYW1lCitzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25QYXRoPUNvbmZpZ3VyYXRpb24gcGF0aDoKK3NlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZT1Ccm93c2UuLi4KK3NlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZU1lc3NhZ2U9U3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgorc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJIb3N0bmFtZT1Ib3N0IG5hbWU6CitzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZD1zZXQgaG9zdCBuYW1lCitzZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWU9UnVudGltZSBFbnZpcm9ubWVudDoKK3NlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZUVkaXQ9RWRpdAorc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lQ29tbWFuZD1zZXQgcnVudGltZSBlbnZpcm9ubWVudAorCitzZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hTZWN0aW9uPVB1Ymxpc2hpbmcKK3NlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaERlc2NyaXB0aW9uPU1vZGlmeSBzZXR0aW5ncyBmb3IgcHVibGlzaGluZy4KK3NlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hEaXNhYmxlPU5ldmVyIHB1Ymxpc2ggYXV0b21hdGljYWxseQorc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWQ9QXV0b21hdGljYWxseSBwdWJsaXNoIHdoZW4gcmVzb3VyY2VzIGNoYW5nZQorc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWRJbnRlcnZhbD1QdWJsaXNoaW5nIGludGVydmFsIChpbiBzZWNvbmRzKToKK3NlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaENvbW1hbmQ9bW9kaWZ5IHB1Ymxpc2ggc2V0dGluZ3MKK3NlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaGVycz1TZWxlY3QgZW5hYmxlZCBwdWJsaXNoZXJzOgorc2VydmVyRWRpdG9yT3ZlcnZpZXdUaW1lb3V0U2VjdGlvbj1UaW1lb3V0cworc2VydmVyRWRpdG9yT3ZlcnZpZXdUaW1lb3V0RGVzY3JpcHRpb249U3BlY2lmeSB0aGUgdGltZSBsaW1pdCB0byBjb21wbGV0ZSBzZXJ2ZXIgb3BlcmF0aW9ucy4KK3NlcnZlckVkaXRvck92ZXJ2aWV3U3RhcnRUaW1lb3V0PVN0YXJ0IChpbiBzZWNvbmRzKToKK3NlcnZlckVkaXRvck92ZXJ2aWV3U3RvcFRpbWVvdXQ9U3RvcCAoaW4gc2Vjb25kcyk6CitzZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXRDb21tYW5kPW1vZGlmeSB0aW1lb3V0IHNldHRpbmdzCitzZXJ2ZXJFZGl0b3JPdmVydmlld09wZW5MYXVuY2hDb25maWd1cmF0aW9uPU9wZW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24KKworIyBNZW51IGl0ZW1zLiB7MH0gd2lsbCBiZSByZXBsYWNlZCBieSBvbmUgb2YgdGhlIHh4eEVkaXRvckFjdGlvblh4eCBmaWVsZHMKKyMgZnJvbSBiZWxvdy4gQEN0cmwrWiBpcyB0aGUgbWVudSBtbmVtb25pYworZWRpdG9yVW5kb0VuYWJsZWQ9VW5kbyB7MH1AQ3RybCtaCitlZGl0b3JVbmRvRGlzYWJsZWQ9VW5kb0BDdHJsK1oKK2VkaXRvclJlZG9FbmFibGVkPVJlZG8gezB9QEN0cmwrWQorZWRpdG9yUmVkb0Rpc2FibGVkPVJlZG9AQ3RybCtZCisKK2VkaXRvclNhdmVFcnJvckRpYWxvZz1TYXZlIFByb2JsZW1zCitlZGl0b3JTYXZlRXJyb3JNZXNzYWdlPUVycm9yIHdoaWxlIHNhdmluZy4gezB9CisKK2VkaXRvclJlYWRPbmx5PVJlYWQgT25seQorZWRpdG9yV3JpdGFibGU9V3JpdGFibGUKK2VkaXRvclJlYWRPbmx5RmlsZXM9UmVhZCBPbmx5IGZpbGVzOiB7MH0KKworZWRpdG9yU2VydmVyRWRpdG9yPVNlcnZlciBFZGl0b3IKK2VkaXRvclByb21wdElycmV2ZXJzaWJsZT1UaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPworZWRpdG9yUmVuYW1lRmlsZXM9VGhlIHNlcnZlciBoYXMgYmVlbiByZW5hbWVkLiBEbyB5b3Ugd2FudCB0byByZW5hbWUgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgdG8gbWF0Y2g/CisKKyMgbWVzc2FnZSBpZiBhIGRpcnR5IHJlc291cmNlIGlzIGRlbGV0ZWQKK2VkaXRvclJlc291cmNlRGVsZXRlVGl0bGU9U2VydmVyIERlbGV0ZWQKK2VkaXRvclJlc291cmNlRGVsZXRlU2VydmVyTWVzc2FnZT1UaGUgc2VydmVyIHswfSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBzYXZlIHlvdXIgY2hhbmdlcyBvciBjbG9zZSB0aGUgZWRpdG9yIHdpdGhvdXQgc2F2aW5nPworZWRpdG9yUmVzb3VyY2VEZWxldGVTYXZlPVNhdmUKKworZWRpdG9yUmVzb3VyY2VNb2RpZmllZFRpdGxlPUZpbGUgQ2hhbmdlZAorZWRpdG9yU2VydmVyTW9kaWZpZWRNZXNzYWdlPVRoZSBzZXJ2ZXIgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/CisKK2VkaXRvclZhbGlkYXRlRWRpdEZhaWx1cmVNZXNzYWdlPVRoZSBzZXJ2ZXIgY2Fubm90IGJlIGVkaXRlZC4KK2VkaXRvclJlYWRPbmx5TWVzc2FnZT1GaWxlKHMpIGJlaW5nIGVkaXRlZCBoYXZlIGJlY29tZSByZWFkLW9ubHkuIFRoZSBlZGl0b3Igd2lsbCBiZWNvbWUgcmVhZC1vbmx5IGFuZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4KKworZWRpdG9yUmVzb3VyY2VXYXJuVGl0bGU9U2VydmVyIE1vZGlmaWNhdGlvbiBXYXJuaW5nCitlZGl0b3JSZXNvdXJjZVdhcm5NZXNzYWdlPVRoZSBzZXJ2ZXIgeW91IGFyZSBtb2RpZnlpbmcgaXMgcmVhZC1vbmx5LiBBbGwgY2hhbmdlcyB3aWxsIGJlIGxvc3QgYmVjYXVzZSB0aGUgc2VydmVyIGNhbm5vdCBiZSBzYXZlZC4KKworCithdWRpb1ByZWZTZWxlY3RGaWxlPVNlbGVjdCBBdWRpbyBGaWxlCithdWRpb1ByZWZFbmFibGU9JkVuYWJsZSBzb3VuZHMKK2F1ZGlvUHJlZlZvbHVtZT0mVm9sdW1lOgorYXVkaW9QcmVmU291bmRzPSZTb3VuZHM6CithdWRpb1ByZWZTb3VuZD1Tb3VuZAorYXVkaW9QcmVmRmlsZT1BdWRpbyBGaWxlCithdWRpb1ByZWZQbGF5PSZQbGF5CithdWRpb1ByZWZCcm93c2U9JkJyb3dzZS4uLgorYXVkaW9QcmVmUmVzZXQ9JlJlc2V0CisKK2F1ZGlvVW5rbm93bj0odW5rbm93bikKK2F1ZGlvRGVmYXVsdD0oZGVmYXVsdCkKK2F1ZGlvTm9uZT0obm9uZSkKKworZXJyb3JTdGFydGluZ01vbml0b3I9Q291bGQgbm90IHN0YXJ0IHRoZSBzZXJ2ZXIgbW9uaXRvcjogezB9CisKK2ludGVybmFsV2ViQnJvd3Nlck5hbWU9SW50ZXJuYWwgV2ViIEJyb3dzZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01vZHVsZUxhYmVsRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Nb2R1bGVMYWJlbERlY29yYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTJkOWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Nb2R1bGVMYWJlbERlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKKworcHVibGljIGNsYXNzIE1vZHVsZUxhYmVsRGVjb3JhdG9yIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxEZWNvcmF0b3IgeworCXB1YmxpYyBNb2R1bGVMYWJlbERlY29yYXRvcigpIHsKKwkJc3VwZXIoZmFsc2UpOworCX0KKworCXB1YmxpYyBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCkgeworCQl0cnkgeworCQkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOworCQkJCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKKwkJCQltb2R1bGUgPSAoSU1vZHVsZSkgZWxlbWVudDsKKwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgeworCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gKChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQpLm1vZHVsZTsKKwkJCQltb2R1bGUgPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07CisJCQl9CisJCQlpZiAobW9kdWxlID09IG51bGwpCisJCQkJcmV0dXJuIG51bGw7CisJCQkKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBtb2R1bGUuZ2V0UHJvamVjdCgpOworCQkJCisJCQlpZiAocHJvamVjdCA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZGVjb3JhdGVJbWFnZShpbWFnZSwgcHJvamVjdCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCkgeworCQl0cnkgeworCQkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOworCQkJCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKKwkJCQltb2R1bGUgPSAoSU1vZHVsZSkgZWxlbWVudDsKKwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgeworCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gKChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQpLm1vZHVsZTsKKwkJCQltb2R1bGUgPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07CisJCQl9CisJCQlpZiAobW9kdWxlID09IG51bGwpCisJCQkJcmV0dXJuIG51bGw7CisJCQkKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBtb2R1bGUuZ2V0UHJvamVjdCgpOworCQkJCisJCQlpZiAocHJvamVjdCA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlpZiAoIXByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXh0KSkKKwkJCQl0ZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMubW9kdWxlRGVjb3JhdG9yUHJvamVjdCwgbmV3IFN0cmluZ1tdIHt0ZXh0LCBwcm9qZWN0LmdldE5hbWUoKX0pOworCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmRlY29yYXRlVGV4dCh0ZXh0LCBwcm9qZWN0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01vZHVsZUxhYmVsRGVjb3JhdG9yMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTW9kdWxlTGFiZWxEZWNvcmF0b3IyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzMWZhNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01vZHVsZUxhYmVsRGVjb3JhdG9yMi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkJhc2VMYWJlbFByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgTW9kdWxlTGFiZWxEZWNvcmF0b3IyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7CisJcHVibGljIE1vZHVsZUxhYmVsRGVjb3JhdG9yMigpIHsKKwkJc3VwZXIoZmFsc2UpOworCX0KKworCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7CisJCXRyeSB7CisJCQlJTW9kdWxlIG1vZHVsZSA9IG51bGw7CisJCQkKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgeworCQkJCWRlY29yYXRpb24uYWRkU3VmZml4KCIgKiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7CisJCQkJbW9kdWxlID0gKElNb2R1bGUpIGVsZW1lbnQ7CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKKwkJCQlJTW9kdWxlW10gbW9kdWxlcyA9ICgoTW9kdWxlU2VydmVyKSBlbGVtZW50KS5tb2R1bGU7CisJCQkJbW9kdWxlID0gbW9kdWxlc1ttb2R1bGVzLmxlbmd0aCAtIDFdOworCQkJfQorCQkJaWYgKG1vZHVsZSA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCQorCQkJSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZS5nZXRQcm9qZWN0KCk7CisJCQlpZiAocHJvamVjdCA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCQorCQkJU3RyaW5nIHRleHQgPSBtb2R1bGUuZ2V0TmFtZSgpOworCQkJCisJCQlpZiAoIXByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXh0KSkKKwkJCQlkZWNvcmF0aW9uLmFkZFN1ZmZpeCgiICgiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiKSIpOworCQkJCS8vdGV4dCA9IE5MUy5iaW5kKE1lc3NhZ2VzLm1vZHVsZURlY29yYXRvclByb2plY3QsIG5ldyBTdHJpbmdbXSB7dGV4dCwgcHJvamVjdC5nZXROYW1lKCl9KTsKKwkJCS8vcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmRlY29yYXRlVGV4dCh0ZXh0LCBwcm9qZWN0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9PdmVybGF5SW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9PdmVybGF5SW1hZ2VEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyNjVlMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL092ZXJsYXlJbWFnZURlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdVSVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CisvKioKKyAqIEEgT3ZlcmxheUltYWdlRGVzY3JpcHRvciBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgb25lIG9yIG1vcmUgb3ZlcmxheXMuCisgKiBUaGUgb3ZlcmxheXMgYXJlIGNvbXB1dGVkIGFjY29yZGluZyB0byBmbGFncyBzZXQgb24gY3JlYXRpb24gb2YgdGhlIGRlc2NyaXB0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKKwkvLyBmbGFnIHRvIHJlbmRlciB0aGUgZXJyb3Igb3ZlcmxheQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SID0gMHgwMDE7CisKKwlwcml2YXRlIEltYWdlIGZCYXNlSW1hZ2U7CisJcHJpdmF0ZSBpbnQgZkZsYWdzOworCXByaXZhdGUgUG9pbnQgZlNpemU7CisJCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IE92ZXJsYXlJbWFnZURlc2NyaXB0b3IuCisJICogCisJICogQHBhcmFtIGJhc2VJbWFnZSBhbiBpbWFnZSBkZXNjcmlwdG9yIHVzZWQgYXMgdGhlIGJhc2UgaW1hZ2UKKwkgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBhZG9ybm1lbnRzIGFyZSB0byBiZSByZW5kZXJlZAorCSAqLworCXB1YmxpYyBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yKEltYWdlIGJhc2VJbWFnZSwgaW50IGZsYWdzKSB7CisJCXNldEJhc2VJbWFnZShiYXNlSW1hZ2UpOworCQlzZXRGbGFncyhmbGFncyk7CisJfQorCisJLyoqCisJICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZ2V0U2l6ZSgpCisJICovCisJcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7CisJCWlmIChmU2l6ZSA9PSBudWxsKSB7CisJCQlJbWFnZURhdGEgZGF0YSA9IGdldEJhc2VJbWFnZSgpLmdldEltYWdlRGF0YSgpOworCQkJc2V0U2l6ZShuZXcgUG9pbnQoZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQpKTsKKwkJfQorCQlyZXR1cm4gZlNpemU7CisJfQorCQorCS8qKgorCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIE92ZXJsYXlJbWFnZURlc2NyaXB0b3IpKQorCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCU92ZXJsYXlJbWFnZURlc2NyaXB0b3Igb3RoZXIgPSAoT3ZlcmxheUltYWdlRGVzY3JpcHRvcikgb2JqZWN0OworCQlyZXR1cm4gKGdldEJhc2VJbWFnZSgpLmVxdWFscyhvdGhlci5nZXRCYXNlSW1hZ2UoKSkgJiYgZ2V0RmxhZ3MoKSA9PSBvdGhlci5nZXRGbGFncygpKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQorCSAqLworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBnZXRCYXNlSW1hZ2UoKS5oYXNoQ29kZSgpIHwgZ2V0RmxhZ3MoKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKwkJSW1hZ2VEYXRhIGJnID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7CisJCWlmIChiZyA9PSBudWxsKQorCQkJYmcgPSBERUZBVUxUX0lNQUdFX0RBVEE7CisKKwkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKKwkJZHJhd092ZXJsYXlzKCk7CisJfQorCisJLyoqCisJICogQWRkIGFueSBvdmVybGF5cyB0byB0aGUgaW1hZ2UgYXMgc3BlY2lmaWVkIGluIHRoZSBmbGFncy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkcmF3T3ZlcmxheXMoKSB7CisJCWludCBmbGFncyA9IGdldEZsYWdzKCk7CisJCUltYWdlRGF0YSBkYXRhID0gbnVsbDsKKwkJaWYgKChmbGFncyAmIEVSUk9SKSAhPSAwKSB7CisJCQlkYXRhID0gRGVidWdVSVRvb2xzLmdldEltYWdlKElEZWJ1Z1VJQ29uc3RhbnRzLklNR19PVlJfRVJST1IpLmdldEltYWdlRGF0YSgpOworCQkJaW50IHggPSBnZXRTaXplKCkueCAtIGRhdGEud2lkdGg7CisJCQlkcmF3SW1hZ2UoZGF0YSwgeCwgMCk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIEltYWdlIGdldEJhc2VJbWFnZSgpIHsKKwkJcmV0dXJuIGZCYXNlSW1hZ2U7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFzZUltYWdlKEltYWdlIGJhc2VJbWFnZSkgeworCQlmQmFzZUltYWdlID0gYmFzZUltYWdlOworCX0KKworCXByb3RlY3RlZCBpbnQgZ2V0RmxhZ3MoKSB7CisJCXJldHVybiBmRmxhZ3M7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7CisJCWZGbGFncyA9IGZsYWdzOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgeworCQlmU2l6ZSA9IHNpemU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhM2U4ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworLyoqCisgKiBQcm9ncmVzcyBNb25pdG9yIHV0aWxpdHkuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9ncmVzc1V0aWwgeworCS8qKgorCSAqIFByb2dyZXNzVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXByaXZhdGUgUHJvZ3Jlc3NVdGlsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIHZhbGlkIHByb2dyZXNzIG1vbml0b3IuCisJICoKKwkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKG1vbml0b3IgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQlyZXR1cm4gbW9uaXRvcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCisJICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgorCSAqCisJICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKKwkgKiBAcGFyYW0gdGlja3MgaW50CisJICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7CisJCWlmIChtb25pdG9yID09IG51bGwpCisJCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQorCQkJcmV0dXJuIG1vbml0b3I7CisJCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCisJICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgorCSAqCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsCisJICogQHBhcmFtIHRpY2tzIGEgbnVtYmVyIG9mIHRpY2tzCisJICogQHBhcmFtIHN0eWxlIGEgc3R5bGUKKwkgKiBAcmV0dXJuIGEgcHJvZ3Jlc3MgbW9uaXRvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzLCBpbnQgc3R5bGUpIHsKKwkJaWYgKG1vbml0b3IgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCisJCQlyZXR1cm4gbW9uaXRvcjsKKwkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MsIHN0eWxlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUHJvamVjdFByb3BlcnR5UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUHJvamVjdFByb3BlcnR5UGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTViMzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydHlQYWdlLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOworLyoqCisgKiBQcm9wZXJ0eVBhZ2UgZm9yIElQcm9qZWN0cy4gSXQgc2hvd3MgdGhlIHNlcnZlciBwcmVmZXJlbmNlIGZvciB0aGUgcHJvamVjdC4KKyAqLworcHVibGljIGNsYXNzIFByb2plY3RQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgeworCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OworCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKKwlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7CisKKwlwcm90ZWN0ZWQgVGFibGUgdGFibGU7CisJcHJvdGVjdGVkIGludCBjb3VudDsKKwlwcm90ZWN0ZWQgSVNlcnZlciBkZWZhdWx0U2VydmVyOworCisJLyoqCisJICogUHJvamVjdFByb3BlcnR5UGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBQcm9qZWN0UHJvcGVydHlQYWdlKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0aGUgYm9keSBvZiB0aGUgcGFnZS4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCisJICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQl0cnkgeworCQkJSUFkYXB0YWJsZSBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOworCQkJcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudC5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKKwkJCS8vaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkKKwkJCS8vCXByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7CisJCQkKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7CisJCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCQkKKwkJCS8qTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7CisJCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZQcm9qZWN0RGVzY3JpcHRpb24pOworCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlkYXRhLndpZHRoSGludCA9IDIwMDsKKwkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ki8KKwkJCQorCQkJbW9kdWxlID0gU2VydmVyVXRpbC5nZXRNb2R1bGUocHJvamVjdCk7CisJCQlpZiAobW9kdWxlID09IG51bGwpIHsKKwkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZQcm9qZWN0Tm90TW9kdWxlKTsKKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7CisJCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0gZWxzZSB7CisJCQkJSU1vZHVsZVR5cGUgbXQgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOworCQkJCWlmIChtdCAhPSBudWxsKSB7CisJCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQkJCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZQcm9qZWN0KTsKKwkJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOworCQkJCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKKwkJCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCQkJCisJCQkJCUxhYmVsIG1vZHVsZUtpbmQgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKKwkJCQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7CisJCQkJCW1vZHVsZUtpbmQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCQkJbW9kdWxlS2luZC5zZXRUZXh0KG1vZHVsZS5nZXROYW1lKCkgKyAiICgiICsgbXQuZ2V0TmFtZSgpICsgIikiKTsKKwkJCQl9CisJCQkJCisJCQkJZGVmYXVsdFNlcnZlciA9IFNlcnZlckNvcmUuZ2V0RGVmYXVsdFNlcnZlcihtb2R1bGUpOworCQkJCQorCQkJCWZpbmFsIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gZ2V0U2VydmVyc0J5U3VwcG9ydGVkTW9kdWxlKG1vZHVsZSk7CisJCQkJaWYgKHNlcnZlcnMgPT0gbnVsbCB8fCBzZXJ2ZXJzLmxlbmd0aCA9PSAwKSB7CisJCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOworCQkJCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZQcm9qZWN0Tm90Q29uZmlndXJlZCk7CisJCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKKwkJCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQkJCWRhdGEudmVydGljYWxJbmRlbnQgPSA1OworCQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJCX0gZWxzZSB7CisJCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQkJCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZQcm9qZWN0RGVmYXVsdFNlcnZlcik7CisJCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQkJCWRhdGEudmVydGljYWxJbmRlbnQgPSA1OworCQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJCQkKKwkJCQkJdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCk7CisJCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDE1OworCQkJCQlkYXRhLmhlaWdodEhpbnQgPSA5MDsKKwkJCQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCQkJCisJCQkJCS8vIGFkZCBub25lIG9wdGlvbgorCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKKwkJCQkJaXRlbS5zZXRUZXh0KE1lc3NhZ2VzLnByZWZQcm9qZWN0Tm9TZXJ2ZXIpOworCQkJCQkvL2l0ZW0uc2V0SW1hZ2UoKTsKKwkJCQkJCisJCQkJCWludCBzaXplMiA9IHNlcnZlcnMubGVuZ3RoOworCQkJCQljb3VudCA9IDA7CisJCQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQkJCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7CisJCQkJCQlpdGVtLnNldFRleHQobGFiZWxQcm92aWRlci5nZXRUZXh0KHNlcnZlcnNbal0pKTsKKwkJCQkJCWl0ZW0uc2V0SW1hZ2UobGFiZWxQcm92aWRlci5nZXRJbWFnZShzZXJ2ZXJzW2pdKSk7CisJCQkJCQlpdGVtLnNldERhdGEoc2VydmVyc1tqXSk7CisJCQkJCQlpZiAoc2VydmVyc1tqXS5lcXVhbHMoZGVmYXVsdFNlcnZlcikpCisJCQkJCQkJY291bnQgPSBqICsgMTsKKwkJCQkJfQorCQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJCQkJCisJCQkJCXRhYmxlLnNldFNlbGVjdGlvbihjb3VudCk7CisJCQkJCQorCQkJCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJCQkJaW50IGluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwkJCQkJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQkJCQkJc2VydmVyID0gbnVsbDsKKwkJCQkJCQllbHNlIGlmIChpbmRleCA+IDApCisJCQkJCQkJCXNlcnZlciA9IHNlcnZlcnNbaW5kZXgtMV07CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0KKwkJCX0KKwkJCQorCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOworCQkJCisJCQlyZXR1cm4gY29tcG9zaXRlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgcHJvamVjdCBwcm9wZXJ0eSBwYWdlIiwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBzZXJ2ZXJzIHRoYXQgdGhpcyBtb2R1bGUgaXMgY29uZmlndXJlZCBvbi4KKwkgKgorCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNlcnZlcnMKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzQnlTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKKwkJaWYgKG1vZHVsZSA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBJU2VydmVyWzBdOworCQkKKwkJLy8gZG8gaXQgdGhlIHNsb3cgd2F5IC0gZ28gdGhyb3VnaCBhbGwgc2VydmVycyBhbmQKKwkJLy8gc2VlIGlmIHRoaXMgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgaW4gaXQKKwkJTGlzdDxJU2VydmVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOworCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOworCQlpZiAoc2VydmVycyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJgorCQkJCQlzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYKKwkJCQkJU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkpKQorCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSVNlcnZlcltsaXN0LnNpemUoKV0pOworCX0KKworCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKKwkJaWYgKHRhYmxlICE9IG51bGwpIHsKKwkJCXRhYmxlLnNlbGVjdChjb3VudCk7CisJCQlzZXJ2ZXIgPSBkZWZhdWx0U2VydmVyOworCQl9CisJCQorCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCWlmIChtb2R1bGUgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlTZXJ2ZXJDb3JlLnNldERlZmF1bHRTZXJ2ZXIobW9kdWxlLCBzZXJ2ZXIsIG51bGwpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2V0dGluZyBwcmVmZXJyZWQgc2VydmVyIiwgZSk7CisJCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlUHJlZmVyZW5jZSwgZS5nZXRTdGF0dXMoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZU1hcmtlclJlc29sdXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1J1bnRpbWVNYXJrZXJSZXNvbHV0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyNTJhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1J1bnRpbWVNYXJrZXJSZXNvbHV0aW9uLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOworCitwdWJsaWMgY2xhc3MgUnVudGltZU1hcmtlclJlc29sdXRpb24gaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbjIgeworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBNZXNzYWdlcy53aXpOZXdSdW50aW1lRGVzY3JpcHRpb247CisJfQorCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJSdW50aW1lQ3JlYXRlOworCX0KKworCXB1YmxpYyB2b2lkIHJ1bihJTWFya2VyIG1hcmtlcikgeworCQlzaG93UHJlZmVyZW5jZVBhZ2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UHJlZmVyZW5jZVBhZ2UoKSB7CisJCVN0cmluZyBpZCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByZWZlcmVuY2VQYWdlIjsKKwkJU3RyaW5nIGlkMiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnJ1bnRpbWUucHJlZmVyZW5jZVBhZ2UiOworCQlmaW5hbCBQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24obnVsbCwgaWQyLCBuZXcgU3RyaW5nW10geyBpZCwgaWQyIH0sIG51bGwpOworCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTAyMGUxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSw0MDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklSdW50aW1lTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5mYWNldHMuRmFjZXRVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5SdW50aW1lQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLlRhc2tXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTmV3UnVudGltZVdpemFyZEZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OworLyoqCisgKiBUaGUgcHJlZmVyZW5jZSBwYWdlIHRoYXQgaG9sZHMgc2VydmVyIHJ1bnRpbWVzLgorICovCitwdWJsaWMgY2xhc3MgUnVudGltZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCXByb3RlY3RlZCBCdXR0b24gZWRpdDsKKwlwcm90ZWN0ZWQgQnV0dG9uIHJlbW92ZTsKKwlwcm90ZWN0ZWQgTGFiZWwgcGF0aExhYmVsOworCisJLyoqCisJICogUnVudGltZVByZWZlcmVuY2VzUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBSdW50aW1lUHJlZmVyZW5jZVBhZ2UoKSB7CisJCXN1cGVyKCk7CisJCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZSB0aGUgcHJlZmVyZW5jZSBvcHRpb25zLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOworCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUwpOworCQkKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNCk7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKKwkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmZXJlbmNlUnVudGltZXNEZXNjcmlwdGlvbik7CisJCQorCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7CisJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZmVyZW5jZVJ1bnRpbWVzVGFibGUpOworCQkKKwkJZmluYWwgUnVudGltZUNvbXBvc2l0ZSBydW50aW1lQ29tcCA9IG5ldyBSdW50aW1lQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUsIG5ldyBSdW50aW1lQ29tcG9zaXRlLlJ1bnRpbWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVTZWxlY3RlZChJUnVudGltZSBydW50aW1lKSB7CisJCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgeworCQkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCXBhdGhMYWJlbC5zZXRUZXh0KCIiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWUudmFsaWRhdGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7CisJCQkJCQlDb2xvciBjID0gcGF0aExhYmVsLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKKwkJCQkJCXBhdGhMYWJlbC5zZXRGb3JlZ3JvdW5kKGMpOworCQkJCQkJcGF0aExhYmVsLnNldFRleHQoc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCQkJCX0gZWxzZSBpZiAocnVudGltZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKKwkJCQkJCXBhdGhMYWJlbC5zZXRGb3JlZ3JvdW5kKGVkaXQuZ2V0Rm9yZWdyb3VuZCgpKTsKKwkJCQkJCXBhdGhMYWJlbC5zZXRUZXh0KHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSArICIiKTsKKwkJCQkJfSBlbHNlCisJCQkJCQlwYXRoTGFiZWwuc2V0VGV4dCgiIik7CisJCQkJCQorCQkJCQlpZiAocnVudGltZS5pc1JlYWRPbmx5KCkpIHsKKwkJCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAocnVudGltZS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwpCisJCQkJCQkJZWRpdC5zZXRFbmFibGVkKFNlcnZlclVJUGx1Z2luLmhhc1dpemFyZEZyYWdtZW50KHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSk7CisJCQkJCQllbHNlCisJCQkJCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJCXJlbW92ZS5zZXRFbmFibGVkKHRydWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9KTsKKwkJcnVudGltZUNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOworCQkKKwkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQlidXR0b25Db21wLnNldExheW91dChsYXlvdXQpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOworCQlidXR0b25Db21wLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlCdXR0b24gYWRkID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuYWRkKTsKKwkJYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWlmIChzaG93V2l6YXJkKG51bGwpID09IFdpbmRvdy5DQU5DRUwpCisJCQkJCXJldHVybjsKKwkJCQlydW50aW1lQ29tcC5yZWZyZXNoKCk7CisJCQl9CisJCX0pOworCQkKKwkJZWRpdCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmVkaXQpOworCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOworCQllZGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lQ29tcC5nZXRTZWxlY3RlZFJ1bnRpbWUoKTsKKwkJCQlpZiAocnVudGltZSAhPSBudWxsKSB7CisJCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdvcmtpbmdDb3B5ID0gcnVudGltZS5jcmVhdGVXb3JraW5nQ29weSgpOworCQkJCQlpZiAoc2hvd1dpemFyZChydW50aW1lV29ya2luZ0NvcHkpICE9IFdpbmRvdy5DQU5DRUwpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJcnVudGltZUNvbXAucmVmcmVzaChydW50aW1lKTsKKwkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCS8vIGlnbm9yZQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCXJlbW92ZSA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnJlbW92ZSk7CisJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lQ29tcC5nZXRTZWxlY3RlZFJ1bnRpbWUoKTsKKwkJCQlpZiAocmVtb3ZlUnVudGltZShydW50aW1lKSkKKwkJCQkJcnVudGltZUNvbXAucmVtb3ZlKHJ1bnRpbWUpOworCQkJfQorCQl9KTsKKwkJCisJCUJ1dHRvbiBzZWFyY2ggPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zZWFyY2gpOworCQlkYXRhID0gKEdyaWREYXRhKSBzZWFyY2guZ2V0TGF5b3V0RGF0YSgpOworCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gOTsKKwkJc2VhcmNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXRyeSB7CisJCQkJCS8vIHNlbGVjdCBhIHRhcmdldCBkaXJlY3RvcnkgZm9yIHRoZSBzZWFyY2gKKwkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpcmVjdG9yeURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7CisJCQkJCWRpcmVjdG9yeURpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLmRpYWxvZ1J1bnRpbWVTZWFyY2hNZXNzYWdlKTsKKwkJCQkJZGlyZWN0b3J5RGlhbG9nLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nUnVudGltZVNlYXJjaFRpdGxlKTsKKworCQkJCQlTdHJpbmcgcGF0aFN0ciA9IGRpcmVjdG9yeURpYWxvZy5vcGVuKCk7CisJCQkJCWlmIChwYXRoU3RyID09IG51bGwpCisJCQkJCQlyZXR1cm47CisJCQkJCQorCQkJCQlmaW5hbCBJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aFN0cik7CisJCQkJCQorCQkJCQlmaW5hbCBQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKKwkJCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKGZhbHNlKTsKKwkJCQkJZGlhbG9nLnNldENhbmNlbGFibGUodHJ1ZSk7CisJCQkJCWRpYWxvZy5vcGVuKCk7CisJCQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGRpYWxvZy5nZXRQcm9ncmVzc01vbml0b3IoKTsKKwkJCQkJZmluYWwgSVJ1bnRpbWVMb2NhdG9yW10gbG9jYXRvcnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0UnVudGltZUxvY2F0b3JzKCk7CisJCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmRpYWxvZ1J1bnRpbWVTZWFyY2hQcm9ncmVzcywgMTAwICogbG9jYXRvcnMubGVuZ3RoICsgMTApOworCQkJCQlmaW5hbCBMaXN0PElSdW50aW1lV29ya2luZ0NvcHk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lV29ya2luZ0NvcHk+KCk7CisJCQkJCQorCQkJCQlmaW5hbCBJUnVudGltZUxvY2F0b3IuSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJUnVudGltZUxvY2F0b3IuSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lcigpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVGb3VuZChmaW5hbCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUpIHsKKwkJCQkJCQlkaWFsb2cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQltb25pdG9yLnN1YlRhc2socnVudGltZS5nZXROYW1lKCkpOworCQkJCQkJCQl9CisJCQkJCQkJfSk7CisJCQkJCQkJbGlzdC5hZGQocnVudGltZSk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJCQorCQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIpIHsKKwkJCQkJCQlpbnQgc2l6ZSA9IGxvY2F0b3JzLmxlbmd0aDsKKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkJCQlpZiAoIW1vbml0b3IyLmlzQ2FuY2VsZWQoKSkKKwkJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQkJbG9jYXRvcnNbaV0uc2VhcmNoRm9yUnVudGltZXMocGF0aCwgbGlzdGVuZXIsIG1vbml0b3IyKTsKKwkJCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgbG9jYXRpbmcgcnVudGltZXM6ICIgKyBsb2NhdG9yc1tpXS5nZXRJZCgpLCBjZSk7CisJCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sICJEb25lIHNlYXJjaCIpOworCQkJCQkJfQorCQkJCQl9OworCQkJCQlkaWFsb2cucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKKwkJCQkJCisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiRm91bmQgcnVudGltZXM6ICIgKyBsaXN0LnNpemUoKSk7CisJCQkJCQorCQkJCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKKwkJCQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuaW5mb05vUnVudGltZXNGb3VuZCk7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQkJbW9uaXRvci53b3JrZWQoNSk7CisJCQkJCQkvLyByZW1vdmUgZHVwbGljYXRlcyBmcm9tIGxpc3QgKGJhc2VkIG9uIGxvY2F0aW9uKQorCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJSZW1vdmluZyBkdXBsaWNhdGVzIik7CisJCQkJCQlMaXN0PElSdW50aW1lPiBnb29kID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKKwkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yMiA9IGxpc3QuaXRlcmF0b3IoKTsKKwkJCQkJCXdoaWxlIChpdGVyYXRvcjIuaGFzTmV4dCgpKSB7CisJCQkJCQkJYm9vbGVhbiBkdXAgPSBmYWxzZTsKKwkJCQkJCQlJUnVudGltZSB3YyA9IChJUnVudGltZSkgaXRlcmF0b3IyLm5leHQoKTsKKwkJCQkJCQkKKwkJCQkJCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOworCQkJCQkJCWlmIChydW50aW1lcyAhPSBudWxsKSB7CisJCQkJCQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOworCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkJCQkJaWYgKHJ1bnRpbWVzW2ldLmdldExvY2F0aW9uKCkgIT0gbnVsbCAmJiBydW50aW1lc1tpXS5nZXRMb2NhdGlvbigpLmVxdWFscyh3Yy5nZXRMb2NhdGlvbigpKSkKKwkJCQkJCQkJCQlkdXAgPSB0cnVlOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmICghZHVwKQorCQkJCQkJCQlnb29kLmFkZCh3Yyk7CisJCQkJCQl9CisJCQkJCQltb25pdG9yLndvcmtlZCg1KTsKKwkJCQkJCQorCQkJCQkJLy8gYWRkIHRvIGxpc3QKKwkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQWRkaW5nIHJ1bnRpbWVzOiAiICsgZ29vZC5zaXplKCkpOworCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnb29kLml0ZXJhdG9yKCk7CisJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCQkJd2Muc2F2ZShmYWxzZSwgbW9uaXRvcik7CisJCQkJCQl9CisJCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQkJfQorCQkJCQlkaWFsb2cuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZmluZGluZyBydW50aW1lcyIsIGV4KTsKKwkJCQl9CisJCQkJcnVudGltZUNvbXAucmVmcmVzaCgpOworCQkJfQorCQl9KTsKKwkJCisJCXBhdGhMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKKwkJcGF0aExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQkKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOworCQorCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKKwkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQkvLyBjaGVjayBmb3IgdXNlCisJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CisJCUxpc3Q8SVNlcnZlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlcj4oKTsKKwkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJaWYgKHJ1bnRpbWUuZXF1YWxzKHNlcnZlcnNbaV0uZ2V0UnVudGltZSgpKSkKKwkJCQkJbGlzdC5hZGQoc2VydmVyc1tpXSk7CisJCQl9CisJCX0KKwkJCisJCWJvb2xlYW4gaW5Vc2UgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWluVXNlID0gRmFjZXRVdGlsLmlzUnVudGltZVRhcmdldGVkKHJ1bnRpbWUpOworCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJLy8gaWdub3JlIC0gZmFjZXQgZnJhbWV3b3JrIG5vdCBmb3VuZAorCQl9CisJCQorCQlpZiAoIWxpc3QuaXNFbXB0eSgpIHx8IGluVXNlKSB7CisJCQlEZWxldGVSdW50aW1lRGlhbG9nIGRpYWxvZyA9IG5ldyBEZWxldGVSdW50aW1lRGlhbG9nKGdldFNoZWxsKCksICFsaXN0LmlzRW1wdHkoKSwgaW5Vc2UpOworCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gMCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJCWlmIChkaWFsb2cuaXNEZWxldGVTZXJ2ZXJzKCkpIHsKKwkJCQlJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOworCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCQl0cnkgeworCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgaXRlci5uZXh0KCk7CisJCQkJCQlzZXJ2ZXIuZGVsZXRlKCk7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBkZWxldGluZyBzZXJ2ZXIiLCBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChkaWFsb2cuaXNSZW1vdmVUYXJnZXRzKCkpIHsKKwkJCQl0cnkgeworCQkJCQlGYWNldFV0aWwucmVtb3ZlVGFyZ2V0cyhydW50aW1lLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCQkvLyBpZ25vcmUgLSBmYWNldCBmcmFtZXdvcmsgbm90IGZvdW5kCisJCQkJfQorCQkJfQorCQl9CisJCQorCQl0cnkgeworCQkJcnVudGltZS5kZWxldGUoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGRlbGV0aW5nIHJ1bnRpbWUiLCBlKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHJvdGVjdGVkIGludCBzaG93V2l6YXJkKGZpbmFsIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdvcmtpbmdDb3B5KSB7CisJCVN0cmluZyB0aXRsZSA9IG51bGw7CisJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbnVsbDsKKwkJVGFza01vZGVsIHRhc2tNb2RlbCA9IG5ldyBUYXNrTW9kZWwoKTsKKwkJaWYgKHJ1bnRpbWVXb3JraW5nQ29weSA9PSBudWxsKSB7CisJCQl0aXRsZSA9IE1lc3NhZ2VzLndpek5ld1J1bnRpbWVXaXphcmRUaXRsZTsKKwkJCWZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgeworCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKKwkJCQkJbGlzdC5hZGQobmV3IE5ld1J1bnRpbWVXaXphcmRGcmFnbWVudCgpKTsKKwkJCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVJ1bnRpbWVGcmFnbWVudCk7CisJCQkJfQorCQkJfTsKKwkJfSBlbHNlIHsKKwkJCXRpdGxlID0gTWVzc2FnZXMud2l6RWRpdFJ1bnRpbWVXaXphcmRUaXRsZTsKKwkJCWZpbmFsIFdpemFyZEZyYWdtZW50IGZyYWdtZW50MiA9IFNlcnZlclVJUGx1Z2luLmdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWVXb3JraW5nQ29weS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOworCQkJaWYgKGZyYWdtZW50MiA9PSBudWxsKSB7CisJCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQlyZXR1cm4gV2luZG93LkNBTkNFTDsKKwkJCX0KKwkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZVdvcmtpbmdDb3B5KTsKKwkJCWZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgeworCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKKwkJCQkJbGlzdC5hZGQoZnJhZ21lbnQyKTsKKwkJCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVJ1bnRpbWVGcmFnbWVudCk7CisJCQkJfQorCQkJfTsKKwkJfQorCQlUYXNrV2l6YXJkIHdpemFyZCA9IG5ldyBUYXNrV2l6YXJkKHRpdGxlLCBmcmFnbWVudCwgdGFza01vZGVsKTsKKwkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKKwkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKKwkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7CisJfQorCisJcHJvdGVjdGVkIElSdW50aW1lIGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwyOworCQlyZXR1cm4gKElSdW50aW1lKSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgdXNpbmcgdGhlIHBhc3NlZCB3b3JrYmVuY2guCisJICoKKwkgKiBAcGFyYW0gd29ya2JlbmNoIHRoZSBjdXJyZW50IHdvcmtiZW5jaAorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7IAorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJaWYgKHZpc2libGUpCisJCQlzZXRUaXRsZShNZXNzYWdlcy5wcmVmZXJlbmNlUnVudGltZXNUaXRsZUxvbmcpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3NDljZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKKy8qKgorICogU1dUIFV0aWxpdHkgY2xhc3MuCisgKi8KK3B1YmxpYyBjbGFzcyBTV1RVdGlsIHsKKwlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgeworCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCisJCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKKwkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOworCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7CisJCWdjLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgeworCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7CisJCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBidXR0b24gd2l0aCB0aGUgc3RhbmRhcmQgc2l6ZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29tcCB0aGUgY29tcG9uZW50IHRvIGFkZCB0aGUgYnV0dG9uIHRvCisJICogQHBhcmFtIGxhYmVsIHRoZSBidXR0b24gbGFiZWwKKwkgKiBAcmV0dXJuIGEgYnV0dG9uCisJICovCisJcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgbGFiZWwpIHsKKwkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKKwkJYi5zZXRUZXh0KGxhYmVsKTsKKwkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCisJCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJZGF0YS53aWR0aEhpbnQgPSBnZXRCdXR0b25XaWR0aEhpbnQoYik7CisJCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJcmV0dXJuIGI7CisJfQorCQorCS8qKgorCSAqIENvbnZlcnQgRExVcyB0byBwaXhlbHMuCisJICogCisJICogQHBhcmFtIGNvbXAgYSBjb21wb25lbnQKKwkgKiBAcGFyYW0geCBwaXhlbHMKKwkgKiBAcmV0dXJuIGRsdXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhDb21wb3NpdGUgY29tcCwgaW50IHgpIHsKKwkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCisJCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcCk7CisJCXJldHVybiBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsIHgpOworCX0KKworCS8qKgorCSAqIENvbnZlcnQgRExVcyB0byBwaXhlbHMuCisJICogCisJICogQHBhcmFtIGNvbXAgYSBjb21wb25lbnQKKwkgKiBAcGFyYW0geSBwaXhlbHMKKwkgKiBAcmV0dXJuIGRsdXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoQ29tcG9zaXRlIGNvbXAsIGludCB5KSB7CisJCWlmIChmb250TWV0cmljcyA9PSBudWxsKQorCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOworCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgeSk7CisJfQorCisJLyoqCisJICogU2V0IHRoZSB0b29sdGlwIG9mIGEgc3Bpbm5lciB0aGF0IHJlcHJlc2VudHMgYSB0aW1lIGluIHNlY29uZHMuCisJICogCisJICogQHBhcmFtIHNwaW5uZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3Bpbm5lclRvb2x0aXAoU3Bpbm5lciBzcGlubmVyKSB7CQkKKwkJaW50IHNlY29uZHMgPSBzcGlubmVyLmdldFNlbGVjdGlvbigpOworCQlTdHJpbmcgdG9vbHRpcFRleHQ7CisJCWlmIChzZWNvbmRzIDw9IDYwKQorCQkJdG9vbHRpcFRleHQgPSBudWxsOworCQllbHNlIGlmICgoc2Vjb25kcyAlIDYwKSA9PSAwKSB7IC8vIHRoZSBzZWNvbmRzIGFyZSBleGFjdCBtaW51dGVzCisJCQlpbnQgbWludXRlcyA9IHNlY29uZHMgLyA2MDsKKwkJCXRvb2x0aXBUZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMubWludXRlcywgbWludXRlcyArICIiKTsKKwkJfSBlbHNlIHsKKwkJCWludCBtaW51dGVzID0gc2Vjb25kcyAvIDYwOworCQkJaW50IG1vZFNlYyA9IChzZWNvbmRzICUgNjApOworCQkJU3RyaW5nIHNlY29uZHNUZXh0ID0gKG1vZFNlYyA8IDEwKSA/ICIwIiArIG1vZFNlYyA6IEludGVnZXIudG9TdHJpbmcobW9kU2VjKTsgCisJCQl0b29sdGlwVGV4dCA9IE5MUy5iaW5kKE1lc3NhZ2VzLm1pbnV0ZXMsIG1pbnV0ZXMgKyAiOiIgKyBzZWNvbmRzVGV4dCk7CisJCX0KKwkJc3Bpbm5lci5zZXRUb29sVGlwVGV4dCh0b29sdGlwVGV4dCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjYxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKKy8qKgorICogQWRhcHRlciBmYWN0b3J5IHRvIGFkYXB0IHNlcnZlcnMgdG8gSUFjdGlvbkZpbHRlci4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKKwlJQWN0aW9uRmlsdGVyIGFjdGlvbkZpbHRlciA9IG5ldyBJQWN0aW9uRmlsdGVyKCkgeworCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlKE9iamVjdCB0YXJnZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKwkJCXJldHVybiBTZXJ2ZXJQcm9wZXJ0eVRlc3Rlci5jaGVja1Byb3BlcnR5KHRhcmdldCwgbmFtZSwgdmFsdWUpOworCQl9CisJfTsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCisJICovCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCWlmIChhZGFwdGVyVHlwZSA9PSBJQWN0aW9uRmlsdGVyLmNsYXNzKQorCQkJcmV0dXJuIGFjdGlvbkZpbHRlcjsKKwkJCisJCWlmIChhZGFwdGVyVHlwZSA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykKKwkJCXJldHVybiBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOworCQkJCisJCXJldHVybiBudWxsOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQorCSAqLworCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgeworCQlyZXR1cm4gbmV3IENsYXNzW10geyBJQWN0aW9uRmlsdGVyLmNsYXNzIH07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q3NDFkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXI7CisvKioKKyAqIEEgbGFiZWwgcHJvdmlkZXIgZm9yIGFsbCBzZXJ2ZXIgcmVsYXRlZCBvYmplY3RzLgorICovCitwdWJsaWMgY2xhc3MgU2VydmVyTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyLCBJQ29sb3JQcm92aWRlciwgSVdvcmtiZW5jaEFkYXB0ZXIgeworCXByaXZhdGUgSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcjsKKwlwcm90ZWN0ZWQgdHJhbnNpZW50IExpc3Q8SUxhYmVsUHJvdmlkZXJMaXN0ZW5lcj4gbGlzdGVuZXJzOworCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIHByb3ZpZGVyTGlzdGVuZXI7CisKKwlwdWJsaWMgU2VydmVyTGFiZWxQcm92aWRlcigpIHsKKwkJZGVjb3JhdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKTsKKwkJcHJvdmlkZXJMaXN0ZW5lciA9IG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCWZpcmVMaXN0ZW5lcihldmVudCk7CisJCQl9CisJCX07CisJCWRlY29yYXRvci5hZGRMaXN0ZW5lcihwcm92aWRlckxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWlmIChsaXN0ZW5lciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKKwkJCisJCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKKwkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SUxhYmVsUHJvdmlkZXJMaXN0ZW5lcj4oKTsKKwkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7CisJCQorCQlpZiAobGlzdGVuZXJzICE9IG51bGwpCisJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlTGlzdGVuZXIoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgeworCQlpZiAobGlzdGVuZXJzID09IG51bGwgfHwgbGlzdGVuZXJzLmlzRW1wdHkoKSkKKwkJCXJldHVybjsKKwkJCisJCWludCBzaXplID0gbGlzdGVuZXJzLnNpemUoKTsKKwkJSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcltdIHNybCA9IG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyW3NpemVdOworCQlsaXN0ZW5lcnMudG9BcnJheShzcmwpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJc3JsW2ldLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIiAgRXJyb3IgZmlyaW5nIGxhYmVsIGNoYW5nZSBldmVudCB0byAiICsgc3JsW2ldLCBlKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBJbWFnZSBnZXRNb2R1bGVJbWFnZShTdHJpbmcgdHlwZUlkKSB7CisJCWlmICh0eXBlSWQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCUltYWdlIGltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZSh0eXBlSWQpOworCQlpbnQgaW5kID0gdHlwZUlkLmluZGV4T2YoIi4iKTsKKwkJd2hpbGUgKGltYWdlID09IG51bGwgJiYgaW5kID49IDApIHsKKwkJCXR5cGVJZCA9IHR5cGVJZC5zdWJzdHJpbmcoMCwgaW5kKTsKKwkJCWltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZSh0eXBlSWQpOworCQl9CisJCXJldHVybiBpbWFnZTsKKwl9CisKKwlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldE1vZHVsZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgdHlwZUlkKSB7CisJCWlmICh0eXBlSWQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IodHlwZUlkKTsKKwkJaW50IGluZCA9IHR5cGVJZC5pbmRleE9mKCIuIik7CisJCXdoaWxlIChpbWFnZSA9PSBudWxsICYmIGluZCA+PSAwKSB7CisJCQl0eXBlSWQgPSB0eXBlSWQuc3Vic3RyaW5nKDAsIGluZCk7CisJCQlpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHR5cGVJZCk7CisJCX0KKwkJcmV0dXJuIGltYWdlOworCX0KKworCS8qCisJICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCisJICovCisJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IGVsZW1lbnQpIHsKKwkJdHJ5IHsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWVUeXBlKSB7CisJCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gKElSdW50aW1lVHlwZSkgZWxlbWVudDsKKwkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IocnVudGltZVR5cGUuZ2V0SWQoKSk7CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZSkgeworCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7CisJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKKwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSB7CisJCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IChJU2VydmVyVHlwZSkgZWxlbWVudDsKKwkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3Ioc2VydmVyVHlwZS5nZXRJZCgpKTsKKwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKwkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OworCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZSkgeworCQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGVsZW1lbnQ7CisJCQkJSU1vZHVsZVR5cGUgbXQgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOworCQkJCXJldHVybiBnZXRNb2R1bGVJbWFnZURlc2NyaXB0b3IobXQuZ2V0SWQoKSk7CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlW10pIHsKKwkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IChJTW9kdWxlW10pIGVsZW1lbnQ7CisJCQkJSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07CisJCQkJSU1vZHVsZVR5cGUgbXQgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOworCQkJCXJldHVybiBnZXRNb2R1bGVJbWFnZURlc2NyaXB0b3IobXQuZ2V0SWQoKSk7CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya2JlbmNoQWRhcHRlcikgeworCQkJCXJldHVybiAoKElXb3JrYmVuY2hBZGFwdGVyKSBlbGVtZW50KS5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZ2V0IGltYWdlIGRlc2NyaXB0b3IiLCBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIEltYWdlIGRlY29yYXRlKEltYWdlIGltYWdlLCBPYmplY3Qgb2JqKSB7CisJCUltYWdlIGRlYyA9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBvYmopOworCQlpZiAoZGVjICE9IG51bGwpCisJCQlyZXR1cm4gZGVjOworCQlyZXR1cm4gaW1hZ2U7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZGVjb3JhdGUoU3RyaW5nIHRleHQsIE9iamVjdCBvYmopIHsKKwkJU3RyaW5nIGRlYyA9IGRlY29yYXRvci5kZWNvcmF0ZVRleHQodGV4dCwgb2JqKTsKKwkJaWYgKGRlYyAhPSBudWxsKQorCQkJcmV0dXJuIGRlYzsKKwkJcmV0dXJuIHRleHQ7CisJfQorCisJLyoKKwkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJdHJ5IHsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWVUeXBlKSB7CisJCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gKElSdW50aW1lVHlwZSkgZWxlbWVudDsKKwkJCQlyZXR1cm4gZGVjb3JhdGUoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lVHlwZS5nZXRJZCgpKSwgcnVudGltZVR5cGUpOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWUpIHsKKwkJCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OworCQkJCXJldHVybiBkZWNvcmF0ZShJbWFnZVJlc291cmNlLmdldEltYWdlKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSwgcnVudGltZSk7CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkgeworCQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSAoSVNlcnZlclR5cGUpIGVsZW1lbnQ7CisJCQkJcmV0dXJuIGRlY29yYXRlKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2Uoc2VydmVyVHlwZS5nZXRJZCgpKSwgc2VydmVyVHlwZSk7CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7CisJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKKwkJCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSA9PSBudWxsKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkKKwkJCQlyZXR1cm4gZGVjb3JhdGUoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpLCBzZXJ2ZXIpOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZSkgeworCQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGVsZW1lbnQ7CisJCQkJSU1vZHVsZVR5cGUgbXQgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOworCQkJCWlmIChtdCA9PSBudWxsKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkKKwkJCQlyZXR1cm4gZGVjb3JhdGUoZ2V0TW9kdWxlSW1hZ2UobXQuZ2V0SWQoKSksIG1vZHVsZSk7CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlW10pIHsKKwkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IChJTW9kdWxlW10pIGVsZW1lbnQ7CisJCQkJSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07CisJCQkJSU1vZHVsZVR5cGUgbXQgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOworCQkJCWlmIChtdCA9PSBudWxsKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkKKwkJCQlyZXR1cm4gZGVjb3JhdGUoZ2V0TW9kdWxlSW1hZ2UobXQuZ2V0SWQoKSksIG1vZHVsZXMpOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisJCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKKwkJCQlJTW9kdWxlIG1vZHVsZSA9IG1zLm1vZHVsZVttcy5tb2R1bGUubGVuZ3RoIC0gMV07CisJCQkJSU1vZHVsZVR5cGUgbXQgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOworCQkJCWlmIChtdCA9PSBudWxsKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkKKwkJCQlyZXR1cm4gZGVjb3JhdGUoZ2V0TW9kdWxlSW1hZ2UobXQuZ2V0SWQoKSksIG1zKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgaW1hZ2UgZGVzY3JpcHRvciIsIGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBzKSB7CisJCWlmIChzID09IG51bGwpCisJCQlyZXR1cm4gIiI7CisJCQorCQlyZXR1cm4gczsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChPYmplY3QpCisJICovCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50ID09IG51bGwpCisJCQlyZXR1cm4gIiI7CisJCQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lKSB7CisJCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OworCQkJcmV0dXJuIGRlY29yYXRlKGdldFN0cmluZygocnVudGltZSkuZ2V0TmFtZSgpKSwgcnVudGltZSk7CisJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKwkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7CisJCQlyZXR1cm4gZGVjb3JhdGUoZ2V0U3RyaW5nKChzZXJ2ZXIpLmdldE5hbWUoKSksIHNlcnZlcik7CisJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgeworCQkJSVJ1bnRpbWVUeXBlIHJ0ID0gKElSdW50aW1lVHlwZSkgZWxlbWVudDsKKwkJCXJldHVybiBkZWNvcmF0ZShydC5nZXROYW1lKCksIHJ0KTsKKwkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKKwkJCUlTZXJ2ZXJUeXBlIHN0ID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OworCQkJcmV0dXJuIGRlY29yYXRlKHN0LmdldE5hbWUoKSwgc3QpOworCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2xpZW50KSB7CisJCQlJQ2xpZW50IGNsaWVudCA9IChJQ2xpZW50KSBlbGVtZW50OworCQkJcmV0dXJuIGRlY29yYXRlKGNsaWVudC5nZXROYW1lKCksIGNsaWVudCk7CisJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKKwkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGVsZW1lbnQ7CisJCQlyZXR1cm4gZGVjb3JhdGUobW9kdWxlLmdldE5hbWUoKSwgbW9kdWxlKTsKKwkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZVtdKSB7CisJCQlJTW9kdWxlW10gbW9kdWxlcyA9IChJTW9kdWxlW10pIGVsZW1lbnQ7CisJCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlcy5sZW5ndGggLSAxXTsKKwkJCXJldHVybiBkZWNvcmF0ZShtb2R1bGUuZ2V0TmFtZSgpLCBtb2R1bGVzKTsKKwkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OworCQkJSU1vZHVsZSBtb2R1bGUgPSBtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aCAtIDFdOworCQkJcmV0dXJuIGRlY29yYXRlKG1vZHVsZS5nZXROYW1lKCksIG1zKTsKKwkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtiZW5jaEFkYXB0ZXIpIHsKKwkJCXJldHVybiAoKElXb3JrYmVuY2hBZGFwdGVyKSBlbGVtZW50KS5nZXRMYWJlbChudWxsKTsKKwkJfQorCQkKKwkJcmV0dXJuICIiOworCX0KKworCS8qCisJICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWRlY29yYXRvci5yZW1vdmVMaXN0ZW5lcihwcm92aWRlckxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCkgewkJCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKWVsZW1lbnQ7CisJCQkKKwkJCUlNb2R1bGUgbW9kdWxlID0gbXMubW9kdWxlWzBdOworCQkJaWYgKG1vZHVsZS5pc0V4dGVybmFsKCkpIHsKKwkJCQlDb2xvciBjID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpOworCQkJCXJldHVybiBjOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgeyAKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgeworCQlyZXR1cm4gZ2V0VGV4dChvKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyTGF1bmNoU2hvcnRjdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhdW5jaFNob3J0Y3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwNTA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhdW5jaFNob3J0Y3V0LmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaFNob3J0Y3V0MjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNlcnZlckxhdW5jaFNob3J0Y3V0IGltcGxlbWVudHMgSUxhdW5jaFNob3J0Y3V0MiB7CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgSUxhdW5jaFNob3J0Y3V0I2xhdW5jaChJU2VsZWN0aW9uLCBTdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgbGF1bmNoKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBmaW5hbCBTdHJpbmcgbW9kZSkgeworCQlSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIHJvcyA9IG5ldyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCk7CisJCXJvcy5zZXRMYXVuY2hNb2RlKG1vZGUpOworCQlJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7CisJCQkvLyBkdW1teSBhY3Rpb24KKwkJfTsKKwkJcm9zLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBzZWxlY3Rpb24pOworCQlyb3MucnVuKGFjdGlvbik7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgSUxhdW5jaFNob3J0Y3V0I2xhdW5jaChJRWRpdG9yUGFydCwgU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIGxhdW5jaChJRWRpdG9yUGFydCBlZGl0b3IsIFN0cmluZyBtb2RlKSB7CisJCWlmIChlZGl0b3IgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCS8vIGNoZWNrIGlmIHRoZSBlZGl0b3IgaW5wdXQgaXRzZWxmIGNhbiBiZSBydW4uIE90aGVyd2lzZSwgY2hlY2sgaWYKKwkJLy8gdGhlIGVkaXRvciBoYXMgYSBmaWxlIGlucHV0IHRoYXQgY2FuIGJlIHJ1bgorCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKKwkJCisJCWlmIChTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoaW5wdXQpKSB7CisJCQlsYXVuY2gobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5wdXQpLCBtb2RlKTsKKwkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKKwkJCUlGaWxlRWRpdG9ySW5wdXQgZmVpID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OworCQkJSUZpbGUgZmlsZSA9IGZlaS5nZXRGaWxlKCk7CisJCQlpZiAoU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGZpbGUpKQorCQkJCWxhdW5jaChuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWxlKSwgbW9kZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIDxjb2RlPklTZWxlY3Rpb248L2NvZGU+IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgb2YgCisJICogPGNvZGU+SUxhdW5jaENvbmZpZ3VyYXRpb248L2NvZGU+cyB0aGF0IGFwcGx5IHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgCisJICogaS5lLiBhbGwgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9ucyB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gbGF1bmNoIHRoZSBnaXZlbiAKKwkgKiBzZWxlY3Rpb24uCisJICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24KKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPklMYXVuY2hDb25maWd1cmF0aW9uPC9jb2RlPnMgdGhhdCBjb3VsZCBiZSAKKwkgKiB1c2VkIHRvIGxhdW5jaCB0aGUgZ2l2ZW4gc2VsZWN0aW9uLCBvciBhbiBlbXB0eSBhcnJheSwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBnZXRMYXVuY2hDb25maWd1cmF0aW9ucyhJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlyZXR1cm4gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uWzBdOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIElMYXVuY2hTaG9ydGN1dDIjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoSUVkaXRvclBhcnQpCisJICovCisJcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uW10gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoSUVkaXRvclBhcnQgZWRpdG9yKSB7CisJCWlmIChlZGl0b3IgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25bMF07CisJCQorCQkvLyBjaGVjayBpZiB0aGUgZWRpdG9yIGlucHV0IGl0c2VsZiBjYW4gYmUgcnVuLiBPdGhlcndpc2UsIGNoZWNrIGlmCisJCS8vIHRoZSBlZGl0b3IgaGFzIGEgZmlsZSBpbnB1dCB0aGF0IGNhbiBiZSBydW4KKwkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7CisJCQorCQlpZiAoU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGlucHV0KSkgeworCQkJcmV0dXJuIGdldExhdW5jaENvbmZpZ3VyYXRpb25zKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGlucHV0KSk7CisJCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7CisJCQlJRmlsZUVkaXRvcklucHV0IGZlaSA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKKwkJCUlGaWxlIGZpbGUgPSBmZWkuZ2V0RmlsZSgpOworCQkJaWYgKFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChmaWxlKSkKKwkJCQlyZXR1cm4gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsZSkpOworCQl9CisJCXJldHVybiBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25bMF07CisJfQorCisJLyoqCisJICogR2l2ZW4gdGhlIHNwZWNpZmllZCA8Y29kZT5JU2VsZWN0aW9uPC9jb2RlPiB0aGlzIG1ldGhvZCByZXR1cm5zIGFuCisJICogPGNvZGU+SVJlc291cmNlPC9jb2RlPiB0aGF0IGRpcmVjdGx5IG1hcHMgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorCSAqIFRoaXMgbWFwcGluZyBpcyB0aGVuIGxldmVyYWdlZCBieSB0aGUgY29udGV4dCBsYXVuY2hpbmcgZnJhbWV3b3JrCisJICogdG8gdHJ5IGFuZCBsYXVuY2ggdGhlIHJlc291cmNlLiAKKwkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbgorCSAqIEByZXR1cm4gYW4gPGNvZGU+SVJlc291cmNlPC9jb2RlPiB0aGF0IHdvdWxkIGJlIHVzZWQgZHVyaW5nIGNvbnRleHQKKwkgKiBzZW5zaXRpdmUgbGF1bmNoaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG9uZSBpcyBub3QgdG8gYmUgcHJvdmlkZWQgb3IgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIElSZXNvdXJjZSBnZXRMYXVuY2hhYmxlUmVzb3VyY2UoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgSUxhdW5jaFNob3J0Y3V0MiNnZXRMYXVuY2hhYmxlUmVzb3VyY2UoSUVkaXRvclBhcnQpCisJICovCisJcHVibGljIElSZXNvdXJjZSBnZXRMYXVuY2hhYmxlUmVzb3VyY2UoSUVkaXRvclBhcnQgZWRpdG9yKSB7CisJCWlmIChlZGl0b3IgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJLy8gY2hlY2sgaWYgdGhlIGVkaXRvciBpbnB1dCBpdHNlbGYgY2FuIGJlIHJ1bi4gT3RoZXJ3aXNlLCBjaGVjayBpZgorCQkvLyB0aGUgZWRpdG9yIGhhcyBhIGZpbGUgaW5wdXQgdGhhdCBjYW4gYmUgcnVuCisJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOworCQkKKwkJaWYgKFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChpbnB1dCkpIHsKKwkJCXJldHVybiBnZXRMYXVuY2hhYmxlUmVzb3VyY2UobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5wdXQpKTsKKwkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKKwkJCUlGaWxlRWRpdG9ySW5wdXQgZmVpID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OworCQkJSUZpbGUgZmlsZSA9IGZlaS5nZXRGaWxlKCk7CisJCQlpZiAoU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGZpbGUpKQorCQkJCXJldHVybiBnZXRMYXVuY2hhYmxlUmVzb3VyY2UobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsZSkpOworCQl9CisJCXJldHVybiBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzIzMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUHJlZmVyZW5jZXM7CisvKioKKyAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBob2xkcyBzZXJ2ZXIgcHJvcGVydGllcy4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCXByb3RlY3RlZCBTZXJ2ZXJQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKKwlwcm90ZWN0ZWQgU2VydmVyVUlQcmVmZXJlbmNlcyB1aVByZWZlcmVuY2VzOworCisJcHJvdGVjdGVkIEJ1dHRvbiBzaG93T25BY3Rpdml0eTsKKworCS8qKgorCSAqIFNlcnZlclByZWZlcmVuY2VzUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBTZXJ2ZXJQcmVmZXJlbmNlUGFnZSgpIHsKKwkJc3VwZXIoKTsKKwkKKwkJcHJlZmVyZW5jZXMgPSBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpOworCQl1aVByZWZlcmVuY2VzID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlIHRoZSBwcmVmZXJlbmNlIG9wdGlvbnMuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAorCSAqLworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7CisJCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOworCQl3aHMuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMKTsKKwkJCisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDQpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJc2hvd09uQWN0aXZpdHkgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKKwkJc2hvd09uQWN0aXZpdHkuc2V0VGV4dChNZXNzYWdlcy5wcmVmU2hvd09uQWN0aXZpdHkpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOworCQlzaG93T25BY3Rpdml0eS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlzaG93T25BY3Rpdml0eS5zZXRTZWxlY3Rpb24odWlQcmVmZXJlbmNlcy5nZXRTaG93T25BY3Rpdml0eSgpKTsKKwkJd2hzLnNldEhlbHAoc2hvd09uQWN0aXZpdHksIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX1NIT1dfT05fQUNUSVZJVFkpOworCQkKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOworCQkKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSB1c2luZyB0aGUgcGFzc2VkIHdvcmtiZW5jaC4KKwkgKgorCSAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgeworCQlzaG93T25BY3Rpdml0eS5zZXRTZWxlY3Rpb24odWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0U2hvd09uQWN0aXZpdHkoKSk7CisJCQorCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCisJICovCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgeworCQl1aVByZWZlcmVuY2VzLnNldFNob3dPbkFjdGl2aXR5KHNob3dPbkFjdGl2aXR5LmdldFNlbGVjdGlvbigpKTsKKwkJCisJCXJldHVybiB0cnVlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcm9wZXJ0eVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5UGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTcxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcm9wZXJ0eVBhZ2UuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7CisvKioKKyAqIFByb3BlcnR5UGFnZSBmb3Igc2VydmVycy4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlclByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7CisJcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOworCisJcHJvdGVjdGVkIElTZXJ2ZXIgZGVmYXVsdFNlcnZlcjsKKworCS8qKgorCSAqIFNlcnZlclByb3BlcnR5UGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBTZXJ2ZXJQcm9wZXJ0eVBhZ2UoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIHRoZSBib2R5IG9mIHRoZSBwYWdlLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCXRyeSB7CisJCQlJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7CisJCQlzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudC5nZXRBZGFwdGVyKElTZXJ2ZXIuY2xhc3MpOworCQkJCisJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJCWxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJCQorCQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7CisJCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuU0VSVkVSX1BST1BFUlRZX1BBR0UpOwkJCQorCQkJCisJCQkvLyBuYW1lCisJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJvcFNlcnZlckluZm9OYW1lKTsKKwkJCQorCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCQlsYWJlbC5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOworCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJCisJCQkvLyB0eXBlCisJCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJvcFNlcnZlckluZm9UeXBlKTsKKwkJCQorCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7CisJCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCisJCQkJbGFiZWwuc2V0VGV4dChzZXJ2ZXJUeXBlLmdldE5hbWUoKSk7CisJCQllbHNlCisJCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWUpOworCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJCisJCQkvLyB2ZW5kb3IKKwkJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcm9wU2VydmVySW5mb1ZlbmRvcik7CisJCQkKKwkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IG51bGw7CisJCQlpZiAoc2VydmVyVHlwZSAhPSBudWxsKQorCQkJCXJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOworCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKKwkJCQlsYWJlbC5zZXRUZXh0KHJ1bnRpbWVUeXBlLmdldFZlbmRvcigpKTsKKwkJCWVsc2UKKwkJCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSk7CisJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQkKKwkJCS8vIGxvY2F0aW9uCisJCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuc3dpdGNoU2VydmVyTG9jYXRpb24pOworCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7CisJCQkKKwkJCWZpbmFsIExhYmVsIHNlcnZlckxvY2F0aW9uID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQkJZmluYWwgU2VydmVyIHN2ciA9IChTZXJ2ZXIpIHNlcnZlcjsKKwkJCWlmIChzdnIuZ2V0RmlsZSgpICE9IG51bGwpCisJCQkJc2VydmVyTG9jYXRpb24uc2V0VGV4dChzdnIuZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKKwkJCWVsc2UKKwkJCQlzZXJ2ZXJMb2NhdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLnN3aXRjaFNlcnZlckxvY2F0aW9uTWV0YWRhdGEpOworCQkJCisJCQlzZXJ2ZXJMb2NhdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKKwkJCQorCQkJQnV0dG9uIHN3aXRjaExvY2F0aW9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKKwkJCXN3aXRjaExvY2F0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3dpdGNoU2VydmVyTG9jYXRpb24pOworCQkJc3dpdGNoTG9jYXRpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKKwkJCXN3aXRjaExvY2F0aW9uLnNldEVuYWJsZWQoIXNlcnZlci5pc1JlYWRPbmx5KCkpOworCQkJc3dpdGNoTG9jYXRpb24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQl0cnkgeworCQkJCQkJU2VydmVyLnN3aXRjaExvY2F0aW9uKHN2ciwgbnVsbCk7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN3aXRjaGluZyBzZXJ2ZXIgbG9jYXRpb24iLCBjZSk7CisJCQkJCX0KKwkJCQkJaWYgKHN2ci5nZXRGaWxlKCkgIT0gbnVsbCkKKwkJCQkJCXNlcnZlckxvY2F0aW9uLnNldFRleHQoc3ZyLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSk7CisJCQkJCWVsc2UKKwkJCQkJCXNlcnZlckxvY2F0aW9uLnNldFRleHQoTWVzc2FnZXMuc3dpdGNoU2VydmVyTG9jYXRpb25NZXRhZGF0YSk7CisJCQkJfQorCQkJfSk7CisJCQkKKwkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKKwkJCQorCQkJcmV0dXJuIGNvbXBvc2l0ZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHByb3BlcnR5IHBhZ2UiLCBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgeworCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyUHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4NTNkMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5VGVzdGVyLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNlcnZlclByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgeworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSVByb3BlcnR5VGVzdGVyI3Rlc3QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7CisJCWlmIChleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQorCQkJcmV0dXJuIGNoZWNrUHJvcGVydHkocmVjZWl2ZXIsIHByb3BlcnR5LCAoU3RyaW5nKSBleHBlY3RlZFZhbHVlKTsKKwkJaWYgKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCkKKwkJCXJldHVybiBjaGVja1Byb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgZXhwZWN0ZWRWYWx1ZS50b1N0cmluZygpKTsKKwkJCisJCXJldHVybiBjaGVja1Byb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgbnVsbCk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNoZWNrUHJvcGVydHkoT2JqZWN0IHRhcmdldCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKCJpc1J1bm5hYmxlIi5lcXVhbHMocHJvcGVydHkpKSB7CisJCQkvLyBjaGVjayBpZiBwcm9qZWN0IGhhcyBhIG1vZHVsZSBhc3NvY2lhdGVkIHdpdGggaXQKKwkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworCQkJCUlNb2R1bGUgbSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKChJUHJvamVjdCkgdGFyZ2V0KTsKKwkJCQlpZiAobSA9PSBudWxsKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQkKKwkJCS8vIGNoZWNrIGZvciBydW5uYWJsZSBvYmplY3QKKwkJCWJvb2xlYW4gYiA9IFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdCh0YXJnZXQpOworCQkJaWYgKGIpCisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCS8qaWYgKCEocmVjZWl2ZXIgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQkvLwkgY2hlY2sgaWYgdGhlIGVkaXRvciBpbnB1dCBpdHNlbGYgY2FuIGJlIHJ1bi4gT3RoZXJ3aXNlLCBjaGVjayBpZgorCQkJLy8gdGhlIGVkaXRvciBoYXMgYSBmaWxlIGlucHV0IHRoYXQgY2FuIGJlIHJ1bgorCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gKElFZGl0b3JQYXJ0KSByZWNlaXZlcjsKKwkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOworCQkJCisJCQliID0gU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGlucHV0KTsKKwkJCWlmIChiKQorCQkJCXJldHVybiB0cnVlOyovCisJCQkKKwkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7CisJCQkJSUZpbGVFZGl0b3JJbnB1dCBmZWkgPSAoSUZpbGVFZGl0b3JJbnB1dCkgdGFyZ2V0OworCQkJCUlGaWxlIGZpbGUgPSBmZWkuZ2V0RmlsZSgpOworCQkJCWIgPSBTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoZmlsZSk7CisJCQkJaWYgKGIpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCJzZXJ2ZXJUeXBlIi5lcXVhbHMocHJvcGVydHkpKSB7CisJCQlJU2VydmVyIHNlcnZlciA9IG51bGw7CisJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVNlcnZlcikgeworCQkJCXNlcnZlciA9IChJU2VydmVyKSB0YXJnZXQ7CisJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgeworCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIHRhcmdldDsKKwkJCQlzZXJ2ZXIgPSBtcy5zZXJ2ZXI7CisJCQl9CisJCQlpZiAoc2VydmVyID09IG51bGwgfHwgc2VydmVyLmdldFNlcnZlclR5cGUoKSA9PSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJU3RyaW5nW10gdHlwZUlkcyA9IFNlcnZlclBsdWdpbi50b2tlbml6ZSh2YWx1ZSwgIiwiKTsKKwkJCXJldHVybiBtYXRjaGVzKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSwgdHlwZUlkcyk7CisJCX0gZWxzZSBpZiAoIm1vZHVsZVR5cGUiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKwkJCUlNb2R1bGVbXSBtb2R1bGUgPSBudWxsOworCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElNb2R1bGVbXSkgeworCQkJCW1vZHVsZSA9IChJTW9kdWxlW10pIHRhcmdldDsKKwkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSU1vZHVsZSkgeworCQkJCW1vZHVsZSA9IG5ldyBJTW9kdWxlW10geyhJTW9kdWxlKSB0YXJnZXR9OworCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKKwkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSB0YXJnZXQ7CisJCQkJbW9kdWxlID0gbXMubW9kdWxlOworCQkJfQorCQkJaWYgKG1vZHVsZSA9PSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWlmIChtb2R1bGUubGVuZ3RoID09IDApCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlTdHJpbmdbXSB2YWx1ZXMgPSBTZXJ2ZXJQbHVnaW4udG9rZW5pemUodmFsdWUsICIsIik7CisJCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOworCQkJcmV0dXJuIG1hdGNoZXMobS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSwgdmFsdWVzKTsKKwkJfSBlbHNlIGlmICgibW9kdWxlVmVyc2lvbiIuZXF1YWxzKHByb3BlcnR5KSkgeworCQkJSU1vZHVsZVtdIG1vZHVsZSA9IG51bGw7CisJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSU1vZHVsZVtdKSB7CisJCQkJbW9kdWxlID0gKElNb2R1bGVbXSkgdGFyZ2V0OworCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7CisJCQkJbW9kdWxlID0gbmV3IElNb2R1bGVbXSB7KElNb2R1bGUpIHRhcmdldH07CisJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgeworCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIHRhcmdldDsKKwkJCQltb2R1bGUgPSBtcy5tb2R1bGU7CisJCQl9CisJCQlpZiAobW9kdWxlID09IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKG1vZHVsZS5sZW5ndGggPT0gMCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJCVN0cmluZ1tdIHZhbHVlcyA9IFNlcnZlclBsdWdpbi50b2tlbml6ZSh2YWx1ZSwgIiwiKTsKKwkJCUlNb2R1bGUgbSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07CisJCQlyZXR1cm4gbWF0Y2hlcyhtLmdldE1vZHVsZVR5cGUoKS5nZXRWZXJzaW9uKCksIHZhbHVlcyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgKGdpdmVuIGJ5IHRoZSBpZCkgY2FuIHVzZSB0aGlzIGFjdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBpZCwgU3RyaW5nW10gdHlwZUlkcykgeworCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmICh0eXBlSWRzID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpbnQgc2l6ZSA9IHR5cGVJZHMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJaWYgKHR5cGVJZHNbaV0uZW5kc1dpdGgoIioiKSkgeworCQkJCWlmIChpZC5sZW5ndGgoKSA+PSB0eXBlSWRzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgodHlwZUlkc1tpXS5zdWJzdHJpbmcoMCwgdHlwZUlkc1tpXS5sZW5ndGgoKSAtIDEpKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgaWYgKGlkLmVxdWFscyh0eXBlSWRzW2ldKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclRvb2xUaXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclRvb2xUaXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTE2ZTVkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVG9vbFRpcC5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLnRleHQuaHRtbC5IVE1MMlRleHRSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5Ub29sVGlwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5JU2VydmVyTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlcnZlclRvb2xUaXA7CisKK3B1YmxpYyBjbGFzcyBTZXJ2ZXJUb29sVGlwIGV4dGVuZHMgVG9vbFRpcCB7CQorCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLEFycmF5TGlzdDxJU2VydmVyVG9vbFRpcD4+IHRvb2xUaXBQcm92aWRlcnMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxBcnJheUxpc3Q8SVNlcnZlclRvb2xUaXA+PigpOwkKKwlwcm90ZWN0ZWQgc3RhdGljIFNoZWxsIENVUlJFTlRfVE9PTFRJUDsKKwlwcm90ZWN0ZWQgTGFiZWwgaGludExhYmVsOworCXByb3RlY3RlZCBUcmVlIHRyZWU7CisJcHJvdGVjdGVkIGludCB4OworCXByb3RlY3RlZCBpbnQgeTsKKworCXB1YmxpYyBTZXJ2ZXJUb29sVGlwKGZpbmFsIFRyZWUgdHJlZSkgeworCQlzdXBlcih0cmVlKTsKKwkJCisJCXRoaXMudHJlZSA9IHRyZWU7CisJCQorCQl0cmVlLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKKwkJCQl4ID0gZS54OworCQkJCXkgPSBlLnk7CisJCQl9CisJCX0pOworCQkKKwkJdHJlZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50ICBlKSB7CisJCQkJaWYgKGUgPT0gbnVsbCkKKwkJCQkJcmV0dXJuOworCQkJCQorCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkVTQykgeworCQkJCQlpZiAoQ1VSUkVOVF9UT09MVElQICE9IG51bGwpIHsKKwkJCQkJCUNVUlJFTlRfVE9PTFRJUC5kaXNwb3NlKCk7CisJCQkJCQlDVVJSRU5UX1RPT0xUSVAgPSBudWxsOworCQkJCQl9CisJCQkJCWFjdGl2YXRlKCk7CisJCQkJfQorCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkY2KSB7CisJCQkJCWlmIChDVVJSRU5UX1RPT0xUSVAgPT0gbnVsbCkgeworCQkJCQkJZGVhY3RpdmF0ZSgpOworCQkJCQkJaGlkZSgpOworCQkJCQkJY3JlYXRlRm9jdXNlZFRvb2x0aXAodHJlZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKXsKKwkJCQkvLyBub3RoaW5nIHRvIGRvIAorCQkJfQorCQl9KTsKKwkJCisJCWxvYWRFeHRlbnNpb25zKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGNyZWF0ZUZvY3VzZWRUb29sdGlwKGZpbmFsIENvbnRyb2wgY29udHJvbCkgeworCQlmaW5hbCBTaGVsbCBzdGlja3lUb29sdGlwID0gbmV3IFNoZWxsKGNvbnRyb2wuZ2V0U2hlbGwoKSwgU1dULk9OX1RPUCB8IFNXVC5UT09MCisJCQkJfCBTV1QuTk9fRk9DVVMpOworCQlzdGlja3lUb29sdGlwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKKwkJc3RpY2t5VG9vbHRpcC5zZXRCYWNrZ3JvdW5kKHN0aWNreVRvb2x0aXAuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKKwkJCisJCWNvbnRyb2wuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKKwkJCQlldmVudC54ID0geDsKKwkJCQlldmVudC55ID0geTsKKwkJCQlldmVudC53aWRnZXQgPSB0cmVlOworCQkJCQorCQkJCWNyZWF0ZVRvb2xUaXBDb250ZW50QXJlYShldmVudCwgc3RpY2t5VG9vbHRpcCk7CisJCQkJc3RpY2t5VG9vbHRpcC5wYWNrKCk7CisJCQkJCisJCQkJc3RpY2t5VG9vbHRpcC5zZXRMb2NhdGlvbihzdGlja3lUb29sdGlwLmdldERpc3BsYXkoKS5nZXRDdXJzb3JMb2NhdGlvbigpKTsJCQkJCisJCQkJaGludExhYmVsLnNldFRleHQoTWVzc2FnZXMudG9vbFRpcERpc2FibGVGb2N1cyk7CisJCQkJc3RpY2t5VG9vbHRpcC5zZXRWaXNpYmxlKHRydWUpOworLy8JCQkJRXZlbnR1YWxseSB3ZSB3YW50IHRvIGFkZCBhIGxpc3RlbmVyIHRoYXQgY2hlY2tzIGlmCisvLyAgICAgICAgICAgICAgdGhlIG1vdXNlRG93biBldmVudCBpcyBvY2N1cnJpbmcgb3V0c2lkZSBvZiB0aGUgYm91bmRzIG9mIHRoZSB0b29sdGlwCisvLyAgICAgICAgICAgICAgaWYgaXQgaXMsIHRoZW4gaGlkZSB0aGUgdG9vbHRpcAorLy8JCQkJYWRkTGlzdGVuZXIoc3RpY2t5VG9vbHRpcCk7CisJCQl9CisJCX0pOworCQlDVVJSRU5UX1RPT0xUSVAgPSBzdGlja3lUb29sdGlwOworCX0KKworLy8gIHJlYWQgdGhlIGNyZWF0ZUZvY3VzZWRUb29sdGlwIG1ldGhvZCBmb3IgaW5mb3JtYXRpb24gb24gd2h5IHRoaXMgaXMgY29tbWVudGVkIG91dAorLy8KKy8vCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcihDb250cm9sIGNvbnRyb2wpeworLy8JCWNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcihuZXcgU3RpY2t5VGlwTW91c2VMaXN0ZW5lcigpKTsKKy8vCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbXBvc2l0ZSl7CisvLwkJCUNvbnRyb2xbXSBjaGlsZHJlbnMgPSAoKENvbXBvc2l0ZSljb250cm9sKS5nZXRDaGlsZHJlbigpOworLy8JCQlmb3IgKENvbnRyb2wgY2hpbGQgOmNoaWxkcmVucyl7CisvLwkJCQlhZGRMaXN0ZW5lcihjaGlsZCk7CisvLwkJCX0KKy8vCQl9CisvLwkJCisvLwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9iamVjdCBnZXRUb29sVGlwQXJlYShFdmVudCBldmVudCkgeworCQlPYmplY3QgbyA9IHRyZWUuZ2V0SXRlbShuZXcgUG9pbnQoZXZlbnQueCxldmVudC55KSk7CisJCXJldHVybiBvOworCX0KKworCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHNob3VsZENyZWF0ZVRvb2xUaXAoRXZlbnQgZXZlbnQpIHsKKwkJaWYgKHRyZWUuZ2V0SXRlbShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBzdXBlci5zaG91bGRDcmVhdGVUb29sVGlwKGV2ZW50KTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvb2xUaXBDb250ZW50QXJlYShFdmVudCBldmVudCwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlPYmplY3QgbyA9IHRyZWUuZ2V0SXRlbShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOworCQlpZiAobyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlJU2VydmVyIHNlcnZlciA9IG51bGw7CisJCUlTZXJ2ZXJNb2R1bGUgbW9kdWxlID0gbnVsbDsKKwkJaWYgKG8gaW5zdGFuY2VvZiBUcmVlSXRlbSkgeworCQkJT2JqZWN0IG9iaiA9ICgoVHJlZUl0ZW0pbykuZ2V0RGF0YSgpOworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpCisJCQkJc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyTW9kdWxlKQorCQkJCW1vZHVsZSA9IChJU2VydmVyTW9kdWxlKSBvYmo7CisJCX0KKwkJCisJCUZpbGxMYXlvdXQgbGF5b3V0ID0gKEZpbGxMYXlvdXQpcGFyZW50LmdldExheW91dCgpOworCQlsYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDsKKwkJcGFyZW50LnNldExheW91dChsYXlvdXQpOworCQkKKwkJLy8gc2V0IHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSB0b29sdGlwCisJCVN0eWxlZFRleHQgc1RleHQgPSBuZXcgU3R5bGVkVGV4dChwYXJlbnQsIFNXVC5OT05FKTsKKwkJc1RleHQuc2V0RWRpdGFibGUoZmFsc2UpOworCQlzVGV4dC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOworCQkKKwkJaWYgKG1vZHVsZSAhPSBudWxsKSB7CisJCQlJTW9kdWxlW10gbW9kdWxlcyA9IG1vZHVsZS5nZXRNb2R1bGUoKTsKKwkJCUlNb2R1bGUgbSA9IG1vZHVsZXNbbW9kdWxlcy5sZW5ndGggLSAxXTsKKwkJCXNUZXh0LnNldFRleHQoIjxiPiIgKyBtLmdldE5hbWUoKSArICI8L2I+Iik7CisJCQkvL3NUZXh0LnNldFRleHQoIjxiPiIgKyBtLmdldE5hbWUoKSArICI8L2I+PC9wPiIgKyBtLmdldE1vZHVsZVR5cGUoKS5nZXROYW1lKCkpOworCQkJCisJCQlTdHlsZWRUZXh0IHNUZXh0MiA9IG5ldyBTdHlsZWRUZXh0KHBhcmVudCwgU1dULk5PTkUpOworCQkJc1RleHQyLnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJCXNUZXh0Mi5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOworCQkJc1RleHQyLnNldFRleHQobS5nZXRNb2R1bGVUeXBlKCkuZ2V0TmFtZSgpKTsKKwkJfQorCQkKKwkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQlzVGV4dC5zZXRUZXh0KCI8Yj4iICsgc2VydmVyLmdldE5hbWUoKSArICI8L2I+Iik7CisJCQkKKwkJCS8vIGFkZCBhZG9wdGVycyBjb250ZW50CisJCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKSB7CisJCQkJQXJyYXlMaXN0PElTZXJ2ZXJUb29sVGlwPiBsaXN0T2ZQcm92aWRlcnMgPSB0b29sVGlwUHJvdmlkZXJzLmdldChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOworCQkJCQorCQkJCWZpbmFsIENvbXBvc2l0ZSBhZG9wdGVyc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKKwkJCQlhZG9wdGVyc0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7CisJCQkJYWRvcHRlcnNDb21wb3NpdGUuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKKwkJCQkKKwkJCQlpZiAobGlzdE9mUHJvdmlkZXJzICE9IG51bGwpIHsKKwkJCQkJZm9yIChJU2VydmVyVG9vbFRpcCB0aXBQcm92aWRlciA6IGxpc3RPZlByb3ZpZGVycykgeworCQkJCQkJdGlwUHJvdmlkZXIuY3JlYXRlQ29udGVudChhZG9wdGVyc0NvbXBvc2l0ZSxzZXJ2ZXIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvLyBhZGQgdGhlIEYzIHRleHQKKwkJaGludExhYmVsID0gbmV3IExhYmVsKHBhcmVudCxTV1QuQk9SREVSKTsKKwkJaGludExhYmVsLnNldEFsaWdubWVudChTV1QuUklHSFQpOworCQloaW50TGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKKwkJaGludExhYmVsLnNldFRleHQoTWVzc2FnZXMudG9vbFRpcEVuYWJsZUZvY3VzKTsKKwkJaGludExhYmVsLnNldEZvcmVncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkFZKSk7CisJCQorCQlmaW5hbCBGb250IGZvbnQ7CisJCURpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7CisJCUZvbnREYXRhW10gZmQgPSBwYXJlbnQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7CisJCWludCBzaXplMiA9IGZkLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKQorCQkJZmRbaV0uc2V0SGVpZ2h0KDcpOworCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQpOworCQlwYXJlbnQuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCWZvbnQuZGlzcG9zZSgpOworCQkJfQorCQl9KTsKKwkJaGludExhYmVsLnNldEZvbnQoZm9udCk7CisJCQorCQlwYXJzZVRleHQoc1RleHQuZ2V0VGV4dCgpLHNUZXh0KTsKKwkJCisJCXJldHVybiBwYXJlbnQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcGFyc2VUZXh0KFN0cmluZyBodG1sVGV4dCxTdHlsZWRUZXh0IHNUZXh0KSB7CQorCQlUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbiA9IG5ldyBUZXh0UHJlc2VudGF0aW9uKCk7CisJCUhUTUwyVGV4dFJlYWRlciByZWFkZXIgPSBuZXcgSFRNTDJUZXh0UmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoaHRtbFRleHQpLCBwcmVzZW50YXRpb24pOworCQlTdHJpbmcgdGV4dDsKKwkJCisJCXRyeSB7CisJCQl0ZXh0ID0gcmVhZGVyLmdldFN0cmluZygpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0ZXh0PSAiIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQlzVGV4dC5zZXRUZXh0KHRleHQpOwkJCisJCUl0ZXJhdG9yIGl0ZXIgPSBwcmVzZW50YXRpb24uZ2V0QWxsU3R5bGVSYW5nZUl0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJU3R5bGVSYW5nZSBzciA9IChTdHlsZVJhbmdlKWl0ZXIubmV4dCgpOworCQkJc1RleHQuc2V0U3R5bGVSYW5nZShzcik7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgbG9hZEV4dGVuc2lvbnMoKSB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIHNlcnZlclRvb2xUaXAgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOworCQkKKwkJLy8gc2VhcmNoIGZvciBleHRlbnNpb24gcG9pbnRzIAorCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZXh0ZW5zaW9ucyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZXJ2ZXJUb29sVGlwIik7CisJCQorCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOworCQkKKwkJZm9yIChpbnQgaT0wOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKyl7CQkJCisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZXhFbGVtZW50ID0gZXh0ZW5zaW9uc1tpXTsKKwkJCQorCQkJLy8gU29ydCB0aGUgZXh0ZW5zaW9ucyBiYXNlZCBvbiBzZXJ2ZXJUeXBlCisJCQlTdHJpbmcgZXhTZXJ2ZXJUeXBlID0gZXhFbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyVHlwZXMiKTsKKwkJCQorCQkJZm9yIChJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlIDogc2VydmVyVHlwZXMpIHsKKwkJCQlpZiAoZXhTZXJ2ZXJUeXBlLmNvbXBhcmVUbygiKiIpID09IDAgfHwgCisJCQkJCQlleFNlcnZlclR5cGUuc3RhcnRzV2l0aChzZXJ2ZXJUeXBlLmdldElkKCkpID09IHRydWUpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCUlTZXJ2ZXJUb29sVGlwIGV4VG9vbHRpcCA9IChJU2VydmVyVG9vbFRpcCkgZXhFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CisJCQkJCQlBcnJheUxpc3Q8SVNlcnZlclRvb2xUaXA+IGxpc3RPZlByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlclRvb2xUaXA+KCk7IAorCQkJCQkJaWYgKHRvb2xUaXBQcm92aWRlcnMuY29udGFpbnNLZXkoc2VydmVyVHlwZSkpIHsKKwkJCQkJCQlsaXN0T2ZQcm92aWRlcnMgPSB0b29sVGlwUHJvdmlkZXJzLmdldChzZXJ2ZXJUeXBlKTsKKwkJCQkJCX0KKwkJCQkJCWxpc3RPZlByb3ZpZGVycy5hZGQoZXhUb29sdGlwKTsKKwkJCQkJCXRvb2xUaXBQcm92aWRlcnMucHV0KHNlcnZlclR5cGUuZ2V0SWQoKSwgbGlzdE9mUHJvdmlkZXJzKTsKKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJUb29sdGlwIGZhaWxlZCB0byBsb2FkIiArIGV4dGVuc2lvbnNbaV0udG9TdHJpbmcoKSwgZSk7CisJCQkJCX0KKwkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgc2VydmVyVG9vbFRpcDogIiArIGV4dGVuc2lvbnNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKy8vICByZWFkIHRoZSBjcmVhdGVGb2N1c2VkVG9vbHRpcCBtZXRob2QgZm9yIGluZm9ybWF0aW9uIG9uIHdoeSB0aGlzIGlzIGNvbW1lbnRlZCBvdXQKKy8vCisvLwlwcm90ZWN0ZWQgY2xhc3MgU3RpY2t5VGlwTW91c2VMaXN0ZW5lciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXJ7CisvLworLy8JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7CisvLwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKy8vCQkJCisvLwkJfQorLy8KKy8vCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7CisvLwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJtb3VzZURvd24iKTsKKy8vCQkJaWYgKENVUlJFTlRfVE9PTFRJUC5nZXRCb3VuZHMoKS5jb250YWlucyhuZXcgUG9pbnQoZS54LGUueSkpID09IHRydWUpeworLy8JCQkJQ1VSUkVOVF9UT09MVElQLnNldFZpc2libGUoZmFsc2UpOworLy8JCQkJQ1VSUkVOVF9UT09MVElQLmRpc3Bvc2UoKTsKKy8vCQkJCWFjdGl2YXRlKCk7CisvLwkJCQlDVVJSRU5UX1RPT0xUSVAucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKKy8vCQkJfQorLy8JCX0KKy8vCisvLwkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKKy8vCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorLy8JCQkKKy8vCQl9CisvLwkJCisvLwl9CQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDliZGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsOTI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5JU2VydmVyRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9yQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5UYXNrV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuVGFza3NXaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworLyoqCisgKiBUaGUgc2VydmVyIFVJIHBsdWdpbiBjbGFzcy4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlclVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlcnNWaWV3IjsKKworCS8vIHNlcnZlciBVSSBwbHVnaW4gaWQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fU0VSVkVSX0lNQUdFUyA9ICJzZXJ2ZXJJbWFnZXMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fV0laQVJEX0ZSQUdNRU5UUyA9ICJ3aXphcmRGcmFnbWVudHMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9FRElUT1JfUEFHRVMgPSAiZWRpdG9yUGFnZXMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9FRElUT1JfUEFHRV9TRUNUSU9OUyA9ICJlZGl0b3JQYWdlU2VjdGlvbnMiOworCisJLy9wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RBUlQgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVE9QID0gMTsKKwkvL3B1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRVNUQVJUID0gMjsKKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdExhdW5jaGFibGVBZGFwdGVyIGV4dGVuZHMgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSB7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubGF1bmNoYWJsZS5hZGFwdGVyLmRlZmF1bHQiOworCQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgeworCQkJcmV0dXJuICJsYXVuY2hhYmxlIjsKKwkJfQorCX0KKworCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCisJcHJpdmF0ZSBzdGF0aWMgU2VydmVyVUlQbHVnaW4gc2luZ2xldG9uOworCisJcHJvdGVjdGVkIE1hcCBpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKKworCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIHdpemFyZHMKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudERhdGE+IHdpemFyZEZyYWdtZW50czsKKworCS8vIGNhY2hlZCBpbml0aWFsIHNlbGVjdGlvbiBwcm92aWRlcgorCXByaXZhdGUgc3RhdGljIEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKKworCXByaXZhdGUgc3RhdGljIElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIHJlZ2lzdHJ5TGlzdGVuZXI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciB7CisJCXB1YmxpYyB2b2lkIHJlZ2lzdHJ5Q2hhbmdlZChJUmVnaXN0cnlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJSUV4dGVuc2lvbkRlbHRhW10gZGVsdGFzID0gZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1dJWkFSRF9GUkFHTUVOVFMpOworCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJaGFuZGxlV2l6YXJkRnJhZ21lbnREZWx0YShkZWx0YXNbaV0pOworCQkJCX0KKwkJCX0KKwkJCQorCQkJZGVsdGFzID0gZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1NFUlZFUl9JTUFHRVMpOworCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJSW1hZ2VSZXNvdXJjZS5oYW5kbGVTZXJ2ZXJJbWFnZURlbHRhKGRlbHRhc1tpXSk7CisJCQkJfQorCQkJfQorCQkJCisJCQlkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fRURJVE9SX1BBR0VTKTsKKwkJCWlmIChkZWx0YXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7CisJCQkJCVNlcnZlckVkaXRvckNvcmUuaGFuZGxlRWRpdG9yUGFnZUZhY3Rvcmllc0RlbHRhKGRlbHRhc1tpXSk7CisJCQkJfQorCQkJfQorCQkJCisJCQlkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fRURJVE9SX1BBR0VfU0VDVElPTlMpOworCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJU2VydmVyRWRpdG9yQ29yZS5oYW5kbGVFZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcmllc0RlbHRhKGRlbHRhc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJc3RhdGljIGNsYXNzIFdpemFyZEZyYWdtZW50RGF0YSB7CisJCVN0cmluZyBpZDsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlOworCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudDsKKwkJCisJCXB1YmxpYyBXaXphcmRGcmFnbWVudERhdGEoU3RyaW5nIGlkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKKwkJCXRoaXMuaWQgPSBpZDsKKwkJCXRoaXMuY2UgPSBjZTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxJU2VydmVyPiB0ZXJtaW5hdGlvbldhdGNoZXMgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7CisKKwlwcm90ZWN0ZWQgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIHNlcnZlckxpZmVjeWNsZUxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcigpIHsKKwkJcHVibGljIHZvaWQgc2VydmVyQWRkZWQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJCXNlcnZlci5hZGRTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7CisJCQkoKFNlcnZlcikgc2VydmVyKS5hZGRQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisKKwkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgeworCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKKwkJCSgoU2VydmVyKSBzZXJ2ZXIpLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOworCQl9CisJfTsKKworCXByb3RlY3RlZCBzdGF0aWMgSVNlcnZlckxpc3RlbmVyIHNlcnZlckxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKKwkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgeworCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKKwkJCS8vIGlmIChldmVudEtpbmQgPT0gKFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpKSB7CisJCQlpZiAoKGV2ZW50S2luZCAmIFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkgIT0gMCkgeworCQkJCXNob3dTZXJ2ZXJzVmlldyh0cnVlKTsKKwkJCX0gZWxzZSBpZiAoKGV2ZW50S2luZCAmIFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UpICE9IDApIHsKKwkJCQlzaG93U2VydmVyc1ZpZXcoZmFsc2UpOworCQkJfQorCQl9CisJfTsKKworCXByb3RlY3RlZCBzdGF0aWMgSVB1Ymxpc2hMaXN0ZW5lciBwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7CisJCXB1YmxpYyB2b2lkIHB1Ymxpc2hTdGFydGVkKElTZXJ2ZXIgc2VydmVyKSB7CisJCQlzaG93U2VydmVyc1ZpZXcoZmFsc2UpOworCQl9CisKKwkJcHVibGljIHZvaWQgcHVibGlzaEZpbmlzaGVkKElTZXJ2ZXIgc2VydmVyLCBJU3RhdHVzIHN0YXR1cykgeworCQkJc2hvd1NlcnZlcnNWaWV3KGZhbHNlKTsKKwkJfQorCX07CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIFNlcnZlclVJUGx1Z2luLgorCSAqLworCXB1YmxpYyBTZXJ2ZXJVSVBsdWdpbigpIHsKKwkJc3VwZXIoKTsKKwkJc2luZ2xldG9uID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZlclVJUGx1Z2luCisJICovCisJcHVibGljIHN0YXRpYyBTZXJ2ZXJVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIHNpbmdsZXRvbjsKKwl9CisKKwkvKioKKwkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCisJICoKKwkgKiBAcGFyYW0gc3RhdHVzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgeworCQlnZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhzdGF0dXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIFVJIHByZWZlcmVuY2VzLgorCSAqIAorCSAqIEByZXR1cm4gU2VydmVyVUlQcmVmZXJlbmNlcworCSAqLworCXB1YmxpYyBzdGF0aWMgU2VydmVyVUlQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKKwkJcmV0dXJuIG5ldyBTZXJ2ZXJVSVByZWZlcmVuY2VzKCk7CisJfQorCisJLyoqCisJICogQHNlZSBQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLS0tLS0+LS0tLS0gU2VydmVyIFVJIHBsdWdpbiBzdGFydCAtLS0tLT4tLS0tLSIpOworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwkJCisJCVNlcnZlclVJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcmVmZXJlbmNlcygpOworCQlwcmVmcy5zZXREZWZhdWx0cygpOworCQkKKwkJU2VydmVyQ29yZS5hZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihzZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcik7CisJCQorCQlJbml0aWFsaXplSm9iIGpvYiA9IG5ldyBJbml0aWFsaXplSm9iKCk7CisJCWpvYi5zY2hlZHVsZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItLS0tLTwtLS0tLSBTZXJ2ZXIgVUkgcGx1Z2luIHN0b3AgLS0tLS08LS0tLS0iKTsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwkJCisJCWlmIChyZWdpc3RyeUxpc3RlbmVyICE9IG51bGwpIHsKKwkJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCQlyZWdpc3RyeS5yZW1vdmVSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKHJlZ2lzdHJ5TGlzdGVuZXIpOworCQl9CisJCQorCQlJbWFnZVJlc291cmNlLmRpc3Bvc2UoKTsKKwkJCisJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CisJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCXNlcnZlcnNbaV0ucmVtb3ZlU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOworCQkJCSgoU2VydmVyKSBzZXJ2ZXJzW2ldKS5yZW1vdmVQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKKwkJCX0KKwkJfQorCQkKKwkJU2VydmVyQ29yZS5yZW1vdmVTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihzZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQWRkcyBhIHdhdGNoIHRvIHRoaXMgc2VydmVyLiBJZiBpdCBoYXNuJ3Qgc3RvcHBlZCBpbiBhCisJICogcmVhc29uYWJsZSBhbW91bnQgb2YgdGltZSwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0bworCSAqIHRlcm1pbmF0ZSB0aGUgc2VydmVyLgorCSAqCisJICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICogQHBhcmFtIG1vZGUgYSBkZWJ1ZyBtb2RlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZFRlcm1pbmF0aW9uV2F0Y2goZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIElTZXJ2ZXIgc2VydmVyLCBmaW5hbCBpbnQgbW9kZSkgeworCQlpZiAodGVybWluYXRpb25XYXRjaGVzLmNvbnRhaW5zKHNlcnZlcikpCisJCQlyZXR1cm47CisJCQorCQl0ZXJtaW5hdGlvbldhdGNoZXMuYWRkKHNlcnZlcik7CisJCQorCQljbGFzcyBUZXJtaW5hdGVUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCQkJcHVibGljIGJvb2xlYW4gYWxpdmUgPSB0cnVlOworCQkJcHVibGljIElTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcjsKKworCQkJcHVibGljIFRlcm1pbmF0ZVRocmVhZCgpIHsKKwkJCQlzdXBlcigiU2VydmVyIFRlcm1pbmF0aW9uIFRocmVhZCIpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJd2hpbGUgKGFsaXZlKSB7CisJCQkJCWludCBkZWxheSA9IHNlcnZlci5nZXRTdGFydFRpbWVvdXQoKSAqIDEwMDA7CisJCQkJCWlmIChtb2RlID09IDEpCisJCQkJCQlkZWxheSA9IHNlcnZlci5nZXRTdG9wVGltZW91dCgpICogMTAwMDsKKwkJCQkJZWxzZSBpZiAobW9kZSA9PSAyKQorCQkJCQkJZGVsYXkgKz0gc2VydmVyLmdldFN0b3BUaW1lb3V0KCkgKiAxMDAwOworCQkJCQkKKwkJCQkJaWYgKGRlbGF5IDwgMCkKKwkJCQkJCXJldHVybjsKKwkJCQkJCisJCQkJCXRyeSB7CisJCQkJCQlUaHJlYWQuc2xlZXAoZGVsYXkpOworCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBpZ25vcmUKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKKwkJCQkJCWFsaXZlID0gZmFsc2U7CisJCisJCQkJCWlmIChhbGl2ZSkgeworCQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJVGVybWluYXRpb25EaWFsb2cgZGlhbG9nID0gbmV3IFRlcm1pbmF0aW9uRGlhbG9nKHNoZWxsLCBzZXJ2ZXIuZ2V0TmFtZSgpKTsKKwkJCQkJCQkJZGlhbG9nLm9wZW4oKTsKKwkJCQkJCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgeworCQkJCQkJCQkJLy8gb25seSB0cnkgY2FsbGluZyB0ZXJtaW5hdGUgb25jZS4gQWxzbywgbWFrZSBzdXJlIHRoYXQgaXQgZGlkbid0IHN0b3Agd2hpbGUKKwkJCQkJCQkJCS8vIHRoZSBkaWFsb2cgd2FzIG9wZW4KKwkJCQkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCisJCQkJCQkJCQkJc2VydmVyLnN0b3AodHJ1ZSk7CisJCQkJCQkJCQlhbGl2ZSA9IGZhbHNlOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCX0KKwkJCQkJaWYgKCFhbGl2ZSkgeworCQkJCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCisJCQkJCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCQkJCXRlcm1pbmF0aW9uV2F0Y2hlcy5yZW1vdmUoc2VydmVyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQorCQlmaW5hbCBUZXJtaW5hdGVUaHJlYWQgdCA9IG5ldyBUZXJtaW5hdGVUaHJlYWQoKTsKKwkJdC5zZXREYWVtb24odHJ1ZSk7CisJCXQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgLSAyKTsKKwkKKwkJLy8gYWRkIGxpc3RlbmVyIHRvIHN0b3AgdGhlIHRocmVhZCBpZi93aGVuIHRoZSBzZXJ2ZXIgc3RvcHMKKwkJSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKKwkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOworCQkJCUlTZXJ2ZXIgc2VydmVyMiA9IGV2ZW50LmdldFNlcnZlcigpOworCQkJCWlmIChldmVudEtpbmQgPT0gKFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpKSB7CisJCQkJCWlmIChzZXJ2ZXIyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQorCQkJCQkJdC5hbGl2ZSA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJdC5saXN0ZW5lciA9IGxpc3RlbmVyOworCQlzZXJ2ZXIuYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOworCQorCQl0LnN0YXJ0KCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IGNhbWUgZnJvbSB0aGUgZ2l2ZW4gZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgorCSAqIHNlcnZlcnMgKHtAbGluayBTZXJ2ZXJDb3JlI2dldFNlcnZlcnMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZworCSAqIGxvY2F0aW9uICh7QGxpbmsgU2VydmVyI2dldEZpbGUoKX0pLiBUaGUgZmlsZSBtYXkgbm90IGJlIG51bGwuCisJICoKKwkgKiBAcGFyYW0gZmlsZSBhIHNlcnZlciBmaWxlCisJICogQHJldHVybiB0aGUgc2VydmVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiB0aGVyZSBpcyBubyBzZXJ2ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlCisJICovCisJcHVibGljIHN0YXRpYyBJU2VydmVyIGZpbmRTZXJ2ZXIoSUZpbGUgZmlsZSkgeworCQlpZiAoZmlsZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkKKwkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKKwkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJaWYgKGZpbGUuZXF1YWxzKCgoU2VydmVyKXNlcnZlcnNbaV0pLmdldEZpbGUoKSkpCisJCQkJCXJldHVybiBzZXJ2ZXJzW2ldOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBydW50aW1lIGluc3RhbmNlcyBvZgorCSAqIHRoZSBnaXZlbiBydW50aW1lIHR5cGUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGZpbHRlcnMgdGhlIGxpc3Qgb2Yga25vd24KKwkgKiBydW50aW1lICh7QGxpbmsgU2VydmVyQ29yZSNnZXRSdW50aW1lcygpfSkgZm9yIG9uZXMgd2l0aCBhIG1hdGNoaW5nCisJICogcnVudGltZSB0eXBlICh7QGxpbmsgSVJ1bnRpbWUjZ2V0UnVudGltZVR5cGUoKX0pLiBUaGUgYXJyYXkgd2lsbCBub3QKKwkgKiBjb250YWluIGFueSB3b3JraW5nIGNvcGllcy4KKwkgKiA8cD4KKwkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZVR5cGUgdGhlIHJ1bnRpbWUgdHlwZQorCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIHJ1bnRpbWUgaW5zdGFuY2VzIHtAbGluayBJUnVudGltZX0KKwkgKiBvZiB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlCisJICovCisJcHVibGljIHN0YXRpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgeworCQlMaXN0PElSdW50aW1lPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKKwkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKKwkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAocnVudGltZXNbaV0uZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsICYmIHJ1bnRpbWVzW2ldLmdldFJ1bnRpbWVUeXBlKCkuZXF1YWxzKHJ1bnRpbWVUeXBlKSkKKwkJCQkJbGlzdC5hZGQocnVudGltZXNbaV0pOworCQkJfQorCQl9CisJCQorCQlJUnVudGltZVtdIHIgPSBuZXcgSVJ1bnRpbWVbbGlzdC5zaXplKCldOworCQlsaXN0LnRvQXJyYXkocik7CisJCXJldHVybiByOworCX0KKworCS8qKgorCSAqIE9wZW4gdGhlIGdpdmVuIHNlcnZlciB3aXRoIHRoZSBzZXJ2ZXIgZWRpdG9yLgorCSAqCisJICogQHBhcmFtIHNlcnZlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBlZGl0U2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7CisJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWVkaXRTZXJ2ZXIoc2VydmVyLmdldElkKCkpOworCX0KKworCS8qKgorCSAqIE9wZW4gdGhlIGdpdmVuIHNlcnZlciBpZCB3aXRoIHRoZSBzZXJ2ZXIgZWRpdG9yLgorCSAqCisJICogQHBhcmFtIHNlcnZlcklkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGVkaXRTZXJ2ZXIoU3RyaW5nIHNlcnZlcklkKSB7CisJCWlmIChzZXJ2ZXJJZCA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOworCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKKwkJCisJCXRyeSB7CisJCQlJU2VydmVyRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgU2VydmVyRWRpdG9ySW5wdXQoc2VydmVySWQpOworCQkJcGFnZS5vcGVuRWRpdG9yKGlucHV0LCBJU2VydmVyRWRpdG9ySW5wdXQuRURJVE9SX0lEKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgc2VydmVyIGVkaXRvciIsIGUpOworCQl9CisJfQorCisJLyoqCisJICogVXNlIHRoZSBwcmVmZXJlbmNlIHRvIHByb21wdCB0aGUgdXNlciB0byBzYXZlIGRpcnR5IGVkaXRvcnMsIGlmIGFwcGxpY2FibGUuCisJICogCisJICogQHJldHVybiBib29sZWFuICAtIFJldHVybnMgZmFsc2UgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIHRoZSBvcGVyYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZUVkaXRvcnMoKSB7CisJCWJ5dGUgYiA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0U2F2ZUVkaXRvcnMoKTsKKwkJaWYgKGIgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5TQVZFX0VESVRPUlNfTkVWRVIpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuc2F2ZUFsbEVkaXRvcnMoYiA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19QUk9NUFQpOwkJCQorCX0KKworCS8qKgorCSAqIFByb21wdHMgdGhlIHVzZXIgaWYgdGhlIHNlcnZlciBpcyBkaXJ0eS4gUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgd2FzCisJICogbm90IGRpcnR5IG9yIGlmIHRoZSB1c2VyIGRlY2lkZWQgdG8gY29udGludWUgYW55d2F5LiBSZXR1cm5zIGZhbHNlIGlmCisJICogdGhlIHNlcnZlciBpcyBkaXJ0eSBhbmQgdGhlIHVzZXIgY2hvc2UgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24uCisJICoKKwkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvbXB0SWZEaXJ0eShTaGVsbCBzaGVsbCwgSVNlcnZlciBzZXJ2ZXIpIHsKKwkJaWYgKHNlcnZlciA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKCEoc2VydmVyIGluc3RhbmNlb2YgSVNlcnZlcldvcmtpbmdDb3B5KSkKKwkJCXJldHVybiB0cnVlOworCisJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLnJlc291cmNlRGlydHlEaWFsb2dUaXRsZTsKKwkJCisJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IChJU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKKwkJaWYgKHdjLmlzRGlydHkoKSkgeworCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5yZXNvdXJjZURpcnR5RGlhbG9nTWVzc2FnZSwgc2VydmVyLmdldE5hbWUoKSk7CisJCQlTdHJpbmdbXSBsYWJlbHMgPSBuZXcgU3RyaW5nW10ge01lc3NhZ2VzLnJlc291cmNlRGlydHlEaWFsb2dDb250aW51ZSwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9OworCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhzaGVsbCwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuSU5GT1JNQVRJT04sIGxhYmVscywgMCk7CisJCisJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSAwKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBTaG93IHRoZSBTZXJ2ZXJzIHZpZXcuIFRoZSBTZXJ2ZXJzIGlzIG5ldmVyIGdpdmVuIGZvY3VzLgorCSAqIAorCSAqIEBwYXJhbSBicmluZ1RvRnJvbnQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgU2VydmVycyB2aWV3IHB1c2ggdG8gdGhlIHRvcAorCSAqICAgIG9mIHRoZSB6LW9yZGVyLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGp1c3QgaGlnaGxpZ2h0IGl0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNob3dTZXJ2ZXJzVmlldyhmaW5hbCBib29sZWFuIGJyaW5nVG9Gcm9udCkgeworCQlpZiAoIWdldFByZWZlcmVuY2VzKCkuZ2V0U2hvd09uQWN0aXZpdHkoKSkKKwkJCXJldHVybjsKKwkJCisJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOworCQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwkJCQkJaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7CisJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIk5vIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93Iik7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJCisJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOworCQkJCQkKKwkJCQkJSVZpZXdQYXJ0IHZpZXcyID0gcGFnZS5maW5kVmlldyhWSUVXX0lEKTsKKwkJCQkJCisJCQkJCWlmICh2aWV3MiAhPSBudWxsKSB7CisJCQkJCQlpZiAoYnJpbmdUb0Zyb250KQorCQkJCQkJCXBhZ2UuYnJpbmdUb1RvcCh2aWV3Mik7CisJCQkJCQllbHNlIHsKKwkJCQkJCQlJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSB3c3BzID0gKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlKQorCQkJCQkJCQl2aWV3Mi5nZXRTaXRlKCkuZ2V0QWRhcHRlcihJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZS5jbGFzcyk7CisJCQkJCQkJd3Nwcy53YXJuT2ZDb250ZW50Q2hhbmdlKCk7CisJCQkJCQl9CisJCQkJCX0gZWxzZQorCQkJCQkJcGFnZS5zaG93VmlldyhWSUVXX0lEKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBvcGVuaW5nIFNlcnZlcnMgdmlldyIsIGUpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzZXJ2ZXIgaXMgYWxyZWFkeSBzdGFydGVkIGluIHRoZSBnaXZlbgorCSAqIG1vZGUsIG9yIGNvdWxkIGJlIChyZSlzdGFydGVkIGluIHRoZSBzdGFydCBtb2RlLgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2ZXIKKwkgKiBAcGFyYW0gbGF1bmNoTW9kZQorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoTGF1bmNoTW9kZShJU2VydmVyIHNlcnZlciwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKKwkJaWYgKHNlcnZlciA9PSBudWxsIHx8IGxhdW5jaE1vZGUgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOworCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEICYmIGxhdW5jaE1vZGUuZXF1YWxzKHNlcnZlci5nZXRNb2RlKCkpKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuc3VwcG9ydHNMYXVuY2hNb2RlKGxhdW5jaE1vZGUpKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBPcGVuIHRoZSBuZXcgcnVudGltZSB3aXphcmQuCisJICogCisJICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKKwkgKiBAcGFyYW0gdHlwZSBhIG1vZHVsZSB0eXBlIGlkCisJICogQHBhcmFtIHZlcnNpb24gYSBtb2R1bGUgdmVyc2lvbiBpZAorCSAqIEBwYXJhbSBydW50aW1lVHlwZUlkIGEgcnVudGltZSB0eXBlIGlkCisJICogQHJldHVybiB0cnVlIGlmIGEgbmV3IHJ1bnRpbWUgd2FzIGNyZWF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd05ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBTdHJpbmcgdmVyc2lvbiwgZmluYWwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKKwkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7CisJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7CisJCQkJbGlzdC5hZGQobmV3IE5ld1J1bnRpbWVXaXphcmRGcmFnbWVudCh0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKSk7CisJCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVJ1bnRpbWVGcmFnbWVudCk7CisJCQl9CisJCX07CisJCVRhc2tXaXphcmQgd2l6YXJkID0gbmV3IFRhc2tXaXphcmQoTWVzc2FnZXMud2l6TmV3UnVudGltZVdpemFyZFRpdGxlLCBmcmFnbWVudCk7CisJCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7CisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOworCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7CisJfQorCisJLyoqCisJICogT3BlbiB0aGUgbmV3IHJ1bnRpbWUgd2l6YXJkLgorCSAqIAorCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCisJICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQgYSBydW50aW1lIHR5cGUgaWQKKwkgKiBAcmV0dXJuIHRydWUgaWYgYSBuZXcgcnVudGltZSB3YXMgY3JlYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93TmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKKwkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gbnVsbDsKKwkJaWYgKHJ1bnRpbWVUeXBlSWQgIT0gbnVsbCkKKwkJCXJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUocnVudGltZVR5cGVJZCk7CisJCWlmIChydW50aW1lVHlwZSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCWZpbmFsIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7CisJCQkJVGFza01vZGVsIHRhc2tNb2RlbCA9IG5ldyBUYXNrTW9kZWwoKTsKKwkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHJ1bnRpbWUpOworCQkJCQorCQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgeworCQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7CisJCQkJCQlsaXN0LmFkZChnZXRXaXphcmRGcmFnbWVudChydW50aW1lVHlwZUlkKSk7CisJCQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlUnVudGltZUZyYWdtZW50KTsKKwkJCQkJfQorCQkJCX07CisJCQkJVGFza1dpemFyZCB3aXphcmQgPSBuZXcgVGFza1dpemFyZChNZXNzYWdlcy53aXpOZXdSdW50aW1lV2l6YXJkVGl0bGUsIGZyYWdtZW50LCB0YXNrTW9kZWwpOworCQkJCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7CisJCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7CisJCQkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNob3dOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCBudWxsLCBudWxsLCBydW50aW1lVHlwZUlkKTsKKwl9CisKKwkvKioKKwkgKiBPcGVuIHRoZSBuZXcgc2VydmVyIHdpemFyZC4KKwkgKiAKKwkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAorCSAqIEBwYXJhbSB0eXBlSWQgYSBtb2R1bGUgdHlwZSBpZCwgb3IgbnVsbCBmb3IgYW55IG1vZHVsZSB0eXBlCisJICogQHBhcmFtIHZlcnNpb25JZCBhIG1vZHVsZSB2ZXJzaW9uLCBvciBudWxsIGZvciBhbnkgdmVyc2lvbgorCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQgYSBzZXJ2ZXIgcnVudGltZSB0eXBlLCBvciBudWxsIGZvciBhbnkgdHlwZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBzZXJ2ZXIgd2FzIGNyZWF0ZWQsIG9yCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93TmV3U2VydmVyV2l6YXJkKFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgdHlwZUlkLCBmaW5hbCBTdHJpbmcgdmVyc2lvbklkLCBmaW5hbCBTdHJpbmcgc2VydmVyVHlwZUlkKSB7CisJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgeworCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgeworCQkJCWxpc3QuYWRkKG5ldyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudChuZXcgTW9kdWxlVHlwZSh0eXBlSWQsIHZlcnNpb25JZCksIHNlcnZlclR5cGVJZCkpOworCQkJCQorCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlRlbXBTYXZlUnVudGltZUZyYWdtZW50KTsKKwkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5UZW1wU2F2ZVNlcnZlckZyYWdtZW50KTsKKwkJCQkKKwkJCQlsaXN0LmFkZChuZXcgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50KCkpOworCQkJCWxpc3QuYWRkKG5ldyBUYXNrc1dpemFyZEZyYWdtZW50KCkpOworCQkJCQorCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOworCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVTZXJ2ZXJGcmFnbWVudCk7CisJCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZUhvc3RuYW1lRnJhZ21lbnQpOworCQkJfQorCQl9OworCQkKKwkJVGFza1dpemFyZCB3aXphcmQgPSBuZXcgVGFza1dpemFyZChNZXNzYWdlcy53aXpOZXdTZXJ2ZXJXaXphcmRUaXRsZSwgZnJhZ21lbnQpOworCQl3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOworCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKKwkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gaWQgaGFzIHBvc3NpYmxlIHdpemFyZCBmcmFnbWVudHMsIGFuZAorCSAqIGZhbHNlIG90aGVyd2lzZS4KKwkgKgorCSAqIEBwYXJhbSB0eXBlSWQgdGhlIHNlcnZlciBvciBydW50aW1lIHR5cGUgaWQKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGlkIGhhcyBwb3NzaWJsZSB3aXphcmQgZnJhZ21lbnRzLCBhbmQKKwkgKiAgICBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzV2l6YXJkRnJhZ21lbnQoU3RyaW5nIHR5cGVJZCkgeworCQlpZiAodHlwZUlkID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpZiAod2l6YXJkRnJhZ21lbnRzID09IG51bGwpCisJCQlsb2FkV2l6YXJkRnJhZ21lbnRzKCk7CisJCQorCQlJdGVyYXRvciBpdGVyYXRvciA9IHdpemFyZEZyYWdtZW50cy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKHR5cGVJZC5lcXVhbHMoa2V5KSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgd2l6YXJkIGZyYWdtZW50IHdpdGggdGhlIGdpdmVuIGlkLgorCSAqCisJICogQHBhcmFtIHR5cGVJZCB0aGUgc2VydmVyIG9yIHJ1bnRpbWUgdHlwZSBpZAorCSAqIEByZXR1cm4gYSB3aXphcmQgZnJhZ21lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY291bGQgYmUgZm91bmQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFdpemFyZEZyYWdtZW50IGdldFdpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlSWQpIHsKKwkJaWYgKHR5cGVJZCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpZiAod2l6YXJkRnJhZ21lbnRzID09IG51bGwpCisJCQlsb2FkV2l6YXJkRnJhZ21lbnRzKCk7CisJCQorCQlJdGVyYXRvciBpdGVyYXRvciA9IHdpemFyZEZyYWdtZW50cy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKHR5cGVJZC5lcXVhbHMoa2V5KSkgeworCQkJCVdpemFyZEZyYWdtZW50RGF0YSBkYXRhID0gd2l6YXJkRnJhZ21lbnRzLmdldChrZXkpOworCQkJCXJldHVybiBnZXRXaXphcmRGcmFnbWVudChkYXRhKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBMb2FkIHRoZSB3aXphcmQgZnJhZ21lbnRzLgorCSAqLworCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRXaXphcmRGcmFnbWVudHMoKSB7CisJCWlmICh3aXphcmRGcmFnbWVudHMgIT0gbnVsbCkKKwkJCXJldHVybjsKKwkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLT4tIExvYWRpbmcgLndpemFyZEZyYWdtZW50cyBleHRlbnNpb24gcG9pbnQgLT4tIik7CisJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1dJWkFSRF9GUkFHTUVOVFMpOworCQkKKwkJTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnREYXRhPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50RGF0YT4oY2YubGVuZ3RoKTsKKwkJbG9hZFdpemFyZEZyYWdtZW50cyhjZiwgbWFwKTsKKwkJYWRkUmVnaXN0cnlMaXN0ZW5lcigpOworCQl3aXphcmRGcmFnbWVudHMgPSBtYXA7CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC53aXphcmRGcmFnbWVudHMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOworCX0KKworCS8qKgorCSAqIExvYWQgd2l6YXJkIGZyYWdtZW50cy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkV2l6YXJkRnJhZ21lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmLCBNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudERhdGE+IG1hcCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGNmLmxlbmd0aDsgaSsrKSB7CisJCQl0cnkgeworCQkJCVN0cmluZyBpZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpOworCQkJCVN0cmluZ1tdIGlkcyA9IHRva2VuaXplKGlkLCAiLCIpOworCQkJCWludCBzaXplID0gaWRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykKKwkJCQkJbWFwLnB1dChpZHNbal0sIG5ldyBXaXphcmRGcmFnbWVudERhdGEoaWQsIGNmW2ldKSk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgd2l6YXJkRnJhZ21lbnQ6ICIgKyBpZCk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgd2l6YXJkRnJhZ21lbnQ6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICoKKwkgKiBAcmV0dXJuIGFuIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kCisJICovCisJcHVibGljIHN0YXRpYyBJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIgZ2V0SW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyKCkgeworCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgPT0gbnVsbCkKKwkJCWxvYWRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCisJCXJldHVybiBzZWxlY3Rpb25Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBMb2FkIHRoZSBpbml0aWFsIHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyKCkgeworCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOworCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsICJpbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIiKTsKKwkJCisJCWlmIChjZi5sZW5ndGggPT0gMSkgeworCQkJdHJ5IHsKKwkJCQlzZWxlY3Rpb25Qcm92aWRlciA9IChJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIpIGNmWzBdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyOiAiICsgY2ZbMF0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBpbml0aWFsU2VsZWN0aW9uUHJvdmlkZXI6ICIgKyBjZlswXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOworCQkJfQorCQl9IGVsc2UgaWYgKGNmLmxlbmd0aCA+IDEpCisJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiTW9yZSB0aGF0IG9uZSBpbml0aWFsIHNlbGVjdGlvbiBwcm92aWRlciBmb3VuZCAtIGlnbm9yaW5nIik7CisJCWVsc2UKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIk5vIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyIGZvdW5kIik7CisJCQorCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgPT0gbnVsbCkKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbmV3IEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcigpOworCQkKKwkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAuaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFdpemFyZEZyYWdtZW50IGdldFdpemFyZEZyYWdtZW50KFdpemFyZEZyYWdtZW50RGF0YSBmcmFnbWVudCkgeworCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJaWYgKGZyYWdtZW50LmZyYWdtZW50ID09IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQkJZnJhZ21lbnQuZnJhZ21lbnQgPSAoV2l6YXJkRnJhZ21lbnQpIGZyYWdtZW50LmNlLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJTZXJ2ZXJVSVBsdWdpbi5nZXRXaXphcmRGcmFnbWVudCgpOiA8IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGZyYWdtZW50LmNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgd2l6YXJkRnJhZ21lbnQ6ICIgKyBmcmFnbWVudC5jZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOworCQkJfQorCQl9CisJCXJldHVybiBmcmFnbWVudC5mcmFnbWVudDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgcnVuT25TZXJ2ZXIoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKKwkJUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCk7CisJCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCkgeworCQkJLy8gZHVtbXkgYWN0aW9uCisJCX07CisJCWlmIChvYmplY3QgIT0gbnVsbCkgeworCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpOworCQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIHNlbCk7CisJCX0gZWxzZQorCQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIG51bGwpOworCisJCWRlbGVnYXRlLnJ1bihhY3Rpb24pOworCX0KKworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkUmVnaXN0cnlMaXN0ZW5lcigpIHsKKwkJaWYgKHJlZ2lzdHJ5TGlzdGVuZXIgIT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCXJlZ2lzdHJ5TGlzdGVuZXIgPSBuZXcgUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcigpOworCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQlyZWdpc3RyeS5hZGRSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKHJlZ2lzdHJ5TGlzdGVuZXIsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZVdpemFyZEZyYWdtZW50RGVsdGEoSUV4dGVuc2lvbkRlbHRhIGRlbHRhKSB7CisJCWlmICh3aXphcmRGcmFnbWVudHMgPT0gbnVsbCkgLy8gbm90IGxvYWRlZCB5ZXQKKwkJCXJldHVybjsKKwkJCisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gZGVsdGEuZ2V0RXh0ZW5zaW9uKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7CisJCQorCQlNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudERhdGE+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnREYXRhPih3aXphcmRGcmFnbWVudHMpOworCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkgeworCQkJbG9hZFdpemFyZEZyYWdtZW50cyhjZiwgbWFwKTsKKwkJfSBlbHNlIHsKKwkJCS8qaW50IHNpemUgPSB3aXphcmRGcmFnbWVudHMuc2l6ZSgpOworCQkJV2l6YXJkRnJhZ21lbnRbXSB3ZiA9IG5ldyBXaXphcmRGcmFnbWVudFtzaXplXTsKKwkJCXdpemFyZEZyYWdtZW50cy50b0FycmF5KHdmKTsKKwkJCWludCBzaXplMiA9IGNmLmxlbmd0aDsKKwkJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQkJaWYgKHdmW2ldLmdldElkKCkuZXF1YWxzKGNmW2pdLmdldEF0dHJpYnV0ZSgiaWQiKSkpIHsKKwkJCQkJCXdmW2ldLmRpc3Bvc2UoKTsKKwkJCQkJCXdpemFyZEZyYWdtZW50cy5yZW1vdmUod2ZbaV0pOworCQkJCQl9CisJCQkJfQorCQkJfSovCisJCX0KKwkJd2l6YXJkRnJhZ21lbnRzID0gbWFwOworCX0KKworCS8qKgorCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHRva2VuaXplIGEgc3RyaW5nIGludG8gYW4gYXJyYXkuCisJICogCisJICogQHBhcmFtIHN0ciBhIHN0cmluZyB0byBiZSBwYXJzZWQKKwkgKiBAcGFyYW0gZGVsaW0gdGhlIGRlbGltaXRlcnMKKwkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHRva2VuaXplZCBzdHJpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplKFN0cmluZyBzdHIsIFN0cmluZyBkZWxpbSkgeworCQlpZiAoc3RyID09IG51bGwpCisJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKKwkJCisJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQorCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgZGVsaW0pOworCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQlTdHJpbmcgcyA9IHN0Lm5leHRUb2tlbigpOworCQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkKKwkJCQlsaXN0LmFkZChzLnRyaW0oKSk7CisJCX0KKwkJCisJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKKwkJbGlzdC50b0FycmF5KHMpOworCQlyZXR1cm4gczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsYXVuY2hhYmxlIGNsaWVudHMgZm9yIHRoZSBnaXZlbiBzZXJ2ZXIgYW5kIGxhdW5jaGFibGUKKwkgKiBvYmplY3QuCisJICogCisJICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgorCSAqIEBwYXJhbSBsYXVuY2hhYmxlCisJICogQHBhcmFtIGxhdW5jaE1vZGUgU3RyaW5nCisJICogQHJldHVybiBhbiBhcnJheSBvZiBjbGllbnRzCisJICovCisJcHVibGljIHN0YXRpYyBJQ2xpZW50W10gZ2V0Q2xpZW50cyhJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7CisJCWlmIChzZXJ2ZXIgPT0gbnVsbCB8fCBsYXVuY2hhYmxlID09IG51bGwpCisJCQlyZXR1cm4gbmV3IElDbGllbnRbMF07CisJCQorCQlBcnJheUxpc3Q8SUNsaWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUNsaWVudD4oNSk7CisJCUlDbGllbnRbXSBjbGllbnRzID0gU2VydmVyUGx1Z2luLmdldENsaWVudHMoKTsKKwkJaWYgKGNsaWVudHMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBjbGllbnRzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiY2xpZW50PSAiICsgY2xpZW50c1tpXSk7CisJCQkJaWYgKGNsaWVudHNbaV0uc3VwcG9ydHMoc2VydmVyLCBsYXVuY2hhYmxlLCBsYXVuY2hNb2RlKSkKKwkJCQkJbGlzdC5hZGQoY2xpZW50c1tpXSk7CisJCQl9CisJCX0KKwkJCisJCUlDbGllbnRbXSBjbGllbnRzMiA9IG5ldyBJQ2xpZW50W2xpc3Quc2l6ZSgpXTsKKwkJbGlzdC50b0FycmF5KGNsaWVudHMyKTsKKwkJcmV0dXJuIGNsaWVudHMyOworCX0KKworCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0TGF1bmNoYWJsZUFkYXB0ZXIoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJTGF1bmNoYWJsZUFkYXB0ZXJbXSBhZGFwdGVycyA9IFNlcnZlclBsdWdpbi5nZXRMYXVuY2hhYmxlQWRhcHRlcnMoKTsKKwkJaWYgKGFkYXB0ZXJzICE9IG51bGwpIHsKKwkJCWludCBzaXplMiA9IGFkYXB0ZXJzLmxlbmd0aDsKKwkJCUlTdGF0dXMgbGFzdFN0YXR1cyA9IG51bGw7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQlJTGF1bmNoYWJsZUFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJzW2pdOworCQkJCXRyeSB7CisJCQkJCU9iamVjdCBsYXVuY2hhYmxlMiA9IGFkYXB0ZXIuZ2V0TGF1bmNoYWJsZShzZXJ2ZXIsIG1vZHVsZUFydGlmYWN0KTsKKwkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiYWRhcHRlcj0gIiArIGFkYXB0ZXIgKyAiLCBsYXVuY2hhYmxlPSAiICsgbGF1bmNoYWJsZTIpOworCQkJCQlpZiAobGF1bmNoYWJsZTIgIT0gbnVsbCkKKwkJCQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBhZGFwdGVyLCBsYXVuY2hhYmxlMiB9OworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJbGFzdFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGluIGxhdW5jaGFibGUgYWRhcHRlciIsIGUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChsYXN0U3RhdHVzICE9IG51bGwpCisJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obGFzdFN0YXR1cyk7CisJCX0KKwkJCisJCS8vIGJhY2t1cAorCQlJTGF1bmNoYWJsZUFkYXB0ZXIgbGF1bmNoYWJsZUFkYXB0ZXIgPSBTZXJ2ZXJQbHVnaW4uZmluZExhdW5jaGFibGVBZGFwdGVyKERlZmF1bHRMYXVuY2hhYmxlQWRhcHRlci5JRCk7CisJCU9iamVjdCBsYXVuY2hhYmxlID0gbGF1bmNoYWJsZUFkYXB0ZXIuZ2V0TGF1bmNoYWJsZShzZXJ2ZXIsIG1vZHVsZUFydGlmYWN0KTsKKwkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGxhdW5jaGFibGVBZGFwdGVyLCBsYXVuY2hhYmxlIH07CisJfQorCisJcHVibGljIHN0YXRpYyBPYmplY3RbXSBhZGFwdExhYmVsQ2hhbmdlT2JqZWN0cyhPYmplY3RbXSBvYmopIHsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIG9iajsKKwkJCisJCUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCWludCBzaXplID0gb2JqLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmIChvYmpbaV0gaW5zdGFuY2VvZiBJTW9kdWxlKSB7CisJCQkJbGlzdC5hZGQob2JqW2ldKTsKKwkJCX0gZWxzZSBpZiAob2JqW2ldIGluc3RhbmNlb2YgSVNlcnZlcikgeworCQkJCWxpc3QuYWRkKG9ialtpXSk7CisJCQl9IGVsc2UgaWYgKG9ialtpXSBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgeworCQkJCWxpc3QuYWRkKG9ialtpXSk7CisJCQl9IGVsc2UgaWYgKG9ialtpXSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisJCQkJSVByb2plY3QgcHJvaiA9IChJUHJvamVjdCkgb2JqW2ldOworCQkJCUlNb2R1bGVbXSBtID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2opOworCQkJCWludCBzaXplMiA9IG0ubGVuZ3RoOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykKKwkJCQkJbGlzdC5hZGQobVtqXSk7CisJCQl9CisJCX0KKwkJCisJCU9iamVjdFtdIG8gPSBuZXcgT2JqZWN0W2xpc3Quc2l6ZSgpXTsKKwkJbGlzdC50b0FycmF5KG8pOworCQlyZXR1cm4gbzsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVUlQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVUlQcmVmZXJlbmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzZlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVByZWZlcmVuY2VzLmphdmEKQEAgLTAsMCArMSwzNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKKy8qKgorICogSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHNlcnZlciB0b29scyBVSS4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlclVJUHJlZmVyZW5jZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0lNUE9SVF9MT0NBVElPTiA9ICJpbXBvcnQtbG9jYXRpb24iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NBVkVfRURJVE9SUyA9ICJzYXZlLWVkaXRvcnMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0hPU1RfTkFNRVMgPSAiaG9zdC1uYW1lcyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0hPV19PTl9BQ1RJVklUWSA9ICJzaG93LW9uLWFjdGl2aXR5IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVVOQ0hfTU9ERSA9ICJsYXVuY2gtbW9kZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTEFVTkNIX01PREUyID0gImxhdW5jaC1tb2RlMiI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRU5BQkxFX0JSRUFLUE9JTlRTID0gImVuYWJsZS1icmVha3BvaW50cyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkVTVEFSVCA9ICJyZXN0YXJ0IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DUkVBVEVfU0VSVkVSX1dJVEhfUlVOVElNRSA9ICJjcmVhdGUtc2VydmVyIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9QVUJMSVNIX09OX0FERF9SRU1PVkUgPSAicHVibGlzaC1vbi1hZGQtcmVtb3ZlIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTQVZFX0VESVRPUlNfQUxXQVlTID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0FWRV9FRElUT1JTX05FVkVSID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0FWRV9FRElUT1JTX1BST01QVCA9IDE7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREVfUFJPTVBUID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREVfQ09OVElOVUUgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMQVVOQ0hfTU9ERV9SRVNUQVJUID0gMjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMQVVOQ0hfTU9ERTJfUFJPTVBUID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREUyX0NPTlRJTlVFID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREUyX1JFU1RBUlQgPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMQVVOQ0hfTU9ERTJfRElTQUJMRV9CUkVBS1BPSU5UUyA9IDM7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRU5BQkxFX0JSRUFLUE9JTlRTX1BST01QVCA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVOQUJMRV9CUkVBS1BPSU5UU19BTFdBWVMgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFTkFCTEVfQlJFQUtQT0lOVFNfTkVWRVIgPSAyOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFJFU1RBUlRfUFJPTVBUID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUkVTVEFSVF9BTFdBWVMgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRVNUQVJUX05FVkVSID0gMjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSE9TVE5BTUVTID0gMTA7CisKKwlwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzOworCisJLyoqCisJICogU2VydmVyVUlQcmVmZXJlbmNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFNlcnZlclVJUHJlZmVyZW5jZXMoKSB7CisJCXN1cGVyKCk7CisJCXByZWZlcmVuY2VzID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgeworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfTEFVTkNIX01PREUsIGdldERlZmF1bHRMYXVuY2hNb2RlKCkpOworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfTEFVTkNIX01PREUyLCBnZXREZWZhdWx0TGF1bmNoTW9kZTIoKSk7CisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9FTkFCTEVfQlJFQUtQT0lOVFMsIGdldERlZmF1bHRFbmFibGVCcmVha3BvaW50cygpKTsKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1JFU1RBUlQsIGdldERlZmF1bHRSZXN0YXJ0KCkpOworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfU0FWRV9FRElUT1JTLCBnZXREZWZhdWx0U2F2ZUVkaXRvcnMoKSk7CisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9IT1NUX05BTUVTLCAibG9jYWxob3N0Iik7CisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9TSE9XX09OX0FDVElWSVRZLCB0cnVlKTsKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0NSRUFURV9TRVJWRVJfV0lUSF9SVU5USU1FLCBmYWxzZSk7CisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9QVUJMSVNIX09OX0FERF9SRU1PVkUsIHRydWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQKKwkgKiB3aGVuIHRoZSBsYXVuY2ggbW9kZSBvZiB0aGUgc2VydmVyIGRvZXNuJ3QgbWF0Y2guCisJICoKKwkgKiBAcmV0dXJuIGJ5dGUKKwkgKi8KKwlwdWJsaWMgYnl0ZSBnZXREZWZhdWx0TGF1bmNoTW9kZSgpIHsKKwkJcmV0dXJuIExBVU5DSF9NT0RFX1BST01QVDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHdoZW4gdGhlIGxhdW5jaCBtb2RlCisJICogb2YgdGhlIHNlcnZlciBkb2Vzbid0IG1hdGNoLgorCSAqIAorCSAqIEByZXR1cm4gaW50CisJICovCisJcHVibGljIGludCBnZXRMYXVuY2hNb2RlKCkgeworCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfTEFVTkNIX01PREUpOworCX0KKworCS8qKgorCSAqIFNldHMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgbGF1bmNoIG1vZGUKKwkgKiBvZiB0aGUgc2VydmVyIGRvZXNuJ3QgbWF0Y2guCisJICoKKwkgKiBAcGFyYW0gYiBhIGxhdW5jaCBtb2RlIGNvbnN0YW50CisJICovCisJcHVibGljIHZvaWQgc2V0TGF1bmNoTW9kZShpbnQgYikgeworCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0xBVU5DSF9NT0RFLCBiKTsKKwkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkCisJICogd2hlbiB0aGUgbGF1bmNoIG1vZGUgb2YgdGhlIHNlcnZlciBkb2Vzbid0IG1hdGNoLgorCSAqCisJICogQHJldHVybiBieXRlCisJICovCisJcHVibGljIGJ5dGUgZ2V0RGVmYXVsdExhdW5jaE1vZGUyKCkgeworCQlyZXR1cm4gTEFVTkNIX01PREUyX1BST01QVDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHdoZW4gdGhlIGxhdW5jaCBtb2RlCisJICogb2YgdGhlIHNlcnZlciBkb2Vzbid0IG1hdGNoLgorCSAqIAorCSAqIEByZXR1cm4gaW50CisJICovCisJcHVibGljIGludCBnZXRMYXVuY2hNb2RlMigpIHsKKwkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX0xBVU5DSF9NT0RFMik7CisJfQorCisJLyoqCisJICogU2V0cyB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB3aGVuIHRoZSBsYXVuY2ggbW9kZQorCSAqIG9mIHRoZSBzZXJ2ZXIgZG9lc24ndCBtYXRjaC4KKwkgKgorCSAqIEBwYXJhbSBiIGEgbGF1bmNoIG1vZGUgY29uc3RhbnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMYXVuY2hNb2RlMihpbnQgYikgeworCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0xBVU5DSF9NT0RFMiwgYik7CisJCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZAorCSAqIHdoZW4gdGhlIGJyZWFrcG9pbnQgZW5hYmxlbWVudCBkb2Vzbid0IG1hdGNoIHRoZSBzZXJ2ZXIgc3RhdGUuCisJICoKKwkgKiBAcmV0dXJuIGludAorCSAqLworCXB1YmxpYyBieXRlIGdldERlZmF1bHRFbmFibGVCcmVha3BvaW50cygpIHsKKwkJcmV0dXJuIEVOQUJMRV9CUkVBS1BPSU5UU19QUk9NUFQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB3aGVuIHRoZSBicmVha3BvaW50CisJICogZW5hYmxlbWVudCBkb2Vzbid0IG1hdGNoIHRoZSBzZXJ2ZXIgc3RhdGUuCisJICogCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldEVuYWJsZUJyZWFrcG9pbnRzKCkgeworCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfRU5BQkxFX0JSRUFLUE9JTlRTKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHdoZW4gdGhlIGJyZWFrcG9pbnQKKwkgKiBlbmFibGVtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHNlcnZlciBzdGF0ZS4KKwkgKgorCSAqIEBwYXJhbSBiIGEgYnJlYWtwb2ludCBlbmFibGVtZW50IGNvbnN0YW50CisJICovCisJcHVibGljIHZvaWQgc2V0RW5hYmxlQnJlYWtwb2ludHMoaW50IGIpIHsKKwkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9FTkFCTEVfQlJFQUtQT0lOVFMsIGIpOworCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQKKwkgKiB3aGVuIHRoZSBzZXJ2ZXIgcmVxdWlyZXMgcmVzdGFydGluZy4KKwkgKgorCSAqIEByZXR1cm4gaW50CisJICovCisJcHVibGljIGJ5dGUgZ2V0RGVmYXVsdFJlc3RhcnQoKSB7CisJCXJldHVybiBSRVNUQVJUX1BST01QVDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHdoZW4gdGhlIHNlcnZlciByZXF1aXJlcworCSAqIHJlc3RhcnRpbmcuCisJICogCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFJlc3RhcnQoKSB7CisJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9SRVNUQVJUKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHdoZW4gdGhlIHNlcnZlciByZXF1aXJlcyByZXN0YXJ0aW5nLgorCSAqCisJICogQHBhcmFtIGIgYSBicmVha3BvaW50IGVuYWJsZW1lbnQgY29uc3RhbnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXN0YXJ0KGludCBiKSB7CisJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfUkVTVEFSVCwgYik7CisJCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW1wb3J0IGxvY2F0aW9uLgorCSAqCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHVibGljIFN0cmluZyBnZXRJbXBvcnRMb2NhdGlvbigpIHsKKwkJcmV0dXJuIHByZWZlcmVuY2VzLmdldFN0cmluZyhQUkVGX0lNUE9SVF9MT0NBVElPTik7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgaW1wb3J0IGxvY2F0aW9uLgorCSAqCisJICogQHBhcmFtIHMgdGhlIGltcG9ydCBsb2NhdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNldEltcG9ydExvY2F0aW9uKFN0cmluZyBzKSB7CisJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfSU1QT1JUX0xPQ0FUSU9OLCBzKTsKKwkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHNhdmluZyBlZGl0b3JzIGJlZm9yZSBsYXVuY2hpbmcuCisJICogCisJICogQHJldHVybiBieXRlCisJICovCisJcHVibGljIGJ5dGUgZ2V0RGVmYXVsdFNhdmVFZGl0b3JzKCkgeworCQlyZXR1cm4gU0FWRV9FRElUT1JTX1BST01QVDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciBzYXZpbmcgZWRpdG9ycyBiZWZvcmUgbGF1bmNoaW5nLgorCSAqIAorCSAqIEByZXR1cm4gYnl0ZQorCSAqLworCXB1YmxpYyBieXRlIGdldFNhdmVFZGl0b3JzKCkgeworCQlyZXR1cm4gKGJ5dGUpIHByZWZlcmVuY2VzLmdldEludChQUkVGX1NBVkVfRURJVE9SUyk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgZm9yIHNhdmluZyBlZGl0b3JzIGJlZm9yZSBsYXVuY2hpbmcuCisJICogCisJICogQHBhcmFtIGIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTYXZlRWRpdG9ycyhieXRlIGIpIHsKKwkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9TQVZFX0VESVRPUlMsIGIpOworCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3Igb3BlbmluZyB0aGUgc2VydmVycyB2aWV3IG9uIGFjdGl2aXR5LgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRTaG93T25BY3Rpdml0eSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3Igb3BlbmluZyB0aGUgc2VydmVycyB2aWV3IG9uIGFjdGl2aXR5LgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIGdldFNob3dPbkFjdGl2aXR5KCkgeworCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX1NIT1dfT05fQUNUSVZJVFkpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIGZvciBvcGVuaW5nIHRoZSBzZXJ2ZXJzIHZpZXcgb24gYWN0aXZpdHkuCisJICogCisJICogQHBhcmFtIGIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaG93T25BY3Rpdml0eShib29sZWFuIGIpIHsKKwkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9TSE9XX09OX0FDVElWSVRZLCBiKTsKKwkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgbW9zdCByZWNlbnRseSB1c2VkIGhvc3RuYW1lcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBob3N0bmFtZXMKKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEhvc3RuYW1lcygpIHsKKwkJU3RyaW5nIHMgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUFJFRl9IT1NUX05BTUVTKTsKKwkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAifCp8Iik7CisJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCWxpc3QuYWRkKHN0Lm5leHRUb2tlbigpKTsKKwkJfQorCQlyZXR1cm4gbGlzdDsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBuZXcgaG9zdG5hbWUgdG8gdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBsaXN0LgorCSAqICAKKwkgKiBAcGFyYW0gaG9zdG5hbWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRIb3N0bmFtZShTdHJpbmcgaG9zdG5hbWUpIHsKKwkJaWYgKCJsb2NhbGhvc3QiLmVxdWFscyhob3N0bmFtZSkpCisJCQlyZXR1cm47CisJCQorCQlMaXN0PFN0cmluZz4gbGlzdCA9IGdldEhvc3RuYW1lcygpOworCQkKKwkJLy8gcmVtb3ZlIGR1cGxpY2F0ZXMKKwkJaWYgKGxpc3QuY29udGFpbnMoaG9zdG5hbWUpKQorCQkJbGlzdC5yZW1vdmUoaG9zdG5hbWUpOworCQkKKwkJLy8gYWx3YXlzIGFkZCBzZWNvbmQgKGxlYXZlIGxvY2FsaG9zdCBmaXJzdCkKKwkJbGlzdC5hZGQoMSwgaG9zdG5hbWUpOworCQkKKwkJLy8gcmVtb3ZlIGxlYXN0IHVzZWQgaG9zdG5hbWUKKwkJaWYgKGxpc3Quc2l6ZSgpID4gTUFYX0hPU1ROQU1FUykKKwkJCWxpc3QucmVtb3ZlKGxpc3Quc2l6ZSgpIC0gMSk7CisJCQorCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgcyA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCXNiLmFwcGVuZChzKTsKKwkJCXNiLmFwcGVuZCgifCp8Iik7CisJCX0KKwkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9IT1NUX05BTUVTLCBzYi50b1N0cmluZygpKTsKKwkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciB3aGV0aGVyIGEgc2VydmVyIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggcnVudGltZXMKKwkgKiB3aGVuIHBvc3NpYmxlLgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIGdldENyZWF0ZVNlcnZlcldpdGhSdW50aW1lKCkgeworCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX0NSRUFURV9TRVJWRVJfV0lUSF9SVU5USU1FKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBmb3Igd2hldGhlciBhIHNlcnZlciBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIHJ1bnRpbWVzCisJICogd2hlbiBwb3NzaWJsZS4KKwkgKiAKKwkgKiBAcGFyYW0gYgorCSAqLworCXB1YmxpYyB2b2lkIHNldENyZWF0ZVNlcnZlcldpdGhSdW50aW1lKGJvb2xlYW4gYikgeworCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0NSRUFURV9TRVJWRVJfV0lUSF9SVU5USU1FLCBiKTsKKwkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciBwdWJsaXNoaW5nIHdoZW4gbW9kdWxlcyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoT25BZGRSZW1vdmVNb2R1bGUoKSB7CisJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfUFVCTElTSF9PTl9BRERfUkVNT1ZFKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgcHVibGlzaGluZyB3aGVuIG1vZHVsZXMgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCisJICogCisJICogQHBhcmFtIGIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoT25BZGRSZW1vdmVNb2R1bGUoYm9vbGVhbiBiKSB7CisJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfUFVCTElTSF9PTl9BRERfUkVNT1ZFLCBiKTsKKwkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NmFkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVN0YXJ0dXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvLkF1ZGlvOworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cCNzdGFydHVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydHVwKCkgeworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJBdWRpbyBzdGFydHVwIik7CisKKwkJZmluYWwgSVB1Ymxpc2hMaXN0ZW5lciBwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoZWQoSVNlcnZlciBzZXJ2ZXIsIElTdGF0dXMgc3RhdHVzKSB7CisJCQkJQXVkaW8ucGxheVNvdW5kKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnB1Ymxpc2hGaW5pc2hlZCIpOworCQkJfQorCQl9OworCQkKKwkJZmluYWwgSVNlcnZlckxpc3RlbmVyIHNlcnZlckxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKKwkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOworCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7CisJCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKKwkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7CisJCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCisJCQkJCQlBdWRpby5wbGF5U291bmQoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQuc2VydmVyU3RhcnQiKTsKKwkJCQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQorCQkJCQkJQXVkaW8ucGxheVNvdW5kKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlclN0b3AiKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkJSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7CisJCQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKKwkJCQkoKFNlcnZlcikgc2VydmVyKS5hZGRQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgeworCQkJCS8vIGRvIG5vdGhpbmcKKwkJCX0KKworCQkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgeworCQkJCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7CisJCQkJKChTZXJ2ZXIpIHNlcnZlcikucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7CisJCQl9CisJCX07CisJCVNlcnZlckNvcmUuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UZXJtaW5hdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVGVybWluYXRpb25EaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTRlYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVGVybWluYXRpb25EaWFsb2cuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisvKioKKyAqIERpYWxvZyB0aGF0IHByb21wdHMgYSB1c2VyIHRvIHNlZSBpZiBhIHNlcnZlciBzaG91bGQKKyAqIGJlIHRlcm1pbmF0ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXJtaW5hdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7CisJcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJOYW1lOworCisJLyoqCisJICogVGVybWluYXRpb25EaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50U2hlbGwgYSBzaGVsbAorCSAqIEBwYXJhbSBzZXJ2ZXJOYW1lIGEgc2VydmVyIG5hbWUKKwkgKi8KKwlwdWJsaWMgVGVybWluYXRpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBzZXJ2ZXJOYW1lKSB7CisJCXN1cGVyKHBhcmVudFNoZWxsKTsKKwkJdGhpcy5zZXJ2ZXJOYW1lID0gc2VydmVyTmFtZTsKKwkJc2V0QmxvY2tPbk9wZW4odHJ1ZSk7CisJfQorCisJLyoqCisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgeworCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7CisJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMudGVybWluYXRlU2VydmVyRGlhbG9nVGl0bGUpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1cHBlciBwYXJ0IAorCSAqIG9mIHRoaXMgZGlhbG9nIChhYm92ZSB0aGUgYnV0dG9uIGJhcikuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCisJICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAorCSAqLworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuVEVSTUlOQVRFX1NFUlZFUl9ESUFMT0cpOworCQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKKwkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy50ZXJtaW5hdGVTZXJ2ZXJEaWFsb2dNZXNzYWdlLCBuZXcgU3RyaW5nW10ge3NlcnZlck5hbWV9KSk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZGF0YS53aWR0aEhpbnQgPSA0MDA7CisJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7CisJCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTEzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CisvKioKKyAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFjZSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIElORk8gPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVIgPSA1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBQRVJGT1JNQU5DRSA9IDY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVYVEVOU0lPTl9QT0lOVCA9IDc7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXZlbE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKwkJIkNPTkZJRyAiLCAiSU5GTyAgICIsICJXQVJOSU5HIiwgIlNFVkVSRSAiLCAiRklORVIgICIsICJGSU5FU1QgIiwgIlBFUkYgICAiLCAiRVhURU5TSU9OIn07CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJkZC9NTS95eSBISDptbS5zcy5TU1MiKTsKKworCXByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IGxvZ2dlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCS8qKgorCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHJpdmF0ZSBUcmFjZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KKwkgKgorCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCisJICogQHBhcmFtIHMgYSBtZXNzYWdlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7CisJCXRyYWNlKGxldmVsLCBzLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgorCSAqCisJICogQHBhcmFtIGxldmVsIGEgdHJhY2UgbGV2ZWwKKwkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKKwkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWlmIChsZXZlbCA9PSBTRVZFUkUpIHsKKwkJCWlmICghbG9nZ2VkLmNvbnRhaW5zKHMpKSB7CisJCQkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKKwkJCQlsb2dnZWQuYWRkKHMpOworCQkJfQorCQl9CisJCQorCQlpZiAoIVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKKwkJCXJldHVybjsKKwkJCisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEKTsKKwkJc2IuYXBwZW5kKCIgIik7CisJCXNiLmFwcGVuZChsZXZlbE5hbWVzW2xldmVsXSk7CisJCXNiLmFwcGVuZCgiICIpOworCQlzYi5hcHBlbmQoc2RmLmZvcm1hdChuZXcgRGF0ZSgpKSk7CisJCXNiLmFwcGVuZCgiICIpOworCQlzYi5hcHBlbmQocyk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKKwkJaWYgKHQgIT0gbnVsbCkKKwkJCXQucHJpbnRTdGFja1RyYWNlKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1dlYkxhdW5jaGFibGVDbGllbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1dlYkxhdW5jaGFibGVDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY5NGQwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvV2ViTGF1bmNoYWJsZUNsaWVudC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXZWJCcm93c2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5DbGllbnREZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5IdHRwTGF1bmNoYWJsZTsKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIFdlYkxhdW5jaGFibGVDbGllbnQgZXh0ZW5kcyBDbGllbnREZWxlZ2F0ZSB7CisJLyoKKwkgKiBAc2VlIENsaWVudERlbGVnYXRlI3N1cHBvcnRzKElMYXVuY2hhYmxlKQorCSAqLworCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKKwkJcmV0dXJuIChsYXVuY2hhYmxlIGluc3RhbmNlb2YgSHR0cExhdW5jaGFibGUpOworCX0KKworCS8qCisJICogQHNlZSBDbGllbnREZWxlZ2F0ZSNsYXVuY2goSUxhdW5jaGFibGUpCisJICovCisJcHVibGljIElTdGF0dXMgbGF1bmNoKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUsIElMYXVuY2ggbGF1bmNoKSB7CisJCUh0dHBMYXVuY2hhYmxlIGh0dHAgPSAoSHR0cExhdW5jaGFibGUpIGxhdW5jaGFibGU7CisJCXRyeSB7CisJCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7CisJCQlJV2ViQnJvd3NlciBicm93c2VyID0gYnJvd3NlclN1cHBvcnQuY3JlYXRlQnJvd3NlcihJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTE9DQVRJT05fQkFSIHwgSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0Lk5BVklHQVRJT05fQkFSLCBudWxsLCBudWxsLCBudWxsKTsKKwkJCWJyb3dzZXIub3BlblVSTChodHRwLmdldFVSTCgpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgYnJvd3NlciIsIGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RTZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZGUxM2EKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOworLyoqCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgeworCXByb3RlY3RlZCBMaXN0PElTZXJ2ZXI+IHNlcnZlcnM7CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNlcnZlciBjYW4gY3VycmVudGx5IGJlIGFjdGVkIG9uLgorCSAqCisJICogQHJldHVybiBib29sZWFuCisJICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcik7CisKKwkvKioKKwkgKiBQZXJmb3JtIGFjdGlvbiBvbiB0aGlzIHNlcnZlci4KKwkgKiAKKwkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcik7CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworCQlTaGVsbCBzaGVsbCA9IEVjbGlwc2VVdGlsLmdldFNoZWxsKCk7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOworCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOworCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgeworCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOworCQkJaWYgKGFjY2VwdChzZXJ2ZXIpKQorCQkJCXBlcmZvcm0oc2hlbGwsIHNlcnZlcik7CisJCQlzZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VydmVycykpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOworCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7CisJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOworCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKwkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7CisJCQkJaWYgKGFjY2VwdChzZXJ2ZXIpKSB7CisJCQkJCXNlcnZlcnMuYWRkKHNlcnZlcik7CisJCQkJCWVuYWJsZWQgPSB0cnVlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0JyZWFrcG9pbnREaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvQnJlYWtwb2ludERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODU4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0JyZWFrcG9pbnREaWFsb2cuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKy8qKgorICogQ3VzdG9tIG1lc3NhZ2UgZGlhbG9nIHRoYXQgaXMgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgbm90IGluIHRoZSBjb3JyZWN0IGxhdW5jaCBtb2RlLgorICovCitwdWJsaWMgY2xhc3MgQnJlYWtwb2ludERpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgeworCXByb3RlY3RlZCBib29sZWFuIHJlbWVtYmVyOworCisJcHVibGljIEJyZWFrcG9pbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKKwkJc3VwZXIocGFyZW50U2hlbGwsIE1lc3NhZ2VzLndpekRlYnVnT25TZXJ2ZXJUaXRsZSwgbnVsbCwKKwkJCU1lc3NhZ2VzLmRpYWxvZ0JyZWFrcG9pbnRzLCBNZXNzYWdlRGlhbG9nLldBUk5JTkcsCisJCQluZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuUFJPQ0VFRF9MQUJFTCwKKwkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7CisJfQorCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCWZpbmFsIEJ1dHRvbiByZW1lbWJlckIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKKwkJcmVtZW1iZXJCLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nUmVtZW1iZXIpOworCQlyZW1lbWJlckIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJcmVtZW1iZXIgPSByZW1lbWJlckIuZ2V0U2VsZWN0aW9uKCk7CisJCQl9CisJCX0pOworCQlyZXR1cm4gcmVtZW1iZXJCOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVtZW1iZXIoKSB7CisJCXJldHVybiByZW1lbWJlcjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9MYXVuY2hXaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTGF1bmNoV2l6YXJkQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlZTc2NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTGF1bmNoV2l6YXJkQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisvKioKKyAqIEFuIGFic3RyYWN0IGFjdGlvbiB0aGF0IG9wZW5zIHVwIGEgd29ya2JlbmNoIHdpemFyZCB3aGVuIHJ1bi4KKyAqLworYWJzdHJhY3QgY2xhc3MgTGF1bmNoV2l6YXJkQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkvKioKKwkgKiBMYXVuY2hXaXphcmRBY3Rpb24KKwkgKi8KKwlwdWJsaWMgTGF1bmNoV2l6YXJkQWN0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgd29ya2JlbmNoIHdpemFyZCB0aGF0IHNob3VsZCBiZSBvcGVuZWQuCisJICoKKwkgKiBAcmV0dXJuIHRoZSB3aXphcmQgdG8gb3BlbgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBJV29ya2JlbmNoV2l6YXJkIGdldFdpemFyZCgpOworCisJLyoKKwkgKiBAc2VlIElBY3Rpb24ucnVuKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKKwkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd29ya2JlbmNoV2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKKwkKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uVG9QYXNzID0gbnVsbDsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQorCQkJc2VsZWN0aW9uVG9QYXNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247CisJCWVsc2UKKwkJCXNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CisJCisJCUlXb3JrYmVuY2hXaXphcmQgd2l6YXJkID0gZ2V0V2l6YXJkKCk7CisJCXdpemFyZC5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uVG9QYXNzKTsKKwkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIHdpemFyZCk7CisJCWRpYWxvZy5vcGVuKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3U2VydmVyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjIzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLk5ld1NlcnZlcldpemFyZDsKKy8qKgorICogQWN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdTZXJ2ZXJBY3Rpb24gZXh0ZW5kcyBOZXdXaXphcmRBY3Rpb24geworCXByb3RlY3RlZCBTdHJpbmdbXSBpZHM7CisJcHJvdGVjdGVkIFN0cmluZ1tdIHZhbHVlczsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBOZXdTZXJ2ZXJBY3Rpb24uCisJICovCisJcHVibGljIE5ld1NlcnZlckFjdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgTmV3U2VydmVyQWN0aW9uIHdpdGggc29tZSBpbml0aWFsIHRhc2sgbW9kZWwKKwkgKiBwcm9wZXJ0aWVzLgorCSAqIAorCSAqIEBwYXJhbSBpZHMKKwkgKiBAcGFyYW0gdmFsdWVzCisJICovCisJcHVibGljIE5ld1NlcnZlckFjdGlvbihTdHJpbmdbXSBpZHMsIFN0cmluZ1tdIHZhbHVlcykgeworCQlzdXBlcigpOworCQl0aGlzLmlkcyA9IGlkczsKKwkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisJfQorCisJLyoqCisJICogUGVyZm9ybXMgdGhpcyBhY3Rpb24uCisJICogPHA+CisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIGRlbGVnYXRpbmcgYWN0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZC4KKwkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgdGhlIHByZXNlbnRhdGlvbiBwb3J0aW9uIG9mIHRoZQorCSAqICAgYWN0aW9uCisJICovCisJcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisJCU5ld1NlcnZlcldpemFyZCB3aXphcmQgPSBudWxsOworCQlpZiAoaWRzID09IG51bGwpCisJCQl3aXphcmQgPSBuZXcgTmV3U2VydmVyV2l6YXJkKCk7CisJCWVsc2UKKwkJCXdpemFyZCA9IG5ldyBOZXdTZXJ2ZXJXaXphcmQoaWRzLCB2YWx1ZXMpOworCQl3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7CisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCB3aXphcmQpOworCQlkaWFsb2cub3BlbigpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlcldpemFyZEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdTZXJ2ZXJXaXphcmRBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzFhMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdTZXJ2ZXJXaXphcmRBY3Rpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuTmV3U2VydmVyV2l6YXJkOworLyoqCisgKiBBbiBhY3Rpb24gdG8gaW52b2tlIHRoZSBuZXcgc2VydmVyIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbiB3aXphcmQuCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24gZXh0ZW5kcyBMYXVuY2hXaXphcmRBY3Rpb24geworCXByb3RlY3RlZCBTdHJpbmdbXSBpZHM7CisJcHJvdGVjdGVkIFN0cmluZ1tdIHZhbHVlczsKKworCS8qKgorCSAqIE5ldyBzZXJ2ZXIgYWN0aW9uLgorCSAqLworCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24oKSB7CisJCXN1cGVyKCk7CisJCisJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9ORVdfU0VSVkVSKSk7CisJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU2V0TmV3U2VydmVyKTsKKwl9CisJCisJLyoqCisJICogTmV3IHNlcnZlciBhY3Rpb24uCisJICogCisJICogQHBhcmFtIGlkcyBpZHMgdG8gcGFzcyBpbnRvIHRoZSBhY3Rpb24KKwkgKiBAcGFyYW0gdmFsdWVzIHZhbHVlcyB0byBwYXNzIGludG8gdGhlIGFjdGlvbgorCSAqLworCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24oU3RyaW5nW10gaWRzLCBTdHJpbmdbXSB2YWx1ZXMpIHsKKwkJdGhpcygpOworCQl0aGlzLmlkcyA9IGlkczsKKwkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSB3aXphcmQgdGhhdCBzaG91bGQgYmUgb3BlbmVkLgorCSAqCisJICogQHJldHVybiBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkCisJICovCisJcHJvdGVjdGVkIElXb3JrYmVuY2hXaXphcmQgZ2V0V2l6YXJkKCkgeworCQlyZXR1cm4gbmV3IE5ld1NlcnZlcldpemFyZChpZHMsIHZhbHVlcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2l6YXJkQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dpemFyZEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmY2YzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dpemFyZEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKKy8qKgorICogQWN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBzZXJ2ZXIgZWxlbWVudCB0aHJvdWdoIGEgd2l6YXJkLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3V2l6YXJkQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKKwlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7CisJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKKworCS8qKgorCSAqIE5ld1dpemFyZEFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBOZXdXaXphcmRBY3Rpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogRGlzcG9zZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUuICBUaGUgaW1wbGVtZW50b3Igc2hvdWxkIHVuaG9vayBhbnkgcmVmZXJlbmNlcworCSAqIHRvIGl0c2VsZiBzbyB0aGF0IGdhcmJhZ2UgY29sbGVjdGlvbiBjYW4gb2NjdXIuCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHdpdGggdGhlIHdvcmtiZW5jaCB3aW5kb3cgaXQgd2lsbCB3b3JrIGluLgorCSAqCisJICogQHBhcmFtIHdpbmRvdyB0aGUgd2luZG93IHRoYXQgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgZGVsZWdhdGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7CisJCXdvcmtiZW5jaCA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKTsKKwl9CisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB0aGF0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaCBoYXMgY2hhbmdlZC4KKwkgKiA8cD4KKwkgKiBJbXBsZW1lbnRlcnMgY2FuIHVzZSB0aGlzIG9wcG9ydHVuaXR5IHRvIGNoYW5nZSB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZQorCSAqIGFjdGlvbiBvciB0byBtb2RpZnkgb3RoZXIgcHJlc2VudGF0aW9uIHByb3BlcnRpZXMuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgYWN0aW9uCisJICogQHBhcmFtIHNlbCB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsKSB7CisJCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKKwkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOworCQllbHNlCisJCQlzZWxlY3Rpb24gPSBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL09wdGlvbnNNZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL09wdGlvbnNNZXNzYWdlRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlNzdlMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvT3B0aW9uc01lc3NhZ2VEaWFsb2cuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKy8qKgorICogQ3VzdG9tIG1lc3NhZ2UgZGlhbG9nIHRoYXQgZGlzcGxheXMgYSBzZXQgb2Ygb3B0aW9ucy4KKyAqIFJldHVybiB2YWx1ZSBpcyB0aGUgb3B0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBPcHRpb25zTWVzc2FnZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgeworCXByb3RlY3RlZCBpbnQgcmFkaW87CisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtZW1iZXI7CisJcHJvdGVjdGVkIFN0cmluZ1tdIG9wdGlvbnM7CisKKwlwdWJsaWMgT3B0aW9uc01lc3NhZ2VEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIFN0cmluZ1tdIG9wdGlvbnMpIHsKKwkJc3VwZXIocGFyZW50U2hlbGwsIHRpdGxlLCBudWxsLCBkaWFsb2dNZXNzYWdlLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAorCQkJbmV3IFN0cmluZ1tdIHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDApOworCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworCQlpZiAob3B0aW9ucyA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBvcHRpb24iKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgIC8vIGNyZWF0ZSBtZXNzYWdlIGFyZWEKKyAgICAgIGNyZWF0ZU1lc3NhZ2VBcmVhKHBhcmVudCk7CisgICAgICAvLyBjcmVhdGUgdGhlIHRvcCBsZXZlbCBjb21wb3NpdGUgZm9yIHRoZSBkaWFsb2cgYXJlYQorICAgICAgLypDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKyAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKyAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKyAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKyAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKyAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ki8KKyAgICAgIGNyZWF0ZUN1c3RvbUFyZWEocGFyZW50KTsKKyAgICAgIHJldHVybiBwYXJlbnQ7CisgIH0KKworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQlpbnQgc2l6ZSA9IG9wdGlvbnMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQkJCisJCQlCdXR0b24gcmFkaW9CID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7CisJCQlyYWRpb0Iuc2V0VGV4dChvcHRpb25zW2ldKTsKKwkJCWZpbmFsIGludCB4ID0gaTsKKwkJCXJhZGlvQi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCXJhZGlvID0geDsKKwkJCQl9CisJCQl9KTsKKwkJCWlmIChpID09IDApIHsKKwkJCQlyYWRpb0Iuc2V0U2VsZWN0aW9uKHRydWUpOworCQkJCXJhZGlvID0gMDsKKwkJCX0KKwkJfQorCQkKKwkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCQorCQlmaW5hbCBCdXR0b24gcmVtZW1iZXJCID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7CisJCXJlbWVtYmVyQi5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ1JlbWVtYmVyKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJcmVtZW1iZXJCLnNldExheW91dERhdGEoZGF0YSk7CisJCXJlbWVtYmVyQi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlyZW1lbWJlciA9IHJlbWVtYmVyQi5nZXRTZWxlY3Rpb24oKTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiByZW1lbWJlckI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKKwkJaWYgKGJ1dHRvbklkID09IDApCisJCQlzZXRSZXR1cm5Db2RlKHJhZGlvKTsKKwkJZWxzZQorCQkJc2V0UmV0dXJuQ29kZSg5KTsKKwkJY2xvc2UoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1JlbWVtYmVyKCkgeworCQlyZXR1cm4gcmVtZW1iZXI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzY0MmQzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqICJSdW4gb24gU2VydmVyIiBtZW51IGFjdGlvbi4gQWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBhbgorICogb2JqZWN0LCBhbmQgaGF2ZSBhdXRvbWF0aWMgc2VydmVyIGNyZWF0aW9uLCBsYXVuY2hpbmcsIGFuZAorICogdGhlIGFwcHJvcHJpYXRlIGNsaWVudCB0byBhcHBlYXIuIEEgbmV3IGluc3RhbmNlIG9mIHRoaXMKKyAqIGFjdGlvbiBtdXN0IGJlIGNyZWF0ZWQgZm9yIGVhY2ggb2JqZWN0IHRoYXQgdGhlIHVzZXIgc2VsZWN0cy4KKyAqLworcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwlwcm90ZWN0ZWQgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTsKKworCS8qKgorCSAqIFJ1biBvbiBzZXJ2ZXIgYWN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhdHRlbXB0IHRvIGRlYnVnCisJICovCisJcHVibGljIFJ1bk9uU2VydmVyQWN0aW9uKE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIoTWVzc2FnZXMuYWN0aW9uUnVuT25TZXJ2ZXIpOworCQorCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9SVU5fT05fU0VSVkVSKSk7CisJCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NUT09MX1JVTl9PTl9TRVJWRVIpKTsKKwkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VUT09MX1JVTl9PTl9TRVJWRVIpKTsKKwkKKwkJZGVsZWdhdGUgPSBuZXcgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpOworCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKKwkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KTsKKwkJCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgc2VsKTsKKwkJfSBlbHNlCisJCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIG51bGwpOworCX0KKworCS8qKgorCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJZGVsZWdhdGUucnVuKHRoaXMpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjBjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDgxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiugKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklMYXVuY2hhYmxlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLk1vZHVsZUFydGlmYWN0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOworLyoqCisgKiBTdXBwb3J0IGZvciBzdGFydGluZy9zdG9wcGluZyBzZXJ2ZXIgYW5kIGNsaWVudHMgZm9yIHJlc291cmNlcyBydW5uaW5nIG9uIGEgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsYXVuY2hNb2RlcyA9IHsKKwkJSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUsIElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSB9OworCisJcHJvdGVjdGVkIE9iamVjdCBzZWxlY3Rpb247CisKKwlwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7CisKKwlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnbG9iYWxTZWxlY3Rpb247CisKKwlwcm90ZWN0ZWQgc3RhdGljIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGdsb2JhbExhdW5jaE1vZGU7CisJcHJvdGVjdGVkIFN0cmluZyBsYXVuY2hNb2RlID0gSUxhdW5jaE1hbmFnZXIuUlVOX01PREU7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiB0YXNrc0FuZENsaWVudFNob3duOworCisJcHJvdGVjdGVkIElMYXVuY2hhYmxlQWRhcHRlciBsYXVuY2hhYmxlQWRhcHRlcjsKKwlwcm90ZWN0ZWQgSUNsaWVudCBjbGllbnQ7CisKKwkvKioKKwkgKiBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogRGlzcG9zZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUuICBUaGUgaW1wbGVtZW50b3Igc2hvdWxkIHVuaG9vayBhbnkgcmVmZXJlbmNlcworCSAqIHRvIGl0c2VsZiBzbyB0aGF0IGdhcmJhZ2UgY29sbGVjdGlvbiBjYW4gb2NjdXIuCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJd2luZG93ID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB3aXRoIHRoZSB3b3JrYmVuY2ggd2luZG93IGl0IHdpbGwgd29yayBpbi4KKwkgKgorCSAqIEBwYXJhbSBuZXdXaW5kb3cgdGhlIHdpbmRvdyB0aGF0IHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGlzIGRlbGVnYXRlCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IG5ld1dpbmRvdykgeworCQl3aW5kb3cgPSBuZXdXaW5kb3c7CisJfQorCisJcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKElNb2R1bGUgbW9kdWxlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZ2V0RGVmYXVsdFNlcnZlcihtb2R1bGUpOworCQkKKwkJLy8gaWdub3JlIHByZWZlcmVuY2UgaWYgdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgdGhpcyBtb2RlLgorCQlpZiAoc2VydmVyICE9IG51bGwgJiYgIVNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlciwgbGF1bmNoTW9kZSkpCisJCQlzZXJ2ZXIgPSBudWxsOworCQkKKwkJaWYgKHNlcnZlciAhPSBudWxsICYmICFTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwgbW9kdWxlLCBtb25pdG9yKSkgeworCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7CisJCQl0cnkgeworCQkJCVNlcnZlclV0aWwubW9kaWZ5TW9kdWxlcyh3YywgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBuZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7CisJCQkJd2Muc2F2ZShmYWxzZSwgbW9uaXRvcik7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGFkZCBtb2R1bGUgdG8gc2VydmVyIiwgY2UpOworCQkJCXNlcnZlciA9IG51bGw7CisJCQl9CisJCX0KKwkJCisJCVNoZWxsIHNoZWxsOworCQlpZiAod2luZG93ICE9IG51bGwpCisJCQlzaGVsbCA9IHdpbmRvdy5nZXRTaGVsbCgpOworCQllbHNlCisJCQlzaGVsbCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKKwkJCisJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgeworCQkJLy8gdHJ5IHRoZSBmdWxsIHdpemFyZAorCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTGF1bmNoaW5nIHdpemFyZCIpOworCQkJUnVuT25TZXJ2ZXJXaXphcmQgd2l6YXJkID0gbmV3IFJ1bk9uU2VydmVyV2l6YXJkKG1vZHVsZSwgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QpOworCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7CisJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7CisJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKKwkJCQkJbW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCQorCQkJdHJ5IHsKKwkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZmFtaWx5IiwgbnVsbCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciB3YWl0aW5nIGZvciBqb2IiLCBlKTsKKwkJCX0KKwkJCXNlcnZlciA9IHdpemFyZC5nZXRTZXJ2ZXIoKTsKKwkJCWJvb2xlYW4gcHJlZmVycmVkID0gd2l6YXJkLmlzUHJlZmVycmVkU2VydmVyKCk7CisJCQl0YXNrc0FuZENsaWVudFNob3duID0gdHJ1ZTsKKwkJCWNsaWVudCA9IHdpemFyZC5nZXRTZWxlY3RlZENsaWVudCgpOworCQkJbGF1bmNoYWJsZUFkYXB0ZXIgPSB3aXphcmQuZ2V0TGF1bmNoYWJsZUFkYXB0ZXIoKTsKKwkJCQorCQkJLy8gc2V0IHByZWZlcnJlZCBzZXJ2ZXIgaWYgcmVxdWVzdGVkCisJCQlpZiAoc2VydmVyICE9IG51bGwgJiYgcHJlZmVycmVkKSB7CisJCQkJdHJ5IHsKKwkJCQkJU2VydmVyQ29yZS5zZXREZWZhdWx0U2VydmVyKG1vZHVsZSwgc2VydmVyLCBtb25pdG9yKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVQcmVmZXJlbmNlOworCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIG1lc3NhZ2UsIGNlLmdldFN0YXR1cygpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXRyeSB7CisJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZmFtaWx5IiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3Igd2FpdGluZyBmb3Igam9iIiwgZSk7CisJCX0KKwkJCisJCXJldHVybiBzZXJ2ZXI7CisJfQorCisJLyoqCisJICogUnVuIHRoZSByZXNvdXJjZSBvbiBhIHNlcnZlci4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBydW4oKSB7CisJCWZpbmFsIElNb2R1bGVBcnRpZmFjdFtdIG1vZHVsZUFydGlmYWN0cyA9IFNlcnZlclBsdWdpbi5nZXRNb2R1bGVBcnRpZmFjdHMoc2VsZWN0aW9uKTsKKwkJaWYgKG1vZHVsZUFydGlmYWN0cyA9PSBudWxsIHx8IG1vZHVsZUFydGlmYWN0cy5sZW5ndGggPT0gMCB8fCBtb2R1bGVBcnRpZmFjdHNbMF0gPT0gbnVsbCkgeworCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKE1lc3NhZ2VzLmVycm9yTm9BcnRpZmFjdCk7CisJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJObyBtb2R1bGUgYXJ0aWZhY3QgZm91bmQiKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJU2hlbGwgc2hlbGwyID0gbnVsbDsKKwkJaWYgKHdpbmRvdyAhPSBudWxsKQorCQkJc2hlbGwyID0gd2luZG93LmdldFNoZWxsKCk7CisJCWVsc2UgeworCQkJdHJ5IHsKKwkJCQlzaGVsbDIgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJaWYgKHNoZWxsMiA9PSBudWxsKQorCQkJCXNoZWxsMiA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCk7CisJCX0KKwkJZmluYWwgU2hlbGwgc2hlbGwgPSBzaGVsbDI7CisJCWZpbmFsIElBZGFwdGFibGUgaW5mbyA9IG5ldyBJQWRhcHRhYmxlKCkgeworCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKKwkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQorCQkJCQlyZXR1cm4gc2hlbGw7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX07CisJCQorCQkvLyBnZXQgYSB2YWxpZCBNb2R1bGVBcnRpZmFjdCB0aGF0IHdlIGNhbiB1c2UgZm9yIGxhdW5jaGluZworCQkvLyBUT0RPIFRoZSBNb2R1bGVBcnRpZmFjdENvbXBvc2l0ZSBzaG91bGQgYmUgcGFydCBvZiB0aGUgUnVuT25TZXJ2ZXJXaXphcmQKKwkJZmluYWwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0OworCQlpZiAobW9kdWxlQXJ0aWZhY3RzLmxlbmd0aCA+IDEpIHsKKwkJCU1vZHVsZUFydGlmYWN0Q29tcG9zaXRlIGFydGlmYWN0Q29tcG9zaXRlID0gbmV3IE1vZHVsZUFydGlmYWN0Q29tcG9zaXRlKHNoZWxsLCBtb2R1bGVBcnRpZmFjdHMsIGxhdW5jaE1vZGUpOworCQkJaWYgKGFydGlmYWN0Q29tcG9zaXRlLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKQorCQkJCXJldHVybjsKKwkJCQorCQkJbW9kdWxlQXJ0aWZhY3QgPSBhcnRpZmFjdENvbXBvc2l0ZS5nZXRTZWxlY3Rpb24oKTsKKwkJfSBlbHNlCisJCQltb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0c1swXTsKKwkJCisJCWlmIChtb2R1bGVBcnRpZmFjdC5nZXRNb2R1bGUoKSA9PSBudWxsKSB7IC8vIDE0OTQyNQorCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKE1lc3NhZ2VzLmVycm9yTm9Nb2R1bGVzKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIk1vZHVsZSBhcnRpZmFjdCBub3QgY29udGFpbmVkIGluIGEgbW9kdWxlIik7CisJCQlyZXR1cm47CisJCX0KKwkJZmluYWwgSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVBcnRpZmFjdC5nZXRNb2R1bGUoKTsKKwkJCisJCS8vIGNoZWNrIGZvciBzZXJ2ZXJzIHdpdGggdGhlIGdpdmVuIHN0YXJ0IG1vZGUKKwkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlpZiAoc2VydmVycyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplICYmICFmb3VuZDsgaSsrKSB7CisJCQkJaWYgKFNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlcnNbaV0sIGxhdW5jaE1vZGUpKSB7CisJCQkJCXRyeSB7CisJCQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlcnNbaV0uZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBudWxsKTsKKwkJCQkJCWlmIChwYXJlbnRzICE9IG51bGwgJiYgcGFyZW50cy5sZW5ndGggPiAwKQorCQkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCS8vIGlnbm9yZQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAoIWZvdW5kKSB7CisJCQkvLyBubyBleGlzdGluZyBzZXJ2ZXIgc3VwcG9ydHMgdGhlIHByb2plY3QgYW5kIHN0YXJ0IG1vZGUhCisJCQkvLyBjaGVjayBpZiB0aGVyZSBtaWdodCBiZSBhbm90aGVyIG9uZSB0aGF0IGNhbiBiZSBjcmVhdGVkCisJCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOworCQkJaWYgKHNlcnZlclR5cGVzICE9IG51bGwpIHsKKwkJCQlpbnQgc2l6ZSA9IHNlcnZlclR5cGVzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgJiYgIWZvdW5kOyBpKyspIHsKKwkJCQkJSVNlcnZlclR5cGUgdHlwZSA9IHNlcnZlclR5cGVzW2ldOworCQkJCQlJTW9kdWxlVHlwZVtdIG1vZHVsZVR5cGVzID0gdHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCk7CisJCQkJCWlmICh0eXBlLnN1cHBvcnRzTGF1bmNoTW9kZShsYXVuY2hNb2RlKSAmJiBTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKG1vZHVsZVR5cGVzLCBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpKSkgeworCQkJCQkJZm91bmQgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKCFmb3VuZCkgeworCQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vU2VydmVyKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJObyBzZXJ2ZXIgZm9yIHN0YXJ0IG1vZGUiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJCisJCWlmICghU2VydmVyVUlQbHVnaW4uc2F2ZUVkaXRvcnMoKSkKKwkJCXJldHVybjsKKwkJCisJCXRhc2tzQW5kQ2xpZW50U2hvd24gPSBmYWxzZTsKKwkJSVNlcnZlciBzZXJ2ZXIyID0gbnVsbDsKKwkJY2xpZW50ID0gbnVsbDsKKwkJbGF1bmNoYWJsZUFkYXB0ZXIgPSBudWxsOworCQl0cnkgeworCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJCXNlcnZlcjIgPSBnZXRTZXJ2ZXIobW9kdWxlLCBtb2R1bGVBcnRpZmFjdCwgbW9uaXRvcik7CisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuOworCQkJCisJCQlpZiAoc2VydmVyMiAhPSBudWxsKSB7CisJCQkJSUZvbGRlciBmb2xkZXIgPSBzZXJ2ZXIyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKKwkJCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgZm9sZGVyLmdldFByb2plY3QoKSAhPSBudWxsICYmICFmb2xkZXIuZ2V0UHJvamVjdCgpLmlzT3BlbigpKQorCQkJCQlmb2xkZXIuZ2V0UHJvamVjdCgpLm9wZW4obW9uaXRvcik7CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihzaGVsbCwgY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwkJCXJldHVybjsKKwkJfQorCQlmaW5hbCBJU2VydmVyIHNlcnZlciA9IHNlcnZlcjI7CisJCS8vaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkvLwlyZXR1cm47CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTZXJ2ZXI6ICIgKyBzZXJ2ZXIpOworCQkKKwkJaWYgKHNlcnZlciA9PSBudWxsKSB7CisJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoTWVzc2FnZXMuZXJyb3JOb1NlcnZlcik7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJObyBzZXJ2ZXIgZm91bmQiKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5wcm9tcHRJZkRpcnR5KHNoZWxsLCBzZXJ2ZXIpKQorCQkJcmV0dXJuOworCQkKKwkJaWYgKCF0YXNrc0FuZENsaWVudFNob3duKSB7CisJCQlSdW5PblNlcnZlcldpemFyZCB3aXphcmQgPSBuZXcgUnVuT25TZXJ2ZXJXaXphcmQoc2VydmVyLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCk7CisJCQlpZiAod2l6YXJkLnNob3VsZEFwcGVhcigpKSB7CisJCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7CisJCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkKKwkJCQkJcmV0dXJuOworCQkJfSBlbHNlCisJCQkJd2l6YXJkLnBlcmZvcm1GaW5pc2goKTsKKwkJCWNsaWVudCA9IHdpemFyZC5nZXRTZWxlY3RlZENsaWVudCgpOworCQkJbGF1bmNoYWJsZUFkYXB0ZXIgPSB3aXphcmQuZ2V0TGF1bmNoYWJsZUFkYXB0ZXIoKTsKKwkJfQorCQkKKwkJLy8gaWYgdGhlcmUgaXMgbm8gY2xpZW50LCB1c2UgYSBkdW1teQorCQlpZiAoY2xpZW50ID09IG51bGwpIHsJCQorCQkJY2xpZW50ID0gbmV3IElDbGllbnQoKSB7CisJCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmNsaWVudERlZmF1bHREZXNjcmlwdGlvbjsKKwkJCQl9CisKKwkJCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQkJCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuY2xpZW50LmRlZmF1bHQiOworCQkJCX0KKworCQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmNsaWVudERlZmF1bHROYW1lOworCQkJCX0KKworCQkJCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlcjMsIE9iamVjdCBsYXVuY2hhYmxlMiwgU3RyaW5nIGxhdW5jaE1vZGUzLCBJTGF1bmNoIGxhdW5jaCkgeworCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCQl9CisKKwkJCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhJU2VydmVyIHNlcnZlcjMsIE9iamVjdCBsYXVuY2hhYmxlMiwgU3RyaW5nIGxhdW5jaE1vZGUzKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX07CisJCX0KKwkJCisJCWlmIChtb2R1bGVBcnRpZmFjdCBpbnN0YW5jZW9mIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUpIHsKKwkJCWJvb2xlYW4gY2FuTG9hZCA9IGZhbHNlOworCQkJdHJ5IHsKKwkJCQlDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShtb2R1bGVBcnRpZmFjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJCQkJaWYgKGMubmV3SW5zdGFuY2UoKSAhPSBudWxsKQorCQkJCQljYW5Mb2FkID0gdHJ1ZTsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIG1vZHVsZSBhcnRpZmFjdCBkZWxlZ2F0ZSBjbGFzcywgc3dpdGNoaW5nIHRvIGJhY2t1cCIpOworCQkJfQorCQkJaWYgKGNhbkxvYWQpIHsKKwkJCQl0cnkgeworCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKHNlcnZlciwgKE1vZHVsZUFydGlmYWN0RGVsZWdhdGUpIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50LCBtb25pdG9yKTsKKwkJCQkJY29uZmlnLmxhdW5jaChsYXVuY2hNb2RlLCBtb25pdG9yKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsYXVuY2ggUnVuIG9uIFNlcnZlciIsIGNlKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCQorCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgiUnVuIG9uIFNlcnZlciIpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJSZWFkeSB0byBsYXVuY2giKTsKKwkJCQkKKwkJCQkvLyBzdGFydCBzZXJ2ZXIgaWYgaXQncyBub3QgYWxyZWFkeSBzdGFydGVkCisJCQkJLy8gYW5kIGN1ZSB0aGUgY2xpZW50IHRvIHN0YXJ0CisJCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07IC8vIFRPRE86IGdldCBwYXJlbnQgaGllcmFyY2h5IGNvcnJlY3QKKwkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKKwkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykgeworCQkJCQlMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKKwkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7CisJCQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKKwkJCQkJYm9vbGVhbiByZXN0YXJ0ID0gZmFsc2U7CisJCQkJCVN0cmluZyBtb2RlID0gc2VydmVyLmdldE1vZGUoKTsKKwkJCQkJSUJyZWFrcG9pbnRNYW5hZ2VyIGJyZWFrcG9pbnRNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7CisJCQkJCWJvb2xlYW4gZGlzYWJsZWRCcmVha3BvaW50cyA9IGZhbHNlOworCQkJCQkKKwkJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkgeworCQkJCQkJaW50IHJlc3VsdCA9IG9wZW5SZXN0YXJ0RGlhbG9nKHNoZWxsKTsKKwkJCQkJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOworCQkJCQkJCXJlc3RhcnQgPSB0cnVlOworCQkJCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gOSkgLy8gY2FuY2VsCisJCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWlmICghcmVzdGFydCkgeworCQkJCQkJaWYgKCFJTGF1bmNoTWFuYWdlci5SVU5fTU9ERS5lcXVhbHMobW9kZSkgJiYgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7CisJCQkJCQkJYm9vbGVhbiBicmVha3BvaW50c09wdGlvbiA9IGZhbHNlOworCQkJCQkJCWlmIChicmVha3BvaW50TWFuYWdlci5pc0VuYWJsZWQoKSAmJiBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKKwkJCQkJCQkJYnJlYWtwb2ludHNPcHRpb24gPSB0cnVlOworCQkJCQkJCWludCByZXN1bHQgPSBvcGVuT3B0aW9uc0RpYWxvZyhzaGVsbCwgTWVzc2FnZXMud2l6UnVuT25TZXJ2ZXJUaXRsZSwgTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdSdW4sIGJyZWFrcG9pbnRzT3B0aW9uKTsKKwkJCQkJCQlpZiAocmVzdWx0ID09IDApCisJCQkJCQkJCXJlc3RhcnQgPSB0cnVlOworCQkJCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisJCQkJCQkJCWJyZWFrcG9pbnRNYW5hZ2VyLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQkJCQlkaXNhYmxlZEJyZWFrcG9pbnRzID0gdHJ1ZTsKKwkJCQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7CisJCQkJCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMikKKwkJCQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7CisJCQkJCQkJZWxzZSAvLyByZXN1bHQgPT0gOSAvLyBjYW5jZWwKKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJfSBlbHNlIGlmICghSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkgJiYgSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKKwkJCQkJCQlpbnQgcmVzdWx0ID0gb3Blbk9wdGlvbnNEaWFsb2coc2hlbGwsIE1lc3NhZ2VzLndpekRlYnVnT25TZXJ2ZXJUaXRsZSwgTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdEZWJ1ZywgZmFsc2UpOworCQkJCQkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQkJCQkJcmVzdGFydCA9IHRydWU7CisJCQkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCisJCQkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOworCQkJCQkJCWVsc2UgLy8gcmVzdWx0ID09IDkgLy8gY2FuY2VsCisJCQkJCQkJCXJldHVybjsKKwkJCQkJCX0gZWxzZSBpZiAoIUlMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkgJiYgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgeworCQkJCQkJCWJvb2xlYW4gYnJlYWtwb2ludHNPcHRpb24gPSBmYWxzZTsKKwkJCQkJCQlpZiAoYnJlYWtwb2ludE1hbmFnZXIuaXNFbmFibGVkKCkgJiYgSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCisJCQkJCQkJCWJyZWFrcG9pbnRzT3B0aW9uID0gdHJ1ZTsKKwkJCQkJCQlpbnQgcmVzdWx0ID0gb3Blbk9wdGlvbnNEaWFsb2coc2hlbGwsIE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ1Byb2ZpbGUsIGJyZWFrcG9pbnRzT3B0aW9uKTsKKwkJCQkJCQlpZiAocmVzdWx0ID09IDApCisJCQkJCQkJCXJlc3RhcnQgPSB0cnVlOworCQkJCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisJCQkJCQkJCWJyZWFrcG9pbnRNYW5hZ2VyLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQkJCQlkaXNhYmxlZEJyZWFrcG9pbnRzID0gdHJ1ZTsKKwkJCQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7CisJCQkJCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMikKKwkJCQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7CisJCQkJCQkJZWxzZSAvLyByZXN1bHQgPT0gOSAvLyBjYW5jZWwKKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKKwkJCQkJCQlpZiAoIWJyZWFrcG9pbnRNYW5hZ2VyLmlzRW5hYmxlZCgpICYmICFkaXNhYmxlZEJyZWFrcG9pbnRzKSB7CisJCQkJCQkJCWludCByZXN1bHQgPSBvcGVuQnJlYWtwb2ludERpYWxvZyhzaGVsbCk7CisJCQkJCQkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQkJCQkJCWJyZWFrcG9pbnRNYW5hZ2VyLnNldEVuYWJsZWQodHJ1ZSk7CisJCQkJCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisJCQkJCQkJCQkvLyBpZ25vcmUKKwkJCQkJCQkJfSBlbHNlIC8vIHJlc3VsdCA9PSAyCisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCQorCQkJCQlmaW5hbCBMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKKwkJCQkJaWYgKHJlc3RhcnQpIHsKKwkJCQkJCWZpbmFsIElTZXJ2ZXIgc2VydmVyMyA9IHNlcnZlcjsKKwkJCQkJCXNlcnZlci5yZXN0YXJ0KGxhdW5jaE1vZGUsIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKKwkJCQkJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7CisJCQkJCQkJCS8vIE9ubHkgcHVibGlzaCBpZiB0aGUgc2VydmVyIHJlcXVpcmVzIHB1Ymxpc2ggYmVmb3JlIGxhdW5jaGluZyB0aGUgY2xpZW50LgorCQkJCQkJCQlpZiAoc2VydmVyMy5zaG91bGRQdWJsaXNoKCkpIHsKKwkJCQkJCQkJCXNlcnZlcjMucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG51bGwsIGluZm8sIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKKwkJCQkJCQkJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0MikgeworCQkJCQkJCQkJCQlpZiAocmVzdWx0Mi5pc09LKCkpCisJCQkJCQkJCQkJCQljbGllbnRKb2Iuc2NoZWR1bGUoKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9KTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBPbmx5IHB1Ymxpc2ggaWYgdGhlIHNlcnZlciByZXF1aXJlcyBwdWJsaXNoIGJlZm9yZSBsYXVuY2hpbmcgdGhlIGNsaWVudC4KKwkJCQkJCWlmIChzZXJ2ZXIuc2hvdWxkUHVibGlzaCgpKSB7CisJCQkJCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7CisJCQkJCQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKKwkJCQkJCQkJCWlmIChyZXN1bHQuaXNPSygpKQorCQkJCQkJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOworCQkJCQkJCQl9CisJCQkJCQkJfSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIGlmIChzdGF0ZSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKSB7CisJCQkJCWZpbmFsIExhdW5jaENsaWVudEpvYiBjbGllbnRKb2IgPSBuZXcgTGF1bmNoQ2xpZW50Sm9iKHNlcnZlciwgbW9kdWxlcywgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIGxhdW5jaGFibGVBZGFwdGVyLCBjbGllbnQpOworCQkJCQkKKwkJCQkJc2VydmVyLnN0YXJ0KGxhdW5jaE1vZGUsIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKKwkJCQkJCQlpZiAocmVzdWx0LmlzT0soKSkKKwkJCQkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKKwkJdGhyZWFkLnN0YXJ0KCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLCBJU2VydmVyIHNlcnZlciwgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSBtb2R1bGVBcnRpZmFjdCwgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyLCBJQ2xpZW50IGNsaWVudCkgeworCQlTdHJpbmcgbGF1bmNoTmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJ1bk9uU2VydmVyTGF1bmNoQ29uZmlnTmFtZSwgbW9kdWxlQXJ0aWZhY3QuZ2V0TmFtZSgpKTsKKwkJbGF1bmNoTmFtZSA9IGdldFZhbGlkTGF1bmNoQ29uZmlndXJhdGlvbk5hbWUobGF1bmNoTmFtZSk7CisJCWlmICghbGF1bmNoTmFtZS5lcXVhbHMoY29uZmlnLmdldE5hbWUoKSkpIHsKKwkJCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOworCQkJbGF1bmNoTmFtZSA9IGxhdW5jaE1hbmFnZXIuZ2VuZXJhdGVVbmlxdWVMYXVuY2hDb25maWd1cmF0aW9uTmFtZUZyb20obGF1bmNoTmFtZSk7CisJCQljb25maWcucmVuYW1lKGxhdW5jaE5hbWUpOworCQl9CisJCQorCQljb25maWcuc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfU0VSVkVSX0lELCBzZXJ2ZXIuZ2V0SWQoKSk7CisJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQVRUUl9NT0RVTEVfQVJUSUZBQ1QsIG1vZHVsZUFydGlmYWN0LnNlcmlhbGl6ZSgpKTsKKwkJY29uZmlnLnNldEF0dHJpYnV0ZShSdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5BVFRSX01PRFVMRV9BUlRJRkFDVF9DTEFTUywgbW9kdWxlQXJ0aWZhY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCQlpZiAobGF1bmNoYWJsZUFkYXB0ZXIgIT0gbnVsbCkKKwkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQVRUUl9MQVVOQ0hBQkxFX0FEQVBURVJfSUQsIGxhdW5jaGFibGVBZGFwdGVyLmdldElkKCkpOworCQllbHNlCisJCQljb25maWcuc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfTEFVTkNIQUJMRV9BREFQVEVSX0lELCAoU3RyaW5nKW51bGwpOworCQljb25maWcuc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfQ0xJRU5UX0lELCBjbGllbnQuZ2V0SWQoKSk7CisJCQorCQl0cnkgeworCQkJSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZUFydGlmYWN0LmdldE1vZHVsZSgpLmdldFByb2plY3QoKTsKKwkJCWNvbmZpZy5zZXRNYXBwZWRSZXNvdXJjZXMobmV3IElSZXNvdXJjZVtdIHsgcHJvamVjdCB9KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgYXNzb2NpYXRlIGxhdW5jaCB3aXRoIGEgcHJvamVjdCIsIGUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uIGdldExhdW5jaENvbmZpZ3VyYXRpb24oSVNlcnZlciBzZXJ2ZXIsIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgbW9kdWxlQXJ0aWZhY3QsIElMYXVuY2hhYmxlQWRhcHRlciBsYXVuY2hhYmxlQWRhcHRlcjIsIElDbGllbnQgY2xpZW50MiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOworCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKKwkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGxhdW5jaENvbmZpZ1R5cGUgPSBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIik7CisJCUlMYXVuY2hDb25maWd1cmF0aW9uW10gbGF1bmNoQ29uZmlncyA9IG51bGw7CisJCXRyeSB7CisJCQlsYXVuY2hDb25maWdzID0gbGF1bmNoTWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9ucyhsYXVuY2hDb25maWdUeXBlKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUKKwkJfQorCQkKKwkJaWYgKGxhdW5jaENvbmZpZ3MgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBsYXVuY2hDb25maWdzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJTGlzdCBsaXN0ID0gbGF1bmNoQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9GQVZPUklURV9HUk9VUFMsIChMaXN0KW51bGwpOworCQkJCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCVN0cmluZyBzZXJ2ZXJJZDIgPSBsYXVuY2hDb25maWdzW2ldLmdldEF0dHJpYnV0ZShSdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5BVFRSX1NFUlZFUl9JRCwgKFN0cmluZykgbnVsbCk7CisJCQkJCQlpZiAoc2VydmVySWQuZXF1YWxzKHNlcnZlcklkMikpIHsKKwkJCQkJCQlmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnc1tpXS5nZXRXb3JraW5nQ29weSgpOworCQkJCQkJCXNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3Yywgc2VydmVyLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIyLCBjbGllbnQyKTsKKwkJCQkJCQlpZiAod2MuaXNEaXJ0eSgpKSB7CisJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQlyZXR1cm4gd2MuZG9TYXZlKCk7CisJCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNvbmZpZ3VyaW5nIGxhdW5jaCIsIGNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm4gbGF1bmNoQ29uZmlnc1tpXTsKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb25maWd1cmluZyBsYXVuY2giLCBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gY3JlYXRlIGEgbmV3IGxhdW5jaCBjb25maWd1cmF0aW9uCisJCVN0cmluZyBsYXVuY2hOYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMucnVuT25TZXJ2ZXJMYXVuY2hDb25maWdOYW1lLCBtb2R1bGVBcnRpZmFjdC5nZXROYW1lKCkpOworCQlsYXVuY2hOYW1lID0gZ2V0VmFsaWRMYXVuY2hDb25maWd1cmF0aW9uTmFtZShsYXVuY2hOYW1lKTsKKwkJbGF1bmNoTmFtZSA9IGxhdW5jaE1hbmFnZXIuZ2VuZXJhdGVVbmlxdWVMYXVuY2hDb25maWd1cmF0aW9uTmFtZUZyb20obGF1bmNoTmFtZSk7IAorCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnVHlwZS5uZXdJbnN0YW5jZShudWxsLCBsYXVuY2hOYW1lKTsKKwkJd2Muc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfU0VSVkVSX0lELCBzZXJ2ZXJJZCk7CisJCXNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3Yywgc2VydmVyLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIyLCBjbGllbnQyKTsKKwkJcmV0dXJuIHdjLmRvU2F2ZSgpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhcltdIElOVkFMSURfQ0hBUlMgPSBuZXcgY2hhcltdIHsnXFwnLCAnOicsICcqJywgJz8nLCAnIicsICc8JywgJz4nLCAnfCcsICdcMCcsICdAJywgJyYnfTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkTGF1bmNoQ29uZmlndXJhdGlvbk5hbWUoU3RyaW5nIHMpIHsKKwkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gIjEiOworCQlpbnQgc2l6ZSA9IElOVkFMSURfQ0hBUlMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJcyA9IHMucmVwbGFjZShJTlZBTElEX0NIQVJTW2ldLCAnXycpOworCQl9CisJCXJldHVybiBzOworCX0KKworCS8qKgorCSAqIE9wZW4gYW4gb3B0aW9ucyBkaWFsb2cuCisJICogCisJICogQHBhcmFtIHNoZWxsCisJICogQHBhcmFtIHRpdGxlCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiBAcGFyYW0gYnJlYWtwb2ludHNPcHRpb24KKwkgKiBAcmV0dXJuIGEgZGlhbG9nIHJldHVybiBjb25zdGFudAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgaW50IG9wZW5PcHRpb25zRGlhbG9nKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBib29sZWFuIGJyZWFrcG9pbnRzT3B0aW9uKSB7CisJCWlmIChicmVha3BvaW50c09wdGlvbikgeworCQkJaW50IGN1cnJlbnQgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmdldExhdW5jaE1vZGUyKCk7CisJCQlpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9SRVNUQVJUKQorCQkJCXJldHVybiAwOworCQkJZWxzZSBpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9ESVNBQkxFX0JSRUFLUE9JTlRTKQorCQkJCXJldHVybiAxOworCQkJZWxzZSBpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9DT05USU5VRSkKKwkJCQlyZXR1cm4gMjsKKwkJfSBlbHNlIHsKKwkJCWludCBjdXJyZW50ID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRMYXVuY2hNb2RlKCk7CisJCQlpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX1JFU1RBUlQpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlIGlmIChjdXJyZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfQ09OVElOVUUpCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJZmluYWwgaW50W10gaSA9IG5ldyBpbnRbMV07CisJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJT3B0aW9uc01lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbnVsbDsKKwkJCQlTdHJpbmdbXSBpdGVtcyA9IG51bGw7CisJCQkJaWYgKGJyZWFrcG9pbnRzT3B0aW9uKSB7CisJCQkJCWl0ZW1zID0gbmV3IFN0cmluZ1tdIHsKKwkJCQkJCU1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nUmVzdGFydCwKKwkJCQkJCU1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nQnJlYWtwb2ludHMsCisJCQkJCQlNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ0NvbnRpbnVlCisJCQkJCX07CisJCQkJfSBlbHNlIHsKKwkJCQkJaXRlbXMgPSBuZXcgU3RyaW5nW10geworCQkJCQkJTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdSZXN0YXJ0LAorCQkJCQkJTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdDb250aW51ZQorCQkJCQl9OworCQkJCX0KKwkJCQkKKwkJCQlkaWFsb2cgPSBuZXcgT3B0aW9uc01lc3NhZ2VEaWFsb2coc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBpdGVtcyk7CisJCQkJaVswXSA9IGRpYWxvZy5vcGVuKCk7CisJCQkJCisJCQkJaWYgKGRpYWxvZy5pc1JlbWVtYmVyKCkpIHsKKwkJCQkJaWYgKGJyZWFrcG9pbnRzT3B0aW9uKSB7CisJCQkJCQlpZiAoaVswXSA9PSAwKQorCQkJCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0TGF1bmNoTW9kZTIoU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfUkVTVEFSVCk7CisJCQkJCQllbHNlIGlmIChpWzBdID09IDEpCisJCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRMYXVuY2hNb2RlMihTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9ESVNBQkxFX0JSRUFLUE9JTlRTKTsKKwkJCQkJCWVsc2UgaWYgKGlbMF0gPT0gMikKKwkJCQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLnNldExhdW5jaE1vZGUyKFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX0NPTlRJTlVFKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChpWzBdID09IDApCisJCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRMYXVuY2hNb2RlKFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfUkVTVEFSVCk7CisJCQkJCQllbHNlIGlmIChpWzBdID09IDEpCisJCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRMYXVuY2hNb2RlKFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfQ09OVElOVUUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9KTsKKwkJcmV0dXJuIGlbMF07CisJfQorCisJLyoqCisJICogT3BlbiBhbiBvcHRpb25zIGRpYWxvZy4KKwkgKiAKKwkgKiBAcGFyYW0gc2hlbGwKKwkgKiBAcmV0dXJuIGEgZGlhbG9nIHJldHVybiBjb25zdGFudAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgaW50IG9wZW5CcmVha3BvaW50RGlhbG9nKGZpbmFsIFNoZWxsIHNoZWxsKSB7CisJCWludCBjdXJyZW50ID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRFbmFibGVCcmVha3BvaW50cygpOworCQlpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19BTFdBWVMpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19ORVZFUikKKwkJCXJldHVybiAxOworCQkKKwkJZmluYWwgaW50W10gaSA9IG5ldyBpbnRbMV07CisJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJT3B0aW9uc01lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE9wdGlvbnNNZXNzYWdlRGlhbG9nKHNoZWxsLAorCQkJCQkJTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dCcmVha3BvaW50cywgbmV3IFN0cmluZ1tdIHsKKwkJCQkJCU1lc3NhZ2VzLmRpYWxvZ0JyZWFrcG9pbnRzUmVlbmFibGUsIE1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nQ29udGludWV9KTsKKwkJCQlpWzBdID0gZGlhbG9nLm9wZW4oKTsKKwkJCQlpZiAoZGlhbG9nLmlzUmVtZW1iZXIoKSkgeworCQkJCQlpZiAoaVswXSA9PSAwKQorCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRFbmFibGVCcmVha3BvaW50cyhTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19BTFdBWVMpOworCQkJCQllbHNlIGlmIChpWzBdID09IDEpCisJCQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLnNldEVuYWJsZUJyZWFrcG9pbnRzKFNlcnZlclVJUHJlZmVyZW5jZXMuRU5BQkxFX0JSRUFLUE9JTlRTX05FVkVSKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQlyZXR1cm4gaVswXTsKKwl9CisKKwkvKioKKwkgKiBPcGVuIGEgcmVzdGFydCBvcHRpb25zIGRpYWxvZy4KKwkgKiAKKwkgKiBAcGFyYW0gc2hlbGwKKwkgKiBAcmV0dXJuIGEgZGlhbG9nIHJldHVybiBjb25zdGFudAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgaW50IG9wZW5SZXN0YXJ0RGlhbG9nKGZpbmFsIFNoZWxsIHNoZWxsKSB7CisJCWludCBjdXJyZW50ID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRSZXN0YXJ0KCk7CisJCWlmIChjdXJyZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9BTFdBWVMpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfTkVWRVIpCisJCQlyZXR1cm4gMTsKKwkJCisJCWZpbmFsIGludFtdIGkgPSBuZXcgaW50WzFdOworCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCU9wdGlvbnNNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBPcHRpb25zTWVzc2FnZURpYWxvZyhzaGVsbCwKKwkJCQkJCU1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgTWVzc2FnZXMuZGlhbG9nUmVzdGFydCwgbmV3IFN0cmluZ1tdIHsKKwkJCQkJCU1lc3NhZ2VzLmRpYWxvZ1Jlc3RhcnRSZXN0YXJ0LCBNZXNzYWdlcy5kaWFsb2dSZXN0YXJ0Q29udGludWV9KTsKKwkJCQlpWzBdID0gZGlhbG9nLm9wZW4oKTsKKwkJCQlpZiAoZGlhbG9nLmlzUmVtZW1iZXIoKSkgeworCQkJCQlpZiAoaVswXSA9PSAwKQorCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRSZXN0YXJ0KFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9BTFdBWVMpOworCQkJCQllbHNlIGlmIChpWzBdID09IDEpCisJCQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLnNldFJlc3RhcnQoU2VydmVyVUlQcmVmZXJlbmNlcy5SRVNUQVJUX05FVkVSKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQlyZXR1cm4gaVswXTsKKwl9CisKKwkvKioKKwkgKiBUaGUgZGVsZWdhdGluZyBhY3Rpb24gaGFzIGJlZW4gcGVyZm9ybWVkLiBJbXBsZW1lbnQKKwkgKiB0aGlzIG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCisJICoKKwkgKiBAcGFyYW0gYWN0aW9uIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgdGhlIHByZXNlbnRhdGlvbgorCSAqIHBvcnRpb24gb2YgdGhlIHBsdWdpbiBhY3Rpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKKwkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUnVubmluZyBvbiBTZXJ2ZXIuLi4iKTsKKwkJdHJ5IHsKKwkJCXJ1bigpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiUnVuIG9uIFNlcnZlciBFcnJvciIsIGUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQl0cnkgeworCQkJQm9vbGVhbiBiID0gZ2xvYmFsTGF1bmNoTW9kZS5nZXQoZ2V0TGF1bmNoTW9kZSgpKTsKKwkJCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHN0YXJ0IG1vZGUgdGhhdCB0aGUgc2VydmVyIHNob3VsZCB1c2UuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYXVuY2hNb2RlKCkgeworCQlyZXR1cm4gbGF1bmNoTW9kZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIGxhdW5jaCBtb2RlLgorCSAqIAorCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEge0BsaW5rIElMYXVuY2hNYW5hZ2VyfSBsYXVuY2ggbW9kZQorCSAqLworCXB1YmxpYyB2b2lkIHNldExhdW5jaE1vZGUoU3RyaW5nIGxhdW5jaE1vZGUpIHsKKwkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmUgd2hpY2ggY2xpZW50cyBjYW4gYWN0IG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24KKwkgKiAgICBwb3J0aW9uIG9mIHRoZSBwbHVnaW4gYWN0aW9uCisJICogQHBhcmFtIHNlbCBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgZGVza3RvcAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsKSB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIj4gc2VsZWN0aW9uQ2hhbmdlZCIpOworCQlzZWxlY3Rpb24gPSBudWxsOworCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJaWYgKHNlbCA9PSBudWxsIHx8IHNlbC5pc0VtcHR5KCkgfHwgIShzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKKwkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCWdsb2JhbFNlbGVjdGlvbiA9IG51bGw7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOworCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbGVjdC5pdGVyYXRvcigpOworCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKQorCQkJc2VsZWN0aW9uID0gaXRlcmF0b3IubmV4dCgpOworCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7IC8vIG1vcmUgdGhhbiBvbmUgc2VsZWN0aW9uIChzaG91bGQgbmV2ZXIgaGFwcGVuKQorCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJc2VsZWN0aW9uID0gbnVsbDsKKwkJCWdsb2JhbFNlbGVjdGlvbiA9IG51bGw7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmIChzZWxlY3Rpb24gIT0gZ2xvYmFsU2VsZWN0aW9uKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTZWxlY3Rpb246ICIgKyBzZWxlY3Rpb24pOworCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKQkKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTZWxlY3Rpb24gdHlwZTogIiArIHNlbGVjdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJCQlnbG9iYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisJCQlnbG9iYWxMYXVuY2hNb2RlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOworCQkJaWYgKCFTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoZ2xvYmFsU2VsZWN0aW9uKSkgeworCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgImNoZWNraW5nIGZvciBtb2R1bGUgYXJ0aWZhY3QiKTsKKwkJCS8vIFRPRE8gLSBtdWx0aXBsZSBtb2R1bGUgYXJ0aWZhY3RzCisJCQlJTW9kdWxlQXJ0aWZhY3RbXSBtb2R1bGVBcnRpZmFjdHMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlQXJ0aWZhY3RzKGdsb2JhbFNlbGVjdGlvbik7CisJCQlJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QgPSBudWxsOworCQkJaWYgKG1vZHVsZUFydGlmYWN0cyAhPSBudWxsICYmIG1vZHVsZUFydGlmYWN0cy5sZW5ndGggPiAwKQorCQkJCW1vZHVsZUFydGlmYWN0ID0gbW9kdWxlQXJ0aWZhY3RzWzBdOworCQkJCisJCQlJTW9kdWxlIG1vZHVsZSA9IG51bGw7CisJCQlpZiAobW9kdWxlQXJ0aWZhY3QgIT0gbnVsbCkKKwkJCQltb2R1bGUgPSBtb2R1bGVBcnRpZmFjdC5nZXRNb2R1bGUoKTsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIm1vZHVsZUFydGlmYWN0PSAiICsgbW9kdWxlQXJ0aWZhY3QgKyAiLCBtb2R1bGU9ICIgKyBtb2R1bGUpOworCQkJaWYgKG1vZHVsZSAhPSBudWxsKQorCQkJCWZpbmRHbG9iYWxMYXVuY2hNb2Rlcyhtb2R1bGUpOworCQkJZWxzZSB7CisJCQkJZ2xvYmFsTGF1bmNoTW9kZS5wdXQoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBCb29sZWFuKHRydWUpKTsKKwkJCQlnbG9iYWxMYXVuY2hNb2RlLnB1dChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLCBuZXcgQm9vbGVhbih0cnVlKSk7CisJCQkJZ2xvYmFsTGF1bmNoTW9kZS5wdXQoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLCBuZXcgQm9vbGVhbih0cnVlKSk7CisJCQl9CisJCX0KKwkJCisJCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKKwkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiPCBzZWxlY3Rpb25DaGFuZ2VkICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7CisJfQorCisJLyoqCisJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGlzIGEgc2VydmVyIGZhY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gbW9kdWxlCisJICogYW5kIHRoZSB2YXJpb3VzIHN0YXJ0IG1vZGVzLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGZpbmRHbG9iYWxMYXVuY2hNb2RlcyhJTW9kdWxlIG1vZHVsZSkgeworCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOworCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCUlTZXJ2ZXJUeXBlIHR5cGUgPSBzZXJ2ZXJUeXBlc1tpXTsKKwkJCQlpZiAoaXNWYWxpZFNlcnZlclR5cGUodHlwZSwgbW9kdWxlKSkgeworCQkJCQlmb3IgKGJ5dGUgYiA9IDA7IGIgPCBsYXVuY2hNb2Rlcy5sZW5ndGg7IGIrKykgeworCQkJCQkJaWYgKHR5cGUuc3VwcG9ydHNMYXVuY2hNb2RlKGxhdW5jaE1vZGVzW2JdKSkgeworCQkJCQkJCWdsb2JhbExhdW5jaE1vZGUucHV0KGxhdW5jaE1vZGVzW2JdLCBuZXcgQm9vbGVhbih0cnVlKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciB0eXBlIGNhbiBsYXVuY2ggdGhlIG1vZHVsZS4gCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFNlcnZlclR5cGUoSVNlcnZlclR5cGUgdHlwZSwgSU1vZHVsZSBtb2R1bGUpIHsKKwkJdHJ5IHsKKwkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHR5cGUuZ2V0UnVudGltZVR5cGUoKTsKKwkJCVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlLmdldE1vZHVsZVR5cGUoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTQzMDNhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsMjczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklMYXVuY2hhYmxlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5MYXVuY2hDbGllbnRKb2I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CisKK3B1YmxpYyBjbGFzcyBSdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSBleHRlbmRzIExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRVJWRVJfSUQgPSAic2VydmVyLWlkIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01PRFVMRV9BUlRJRkFDVCA9ICJtb2R1bGUtYXJ0aWZhY3QiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTU9EVUxFX0FSVElGQUNUX0NMQVNTID0gIm1vZHVsZS1hcnRpZmFjdC1jbGFzcyI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBVU5DSEFCTEVfQURBUFRFUl9JRCA9ICJsYXVuY2hhYmxlLWFkYXB0ZXItaWQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xJRU5UX0lEID0gImNsaWVudC1pZCI7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlQmVmb3JlTGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gaWdub3JlCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbGF1bmNoTW9kZSwgZmluYWwgSUxhdW5jaCBsYXVuY2gyLAorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQorCQlTdHJpbmcgc2VydmVySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1NFUlZFUl9JRCwgKFN0cmluZyludWxsKTsKKwkJU3RyaW5nIG1vZHVsZUFydCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTU9EVUxFX0FSVElGQUNULCAoU3RyaW5nKW51bGwpOworCQlTdHJpbmcgbW9kdWxlQXJ0aWZhY3RDbGFzcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTU9EVUxFX0FSVElGQUNUX0NMQVNTLCAoU3RyaW5nKW51bGwpOworCQlTdHJpbmcgbGFJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTEFVTkNIQUJMRV9BREFQVEVSX0lELCAoU3RyaW5nKW51bGwpOworCQlTdHJpbmcgY2xpZW50SWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0NMSUVOVF9JRCwgKFN0cmluZyludWxsKTsKKwkJCisJCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKKwkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOworCQlNb2R1bGVBcnRpZmFjdERlbGVnYXRlIG1vZHVsZUFydGlmYWN0ID0gbnVsbDsKKwkJSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyID0gbnVsbDsKKwkJaWYgKGxhSWQgIT0gbnVsbCkKKwkJCWxhdW5jaGFibGVBZGFwdGVyID0gU2VydmVyUGx1Z2luLmZpbmRMYXVuY2hhYmxlQWRhcHRlcihsYUlkKTsKKwkJSUNsaWVudCBjbGllbnQgPSBTZXJ2ZXJQbHVnaW4uZmluZENsaWVudChjbGllbnRJZCk7CisJCQorCQl0cnkgeworCQkJQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUobW9kdWxlQXJ0aWZhY3RDbGFzcyk7CisJCQltb2R1bGVBcnRpZmFjdCA9IChNb2R1bGVBcnRpZmFjdERlbGVnYXRlKSBjLm5ld0luc3RhbmNlKCk7CisJCQltb2R1bGVBcnRpZmFjdC5kZXNlcmlhbGl6ZShtb2R1bGVBcnQpOworCQkJbW9kdWxlID0gbW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCk7CisJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9kdWxlIGFydGlmYWN0IGRlbGVnYXRlIGNsYXNzIik7CisJCX0KKwkJCisJCWlmIChtb2R1bGVBcnRpZmFjdCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmVycm9yTGF1bmNoQ29uZmlnKSk7CisJCQorCQlpZiAobW9kdWxlID09IG51bGwpCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgTWVzc2FnZXMuZXJyb3JMYXVuY2hDb25maWcpKTsKKwkJCisJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5lcnJvckludmFsaWRTZXJ2ZXIpKTsKKwkJCisJCWlmIChsYXVuY2hhYmxlQWRhcHRlciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmVycm9yTGF1bmNoQ29uZmlnKSk7CisJCQorCQlmaW5hbCBTaGVsbFtdIHNoZWxsMiA9IG5ldyBTaGVsbFsxXTsKKwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXNoZWxsMlswXSA9IEVjbGlwc2VVdGlsLmdldFNoZWxsKCk7CisJCQl9CisJCX0pOworCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHNoZWxsMlswXTsKKwkJZmluYWwgSUFkYXB0YWJsZSBpbmZvID0gbmV3IElBZGFwdGFibGUoKSB7CisJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCisJCQkJCXJldHVybiBzaGVsbDsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfTsKKwkJCisJCWlmIChjbGllbnQgPT0gbnVsbCkgeworCQkJLy8gaWYgdGhlcmUgaXMgbm8gY2xpZW50LCB1c2UgYSBkdW1teQorCQkJY2xpZW50ID0gbmV3IElDbGllbnQoKSB7CisJCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmNsaWVudERlZmF1bHREZXNjcmlwdGlvbjsKKwkJCQl9CisKKwkJCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQkJCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuY2xpZW50LmRlZmF1bHQiOworCQkJCX0KKworCQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmNsaWVudERlZmF1bHROYW1lOworCQkJCX0KKworCQkJCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlcjMsIE9iamVjdCBsYXVuY2hhYmxlMiwgU3RyaW5nIGxhdW5jaE1vZGUzLCBJTGF1bmNoIGxhdW5jaCkgeworCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCQl9CisKKwkJCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhJU2VydmVyIHNlcnZlcjMsIE9iamVjdCBsYXVuY2hhYmxlMiwgU3RyaW5nIGxhdW5jaE1vZGUzKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX07CisJCX0KKwkJCisJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlYWR5IHRvIGxhdW5jaCIpOworCQlsYXVuY2gyLmFkZFByb2Nlc3MobmV3IFJ1bk9uU2VydmVyUHJvY2VzcyhsYXVuY2gyKSk7CisJCQorCQkvLyBzdGFydCBzZXJ2ZXIgaWYgaXQncyBub3QgYWxyZWFkeSBzdGFydGVkCisJCS8vIGFuZCBjdWUgdGhlIGNsaWVudCB0byBzdGFydAorCQlJTW9kdWxlW10gbW9kdWxlcyA9IG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsgLy8gVE9ETzogZ2V0IHBhcmVudCBoaWVyYXJjaHkgY29ycmVjdAorCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKKwkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpIHsKKwkJCUxhdW5jaENsaWVudEpvYiBjbGllbnRKb2IgPSBuZXcgTGF1bmNoQ2xpZW50Sm9iKHNlcnZlciwgbW9kdWxlcywgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIGxhdW5jaGFibGVBZGFwdGVyLCBjbGllbnQpOworCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7CisJCX0gZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7CisJCQlib29sZWFuIHJlc3RhcnQgPSBmYWxzZTsKKwkJCVN0cmluZyBtb2RlID0gc2VydmVyLmdldE1vZGUoKTsKKwkJCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOworCQkJYm9vbGVhbiBkaXNhYmxlZEJyZWFrcG9pbnRzID0gZmFsc2U7CisJCQkKKwkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkpIHsgLy8gVE9ETyAtIHJlc3RhcnQgc3RhdGUgbWlnaHQgbm90IGJlIHNldCB1bnRpbCBhZnRlciBwdWJsaXNoCisJCQkJaW50IHJlc3VsdCA9IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUub3BlblJlc3RhcnREaWFsb2coc2hlbGwpOworCQkJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKKwkJCQkJcmVzdGFydCA9IHRydWU7CisJCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gOSkgeyAvLyBjYW5jZWwKKwkJCQkJbGF1bmNoMi50ZXJtaW5hdGUoKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWlmICghcmVzdGFydCkgeworCQkJCWlmICghSUxhdW5jaE1hbmFnZXIuUlVOX01PREUuZXF1YWxzKG1vZGUpICYmIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgeworCQkJCQlib29sZWFuIGJyZWFrcG9pbnRzT3B0aW9uID0gZmFsc2U7CisJCQkJCWlmIChicmVha3BvaW50TWFuYWdlci5pc0VuYWJsZWQoKSAmJiBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKKwkJCQkJCWJyZWFrcG9pbnRzT3B0aW9uID0gdHJ1ZTsKKwkJCQkJaW50IHJlc3VsdCA9IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUub3Blbk9wdGlvbnNEaWFsb2coc2hlbGwsIE1lc3NhZ2VzLndpelJ1bk9uU2VydmVyVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nUnVuLCBicmVha3BvaW50c09wdGlvbik7CisJCQkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQkJCXJlc3RhcnQgPSB0cnVlOworCQkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkgeworCQkJCQkJYnJlYWtwb2ludE1hbmFnZXIuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCQlkaXNhYmxlZEJyZWFrcG9pbnRzID0gdHJ1ZTsKKwkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOworCQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAyKQorCQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7CisJCQkJCWVsc2UgeyAvLyByZXN1bHQgPT0gOSAvLyBjYW5jZWwKKwkJCQkJCWxhdW5jaDIudGVybWluYXRlKCk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKCFJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSAmJiBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgeworCQkJCQlpbnQgcmVzdWx0ID0gUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5vcGVuT3B0aW9uc0RpYWxvZyhzaGVsbCwgTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ0RlYnVnLCBmYWxzZSk7CisJCQkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQkJCXJlc3RhcnQgPSB0cnVlOworCQkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKKwkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOworCQkJCQllbHNlIHsgLy8gcmVzdWx0ID09IDkgLy8gY2FuY2VsCisJCQkJCQlsYXVuY2gyLnRlcm1pbmF0ZSgpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICghSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSAmJiBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7CisJCQkJCWJvb2xlYW4gYnJlYWtwb2ludHNPcHRpb24gPSBmYWxzZTsKKwkJCQkJaWYgKGJyZWFrcG9pbnRNYW5hZ2VyLmlzRW5hYmxlZCgpICYmIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQorCQkJCQkJYnJlYWtwb2ludHNPcHRpb24gPSB0cnVlOworCQkJCQlpbnQgcmVzdWx0ID0gUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5vcGVuT3B0aW9uc0RpYWxvZyhzaGVsbCwgTWVzc2FnZXMud2l6UHJvZmlsZU9uU2VydmVyVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nUHJvZmlsZSwgYnJlYWtwb2ludHNPcHRpb24pOworCQkJCQlpZiAocmVzdWx0ID09IDApCisJCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKKwkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKKwkJCQkJCWJyZWFrcG9pbnRNYW5hZ2VyLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQkJZGlzYWJsZWRCcmVha3BvaW50cyA9IHRydWU7CisJCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKKwkJCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMikKKwkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOworCQkJCQllbHNlIHsvLyByZXN1bHQgPT0gOSAvLyBjYW5jZWwKKwkJCQkJCWxhdW5jaDIudGVybWluYXRlKCk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7CisJCQkJCWlmICghYnJlYWtwb2ludE1hbmFnZXIuaXNFbmFibGVkKCkgJiYgIWRpc2FibGVkQnJlYWtwb2ludHMpIHsKKwkJCQkJCWludCByZXN1bHQgPSBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlLm9wZW5CcmVha3BvaW50RGlhbG9nKHNoZWxsKTsKKwkJCQkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQkJCQlicmVha3BvaW50TWFuYWdlci5zZXRFbmFibGVkKHRydWUpOworCQkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKKwkJCQkJCQkvLyBpZ25vcmUKKwkJCQkJCX0gZWxzZSB7IC8vIHJlc3VsdCA9PSAyCisJCQkJCQkJbGF1bmNoMi50ZXJtaW5hdGUoKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCWZpbmFsIExhdW5jaENsaWVudEpvYiBjbGllbnRKb2IgPSBuZXcgTGF1bmNoQ2xpZW50Sm9iKHNlcnZlciwgbW9kdWxlcywgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIGxhdW5jaGFibGVBZGFwdGVyLCBjbGllbnQpOworCQkJaWYgKHJlc3RhcnQpIHsKKwkJCQlmaW5hbCBJU2VydmVyIHNlcnZlcjIgPSBzZXJ2ZXI7CisJCQkJc2VydmVyLnJlc3RhcnQobGF1bmNoTW9kZSwgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgeworCQkJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7CisJCQkJCQkvLyBPbmx5IHB1Ymxpc2ggaWYgdGhlIHNlcnZlciByZXF1aXJlcyBwdWJsaXNoIGJlZm9yZSBsYXVuY2hpbmcgdGhlIGNsaWVudC4KKwkJCQkJCWlmIChzZXJ2ZXIyLnNob3VsZFB1Ymxpc2goKSkgeworCQkJCQkJCXNlcnZlcjIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG51bGwsIGluZm8sIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKKwkJCQkJCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdDIpIHsKKwkJCQkJCQkJCWlmIChyZXN1bHQyLmlzT0soKSkKKwkJCQkJCQkJCQljbGllbnRKb2Iuc2NoZWR1bGUoKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljbGllbnRKb2Iuc2NoZWR1bGUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0pOworCQkJfSBlbHNlIHsKKwkJCQkvLyBPbmx5IHB1Ymxpc2ggaWYgdGhlIHNlcnZlciByZXF1aXJlcyBwdWJsaXNoIGJlZm9yZSBsYXVuY2hpbmcgdGhlIGNsaWVudC4KKwkJCQlpZiAoc2VydmVyLnNob3VsZFB1Ymxpc2goKSkgeworCQkJCQlzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG51bGwsIGluZm8sIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKKwkJCQkJCQlpZiAocmVzdWx0LmlzT0soKSkKKwkJCQkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0gZWxzZSB7CisJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChzdGF0ZSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKSB7CisJCQlmaW5hbCBMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKKwkJCQorCQkJLypDaGFpbmVkSm9iIG15Sm9iID0gbmV3IENoYWluZWRKb2IoInRlc3QiLCBzZXJ2ZXIpIHsKKwkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMikgeworCQkJCQl0cnkgeworCQkJCQkJTGF1bmNoQ29uZmlndXJhdGlvbk1hbmFnZXIgbGNtID0gRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbk1hbmFnZXIoKTsKKwkJCQkJCWxjbS5zZXRSZWNlbnRMYXVuY2gobGF1bmNoMik7CisJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHR3ZWFrIGRlYnVnIGxhdW5jaCBoaXN0b3J5Iik7CisJCQkJCX0KKwkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQkJfQorCQkJfTsqLworCQkJCisJCQlzZXJ2ZXIuc3RhcnQobGF1bmNoTW9kZSwgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKKwkJCQkJaWYgKHJlc3VsdC5pc09LKCkpCisJCQkJCQljbGllbnRKb2Iuc2NoZWR1bGUoKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCQlsYXVuY2gyLnRlcm1pbmF0ZSgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyUHJvY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlclByb2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc2Y2UxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlclByb2Nlc3MuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtc1Byb3h5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqIER1bW15IElQcm9jZXNzIHNvIHRoYXQgYSBSdW4gb24gU2VydmVyIGxhdW5jaCBjYW4gYmUgdGVybWluYXRlZC4KKyAqLworcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyUHJvY2VzcyBpbXBsZW1lbnRzIElQcm9jZXNzIHsKKwlwcm90ZWN0ZWQgSUxhdW5jaCBsYXVuY2g7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNUZXJtaW5hdGVkOworCisJcHVibGljIFJ1bk9uU2VydmVyUHJvY2VzcyhJTGF1bmNoIGxhdW5jaCkgeworCQl0aGlzLmxhdW5jaCA9IGxhdW5jaDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXJnMCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgaW50IGdldEV4aXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7CisJCXJldHVybiAwOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBNZXNzYWdlcy5wcm9jZXNzTmFtZTsKKwl9CisKKwlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKSB7CisJCXJldHVybiBsYXVuY2g7CisJfQorCisJcHVibGljIElTdHJlYW1zUHJveHkgZ2V0U3RyZWFtc1Byb3h5KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB7CisJCS8vIGlnbm9yZQorCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhcmcwKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBib29sZWFuIGNhblRlcm1pbmF0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKCkgeworCQlyZXR1cm4gaXNUZXJtaW5hdGVkOworCX0KKworCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7CisJCWlzVGVybWluYXRlZCA9IHRydWU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Zjc3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpby5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKKworLyoqCisgKiBBdWRpbyBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgdG8gdGhlIGF1ZGlvIHBsdWdpbi48cD4KKyAqCisgKiBBZGRpbmcgYSBuZXcgc291bmQgdG8geW91ciBwbHVnaW4gaXMgYXMgZWFzeSBhcyBBQkM6CisgKiA8dWw+CisgKiA8bGk+QTogQWRkIHRoZSBmb2xsb3dpbmcgcmVxdWlyZXMgdG8geW91ciBwbHVnaW4ueG1sOjxicj4KKyAqICAgPHByZT4mbHQ7aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51dGlsIiZndDs8L3ByZT48L2xpPgorICoKKyAqIDxsaT5COiBEZWZpbmUgYSBuZXcgc291bmQgZXh0ZW5zaW9uIHBvaW50IGluIHlvdXIgcGx1Z2luLnhtbDo8YnI+CisgKiAgIDxwcmU+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51dGlsLnNvdW5kIiZndDsKKyAqICAgICAmbHQ7Y2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLm15UGx1Z2luIgorICogICAgICAgbmFtZT0iTXkgUGx1Z2luIE5hbWUiLyZndDsKKyAqICAgICAmbHQ7c291bmQgaWQ9Im9yZy5lY2xpcHNlLm15UGx1Z2luLm15U291bmQiCisgKiAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UubXlQbHVnaW4iCisgKiAgICAgICBuYW1lPSJTb21ldGhpbmcgSGFwcGVuZWQiCisgKiAgICAgICBsb2NhdGlvbj0ic291bmRzL215U291bmQud2F2Ii8mZ3Q7CisgKiAgICAgJmx0O3NvdW5kIGlkPSJvcmcuZWNsaXBzZS5teVBsdWdpbi5teU90aGVyU291bmRzIgorICogICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm15UGx1Z2luIgorICogICAgICAgbmFtZT0iQW5vdGhlciBFdmVudCBIYXBwZW5lZCIvJmd0OworICogICAmbHQ7L2V4dGVuc2lvbiZndDs8L3ByZT48YnI+CisgKiAgICh0aGUgbG9jYXRpb24gaXMgb3B0aW9uYWwuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzb3VuZAorICogICAgd2lsbCBub3QgcGxheSB1bnRpbCB0aGUgdXNlciBzcGVjaWZpZXMgYW4gYXVkaW8gZmlsZSk8L2xpPgorICoKKyAqIDxsaT5DOiBDYWxsIHRoZSBzb3VuZHMgd2hlbiB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzIG9jY3VyIHdpdGhpbgorICogICB5b3VyIHBsdWdpbjo8YnI+CisgKiAgIDxwcmU+b3JnLmVjbGlwc2Uud3N0LmF1ZGlvLkF1ZGlvLnBsYXlTb3VuZCgib3JnLmVjbGlwc2UubXlQbHVnaW4ubXlTb3VuZCIpOzwvcHJlPjwvbGk+CisgKiA8L3VsPgorICovCitwdWJsaWMgY2xhc3MgQXVkaW8geworCS8qKgorCSAqIEF1ZGlvQ29yZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXByaXZhdGUgQXVkaW8oKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogUGxheXMgdGhlIHNvdW5kIHdpdGggdGhlIGdpdmVuIGlkLgorCSAqCisJICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgcGxheVNvdW5kKFN0cmluZyBpZCkgeworCQlBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKS5wbGF5U291bmQoaWQpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb0NvcmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvQ29yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNGUwODIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb0NvcmUuamF2YQpAQCAtMCwwICsxLDY5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmF4LnNvdW5kLnNhbXBsZWQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CisvKioKKyAqIE1haW4gYXVkaW8gcGx1Z2luIGNsYXNzLgorICovCitwdWJsaWMgY2xhc3MgQXVkaW9Db3JlIHsKKwlwcm90ZWN0ZWQgc3RhdGljIEF1ZGlvQ29yZSBpbnN0YW5jZTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU09VTkRfRU5BQkxFRCA9ICJzb3VuZEVuYWJsZWQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVk9MVU1FID0gInZvbHVtZSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VORFNfRklMRSA9ICJzb3VuZHMueG1sIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9GSUxFID0gImRpc2FibGVkLXNvdW5kcy54bWwiOworCisJLy8gQ2F0ZWdvcmllcyAtIG1hcCBvZiBTdHJpbmcgaWQgdG8gU3RyaW5nIG5hbWVzCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGNhdGVnb3JpZXM7CisKKwkvLyBTb3VuZHMgLSBtYXAgb2YgU3RyaW5nIGlkIHRvIFNvdW5kCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTb3VuZD4gc291bmRzOworCisJLy8gc3BlY2lmaWMgc291bmRzIG9yIGNhdGVnb3JpZXMgdGhhdCBoYXZlIGJlZW4gZGlzYWJsZWQsIGJ5IGlkCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGlzYWJsZWRTb3VuZHM7CisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGlzYWJsZWRDYXRlZ29yaWVzOworCisJLy8gU291bmRNYXAgLSBtYXAgb2YgU3RyaW5nIGlkIHRvIGFuIElQYXRoCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBJUGF0aD4gdXNlclNvdW5kTWFwOworCisJLyoqCisJICogQXVkaW9Db3JlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHJpdmF0ZSBBdWRpb0NvcmUoKSB7CisJCXN1cGVyKCk7CisJCisJCWxvYWRFeHRlbnNpb25Qb2ludHMoKTsKKwkKKwkJbG9hZFNvdW5kTWFwKCk7CisJCWxvYWREaXNhYmxlZExpc3RzKCk7CisJCQorCQkKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGNhdGVnb3JpZXMKKwkgKgorCSAqIEByZXR1cm4gamF2YS51dGlsLk1hcAorCSAqLworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldENhdGVnb3JpZXMoKSB7CisJCXJldHVybiBjYXRlZ29yaWVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGF1ZGlvIGNsaXAuCisJICoKKwkgKiBAcGFyYW0gdXJsIGphdmEubmV0LlVSTAorCSAqIEByZXR1cm4gamF2YXguc291bmQuc2FtcGxlZC5DbGlwCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBDbGlwIGdldENsaXAoVVJMIHVybCkgeworCQl0cnkgeworCQkJQXVkaW9JbnB1dFN0cmVhbSBhdWRpb0lucHV0U3RyZWFtID0gQXVkaW9TeXN0ZW0uZ2V0QXVkaW9JbnB1dFN0cmVhbSh1cmwpOworCQorCQkJQXVkaW9Gb3JtYXQgZm9ybWF0ID0gYXVkaW9JbnB1dFN0cmVhbS5nZXRGb3JtYXQoKTsKKwkKKwkJCS8qKgorCQkJICogd2UgY2FuJ3QgeWV0IG9wZW4gdGhlIGRldmljZSBmb3IgQUxBVy9VTEFXIHBsYXliYWNrLAorCQkJICogY29udmVydCBBTEFXL1VMQVcgdG8gUENNCisJCQkgKi8KKwkJCWlmICgoZm9ybWF0LmdldEVuY29kaW5nKCkgPT0gQXVkaW9Gb3JtYXQuRW5jb2RpbmcuVUxBVykgfHwKKwkJCQkoZm9ybWF0LmdldEVuY29kaW5nKCkgPT0gQXVkaW9Gb3JtYXQuRW5jb2RpbmcuQUxBVykpIHsKKwkJCQlBdWRpb0Zvcm1hdCB0bXAgPSBuZXcgQXVkaW9Gb3JtYXQoCisJCQkJCUF1ZGlvRm9ybWF0LkVuY29kaW5nLlBDTV9TSUdORUQsIAorCQkJCQlmb3JtYXQuZ2V0U2FtcGxlUmF0ZSgpLAorCQkJCQlmb3JtYXQuZ2V0U2FtcGxlU2l6ZUluQml0cygpICogMiwKKwkJCQkJZm9ybWF0LmdldENoYW5uZWxzKCksCisJCQkJCWZvcm1hdC5nZXRGcmFtZVNpemUoKSAqIDIsCisJCQkJCWZvcm1hdC5nZXRGcmFtZVJhdGUoKSwgdHJ1ZSk7CisJCQkJYXVkaW9JbnB1dFN0cmVhbSA9IEF1ZGlvU3lzdGVtLmdldEF1ZGlvSW5wdXRTdHJlYW0odG1wLCBhdWRpb0lucHV0U3RyZWFtKTsKKwkJCQlmb3JtYXQgPSB0bXA7CisJCQl9CisJCQlEYXRhTGluZS5JbmZvIGluZm8gPSBuZXcgRGF0YUxpbmUuSW5mbygKKwkJCQlDbGlwLmNsYXNzLCBhdWRpb0lucHV0U3RyZWFtLmdldEZvcm1hdCgpLCAKKwkJCQkoKGludCkgYXVkaW9JbnB1dFN0cmVhbS5nZXRGcmFtZUxlbmd0aCgpICoKKwkJCQlmb3JtYXQuZ2V0RnJhbWVTaXplKCkpKTsKKwkJCisJCQlDbGlwIGNsaXAgPSAoQ2xpcCkgQXVkaW9TeXN0ZW0uZ2V0TGluZShpbmZvKTsKKwkJCWNsaXAub3BlbihhdWRpb0lucHV0U3RyZWFtKTsKKwkJCXJldHVybiBjbGlwOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBjbGlwOiAiICsgdXJsLCBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIGF1ZGlvIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0uCisJICoKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNBdWRpb1N1cHBvcnRlZCgpIHsKKwkJdHJ5IHsKKwkJCWJvb2xlYW4gc291bmQgPSBmYWxzZTsKKwkJCU1peGVyLkluZm9bXSBpbmZvMiA9IEF1ZGlvU3lzdGVtLmdldE1peGVySW5mbygpOworCQkJaWYgKGluZm8yICE9IG51bGwpIHsKKwkJCQlpbnQgc2l6ZSA9IGluZm8yLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkvL1RyYWNlLnRyYWNlKCIgIiArIGluZm8yW2ldKTsKKwkJCQkJTWl4ZXIgbWl4ZXIgPSBBdWRpb1N5c3RlbS5nZXRNaXhlcihpbmZvMltpXSk7CisJCQkJCWlmIChtaXhlciAhPSBudWxsKSB7CisJCQkJCQkvL1RyYWNlLnRyYWNlKCIgICBNaXhlcjoiICsgbWl4ZXIpOworCQkJCQkJLy9UcmFjZS50cmFjZSgiICAgIiArIG1peGVyLmdldExpbmVJbmZvKCkpOworCQkJCQkJdHJ5IHsKKwkJCQkJCQlMaW5lLkluZm8gaW5mbyA9IG1peGVyLmdldExpbmVJbmZvKCk7CisJCQkJCQkJTGluZSBsaW5lID0gbWl4ZXIuZ2V0TGluZShpbmZvKTsKKwkJCQkJCQkvL1RyYWNlLnRyYWNlKCIgICBMaW5lOiIgKyBsaW5lKTsKKwkJCQkJCQlpZiAobGluZSAhPSBudWxsICYmIGxpbmUudG9TdHJpbmcoKS5pbmRleE9mKCJPdXRwdXQiKSA+PSAwKQorCQkJCQkJCQlzb3VuZCA9IHRydWU7CisJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCS8vIGlnbm9yZQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHNvdW5kOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHZlcmlmeSBhdWRpbyBzdGF0dXMiLCBlKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHNvdW5kIGlzIGVuYWJsZWQuCisJICoKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0U291bmRzRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKFBSRUZfU09VTkRfRU5BQkxFRCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCB2b2x1bWUuCisJICoKKwkgKiBAcmV0dXJuIGludAorCSAqLworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFZvbHVtZSgpIHsKKwkJcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRJbnQoUFJFRl9WT0xVTUUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKgorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuYXVkaW8uaW50ZXJuYWwuQXVkaW9Db3JlCisJICovCisJcHVibGljIHN0YXRpYyBBdWRpb0NvcmUgZ2V0SW5zdGFuY2UoKSB7CisJCWlmIChpbnN0YW5jZSA9PSBudWxsKQorCQkJaW5zdGFuY2UgPSBuZXcgQXVkaW9Db3JlKCk7CisJCXJldHVybiBpbnN0YW5jZTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZQorCSAqLworCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKKwkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc291bmQgd2l0aCB0aGUgZ2l2ZW4gaWQuCisJICoKKwkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZworCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuYXVkaW8uU291bmQKKwkgKi8KKwlwcm90ZWN0ZWQgU291bmQgZ2V0U291bmQoU3RyaW5nIGlkKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gc291bmRzLmdldChpZCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgc291bmRzLgorCSAqCisJICogQHJldHVybiBqYXZhLnV0aWwuTWFwCisJICovCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFNvdW5kPiBnZXRTb3VuZHMoKSB7CisJCXJldHVybiBzb3VuZHM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZnVsbCB1c2VyIHNvdW5kIG1hcC4KKwkgKgorCSAqIEByZXR1cm4gamF2YS51dGlsLk1hcAorCSAqLworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJUGF0aD4gZ2V0VXNlclNvdW5kTWFwKCkgeworCQlpZiAodXNlclNvdW5kTWFwID09IG51bGwpCisJCQlsb2FkU291bmRNYXAoKTsKKwkJcmV0dXJuIHVzZXJTb3VuZE1hcDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgVVJMIGZvciB0aGlzIHNvdW5kLgorCSAqCisJICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcmV0dXJuIGphdmEubmV0LlVSTAorCSAqLworCXByb3RlY3RlZCBJUGF0aCBnZXRVc2VyU291bmRQYXRoKFN0cmluZyBpZCkgeworCQl0cnkgeworCQkJaWYgKHVzZXJTb3VuZE1hcCA9PSBudWxsKQorCQkJCWxvYWRTb3VuZE1hcCgpOworCQorCQkJSVBhdGggcGF0aCA9IHVzZXJTb3VuZE1hcC5nZXQoaWQpOworCQkJaWYgKHBhdGggIT0gbnVsbCkKKwkJCQlyZXR1cm4gcGF0aDsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgc291bmQgVVJMOiAiICsgaWQsIGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHByZWZlcnJlZCB2b2x1bWUuCisJICoKKwkgKiBAcmV0dXJuIGludAorCSAqLworCXB1YmxpYyBpbnQgZ2V0Vm9sdW1lKCkgeworCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KFBSRUZfVk9MVU1FKTsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzLgorCSAqCisJICogQHBhcmFtIHN0b3JlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKKwkJc3RvcmUuc2V0RGVmYXVsdChQUkVGX1ZPTFVNRSwgMTgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgaXMgZW5hYmxlZC4KKwkgKgorCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDYXRlZ29yeUVuYWJsZWQoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQorCQlpZiAoZGlzYWJsZWRDYXRlZ29yaWVzID09IG51bGwpCisJCQlsb2FkRGlzYWJsZWRMaXN0cygpOworCQorCQlyZXR1cm4gKCFkaXNhYmxlZENhdGVnb3JpZXMuY29udGFpbnMoaWQpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgc291bmQgaXMgZW5hYmxlZC4KKwkgKgorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU291bmRFbmFibGVkKCkgeworCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihQUkVGX1NPVU5EX0VOQUJMRUQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc291bmQgaXMgZW5hYmxlZC4KKwkgKgorCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTb3VuZEVuYWJsZWQoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQorCQlpZiAoZGlzYWJsZWRTb3VuZHMgPT0gbnVsbCkKKwkJCWxvYWREaXNhYmxlZExpc3RzKCk7CisJCisJCXJldHVybiAoIWRpc2FibGVkU291bmRzLmNvbnRhaW5zKGlkKSk7CisJfQorCisJLyoqCisJICogU2F2ZXMgdGhlIGRpc2FibGVkIHNvdW5kIGxpc3QuCisJICovCisJcHJpdmF0ZSB2b2lkIGxvYWREaXNhYmxlZExpc3RzKCkgeworCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoRElTQUJMRURfRklMRSkudG9PU1N0cmluZygpOworCQorCQlGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQlkaXNhYmxlZENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGlzYWJsZWRTb3VuZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdHJ5IHsKKwkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7CisJCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhpbik7CisJCisJCQlJTWVtZW50byBjYXQgPSBtZW1lbnRvLmdldENoaWxkKCJjYXRlZ29yaWVzIik7CisJCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gY2F0LmdldENoaWxkcmVuKCJjYXRlZ29yeSIpOworCQorCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCXRyeSB7CisJCQkJCUlNZW1lbnRvIGNoaWxkID0gY2hpbGRyZW5baV07CisJCQkJCVN0cmluZyBpZCA9IGNoaWxkLmdldFN0cmluZygiaWQiKTsKKwkKKwkJCQkJZGlzYWJsZWRDYXRlZ29yaWVzLmFkZChpZCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlYWRpbmcgVVJMIG1hcCAiLCBleCk7CisJCQkJfQorCQkJfQorCQorCQkJSU1lbWVudG8gc291bmQgPSBtZW1lbnRvLmdldENoaWxkKCJzb3VuZHMiKTsKKwkJCWNoaWxkcmVuID0gc291bmQuZ2V0Q2hpbGRyZW4oInNvdW5kIik7CisJCisJCQlzaXplID0gY2hpbGRyZW4ubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQl0cnkgeworCQkJCQlJTWVtZW50byBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJCQlTdHJpbmcgaWQgPSBjaGlsZC5nZXRTdHJpbmcoImlkIik7CisJCisJCQkJCWRpc2FibGVkU291bmRzLmFkZChpZCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlYWRpbmcgVVJMIG1hcCAiLCBleCk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy9BdWRpb1BsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEF1ZGlvUGx1Z2luLlBMVUdJTl9JRCwgMCwgIkNvdWxkIG5vdCBsb2FkIGRpc2FibGVkIHNvdW5kIGluZm9ybWF0aW9uIiwgZSkpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGluICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlpbi5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIExvYWQgZXh0ZW5zaW9uIHBvaW50LgorCSAqLworCXByaXZhdGUgdm9pZCBsb2FkRXh0ZW5zaW9uUG9pbnRzKCkgeworCQkvLyBsb2FkIGV4dGVuc2lvbiBwb2ludHMKKwkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAiYXVkaW8iKTsKKwkKKwkJaW50IHNpemUgPSBjZi5sZW5ndGg7CisJCWNhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJc291bmRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTb3VuZD4oKTsKKwkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gY2ZbaV0uZ2V0TmFtZSgpOworCQkJCVN0cmluZyBpZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsKKwkJCQlTdHJpbmcgbmFtZSA9IGNmW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpOworCQkJCWlmICgiY2F0ZWdvcnkiLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKKwkJCQkJY2F0ZWdvcmllcy5wdXQoaWQsIG5hbWUpOworCQkJCX0gZWxzZSBpZiAoInNvdW5kIi5lcXVhbHMoZWxlbWVudE5hbWUpKSB7CisJCQkJCVN0cmluZyBjYXRlZ29yeSA9IGNmW2ldLmdldEF0dHJpYnV0ZSgiY2F0ZWdvcnkiKTsKKwkJCQkJU3RyaW5nIGxvY2F0aW9uID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpOworCQorCQkJCQlVUkwgcmVhbFVSTCA9IG51bGw7CisJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLmxlbmd0aCgpID4gMCkgeworCQkJCQkJU3RyaW5nIHBsdWdpbklkID0gY2ZbaV0uZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7CisJCQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLCBuZXcgUGF0aChsb2NhdGlvbiksIG51bGwpOworCQkJCQkJcmVhbFVSTCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKKwkJCQkJfQorCQorCQkJCQlTb3VuZCBzb3VuZCA9IG5ldyBTb3VuZChpZCwgY2F0ZWdvcnksIG5hbWUsIHJlYWxVUkwpOworCQkJCQlzb3VuZHMucHV0KGlkLCBzb3VuZCk7CisJCQkJfQorCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBhdWRpbzogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTYXZlcyB0aGUgZGlzYWJsZWQgc291bmQgbGlzdC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgbG9hZFNvdW5kTWFwKCkgeworCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoU09VTkRTX0ZJTEUpLnRvT1NTdHJpbmcoKTsKKwkKKwkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQl1c2VyU291bmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQYXRoPigpOworCQl0cnkgeworCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKKwkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGluKTsKKwkKKwkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKCJtYXAiKTsKKwkKKwkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQl0cnkgeworCQkJCQlJTWVtZW50byBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJCQlTdHJpbmcgaWQgPSBjaGlsZC5nZXRTdHJpbmcoImlkIik7CisJCQkJCVN0cmluZyBwYXRoU3RyID0gY2hpbGQuZ2V0U3RyaW5nKCJwYXRoIik7CisJCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChwYXRoU3RyKTsKKwkKKwkJCQkJdXNlclNvdW5kTWFwLnB1dChpZCwgcGF0aCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlYWRpbmcgVVJMIG1hcCAiLCBleCk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0gZmluYWxseSB7CisJCQlpZiAoaW4gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWluLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUGxheSB0aGUgc291bmQgd2l0aCB0aGUgZ2l2ZW4gaWQuIChwcm92aWRlZCB0aGF0CisJICogdGhlIHVzZXIgaGFzIGVuYWJsZWQgdGhlIHNvdW5kKQorCSAqCisJICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBwbGF5U291bmQoU3RyaW5nIGlkKSB7CisJCWlmICghaXNTb3VuZEVuYWJsZWQoKSkKKwkJCXJldHVybjsKKwkKKwkJaWYgKCFpc1NvdW5kRW5hYmxlZChpZCkpCisJCQlyZXR1cm47CisJCisJCXRyeSB7CisJCQlTb3VuZCBzb3VuZCA9IHNvdW5kcy5nZXQoaWQpOworCQkJU3RyaW5nIGNhdGVnb3J5ID0gc291bmQuZ2V0Q2F0ZWdvcnkoKTsKKwkJCWlmIChjYXRlZ29yeSAhPSBudWxsICYmIGNhdGVnb3JpZXMuY29udGFpbnNLZXkoY2F0ZWdvcnkpKSB7CisJCQkJaWYgKCFpc0NhdGVnb3J5RW5hYmxlZChjYXRlZ29yeSkpCisJCQkJCXJldHVybjsKKwkJCX0KKwkKKwkJCVVSTCB1cmwgPSBzb3VuZC5nZXRMb2NhdGlvbigpOworCQkJSVBhdGggcGF0aCA9IGdldFVzZXJTb3VuZFBhdGgoaWQpOworCQkJaWYgKHBhdGggIT0gbnVsbCkKKwkJCQl1cmwgPSBwYXRoLnRvRmlsZSgpLnRvVVJMKCk7CisJCisJCQlwbGF5U291bmQodXJsLCBnZXRWb2x1bWUoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBwbGF5aW5nIGF1ZGlvOiAiICsgaWQsIGUpOworCQl9CisJfQorCisJLyoqCisJICogUGxheXMgdGhlIHNvdW5kIGF0IHRoZSBnaXZlbiB1cmwuCisJICoKKwkgKiBAcGFyYW0gdXJsIGphdmEubmV0LlVSTAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwbGF5U291bmQoVVJMIHVybCwgZmluYWwgaW50IHZvbHVtZSkgeworCQl0cnkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAicGxheVNvdW5kIik7CisJCQlpZiAodXJsID09IG51bGwgfHwgdm9sdW1lIDw9IDApCisJCQkJcmV0dXJuOworCQorCQkJZmluYWwgQ2xpcCBjbGlwID0gZ2V0Q2xpcCh1cmwpOworCQkJaWYgKGNsaXAgPT0gbnVsbCkKKwkJCQlyZXR1cm47CisJCQkJCisJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJwbGF5aW5nIik7CisJCisJCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlNvdW5kIFRocmVhZCIpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCS8vIHNldCBnYWluCisJCQkJCUZsb2F0Q29udHJvbCBnYWluQ29udHJvbCA9IChGbG9hdENvbnRyb2wpIGNsaXAuZ2V0Q29udHJvbChGbG9hdENvbnRyb2wuVHlwZS5NQVNURVJfR0FJTik7CisJCQkJCWRvdWJsZSB2YWx1ZSA9IHZvbHVtZSAvIDIwLjA7CisJCQkJCWZsb2F0IGRCID0gKGZsb2F0KSAoTWF0aC5sb2codmFsdWU9PTAuMD8wLjAwMDE6dmFsdWUpL01hdGgubG9nKDEwLjApKjIwLjApOworCQkJCQlnYWluQ29udHJvbC5zZXRWYWx1ZShkQik7CisJCisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN0YXJ0Iik7CisJCQkJCWNsaXAuc3RhcnQoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXNsZWVwKDk5KTsKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCS8vIGlnbm9yZQorCQkJCQl9CisJCisJCQkJCXdoaWxlIChjbGlwLmlzQWN0aXZlKCkpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJc2xlZXAoOTkpOworCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQljbGlwLnN0b3AoKTsKKwkJCQkJY2xpcC5jbG9zZSgpOworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzdG9wIik7CisJCQkJfQorCQkJfTsKKwkJCXQuc2V0RGFlbW9uKHRydWUpOworCQkJdC5zdGFydCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcGxheWluZyBhdWRpbzogIiArIHVybCwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTYXZlcyB0aGUgZGlzYWJsZWQgc291bmRzIGFuZCBjYXRlZ29yaWVzIGxpc3QuCisJICovCisJcHJpdmF0ZSB2b2lkIHNhdmVEaXNhYmxlZExpc3RzKCkgeworCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoRElTQUJMRURfRklMRSkudG9PU1N0cmluZygpOworCQorCQlGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBudWxsOworCQl0cnkgeworCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoImRpc2FibGVkIik7CisJCisJCQlJTWVtZW50byBjYXQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJjYXRlZ29yaWVzIik7CisJCQlJdGVyYXRvciBpdGVyYXRvciA9IGRpc2FibGVkQ2F0ZWdvcmllcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUlNZW1lbnRvIGNoaWxkID0gY2F0LmNyZWF0ZUNoaWxkKCJjYXRlZ29yeSIpOworCQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQljaGlsZC5wdXRTdHJpbmcoImlkIiwgaWQpOworCQkJfQorCQorCQkJSU1lbWVudG8gc291bmQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJzb3VuZHMiKTsKKwkJCWl0ZXJhdG9yID0gZGlzYWJsZWRTb3VuZHMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlJTWVtZW50byBjaGlsZCA9IHNvdW5kLmNyZWF0ZUNoaWxkKCJzb3VuZCIpOworCQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQljaGlsZC5wdXRTdHJpbmcoImlkIiwgaWQpOworCQkJfQorCQorCQkJZm91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKTsKKwkJCW1lbWVudG8uc2F2ZShmb3V0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIGRpc2FibGVkIGluZm9ybWF0aW9uIiwgZSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZm91dCAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJZm91dC5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNhdmVzIHRoZSBkaXNhYmxlZCBzb3VuZCBsaXN0LgorCSAqLworCXByaXZhdGUgdm9pZCBzYXZlU291bmRNYXAoKSB7CisJCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChTT1VORFNfRklMRSkudG9PU1N0cmluZygpOworCQorCQlGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBudWxsOworCQl0cnkgeworCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoInNvdW5kLW1hcCIpOworCQorCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB1c2VyU291bmRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1hcCIpOworCQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQljaGlsZC5wdXRTdHJpbmcoImlkIiwgaWQpOworCQkJCUlQYXRoIHBhdGggPSB1c2VyU291bmRNYXAuZ2V0KGlkKTsKKwkJCQljaGlsZC5wdXRTdHJpbmcoInBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpOworCQkJfQorCQorCQkJZm91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKTsKKwkJCW1lbWVudG8uc2F2ZShmb3V0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFVSTCBtYXAgaW5mb3JtYXRpb24iLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmb3V0ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlmb3V0LmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogRW5hYmxlIG9yIGRpc2FibGUgYSBzcGVjaWZpYyBjYXRlZ29yeS4KKwkgKgorCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCisJICogQHBhcmFtIGIgYm9vbGVhbgorCSAqLworCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5RW5hYmxlZChTdHJpbmcgaWQsIGJvb2xlYW4gYikgeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkKKwkJaWYgKGRpc2FibGVkQ2F0ZWdvcmllcyA9PSBudWxsKQorCQkJbG9hZERpc2FibGVkTGlzdHMoKTsKKwkKKwkJaWYgKGIpIHsKKwkJCWlmIChkaXNhYmxlZENhdGVnb3JpZXMuY29udGFpbnMoaWQpKSB7CisJCQkJZGlzYWJsZWRDYXRlZ29yaWVzLnJlbW92ZShpZCk7CisJCQkJc2F2ZURpc2FibGVkTGlzdHMoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghZGlzYWJsZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGlkKSkgeworCQkJCWRpc2FibGVkQ2F0ZWdvcmllcy5hZGQoaWQpOworCQkJCXNhdmVEaXNhYmxlZExpc3RzKCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBFbmFibGUgb3IgZGlzYWJsZSBhIHNwZWNpZmljIHNvdW5kLgorCSAqCisJICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcGFyYW0gYiBib29sZWFuCisJICovCisJcHVibGljIHZvaWQgc2V0U291bmRFbmFibGVkKFN0cmluZyBpZCwgYm9vbGVhbiBiKSB7CisJCWlmIChpZCA9PSBudWxsKQorCQkJcmV0dXJuOworCQorCQlpZiAoZGlzYWJsZWRTb3VuZHMgPT0gbnVsbCkKKwkJCWxvYWREaXNhYmxlZExpc3RzKCk7CisJCisJCWlmIChiKSB7CisJCQlpZiAoZGlzYWJsZWRTb3VuZHMuY29udGFpbnMoaWQpKSB7CisJCQkJZGlzYWJsZWRTb3VuZHMucmVtb3ZlKGlkKTsKKwkJCQlzYXZlRGlzYWJsZWRMaXN0cygpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFkaXNhYmxlZFNvdW5kcy5jb250YWlucyhpZCkpIHsKKwkJCQlkaXNhYmxlZFNvdW5kcy5hZGQoaWQpOworCQkJCXNhdmVEaXNhYmxlZExpc3RzKCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZXRzIHdoZXRoZXIgc291bmQgaXMgZW5hYmxlZC4KKwkgKgorCSAqIEBwYXJhbSBlbmFibGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U291bmRzRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKwkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoUFJFRl9TT1VORF9FTkFCTEVELCBlbmFibGVkKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBjdXJyZW50IFVSTCBmb3IgdGhpcyBzb3VuZC4KKwkgKgorCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCisJICogQHBhcmFtIHBhdGggSVBhdGgKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRTb3VuZFVSTChTdHJpbmcgaWQsIElQYXRoIHBhdGgpIHsKKwkJaWYgKGlkID09IG51bGwgfHwgcGF0aCA9PSBudWxsKQorCQkJcmV0dXJuOworCQorCQl0cnkgeworCQkJaWYgKHVzZXJTb3VuZE1hcCA9PSBudWxsKQorCQkJCWxvYWRTb3VuZE1hcCgpOworCQorCQkJdXNlclNvdW5kTWFwLnB1dChpZCwgcGF0aCk7CisJCQlzYXZlU291bmRNYXAoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgc291bmQgVVJMOiAiICsgaWQsIGUpOworCQl9CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZnVsbCB1c2VyIHNvdW5kIG1hcC4KKwkgKgorCSAqIEBwYXJhbSBtYXAgdGhlIHNvdW5kIG1hcAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVzZXJTb3VuZE1hcChNYXA8U3RyaW5nLCBJUGF0aD4gbWFwKSB7CisJCWlmIChtYXAgIT0gbnVsbCkgeworCQkJdXNlclNvdW5kTWFwID0gbWFwOworCQkJc2F2ZVNvdW5kTWFwKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2b2x1bWUuCisJICoKKwkgKiBAcGFyYW0gdm9sdW1lIHRoZSB2b2x1bWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWb2x1bWUoaW50IHZvbHVtZSkgeworCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShQUkVGX1ZPTFVNRSwgdm9sdW1lKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1ByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1ByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0ZWEzNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtMCwwICsxLDQ2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkNvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKKy8qKgorICogQXVkaW8gcHJlZmVyZW5jZSBwYWdlLgorICovCitwdWJsaWMgY2xhc3MgQXVkaW9QcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKKwlwcm90ZWN0ZWQgQnV0dG9uIGVuYWJsZUJ1dHRvbjsKKwlwcm90ZWN0ZWQgU3Bpbm5lciB2b2x1bWU7CisKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgSVBhdGg+IHVzZXJTb3VuZE1hcDsKKworCXByb3RlY3RlZCBDYXRlZ29yeVRhYmxlVmlld2VyIHZpZXdlcjsKKwkKKwlib29sZWFuIHNvdW5kQXZhaWxhYmxlID0gdHJ1ZTsKKworCS8qKgorCSAqIEF1ZGlvUHJlZmVyZW5jZVBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgQXVkaW9QcmVmZXJlbmNlUGFnZSgpIHsKKwkJc3VwZXIoKTsKKwkKKwkJbG9hZFVzZXJNYXBJbmZvKCk7CisJfQorCQorCXByb3RlY3RlZCBJUGF0aCBjaG9vc2VBdWRpb0ZpbGUoKSB7CisJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgU1dULlNJTkdMRSk7CisJCWRpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlNlbGVjdEZpbGUpOworCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmF1Oyoud2F2In0pOworCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChudWxsKTsKKwkJZGlhbG9nLm9wZW4oKTsKKwkKKwkJU3RyaW5nW10gZmlsZW5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOworCQlpZiAoZmlsZW5hbWVzICE9IG51bGwgJiYgZmlsZW5hbWVzLmxlbmd0aCA+IDApIHsKKwkJCVN0cmluZyBmaWx0ZXJQYXRoID0gZGlhbG9nLmdldEZpbHRlclBhdGgoKTsKKwkJCXJldHVybiBuZXcgUGF0aChmaWx0ZXJQYXRoICsgamF2YS5pby5GaWxlLnNlcGFyYXRvciArIGZpbGVuYW1lc1swXSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgCisJICogb2YgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCisJICogPHA+CisJICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUKKwkgKiBzdWJjbGFzc2VzLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKKwkgKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAorCSAqLworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7CisJCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOworCQl3aHMuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVMpOworCQorCQlmaW5hbCBBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOworCQorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkKKwkJZW5hYmxlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7CisJCWVuYWJsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZkVuYWJsZSk7CisJCWVuYWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuaXNTb3VuZEVuYWJsZWQoKSk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CisJCWVuYWJsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworCQl3aHMuc2V0SGVscChlbmFibGVCdXR0b24sIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfRU5BQkxFKTsKKwkJCisJCWZpbmFsIExhYmVsIHZvbHVtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQl2b2x1bWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlZvbHVtZSk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7CisJCXZvbHVtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCXZvbHVtZUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKKwkJCisJCXZvbHVtZSA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCXZvbHVtZS5zZXRNaW5pbXVtKDApOworCQl2b2x1bWUuc2V0TWF4aW11bSgyMCk7CisJCXZvbHVtZS5zZXRTZWxlY3Rpb24oQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuZ2V0Vm9sdW1lKCkpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWRhdGEud2lkdGhIaW50ID0gNjA7CisJCXZvbHVtZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQl2b2x1bWUuc2V0RW5hYmxlZChlbmFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOworCQl3aHMuc2V0SGVscCh2b2x1bWUsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfVk9MVU1FKTsKKwkJCisJCWVuYWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQl2b2x1bWVMYWJlbC5zZXRFbmFibGVkKGVuYWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7CisJCQkJdm9sdW1lLnNldEVuYWJsZWQoZW5hYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKKwkJCX0KKwkJfSk7CisJCQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlNvdW5kcyk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CisJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkNIRUNLKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJd2hzLnNldEhlbHAodGFibGUsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfU09VTkRTX1RBQkxFKTsKKwkJCisJCXZpZXdlciA9IG5ldyBDYXRlZ29yeVRhYmxlVmlld2VyKHRhYmxlKTsKKwkJCisJCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7CisJCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7CisJCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisJCQorCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5QaXhlbERhdGEoMjMsIGZhbHNlKSk7CisJCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUiwgMCk7CisJCWNvbC5zZXRSZXNpemFibGUoZmFsc2UpOworCQkKKwkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMSwgMTEwLCB0cnVlKSk7CisJCWNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDEpOworCQljb2wuc2V0VGV4dChNZXNzYWdlcy5hdWRpb1ByZWZTb3VuZCk7CisJCWNvbC5zZXRSZXNpemFibGUodHJ1ZSk7CisJCQorCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDE1LCAxNTAsIHRydWUpKTsKKwkJY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMik7CisJCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZkZpbGUpOworCQljb2wuc2V0UmVzaXphYmxlKHRydWUpOworCQkKKwkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKKwkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEF1ZGlvVGFibGVMYWJlbFByb3ZpZGVyKHRoaXMpKTsKKwkJdmlld2VyLnNldElucHV0KCJyb290Iik7CisJCQorCQlzZXRDaGVja1N0YXRlKHZpZXdlcik7CisJCQorCQl2aWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKKwkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOworCQkJCQorCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQkJU3RyaW5nIGlkID0gKFN0cmluZykgb2JqOworCQkJCQljb3JlLnNldENhdGVnb3J5RW5hYmxlZChpZCwgY2hlY2tlZCk7CisJCQkJCS8vdmlld2VyLnJlZnJlc2goKTsKKwkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLmdldFNvdW5kc0J5Q2F0ZWdvcnkoaWQpLml0ZXJhdG9yKCk7CisJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJCVNvdW5kIHMgPSAoU291bmQpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCXZpZXdlci5zZXRDaGVja2VkKHMsIGNoZWNrZWQpOworCQkJCQkJY29yZS5zZXRTb3VuZEVuYWJsZWQocy5nZXRJZCgpLCBjaGVja2VkKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVNvdW5kIHNvdW5kID0gKFNvdW5kKSBvYmo7CisJCQkJCWNvcmUuc2V0U291bmRFbmFibGVkKHNvdW5kLmdldElkKCksIGNoZWNrZWQpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCQorCQlDb21wb3NpdGUgcmlnaHQgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDQpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJcmlnaHQuc2V0TGF5b3V0KGxheW91dCk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKKwkJcmlnaHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkKKwkJLy8gcGxheSBidXR0b24gYW5kIHRhYmxlIHNlbGVjdGlvbiBsaXN0ZW5lcgorCQlmaW5hbCBCdXR0b24gcGxheUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHJpZ2h0LCBNZXNzYWdlcy5hdWRpb1ByZWZQbGF5KTsKKwkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJd2hzLnNldEhlbHAocGxheUJ1dHRvbiwgQ29udGV4dElkcy5BVURJT19QUkVGRVJFTkNFU19QTEFZKTsKKwkKKwkJZmluYWwgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHJpZ2h0LCBNZXNzYWdlcy5hdWRpb1ByZWZCcm93c2UpOworCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCXdocy5zZXRIZWxwKGJyb3dzZUJ1dHRvbiwgQ29udGV4dElkcy5BVURJT19QUkVGRVJFTkNFU19CUk9XU0UpOworCQorCQlmaW5hbCBCdXR0b24gcmVzZXRCdXR0b24gPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihyaWdodCwgTWVzc2FnZXMuYXVkaW9QcmVmUmVzZXQpOworCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJd2hzLnNldEhlbHAocmVzZXRCdXR0b24sIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfUkVTRVQpOworCQkKKwkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJdHJ5IHsKKwkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKwkJCQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNvdW5kKSB7CisJCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgb2JqOworCQkJCQkJVVJMIHVybCA9IGdldFNvdW5kVVJMKHNvdW5kLmdldElkKCkpOworCQkJCQkJaWYgKHVybCAhPSBudWxsICYmIHNvdW5kQXZhaWxhYmxlKQorCQkJCQkJCXBsYXlCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwbGF5QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJCQkJCQkKKwkJCQkJCWlmIChnZXRVc2VyU291bmRQYXRoKHNvdW5kLmdldElkKCkpICE9IG51bGwpCisJCQkJCQkJcmVzZXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBsYXlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbiB0YWJsZSBzZWxlY3Rpb24iLCBleCk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkKKwkJc291bmRBdmFpbGFibGUgPSBBdWRpb0NvcmUuaXNBdWRpb1N1cHBvcnRlZCgpOworCQlpZiAoc291bmRBdmFpbGFibGUpIHsKKwkJCXBsYXlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQl0cnkgeworCQkJCQkJaW50IHNlbCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7CisJCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgdGFibGUuZ2V0SXRlbShzZWwpLmdldERhdGEoKTsKKwkJCQkJCUF1ZGlvQ29yZS5wbGF5U291bmQoZ2V0U291bmRVUkwoc291bmQuZ2V0SWQoKSksIHZvbHVtZS5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgaW4gdGFibGUgc2VsZWN0aW9uIiwgZXgpOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCX0gZWxzZQorCQkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCisJCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQl0cnkgeworCQkJCQlJUGF0aCBwYXRoID0gY2hvb3NlQXVkaW9GaWxlKCk7CisJCQkJCWlmIChwYXRoICE9IG51bGwpIHsKKwkJCQkJCWludCBzZWwgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOworCQkJCQkJU291bmQgc291bmQgPSAoU291bmQpIHRhYmxlLmdldEl0ZW0oc2VsKS5nZXREYXRhKCk7CisJCQkJCQlzZXRVc2VyU291bmRQYXRoKHNvdW5kLmdldElkKCksIHBhdGgpOworCQkJCQkJdmlld2VyLnJlZnJlc2goc291bmQpOworCQkJCQkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQkJCQl9CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGJyb3dzaW5nIiwgZXgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCQorCQlyZXNldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQl0cnkgeworCQkJCQlpbnQgc2VsID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwkJCQkJU291bmQgc291bmQgPSAoU291bmQpIHRhYmxlLmdldEl0ZW0oc2VsKS5nZXREYXRhKCk7CisJCQkJCXJlbW92ZVVzZXJTb3VuZFBhdGgoc291bmQuZ2V0SWQoKSk7CisJCQkJCXZpZXdlci5yZWZyZXNoKHNvdW5kKTsKKwkJCQkJLy9wbGF5QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc2V0aW5nIHNvdW5kIiwgZXgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCQorCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7CisJCQorCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldENoZWNrU3RhdGUoQ2hlY2tib3hUYWJsZVZpZXdlciB2aWV3ZXIpIHsKKwkJQXVkaW9Db3JlIGNvcmUgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKTsKKwkJCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gY2F0ZWdvcmllcyA9IGNvcmUuZ2V0Q2F0ZWdvcmllcygpOworCQkKKwkJLy8gZmlyc3QsIGZpbmQgYWxsIHRoZSBjYXRlZ29yaWVzIGFuZCBzb3J0CisJCUxpc3Q8U3RyaW5nPiBjYXRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY2F0ZWdvcmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQorCQkJY2F0cy5hZGQoKFN0cmluZylpdGVyYXRvci5uZXh0KCkpOworCQkKKwkJLy8gbGlzdCB0aGVtLCBpZ25vcmluZyBlbXB0eSBvbmVzCisJCWl0ZXJhdG9yID0gY2F0ZWdvcmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQlMaXN0IGwgPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLmdldFNvdW5kc0J5Q2F0ZWdvcnkoaWQpOworCQkJaWYgKCFsLmlzRW1wdHkoKSkgeworCQkJCWlmIChjb3JlLmlzQ2F0ZWdvcnlFbmFibGVkKGlkKSkKKwkJCQkJdmlld2VyLnNldENoZWNrZWQoaWQsIHRydWUpOworCQkJCQorCQkJCWludCBzaXplID0gbC5zaXplKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkJU291bmQgcyA9IChTb3VuZCkgbC5nZXQoaSk7CisJCQkJCWlmIChjb3JlLmlzU291bmRFbmFibGVkKHMuZ2V0SWQoKSkpCisJCQkJCQl2aWV3ZXIuc2V0Q2hlY2tlZChzLCB0cnVlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCS8vIGZpbmFsbHksIGxpc3QgdGhlICJtaXNjIiBzb3VuZHMKKwkJTGlzdCBsID0gQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlci5nZXRTb3VuZHNCeUNhdGVnb3J5KG51bGwpOworCQlpZiAoIWwuaXNFbXB0eSgpKSB7CisJCQlpbnQgc2l6ZSA9IGwuc2l6ZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlTb3VuZCBzID0gKFNvdW5kKSBsLmdldChpKTsKKwkJCQlpZiAoY29yZS5pc1NvdW5kRW5hYmxlZChzLmdldElkKCkpKQorCQkJCQl2aWV3ZXIuc2V0Q2hlY2tlZChzLCB0cnVlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCisJICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwcm90ZWN0ZWQgVVJMIGdldFNvdW5kVVJMKFN0cmluZyBpZCkgeworCQl0cnkgeworCQkJSVBhdGggcGF0aCA9IHVzZXJTb3VuZE1hcC5nZXQoaWQpOworCQkJaWYgKHBhdGggIT0gbnVsbCkKKwkJCQlyZXR1cm4gcGF0aC50b0ZpbGUoKS50b1VSTCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkKKwkJcmV0dXJuIEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpLmdldFNvdW5kKGlkKS5nZXRMb2NhdGlvbigpOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCisJICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwcm90ZWN0ZWQgSVBhdGggZ2V0VXNlclNvdW5kUGF0aChTdHJpbmcgaWQpIHsKKwkJdHJ5IHsKKwkJCUlQYXRoIHBhdGggPSB1c2VyU291bmRNYXAuZ2V0KGlkKTsKKwkJCWlmIChwYXRoICE9IG51bGwpCisJCQkJcmV0dXJuIHBhdGg7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIGdpdmVuIHdvcmtiZW5jaC4KKwkgKiA8cD4KKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGlzIGJlaW5nIGNyZWF0ZWQKKwkgKiBhbmQgaW5pdGlhbGl6ZWQuIENsaWVudHMgbXVzdCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gd29ya2JlbmNoIHRoZSB3b3JrYmVuY2gKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBsb2FkVXNlck1hcEluZm8oKSB7CisJCS8vIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHVzZXIgc291bmQgbWFwCisJCU1hcDxTdHJpbmcsIElQYXRoPiBtYXAgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKS5nZXRVc2VyU291bmRNYXAoKTsKKwkJdXNlclNvdW5kTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJUGF0aD4obWFwLnNpemUoKSk7CisJCQorCQlJdGVyYXRvciBpdGVyYXRvciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQlJUGF0aCBwYXRoID0gbWFwLmdldChpZCk7CisJCQl1c2VyU291bmRNYXAucHV0KGlkLCBwYXRoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCUF1ZGlvQ29yZSBjb3JlID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCk7CisJCQorCQllbmFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGNvcmUuZ2V0RGVmYXVsdFNvdW5kc0VuYWJsZWQoKSk7CisJCXZvbHVtZS5zZXRTZWxlY3Rpb24oY29yZS5nZXREZWZhdWx0Vm9sdW1lKCkpOworCQorCQl1c2VyU291bmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQYXRoPigpOworCQl2aWV3ZXIucmVmcmVzaCgpOworCQorCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwl9CisKKwkvKiogCisJICogQHNlZSBQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQorCSAqLworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKKwkJQXVkaW9Db3JlIGNvcmUgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKTsKKwkJY29yZS5zZXRTb3VuZHNFbmFibGVkKGVuYWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7CisJCWNvcmUuc2V0Vm9sdW1lKHZvbHVtZS5nZXRTZWxlY3Rpb24oKSk7CisJCisJCWNvcmUuc2V0VXNlclNvdW5kTWFwKHVzZXJTb3VuZE1hcCk7CisJCXZpZXdlci5yZWZyZXNoKCk7CisJCisJCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVVc2VyU291bmRQYXRoKFN0cmluZyBpZCkgeworCQlpZiAodXNlclNvdW5kTWFwLmNvbnRhaW5zS2V5KGlkKSkKKwkJCXVzZXJTb3VuZE1hcC5yZW1vdmUoaWQpOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNhdmVVc2VyTWFwSW5mbygpIHsKKwkJLy8gY3JlYXRlIGEgY29weSBvZiB0aGUgdXNlciBzb3VuZCBtYXAKKwkJTWFwIG1hcCA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpLmdldFVzZXJTb3VuZE1hcCgpOworCQl1c2VyU291bmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQYXRoPihtYXAuc2l6ZSgpKTsKKwkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOworCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgbWFwLmdldChpZCk7CisJCQl1c2VyU291bmRNYXAucHV0KGlkLCBwYXRoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXRoIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVzZXJTb3VuZFBhdGgoU3RyaW5nIGlkLCBJUGF0aCBwYXRoKSB7CisJCXVzZXJTb3VuZE1hcC5wdXQoaWQsIHBhdGgpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWVhMTVjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlQ29udGVudFByb3ZpZGVyOworLyoqCisgKiBBdWRpbyB0YWJsZSBjb250ZW50IHByb3ZpZGVyLgorICovCitjbGFzcyBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQmFzZUNvbnRlbnRQcm92aWRlciB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTQ19DQVRFR09SWSA9ICJtaXNjQ2F0ZWdvcnkiOworCisJLyoqCisJICogQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciAKKwkgKiB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuIAorCSAqIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KKwkgKiBUaGUgcmVzdWx0IGlzIG5vdCBtb2RpZmllZCBieSB0aGUgdmlld2VyLgorCSAqCisJICogQHBhcmFtIGlucHV0RWxlbWVudCB0aGUgaW5wdXQgZWxlbWVudAorCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlcgorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCUF1ZGlvQ29yZSBjb3JlID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCk7CisJCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gY2F0ZWdvcmllcyA9IGNvcmUuZ2V0Q2F0ZWdvcmllcygpOworCQlNYXA8U3RyaW5nLCBTb3VuZD4gc291bmRzID0gY29yZS5nZXRTb3VuZHMoKTsKKwkKKwkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oc291bmRzLnNpemUoKSk7CisJCisJCS8vIGZpcnN0LCBmaW5kIGFsbCB0aGUgY2F0ZWdvcmllcyBhbmQgc29ydAorCQlMaXN0PFN0cmluZz4gY2F0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlJdGVyYXRvciBpdGVyYXRvciA9IGNhdGVnb3JpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKKwkJCWNhdHMuYWRkKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSk7CisJCXNvcnRDYXRlZ29yaWVzKGNhdHMpOworCQkKKwkJLy8gbGlzdCB0aGVtLCBpZ25vcmluZyBlbXB0eSBvbmVzCisJCWl0ZXJhdG9yID0gY2F0ZWdvcmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQlMaXN0PFNvdW5kPiBsID0gZ2V0U291bmRzQnlDYXRlZ29yeShpZCk7CisJCQlpZiAoIWwuaXNFbXB0eSgpKSB7CisJCQkJbGlzdC5hZGQoaWQpOworCQkJCXNvcnRTb3VuZHMobCk7CisJCisJCQkJaW50IHNpemUgPSBsLnNpemUoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQkJbGlzdC5hZGQobC5nZXQoaSkpOworCQkJfQorCQl9CisJCisJCS8vIGZpbmFsbHksIGxpc3QgdGhlICJtaXNjIiBzb3VuZHMKKwkJTGlzdDxTb3VuZD4gbCA9IGdldFNvdW5kc0J5Q2F0ZWdvcnkobnVsbCk7CisJCWlmICghbC5pc0VtcHR5KCkpIHsKKwkJCWxpc3QuYWRkKE1JU0NfQ0FURUdPUlkpOworCQkJc29ydFNvdW5kcyhsKTsKKwkKKwkJCWludCBzaXplID0gbC5zaXplKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQlsaXN0LmFkZChsLmdldChpKSk7CisJCX0KKwkKKwkJcmV0dXJuIGxpc3QudG9BcnJheSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNvdW5kcyBmcm9tIHRoZSBnaXZlbiBjYXRlZ29yeS4gVXNlIG51bGwKKwkgKiB0byByZXR1cm4gYWxsIG1pc2NlbGxlbmVvdXMgc291bmRzIHdpdGggbm8gY2F0ZWdvcnkgb3IKKwkgKiBhbiBpbnZhbGlkIGNhdGVnb3J5LgorCSAqCisJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAorCSAqIEBwYXJhbSBjYXRlZ29yeSBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFNvdW5kPiBnZXRTb3VuZHNCeUNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworCQlBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOworCQorCQlNYXA8U3RyaW5nLCBTb3VuZD4gc291bmRzID0gY29yZS5nZXRTb3VuZHMoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjYXRlZ29yaWVzID0gY29yZS5nZXRDYXRlZ29yaWVzKCk7CisJCUxpc3Q8U291bmQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNvdW5kPigpOworCQorCQlJdGVyYXRvciBpdGVyYXRvciA9IHNvdW5kcy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQlTb3VuZCBzb3VuZCA9IHNvdW5kcy5nZXQoaWQpOworCQkJaWYgKGNhdGVnb3J5ICE9IG51bGwgJiYgY2F0ZWdvcnkuZXF1YWxzKHNvdW5kLmdldENhdGVnb3J5KCkpKQorCQkJCWxpc3QuYWRkKHNvdW5kKTsKKwkJCWVsc2UgaWYgKGNhdGVnb3J5ID09IG51bGwgJiYgKHNvdW5kLmdldENhdGVnb3J5KCkgPT0gbnVsbCB8fCAhY2F0ZWdvcmllcy5jb250YWluc0tleShzb3VuZC5nZXRDYXRlZ29yeSgpKSkpCisJCQkJbGlzdC5hZGQoc291bmQpOworCQl9CisJCXJldHVybiBsaXN0OworCX0KKworCS8qKgorCSAqIFNvcnRzIGEgbGlzdCBvZiBjYXRlZ29yaWVzLCBpbiBwbGFjZS4KKwkgKgorCSAqIEBwYXJhbSBsaXN0IGphdmEudXRpbC5MaXN0CisJICovCisJcHJvdGVjdGVkIHZvaWQgc29ydENhdGVnb3JpZXMoTGlzdDxTdHJpbmc+IGxpc3QpIHsKKwkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKKwkJaWYgKHNpemUgPCAyKQorCQkJcmV0dXJuOworCQkKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjYXRlZ29yaWVzID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuZ2V0Q2F0ZWdvcmllcygpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CisJCQlmb3IgKGludCBqID0gaSsxOyBqIDwgc2l6ZTsgaisrKSB7CisJCQkJU3RyaW5nIGEgPSBsaXN0LmdldChpKTsKKwkJCQlTdHJpbmcgYWEgPSBjYXRlZ29yaWVzLmdldChhKTsKKwkJCQlTdHJpbmcgYiA9IGxpc3QuZ2V0KGopOworCQkJCVN0cmluZyBiYiA9IGNhdGVnb3JpZXMuZ2V0KGIpOworCQkJCWlmIChhYS5jb21wYXJlVG8oYmIpID4gMCkgeworCQkJCQlsaXN0LnNldChpLCBiKTsKKwkJCQkJbGlzdC5zZXQoaiwgYSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogU29ydHMgYSBsaXN0IG9mIHNvdW5kcywgaW4gcGxhY2UuCisJICoKKwkgKiBAcGFyYW0gc291bmRzIGphdmEudXRpbC5MaXN0CisJICovCisJcHJvdGVjdGVkIHZvaWQgc29ydFNvdW5kcyhMaXN0PFNvdW5kPiBzb3VuZHMpIHsKKwkJaW50IHNpemUgPSBzb3VuZHMuc2l6ZSgpOworCQlpZiAoc2l6ZSA8IDIpCisJCQlyZXR1cm47CisJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgeworCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgeworCQkJCVNvdW5kIGEgPSBzb3VuZHMuZ2V0KGkpOworCQkJCVNvdW5kIGIgPSBzb3VuZHMuZ2V0KGopOworCQkJCWlmIChhLmdldE5hbWUoKS5jb21wYXJlVG8oYi5nZXROYW1lKCkpID4gMCkgeworCQkJCQlzb3VuZHMuc2V0KGksIGIpOworCQkJCQlzb3VuZHMuc2V0KGosIGEpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1RhYmxlTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGQ4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1RhYmxlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CisvKioKKyAqIEF1ZGlvIHRhYmxlIGxhYmVsIHByb3ZpZGVyLgorICovCitjbGFzcyBBdWRpb1RhYmxlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCXByb3RlY3RlZCBBdWRpb1ByZWZlcmVuY2VQYWdlIHBhZ2U7CisKKwkvKioKKwkgKiBBdWRpb1RhYmxlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqIAorCSAqIEBwYXJhbSBwYWdlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKKwkgKi8KKwlwdWJsaWMgQXVkaW9UYWJsZUxhYmVsUHJvdmlkZXIoQXVkaW9QcmVmZXJlbmNlUGFnZSBwYWdlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMucGFnZSA9IHBhZ2U7CisJfQorCisJLyoqCisJICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuIAorCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KKwkgKiA8cD4KKwkgKiBMYWJlbCBwcm92aWRlciBsaXN0ZW5lcnMgYXJlIGluZm9ybWVkIGFib3V0IHN0YXRlIGNoYW5nZXMgCisJICogdGhhdCBhZmZlY3QgdGhlIHJlbmRlcmluZyBvZiB0aGUgdmlld2VyIHRoYXQgdXNlcyB0aGlzIGxhYmVsIHByb3ZpZGVyLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBsaXN0ZW5lciBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogRGlzcG9zZXMgb2YgdGhpcyBsYWJlbCBwcm92aWRlci4gIFdoZW4gYSBsYWJlbCBwcm92aWRlciBpcworCSAqIGF0dGFjaGVkIHRvIGEgdmlld2VyLCB0aGUgdmlld2VyIHdpbGwgYXV0b21hdGljYWxseSBjYWxsCisJICogdGhpcyBtZXRob2Qgd2hlbiB0aGUgdmlld2VyIGlzIGJlaW5nIGNsb3NlZC4gIFdoZW4gbGFiZWwgcHJvdmlkZXJzCisJICogYXJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiBhIHZpZXdlciwgaXQgaXMgdGhlIGNsaWVudCdzCisJICogcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlCisJICogcHJvdmlkZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkvKkF1ZGlvQ29yZSBjb3JlID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCk7CisJCisJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCWlmIChlbGVtZW50ICE9IEF1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuTUlTQ19DQVRFR09SWSkgeworCQkJCQlpZiAoY29yZS5pc0NhdGVnb3J5RW5hYmxlZCgoU3RyaW5nKSBlbGVtZW50KSkKKwkJCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0FVRElPX0VOQUJMRUQpOworCQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19BVURJT19ESVNBQkxFRCk7CisJCQkJfQorCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJU291bmQgc291bmQgPSAoU291bmQpIGVsZW1lbnQ7CisJCQlpZiAoIWNvcmUuaXNDYXRlZ29yeUVuYWJsZWQoc291bmQuZ2V0Q2F0ZWdvcnkoKSkpCisJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fVU5BVkFJTEFCTEUpOworCQkJaWYgKGNvcmUuaXNTb3VuZEVuYWJsZWQoc291bmQuZ2V0SWQoKSkpCisJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fRU5BQkxFRCk7CisJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19BVURJT19ESVNBQkxFRCk7CisJCX0gZWxzZSovCisJCWlmIChjb2x1bW5JbmRleCA9PSAxKSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykKKwkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19BVURJT19DQVRFR09SWSk7CisJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19BVURJT19TT1VORCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCWlmIChjb2x1bW5JbmRleCA9PSAwKQorCQkJcmV0dXJuICIiOworCQkKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCVN0cmluZyBjYXRlZ29yeUlkID0gKFN0cmluZykgZWxlbWVudDsKKwkJCWlmIChjb2x1bW5JbmRleCA9PSAxKSB7CisJCQkJaWYgKGNhdGVnb3J5SWQuZXF1YWxzKEF1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuTUlTQ19DQVRFR09SWSkpCisJCQkJCXJldHVybiAiIjsgLy8oTWlzY2VsbGFuZW91cykiOworCQkJCU1hcCBjYXRlZ29yaWVzID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuZ2V0Q2F0ZWdvcmllcygpOworCQkJCXJldHVybiAoU3RyaW5nKSBjYXRlZ29yaWVzLmdldChjYXRlZ29yeUlkKTsKKwkJCX0KKwkJCXJldHVybiAiIjsKKwkJfQorCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgZWxlbWVudDsKKwkJCisJCWlmIChjb2x1bW5JbmRleCA9PSAxKSB7CisJCQlTdHJpbmcgcyA9IHNvdW5kLmdldE5hbWUoKTsKKwkJCWlmIChzICE9IG51bGwpCisJCQkJcmV0dXJuIHM7CisJCQlyZXR1cm4gTWVzc2FnZXMuYXVkaW9Vbmtub3duOworCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKKwkJCUlQYXRoIHBhdGggPSBwYWdlLmdldFVzZXJTb3VuZFBhdGgoc291bmQuZ2V0SWQoKSk7CisJCQlpZiAocGF0aCAhPSBudWxsKQorCQkJCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7CisJCQkKKwkJCVVSTCB1cmwgPSBwYWdlLmdldFNvdW5kVVJMKHNvdW5kLmdldElkKCkpOworCQkJaWYgKHVybCA9PSBudWxsKQorCQkJCXJldHVybiBNZXNzYWdlcy5hdWRpb05vbmU7CisJCQlyZXR1cm4gTWVzc2FnZXMuYXVkaW9EZWZhdWx0OworCQl9CisJCXJldHVybiAiIjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkIAorCSAqIGJ5IGEgY2hhbmdlIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKwkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGEgbm9uLXN0cnVjdHVyYWwgdmlld2VyIHVwZGF0ZS4KKwkgKiBJZiB0aGUgcHJvcGVydHkgbWVudGlvbmVkIGluIHRoZSB1cGRhdGUgZG9lcyBub3QgYWZmZWN0IHRoZSBsYWJlbCwKKwkgKiB0aGVuIHRoZSB2aWV3ZXIgbmVlZCBub3QgdXBkYXRlIHRoZSBsYWJlbC4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50CisJICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkLAorCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd291bGQgYmUgdW5hZmZlY3RlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4KKwkgKiBIYXMgbm8gYWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KKwkgKgorCSAqIEBwYXJhbSBsaXN0ZW5lciBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkvLyBkbyBub3RoaW5nCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0NhdGVnb3J5VGFibGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0NhdGVnb3J5VGFibGVWaWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWM3ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQ2F0ZWdvcnlUYWJsZVZpZXdlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQ2F0ZWdvcnlUYWJsZVZpZXdlciBleHRlbmRzIENoZWNrYm94VGFibGVWaWV3ZXIgeworCXByb3RlY3RlZCBDb2xvciBjb2xvcjsKKworCXB1YmxpYyBDYXRlZ29yeVRhYmxlVmlld2VyKFRhYmxlIHRhYmxlKSB7CisJCXN1cGVyKHRhYmxlKTsKKwkJY3JlYXRlQ29sb3IodGFibGUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbG9yKENvbnRyb2wgYykgeworCQljb2xvciA9IG5ldyBDb2xvcihjLmdldERpc3BsYXkoKSwgMjU1LCAyNTUsIDIyNSk7CisJCWMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCWNvbG9yLmRpc3Bvc2UoKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LCBib29sZWFuIGZ1bGxNYXApIHsKKwkJaWYgKGNvbG9yID09IG51bGwpCisJCQlyZXR1cm47CisJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKKwkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgd2lkZ2V0OworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlpdGVtLnNldEJhY2tncm91bmQoY29sb3IpOworCQkJfSBlbHNlCisJCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOworCQl9CisJCXN1cGVyLmRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGZ1bGxNYXApOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9JTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vSU1lbWVudG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE0OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vSU1lbWVudG8uamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKKy8qKgorICogSW50ZXJmYWNlIHRvIGEgbWVtZW50byB1c2VkIGZvciBzYXZpbmcgdGhlIGltcG9ydGFudCBzdGF0ZSBvZiBhbiBvYmplY3QKKyAqIGluIGEgZm9ybSB0aGF0IGNhbiBiZSBwZXJzaXN0ZWQgaW4gdGhlIGZpbGUgc3lzdGVtLgorICogPHA+CisgKiBNZW1lbnRvcyB3ZXJlIGRlc2lnbmVkIHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgaW4gbWluZDoKKyAqIDxvbD4KKyAqICA8bGk+Q2VydGFpbiBvYmplY3RzIG5lZWQgdG8gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBwbGF0Zm9ybSBzZXNzaW9ucy4KKyAqICAgIDwvbGk+CisgKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCBhbiBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1pZ2h0IG5vdAorICogICAgYmUgYXZhaWxhYmxlLiBJdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHNraXAgYW4gb2JqZWN0IGluIHRoaXMgY2FzZS48L2xpPgorICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciB0aGUgb2JqZWN0IG1heSBiZQorICogICAgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3aGVuIHRoZSBvYmplY3Qgd2FzIG9yaWdpbmFsbHkgc2F2ZWQuIElmIHNvLCB0aGUKKyAqICAgIG5ldyBjbGFzcyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgZm9ybSBvZiB0aGUgZGF0YS48L2xpPgorICogPC9vbD4KKyAqIDwvcD4KKyAqIDxwPgorICogTWVtZW50b3MgbWVldCB0aGVzZSByZXF1aXJlbWVudHMgYnkgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIHN0b3JpbmcgYQorICogbWFwcGluZyBvZiBhcmJpdHJhcnkgc3RyaW5nIGtleXMgdG8gcHJpbWl0aXZlIHZhbHVlcywgYW5kIGJ5IGFsbG93aW5nCisgKiBtZW1lbnRvcyB0byBoYXZlIG90aGVyIG1lbWVudG9zIGFzIGNoaWxkcmVuIChhcnJhbmdlZCBpbnRvIGEgdHJlZSkuCisgKiBBIHJvYnVzdCBleHRlcm5hbCBzdG9yYWdlIGZvcm1hdCBiYXNlZCBvbiBYTUwgaXMgdXNlZC4KKyAqIDwvcD48cD4KKyAqIFRoZSBrZXkgZm9yIGFuIGF0dHJpYnV0ZSBtYXkgYmUgYW55IGFscGhhIG51bWVyaWMgdmFsdWUuICBIb3dldmVyLCB0aGUKKyAqIHZhbHVlIG9mIDxjb2RlPlRBR19JRDwvY29kZT4gaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS4KKyAqIDwvcD48cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElNZW1lbnRvIHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNoaWxkIG9mIHRoaXMgbWVtZW50byB3aXRoIHRoZSBnaXZlbiB0eXBlLgorCSAqIDxwPgorCSAqIFRoZSA8Y29kZT5nZXRDaGlsZDwvY29kZT4gYW5kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBtZXRob2RzCisJICogYXJlIHVzZWQgdG8gcmV0cmlldmUgY2hpbGRyZW4gb2YgYSBnaXZlbiB0eXBlLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCisJICogQHJldHVybiBhIG5ldyBjaGlsZCBtZW1lbnRvCisJICogQHNlZSAjZ2V0Q2hpbGQKKwkgKiBAc2VlICNnZXRDaGlsZHJlbgorCSAqLworCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCB3aXRoIHRoZSBnaXZlbiB0eXBlIGlkLgorCSAqCisJICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgaWQKKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBjaGlsZCB3aXRoIHRoZSBnaXZlbiB0eXBlCisJICovCisJcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBjaGlsZHJlbiB3aXRoIHRoZSBnaXZlbiB0eXBlIGlkLgorCSAqCisJICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgaWQKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUKKwkgKi8KKwlwdWJsaWMgSU1lbWVudG9bXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KKwkgKgorCSAqIEBwYXJhbSBrZXkgdGhlIGtleQorCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCisJICogIGJ1dCB3YXMgbm90IGFuIGludGVnZXIKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KKwkgKgorCSAqIEBwYXJhbSBrZXkgdGhlIGtleQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9Tb3VuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vU291bmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTI5NDM4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vU291bmQuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworLyoqCisgKiBBIHNpbmdsZSBzb3VuZC4KKyAqLworY2xhc3MgU291bmQgeworCXByb3RlY3RlZCBTdHJpbmcgaWQ7CisJcHJvdGVjdGVkIFN0cmluZyBuYW1lOworCXB1YmxpYyBVUkwgbG9jYXRpb247CisJcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeTsKKworCS8qKgorCSAqIFNvdW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFNvdW5kKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFNvdW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICogCisJICogQHBhcmFtIGlkIGFuIGlkCisJICogQHBhcmFtIGNhdGVnb3J5IGEgY2F0ZWdvcnkKKwkgKiBAcGFyYW0gbmFtZSBhIG5hbWUKKwkgKiBAcGFyYW0gbG9jIGxvY2F0aW9uCisJICovCisJcHVibGljIFNvdW5kKFN0cmluZyBpZCwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbmFtZSwgVVJMIGxvYykgeworCQlzdXBlcigpOworCQorCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5sb2NhdGlvbiA9IGxvYzsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmF1ZGlvLkNhdGVnb3J5CisJICovCisJcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5OworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIGphdmEubmV0LlVSTAorCSAqLworCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb24oKSB7CisJCXJldHVybiBsb2NhdGlvbjsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBuZXdDYXRlZ29yeSBvcmcuZWNsaXBzZS5hdWRpby5DYXRlZ29yeQorCSAqLworCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBuZXdDYXRlZ29yeSkgeworCQljYXRlZ29yeSA9IG5ld0NhdGVnb3J5OworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBuZXdJZCBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7CisJCWlkID0gbmV3SWQ7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIG5ld0xvY2F0aW9uIGphdmEubmV0LlVSTAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFVSTCBuZXdMb2NhdGlvbikgeworCQlsb2NhdGlvbiA9IG5ld0xvY2F0aW9uOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBuZXdOYW1lIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCW5hbWUgPSBuZXdOYW1lOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9YTUxNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9YTUxNZW1lbnRvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwY2JhYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL1hNTE1lbWVudG8uamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworLyoqCisgKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCisgKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCisgKgorICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCisgKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKKyAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCisgKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAorICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KKyAqCisgKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKKyAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKKyAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgorICoKKyAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RlbmNlIHdpdGggYSB2ZXJzaW9uIElELgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKKwlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7CisJcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7CisKKwkvKioKKwkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQorCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCisJICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KKwkgKi8KKwlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7CisJCWZhY3RvcnkgPSBkb2M7CisJCWVsZW1lbnQgPSBlbDsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElNZW1lbnRvCisJICovCisJcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKSB7CisJCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7CisJCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOworCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIERvY3VtZW50IGZyb20gYSBSZWFkZXIgYW5kIGFuc3dlciBhIHJvb3QgbWVtZW50byBmb3IgcmVhZGluZyAKKwkgKiBhIGRvY3VtZW50LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVSZWFkUm9vdChSZWFkZXIgcmVhZGVyKSB7CisJCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKHJlYWRlcikpOworCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQorCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciB3cml0aW5nIGEgZG9jdW1lbnQuCisJICogCisJICogQHBhcmFtIHR5cGUgYSB0eXBlCisJICogQHJldHVybiBhIG1lbWVudG8KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFhNTE1lbWVudG8gY3JlYXRlV3JpdGVSb290KFN0cmluZyB0eXBlKSB7CisJCURvY3VtZW50IGRvY3VtZW50OworCQl0cnkgeworCQkJZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKKwkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7CisJCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKKwkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgZWxlbWVudCk7ICAgICAgICAgICAgCisJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEVycm9yKGUpOworCQl9CisJfQorCQorCS8qCisJICogQHNlZSBJTWVtZW50bworCSAqLworCXB1YmxpYyBJTWVtZW50byBnZXRDaGlsZChTdHJpbmcgdHlwZSkgeworCQkKKwkJLy8gR2V0IHRoZSBub2Rlcy4KKwkJTm9kZUxpc3Qgbm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKKwkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCXJldHVybiBudWxsOworCQorCQkvLyBGaW5kIHRoZSBmaXJzdCBub2RlIHdoaWNoIGlzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgorCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKKwkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisJCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7CisJCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQorCQkJCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgZWxlbWVudDIpOworCQkJfQorCQl9CisJCisJCS8vIEEgY2hpbGQgd2FzIG5vdCBmb3VuZC4KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qCisJICogQHNlZSBJTWVtZW50bworCSAqLworCXB1YmxpYyBJTWVtZW50byBbXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSkgeworCQorCQkvLyBHZXQgdGhlIG5vZGVzLgorCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOworCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOworCQlpZiAoc2l6ZSA9PSAwKQorCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKKwkKKwkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgorCQlMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KHNpemUpOworCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKKwkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisJCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7CisJCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQorCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7CisJCQl9CisJCX0KKwkKKwkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgorCQlzaXplID0gbGlzdC5zaXplKCk7CisJCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07CisJCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgeworCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGxpc3QuZ2V0KHgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0czsKKwl9CisKKwkvKgorCSAqIEBzZWUgSU1lbWVudG8KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOworCQlpZiAoYXR0ciA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7IAorCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOworCX0KKwkKKwkvKioKKwkgKiBMb2FkcyBhIG1lbWVudG8gZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUuCisJICoKKwkgKiBAcGFyYW0gaW4gamF2YS5pby5JbnB1dFN0cmVhbQorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudWkuSU1lbWVudG8KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElNZW1lbnRvIGxvYWRNZW1lbnRvKElucHV0U3RyZWFtIGluKSB7CisJCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UoaW4pOworCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQorCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWluLmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJTWVtZW50bworCSAqLworCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm47CisJCWVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpOworCX0KKworCS8qKgorCSAqIFNhdmUgdGhpcyBNZW1lbnRvIHRvIGEgV3JpdGVyLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7CisJCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOworCQl0cnkgeworCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAorCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAorCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7ICAgICAgICAgICAgCisJCX0KKwkJY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOworCQl9CisJCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2VydmVyQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3MzkzNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2VydmVyQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKKy8qKgorICogQSBjb21tYW5kIG9uIGEgc2VydmVyLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKKwlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjsKKworCS8qKgorCSAqIFNlcnZlckNvbW1hbmQgY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgorCSAqIEBwYXJhbSBuYW1lIGEgbGFiZWwKKwkgKi8KKwlwdWJsaWMgU2VydmVyQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJfQorCisJcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZSgpOworCisJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHQpIHsKKwkJZXhlY3V0ZSgpOworCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmRvKCk7CisKKwlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdCkgeworCQl1bmRvKCk7CisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KKworCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0KSB7CisJCXJldHVybiBleGVjdXRlKG1vbml0b3IsIGFkYXB0KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRQdWJsaXNoZXJFbmFibGVtZW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRQdWJsaXNoZXJFbmFibGVtZW50Q29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjU2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFB1Ymxpc2hlckVuYWJsZW1lbnRDb21tYW5kLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlB1Ymxpc2hlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKy8qKgorICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlcidzIHB1Ymxpc2hlciBzZXR0aW5nLgorICovCitwdWJsaWMgY2xhc3MgU2V0UHVibGlzaGVyRW5hYmxlbWVudENvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKKwlwcm90ZWN0ZWQgUHVibGlzaGVyIHB1YjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVkOworCXByb3RlY3RlZCBib29sZWFuIG9sZEVuYWJsZWQ7CisKKwkvKioKKwkgKiBTZXRQdWJsaXNoZXJFbmFibGVtZW50Q29tbWFuZCBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICogQHBhcmFtIHB1YiBhIHB1Ymxpc2hlcgorCSAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdGhlIHB1Ymxpc2hlciBzaG91bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorCSAqLworCXB1YmxpYyBTZXRQdWJsaXNoZXJFbmFibGVtZW50Q29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBQdWJsaXNoZXIgcHViLCBib29sZWFuIGVuYWJsZWQpIHsKKwkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hDb21tYW5kKTsKKwkJdGhpcy5wdWIgPSBwdWI7CisJCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CisJfQorCisJLyoqCisJICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKKwkJb2xkRW5hYmxlZCA9IHN3Yy5pc1B1Ymxpc2hlckVuYWJsZWQocHViKTsKKwkJc3djLnNldFB1Ymxpc2hlckVuYWJsZWQocHViLCBlbmFibGVkKTsKKwl9CisKKwkvKioKKwkgKiBVbmRvIHRoZSBjb21tYW5kLgorCSAqLworCXB1YmxpYyB2b2lkIHVuZG8oKSB7CisJCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOworCQlzd2Muc2V0UHVibGlzaGVyRW5hYmxlZChwdWIsIG9sZEVuYWJsZWQpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODkyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKy8qKgorICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlcidzIGF1dG8tcHVibGlzaCBzZXR0aW5nLgorICovCitwdWJsaWMgY2xhc3MgU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgeworCXByb3RlY3RlZCBpbnQgc2V0dGluZzsKKwlwcm90ZWN0ZWQgaW50IG9sZFNldHRpbmc7CisKKwkvKioKKwkgKiBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kIGNvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKiBAcGFyYW0gc2V0dGluZyB0aGUgYXV0by1wdWJsaXNoIHNldHRpbmcKKwkgKi8KKwlwdWJsaWMgU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBpbnQgc2V0dGluZykgeworCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaENvbW1hbmQpOworCQl0aGlzLnNldHRpbmcgPSBzZXR0aW5nOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKwkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7CisJCW9sZFNldHRpbmcgPSBzd2MuZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCk7CisJCXN3Yy5zZXRBdXRvUHVibGlzaFNldHRpbmcoc2V0dGluZyk7CisJfQorCisJLyoqCisJICogVW5kbyB0aGUgY29tbWFuZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmRvKCkgeworCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKKwkJc3djLnNldEF1dG9QdWJsaXNoU2V0dGluZyhvbGRTZXR0aW5nKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJBdXRvUHVibGlzaFRpbWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjk0OWY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJBdXRvUHVibGlzaFRpbWVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIncyBhdXRvLXB1Ymxpc2ggc2V0dGluZy4KKyAqLworcHVibGljIGNsYXNzIFNldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKKwlwcm90ZWN0ZWQgaW50IHRpbWU7CisJcHJvdGVjdGVkIGludCBvbGRUaW1lOworCisJLyoqCisJICogU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZCBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICogQHBhcmFtIHRpbWUgYSBwdWJsaXNoIHRpbWUKKwkgKi8KKwlwdWJsaWMgU2V0U2VydmVyQXV0b1B1Ymxpc2hUaW1lQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBpbnQgdGltZSkgeworCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaENvbW1hbmQpOworCQl0aGlzLnRpbWUgPSB0aW1lOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKwkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7CisJCW9sZFRpbWUgPSBzd2MuZ2V0QXV0b1B1Ymxpc2hUaW1lKCk7CisJCXN3Yy5zZXRBdXRvUHVibGlzaFRpbWUodGltZSk7CisJfQorCisJLyoqCisJICogVW5kbyB0aGUgY29tbWFuZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmRvKCkgeworCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKKwkJc3djLnNldEF1dG9QdWJsaXNoVGltZShvbGRUaW1lKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJDb25maWd1cmF0aW9uRm9sZGVyQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJDb25maWd1cmF0aW9uRm9sZGVyQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMWJiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckNvbmZpZ3VyYXRpb25Gb2xkZXJDb21tYW5kLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKy8qKgorICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZvbGRlci4KKyAqLworcHVibGljIGNsYXNzIFNldFNlcnZlckNvbmZpZ3VyYXRpb25Gb2xkZXJDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7CisJcHJvdGVjdGVkIElGb2xkZXIgZm9sZGVyOworCXByb3RlY3RlZCBJRm9sZGVyIG9sZEZvbGRlcjsKKworCS8qKgorCSAqIFNldFNlcnZlckNvbmZpZ3VyYXRpb25Gb2xkZXJDb21tYW5kIGNvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKiBAcGFyYW0gZm9sZGVyIGEgbmV3IHNlcnZlciBjb25maWd1cmF0aW9uIGxvY2F0aW9uCisJICovCisJcHVibGljIFNldFNlcnZlckNvbmZpZ3VyYXRpb25Gb2xkZXJDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIElGb2xkZXIgZm9sZGVyKSB7CisJCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQpOworCQl0aGlzLmZvbGRlciA9IGZvbGRlcjsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgorCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisJCW9sZEZvbGRlciA9IHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7CisJCXNlcnZlci5zZXRTZXJ2ZXJDb25maWd1cmF0aW9uKGZvbGRlcik7CisJfQorCisJLyoqCisJICogVW5kbyB0aGUgY29tbWFuZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmRvKCkgeworCQlzZXJ2ZXIuc2V0U2VydmVyQ29uZmlndXJhdGlvbihvbGRGb2xkZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckhvc3RuYW1lQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThiZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKy8qKgorICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBob3N0bmFtZS4KKyAqLworcHVibGljIGNsYXNzIFNldFNlcnZlckhvc3RuYW1lQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgeworCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIG9sZE5hbWU7CisKKwkvKioKKwkgKiBTZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQgY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgorCSAqIEBwYXJhbSBuYW1lIGEgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcworCSAqLworCXB1YmxpYyBTZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZCk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJLyoqCisJICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworCQlvbGROYW1lID0gc2VydmVyLmdldEhvc3QoKTsKKwkJc2VydmVyLnNldEhvc3QobmFtZSk7CisJfQorCisJLyoqCisJICogVW5kbyB0aGUgY29tbWFuZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmRvKCkgeworCQlzZXJ2ZXIuc2V0SG9zdChvbGROYW1lKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJOYW1lQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJOYW1lQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTQxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlck5hbWVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIgbmFtZS4KKyAqLworcHVibGljIGNsYXNzIFNldFNlcnZlck5hbWVDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7CisJcHJvdGVjdGVkIFN0cmluZyBuYW1lOworCXByb3RlY3RlZCBTdHJpbmcgb2xkTmFtZTsKKworCS8qKgorCSAqIFNldFNlcnZlck5hbWVDb21tYW5kIGNvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKiBAcGFyYW0gbmFtZSBhIG5hbWUgZm9yIHRoZSBzZXJ2ZXIKKwkgKi8KKwlwdWJsaWMgU2V0U2VydmVyTmFtZUNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWVDb21tYW5kKTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgorCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisJCW9sZE5hbWUgPSBzZXJ2ZXIuZ2V0TmFtZSgpOworCQlzZXJ2ZXIuc2V0TmFtZShuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBVbmRvIHRoZSBjb21tYW5kLgorCSAqLworCXB1YmxpYyB2b2lkIHVuZG8oKSB7CisJCXNlcnZlci5zZXROYW1lKG9sZE5hbWUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlclJ1bnRpbWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlclJ1bnRpbWVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjOWEwNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyUnVudGltZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIgcnVudGltZS4KKyAqLworcHVibGljIGNsYXNzIFNldFNlcnZlclJ1bnRpbWVDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7CisJcHJvdGVjdGVkIElSdW50aW1lIHJ1bnRpbWU7CisJcHJvdGVjdGVkIElSdW50aW1lIG9sZFJ1bnRpbWU7CisKKwkvKioKKwkgKiBTZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZCBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICogQHBhcmFtIHJ1bnRpbWUgYSBzZXJ2ZXIgcnVudGltZQorCSAqLworCXB1YmxpYyBTZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBJUnVudGltZSBydW50aW1lKSB7CisJCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lQ29tbWFuZCk7CisJCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7CisJfQorCisJLyoqCisJICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworCQlvbGRSdW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKKwkJc2VydmVyLnNldFJ1bnRpbWUocnVudGltZSk7CisJfQorCisJLyoqCisJICogVW5kbyB0aGUgY29tbWFuZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmRvKCkgeworCQlzZXJ2ZXIuc2V0UnVudGltZShvbGRSdW50aW1lKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJTdGFydFRpbWVvdXRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlclN0YXJ0VGltZW91dENvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y2ZDZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJTdGFydFRpbWVvdXRDb21tYW5kLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIncyBzdGFydCB0aW1lb3V0IHNldHRpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJTdGFydFRpbWVvdXRDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7CisJcHJvdGVjdGVkIGludCB0aW1lOworCXByb3RlY3RlZCBpbnQgb2xkVGltZTsKKworCS8qKgorCSAqIFNldFNlcnZlclN0YXJ0VGltZW91dENvbW1hbmQgY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgorCSAqIEBwYXJhbSB0aW1lIGEgcHVibGlzaCB0aW1lCisJICovCisJcHVibGljIFNldFNlcnZlclN0YXJ0VGltZW91dENvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgaW50IHRpbWUpIHsKKwkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXRDb21tYW5kKTsKKwkJdGhpcy50aW1lID0gdGltZTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgorCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisJCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOworCQlvbGRUaW1lID0gc3djLmdldFN0YXJ0VGltZW91dCgpOworCQlzd2Muc2V0U3RhcnRUaW1lb3V0KHRpbWUpOworCX0KKworCS8qKgorCSAqIFVuZG8gdGhlIGNvbW1hbmQuCisJICovCisJcHVibGljIHZvaWQgdW5kbygpIHsKKwkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7CisJCXN3Yy5zZXRTdGFydFRpbWVvdXQob2xkVGltZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyU3RvcFRpbWVvdXRDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjMTg1OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyU3RvcFRpbWVvdXRDb21tYW5kLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIncyBzdG9wIHRpbWVvdXQgc2V0dGluZy4KKyAqLworcHVibGljIGNsYXNzIFNldFNlcnZlclN0b3BUaW1lb3V0Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgeworCXByb3RlY3RlZCBpbnQgdGltZTsKKwlwcm90ZWN0ZWQgaW50IG9sZFRpbWU7CisKKwkvKioKKwkgKiBTZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQgY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgorCSAqIEBwYXJhbSB0aW1lIGEgcHVibGlzaCB0aW1lCisJICovCisJcHVibGljIFNldFNlcnZlclN0b3BUaW1lb3V0Q29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBpbnQgdGltZSkgeworCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dENvbW1hbmQpOworCQl0aGlzLnRpbWUgPSB0aW1lOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKwkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7CisJCW9sZFRpbWUgPSBzd2MuZ2V0U3RvcFRpbWVvdXQoKTsKKwkJc3djLnNldFN0b3BUaW1lb3V0KHRpbWUpOworCX0KKworCS8qKgorCSAqIFVuZG8gdGhlIGNvbW1hbmQuCisJICovCisJcHVibGljIHZvaWQgdW5kbygpIHsKKwkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7CisJCXN3Yy5zZXRTdG9wVGltZW91dChvbGRUaW1lKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvR2xvYmFsQ29tbWFuZE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9HbG9iYWxDb21tYW5kTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzNiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvR2xvYmFsQ29tbWFuZE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDczMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSVNlcnZlckVkaXRvclBhcnRJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBHbG9iYWxDb21tYW5kTWFuYWdlciB7CisJLy8gbWF4aW11bSBudW1iZXIgb2YgY29tbWFuZHMgaW4gdGhlIGhpc3RvcnkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hJU1RPUlkgPSAyMDA7CisKKwljbGFzcyBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgeworCQlJVW5kb2FibGVPcGVyYXRpb24gY29tbWFuZDsKKwkJU3RyaW5nIGlkOworCX0KKworCS8vIGNvbW1hbmRzIGluIHRoZSB1bmRvIGhpc3RvcnkKKwlwcm90ZWN0ZWQgTGlzdDxTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQ+IHVuZG9MaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQ+KCk7CisKKwkvLyBzaXplIG9mIHRoZSB1bmRvIHN0YWNrIG9uIGxhc3Qgc2F2ZQorCXByb3RlY3RlZCBpbnQgdW5kb1NhdmVJbmRleCA9IDA7CisKKwkvLyBjb21tYW5kcyBpbiB0aGUgcmVkbyBoaXN0b3J5CisJcHJvdGVjdGVkIExpc3Q8U2VydmVyUmVzb3VyY2VDb21tYW5kPiByZWRvTGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyUmVzb3VyY2VDb21tYW5kPigpOworCisJY2xhc3MgQ29tbWFuZE1hbmFnZXJJbmZvIHsKKwkJLy8gbnVtYmVyIG9mIG9wZW4gZWRpdG9ycyBvbiB0aGlzIHJlc291cmNlCisJCWludCBjb3VudDsKKwkJCisJCS8vIHRydWUgaWYgdGhlIHJlc291cmNlIGhhcyBub3QgYmVlbiBzYXZlZCBzaW5jZQorCQkvLyB0aGUgbGFzdCBjaGFuZ2UKKwkJYm9vbGVhbiBpc0RpcnR5OworCQkKKwkJLy8gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaXMgcmVhZC1vbmx5CisJCWJvb2xlYW4gaXNSZWFkT25seTsKKwkJCisJCS8vIHRoZSBlbGVtZW50IGlkCisJCVN0cmluZyBpZDsKKwkJCisJCS8vIHRoZSB3b3JraW5nIGNvcHkKKwkJSVNlcnZlcldvcmtpbmdDb3B5IHdjOworCQkKKwkJLy8gZmlsZXMgYW5kIHRpbWVzdGFtcHMKKwkJTWFwPElGaWxlLCBMb25nPiBmaWxlTWFwOworCQkKKwkJaW50IHRpbWVzdGFtcDsKKwl9CisKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgQ29tbWFuZE1hbmFnZXJJbmZvPiBjb21tYW5kTWFuYWdlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbW1hbmRNYW5hZ2VySW5mbz4oKTsKKworCS8vIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMKKwlwcm90ZWN0ZWQgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBwcm9wZXJ0eUxpc3RlbmVyczsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RJUlRZID0gImRpcnR5U3RhdGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVU5ETyA9ICJ1bmRvQWN0aW9uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JFRE8gPSAicmVkb0FjdGlvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9SRUxPQUQgPSAicmVsb2FkIjsKKworCXByb3RlY3RlZCBzdGF0aWMgR2xvYmFsQ29tbWFuZE1hbmFnZXIgaW5zdGFuY2U7CisKKwlwdWJsaWMgc3RhdGljIEdsb2JhbENvbW1hbmRNYW5hZ2VyIGdldEluc3RhbmNlKCkgeworCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKKwkJCWluc3RhbmNlID0gbmV3IEdsb2JhbENvbW1hbmRNYW5hZ2VyKCk7CisJCXJldHVybiBpbnN0YW5jZTsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSBsaXN0ZW5lciBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJaWYgKHByb3BlcnR5TGlzdGVuZXJzID09IG51bGwpCisJCQlwcm9wZXJ0eUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4oKTsKKwkJcHJvcGVydHlMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIGluc3RhbmNlLgorCSAqCisJICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgIT0gbnVsbCkKKwkJCXByb3BlcnR5TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogRmlyZSBhIHByb3BlcnR5IGNoYW5nZSBldmVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCQkvL1RyYWNlLnRyYWNlKCJGaXJpbmc6ICIgKyBldmVudCArICIgIiArIG9sZFZhbHVlKTsKKwkJdHJ5IHsKKwkJCWludCBzaXplID0gcHJvcGVydHlMaXN0ZW5lcnMuc2l6ZSgpOworCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIHBjbCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW3NpemVdOworCQkJcHJvcGVydHlMaXN0ZW5lcnMudG9BcnJheShwY2wpOworCQkJCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQl0cnkgeworCQkJCQlwY2xbaV0ucHJvcGVydHlDaGFuZ2UoZXZlbnQpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJfQorCisJLyoqCisJICogR2V0IHRoZSBjb21tYW5kIG1hbmFnZXIgZm9yIGEgZ2l2ZW4gaWQuCisJICogCisJICogQHBhcmFtIGlkIGFuIGlkCisJICovCisJcHVibGljIHZvaWQgZ2V0Q29tbWFuZE1hbmFnZXIoU3RyaW5nIGlkKSB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkdldHRpbmcgY29tbWFuZCBtYW5hZ2VyIGZvciAiICsgaWQpOworCQl0cnkgeworCQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBjb21tYW5kTWFuYWdlcnMuZ2V0KGlkKTsKKwkJCWlmIChpbmZvICE9IG51bGwpIHsKKwkJCQlpbmZvLmNvdW50ICsrOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZmluZCBleGlzdGluZyBjb21tYW5kIG1hbmFnZXIiLCBlKTsKKwkJfQorCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJDcmVhdGluZyBuZXcgY29tbWFuZCBtYW5hZ2VyIGZvciAiICsgaWQpOworCQl0cnkgeworCQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBuZXcgQ29tbWFuZE1hbmFnZXJJbmZvKCk7CisJCQlpbmZvLmNvdW50ID0gMTsKKwkJCWluZm8uaWQgPSBpZDsKKwkJCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKKwkJCWlmIChpZCAhPSBudWxsKQorCQkJCXNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihpZCk7CisJCQlpZiAoc2VydmVyICE9IG51bGwpCisJCQkJaW5mby53YyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOworCQkJaW5mby5pc0RpcnR5ID0gZmFsc2U7CisJCQlpbmZvLmlzUmVhZE9ubHkgPSBmYWxzZTsKKwkJCWNvbW1hbmRNYW5hZ2Vycy5wdXQoaWQsIGluZm8pOworCQkJdXBkYXRlVGltZXN0YW1wcyhpZCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgb2J0YWluIGNvbW1hbmQgbWFuYWdlciIsIGUpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKioKKwkgKiBSZWxlYXNlIHRoZSBjb21tYW5kIG1hbmFnZXIgZm9yIGEgZ2l2ZW4gaWQuCisJICogCisJICogQHBhcmFtIGlkIGFuIGlkCisJICovCisJcHVibGljIHZvaWQgcmVsZWFzZUNvbW1hbmRNYW5hZ2VyKFN0cmluZyBpZCkgeworCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJSZWxlYXNpbmcgY29tbWFuZCBtYW5hZ2VyIGZvciAiICsgaWQpOworCQl0cnkgeworCQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBjb21tYW5kTWFuYWdlcnMuZ2V0KGlkKTsKKwkJCWlmIChpbmZvICE9IG51bGwpIHsKKwkJCQlpbmZvLmNvdW50IC0tOworCQkJCWlmIChpbmZvLmNvdW50ID09IDApIHsKKwkJCQkJY29tbWFuZE1hbmFnZXJzLnJlbW92ZShpZCk7CisJCQkJCWNsZWFyVW5kb0xpc3QoaWQpOworCQkJCQljbGVhclJlZG9MaXN0KGlkKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgcmVsZWFzZSBjb21tYW5kIG1hbmFnZXIiLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbG9hZCB0aGUgY29tbWFuZCBtYW5hZ2VyIGZvciBhIGdpdmVuIGlkLgorCSAqIAorCSAqIEBwYXJhbSBpZCBhbiBpZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbG9hZChTdHJpbmcgaWQpIHsKKwkJdHJ5IHsKKwkJCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOworCQkJaWYgKGluZm8gIT0gbnVsbCkgeworCQkJCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKKwkJCQlpZiAoaWQgIT0gbnVsbCkKKwkJCQkJc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGlkKTsKKwkJCQlpZiAoc2VydmVyICE9IG51bGwpCisJCQkJCWluZm8ud2MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKKwkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1JFTE9BRCwgaWQsIG51bGwpOworCQkJfQorCQkJY2xlYXJVbmRvTGlzdChpZCk7CisJCQljbGVhclJlZG9MaXN0KGlkKTsKKwkJCXVuZG9TYXZlSW5kZXggPSB1bmRvTGlzdC5zaXplKCk7CisJCQlzZXREaXJ0eVN0YXRlKGlkLCBmYWxzZSk7CisJCQl1cGRhdGVUaW1lc3RhbXBzKGlkKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCByZWxlYXNlIGNvbW1hbmQgbWFuYWdlciIsIGUpOworCQl9CisJfQorCisJLyoqCisJICogCisJICovCisJcHJvdGVjdGVkIENvbW1hbmRNYW5hZ2VySW5mbyBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhTdHJpbmcgaWQpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBjb21tYW5kTWFuYWdlcnMuZ2V0KGlkKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBmaW5kIGV4aXN0aW5nIGNvbW1hbmQgbWFuYWdlciBpbmZvIik7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNvbW1hbmQgbWFuYWdlci4KKwkgKiAKKwkgKiBAcGFyYW0gaWQgYW4gaWQKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvbmx5IGNvbW1hbmQgbWFuYWdlcgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzT25seUNvbW1hbmRNYW5hZ2VyKFN0cmluZyBpZCkgeworCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKKwkJcmV0dXJuIChpbmZvICE9IG51bGwgJiYgaW5mby5jb3VudCA9PSAxKTsKKwl9CisJCisJcHJvdGVjdGVkIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgZ2V0UGFydElucHV0KFN0cmluZyBzZXJ2ZXJJZCwgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBzZXJ2ZXJDb21tYW5kTWFuYWdlcikgeworCQlDb21tYW5kTWFuYWdlckluZm8gc2VydmVySW5mbyA9IG51bGw7CisJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBudWxsOworCQlib29sZWFuIHNlcnZlclJlYWRPbmx5ID0gZmFsc2U7CisJCWlmIChzZXJ2ZXJJZCAhPSBudWxsKSB7CisJCQlzZXJ2ZXJJbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oc2VydmVySWQpOworCQkJaWYgKHNlcnZlckluZm8gPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCQorCQkJc2VydmVyID0gc2VydmVySW5mby53YzsKKwkJCXNlcnZlclJlYWRPbmx5ID0gc2VydmVySW5mby5pc1JlYWRPbmx5OworCQl9CisKKwkJcmV0dXJuIG5ldyBTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQoc2VydmVyQ29tbWFuZE1hbmFnZXIsIHNlcnZlciwgc2VydmVyUmVhZE9ubHkpOworCX0KKwkKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlclJlc291cmNlKFN0cmluZyBpZCkgeworCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKKwkJaWYgKGluZm8gPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkJCisJCXJldHVybiBpbmZvLndjOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgY3VycmVudGx5IGFjdGl2ZSBzaGVsbC4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgc2hlbGwKKwkgKi8KKwlwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgeworCQl0cnkgeworCQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7CisJCQlpZiAoZCA9PSBudWxsKQorCQkJCWQgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKKwkJCQorCQkJcmV0dXJuIGQuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgc2hlbGwiLCBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogRXhlY3V0ZSB0aGUgZ2l2ZW4gY29tbWFuZCBhbmQgcGxhY2UgaXQgaW4gdGhlIHVuZG8gc3RhY2suCisJICogSWYgdGhlIGNvbW1hbmQgY2Fubm90IGJlIHVuZG9uZSwgdGhlIHVzZXIgd2lsbCBiZSBub3RpZmllZAorCSAqIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KKwkgKgorCSAqIEBwYXJhbSBpZCBhbiBpZAorCSAqIEBwYXJhbSBjb21tYW5kIGEgdGFzaworCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGVDb21tYW5kKFN0cmluZyBpZCwgSVVuZG9hYmxlT3BlcmF0aW9uIGNvbW1hbmQpIHsKKwkJZmluYWwgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOworCQkKKwkJaWYgKCFjb21tYW5kLmNhblVuZG8oKSAmJiAhdW5kb0xpc3QuaXNFbXB0eSgpKSB7CisJCQl0cnkgeworCQkJCWlmICghTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgTWVzc2FnZXMuZWRpdG9yU2VydmVyRWRpdG9yLCBNZXNzYWdlcy5lZGl0b3JQcm9tcHRJcnJldmVyc2libGUpKQorCQkJCQlyZXR1cm47CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJCQorCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjID0gbmV3IFNlcnZlclJlc291cmNlQ29tbWFuZCgpOworCQlzcmMuaWQgPSBpZDsKKwkJc3JjLmNvbW1hbmQgPSBjb21tYW5kOworCQkKKwkJdHJ5IHsKKwkJCUlBZGFwdGFibGUgYWRhcHRhYmxlID0gbmV3IElBZGFwdGFibGUoKSB7CisJCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKKwkJCQkJaWYgKFNoZWxsLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKKwkJCQkJCXJldHVybiBzaGVsbDsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfTsKKwkJCUlTdGF0dXMgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGFkYXB0YWJsZSk7CisJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCisJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmVkaXRvclNlcnZlckVkaXRvciwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBjZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZXhlY3V0aW5nIGNvbW1hbmQiLCBjZSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOworCQlpZiAoaW5mbyA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJaWYgKGNvbW1hbmQuY2FuVW5kbygpKQorCQkJYWRkVG9VbmRvTGlzdChzcmMpOworCQllbHNlIHsKKwkJCXVuZG9TYXZlSW5kZXggPSAtMTsKKwkJCWNsZWFyVW5kb0xpc3QoaWQpOworCQl9CisJCQorCQkvLyBjbGVhciByZWRvIGxpc3Qgc2luY2UgYSBuZXcgY29tbWFuZCBoYXMgYmVlbiBleGVjdXRlZC4KKwkJY2xlYXJSZWRvTGlzdChpZCk7CisJCQorCQlzZXREaXJ0eVN0YXRlKGlkLCB0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBjb21tYW5kIHRvIHRoZSBoaXN0b3J5LgorCSAqLworCXByaXZhdGUgdm9pZCBhZGRUb1VuZG9MaXN0KFNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMpIHsKKwkJdW5kb0xpc3QuYWRkKHNyYyk7CisKKwkJLy8gbGltaXQgaGlzdG9yeSBncm93dGgKKwkJaWYgKHVuZG9MaXN0LnNpemUoKSA+IE1BWF9ISVNUT1JZKQorCQkJdW5kb0xpc3QucmVtb3ZlKDApOworCisJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfVU5ETywgc3JjLmlkLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBDbGVhcnMgdGhlIHVuZG8gb2YgYSBwYXJ0aWN1bGFyIHJlc291cmNlLgorCSAqLworCXByaXZhdGUgdm9pZCBjbGVhclVuZG9MaXN0KFN0cmluZyBpZCkgeworCQlpbnQgaSA9IDA7CisJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKKwkJd2hpbGUgKGkgPCB1bmRvTGlzdC5zaXplKCkpIHsKKwkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSB1bmRvTGlzdC5nZXQoaSk7CisJCQlpZiAoc3JjLmlkLmVxdWFscyhpZCkpIHsKKwkJCQltb2RpZmllZCA9IHRydWU7CisJCQkJdW5kb0xpc3QucmVtb3ZlKGkpOworCQkJfSBlbHNlCisJCQkJaSsrOworCQl9CisJCWlmIChtb2RpZmllZCkKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfVU5ETywgaWQsIG51bGwpOworCX0KKworCS8qKgorCSAqIENsZWFycyB0aGUgcmVkbyBvZiBhIHBhcnRpY3VsYXIgcmVzb3VyY2UuCisJICovCisJcHJpdmF0ZSB2b2lkIGNsZWFyUmVkb0xpc3QoU3RyaW5nIGlkKSB7CisJCWludCBpID0gMDsKKwkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOworCQl3aGlsZSAoaSA8IHJlZG9MaXN0LnNpemUoKSkgeworCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IHJlZG9MaXN0LmdldChpKTsKKwkJCWlmIChzcmMuaWQuZXF1YWxzKGlkKSkgeworCQkJCXJlZG9MaXN0LnJlbW92ZShpKTsKKwkJCQltb2RpZmllZCA9IHRydWU7CisJCQl9IGVsc2UKKwkJCQlpKys7CisJCX0KKwkJaWYgKG1vZGlmaWVkKQorCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9SRURPLCBpZCwgbnVsbCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgY29tbWFuZCB0aGF0IGNhbiBiZSB1bmRvbmUuCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FuVW5kbyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSB1bmRvTGlzdC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjID0gKFNlcnZlclJlc291cmNlQ29tbWFuZCkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKHNyYy5pZCA9PSBhIHx8IHNyYy5pZCA9PSBiKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgY29tbWFuZCB0aGF0IGNhbiBiZSByZWRvbmUuCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVkbyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSByZWRvTGlzdC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjID0gKFNlcnZlclJlc291cmNlQ29tbWFuZCkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKHNyYy5pZCA9PSBhIHx8IHNyYy5pZCA9PSBiKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgY29tbWFuZCB0aGF0IHdvdWxkIGJlIHVuZG9uZSBuZXh0LgorCSAqIAorCSAqIEBwYXJhbSBhIGFuIGlkCisJICogQHJldHVybiBhIHRhc2sKKwkgKi8KKwlwdWJsaWMgSVVuZG9hYmxlT3BlcmF0aW9uIGdldFVuZG9Db21tYW5kKFN0cmluZyBhKSB7CisJCWludCBzaXplID0gdW5kb0xpc3Quc2l6ZSgpOworCQlmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjID0gdW5kb0xpc3QuZ2V0KGkpOworCQkJaWYgKHNyYy5pZCA9PSBhKQorCQkJCXJldHVybiBzcmMuY29tbWFuZDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgd291bGQgYmUgcmVkb25lIG5leHQuCisJICogCisJICogQHBhcmFtIGEgYW4gaWQKKwkgKiBAcmV0dXJuIGEgdGFzaworCSAqLworCXB1YmxpYyBJVW5kb2FibGVPcGVyYXRpb24gZ2V0UmVkb0NvbW1hbmQoU3RyaW5nIGEpIHsKKwkJaW50IHNpemUgPSByZWRvTGlzdC5zaXplKCk7CisJCWZvciAoaW50IGkgPSBzaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSByZWRvTGlzdC5nZXQoaSk7CisJCQlpZiAoc3JjLmlkID09IGEpCisJCQkJcmV0dXJuIHNyYy5jb21tYW5kOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIHJlc291cmNlIGlzICJkaXJ0eSIuCisJICoKKwkgKiBAcGFyYW0gaWQgYW4gaWQKKwkgKiBAcmV0dXJuIGEgdGFzaworCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGlydHkoU3RyaW5nIGlkKSB7CisJCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOworCQlpZiAoaW5mbyA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJcmV0dXJuIGluZm8uaXNEaXJ0eTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgcmVzb3VyY2UgaXMgcmVhZC1vbmx5LgorCSAqCisJICogQHBhcmFtIGlkIGFuIGlkCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShTdHJpbmcgaWQpIHsKKwkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7CisJCWlmIChpbmZvID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBpbmZvLmlzUmVhZE9ubHk7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIHNlcnZlciByZXNvdXJjZSByZWFkLW9ubHkgZmxhZy4KKwkgKiAKKwkgKiBAcGFyYW0gaWQgYW4gaWQKKwkgKiBAcGFyYW0gcmVhZE9ubHkgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2V0IHJlYWQtb25seSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KFN0cmluZyBpZCwgYm9vbGVhbiByZWFkT25seSkgeworCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKKwkJaWYgKGluZm8gPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWlmIChpbmZvLmlzUmVhZE9ubHkgPT0gcmVhZE9ubHkpCisJCQlyZXR1cm47CisJCWluZm8uaXNSZWFkT25seSA9IHJlYWRPbmx5OworCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1JFTE9BRCwgaWQsIG51bGwpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIHJlc291cmNlIGZpbGVzIGFyZSByZWFkLW9ubHkuCisJICoKKwkgKiBAcGFyYW0gaWQgYW4gaWQKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlcyBhcmUgcmVhZC1vbmx5CisJICovCisJcHVibGljIGJvb2xlYW4gYXJlRmlsZXNSZWFkT25seShTdHJpbmcgaWQpIHsKKwkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7CisJCWlmIChpbmZvID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiAoZ2V0UmVhZE9ubHlGaWxlcyhpZCkubGVuZ3RoID4gMCk7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGRpcnR5IHN0YXRlIGFuZCBmaXJlcyBhbiBldmVudCBpZiBuZWVkZWQuCisJICogQHBhcmFtIGRpcnR5IGJvb2xlYW4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0RGlydHlTdGF0ZShTdHJpbmcgaWQsIGJvb2xlYW4gZGlydHkpIHsKKwkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7CisJCWlmIChpbmZvLmlzRGlydHkgPT0gZGlydHkpCisJCQlyZXR1cm47CisJCQorCQlpbmZvLmlzRGlydHkgPSBkaXJ0eTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9ESVJUWSwgaWQsIG51bGwpOworCX0KKworCS8qKgorCSAqIFVuZG8gdGhlIGxhc3QgY29tbWFuZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1bmRvKFN0cmluZyBhKSB7CisJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSBudWxsOworCQlJdGVyYXRvciBpdGVyYXRvciA9IHVuZG9MaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMyID0gKFNlcnZlclJlc291cmNlQ29tbWFuZCkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKHNyYzIuaWQgPT0gYSkKKwkJCQlzcmMgPSBzcmMyOworCQl9CisJCWlmIChzcmMgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCXRyeSB7CisJCQlzcmMuY29tbWFuZC51bmRvKG51bGwsIG51bGwpOworCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKKwkJCS8vIGRvIHNvbWV0aGluZworCQl9CisJCQorCQl1bmRvTGlzdC5yZW1vdmUoc3JjKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9VTkRPLCBzcmMuaWQsIG51bGwpOworCQlyZWRvTGlzdC5hZGQoc3JjKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9SRURPLCBzcmMuaWQsIG51bGwpOworCQkKKwkJaWYgKHVuZG9TYXZlSW5kZXggPT0gdW5kb0xpc3Quc2l6ZSgpKQorCQkJc2V0RGlydHlTdGF0ZShzcmMuaWQsIGZhbHNlKTsKKwkJZWxzZQorCQkJc2V0RGlydHlTdGF0ZShzcmMuaWQsIHRydWUpOworCX0KKworCS8qKgorCSAqIFJlZG8gdGhlIGxhc3QgY29tbWFuZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZWRvKFN0cmluZyBhKSB7CisJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSBudWxsOworCQlJdGVyYXRvciBpdGVyYXRvciA9IHJlZG9MaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMyID0gKFNlcnZlclJlc291cmNlQ29tbWFuZCkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKHNyYzIuaWQgPT0gYSkKKwkJCQlzcmMgPSBzcmMyOworCQl9CisJCWlmIChzcmMgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQl0cnkgeworCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOworCQkJSUFkYXB0YWJsZSBhZGFwdGFibGUgPSBuZXcgSUFkYXB0YWJsZSgpIHsKKwkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQorCQkJCQkJcmV0dXJuIHNoZWxsOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9OworCQkJSVN0YXR1cyBzdGF0dXMgPSBzcmMuY29tbWFuZC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGFkYXB0YWJsZSk7CisJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCisJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmVkaXRvclNlcnZlckVkaXRvciwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBjZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZXhlY3V0aW5nIGNvbW1hbmQiLCBjZSk7CisJCQlyZXR1cm47CisJCX0KKwkJcmVkb0xpc3QucmVtb3ZlKHNyYyk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfUkVETywgc3JjLmlkLCBudWxsKTsKKwkJdW5kb0xpc3QuYWRkKHNyYyk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfVU5ETywgc3JjLmlkLCBudWxsKTsKKwkJCisJCWlmICh1bmRvU2F2ZUluZGV4ID09IHVuZG9MaXN0LnNpemUoKSkKKwkJCXNldERpcnR5U3RhdGUoc3JjLmlkLCBmYWxzZSk7CisJCWVsc2UKKwkJCXNldERpcnR5U3RhdGUoc3JjLmlkLCB0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBDbGVhcnMgdGhlIGhpc3RvcnkgbGlzdC4KKwkgKiAKKwkgKiBAcGFyYW0gaWQgYW4gaWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNvdXJjZVNhdmVkKFN0cmluZyBpZCkgeworCQl1bmRvU2F2ZUluZGV4ID0gdW5kb0xpc3Quc2l6ZSgpOworCQlzZXREaXJ0eVN0YXRlKGlkLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIGFuIGFycmF5IG9mIHJlYWQtb25seSBmaWxlcy4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGZpbGVzCisJICovCisJcHVibGljIHN0YXRpYyBJRmlsZVtdIGdldFJlYWRPbmx5RmlsZXMoSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyKSB7CisJCXRyeSB7CisJCQlMaXN0PElGaWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsKKwkJCUlGaWxlIGZpbGUgPSAoKFNlcnZlcilzZXJ2ZXIpLmdldEZpbGUoKTsKKwkJCQorCQkJaWYgKGZpbGUgIT0gbnVsbCkKKwkJCQlsaXN0LmFkZChmaWxlKTsKKwkJCQorCQkJSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVtsaXN0LnNpemUoKV07CisJCQlsaXN0LnRvQXJyYXkoZmlsZXMpOworCQkJcmV0dXJuIGZpbGVzOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiZ2V0UmVhZE9ubHlGaWxlcyIsIGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCBJRmlsZVtdIGdldFNlcnZlclJlc291cmNlRmlsZXMoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBJRmlsZVswXTsKKwkJCisJCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOworCQlpZiAoaW5mbyA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBJRmlsZVswXTsKKwkJCisJCXJldHVybiBnZXRSZWFkT25seUZpbGVzKGluZm8ud2MpOworCX0KKworCXByb3RlY3RlZCBJRmlsZVtdIGdldFJlYWRPbmx5RmlsZXMoU3RyaW5nIGlkKSB7CisJCUxpc3Q8SUZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOworCQlJRmlsZVtdIGZpbGVzID0gZ2V0U2VydmVyUmVzb3VyY2VGaWxlcyhpZCk7CisJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJaWYgKGZpbGVzW2ldLmlzUmVhZE9ubHkoKSkKKwkJCQlsaXN0LmFkZChmaWxlc1tpXSk7CisJCX0KKwkJCisJCUlGaWxlW10gZmlsZUxpc3QgPSBuZXcgSUZpbGVbbGlzdC5zaXplKCldOworCQlsaXN0LnRvQXJyYXkoZmlsZUxpc3QpOworCQlyZXR1cm4gZmlsZUxpc3Q7CisJfQorCisJLyoqCisJICogVXBkYXRlIHRoZSB0aW1lc3RhbXBzLgorCSAqIAorCSAqIEBwYXJhbSBpZCBhbiBpZAorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZVRpbWVzdGFtcHMoU3RyaW5nIGlkKSB7CisJCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOworCQlpZiAoaW5mbyA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJaW5mby5maWxlTWFwID0gbmV3IEhhc2hNYXA8SUZpbGUsIExvbmc+KCk7CisJCUlGaWxlW10gZmlsZXMgPSBnZXRTZXJ2ZXJSZXNvdXJjZUZpbGVzKGlkKTsKKwkJaWYgKGZpbGVzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOworCQkJCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWlmIChmaWxlc1tpXSAhPSBudWxsKSB7CisJCQkJCUZpbGUgZiA9IGZpbGVzW2ldLmdldExvY2F0aW9uKCkudG9GaWxlKCk7CisJCQkJCWlmIChmICE9IG51bGwpIHsKKwkJCQkJCWxvbmcgdGltZSA9IGYubGFzdE1vZGlmaWVkKCk7CisJCQkJCQlpbmZvLmZpbGVNYXAucHV0KGZpbGVzW2ldLCBuZXcgTG9uZyh0aW1lKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaW5mby50aW1lc3RhbXAgPSBnZXRUaW1lc3RhbXAoaW5mbyk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0VGltZXN0YW1wKENvbW1hbmRNYW5hZ2VySW5mbyBpbmZvKSB7CisJCUlTZXJ2ZXIgc2VydmVyID0gaW5mby53Yy5nZXRPcmlnaW5hbCgpOworCQkKKwkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJcmV0dXJuICgoU2VydmVyKXNlcnZlcikuZ2V0VGltZXN0YW1wKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNDaGFuZ2VkKFN0cmluZyBpZCkgeworCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKKwkJaWYgKGluZm8gPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJSUZpbGVbXSBmaWxlcyA9IGdldFNlcnZlclJlc291cmNlRmlsZXMoaWQpOworCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKKwkJCisJCWludCBjb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQljb3VudCsrOworCQkJRmlsZSBmID0gZmlsZXNbaV0uZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKKwkJCXRyeSB7CisJCQkJTG9uZyB0aW1lID0gaW5mby5maWxlTWFwLmdldChmaWxlc1tpXSk7CisJCQkJaWYgKHRpbWUubG9uZ1ZhbHVlKCkgIT0gZi5sYXN0TW9kaWZpZWQoKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCQorCQlpbnQgdGltZXN0YW1wID0gZ2V0VGltZXN0YW1wKGluZm8pOworCQlpZiAoaW5mby50aW1lc3RhbXAgIT0gdGltZXN0YW1wKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlpZiAoY291bnQgIT0gaW5mby5maWxlTWFwLnNpemUoKSkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JT3JkZXJlZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lPcmRlcmVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3MmY4YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JT3JkZXJlZC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7CisvKioKKyAqIEFuIG9iamVjdCB0aGF0IGhhcyBhbiBhYnNvbHV0ZSBvcmRlcmluZywgYW5kIGNhbiBiZSBvcmRlcmVkIGFnYWluc3Qgb3RoZXIgb2JqZWN0cy4KKyAqIAorICogPHA+CisgKiBbaXNzdWU6IEl0IGlzIG5vdG9yaW91c2x5IGRpZmZpY3VsdCB0byBwbGFjZSBhbnkga2luZCBvZgorICogdXNlZnVsIG9yZGVyIG9uIG9iamVjdHMgdGhhdCBhcmUgY29udHJpYnV0ZWQgaW5kZXBlbmRlbnRseSBieQorICogbm9uLWNvbGxhYm9yYXRpbmcgcGFydGllcy4gVGhlIElPcmRlcmVkIG1lY2hhbmlzbSBpcyB3ZWFrLCBhbmQKKyAqIGNhbid0IHJlYWxseSBzb2x2ZSB0aGUgcHJvYmxlbS4gSXNzdWVzIG9mIHByZXNlbnRhdGlvbiBhcmUgdXN1YWxseQorICogYmVzdCBsZWZ0IHRvIHRoZSBVSSwgd2hpY2ggY2FuIHNvcnQgb2JqZWN0cyBiYXNlZCBvbiBhcmJpdHJhcnkKKyAqIHByb3BlcnRpZXMuXQorICogPC9wPgorICogCisgKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSU9yZGVyZWQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIG9yZGVyIChpbmRleC9wcmlvcml0eSkuCisJICogCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldE9yZGVyKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTc5MWVjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JU2VydmVyRWRpdG9yUGFydElucHV0OworLyoqCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5IGV4dGVuZHMgSU9yZGVyZWQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIGlkLgorCSAqIAorCSAqIEByZXR1cm4gYW4gaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lLgorCSAqIAorCSAqIEByZXR1cm4gYSBuYW1lCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciByZXNvdXJjZSB0eXBlIChnaXZlbiBieSB0aGUKKwkgKiBpZCkgY2FuIGJlIG9wZW5lZCB3aXRoIHRoaXMgZWRpdG9yLiBUaGlzIHJlc3VsdCBpcyBiYXNlZCBvbgorCSAqIHRoZSByZXN1bHQgb2YgdGhlIGdldEZhY3RvcnlJZHMoKSBtZXRob2QuCisJICoKKwkgKiBAcGFyYW0gaWQgYW4gaWQKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcnZlckVsZW1lbnRUeXBlKFN0cmluZyBpZCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlZGl0b3IgcGFnZSBzaG91bGQgYmUgdmlzaWJsZSB3aXRoIHRoZSBnaXZlbiBzZXJ2ZXIuCisJICogVGhpcyBhbGxvd3MgKGZvciBpbnN0YW5jZSkgY29tcGxleCBjb25maWd1cmF0aW9uIHBhZ2VzIHRvIG9ubHkgYmUgc2hvd24gd2hlbiB1c2VkCisJICogd2l0aCBub24tdW5pdHRlc3Qgc2VydmVycy4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYWN0aW9uIHNob3VsZCBkaXNwbGF5CisJICovCisJcHVibGljIGJvb2xlYW4gc2hvdWxkRGlzcGxheShJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKTsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgYWN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBzaXRlIGFuIGVkaXRvciBzaXRlCisJICogQHBhcmFtIGlucHV0IGEgc2VydmVyIGVkaXRvciBpbnB1dAorCSAqIEByZXR1cm4gYW4gYWN0aW9uCisJICovCisJcHVibGljIElBY3Rpb24gY3JlYXRlQWN0aW9uKElFZGl0b3JTaXRlIHNpdGUsIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgaW5wdXQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9ySW5wdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9ySW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWVjOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKKy8qKgorICogVGhpcyBpcyB0aGUgZWRpdG9yIGlucHV0IGZvciB0aGUgc2VydmVyIGFuZCBzZXJ2ZXIKKyAqIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiBUaGUgaW5wdXQgaW5jbHVkZXMgYm90aCBhIHNlcnZlcgorICogYW5kIHNlcnZlciBjb25maWd1cmF0aW9uLgorICoKKyAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJU2VydmVyRWRpdG9ySW5wdXQgZXh0ZW5kcyBJRWRpdG9ySW5wdXQgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuZWRpdG9yIjsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNlcnZlciBpZC4KKwkgKgorCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySWQoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzQzODUzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JTZWN0aW9uOworLyoqCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkgZXh0ZW5kcyBJT3JkZXJlZCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgaWQuCisJICogCisJICogQHJldHVybiB0aGUgaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciByZXNvdXJjZSB0eXBlIChnaXZlbiBieSB0aGUKKwkgKiBpZCkgY2FuIGJlIG9wZW5lZCB3aXRoIHRoaXMgZWRpdG9yLiBUaGlzIHJlc3VsdCBpcyBiYXNlZCBvbgorCSAqIHRoZSByZXN1bHQgb2YgdGhlIHR5cGVzIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSBpZCB0aGUgdHlwZSBpZAorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmcgaWQpOworCQorCXB1YmxpYyBTdHJpbmcgZ2V0SW5zZXJ0aW9uSWQoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlZGl0b3IgcGFnZSBzZWN0aW9uIHNob3VsZCBiZSB2aXNpYmxlIHdpdGggdGhlIGdpdmVuIHNlcnZlci4KKwkgKiBUaGlzIGFsbG93cyAoZm9yIGluc3RhbmNlKSBjb21wbGV4IGNvbmZpZ3VyYXRpb24gcGFnZXMgdG8gb25seSBiZSBzaG93biB3aGVuIHVzZWQKKwkgKiB3aXRoIG5vbi11bml0dGVzdCBzZXJ2ZXJzLgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBzaG93biwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRDcmVhdGVTZWN0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpOworCisJLyoqCisJICogQ3JlYXRlIHRoZSBlZGl0b3IgcGFnZSBzZWN0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNlY3Rpb24KKwkgKi8KKwlwdWJsaWMgU2VydmVyRWRpdG9yU2VjdGlvbiBjcmVhdGVTZWN0aW9uKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjAxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKKy8qKgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgZXh0ZW5kcyBJT3JkZXJlZCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgaWQuCisJICogCisJICogQHJldHVybiB0aGUgaWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBkaXNwbGF5YWJsZSBuYW1lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQorCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCisJICogdGhlIHJlc3VsdCBvZiB0aGUgdHlwZXMgYXR0cmlidXRlLgorCSAqIAorCSAqIEBwYXJhbSBpZCBhIHNlcnZlciB0eXBlIGlkCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHlwZSBpcyBzdXBwb3J0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIGlkKTsKKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiBhIGdpdmVuIGluc2VydGlvbiBpZCBpcyBzdXBwb3J0ZWQuCisJICogCisJICogQHBhcmFtIGlkCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaW5zZXJ0aW9uIGlkIGlzIHN1cHBvcnRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSW5zZXJ0aW9uSWQoU3RyaW5nIGlkKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlZGl0b3IgcGFnZSBzaG91bGQgYmUgdmlzaWJsZSB3aXRoIHRoZSBnaXZlbiBzZXJ2ZXIuCisJICogVGhpcyBhbGxvd3MgKGZvciBpbnN0YW5jZSkgY29tcGxleCBjb25maWd1cmF0aW9uIHBhZ2VzIHRvIG9ubHkgYmUgc2hvd24gd2hlbiB1c2VkCisJICogd2l0aCBub24tdW5pdHRlc3Qgc2VydmVycy4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSBzaG91bGQgYmUgdmlzaWJsZQorCSAqLworCXB1YmxpYyBib29sZWFuIHNob3VsZENyZWF0ZVBhZ2UoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcik7CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGVkaXRvciBwYWdlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGVkaXRvciBwYWdlCisJICovCisJcHVibGljIElFZGl0b3JQYXJ0IGNyZWF0ZVBhZ2UoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvT3ZlcnZpZXdFZGl0b3JQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvT3ZlcnZpZXdFZGl0b3JQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2ZGM4NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9PdmVydmlld0VkaXRvclBhcnQuamF2YQpAQCAtMCwwICsxLDEwMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkF1dG9Db21wbGV0ZUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkNvbnRyb2xEZWNvcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5UZXh0Q29udGVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklGb3JtQ29sb3JzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5NYW5hZ2VkRm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlB1Ymxpc2hlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5UYXNrV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OworLyoqCisgKiBTZXJ2ZXIgZ2VuZXJhbCBlZGl0b3IgcGFnZS4KKyAqLworcHVibGljIGNsYXNzIE92ZXJ2aWV3RWRpdG9yUGFydCBleHRlbmRzIFNlcnZlckVkaXRvclBhcnQgeworCXByb3RlY3RlZCBUZXh0IHNlcnZlck5hbWU7CisJcHJvdGVjdGVkIFRleHQgc2VydmVyQ29uZmlndXJhdGlvbjsKKwlwcm90ZWN0ZWQgVGV4dCBob3N0bmFtZTsKKwlwcm90ZWN0ZWQgQ29tYm8gcnVudGltZUNvbWJvOworCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlOworCXByb3RlY3RlZCBCdXR0b24gYXV0b1B1Ymxpc2hEaXNhYmxlOworCXByb3RlY3RlZCBCdXR0b24gYXV0b1B1Ymxpc2hFbmFibGU7CisJcHJvdGVjdGVkIFNwaW5uZXIgYXV0b1B1Ymxpc2hUaW1lOworCXByb3RlY3RlZCBUYWJsZSBwdWJsaXNoZXJzVGFibGU7CisJcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgcHVibGlzaGVyc1ZpZXdlcjsKKwlwcm90ZWN0ZWQgU3Bpbm5lciBzdGFydFRpbWVvdXRTcGlubmVyOworCXByb3RlY3RlZCBTcGlubmVyIHN0b3BUaW1lb3V0U3Bpbm5lcjsKKwlwcm90ZWN0ZWQgTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm07CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZzsKKworCXByb3RlY3RlZCBJUnVudGltZVtdIHJ1bnRpbWVzOworCisJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7CisKKwlwcm90ZWN0ZWQgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBydW50aW1lTGlzdGVuZXI7CisKKwljbGFzcyBQdWJsaXNoZXJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ29udGVudFByb3ZpZGVyIHsKKwkJcHJvdGVjdGVkIFB1Ymxpc2hlcltdIHB1YnM7CisJCXB1YmxpYyBQdWJsaXNoZXJDb250ZW50UHJvdmlkZXIoUHVibGlzaGVyW10gcHVicykgeworCQkJdGhpcy5wdWJzID0gcHViczsKKwkJfQorCisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCQlyZXR1cm4gcHViczsKKwkJfQorCX0KKworCWNsYXNzIFB1Ymxpc2hMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgeworCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHVibGlzaGVyKSB7CisJCQkJUHVibGlzaGVyIHB1YiA9IChQdWJsaXNoZXIpIGVsZW1lbnQ7CisJCQkJcmV0dXJuIHB1Yi5nZXROYW1lKCk7CisJCQl9CisJCQlyZXR1cm4gIiI7CisJCX0KKwl9CisKKwkvKioKKwkgKiBPdmVydmlld0VkaXRvclBhcnQgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgT3ZlcnZpZXdFZGl0b3JQYXJ0KCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKCkgeworCQlsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImNvbmZpZ3VyYXRpb24taWQiKSAmJiBzZXJ2ZXJDb25maWd1cmF0aW9uICE9IG51bGwpCisJCQkJCXZhbGlkYXRlKCk7CisJCQkJCisJCQkJLy8gZm9sbG93aW5nIGNvZGUgYmVoYXZlcyBwb29ybHkgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IGxvY2FsIG9yIHJlbW90ZQorCQkJCS8vIHB1Ymxpc2hpbmcgdGltZSBwZXIgc2VydmVyIG9yIHNlcnZlciB0eXBlLiBhcyBhIHJlc3VsdCBpdCBzZXRzIHRoZSB2YWx1ZQorCQkJCS8vIHRvIHRoZSBkZWZhdWx0LCB3aGljaCBzZWVtcyB0byBiZSBtb3JlIGhhcm0gdGhhbiBnb29kIHVudGlsIHdlIHJldmFtcCB0aGUKKwkJCQkvLyBkZWZhdWx0IHB1Ymxpc2hpbmcgdGltZXMKKwkJCQkvKmlmICgiaG9zdG5hbWUiLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKwkJCQkJZmluYWwgU3RyaW5nIG9sZEhvc3RuYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0T2xkVmFsdWUoKTsKKwkJCQkJZmluYWwgU3RyaW5nIG5ld0hvc3RuYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJCQkJZmluYWwgYm9vbGVhbiBpc05ld0hvc3RuYW1lTG9jYWxob3N0ID0gU29ja2V0VXRpbC5pc0xvY2FsaG9zdChuZXdIb3N0bmFtZSk7CisJCQkJCWlmIChpc05ld0hvc3RuYW1lTG9jYWxob3N0ICE9IFNvY2tldFV0aWwuaXNMb2NhbGhvc3Qob2xkSG9zdG5hbWUpKSB7CisJCQkJCQkvLyBydW4gdGhpcyBjb2RlIG9ubHkgaWYgdGhlIGhvc3RuYW1lIGNoYW5nZWQgZnJvbQorCQkJCQkJLy8gJ2xvY2FsaG9zdCcgdG8gYSByZW1vdGUgbmFtZSwgb3IgdmljZS12ZXJzYQorCQkJCQkJaG9zdG5hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJaWYgKGlzTmV3SG9zdG5hbWVMb2NhbGhvc3QpIHsKKwkJCQkJCQkJCQlpbnQgYXV0b1B1Ymxpc2hUaW1lMiA9IFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuZ2V0QXV0b1B1Ymxpc2hMb2NhbFRpbWUoKTsKKwkJCQkJCQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KWdldFNlcnZlcigpKS5zZXRBdXRvUHVibGlzaFRpbWUoYXV0b1B1Ymxpc2hUaW1lMik7CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWludCBhdXRvUHVibGlzaFRpbWUyID0gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5nZXRBdXRvUHVibGlzaFJlbW90ZVRpbWUoKTsKKwkJCQkJCQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KWdldFNlcnZlcigpKS5zZXRBdXRvUHVibGlzaFRpbWUoYXV0b1B1Ymxpc2hUaW1lMik7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHVwZGF0ZSBwdWJsaXNoIHRpbWUgdG8gbmV3IGhvc3QiKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0pOworCQkJCQl9CisJCQkJfSovCisJCQkJCisJCQkJaWYgKHVwZGF0aW5nKQorCQkJCQlyZXR1cm47CisJCQkJdXBkYXRpbmcgPSB0cnVlOworCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoIm5hbWUiKSkKKwkJCQkJdXBkYXRlTmFtZXMoKTsKKwkJCQllbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImhvc3RuYW1lIikgJiYgaG9zdG5hbWUgIT0gbnVsbCkgeworCQkJCQlob3N0bmFtZS5zZXRUZXh0KChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOworCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCJydW50aW1lLWlkIikpIHsKKwkJCQkJU3RyaW5nIHJ1bnRpbWVJZCA9IChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7CisJCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOworCQkJCQlpZiAocnVudGltZUlkICE9IG51bGwpCisJCQkJCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOworCQkJCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKKwkJCQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQorCQkJCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImNvbmZpZ3VyYXRpb24taWQiKSAmJiBzZXJ2ZXJDb25maWd1cmF0aW9uICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOworCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldFRleHQocGF0aCk7CisJCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoU2VydmVyLlBST1BfQVVUT19QVUJMSVNIX1RJTUUpKSB7CisJCQkJCUludGVnZXIgY3VyQXV0b1B1Ymxpc2hUaW1lID0gKEludGVnZXIpZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJCQkJYXV0b1B1Ymxpc2hUaW1lLnNldFNlbGVjdGlvbihjdXJBdXRvUHVibGlzaFRpbWUuaW50VmFsdWUoKSk7CisJCQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoYXV0b1B1Ymxpc2hUaW1lKTsKKwkJCQkJdmFsaWRhdGUoKTsKKwkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhTZXJ2ZXIuUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORykpIHsKKwkJCQkJSW50ZWdlciBhdXRvUHVibGlzaFNldHRpbmcgPSAoSW50ZWdlcilldmVudC5nZXROZXdWYWx1ZSgpOworCQkJCQlpbnQgc2V0dGluZyA9IGF1dG9QdWJsaXNoU2V0dGluZy5pbnRWYWx1ZSgpOworCQkJCQlhdXRvUHVibGlzaEVuYWJsZS5zZXRTZWxlY3Rpb24oc2V0dGluZyA9PSBTZXJ2ZXIuQVVUT19QVUJMSVNIX0VOQUJMRSk7CisJCQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRTZWxlY3Rpb24oc2V0dGluZyA9PSBTZXJ2ZXIuQVVUT19QVUJMSVNIX0RJU0FCTEUpOworCQkJCQlhdXRvUHVibGlzaFRpbWUuc2V0RW5hYmxlZChzZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfRU5BQkxFKTsKKwkJCQkJdmFsaWRhdGUoKTsKKwkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhTZXJ2ZXIuUFJPUF9TVEFSVF9USU1FT1VUKSkgeworCQkJCQlJbnRlZ2VyIHRpbWUgPSAoSW50ZWdlcilldmVudC5nZXROZXdWYWx1ZSgpOworCQkJCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldFNlbGVjdGlvbih0aW1lLmludFZhbHVlKCkpOworCQkJCQlTV1RVdGlsLnNldFNwaW5uZXJUb29sdGlwKHN0YXJ0VGltZW91dFNwaW5uZXIpOworCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFNlcnZlci5QUk9QX1NUT1BfVElNRU9VVCkpIHsKKwkJCQkJSW50ZWdlciB0aW1lID0gKEludGVnZXIpZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldFNlbGVjdGlvbih0aW1lLmludFZhbHVlKCkpOworCQkJCQlTV1RVdGlsLnNldFNwaW5uZXJUb29sdGlwKHN0b3BUaW1lb3V0U3Bpbm5lcik7CisJCQkJfSBlbHNlIGlmIChTZXJ2ZXIuUFJPUF9QVUJMSVNIRVJTLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKwkJCQkJaWYgKHB1Ymxpc2hlcnNWaWV3ZXIgPT0gbnVsbCkKKwkJCQkJCXJldHVybjsKKwkJCQkJCisJCQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gKExpc3Q8U3RyaW5nPikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOworCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQkJCVN0cmluZyBpZCA9IGl0ZXIubmV4dCgpOworCQkJCQkJaW50IGluZCA9IGlkLmluZGV4T2YoIjoiKTsKKwkJCQkJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOworCQkJCQkJaWYgKCJ0cnVlIi5lcXVhbHMoaWQuc3Vic3RyaW5nKGluZCsxKSkpCisJCQkJCQkJZW5hYmxlZCA9IHRydWU7CisJCQkJCQlpZCA9IGlkLnN1YnN0cmluZygwLCBpbmQpOworCQkJCQkJUHVibGlzaGVyIHB1YiA9IFNlcnZlclBsdWdpbi5maW5kUHVibGlzaGVyKGlkKTsKKwkJCQkJCWlmIChwdWIgIT0gbnVsbCkKKwkJCQkJCQlwdWJsaXNoZXJzVmlld2VyLnNldENoZWNrZWQocHViLCBlbmFibGVkKTsKKwkJCQkJfQorCQkJCX0KKwkJCQl1cGRhdGluZyA9IGZhbHNlOworCQkJfQorCQl9OworCQlpZiAoc2VydmVyICE9IG51bGwpCisJCQlzZXJ2ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZXMoKSB7CisJCWlmIChzZXJ2ZXJOYW1lICE9IG51bGwpCisJCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgU1dUIGNvbnRyb2xzIGZvciB0aGlzIHdvcmtiZW5jaCBwYXJ0LgorCSAqCisJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCW1hbmFnZWRGb3JtID0gbmV3IE1hbmFnZWRGb3JtKHBhcmVudCk7CisJCXNldE1hbmFnZWRGb3JtKG1hbmFnZWRGb3JtKTsKKwkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7CisJCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7CisJCXRvb2xraXQuZGVjb3JhdGVGb3JtSGVhZGluZyhmb3JtLmdldEZvcm0oKSk7CisJCWZvcm0uc2V0VGV4dChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VUaXRsZSk7CisJCWZvcm0uc2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVIpKTsKKwkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQkKKwkJQ29tcG9zaXRlIGNvbHVtbkNvbXAgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtLmdldEJvZHkoKSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQkvL2xheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKKwkJLy9sYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDEwOworCQljb2x1bW5Db21wLnNldExheW91dChsYXlvdXQpOworCQljb2x1bW5Db21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKKwkJCisJCS8vIGxlZnQgY29sdW1uCisJCUNvbXBvc2l0ZSBsZWZ0Q29sdW1uQ29tcCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGNvbHVtbkNvbXApOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOworCQlsZWZ0Q29sdW1uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJbGVmdENvbHVtbkNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOworCQkKKwkJY3JlYXRlR2VuZXJhbFNlY3Rpb24obGVmdENvbHVtbkNvbXAsIHRvb2xraXQpOworCQkKKwkJaW5zZXJ0U2VjdGlvbnMobGVmdENvbHVtbkNvbXAsICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5sZWZ0Iik7CisJCQorCQkvLyByaWdodCBjb2x1bW4KKwkJQ29tcG9zaXRlIHJpZ2h0Q29sdW1uQ29tcCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGNvbHVtbkNvbXApOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOworCQlyaWdodENvbHVtbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7CisJCXJpZ2h0Q29sdW1uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7CisJCQorCQljcmVhdGVQdWJsaXNoU2VjdGlvbihyaWdodENvbHVtbkNvbXAsIHRvb2xraXQpOworCQljcmVhdGVUaW1lb3V0U2VjdGlvbihyaWdodENvbHVtbkNvbXAsIHRvb2xraXQpOworCQkKKwkJaW5zZXJ0U2VjdGlvbnMocmlnaHRDb2x1bW5Db21wLCAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcucmlnaHQiKTsKKwkJCisJCWZvcm0ucmVmbG93KHRydWUpOworCQkKKwkJaW5pdGlhbGl6ZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBsZWZ0Q29sdW1uQ29tcCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgeworCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24obGVmdENvbHVtbkNvbXAsIEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTik7CisJCXNlY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld0dlbmVyYWxTZWN0aW9uKTsKKwkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld0dlbmVyYWxEZXNjcmlwdGlvbik7CisJCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOworCQkKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gNTsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOworCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLkVESVRPUl9PVkVSVklFV19QQUdFKTsKKwkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKKwkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKKwkJCisJCWludCBkZWNvcmF0aW9uV2lkdGggPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0TWF4aW11bURlY29yYXRpb25XaWR0aCgpOyAKKwkJCisJCS8vIHNlcnZlciBuYW1lCisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgeworCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWUpOworCQkJCisJCQlzZXJ2ZXJOYW1lID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgc2VydmVyLmdldE5hbWUoKSk7CisJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IGRlY29yYXRpb25XaWR0aDsKKwkJCXNlcnZlck5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCXNlcnZlck5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCQlpZiAodXBkYXRpbmcpCisJCQkJCQlyZXR1cm47CisJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKKwkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyTmFtZUNvbW1hbmQoZ2V0U2VydmVyKCksIHNlcnZlck5hbWUuZ2V0VGV4dCgpKSk7CisJCQkJCXVwZGF0aW5nID0gZmFsc2U7CisJCQkJCXZhbGlkYXRlKCk7CisJCQkJfQorCQkJfSk7CisJCQl3aHMuc2V0SGVscChzZXJ2ZXJOYW1lLCBDb250ZXh0SWRzLkVESVRPUl9TRVJWRVIpOworCQkJCisJCQkvLyBob3N0bmFtZQorCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lKTsKKwkJCQorCQkJaG9zdG5hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBzZXJ2ZXIuZ2V0SG9zdCgpKTsKKwkJCWZpbmFsIENvbnRyb2xEZWNvcmF0aW9uIGhvc3RuYW1lRGVjb3JhdGlvbiA9IG5ldyBDb250cm9sRGVjb3JhdGlvbihob3N0bmFtZSwgU1dULlRPUCB8IFNXVC5MRUFEKTsKKwkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gZGVjb3JhdGlvbldpZHRoOworCQkJaG9zdG5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCWhvc3RuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQkJaWYgKHVwZGF0aW5nKQorCQkJCQkJcmV0dXJuOworCQkJCQl1cGRhdGluZyA9IHRydWU7CisJCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckhvc3RuYW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgaG9zdG5hbWUuZ2V0VGV4dCgpKSk7CisJCQkJCXVwZGF0aW5nID0gZmFsc2U7CisJCQkJfQorCQkJfSk7CisJCQl3aHMuc2V0SGVscChob3N0bmFtZSwgQ29udGV4dElkcy5FRElUT1JfSE9TVE5BTUUpOworCQkJCisJCQlGaWVsZERlY29yYXRpb25SZWdpc3RyeSByZWdpc3RyeSA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKTsKKwkJCUZpZWxkRGVjb3JhdGlvbiBmZCA9IHJlZ2lzdHJ5LmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfQ09OVEVOVF9QUk9QT1NBTCk7CisJCQlob3N0bmFtZURlY29yYXRpb24uc2V0SW1hZ2UoZmQuZ2V0SW1hZ2UoKSk7CisJCQlob3N0bmFtZURlY29yYXRpb24uc2V0RGVzY3JpcHRpb25UZXh0KGZkLmdldERlc2NyaXB0aW9uKCkpOworCQkJaG9zdG5hbWVEZWNvcmF0aW9uLmhpZGUoKTsKKwkJCQorCQkJaG9zdG5hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKKwkJCQkJaG9zdG5hbWVEZWNvcmF0aW9uLnNob3coKTsKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7CisJCQkJCWhvc3RuYW1lRGVjb3JhdGlvbi5oaWRlKCk7CisJCQkJfQorCQkJfSk7CisJCQkKKwkJCS8vdXBkYXRlRGVjb3JhdGlvbihob3N0bmFtZURlY29yYXRpb24sIG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsICJQcmVzcyBDdHJsLVNwYWNlIikpOworCQkJCisJCQlMaXN0PFN0cmluZz4gaG9zdHMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmdldEhvc3RuYW1lcygpOworCQkJU3RyaW5nW10gaG9zdHMyID0gaG9zdHMudG9BcnJheShuZXcgU3RyaW5nW2hvc3RzLnNpemUoKV0pOworCQkJbmV3IEF1dG9Db21wbGV0ZUZpZWxkKGhvc3RuYW1lLCBuZXcgVGV4dENvbnRlbnRBZGFwdGVyKCksIGhvc3RzMik7CisJCX0KKwkJCisJCS8vIHJ1bnRpbWUKKwkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1J1bnRpbWUoKSkgeworCQkJZmluYWwgSVJ1bnRpbWUgcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7CisJCQlpZiAocnVudGltZSAhPSBudWxsICYmIFNlcnZlclVJUGx1Z2luLmhhc1dpemFyZEZyYWdtZW50KHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSkgeworCQkJCUh5cGVybGluayBsaW5rID0gdG9vbGtpdC5jcmVhdGVIeXBlcmxpbmsoY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWUsIFNXVC5OT05FKTsKKwkJCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgeworCQkJCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKKwkJCQkJCWVkaXRSdW50aW1lKHJ1bnRpbWUpOworCQkJCQl9CisJCQkJfSk7CisJCQl9IGVsc2UKKwkJCQljcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZSk7CisJCQkKKwkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKTsKKwkJCXJ1bnRpbWVzID0gU2VydmVyVUlQbHVnaW4uZ2V0UnVudGltZXMocnVudGltZVR5cGUpOworCQkJCisJCQlydW50aW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKKwkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IGRlY29yYXRpb25XaWR0aDsKKwkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkJcnVudGltZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7CisJCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKKwkJCQorCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCisJCQkJCXJ1bnRpbWVDb21iby5zZWxlY3QoaSk7CisJCQl9CisJCQkKKwkJCXJ1bnRpbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQl0cnkgeworCQkJCQkJaWYgKHVwZGF0aW5nKQorCQkJCQkJCXJldHVybjsKKwkJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKKwkJCQkJCUlSdW50aW1lIG5ld1J1bnRpbWUgPSBydW50aW1lc1tydW50aW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07CisJCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgbmV3UnVudGltZSkpOworCQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCQkvLyBpZ25vcmUKKwkJCQkJfQorCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKKwkJCQl9CisJCQl9KTsKKwkJCXdocy5zZXRIZWxwKHJ1bnRpbWVDb21ibywgQ29udGV4dElkcy5FRElUT1JfUlVOVElNRSk7CisJCQkKKwkJCS8vIGFkZCBydW50aW1lIGxpc3RlbmVyCisJCQlydW50aW1lTGlzdGVuZXIgPSBuZXcgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW50aW1lQ2hhbmdlZChmaW5hbCBJUnVudGltZSBydW50aW1lMikgeworCQkJCQkvLyBtYXkgYmUgbmFtZSBjaGFuZ2Ugb2YgY3VycmVudCBydW50aW1lCisJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQlpZiAocnVudGltZTIuZXF1YWxzKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSkpIHsKKwkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCWlmICh1cGRhdGluZykKKwkJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCQl1cGRhdGluZyA9IHRydWU7CisJCQkJCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgcnVudGltZTIpKTsKKwkJCQkJCQkJCXVwZGF0aW5nID0gZmFsc2U7CisJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCQkJLy8gaWdub3JlCisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJaWYgKHJ1bnRpbWVDb21ibyAhPSBudWxsICYmICFydW50aW1lQ29tYm8uaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCXVwZGF0ZVJ1bnRpbWVDb21ibygpOworCQkJCQkJCQkKKwkJCQkJCQkJaW50IHNpemUyID0gcnVudGltZXMubGVuZ3RoOworCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKKwkJCQkJCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCisJCQkJCQkJCQkJcnVudGltZUNvbWJvLnNlbGVjdChpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfQorCisJCQkJcHVibGljIHZvaWQgcnVudGltZUFkZGVkKGZpbmFsIElSdW50aW1lIHJ1bnRpbWUyKSB7CisJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwgJiYgIXJ1bnRpbWVDb21iby5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJCQkJdXBkYXRlUnVudGltZUNvbWJvKCk7CisJCQkJCQkJCQorCQkJCQkJCQlpbnQgc2l6ZTIgPSBydW50aW1lcy5sZW5ndGg7CisJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgeworCQkJCQkJCQkJaWYgKHJ1bnRpbWVzW2ldLmVxdWFscyhydW50aW1lKSkKKwkJCQkJCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBydW50aW1lUmVtb3ZlZChJUnVudGltZSBydW50aW1lMikgeworCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJaWYgKHJ1bnRpbWVDb21ibyAhPSBudWxsICYmICFydW50aW1lQ29tYm8uaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCXVwZGF0ZVJ1bnRpbWVDb21ibygpOworCQkJCQkJCQkKKwkJCQkJCQkJaW50IHNpemUyID0gcnVudGltZXMubGVuZ3RoOworCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKKwkJCQkJCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCisJCQkJCQkJCQkJcnVudGltZUNvbWJvLnNlbGVjdChpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfQorCQkJfTsKKwkJCQorCQkJU2VydmVyQ29yZS5hZGRSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIocnVudGltZUxpc3RlbmVyKTsKKwkJfQorCQkKKwkJLy8gc2VydmVyIGNvbmZpZ3VyYXRpb24gcGF0aAorCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpKSB7CisJCQljcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvblBhdGgpOworCQkJCisJCQlJRm9sZGVyIGZvbGRlciA9IHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7CisJCQlpZiAoZm9sZGVyID09IG51bGwpCisJCQkJc2VydmVyQ29uZmlndXJhdGlvbiA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsIE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSk7CisJCQllbHNlCisJCQkJc2VydmVyQ29uZmlndXJhdGlvbiA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiICsgc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKS5nZXRGdWxsUGF0aCgpKTsKKwkJCQorCQkJc2VydmVyQ29uZmlndXJhdGlvbi5zZXRFZGl0YWJsZShmYWxzZSk7CisJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBkZWNvcmF0aW9uV2lkdGg7CisJCQlkYXRhLndpZHRoSGludCA9IDc1OworCQkJc2VydmVyQ29uZmlndXJhdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJCisJCQl3aHMuc2V0SGVscChzZXJ2ZXJDb25maWd1cmF0aW9uLCBDb250ZXh0SWRzLkVESVRPUl9DT05GSUdVUkFUSU9OKTsKKwkJCQorCQkJZmluYWwgSUZvbGRlciBjdXJyZW50Rm9sZGVyID0gc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKKwkJCWJyb3dzZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uQnJvd3NlLCBTV1QuUFVTSCk7CisJCQlicm93c2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyhzZXJ2ZXJDb25maWd1cmF0aW9uLmdldFNoZWxsKCksCisJCQkJCQljdXJyZW50Rm9sZGVyLCB0cnVlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25Ccm93c2VNZXNzYWdlKTsKKwkJCQkJZGlhbG9nLnNob3dDbG9zZWRQcm9qZWN0cyhmYWxzZSk7CisJCQkJCQorCQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7CisJCQkJCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7CisJCQkJCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCA9PSAxKSB7CisJCQkJCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgcmVzdWx0WzBdOworCQkJCQkJCQorCQkJCQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3QuZmluZE1lbWJlcihwYXRoKTsKKwkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQkJCQkJSUZvbGRlciBmb2xkZXIyID0gKElGb2xkZXIpIHJlc291cmNlOworCQkJCQkJCQorCQkJCQkJCQlpZiAodXBkYXRpbmcpCisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKKwkJCQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQoZ2V0U2VydmVyKCksIGZvbGRlcjIpKTsKKwkJCQkJCQkJc2VydmVyQ29uZmlndXJhdGlvbi5zZXRUZXh0KGZvbGRlcjIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKKwkJCQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJCWJyb3dzZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOworCQl9CisJCQorCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKSB7CisJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gc2VydmVyLmdldFNlcnZlclR5cGUoKTsKKwkJCWlmIChzZXJ2ZXJUeXBlLnN1cHBvcnRzTGF1bmNoTW9kZShJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSkgfHwgc2VydmVyVHlwZS5zdXBwb3J0c0xhdW5jaE1vZGUoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSkKKwkJCQkJfHwgc2VydmVyVHlwZS5zdXBwb3J0c0xhdW5jaE1vZGUoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFKSkgeworCQkJCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBsYXVuY2hUeXBlID0gKChTZXJ2ZXJUeXBlKSBzZXJ2ZXJUeXBlKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSgpOworCQkJCWlmIChsYXVuY2hUeXBlICE9IG51bGwgJiYgbGF1bmNoVHlwZS5pc1B1YmxpYygpKSB7CisJCQkJCWZpbmFsIEh5cGVybGluayBsaW5rID0gdG9vbGtpdC5jcmVhdGVIeXBlcmxpbmsoY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld09wZW5MYXVuY2hDb25maWd1cmF0aW9uLCBTV1QuTk9ORSk7CisJCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQkJCWxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZyA9ICgoU2VydmVyKSBnZXRTZXJ2ZXIoKSkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbih0cnVlLCBudWxsKTsKKwkJCQkJCQkJLy8gVE9ETzogdXNlIGNvcnJlY3QgbGF1bmNoIGdyb3VwCisJCQkJCQkJCURlYnVnVUlUb29scy5vcGVuTGF1bmNoQ29uZmlndXJhdGlvblByb3BlcnRpZXNEaWFsb2cobGluay5nZXRTaGVsbCgpLCBsYXVuY2hDb25maWcsICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hHcm91cC5ydW4iKTsKKwkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24iLCBjZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQdWJsaXNoU2VjdGlvbihDb21wb3NpdGUgcmlnaHRDb2x1bW5Db21wLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7CisJCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihyaWdodENvbHVtbkNvbXAsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOworCQlzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdQdWJsaXNoU2VjdGlvbik7CisJCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdQdWJsaXNoRGVzY3JpcHRpb24pOworCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKKworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxNTsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOworCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLkVESVRPUl9PVkVSVklFV19QQUdFKTsKKwkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKKwkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKKwkJCisJCS8vCSBhdXRvLXB1Ymxpc2gKKwkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQlmaW5hbCBTZXJ2ZXIgc3ZyID0gKFNlcnZlcikgc2VydmVyOworCQkJaW50IHB1Ymxpc2hTZXR0aW5nID0gc3ZyLmdldEF1dG9QdWJsaXNoU2V0dGluZygpOworCQkJCisJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CQkJCQkJCQkJCQkJCQkJCisJCQlhdXRvUHVibGlzaERpc2FibGUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hEaXNhYmxlLCBTV1QuUkFESU8pOworCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlhdXRvUHVibGlzaERpc2FibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRTZWxlY3Rpb24ocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9ESVNBQkxFKTsKKwkJCXdocy5zZXRIZWxwKGF1dG9QdWJsaXNoRGlzYWJsZSwgQ29udGV4dElkcy5FRElUT1JfQVVUT1BVQkxJU0hfRElTQUJMRSk7CisJCQkKKwkJCWF1dG9QdWJsaXNoRW5hYmxlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRW5hYmxlZCwgU1dULlJBRElPKTsKKwkJCWF1dG9QdWJsaXNoRW5hYmxlLnNldFNlbGVjdGlvbihwdWJsaXNoU2V0dGluZyA9PSBTZXJ2ZXIuQVVUT19QVUJMSVNIX0VOQUJMRSk7CisJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJCWF1dG9QdWJsaXNoRW5hYmxlLnNldExheW91dERhdGEoZGF0YSk7CisJCQl3aHMuc2V0SGVscChhdXRvUHVibGlzaEVuYWJsZSwgQ29udGV4dElkcy5FRElUT1JfQVVUT1BVQkxJU0hfRU5BQkxFKTsKKwkJCQorCQkJZmluYWwgTGFiZWwgYXV0b1B1Ymxpc2hUaW1lTGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWRJbnRlcnZhbCk7CisJCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKKwkJCWF1dG9QdWJsaXNoVGltZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQlhdXRvUHVibGlzaFRpbWVMYWJlbC5zZXRFbmFibGVkKGF1dG9QdWJsaXNoRW5hYmxlLmdldFNlbGVjdGlvbigpKTsKKwkJCQorCQkJYXV0b1B1Ymxpc2hUaW1lID0gbmV3IFNwaW5uZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKKwkJCWF1dG9QdWJsaXNoVGltZS5zZXRNaW5pbXVtKDApOworCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEluY3JlbWVudCg1KTsKKwkJCWF1dG9QdWJsaXNoVGltZS5zZXRNYXhpbXVtKDEyMCk7CisJCQlhdXRvUHVibGlzaFRpbWUuc2V0U2VsZWN0aW9uKHN2ci5nZXRBdXRvUHVibGlzaFRpbWUoKSk7CisJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKKwkJCWRhdGEud2lkdGhIaW50ID0gMzA7CisJCQlhdXRvUHVibGlzaFRpbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCWF1dG9QdWJsaXNoVGltZS5zZXRFbmFibGVkKGF1dG9QdWJsaXNoRW5hYmxlLmdldFNlbGVjdGlvbigpKTsKKwkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoYXV0b1B1Ymxpc2hUaW1lKTsKKwkJCXdocy5zZXRIZWxwKGF1dG9QdWJsaXNoVGltZSwgQ29udGV4dElkcy5FRElUT1JfQVVUT1BVQkxJU0hfRU5BQkxFKTsKKwkJCQorCQkJYXV0b1B1Ymxpc2hFbmFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlpZiAodXBkYXRpbmcgfHwgIWF1dG9QdWJsaXNoRW5hYmxlLmdldFNlbGVjdGlvbigpKQorCQkJCQkJcmV0dXJuOworCQkJCQl1cGRhdGluZyA9IHRydWU7CisJCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQoZ2V0U2VydmVyKCksIFNlcnZlci5BVVRPX1BVQkxJU0hfRU5BQkxFKSk7CisJCQkJCXVwZGF0aW5nID0gZmFsc2U7CisJCQkJCWF1dG9QdWJsaXNoVGltZUxhYmVsLnNldEVuYWJsZWQoYXV0b1B1Ymxpc2hFbmFibGUuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQlhdXRvUHVibGlzaFRpbWUuc2V0RW5hYmxlZChhdXRvUHVibGlzaEVuYWJsZS5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCXZhbGlkYXRlKCk7CisJCQkJfQorCQkJfSk7CisJCQkJCQkKKwkJCWF1dG9QdWJsaXNoRGlzYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWlmICh1cGRhdGluZyB8fCAhYXV0b1B1Ymxpc2hEaXNhYmxlLmdldFNlbGVjdGlvbigpKQorCQkJCQkJcmV0dXJuOworCQkJCQl1cGRhdGluZyA9IHRydWU7CisJCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQoZ2V0U2VydmVyKCksIFNlcnZlci5BVVRPX1BVQkxJU0hfRElTQUJMRSkpOworCQkJCQl1cGRhdGluZyA9IGZhbHNlOworCQkJCQlhdXRvUHVibGlzaFRpbWVMYWJlbC5zZXRFbmFibGVkKGF1dG9QdWJsaXNoRW5hYmxlLmdldFNlbGVjdGlvbigpKTsKKwkJCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEVuYWJsZWQoYXV0b1B1Ymxpc2hFbmFibGUuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQl2YWxpZGF0ZSgpOworCQkJCX0KKwkJCX0pOworCQkJCisJCQlhdXRvUHVibGlzaFRpbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCQlpZiAodXBkYXRpbmcpCisJCQkJCQlyZXR1cm47CisJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKKwkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyQXV0b1B1Ymxpc2hUaW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgYXV0b1B1Ymxpc2hUaW1lLmdldFNlbGVjdGlvbigpKSk7CisJCQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoYXV0b1B1Ymxpc2hUaW1lKTsKKwkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKKwkJCQkJdmFsaWRhdGUoKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJLy8gcHVibGlzaGVycworCQkJUHVibGlzaGVyW10gcHVicyA9ICgoU2VydmVyKXNlcnZlcikuZ2V0QWxsUHVibGlzaGVycygpOworCQkJaWYgKHB1YnMgIT0gbnVsbCAmJiBwdWJzLmxlbmd0aCA+IDApIHsKKwkJCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hlcnMpOworCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJCQorCQkJCXB1Ymxpc2hlcnNUYWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUoY29tcG9zaXRlLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQ0hFQ0spOworCQkJCXB1Ymxpc2hlcnNUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKKwkJCQlwdWJsaXNoZXJzVGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKKwkJCQl3aHMuc2V0SGVscChwdWJsaXNoZXJzVGFibGUsIENvbnRleHRJZHMuRURJVE9SX1BVQkxJU0hUQVNLU19DT05GSUdVUkFUSU9OKTsKKwkJCQkKKwkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOworCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkJCWRhdGEuaGVpZ2h0SGludCA9IDgwOworCQkJCXB1Ymxpc2hlcnNUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJCQorCQkJCXB1Ymxpc2hlcnNWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihwdWJsaXNoZXJzVGFibGUpOworCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyJuYW1lIn0pOworCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBQdWJsaXNoZXJDb250ZW50UHJvdmlkZXIocHVicykpOworCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUHVibGlzaExhYmVsUHJvdmlkZXIoKSk7CisJCQkJcHVibGlzaGVyc1ZpZXdlci5zZXRJbnB1dCgicm9vdCIpOworCQkJCQorCQkJCVB1Ymxpc2hlcltdIHB1YnMyID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRFbmFibGVkUHVibGlzaGVycygpOworCQkJCWZvciAoUHVibGlzaGVyIHAgOiBwdWJzMikKKwkJCQkJcHVibGlzaGVyc1ZpZXdlci5zZXRDaGVja2VkKHAsIHRydWUpOworCQkJCQorCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgeworCQkJCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJCQlPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKKwkJCQkJCWlmIChlbGVtZW50ID09IG51bGwgfHwgIShlbGVtZW50IGluc3RhbmNlb2YgUHVibGlzaGVyKSkKKwkJCQkJCQlyZXR1cm47CisJCQkJCQlpZiAodXBkYXRpbmcpCisJCQkJCQkJcmV0dXJuOworCQkJCQkJdXBkYXRpbmcgPSB0cnVlOworCQkJCQkJZXhlY3V0ZShuZXcgU2V0UHVibGlzaGVyRW5hYmxlbWVudENvbW1hbmQoZ2V0U2VydmVyKCksIChQdWJsaXNoZXIpIGVsZW1lbnQsIGV2ZW50LmdldENoZWNrZWQoKSkpOworCQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGltZW91dFNlY3Rpb24oQ29tcG9zaXRlIHJpZ2h0Q29sdW1uQ29tcCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgeworCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocmlnaHRDb2x1bW5Db21wLCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKKwkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dFNlY3Rpb24pOworCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dERlc2NyaXB0aW9uKTsKKwkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7CisJCQorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxNTsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOworCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLkVESVRPUl9PVkVSVklFV19QQUdFKTsKKwkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKKwkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKKwkJCisJCS8vCXRpbWVvdXRzCisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgeworCQkJZmluYWwgU2VydmVyIHN2ciA9IChTZXJ2ZXIpIHNlcnZlcjsKKwkJCQorCQkJLy8gc3RhcnQgdGltZW91dCBsYWJlbAorCQkJZmluYWwgTGFiZWwgc3RhcnRUaW1lb3V0TGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U3RhcnRUaW1lb3V0KTsKKwkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOworCQkJc3RhcnRUaW1lb3V0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsJCQkKKwkJCQorCQkJc3RhcnRUaW1lb3V0U3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldEVuYWJsZWQodHJ1ZSk7CisJCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldE1pbmltdW0oMSk7CisJCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldE1heGltdW0oNjAqNjAqMjQpOyAvLyAyNCBob3VycworCQkJc3RhcnRUaW1lb3V0U3Bpbm5lci5zZXRJbmNyZW1lbnQoNSk7CisJCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldFNlbGVjdGlvbihzdnIuZ2V0U3RhcnRUaW1lb3V0KCkpOworCQkJU1dUVXRpbC5zZXRTcGlubmVyVG9vbHRpcChzdGFydFRpbWVvdXRTcGlubmVyKTsKKwkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOworCQkJZGF0YS53aWR0aEhpbnQgPSAzMDsKKwkJCXN0YXJ0VGltZW91dFNwaW5uZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCXdocy5zZXRIZWxwKHN0YXJ0VGltZW91dFNwaW5uZXIsIENvbnRleHRJZHMuRURJVE9SX1RJTUVPVVRfU1RBUlQpOworCQkJCisJCQkvLyBzdG9wIHRpbWVvdXQgbGFiZWwKKwkJCWZpbmFsIExhYmVsIHN0b3BUaW1lb3V0TGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U3RvcFRpbWVvdXQpOworCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7CisJCQlzdG9wVGltZW91dExhYmVsLnNldExheW91dERhdGEoZGF0YSk7CQkJCisJCQkKKwkJCXN0b3BUaW1lb3V0U3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQlzdG9wVGltZW91dFNwaW5uZXIuc2V0RW5hYmxlZCh0cnVlKTsKKwkJCXN0b3BUaW1lb3V0U3Bpbm5lci5zZXRNaW5pbXVtKDEpOworCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldE1heGltdW0oNjAqNjAqMjQpOyAvLyAyNCBob3VycworCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldEluY3JlbWVudCg1KTsKKwkJCXN0b3BUaW1lb3V0U3Bpbm5lci5zZXRTZWxlY3Rpb24oc3ZyLmdldFN0b3BUaW1lb3V0KCkpOworCQkJU1dUVXRpbC5zZXRTcGlubmVyVG9vbHRpcChzdG9wVGltZW91dFNwaW5uZXIpOworCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7CisJCQlkYXRhLndpZHRoSGludCA9IDMwOworCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldExheW91dERhdGEoZGF0YSk7CisJCQl3aHMuc2V0SGVscChzdG9wVGltZW91dFNwaW5uZXIsIENvbnRleHRJZHMuRURJVE9SX1RJTUVPVVRfU1RPUCk7CisJCQkKKwkJCXN0YXJ0VGltZW91dFNwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCQlpZiAodXBkYXRpbmcpCisJCQkJCQlyZXR1cm47CisJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKKwkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyU3RhcnRUaW1lb3V0Q29tbWFuZChnZXRTZXJ2ZXIoKSwgc3RhcnRUaW1lb3V0U3Bpbm5lci5nZXRTZWxlY3Rpb24oKSkpOworCQkJCQlTV1RVdGlsLnNldFNwaW5uZXJUb29sdGlwKHN0YXJ0VGltZW91dFNwaW5uZXIpOworCQkJCQl1cGRhdGluZyA9IGZhbHNlOworCQkJCQl2YWxpZGF0ZSgpOworCQkJCX0KKwkJCX0pOworCQkJc3RvcFRpbWVvdXRTcGlubmVyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCQlpZiAodXBkYXRpbmcpCisJCQkJCQlyZXR1cm47CisJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKKwkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyU3RvcFRpbWVvdXRDb21tYW5kKGdldFNlcnZlcigpLCBzdG9wVGltZW91dFNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpKTsKKwkJCQkJU1dUVXRpbC5zZXRTcGlubmVyVG9vbHRpcChzdG9wVGltZW91dFNwaW5uZXIpOworCQkJCQl1cGRhdGluZyA9IGZhbHNlOworCQkJCQl2YWxpZGF0ZSgpOwkJCQorCQkJCX0KKwkJCX0pOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZWRpdFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgeworCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXb3JraW5nQ29weSA9IHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKTsKKwkJaWYgKHNob3dXaXphcmQocnVudGltZVdvcmtpbmdDb3B5KSAhPSBXaW5kb3cuQ0FOQ0VMKSB7CisJCQl0cnkgeworCQkJCXJ1bnRpbWVXb3JraW5nQ29weS5zYXZlKGZhbHNlLCBudWxsKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIGludCBzaG93V2l6YXJkKGZpbmFsIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdvcmtpbmdDb3B5KSB7CisJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLndpekVkaXRSdW50aW1lV2l6YXJkVGl0bGU7CisJCWZpbmFsIFdpemFyZEZyYWdtZW50IGZyYWdtZW50MiA9IFNlcnZlclVJUGx1Z2luLmdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWVXb3JraW5nQ29weS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOworCQlpZiAoZnJhZ21lbnQyID09IG51bGwpCisJCQlyZXR1cm4gV2luZG93LkNBTkNFTDsKKwkJCisJCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7CisJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZVdvcmtpbmdDb3B5KTsKKworCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKKwkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKKwkJCQlsaXN0LmFkZChmcmFnbWVudDIpOworCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOworCQkJfQorCQl9OworCQkKKwkJVGFza1dpemFyZCB3aXphcmQgPSBuZXcgVGFza1dpemFyZCh0aXRsZSwgZnJhZ21lbnQsIHRhc2tNb2RlbCk7CisJCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7CisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB3aXphcmQpOworCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSdW50aW1lQ29tYm8oKSB7CisJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKTsKKwkJcnVudGltZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSdW50aW1lcyhydW50aW1lVHlwZSk7CisJCQorCQlpZiAoU29ja2V0VXRpbC5pc0xvY2FsaG9zdChzZXJ2ZXIuZ2V0SG9zdCgpKSAmJiBydW50aW1lcyAhPSBudWxsKSB7CisJCQlMaXN0PElSdW50aW1lPiBydW50aW1lczIgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPigpOworCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCUlSdW50aW1lIHJ1bnRpbWUyID0gcnVudGltZXNbaV07CisJCQkJaWYgKCFydW50aW1lMi5pc1N0dWIoKSkKKwkJCQkJcnVudGltZXMyLmFkZChydW50aW1lMik7CisJCQl9CisJCQlydW50aW1lcyA9IG5ldyBJUnVudGltZVtydW50aW1lczIuc2l6ZSgpXTsKKwkJCXJ1bnRpbWVzMi50b0FycmF5KHJ1bnRpbWVzKTsKKwkJfQorCQkKKwkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7CisJCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tzaXplXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQlpdGVtc1tpXSA9IHJ1bnRpbWVzW2ldLmdldE5hbWUoKTsKKwkJCisJCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhpdGVtcyk7CisJfQorCisJcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7CisJCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOworCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJCisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCXNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWlmIChydW50aW1lTGlzdGVuZXIgIT0gbnVsbCkKKwkJCVNlcnZlckNvcmUucmVtb3ZlUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKHJ1bnRpbWVMaXN0ZW5lcik7CisJCQorCQlpZiAobWFuYWdlZEZvcm0gIT0gbnVsbCkgeworCQkJbWFuYWdlZEZvcm0uZGlzcG9zZSgpOworCQkJbWFuYWdlZEZvcm0gPSBudWxsOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuCisJICovCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKKwkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7CisJCQorCQlhZGRDaGFuZ2VMaXN0ZW5lcigpOworCQlpbml0aWFsaXplKCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCWlmIChzZXJ2ZXJOYW1lID09IG51bGwpCisJCQlyZXR1cm47CisJCXVwZGF0aW5nID0gdHJ1ZTsKKwkJCisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgeworCQkJc2VydmVyTmFtZS5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOworCQkJaWYgKHJlYWRPbmx5KQorCQkJCXNlcnZlck5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOworCQkJZWxzZQorCQkJCXNlcnZlck5hbWUuc2V0RWRpdGFibGUodHJ1ZSk7CisJCQkKKwkJCWhvc3RuYW1lLnNldFRleHQoc2VydmVyLmdldEhvc3QoKSk7CisJCQlpZiAocmVhZE9ubHkpCisJCQkJaG9zdG5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOworCQkJZWxzZQorCQkJCWhvc3RuYW1lLnNldEVkaXRhYmxlKHRydWUpOworCQkJCisJCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKKwkJCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKKwkJCQlJUnVudGltZSBydW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKKwkJCQlpbnQgc2l6ZTIgPSBydW50aW1lcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7CisJCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCisJCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOworCQkJCX0KKwkJCQlpZiAocmVhZE9ubHkpCisJCQkJCXJ1bnRpbWVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQllbHNlCisJCQkJCXJ1bnRpbWVDb21iby5zZXRFbmFibGVkKHRydWUpOworCQkJfQorCQkJCisJCQlpZiAoc2VydmVyQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7CisJCQkJSUZvbGRlciBmb2xkZXIgPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOworCQkJCWlmIChmb2xkZXIgPT0gbnVsbCkKKwkJCQkJc2VydmVyQ29uZmlndXJhdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSk7CisJCQkJZWxzZQorCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldFRleHQoIiIgKyBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpLmdldEZ1bGxQYXRoKCkpOworCQkJCWlmIChyZWFkT25seSkgeworCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJCQkJYnJvd3NlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCX0gZWxzZSB7CisJCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0RWRpdGFibGUodHJ1ZSk7CisJCQkJCWJyb3dzZS5zZXRFbmFibGVkKHRydWUpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJU2VydmVyIHN2ciA9IChTZXJ2ZXIpIHNlcnZlcjsKKwkJCWludCBwdWJsaXNoU2V0dGluZyA9IHN2ci5nZXRBdXRvUHVibGlzaFNldHRpbmcoKTsKKwkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRTZWxlY3Rpb24ocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9ESVNBQkxFKTsKKwkJCWF1dG9QdWJsaXNoRW5hYmxlLnNldFNlbGVjdGlvbihwdWJsaXNoU2V0dGluZyA9PSBTZXJ2ZXIuQVVUT19QVUJMSVNIX0VOQUJMRSk7CisJCQlhdXRvUHVibGlzaFRpbWUuc2V0U2VsZWN0aW9uKHN2ci5nZXRBdXRvUHVibGlzaFRpbWUoKSk7CisJCQkKKwkJCWlmIChyZWFkT25seSkgeworCQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQlhdXRvUHVibGlzaEVuYWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQlhdXRvUHVibGlzaFRpbWUuc2V0RW5hYmxlZChmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRFbmFibGVkKHRydWUpOworCQkJCWF1dG9QdWJsaXNoRW5hYmxlLnNldEVuYWJsZWQodHJ1ZSk7CisJCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEVuYWJsZWQocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9FTkFCTEUpOworCQkJfQorCQl9CisJCQorCQl1cGRhdGluZyA9IGZhbHNlOworCQl2YWxpZGF0ZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgeworCQlJTWFuYWdlZEZvcm0gbUZvcm0gPSBnZXRNYW5hZ2VkRm9ybSgpOworCQlpZiAobUZvcm0gPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCW1Gb3JtLmdldE1lc3NhZ2VNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZSgibmFtZSIsIHNlcnZlck5hbWUpOworCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyTmFtZSAhPSBudWxsKSB7CisJCQlpZiAoU2VydmVyUGx1Z2luLmlzTmFtZUluVXNlKHNlcnZlciwgc2VydmVyTmFtZS5nZXRUZXh0KCkudHJpbSgpKSkKKwkJCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UoIm5hbWUiLCBNZXNzYWdlcy5lcnJvckR1cGxpY2F0ZU5hbWUsIG51bGwsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IsIHNlcnZlck5hbWUpOworCQl9CisJCQorCQlpZiAoc2VydmVyQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7CisJCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2UoImNvbmZpZyIsIHNlcnZlckNvbmZpZ3VyYXRpb24pOworCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgeworCQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOworCQkJCWlmIChmb2xkZXIgPT0gbnVsbCB8fCAhZm9sZGVyLmV4aXN0cygpKQorCQkJCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UoImNvbmZpZyIsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0NvbmZpZ3VyYXRpb24sIG51bGwsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IsIHNlcnZlckNvbmZpZ3VyYXRpb24pOworCQkJfQorCQl9CisJCQorCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLnVwZGF0ZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlY29yYXRpb24oQ29udHJvbERlY29yYXRpb24gZGVjb3JhdGlvbiwgSVN0YXR1cyBzdGF0dXMpIHsKKwkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQlJbWFnZSBuZXdJbWFnZSA9IG51bGw7CisJCQlGaWVsZERlY29yYXRpb25SZWdpc3RyeSByZWdpc3RyeSA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKTsKKwkJCXN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpIHsKKwkJCQljYXNlIElTdGF0dXMuSU5GTzoKKwkJCQkJLy9uZXdJbWFnZSA9IHJlZ2lzdHJ5LmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfSU5GT1JNQVRJT04pLmdldEltYWdlKCk7CisJCQkJCW5ld0ltYWdlID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19SRVFVSVJFRCkuZ2V0SW1hZ2UoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJU3RhdHVzLldBUk5JTkc6CisJCQkJCW5ld0ltYWdlID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19XQVJOSU5HKS5nZXRJbWFnZSgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElTdGF0dXMuRVJST1I6CisJCQkJCW5ld0ltYWdlID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19FUlJPUikuZ2V0SW1hZ2UoKTsKKwkJCX0KKwkJCWRlY29yYXRpb24uc2V0RGVzY3JpcHRpb25UZXh0KHN0YXR1cy5nZXRNZXNzYWdlKCkpOworCQkJZGVjb3JhdGlvbi5zZXRJbWFnZShuZXdJbWFnZSk7CisJCQlkZWNvcmF0aW9uLnNob3coKTsKKwkJfSBlbHNlIHsKKwkJCWRlY29yYXRpb24uc2V0RGVzY3JpcHRpb25UZXh0KG51bGwpOworCQkJZGVjb3JhdGlvbi5oaWRlKCk7CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsKQorCQkJc2VydmVyTmFtZS5zZXRGb2N1cygpOworCQllbHNlIGlmIChzZXJ2ZXJDb25maWd1cmF0aW9uICE9IG51bGwpCisJCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldEZvY3VzKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDZhOGNkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvci5qYXZhCkBAIC0wLDAgKzEsOTgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7CisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuKjsKKy8qKgorICogQSBtdWx0aS1wYWdlIHNlcnZlciByZXNvdXJjZSBlZGl0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IHsKKwkvKioKKwkgKiBJbnRlcm5hbCBwYXJ0IGFuZCBzaGVsbCBhY3RpdmF0aW9uIGxpc3RlbmVyCisJICovCisJY2xhc3MgQWN0aXZhdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2hlbGxBZGFwdGVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lciB7CisJCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZkFjdGl2ZVBhcnQ7CisJCXByaXZhdGUgYm9vbGVhbiBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKKwkJCisJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgeworCQkJZkFjdGl2ZVBhcnQgPSBwYXJ0OworCQkJaGFuZGxlQWN0aXZhdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKworCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQorCisJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7CisJCQlmQWN0aXZlUGFydCA9IG51bGw7CisJCX0KKworCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNoZWxsQWN0aXZhdGVkKFNoZWxsRXZlbnQgZSkgeworCQkJaGFuZGxlQWN0aXZhdGlvbigpOworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIGhhbmRsZUFjdGl2YXRpb24oKSB7CisJCQlpZiAoZklzSGFuZGxpbmdBY3RpdmF0aW9uKQorCQkJCXJldHVybjsKKwkJCQorCQkJaWYgKGZBY3RpdmVQYXJ0ID09IFNlcnZlckVkaXRvci50aGlzKSB7CisJCQkJZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gdHJ1ZTsKKwkJCQl0cnkgeworCQkJCQljaGVja1Jlc291cmNlU3RhdGUoKTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwljbGFzcyBMaWZlY3ljbGVMaXN0ZW5lciBpbXBsZW1lbnRzIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisJCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgb2xkU2VydmVyKSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKwkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIG9sZFNlcnZlcikgeworCQkJLy8gZG8gbm90aGluZworCQl9CisJCXB1YmxpYyB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBvbGRTZXJ2ZXIpIHsKKwkJCWlmIChvbGRTZXJ2ZXIuZXF1YWxzKHNlcnZlcikgJiYgIWlzRGlydHkoKSkKKwkJCQljbG9zZUVkaXRvcigpOworCQl9CisJfQorCisJcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7CisJcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJJZDsKKwlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZlck5hbWU7CisKKwlwcm90ZWN0ZWQgR2xvYmFsQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXI7CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKKworCXByb3RlY3RlZCBJQWN0aW9uIHVuZG9BY3Rpb247CisJcHJvdGVjdGVkIElBY3Rpb24gcmVkb0FjdGlvbjsKKworCXByb3RlY3RlZCBUZXh0QWN0aW9uIGN1dEFjdGlvbjsKKwlwcm90ZWN0ZWQgVGV4dEFjdGlvbiBjb3B5QWN0aW9uOworCXByb3RlY3RlZCBUZXh0QWN0aW9uIHBhc3RlQWN0aW9uOworCXByb3RlY3RlZCBib29sZWFuIHVwZGF0aW5nQWN0aW9uczsKKworCXByb3RlY3RlZCBJQWN0aW9uW10gZWRpdG9yQWN0aW9uczsKKworCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdDxJRWRpdG9yUGFydD4gc2VydmVyUGFnZXM7CisKKwkvLyBvbiBmb2N1cyBjaGFuZ2UgZmxhZworCXByb3RlY3RlZCBib29sZWFuIHJlc291cmNlRGVsZXRlZDsKKworCS8vIGlucHV0IGdpdmVuIHRvIHRoZSBjb250YWluZWQgcGFnZXMKKwlwcm90ZWN0ZWQgSVNlcnZlckVkaXRvclBhcnRJbnB1dCBlZGl0b3JQYXJ0SW5wdXQ7CisKKwkvLyBzdGF0dXMgbGluZSBhbmQgc3RhdHVzCisJcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXM7CisJcHJvdGVjdGVkIFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIHN0YXR1c0l0ZW07CisKKwlwcml2YXRlIEFjdGl2YXRpb25MaXN0ZW5lciBhY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgQWN0aXZhdGlvbkxpc3RlbmVyKCk7CisJcHJvdGVjdGVkIExpZmVjeWNsZUxpc3RlbmVyIHJlc291cmNlTGlzdGVuZXI7CisKKwkvLyB1c2VkIGZvciBkaXNhYmxpbmcgcmVzb3VyY2UgY2hhbmdlIGNoZWNrIHdoZW4gc2F2aW5nIHRocm91Z2ggZWRpdG9yCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNTYXZpbmcgPSBmYWxzZTsKKworCXByb3RlY3RlZCBNYXA8SUVkaXRvclBhcnQsIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4gcGFnZVRvRmFjdG9yeSA9IG5ldyBIYXNoTWFwPElFZGl0b3JQYXJ0LCBJU2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+KCk7CisKKwkvKioKKwkgKiBTZXJ2ZXJFZGl0b3IgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgU2VydmVyRWRpdG9yKCkgeworCQlzdXBlcigpOworCQkKKwkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOworCQkKKwkJdW5kb0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZ2V0Q29tbWFuZE1hbmFnZXIoKS51bmRvKHNlcnZlcklkKTsKKwkJCX0KKwkJfTsKKwkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJdW5kb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1VORE8pKTsKKwkJLy91bmRvQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPX0hPVkVSKSk7CisJCS8vdW5kb0FjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ET19ESVNBQkxFRCkpOworCQkKKwkJcmVkb0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZ2V0Q29tbWFuZE1hbmFnZXIoKS5yZWRvKHNlcnZlcklkKTsKKwkJCX0KKwkJfTsKKwkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJcmVkb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE8pKTsKKwkJLy9yZWRvQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPX0hPVkVSKSk7CisJCS8vcmVkb0FjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUkVET19ESVNBQkxFRCkpOworCX0KKworCS8qKgorCSAqIENsb3NlIHRoZSBlZGl0b3IgY29ycmVjdGx5LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNsb3NlRWRpdG9yKCkgeworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWdldEVkaXRvclNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoU2VydmVyRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKKwkJTGlzdDxJQWN0aW9uPiBhY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQkKKwkJLy8gYWRkIHNlcnZlciBhY3Rpb25zCisJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gU2VydmVyRWRpdG9yQ29yZS5nZXRTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3JpZXMoKS5pdGVyYXRvcigpOworCQkJU3RyaW5nIGlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkgZmFjdG9yeSA9IChTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7CisJCQkJaWYgKGZhY3Rvcnkuc3VwcG9ydHNTZXJ2ZXJFbGVtZW50VHlwZShpZCkgJiYgZmFjdG9yeS5zaG91bGREaXNwbGF5KHNlcnZlcikpCisJCQkJCWFjdGlvbkxpc3QuYWRkKGZhY3RvcnkuY3JlYXRlQWN0aW9uKGdldEVkaXRvclNpdGUoKSwgZWRpdG9yUGFydElucHV0KSk7CisJCQl9CisJCX0KKworCQllZGl0b3JBY3Rpb25zID0gbmV3IElBY3Rpb25bYWN0aW9uTGlzdC5zaXplKCldOworCQlhY3Rpb25MaXN0LnRvQXJyYXkoZWRpdG9yQWN0aW9ucyk7CisJfQorCisJcHVibGljIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSBnZXRQYWdlRmFjdG9yeShTZXJ2ZXJFZGl0b3JQYXJ0IHBhcnQpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBwYWdlVG9GYWN0b3J5LmdldChwYXJ0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IuCisJICogPHA+CisJICogU3ViY2xhc3NlcyBvZiA8Y29kZT5NdWx0aVBhZ2VFZGl0b3I8L2NvZGU+IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgorCSAqIDwvcD4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKKwkJdHJ5IHsKKwkJCWludCBpbmRleCA9IDA7CisJCQlzZXJ2ZXJQYWdlcyA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7CisJCQkKKwkJCS8vIGFkZCBlZGl0b3IgcGFnZXMKKwkJCWludCBwYWdlQ291bnQgPSAwOworCQkJCisJCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gbnVsbDsKKwkJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwpCisJCQkJc2VydmVyVHlwZUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOworCQkJCisJCQlJdGVyYXRvciBpdGVyYXRvciA9IFNlcnZlckVkaXRvckNvcmUuZ2V0U2VydmVyRWRpdG9yUGFnZUZhY3RvcmllcygpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5IGZhY3RvcnkgPSAoSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7CisJCQkJaWYgKGZhY3Rvcnkuc3VwcG9ydHNUeXBlKHNlcnZlclR5cGVJZCkgJiYgZmFjdG9yeS5zaG91bGRDcmVhdGVQYWdlKHNlcnZlcikpIHsKKwkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQWRkaW5nIHBhZ2U6ICIgKyBmYWN0b3J5LmdldElkKCkgKyAiICIgKyBlZGl0b3JQYXJ0SW5wdXQpOworCQkJCQl0cnkgeworCQkJCQkJSUVkaXRvclBhcnQgcGFnZSA9IGZhY3RvcnkuY3JlYXRlUGFnZSgpOworCQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgeworCQkJCQkJCXBhZ2VUb0ZhY3RvcnkucHV0KHBhZ2UsIGZhY3RvcnkpOworCQkJCQkJCWluZGV4ID0gYWRkUGFnZShwYWdlLCBlZGl0b3JQYXJ0SW5wdXQpOworCQkJCQkJCXNldFBhZ2VUZXh0KGluZGV4LCBmYWN0b3J5LmdldE5hbWUoKSk7CisJCQkJCQkJCisJCQkJCQkJc2VydmVyUGFnZXMuYWRkKHBhZ2UpOworCQkJCQkKKwkJCQkJCQlwYWdlQ291bnQgKys7CisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZGlzcGxheSBlZGl0b3IgcGFnZSAiICsgZmFjdG9yeS5nZXRJZCgpLCBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKHBhZ2VDb3VudCA+IDApCisJCQkJc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQorCQkJLy8gcmVnaXN0ZXIgZm9yIGV2ZW50cyB0aGF0IG1pZ2h0IGNoYW5nZSB0aGUgY3V0L2NvcHkvcGFzdGUgYWN0aW9ucworCQkJaW50IGNvdW50ID0gZ2V0UGFnZUNvdW50KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKGkpOworCQkJCXJlZ2lzdGVyRXZlbnRzKGNvbnRyb2wpOworCQkJfQorCQkJdXBkYXRlQWN0aW9ucygpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgc2VydmVyIGVkaXRvciBwYWdlcyIsIGUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKGFjdGl2YXRpb25MaXN0ZW5lciAhPSBudWxsKSB7CisJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKKwkJCXdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihhY3RpdmF0aW9uTGlzdGVuZXIpOworCQkJU2hlbGwgc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKKwkJCWlmIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpCisJCQkJc2hlbGwucmVtb3ZlU2hlbGxMaXN0ZW5lcihhY3RpdmF0aW9uTGlzdGVuZXIpOworCQkJYWN0aXZhdGlvbkxpc3RlbmVyID0gbnVsbDsKKwkJfQorCQkKKwkJaWYgKHJlc291cmNlTGlzdGVuZXIgIT0gbnVsbCkKKwkJCVNlcnZlckNvcmUucmVtb3ZlU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIocmVzb3VyY2VMaXN0ZW5lcik7CisJCQorCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsICYmICFzZXJ2ZXIuZ2V0TmFtZSgpLmVxdWFscyhzZXJ2ZXJOYW1lKSkgeworCQkJLy8gb25seSBwcm9tcHQgaWYgdGhlIHNlcnZlciBpcyBpbiB0aGUgd29ya3NwYWNlIG9yIHRoZXJlIGlzIGEgY29uZmlndXJhdGlvbgorCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbCB8fCAoKFNlcnZlcilzZXJ2ZXIpLmdldEZpbGUoKSAhPSBudWxsKSB7CisJCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZWRpdG9yU2VydmVyRWRpdG9yOworCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZWRpdG9yUmVuYW1lRmlsZXM7CisJCQkJaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB0aXRsZSwgIG1lc3NhZ2UpKQorCQkJCQl0cnkgeworCQkJCQkJKChTZXJ2ZXJXb3JraW5nQ29weSlzZXJ2ZXIpLnJlbmFtZUZpbGVzKG51bGwpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVuYW1pbmcgc2VydmVyIiwgZSk7CisJCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJc3VwZXIuZGlzcG9zZSgpOworCQlpZiAoY29tbWFuZE1hbmFnZXIgIT0gbnVsbCkgeworCQkJY29tbWFuZE1hbmFnZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQkKKwkJCWlmIChzZXJ2ZXJJZCAhPSBudWxsKQorCQkJCWNvbW1hbmRNYW5hZ2VyLnJlbGVhc2VDb21tYW5kTWFuYWdlcihzZXJ2ZXJJZCk7CisJCQkKKwkJCWNvbW1hbmRNYW5hZ2VyID0gbnVsbDsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IuCisJICogPHA+CisJICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZQorCSAqIGZvciBhbiBlZGl0b3IuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+CisJICogPC9wPgorCSAqCisJICogQHNlZSBJRWRpdG9yUGFydAorCSAqLworCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJLy8gc2V0IHRoZSBpc1NhdmluZyBmbGFnIHRvIHRydWUKKwkJaXNTYXZpbmcgPSB0cnVlOworCQkKKwkJLy8gY2hlY2sgcGFnZXMgZm9yIGVycm9ycyBmaXJzdAorCQlqYXZhLnV0aWwuTGlzdDxTdHJpbmc+IGVycm9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlclBhZ2VzLml0ZXJhdG9yKCk7CisJCWludCBjb3VudCA9IDA7CisJCWludCBtYXhTZXZlcml0eSA9IC0xOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlJRWRpdG9yUGFydCBwYXJ0ID0gKElFZGl0b3JQYXJ0KSBpdGVyYXRvci5uZXh0KCk7CisJCQlpZiAocGFydCBpbnN0YW5jZW9mIFNlcnZlckVkaXRvclBhcnQpIHsKKwkJCQlJU3RhdHVzW10gc3RhdHVzMiA9ICgoU2VydmVyRWRpdG9yUGFydCkgcGFydCkuZ2V0U2F2ZVN0YXR1cygpOworCQkJCWlmIChzdGF0dXMyICE9IG51bGwpIHsKKwkJCQkJaW50IHNpemUgPSBzdGF0dXMyLmxlbmd0aDsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkJCWVycm9ycy5hZGQoIlsiICsgZ2V0UGFnZVRleHQoY291bnQpICsgIl0gIiArIHN0YXR1czJbaV0uZ2V0TWVzc2FnZSgpKTsKKwkJCQkJCW1heFNldmVyaXR5ID0gTWF0aC5tYXgobWF4U2V2ZXJpdHksIHN0YXR1czJbaV0uZ2V0U2V2ZXJpdHkoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb3VudCArKzsKKwkJfQorCQlpZiAoIWVycm9ycy5pc0VtcHR5KCkgJiYgbWF4U2V2ZXJpdHkgPiBJU3RhdHVzLk9LKSB7CisJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlzYi5hcHBlbmQoTWVzc2FnZXMuZXJyb3JFZGl0b3JDYW50U2F2ZSArICJcbiIpOworCQkJaXRlcmF0b3IgPSBlcnJvcnMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCisJCQkJc2IuYXBwZW5kKCJcdCIgKyAoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKSArICJcbiIpOworCQkJCisJCQlpZiAobWF4U2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUikgeworCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRQYXJ0TmFtZSgpLCBzYi50b1N0cmluZygpKTsKKwkJCQltb25pdG9yLnNldENhbmNlbGVkKHRydWUpOworCQkJCS8vIHJlc2V0IHRoZSBpc1NhdmluZyBmbGFnCisJCQkJaXNTYXZpbmcgPSBmYWxzZTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKG1heFNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRQYXJ0TmFtZSgpLCBzYi50b1N0cmluZygpKTsKKwkJCWVsc2UgLy8gaWYgKG1heFNldmVyaXR5ID09IElTdGF0dXMuSU5GTykKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgZ2V0UGFydE5hbWUoKSwgc2IudG9TdHJpbmcoKSk7CisJCX0KKwkJCisJCXRyeSB7CisJCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7CisJCQlpbnQgdGlja3MgPSAyMDAwOworCQkJU3RyaW5nIG5hbWUgPSAiIjsKKwkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCQluYW1lID0gc2VydmVyLmdldE5hbWUoKTsKKwkJCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIG5hbWUpLCB0aWNrcyk7CisJCQlpZiAoc2VydmVyICE9IG51bGwpCisJCQkJdGlja3MgLz0gMjsKKwkJCQorCQkJaWYgKHNlcnZlciAhPSBudWxsKSAgeworCQkJCXNlcnZlci5zYXZlKGZhbHNlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCB0aWNrcykpOworCQkJCWdldENvbW1hbmRNYW5hZ2VyKCkucmVzb3VyY2VTYXZlZChzZXJ2ZXJJZCk7CisJCQkJY29tbWFuZE1hbmFnZXIudXBkYXRlVGltZXN0YW1wcyhzZXJ2ZXJJZCk7CisJCQl9CisJCQkKKwkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOworCQkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJCXNldFBhcnROYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzZXJ2ZXIpKTsKKwkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2F2aW5nIHNlcnZlciBlZGl0b3IiLCBlKTsKKwkJCQorCQkJbW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKKwkJCQorCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZWRpdG9yU2F2ZUVycm9yRGlhbG9nOworCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5lZGl0b3JTYXZlRXJyb3JNZXNzYWdlLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsICBtZXNzYWdlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCW1vbml0b3IuZG9uZSgpOworCQl9CisJCS8vIHJlc2V0IHRoZSBpc1NhdmluZyBmbGFnCisJCWlzU2F2aW5nID0gZmFsc2U7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIFNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGVkaXRvciB0byBhbm90aGVyIG9iamVjdC4KKwkgKiA8cD4KKwkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZSBvcGVuLXNhdmUtY2xvc2UgbGlmZWN5Y2xlCisJICogZm9yIGFuIGVkaXRvci4gIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT5JRWRpdG9yUGFydDwvY29kZT4KKwkgKiA8L3A+CisJICoKKwkgKiBAc2VlIElFZGl0b3JQYXJ0CisJICovCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBGaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgorCSAqCisJICogQHBhcmFtIGkgYSBwcm9wZXJ0eSBjaGFuZ2UgdmFsdWUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGkpIHsKKwkJaWYgKGkgPT0gU2VydmVyRWRpdG9yUGFydC5QUk9QX0VSUk9SKQorCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKKwkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGkpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgZ2xvYmFsIGNvbW1hbmQgbWFuYWdlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBnbG9iYWwgY29tbWFuZCBtYW5hZ2VyCisJICovCisJcHVibGljIEdsb2JhbENvbW1hbmRNYW5hZ2VyIGdldENvbW1hbmRNYW5hZ2VyKCkgeworCQlyZXR1cm4gY29tbWFuZE1hbmFnZXI7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZWRvIGFjdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbgorCSAqLworCXB1YmxpYyBJQWN0aW9uIGdldFJlZG9BY3Rpb24oKSB7CisJCXJldHVybiByZWRvQWN0aW9uOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgdW5kbyBhY3Rpb24uCisJICoKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24KKwkgKi8KKwlwdWJsaWMgSUFjdGlvbiBnZXRVbmRvQWN0aW9uKCkgeworCQlyZXR1cm4gdW5kb0FjdGlvbjsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogU2V0cyB0aGUgY3Vyc29yIGFuZCBzZWxlY3Rpb24gc3RhdGUgZm9yIHRoaXMgZWRpdG9yIHRvIHRoZSBwYXNzYWdlIGRlZmluZWQKKwkgKiBieSB0aGUgZ2l2ZW4gbWFya2VyLgorCSAqIDxwPgorCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLiAgRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPklFZGl0b3JQYXJ0PC9jb2RlPgorCSAqIDwvcD4KKwkgKgorCSAqIEBzZWUgSUVkaXRvclBhcnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIGN1dCwgY29weSwgYW5kIHBhc3RlIGFjdGlvbnMuCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlQWN0aW9uc0ltcGwoKSB7CisJCWlmICh1cGRhdGluZ0FjdGlvbnMpCisJCQlyZXR1cm47CisJCQorCQl1cGRhdGluZ0FjdGlvbnMgPSB0cnVlOworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXVwZGF0aW5nQWN0aW9ucyA9IGZhbHNlOworCQkJCXVwZGF0ZUFjdGlvbnMoKTsKKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogVXBkYXRlIHRoZSBjdXQsIGNvcHksIGFuZCBwYXN0ZSBhY3Rpb25zLgorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbnMoKSB7CisJCWN1dEFjdGlvbi51cGRhdGUoKTsKKwkJY29weUFjdGlvbi51cGRhdGUoKTsKKwkJcGFzdGVBY3Rpb24udXBkYXRlKCk7CisJfQorCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgY3V0LCBjb3B5LCBhbmQgcGFzdGUgYWN0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXNMaW5lKCkgeworCQlpZiAoc3RhdHVzSXRlbSAhPSBudWxsKSB7CisJCQlib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7CisJCQlpZiAoc2VydmVyICE9IG51bGwgJiYgY29tbWFuZE1hbmFnZXIuaXNSZWFkT25seShzZXJ2ZXJJZCkpCisJCQkJcmVhZE9ubHkgPSB0cnVlOworCQkJCisJCQlpZiAocmVhZE9ubHkpCisJCQkJc3RhdHVzSXRlbS5zZXRUZXh0KE1lc3NhZ2VzLmVkaXRvclJlYWRPbmx5KTsKKwkJCWVsc2UKKwkJCQlzdGF0dXNJdGVtLnNldFRleHQoTWVzc2FnZXMuZWRpdG9yV3JpdGFibGUpOworCQl9CisKKwkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgeworCQkJCUlGaWxlW10gZmlsZXMgPSBjb21tYW5kTWFuYWdlci5nZXRSZWFkT25seUZpbGVzKHNlcnZlcklkKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmICghZmlyc3QpCisJCQkJCQlzYi5hcHBlbmQoIiwgIik7CisJCQkJCXNiLmFwcGVuZChmaWxlc1tpXS5nZXROYW1lKCkpOworCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCS8qaWYgKHNlcnZlckNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgeworCQkJCUlGaWxlW10gZmlsZXMgPSBjb21tYW5kTWFuYWdlci5nZXRSZWFkT25seUZpbGVzKHNlcnZlckNvbmZpZ3VyYXRpb25JZCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoIWZpcnN0KQorCQkJCQkJc2IuYXBwZW5kKCIsICIpOworCQkJCQlzYi5hcHBlbmQoZmlsZXNbaV0uZ2V0TmFtZSgpKTsKKwkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQl9CisJCQl9Ki8KKwkJCWlmIChzYi5sZW5ndGgoKSA+IDEpCisJCQkJc3RhdHVzLnNldE1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuZWRpdG9yUmVhZE9ubHlGaWxlcywgc2IudG9TdHJpbmcoKSkpOworCQkJZWxzZQorCQkJCXN0YXR1cy5zZXRNZXNzYWdlKCIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXR1c0Vycm9yKCkgeworCQlpZiAoc3RhdHVzID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlTdHJpbmcgZXJyb3IgPSBudWxsOworCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0QWN0aXZlRWRpdG9yKCk7CisJCWlmIChwYXJ0IGluc3RhbmNlb2YgU2VydmVyRWRpdG9yUGFydCkKKwkJCWVycm9yID0gKChTZXJ2ZXJFZGl0b3JQYXJ0KSBwYXJ0KS5nZXRFcnJvck1lc3NhZ2UoKTsKKwkJCisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVyUGFnZXMuaXRlcmF0b3IoKTsKKwkJaW50IGNvdW50ID0gMDsKKwkJd2hpbGUgKGVycm9yID09IG51bGwgJiYgaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlwYXJ0ID0gKElFZGl0b3JQYXJ0KSBpdGVyYXRvci5uZXh0KCk7CisJCQlpZiAocGFydCBpbnN0YW5jZW9mIFNlcnZlckVkaXRvclBhcnQpIHsKKwkJCQllcnJvciA9ICgoU2VydmVyRWRpdG9yUGFydCkgcGFydCkuZ2V0RXJyb3JNZXNzYWdlKCk7CisJCQkJaWYgKGVycm9yICE9IG51bGwpCisJCQkJCWVycm9yID0gIlsiICsgZ2V0UGFnZVRleHQoY291bnQpICsgIl0gIiArIGVycm9yOworCQkJfQorCQkJY291bnQgKys7CisJCX0KKwkJc3RhdHVzLnNldEVycm9yTWVzc2FnZShlcnJvcik7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7CisJCXN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKKwkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKKwl9CisJCisJLyoqCisJICogU2V0IHRoZSBzdGF0dXMuCisJICogCisJICogQHBhcmFtIHN0YXR1cyBhIHN0YXR1cyBsaW5lIG1hbmFnZXIKKwkgKiBAcGFyYW0gaXRlbSBhIHN0YXR1cyBjb250cmlidXRpb24gaXRlbQorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzLCBTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbSBpdGVtKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCQl0aGlzLnN0YXR1c0l0ZW0gPSBpdGVtOworCQl1cGRhdGVTdGF0dXNFcnJvcigpOworCX0KKwkKKwkvKioKKwkgKiBSZWdpc3RlciBmb3Iga2V5IGFuZCB0cmF2ZXJzYWwgZXZlbnRzIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBjdXQvY29weS9wYXN0ZSBhY3Rpb25zLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRXZlbnRzKENvbnRyb2wgY29udHJvbCkgeworCQlpZiAoY29udHJvbCA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0IHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBDb21ibykgeworCQkJLy8gcmVnaXN0ZXIgdGhlIHdvcmxkLi4uIGFueSBvZiB0aGVzZSBhY3Rpb25zIGNvdWxkIGNhdXNlIHRoZSBzdGF0ZSB0byBjaGFuZ2UKKwkJCWNvbnRyb2wuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBldmVudCkgeworCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOworCQkJCX0KKwkJCX0pOworCQkJY29udHJvbC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgeworCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOworCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBldmVudCkgeworCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOworCQkJCX0KKwkJCX0pOworCQkJY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7CisJCQkJCS8vIGRvIG5vdGhpbmcKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7CisJCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7CisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBldmVudCkgeworCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOworCQkJCX0KKwkJCX0pOworCQkJY29udHJvbC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZXZlbnQpIHsKKwkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZXZlbnQpIHsKKwkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKKwkJCQl9CisJCQl9KTsKKwkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkgeworCQkJCVRleHQgdGV4dCA9IChUZXh0KSBjb250cm9sOworCQkJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7CisJCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOworCQkJCQl9CisJCQkJfSk7CisJCQkJdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOworCQkJCQl9CisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfSBlbHNlIHsKKwkJCQlDb21ibyBjb21ibyA9IChDb21ibykgY29udHJvbDsKKwkJCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKKwkJCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOworCQkJCQl9CisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9CisJCQorCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgeworCQkJQ29udHJvbFtdIGNoaWxkcmVuID0gKChDb21wb3NpdGUpY29udHJvbCkuZ2V0Q2hpbGRyZW4oKTsKKwkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisJCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQkJCXJlZ2lzdGVyRXZlbnRzKGNoaWxkcmVuW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHBhcnQgd2l0aCBhIHNpdGUgYW5kIGlucHV0LgorCSAqIDxwPgorCSAqIFN1YmNsYXNzZXMgb2YgPGNvZGU+RWRpdG9yUGFydDwvY29kZT4gbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuICBXaXRoaW4KKwkgKiB0aGUgaW1wbGVtZW50YXRpb24gc3ViY2xhc3NlcyBzaG91bGQgdmVyaWZ5IHRoYXQgdGhlIGlucHV0IHR5cGUgaXMgYWNjZXB0YWJsZQorCSAqIGFuZCB0aGVuIHNhdmUgdGhlIHNpdGUgYW5kIGlucHV0LiAgSGVyZSBpcyBzYW1wbGUgY29kZToKKwkgKiA8L3A+CisJICogPHByZT4KKwkgKgkJaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSkKKwkgKgkJCXRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigiSW52YWxpZCBJbnB1dDogTXVzdCBiZSBJRmlsZUVkaXRvcklucHV0Iik7CisJICoJCXNldFNpdGUoc2l0ZSk7CisJICoJCXNldElucHV0KGVkaXRvcklucHV0KTsKKwkgKiA8L3ByZT4KKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKKwkJY29tbWFuZE1hbmFnZXIgPSBHbG9iYWxDb21tYW5kTWFuYWdlci5nZXRJbnN0YW5jZSgpOworCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKKworCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7CisJCQlJRmlsZUVkaXRvcklucHV0IGZlaSA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKKwkJCUlGaWxlIGZpbGUgPSBmZWkuZ2V0RmlsZSgpOworCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7CisJCQkJSVNlcnZlciBzZXJ2ZXIyID0gU2VydmVyVUlQbHVnaW4uZmluZFNlcnZlcihmaWxlKTsKKwkJCQlpZiAoc2VydmVyMiAhPSBudWxsKQorCQkJCQlzZXJ2ZXJJZCA9IHNlcnZlcjIuZ2V0SWQoKTsKKwkJCX0KKwkJCWlmIChzZXJ2ZXJJZCA9PSBudWxsKSB7CisJCQkJaWYgKGZpbGUgPT0gbnVsbCkKKwkJCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRWRpdG9yLCBNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWUpKTsKKwkJCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JFZGl0b3IsIGZpbGUuZ2V0TmFtZSgpKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU2VydmVyRWRpdG9ySW5wdXQpIHsKKwkJCUlTZXJ2ZXJFZGl0b3JJbnB1dCBzZWkgPSAoSVNlcnZlckVkaXRvcklucHV0KSBpbnB1dDsKKwkJCXNlcnZlcklkID0gc2VpLmdldFNlcnZlcklkKCk7CisJCX0KKworCQlpZiAoc2VydmVySWQgIT0gbnVsbCkgeworCQkJY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZE1hbmFnZXIoc2VydmVySWQpOworCQkJc2VydmVyID0gY29tbWFuZE1hbmFnZXIuZ2V0U2VydmVyUmVzb3VyY2Uoc2VydmVySWQpOworCQl9CisKKwkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgeworCQkJc2V0UGFydE5hbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KHNlcnZlcikpOworCQkJc2V0VGl0bGVJbWFnZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKHNlcnZlcikpOworCQkJc2V0VGl0bGVUb29sVGlwKHNlcnZlcklkKTsKKwkJCXNlcnZlck5hbWUgPSBzZXJ2ZXIuZ2V0TmFtZSgpOworCQl9IGVsc2UKKwkJCXNldFBhcnROYW1lKCItIik7CisJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOworCQlsYWJlbFByb3ZpZGVyID0gbnVsbDsKKwkJCisJCWN1dEFjdGlvbiA9IG5ldyBUZXh0QWN0aW9uKHNpdGUuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFRleHRBY3Rpb24uQ1VUX0FDVElPTik7CisJCWNvcHlBY3Rpb24gPSBuZXcgVGV4dEFjdGlvbihzaXRlLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBUZXh0QWN0aW9uLkNPUFlfQUNUSU9OKTsKKwkJcGFzdGVBY3Rpb24gPSBuZXcgVGV4dEFjdGlvbihzaXRlLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBUZXh0QWN0aW9uLlBBU1RFX0FDVElPTik7CisJCQorCQlsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCWlmIChHbG9iYWxDb21tYW5kTWFuYWdlci5QUk9QX0RJUlRZLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKwkJCQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldE9sZFZhbHVlKCk7CisJCQkJCWlmIChvYmogPT0gc2VydmVySWQpCisJCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7CisJCQkJfSBlbHNlIGlmIChHbG9iYWxDb21tYW5kTWFuYWdlci5QUk9QX1VORE8uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgeworCQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKKwkJCQkJaWYgKG9iaiA9PSBzZXJ2ZXJJZCkKKwkJCQkJCXVwZGF0ZVVuZG9BY3Rpb24oKTsKKwkJCQl9IGVsc2UgaWYgKEdsb2JhbENvbW1hbmRNYW5hZ2VyLlBST1BfUkVETy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CisJCQkJCU9iamVjdCBvYmogPSBldmVudC5nZXRPbGRWYWx1ZSgpOworCQkJCQlpZiAob2JqID09IHNlcnZlcklkKQorCQkJCQkJdXBkYXRlUmVkb0FjdGlvbigpOworCQkJCX0gZWxzZSBpZiAoR2xvYmFsQ29tbWFuZE1hbmFnZXIuUFJPUF9SRUxPQUQuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgeworCQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKKwkJCQkJaWYgKG9iaiA9PSBzZXJ2ZXJJZCkgeworCQkJCQkJc2VydmVyID0gY29tbWFuZE1hbmFnZXIuZ2V0U2VydmVyUmVzb3VyY2Uoc2VydmVySWQpOworCQkJCQkJcmVmcmVzaCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCQlpZiAoc2VydmVyICE9IG51bGwgJiYgY29tbWFuZE1hbmFnZXIuaXNEaXJ0eShzZXJ2ZXJJZCkpCisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7CisJCQorCQljb21tYW5kTWFuYWdlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCS8vIGNyZWF0ZSBlZGl0b3IgaW5wdXQKKwkJU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBzZXJ2ZXJDb21tYW5kTWFuYWdlciA9IG51bGw7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCXNlcnZlckNvbW1hbmRNYW5hZ2VyID0gbmV3IFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIodGhpcywgc2VydmVySWQsIGNvbW1hbmRNYW5hZ2VyKTsKKwkJZWRpdG9yUGFydElucHV0ID0gY29tbWFuZE1hbmFnZXIuZ2V0UGFydElucHV0KHNlcnZlcklkLCBzZXJ2ZXJDb21tYW5kTWFuYWdlcik7CisJCQorCQljcmVhdGVBY3Rpb25zKCk7CisJCQorCQkvLyBhZGQgcmVzb3VyY2UgbGlzdGVuZXIKKwkJcmVzb3VyY2VMaXN0ZW5lciA9IG5ldyBMaWZlY3ljbGVMaXN0ZW5lcigpOworCQlTZXJ2ZXJDb3JlLmFkZFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHJlc291cmNlTGlzdGVuZXIpOworCQkKKwkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7CisJCXdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcihhY3RpdmF0aW9uTGlzdGVuZXIpOworCQl3aW5kb3cuZ2V0U2hlbGwoKS5hZGRTaGVsbExpc3RlbmVyKGFjdGl2YXRpb25MaXN0ZW5lcik7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHNhdmUKKwkgKiBvcGVyYXRpb24uCisJICogPHA+CisJICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZQorCSAqIGZvciBhbiBlZGl0b3IuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+CisJICogPC9wPgorCSAqCisJICogQHNlZSBJRWRpdG9yUGFydAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisJCWlmIChjb21tYW5kTWFuYWdlciAhPSBudWxsKSB7CisJCQlpZiAoc2VydmVyICE9IG51bGwgJiYgY29tbWFuZE1hbmFnZXIuaXNEaXJ0eShzZXJ2ZXJJZCkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlICJzYXZlIGFzIiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkIGJ5IHRoaXMgZWRpdG9yLgorCSAqIDxwPgorCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZSBsaWZlY3ljbGUKKwkgKiBmb3IgYW4gZWRpdG9yLiAgRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPklFZGl0b3JQYXJ0PC9jb2RlPgorCSAqIDwvcD4KKwkgKgorCSAqIEBzZWUgSUVkaXRvclBhcnQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIHVuZG8gYWN0aW9uLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVVuZG9BY3Rpb24oKSB7CisJCUlVbmRvYWJsZU9wZXJhdGlvbiBjb21tYW5kID0gY29tbWFuZE1hbmFnZXIuZ2V0VW5kb0NvbW1hbmQoc2VydmVySWQpOworCQlpZiAoY29tbWFuZCA9PSBudWxsKSB7CisJCQl1bmRvQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuZWRpdG9yVW5kb0Rpc2FibGVkKTsKKwkJCXVuZG9BY3Rpb24uc2V0VG9vbFRpcFRleHQoIiIpOworCQkJdW5kb0FjdGlvbi5zZXREZXNjcmlwdGlvbigiIik7CisJCQl1bmRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCQl9IGVsc2UgeworCQkJU3RyaW5nIHRleHQgPSBOTFMuYmluZChNZXNzYWdlcy5lZGl0b3JVbmRvRW5hYmxlZCwgbmV3IE9iamVjdFtdIHtjb21tYW5kLmdldExhYmVsKCl9KTsKKwkJCXVuZG9BY3Rpb24uc2V0VGV4dCh0ZXh0KTsKKwkJCXVuZG9BY3Rpb24uc2V0VG9vbFRpcFRleHQoY29tbWFuZC5nZXRMYWJlbCgpKTsKKwkJCXVuZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oY29tbWFuZC5nZXRMYWJlbCgpKTsKKwkJCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZSB0aGUgcmVkbyBhY3Rpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVkb0FjdGlvbigpIHsKKwkJSVVuZG9hYmxlT3BlcmF0aW9uIGNvbW1hbmQgPSBjb21tYW5kTWFuYWdlci5nZXRSZWRvQ29tbWFuZChzZXJ2ZXJJZCk7CisJCWlmIChjb21tYW5kID09IG51bGwpIHsKKwkJCXJlZG9BY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5lZGl0b3JSZWRvRGlzYWJsZWQpOworCQkJcmVkb0FjdGlvbi5zZXRUb29sVGlwVGV4dCgiIik7CisJCQlyZWRvQWN0aW9uLnNldERlc2NyaXB0aW9uKCIiKTsKKwkJCXJlZG9BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgdGV4dCA9IE5MUy5iaW5kKE1lc3NhZ2VzLmVkaXRvclJlZG9FbmFibGVkLCBuZXcgT2JqZWN0W10ge2NvbW1hbmQuZ2V0TGFiZWwoKX0pOworCQkJcmVkb0FjdGlvbi5zZXRUZXh0KHRleHQpOworCQkJcmVkb0FjdGlvbi5zZXRUb29sVGlwVGV4dChjb21tYW5kLmdldExhYmVsKCkpOworCQkJcmVkb0FjdGlvbi5zZXREZXNjcmlwdGlvbihjb21tYW5kLmdldExhYmVsKCkpOworCQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOworCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgY3V0IGFjdGlvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uCisJICovCisJcHVibGljIElBY3Rpb24gZ2V0Q3V0QWN0aW9uKCkgeworCQlyZXR1cm4gY3V0QWN0aW9uOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGNvcHkgYWN0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24KKwkgKi8KKwlwdWJsaWMgSUFjdGlvbiBnZXRDb3B5QWN0aW9uKCkgeworCQlyZXR1cm4gY29weUFjdGlvbjsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBwYXN0ZSBhY3Rpb24uCisJICogCisJICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbgorCSAqLworCXB1YmxpYyBJQWN0aW9uIGdldFBhc3RlQWN0aW9uKCkgeworCQlyZXR1cm4gcGFzdGVBY3Rpb247CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGVkaXRvciBhY3Rpb25zLgorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24KKwkgKi8KKwlwdWJsaWMgSUFjdGlvbltdIGdldEVkaXRvckFjdGlvbnMoKSB7CisJCXJldHVybiBlZGl0b3JBY3Rpb25zOworCX0KKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIHNlcnZlciBwYWdlcyB3aXRoIG5ldyBpbnB1dC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKCkgeworCQkvLyBjcmVhdGUgZWRpdG9yIGlucHV0CisJCVNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgc2VydmVyQ29tbWFuZE1hbmFnZXIgPSBudWxsOworCQlpZiAoc2VydmVyICE9IG51bGwpCisJCQlzZXJ2ZXJDb21tYW5kTWFuYWdlciA9IG5ldyBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyKHRoaXMsIHNlcnZlcklkLCBjb21tYW5kTWFuYWdlcik7CisJCWVkaXRvclBhcnRJbnB1dCA9IGNvbW1hbmRNYW5hZ2VyLmdldFBhcnRJbnB1dChzZXJ2ZXJJZCwgc2VydmVyQ29tbWFuZE1hbmFnZXIpOworCQkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJQYWdlcy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlJRWRpdG9yUGFydCBwYXJ0ID0gKElFZGl0b3JQYXJ0KSBpdGVyYXRvci5uZXh0KCk7CQkJCQkJCisJCQl0cnkgeworCQkJCXBhcnQuaW5pdChwYXJ0LmdldEVkaXRvclNpdGUoKSwgZWRpdG9yUGFydElucHV0KTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVmcmVzaCgpaW5nIGVkaXRvciBwYXJ0IiwgZSk7CisJCQl9CisJCX0JCisJfQorCQorCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb21wdFJlYWRPbmx5U2VydmVyRmlsZShTdHJpbmcgaWQpIHsKKwkJY29tbWFuZE1hbmFnZXIuc2V0UmVhZE9ubHkoaWQsIHRydWUpOworCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5lZGl0b3JSZXNvdXJjZU1vZGlmaWVkVGl0bGU7CisJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZWRpdG9yUmVhZE9ubHlNZXNzYWdlOworCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb21wdFJlbG9hZFNlcnZlckZpbGUoU3RyaW5nIGlkKSB7CisJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclJlc291cmNlTW9kaWZpZWRUaXRsZTsKKwkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JTZXJ2ZXJNb2RpZmllZE1lc3NhZ2U7CisJCQorCQlpZiAoTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKSkgeworCQkJLyp0cnkgeworCQkJCS8vd2MucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworCQkJCS8vVE9ETzogcmVmcmVzaCBsb2NhbCBzZXJ2ZXIKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVmcmVzaGluZyBzZXJ2ZXIiLCBlKTsKKwkJCX0qLworCQkJY29tbWFuZE1hbmFnZXIucmVsb2FkKGlkKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQlzdXBlci5zZXRGb2N1cygpOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNoZWNrUmVzb3VyY2VTdGF0ZSgpIHsKKwkJLy8gZG8gbm90IGNoZWNrIHRoZSByZXNvdXJjZSBzdGF0ZSBjaGFuZ2UgaWYgc2F2aW5nIHRocm91Z2ggdGhlIGVkaXRvcgorCQlpZiAoaXNTYXZpbmcpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gY2hlY2sgZm9yIGRlbGV0ZWQgZmlsZXMKKwkJaWYgKHJlc291cmNlRGVsZXRlZCkgeworCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VEZWxldGVUaXRsZTsKKwkJCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKKwkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCQltZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VEZWxldGVTZXJ2ZXJNZXNzYWdlLCBzZXJ2ZXIuZ2V0TmFtZSgpKTsKKwkJCVN0cmluZ1tdIGxhYmVscyA9IG5ldyBTdHJpbmdbXSB7TWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VEZWxldGVTYXZlLCBJRGlhbG9nQ29uc3RhbnRzLkNMT1NFX0xBQkVMfTsKKwkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHRpdGxlLCBudWxsLCBtZXNzYWdlLCBNZXNzYWdlRGlhbG9nLklORk9STUFUSU9OLCBsYWJlbHMsIDApOworCQkJCisJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSAwKQorCQkJCWRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCWVsc2UKKwkJCQljbG9zZUVkaXRvcigpOworCQkJcmV0dXJuOworCQl9CisJCXJlc291cmNlRGVsZXRlZCA9IGZhbHNlOworCQkKKwkJLy8gY2hlY2sgZm9yIHNlcnZlciBjaGFuZ2VzCisJCWlmIChzZXJ2ZXJJZCAhPSBudWxsKSB7CisJCQlpZiAoIWNvbW1hbmRNYW5hZ2VyLmlzRGlydHkoc2VydmVySWQpKSB7CisJCQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmhhc0NoYW5nZWQoc2VydmVySWQpKSB7CisJCQkJCUlTZXJ2ZXIgbmV3U2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKKwkJCQkJaWYgKG5ld1NlcnZlciAhPSBudWxsICYmICgoU2VydmVyKW5ld1NlcnZlcikuZ2V0VGltZXN0YW1wKCkgPiAoKFNlcnZlcilzZXJ2ZXIpLmdldFRpbWVzdGFtcCgpKQorCQkJCQkJY29tbWFuZE1hbmFnZXIucmVsb2FkKHNlcnZlcklkKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJvbXB0UmVsb2FkU2VydmVyRmlsZShzZXJ2ZXJJZCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoY29tbWFuZE1hbmFnZXIuaGFzQ2hhbmdlZChzZXJ2ZXJJZCkgJiYgIWNvbW1hbmRNYW5hZ2VyLmFyZUZpbGVzUmVhZE9ubHkoc2VydmVySWQpKQorCQkJCQlwcm9tcHRSZWxvYWRTZXJ2ZXJGaWxlKHNlcnZlcklkKTsKKwkJCQllbHNlIGlmIChjb21tYW5kTWFuYWdlci5hcmVGaWxlc1JlYWRPbmx5KHNlcnZlcklkKSAmJiAhY29tbWFuZE1hbmFnZXIuaXNSZWFkT25seShzZXJ2ZXJJZCkpCisJCQkJCXByb21wdFJlYWRPbmx5U2VydmVyRmlsZShzZXJ2ZXJJZCk7CisJCQl9CisJCQlpZiAoY29tbWFuZE1hbmFnZXIuaXNSZWFkT25seShzZXJ2ZXJJZCkgJiYgIWNvbW1hbmRNYW5hZ2VyLmFyZUZpbGVzUmVhZE9ubHkoc2VydmVySWQpKQorCQkJCWNvbW1hbmRNYW5hZ2VyLnNldFJlYWRPbmx5KHNlcnZlcklkLCBmYWxzZSk7CisJCQljb21tYW5kTWFuYWdlci51cGRhdGVUaW1lc3RhbXBzKHNlcnZlcklkKTsKKwkJfQorCQkKKwkJdXBkYXRlU3RhdHVzTGluZSgpOworCX0KKworCS8qKgorCSAqIFNldCB0aGUgdGl0bGUgdG9vbHRpcC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB0aXRsZSB0b29sdGlwCisJICovCisJcHVibGljIFN0cmluZyBnZXRUaXRsZVRvb2xUaXAoKSB7CisJCVNlcnZlciBzZXJ2ZXIyID0gKFNlcnZlcikgc2VydmVyOworCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyMi5nZXRGaWxlKCkgIT0gbnVsbCkKKwkJCXJldHVybiBzZXJ2ZXIyLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7CisJCWVsc2UgaWYgKHNlcnZlciAhPSBudWxsKQorCQkJcmV0dXJuIHNlcnZlci5nZXROYW1lKCk7CisJCWVsc2UKKwkJCXJldHVybiAiZXJyb3IiOworCX0KKworCXB1YmxpYyBpbnQgZ2V0T3JpZW50YXRpb24oKSB7CisJCXJldHVybiBXaW5kb3cuZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0Yzk0OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKKy8qKgorICogU2VydmVyIGVkaXRvciBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yLgorICovCitwdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0VESVRPUl9TRVBBUkFUT1IgPSAic2VydmVyLWVkaXRvci1hZGRpdGlvbnMiOworCisJLy8gY3VycmVudCBlZGl0b3IKKwlwcm90ZWN0ZWQgU2VydmVyRWRpdG9yIGVkaXRvcjsKKworCS8qKgorCSAqIFNlcnZlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFNlcnZlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGFjdGl2ZSBlZGl0b3IgZm9yIHRoZSBjb250cmlidXRvci4KKwkgKiA8cD4KKwkgKiBUaGUgPGNvZGU+RWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMKKwkgKiBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4gVGhpcyBnZW5lcmFsbHkgZW50YWlscyBkaXNjb25uZWN0aW5nCisJICogZnJvbSB0aGUgb2xkIGVkaXRvciwgY29ubmVjdGluZyB0byB0aGUgbmV3IGVkaXRvciwgYW5kIHVwZGF0aW5nIHRoZSBhY3Rpb25zCisJICogdG8gcmVmbGVjdCB0aGUgbmV3IGVkaXRvci4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHRhcmdldEVkaXRvciB0aGUgbmV3IHRhcmdldCBlZGl0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7CisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOworCisJCWlmICh0YXJnZXRFZGl0b3IgIT0gbnVsbCAmJiB0YXJnZXRFZGl0b3IuZXF1YWxzKGVkaXRvcikpCisJCQlyZXR1cm47CisJCQorCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOworCQlib29sZWFuIGFjdGlvbkJhcnNVcGRhdGVkID0gZmFsc2U7CisKKwkJaWYgKGVkaXRvciAhPSBudWxsKSB7CisJCQllZGl0b3Iuc2V0U3RhdHVzKG51bGwsIG51bGwpOworCQkJCisJCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzID0gYWN0aW9uQmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCQkJc3RhdHVzLnJlbW92ZUFsbCgpOworCisJCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gYWN0aW9uQmFycy5nZXRUb29sQmFyTWFuYWdlcigpOworCQkJdGJtLnJlbW92ZUFsbCgpOworCQkJCisJCQlhY3Rpb25CYXJzVXBkYXRlZCA9IHRydWU7CisJCX0KKworCQlpZiAodGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgU2VydmVyRWRpdG9yKSB7CisJCQllZGl0b3IgPSAoU2VydmVyRWRpdG9yKSB0YXJnZXRFZGl0b3I7CisJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJFZGl0b3IgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3I6ICIgKyBlZGl0b3IpOworCQkJZWRpdG9yLnVwZGF0ZVVuZG9BY3Rpb24oKTsKKwkJCWVkaXRvci51cGRhdGVSZWRvQWN0aW9uKCk7CisJCQkKKwkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwgZWRpdG9yLmdldFVuZG9BY3Rpb24oKSk7CisJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksIGVkaXRvci5nZXRSZWRvQWN0aW9uKCkpOworCQkJCisJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGVkaXRvci5nZXRDb3B5QWN0aW9uKCkpOworCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksIGVkaXRvci5nZXRDdXRBY3Rpb24oKSk7CisJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLCBlZGl0b3IuZ2V0UGFzdGVBY3Rpb24oKSk7CisJCQkKKwkJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXMgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7CisJCQlTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbmV3IFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKCJpZCIpOworCQkJc3RhdHVzLmFkZChpdGVtKTsKKworCQkJZWRpdG9yLnNldFN0YXR1cyhzdGF0dXMsIGl0ZW0pOworCQkJZWRpdG9yLnVwZGF0ZVN0YXR1c0xpbmUoKTsKKworCQkJSUFjdGlvbltdIGFjdGlvbnMgPSBlZGl0b3IuZ2V0RWRpdG9yQWN0aW9ucygpOworCQkJSVRvb2xCYXJNYW5hZ2VyIHRibSA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKKwkJCXRibS5hZGQobmV3IFNlcGFyYXRvcihTRVJWRVJfRURJVE9SX1NFUEFSQVRPUikpOworCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOworCQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJCWludCBzaXplID0gYWN0aW9ucy5sZW5ndGg7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQXR0ZW1wdGluZyB0byBhZGQgZWRpdG9yIGFjdGlvbnM6ICIgKyBzaXplKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJhY3Rpb246ICIgKyBhY3Rpb25zW2ldKTsKKwkJCQkJdGJtLmFwcGVuZFRvR3JvdXAoU0VSVkVSX0VESVRPUl9TRVBBUkFUT1IsIGFjdGlvbnNbaV0pOworCQkJCQltb2RpZmllZCA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAobW9kaWZpZWQpCisJCQkJdGJtLnVwZGF0ZShmYWxzZSk7CisJCQlhY3Rpb25CYXJzVXBkYXRlZCA9IHRydWU7CisJCX0gZWxzZQorCQkJZWRpdG9yID0gbnVsbDsKKwkJCisJCWlmIChhY3Rpb25CYXJzVXBkYXRlZCkKKwkJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE3ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLklTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKKy8qKgorICogQSBkZWZhdWx0IHNlcnZlciB0aGF0IGNhbiBiZSBjcmVhdGVkIGZvciBhIHNldCBvZiBnaXZlbgorICogbmF0dXJlcy4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkgaW1wbGVtZW50cyBJU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSB7CisJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKKwlwcml2YXRlIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSBkZWxlZ2F0ZTsKKworCS8qKgorCSAqIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkgY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQlzdXBlcigpOworCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworCX0KKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSB7CisJCXJldHVybiBlbGVtZW50OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZGVmYXVsdCBzZXJ2ZXIuCisJICoKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZGVmYXVsdCBzZXJ2ZXIuCisJICoKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcmRlci4KKwkgKgorCSAqIEByZXR1cm4gaW50CisJICovCisJcHVibGljIGludCBnZXRPcmRlcigpIHsKKwkJdHJ5IHsKKwkJCVN0cmluZyBvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIik7CisJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChvKTsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgaWRzIG9mIHRoZSBzZXJ2ZXIgcmVzb3VyY2UgZmFjdG9yaWVzIChzcGVjaWZpZWQKKwkgKiB1c2luZyBKYXZhLWltcG9ydCBzdHlsZSkgdGhhdCB0aGlzIHBhZ2UgbWF5IHN1cHBvcnQuCisJICogCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKKwkJdHJ5IHsKKwkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIiksICIsIik7CisJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQkJU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOworCQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKQorCQkJCQlsaXN0LmFkZChzdHIpOworCQkJfQorCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOworCQkJbGlzdC50b0FycmF5KHMpOworCQkJcmV0dXJuIHM7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvL1RyYWNlLnRyYWNlKCJDb3VsZCBub3QgZ2V0IHNlcnZlciByZXNvdXJjZSBmcm9tOiAiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNlcnZlclJlc291cmNlcyIpKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCS8qKgorCSAqIEBzZWUgSVNlcnZlckVkaXRvckFjdGlvbkZhY3Rvcnkjc3VwcG9ydHNTZXJ2ZXJFbGVtZW50VHlwZShTdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZXJFbGVtZW50VHlwZShTdHJpbmcgaWQpIHsKKwkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlTdHJpbmdbXSBzID0gZ2V0VHlwZUlkcygpOworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaW50IHNpemUgPSBzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmIChzW2ldLmVuZHNXaXRoKCIqIikpIHsKKwkJCQlpZiAoaWQubGVuZ3RoKCkgPj0gc1tpXS5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNbaV0uc3Vic3RyaW5nKDAsIHNbaV0ubGVuZ3RoKCkgLSAxKSkpCisJCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIGlmIChpZC5lcXVhbHMoc1tpXSkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKKwkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJZGVsZWdhdGUgPSAoU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIGFjdGlvbiBmYWN0b3J5IGRlbGVnYXRlIiwgdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGRlbGVnYXRlOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5I3Nob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5KQorCSAqLworCXB1YmxpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgeworCQl0cnkgeworCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuc2hvdWxkRGlzcGxheShzZXJ2ZXIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSIsIGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBJU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSNjcmVhdGVBY3Rpb24oSUVkaXRvclNpdGUsIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpCisJICovCisJcHVibGljIElBY3Rpb24gY3JlYXRlQWN0aW9uKElFZGl0b3JTaXRlIHNpdGUsIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgaW5wdXQpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmNyZWF0ZUFjdGlvbihzaXRlLCBpbnB1dCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIiwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQ29yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZjMwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQ29yZS5qYXZhCkBAIC0wLDAgKzEsMjMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbkRlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JDb3JlIHsKKwkvLyBjYWNoZWQgY29weSBvZiBhbGwgZWRpdG9yIGZhY3RvcmllcyBhbmQgYWN0aW9ucworCXByaXZhdGUgc3RhdGljIExpc3Q8U2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+IGVkaXRvclBhZ2VGYWN0b3JpZXM7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcnk+IGVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzOworCXByaXZhdGUgc3RhdGljIExpc3QgZWRpdG9yQWN0aW9uRmFjdG9yaWVzOworCisJLyoqCisJICogUmV0dXJucyBhIExpc3Qgb2YgYWxsIGVkaXRvciBwYWdlIGZhY3RvcmllcworCSAqCisJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4gZ2V0U2VydmVyRWRpdG9yUGFnZUZhY3RvcmllcygpIHsKKwkJaWYgKGVkaXRvclBhZ2VGYWN0b3JpZXMgPT0gbnVsbCkKKwkJCWxvYWRFZGl0b3JQYWdlRmFjdG9yaWVzKCk7CisJCXJldHVybiBlZGl0b3JQYWdlRmFjdG9yaWVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBMaXN0IG9mIGFsbCBlZGl0b3IgcGFnZSBzZWN0aW9uIGZhY3RvcmllcworCSAqCisJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcygpIHsKKwkJaWYgKGVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzID09IG51bGwpCisJCQlsb2FkRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoKTsKKwkJcmV0dXJuIGVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzOworCX0KKworCS8qKgorCSAqIExvYWQgdGhlIGVkaXRvciBwYWdlIGZhY3RvcnkgZXh0ZW5zaW9uIHBvaW50LgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZEVkaXRvclBhZ2VGYWN0b3JpZXMoKSB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5lZGl0b3JQYWdlcyBleHRlbnNpb24gcG9pbnQgLT4tIik7CisJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgU2VydmVyVUlQbHVnaW4uRVhURU5TSU9OX0VESVRPUl9QQUdFUyk7CisJCUxpc3Q8U2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNlcnZlckVkaXRvclBhcnRGYWN0b3J5PihjZi5sZW5ndGgpOworCQlsb2FkRWRpdG9yUGFnZUZhY3RvcmllcyhjZiwgbGlzdCk7CisJCWVkaXRvclBhZ2VGYWN0b3JpZXMgPSBsaXN0OworCQlTZXJ2ZXJVSVBsdWdpbi5hZGRSZWdpc3RyeUxpc3RlbmVyKCk7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLmVkaXRvclBhZ2VzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKKwl9CisKKwkvKioKKwkgKiBMb2FkIHRoZSBlZGl0b3IgcGFnZSBmYWN0b3J5IGV4dGVuc2lvbiBwb2ludC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRFZGl0b3JQYWdlRmFjdG9yaWVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmLCBMaXN0PFNlcnZlckVkaXRvclBhcnRGYWN0b3J5PiBsaXN0KSB7CisJCWludCBzaXplID0gY2YubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlsaXN0LmFkZChuZXcgU2VydmVyRWRpdG9yUGFydEZhY3RvcnkoY2ZbaV0pKTsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBlZGl0b3JQYWdlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBlZGl0b3JQYWdlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gc29ydCBwYWdlcworCQlzb3J0T3JkZXJlZExpc3QobGlzdCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZUVkaXRvclBhZ2VGYWN0b3JpZXNEZWx0YShJRXh0ZW5zaW9uRGVsdGEgZGVsdGEpIHsKKwkJaWYgKGVkaXRvclBhZ2VGYWN0b3JpZXMgPT0gbnVsbCkgLy8gbm90IGxvYWRlZCB5ZXQKKwkJCXJldHVybjsKKwkJCisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gZGVsdGEuZ2V0RXh0ZW5zaW9uKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7CisJCQorCQlMaXN0PFNlcnZlckVkaXRvclBhcnRGYWN0b3J5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4oZWRpdG9yUGFnZUZhY3Rvcmllcyk7CisJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKQorCQkJbG9hZEVkaXRvclBhZ2VGYWN0b3JpZXMoY2YsIGxpc3QpOworCQllbHNlIHsKKwkJCWludCBzaXplID0gbGlzdC5zaXplKCk7CisJCQlTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeVtdIHNlcGYgPSBuZXcgU2VydmVyRWRpdG9yUGFydEZhY3Rvcnlbc2l6ZV07CisJCQlsaXN0LnRvQXJyYXkoc2VwZik7CisJCQlpbnQgc2l6ZTIgPSBjZi5sZW5ndGg7CisJCQkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7CisJCQkJCWlmIChzZXBmW2ldLmdldElkKCkuZXF1YWxzKGNmW2pdLmdldEF0dHJpYnV0ZSgiaWQiKSkpIHsKKwkJCQkJCWxpc3QucmVtb3ZlKHNlcGZbaV0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVkaXRvclBhZ2VGYWN0b3JpZXMgPSBsaXN0OworCX0KKworCS8qKgorCSAqIExvYWQgdGhlIGVkaXRvciBwYWdlIHNlY3Rpb24gZmFjdG9yeSBleHRlbnNpb24gcG9pbnQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoKSB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5lZGl0b3JQYWdlU2VjdGlvbnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOworCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIFNlcnZlclVJUGx1Z2luLkVYVEVOU0lPTl9FRElUT1JfUEFHRV9TRUNUSU9OUyk7CisJCUxpc3Q8U2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcnk+KGNmLmxlbmd0aCk7CisJCWxvYWRFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcyhjZiwgbGlzdCk7CisJCWVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzID0gbGlzdDsKKwkJU2VydmVyVUlQbHVnaW4uYWRkUmVnaXN0cnlMaXN0ZW5lcigpOworCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5lZGl0b3JQYWdlU2VjdGlvbnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOworCX0KKworCS8qKgorCSAqIExvYWQgdGhlIGVkaXRvciBwYWdlIHNlY3Rpb24gZmFjdG9yeSBleHRlbnNpb24gcG9pbnQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YsIExpc3Q8U2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5PiBsaXN0KSB7CisJCWludCBzaXplID0gY2YubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlsaXN0LmFkZChuZXcgU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5KGNmW2ldKSk7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgZWRpdG9yUGFnZVNlY3Rpb246ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIGVkaXRvclBhZ2VTZWN0aW9uOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gc29ydCBzZWN0aW9ucworCQlzb3J0T3JkZXJlZExpc3QobGlzdCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZUVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzRGVsdGEoSUV4dGVuc2lvbkRlbHRhIGRlbHRhKSB7CisJCWlmIChlZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcyA9PSBudWxsKSAvLyBub3QgbG9hZGVkIHlldAorCQkJcmV0dXJuOworCQkKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSBkZWx0YS5nZXRFeHRlbnNpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKKwkJCisJCUxpc3Q8U2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcnk+KGVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKTsKKwkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJRXh0ZW5zaW9uRGVsdGEuQURERUQpCisJCQlsb2FkRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoY2YsIGxpc3QpOworCQllbHNlIHsKKwkJCWludCBzaXplID0gbGlzdC5zaXplKCk7CisJCQlTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnlbXSBzZXBzID0gbmV3IFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeVtzaXplXTsKKwkJCWxpc3QudG9BcnJheShzZXBzKTsKKwkJCWludCBzaXplMiA9IGNmLmxlbmd0aDsKKwkJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQkJaWYgKHNlcHNbaV0uZ2V0SWQoKS5lcXVhbHMoY2Zbal0uZ2V0QXR0cmlidXRlKCJpZCIpKSkgeworCQkJCQkJbGlzdC5yZW1vdmUoc2Vwc1tpXSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMgPSBsaXN0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBMaXN0IG9mIGFsbCBlZGl0b3IgYWN0aW9uIGZhY3Rvcmllcy4KKwkgKgorCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yaWVzKCkgeworCQlpZiAoZWRpdG9yQWN0aW9uRmFjdG9yaWVzID09IG51bGwpCisJCQlsb2FkRWRpdG9yQWN0aW9uRmFjdG9yaWVzKCk7CisJCXJldHVybiBlZGl0b3JBY3Rpb25GYWN0b3JpZXM7CisJfQorCQorCS8qKgorCSAqIExvYWQgdGhlIGVkaXRvciBhY3Rpb24gZmFjdG9yaWVzIGV4dGVuc2lvbiBwb2ludC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRFZGl0b3JBY3Rpb25GYWN0b3JpZXMoKSB7CisJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5lZGl0b3JBY3Rpb25zIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKKwkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAiZWRpdG9yQWN0aW9ucyIpOworCisJCWludCBzaXplID0gY2YubGVuZ3RoOworCQlMaXN0PFNlcnZlckVkaXRvckFjdGlvbkZhY3Rvcnk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNlcnZlckVkaXRvckFjdGlvbkZhY3Rvcnk+KHNpemUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlsaXN0LmFkZChuZXcgU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeShjZltpXSkpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIGVkaXRvckFjdGlvbjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgZWRpdG9yQWN0aW9uOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gc29ydCBwYWdlcworCQlzb3J0T3JkZXJlZExpc3QobGlzdCk7CisJCWVkaXRvckFjdGlvbkZhY3RvcmllcyA9IGxpc3Q7CisJCQorCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5lZGl0b3JBY3Rpb25zIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKKwl9CisJCisJLyoqCisJICogU29ydCB0aGUgZ2l2ZW4gbGlzdCBvZiBJT3JkZXJlZCBpdGVtcyBpbnRvIGluZGV4ZWQgb3JkZXIuIFRoaXMgbWV0aG9kCisJICogbW9kaWZpZXMgdGhlIG9yaWdpbmFsIGxpc3QsIGJ1dCByZXR1cm5zIHRoZSB2YWx1ZSBmb3IgY29udmVuaWVuY2UuCisJICoKKwkgKiBAcGFyYW0gbGlzdCBqYXZhLnV0aWwuTGlzdAorCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3Qgc29ydE9yZGVyZWRMaXN0KExpc3QgbGlzdCkgeworCQlpZiAobGlzdCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CisJCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBzaXplOyBqKyspIHsKKwkJCQlJT3JkZXJlZCBhID0gKElPcmRlcmVkKSBsaXN0LmdldChpKTsKKwkJCQlJT3JkZXJlZCBiID0gKElPcmRlcmVkKSBsaXN0LmdldChqKTsKKwkJCQlpZiAoYS5nZXRPcmRlcigpID4gYi5nZXRPcmRlcigpKSB7CisJCQkJCUlPcmRlcmVkIHRlbXAgPSBhOworCQkJCQlsaXN0LnNldChpLCBiKTsKKwkJCQkJbGlzdC5zZXQoaiwgdGVtcCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBsaXN0OworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvcklucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4NjFhYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OworLyoqCisgKiBUaGUgZWRpdG9yIGlucHV0IGZvciBzZXJ2ZXIgY29uZmlndXJhdGlvbnMgYW5kIGluc3RhbmNlcy4gVGhlCisgKiBpbnB1dCBwb2ludHMgdG8gYSByZXNvdXJjZSB0aGF0IGlzIGVpdGhlciBhbiBpbnN0YW5jZSBvcgorICogY29uZmlndXJhdGlvbi4KKyAqCisgKiA8cD5FZGl0b3JzIHN1cHBvcnRpbmcgdGhpcyBlZGl0b3IgaW5wdXQgc2hvdWxkIHVzZSB0aGUgUmVzb3VyY2VNYW5hZ2VyCisgKiB0byBsb2FkIHRoZWlyIG93biBjb3B5IG9mIHRoZSByZXNvdXJjZS4gRWFjaCBlZGl0b3IgaXMgcmVzcG9uc2libGUKKyAqIGZvciBtYW5hZ2luZyB0aGlzIHJlc291cmNlIGFuZCBtYWtpbmcgc3VyZSB0aGF0IG9ubHkgb25lIGNvcHkgaXMKKyAqIGxvYWRlZCBmcm9tIGRpc2sgd2hlbiBtdWx0aXBsZSBlZGl0b3JzIGFyZSBvcGVuZWQgb24gdGhlIHNhbWUKKyAqIHJlc291cmNlLjwvcD4KKyAqCisgKiA8cD5XaGVuIHRoZSBlZGl0b3Igc2F2ZXMgYmFjayB0byB0aGUgcmVzb3VyY2UsIHRoZSBzZXJ2ZXIgdG9vbGluZworICogd2lsbCBub3RpY2UgdGhlIGNoYW5nZSBhbmQgcmVsb2FkIHRoZSBuZXcgY29uZmlndXJhdGlvbi48L3A+CisgKgorICogPHA+RWRpdG9ycyBzaG91bGQgY2FsbCBzZXRFZGl0aW5nKHJlc291cmNlLCB0cnVlKSB3aGVuIHRoZSBmaXJzdAorICogZWRpdG9yIG9wZW5zIG9uIGEgcGFydGljdWxhciByZXNvdXJjZSwgYW5kIHNldEVkaXRpbmcocmVzb3VyY2UsCisgKiBmYWxzZSkgd2hlbiB0aGUgbGFzdCBlZGl0b3Igb24gYSByZXNvdXJjZSBjbG9zZXMuIFRoaXMgd2lsbAorICogZW5zdXJlIHRoYXQgdGhlIHNlcnZlciB0b29saW5nIGRvZXMgbm90IHRyeSB0byBlZGl0IHRoZSByZXNvdXJjZQorICogYW5kIGNhdXNlIGNvbmZsaWN0aW5nIGNoYW5nZXMgd2hpbGUgYW4gZWRpdG9yIGlzIG9wZW4uPC9wPgorICovCitwdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJU2VydmVyRWRpdG9ySW5wdXQsIElQZXJzaXN0YWJsZUVsZW1lbnQgeworCXByaXZhdGUgU3RyaW5nIHNlcnZlcklkOworCisJLyoqCisJICogU2VydmVyRWRpdG9ySW5wdXQgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVySWQgYSBzZXJ2ZXIgaWQKKwkgKi8KKwlwdWJsaWMgU2VydmVyRWRpdG9ySW5wdXQoU3RyaW5nIHNlcnZlcklkKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuc2VydmVySWQgPSBzZXJ2ZXJJZDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc2VydmVyIGlkLgorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlCisJICovCisJcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJZCgpIHsKKwkJcmV0dXJuIHNlcnZlcklkOworCX0KKworCS8qKgorCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCisJICovCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKQorCQkJcmV0dXJuIHRydWU7CisJCWlmICghKG9iaiBpbnN0YW5jZW9mIFNlcnZlckVkaXRvcklucHV0KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJU2VydmVyRWRpdG9ySW5wdXQgb3RoZXIgPSAoU2VydmVyRWRpdG9ySW5wdXQpIG9iajsKKwkJaWYgKHNlcnZlcklkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5zZXJ2ZXJJZCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsJCisJCX0gZWxzZSBpZiAoIXNlcnZlcklkLmVxdWFscyhvdGhlci5zZXJ2ZXJJZCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZWRpdG9yIGlucHV0IGV4aXN0cy4gIAorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGlzIHByaW1hcmlseSB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBlZGl0b3IgaW5wdXQgc2hvdWxkIAorCSAqIGFwcGVhciBpbiB0aGUgIkZpbGUgTW9zdCBSZWNlbnRseSBVc2VkIiBtZW51LiAgQW4gZWRpdG9yIGlucHV0IHdpbGwgYXBwZWFyIAorCSAqIGluIHRoZSBsaXN0IHVudGlsIHRoZSByZXR1cm4gdmFsdWUgb2YgPGNvZGU+ZXhpc3RzPC9jb2RlPiBiZWNvbWVzIAorCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvciBpdCBkcm9wcyBvZmYgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVkaXRvciBpbnB1dCBleGlzdHM7IDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqCQlvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CisJCWlmIChzZXJ2ZXJJZCAhPSBudWxsICYmIFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCkgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcworCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZC4KKwkgKgorCSAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIGNsYXNzIHRvIGxvb2sgdXAKKwkgKiBAcmV0dXJuIGEgb2JqZWN0IGNhc3RhYmxlIHRvIHRoZSBnaXZlbiBjbGFzcywgCisJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QKKwkgKiAgICBoYXZlIGFuIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBjbGFzcworCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7CisJCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgSUQgb2YgYW4gZWxlbWVudCBmYWN0b3J5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlY3JlYXRlIAorCSAqIHRoaXMgb2JqZWN0LiAgQW4gZWxlbWVudCBmYWN0b3J5IGV4dGVuc2lvbiB3aXRoIHRoaXMgSUQgbXVzdCBleGlzdAorCSAqIHdpdGhpbiB0aGUgd29ya2JlbmNoIHJlZ2lzdHJ5LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgZmFjdG9yeSBJRAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgeworCQlyZXR1cm4gU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5LkZBQ1RPUllfSUQ7CisJfQorCisJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7CisJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19TRVJWRVIpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZWRpdG9yIGlucHV0IGZvciBkaXNwbGF5IHB1cnBvc2VzLgorCSAqIDxwPgorCSAqIEZvciBpbnN0YW5jZSwgaWYgdGhlIGZ1bGx5IHF1YWxpZmllZCBpbnB1dCBuYW1lIGlzCisJICogPGNvZGU+ImFcYlxNeUZpbGUuZ2lmIjwvY29kZT4sIHRoZSByZXR1cm4gdmFsdWUgd291bGQgYmUganVzdAorCSAqIDxjb2RlPiJNeUZpbGUuZ2lmIjwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIHRoZSBmaWxlIG5hbWUgc3RyaW5nCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlpZiAoc2VydmVySWQgIT0gbnVsbCkgeworCQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySWQpOworCQkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJCXJldHVybiBzZXJ2ZXIuZ2V0TmFtZSgpOworCQkJcmV0dXJuIHNlcnZlcklkOworCQl9CisJCXJldHVybiAiIjsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBlZGl0b3IgaW5wdXQuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0YWJsZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVkaXRvciBpbnB1dAorCSAqICAgY2Fubm90IGJlIHBlcnNpc3RlZAorCSAqLworCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgeworCQlTdHJpbmcgcyA9IG51bGw7CisJCWlmIChzZXJ2ZXJJZCAhPSBudWxsKSB7CisJCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7CisJCQlpZiAoc2VydmVyICE9IG51bGwpIHsKKwkJCQlTZXJ2ZXIgc2VydmVyMiA9IChTZXJ2ZXIpIHNlcnZlcjsKKwkJCQlpZiAoc2VydmVyMi5nZXRGaWxlKCkgIT0gbnVsbCkgeworCQkJCQlzID0gc2VydmVyMi5nZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOworCQkJCQlpZiAocy5zdGFydHNXaXRoKCIvIikpCisJCQkJCQlzID0gcy5zdWJzdHJpbmcoMSk7CisJCQkJfSBlbHNlCisJCQkJCXMgPSBzZXJ2ZXIuZ2V0TmFtZSgpOworCQkJfQorCQl9CisJCWlmIChzID09IG51bGwpCisJCQlzID0gIiI7CisJCXJldHVybiBzOworCX0KKworCS8qKgorCSAqIFNhdmVzIHRoZSBzdGF0ZSBvZiBhbiBlbGVtZW50IHdpdGhpbiBhIG1lbWVudG8uCisJICoKKwkgKiBAcGFyYW0gbWVtZW50byB0aGUgc3RvcmFnZSBhcmVhIGZvciBlbGVtZW50IHN0YXRlCisJICovCisJcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKKwkJU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5LnNhdmVTdGF0ZShtZW1lbnRvLCB0aGlzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvcklucHV0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvcklucHV0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTA2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOworLyoqCisgKiBUaGlzIGZhY3RvcnkgaXMgdXNlZCBpbiB0aGUgcGVyc2lzdGVuY2Ugb2YgU2VydmVyUmVzb3VyY2VFZGl0b3JJbnB1dAorICogaW5zdGFuY2VzLiBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBjbG9zZSB0aGUgd29ya2JlbmNoIHdpdGggYW4KKyAqIG9wZW4gZWRpdG9yIGFuZCByZW9wZW4gdG8gdGhlIHNhbWUgZWRpdG9yLgorICovCitwdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5IGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5IHsKKwlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBGQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLmlucHV0LmZhY3RvcnkiOworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZFUl9JRCA9ICJzZXJ2ZXItaWQiOworCisJLyoqCisJICogU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFNlcnZlckVkaXRvcklucHV0RmFjdG9yeSgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qCisJICogQ3JlYXRlcyBlZGl0b3IgaW5wdXQgYmFzZWQgb24gdGhlIHN0YXRlIGluIHRoZSBtZW1lbnRvLgorCSAqLworCXB1YmxpYyBJQWRhcHRhYmxlIGNyZWF0ZUVsZW1lbnQoSU1lbWVudG8gbWVtZW50bykgeworCQkvLyBnZXQgdGhlIHJlc291cmNlIG5hbWVzCisJCVN0cmluZyBzZXJ2ZXJJZCA9IG1lbWVudG8uZ2V0U3RyaW5nKFNFUlZFUl9JRCk7CisJCQorCQlyZXR1cm4gbmV3IFNlcnZlckVkaXRvcklucHV0KHNlcnZlcklkKTsKKwl9CisKKwkvKioKKwkgKiBTYXZlcyB0aGUgc3RhdGUgb2YgYW4gZWxlbWVudCB3aXRoaW4gYSBtZW1lbnRvLgorCSAqCisJICogQHBhcmFtIG1lbWVudG8gdGhlIHN0b3JhZ2UgYXJlYSBmb3IgZWxlbWVudCBzdGF0ZQorCSAqIEBwYXJhbSBpbnB1dCBzZXJ2ZXIgZWRpdG9yIGlucHV0CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvLCBTZXJ2ZXJFZGl0b3JJbnB1dCBpbnB1dCkgeworCQlpZiAoaW5wdXQgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCQorCQlpZiAoaW5wdXQuZ2V0U2VydmVySWQoKSAhPSBudWxsKQorCQkJbWVtZW50by5wdXRTdHJpbmcoU0VSVkVSX0lELCBpbnB1dC5nZXRTZXJ2ZXJJZCgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2MyZjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5IGltcGxlbWVudHMgSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSB7CisJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKKwlwcml2YXRlIEV4cHJlc3Npb24gZkNvbnRleHR1YWxMYXVuY2hFeHByID0gbnVsbDsKKworCS8qKgorCSAqIFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAorCSAqLworCXB1YmxpYyBTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgeworCQlyZXR1cm4gZWxlbWVudDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGZhY3RvcnkuCisJICoKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG9yZGVyLgorCSAqCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldE9yZGVyKCkgeworCQl0cnkgeworCQkJU3RyaW5nIG8gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgib3JkZXIiKTsKKwkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KG8pOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5zZXJ0aW9uIGlkIG9mIHRoaXMgZmFjdG9yeS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGluc2VydGlvbiBpZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SW5zZXJ0aW9uSWQoKSB7CisJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaW5zZXJ0aW9uSWQiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGlkcyBvZiB0aGUgc2VydmVyIHJlc291cmNlIGZhY3RvcmllcyAoc3BlY2lmaWVkCisJICogdXNpbmcgSmF2YS1pbXBvcnQgc3R5bGUpIHRoYXQgdGhpcyBwYWdlIG1heSBzdXBwb3J0LgorCSAqIAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdHlwZSBpZHMKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKKwkJdHJ5IHsKKwkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIiksICIsIik7CisJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQkJU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOworCQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKQorCQkJCQlsaXN0LmFkZChzdHIudHJpbSgpKTsKKwkJCX0KKwkJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKKwkJCWxpc3QudG9BcnJheShzKTsKKwkJCXJldHVybiBzOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy9UcmFjZS50cmFjZSgiQ291bGQgbm90IGdldCBzZXJ2ZXIgcmVzb3VyY2UgZnJvbTogIiArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzZXJ2ZXJSZXNvdXJjZXMiKSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcnkjc3VwcG9ydHNUeXBlKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJU3RyaW5nW10gcyA9IGdldFR5cGVJZHMoKTsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWludCBzaXplID0gcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAoc1tpXS5lbmRzV2l0aCgiKiIpKSB7CisJCQkJaWYgKGlkLmxlbmd0aCgpID49IHNbaV0ubGVuZ3RoKCkgJiYgaWQuc3RhcnRzV2l0aChzW2ldLnN1YnN0cmluZygwLCBzW2ldLmxlbmd0aCgpIC0gMSkpKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoaWQuZXF1YWxzKHNbaV0pKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogQHNlZSBJU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5I3Nob3VsZENyZWF0ZVNlY3Rpb24oSVNlcnZlcldvcmtpbmdDb3B5KQorCSAqLworCXB1YmxpYyBib29sZWFuIHNob3VsZENyZWF0ZVNlY3Rpb24oSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgeworCQl0cnkgeworCQkJcmV0dXJuIGlzRW5hYmxlZChzZXJ2ZXIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSIsIGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBJU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5I2NyZWF0ZVNlY3Rpb24oKQorCSAqLworCXB1YmxpYyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gKFNlcnZlckVkaXRvclNlY3Rpb24pIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIGVkaXRvciBzZWN0aW9uIiwgdCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGVuYWJsZW1lbnQgbG9naWMgZm9yIHRoZQorCSAqIGNvbnRleHR1YWwgbGF1bmNoIGVsZW1lbnQgb2YgdGhpcyBsYXVuY2ggc2hvcnRjdXQgZGVzY3JpcHRpb24gb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorCSAqIEByZXR1cm4gYW4gZXZhbHVhdGFibGUgZXhwcmVzc2lvbiBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGNhbid0IGJlCisJICogIGNvbnZlcnRlZC4gUmVhc29ucyBpbmNsdWRlOiAoYSkgbm8gaGFuZGxlciBpcyBhdmFpbGFibGUgdG8KKwkgKiAgY29wZSB3aXRoIGEgY2VydGFpbiBjb25maWd1cmF0aW9uIGVsZW1lbnQgb3IgKGIpIHRoZSBYTUwKKwkgKiAgZXhwcmVzc2lvbiB0cmVlIGlzIG1hbGZvcm1lZC4KKwkgKi8KKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChmQ29udGV4dHVhbExhdW5jaEV4cHIgPT0gbnVsbCkgeworCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkcmVuKEV4cHJlc3Npb25UYWdOYW1lcy5FTkFCTEVNRU5UKTsKKwkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbmFibGVtZW50ID0gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogbnVsbDsgCisKKwkJCWlmIChlbmFibGVtZW50ICE9IG51bGwpCisJCQkJZkNvbnRleHR1YWxMYXVuY2hFeHByID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShlbmFibGVtZW50KTsKKwkJfQorCQlyZXR1cm4gZkNvbnRleHR1YWxMYXVuY2hFeHByOworCX0KKworCS8qKgorCSAqIEV2YWx1YXRlIHRoZSBnaXZlbiBleHByZXNzaW9uIHdpdGhpbiB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgcmV0dXJuCisJICogdGhlIHJlc3VsdC4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZmYgcmVzdWx0IGlzIGVpdGhlciBUUlVFIG9yIE5PVF9MT0FERUQuCisJICogVGhpcyBhbGxvd3Mgb3B0aW1pc3RpYyBpbmNsdXNpb24gb2Ygc2hvcnRjdXRzIGJlZm9yZSBwbHVnaW5zIGFyZSBsb2FkZWQuCisJICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgZXhwIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBleHAgdGhlIGVuYWJsZW1lbnQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBldmFsdWF0aW9uLiBVc3VhbGx5LCB0aGUKKwkgKiAgdXNlcidzIHNlbGVjdGlvbi4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGV2YWxFbmFibGVtZW50RXhwcmVzc2lvbihJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCwgRXhwcmVzc2lvbiBleHApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIChleHAgIT0gbnVsbCkgPyAoKGV4cC5ldmFsdWF0ZShjb250ZXh0KSkgIT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkgOiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqIGFuIG9iamVjdAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW5hYmxlZAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKE9iamVjdCBvYmopIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGdldENvbnRleHR1YWxMYXVuY2hFbmFibGVtZW50RXhwcmVzc2lvbigpID09IG51bGwpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgb2JqKTsKKwkJY29udGV4dC5hZGRWYXJpYWJsZSgic2VydmVyIiwgb2JqKTsKKwkJcmV0dXJuIGV2YWxFbmFibGVtZW50RXhwcmVzc2lvbihjb250ZXh0LCBnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJTZXJ2ZXJFZGl0b3JTZWN0aW9uIFsiICsgZ2V0SWQoKSArICIsICIgKyBnZXRJbnNlcnRpb25JZCgpICsgIiwgIiArIGdldE9yZGVyKCkgKyAiXSI7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhcnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yUGFydEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBjYzIyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhcnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSB7CisJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKKwlwcml2YXRlIEV4cHJlc3Npb24gZkNvbnRleHR1YWxMYXVuY2hFeHByID0gbnVsbDsKKworCS8qKgorCSAqIFNlcnZlckVkaXRvclBhcnRGYWN0b3J5IGNvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50CisJICovCisJcHVibGljIFNlcnZlckVkaXRvclBhcnRGYWN0b3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpIHsKKwkJcmV0dXJuIGVsZW1lbnQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBwYXJ0IGZhY3RvcnkuCisJICoKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYXJ0IGZhY3RvcnkuIAorCSAqCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0SW5zZXJ0aW9uSWRzKCkgeworCQl0cnkgeworCQkJU3RyaW5nIGluc2VydGlvbklkcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpbnNlcnRpb25JZHMiKTsKKwkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlpZiAoaW5zZXJ0aW9uSWRzICE9IG51bGwgJiYgaW5zZXJ0aW9uSWRzLmxlbmd0aCgpID4gMCkgeworCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5zZXJ0aW9uSWRzLCAiLCIpOworCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOworCQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKKwkJCQkJCWxpc3QuYWRkKHN0ci50cmltKCkpOworCQkJCX0KKwkJCX0KKwkJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKKwkJCWxpc3QudG9BcnJheShzKTsKKwkJCXJldHVybiBzOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy9UcmFjZS50cmFjZSgiQ291bGQgbm90IGdldCBzZXJ2ZXIgcmVzb3VyY2UgZnJvbTogIiArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzZXJ2ZXJSZXNvdXJjZXMiKSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5I3N1cHBvcnRzSW5zZXJ0aW9uSWQoU3RyaW5nKQorCSAqLworCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSW5zZXJ0aW9uSWQoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJU3RyaW5nW10gcyA9IGdldEluc2VydGlvbklkcygpOworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaW50IHNpemUgPSBzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmIChzW2ldLmVuZHNXaXRoKCIqIikpIHsKKwkJCQlpZiAoaWQubGVuZ3RoKCkgPj0gc1tpXS5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNbaV0uc3Vic3RyaW5nKDAsIHNbaV0ubGVuZ3RoKCkgLSAxKSkpCisJCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIGlmIChpZC5lcXVhbHMoc1tpXSkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG9yZGVyLgorCSAqCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldE9yZGVyKCkgeworCQl0cnkgeworCQkJU3RyaW5nIG8gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgib3JkZXIiKTsKKwkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KG8pOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgaWRzIG9mIHRoZSBzZXJ2ZXIgYW5kIHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUgaWRzIChzcGVjaWZpZWQKKwkgKiB1c2luZyBKYXZhLWltcG9ydCBzdHlsZSkgdGhhdCB0aGlzIHBhZ2UgbWF5IHN1cHBvcnQuCisJICogCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0eXBlIGlkcworCSAqLworCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlSWRzKCkgeworCQl0cnkgeworCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKKwkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQlTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7CisJCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApCisJCQkJCWxpc3QuYWRkKHN0ci50cmltKCkpOworCQkJfQorCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOworCQkJbGlzdC50b0FycmF5KHMpOworCQkJcmV0dXJuIHM7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvL1RyYWNlLnRyYWNlKCJDb3VsZCBub3QgZ2V0IHNlcnZlciByZXNvdXJjZSBmcm9tOiAiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNlcnZlclJlc291cmNlcyIpKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCS8qKgorCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5I3N1cHBvcnRzVHlwZShTdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgeworCQlTdHJpbmdbXSBzID0gZ2V0VHlwZUlkcygpOworCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoID09IDAgfHwgIioiLmVxdWFscyhzWzBdKSkKKwkJCXJldHVybiB0cnVlOworCQkKKwkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWludCBzaXplID0gcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAoc1tpXS5lbmRzV2l0aCgiKiIpKSB7CisJCQkJaWYgKGlkLmxlbmd0aCgpID49IHNbaV0ubGVuZ3RoKCkgJiYgaWQuc3RhcnRzV2l0aChzW2ldLnN1YnN0cmluZygwLCBzW2ldLmxlbmd0aCgpIC0gMSkpKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoaWQuZXF1YWxzKHNbaV0pKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSNzaG91bGRDcmVhdGVQYWdlKElTZXJ2ZXJXb3JraW5nQ29weSkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRDcmVhdGVQYWdlKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBpc0VuYWJsZWQoc2VydmVyKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUiLCBlKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5I2NyZWF0ZVBhZ2UoKQorCSAqLworCXB1YmxpYyBJRWRpdG9yUGFydCBjcmVhdGVQYWdlKCkgeworCQl0cnkgeworCQkJcmV0dXJuIChJRWRpdG9yUGFydCkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSIsIGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhbiBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgZW5hYmxlbWVudCBsb2dpYyBmb3IgdGhlCisJICogY29udGV4dHVhbCBsYXVuY2ggZWxlbWVudCBvZiB0aGlzIGxhdW5jaCBzaG9ydGN1dCBkZXNjcmlwdGlvbiBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogQHJldHVybiBhbiBldmFsdWF0YWJsZSBleHByZXNzaW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgY2FuJ3QgYmUKKwkgKiAgY29udmVydGVkLiBSZWFzb25zIGluY2x1ZGU6IChhKSBubyBoYW5kbGVyIGlzIGF2YWlsYWJsZSB0bworCSAqICBjb3BlIHdpdGggYSBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBvciAoYikgdGhlIFhNTAorCSAqICBleHByZXNzaW9uIHRyZWUgaXMgbWFsZm9ybWVkLgorCSAqLworCXB1YmxpYyBFeHByZXNzaW9uIGdldENvbnRleHR1YWxMYXVuY2hFbmFibGVtZW50RXhwcmVzc2lvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGZDb250ZXh0dWFsTGF1bmNoRXhwciA9PSBudWxsKSB7CisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRXhwcmVzc2lvblRhZ05hbWVzLkVOQUJMRU1FTlQpOworCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVuYWJsZW1lbnQgPSBlbGVtZW50cy5sZW5ndGggPiAwID8gZWxlbWVudHNbMF0gOiBudWxsOyAKKworCQkJaWYgKGVuYWJsZW1lbnQgIT0gbnVsbCkKKwkJCQlmQ29udGV4dHVhbExhdW5jaEV4cHIgPSBFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKS5wZXJmb3JtKGVuYWJsZW1lbnQpOworCQl9CisJCXJldHVybiBmQ29udGV4dHVhbExhdW5jaEV4cHI7CisJfQorCQorCS8qKgorCSAqIEV2YWx1YXRlIHRoZSBnaXZlbiBleHByZXNzaW9uIHdpdGhpbiB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgcmV0dXJuCisJICogdGhlIHJlc3VsdC4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZmYgcmVzdWx0IGlzIGVpdGhlciBUUlVFIG9yIE5PVF9MT0FERUQuCisJICogVGhpcyBhbGxvd3Mgb3B0aW1pc3RpYyBpbmNsdXNpb24gb2Ygc2hvcnRjdXRzIGJlZm9yZSBwbHVnaW5zIGFyZSBsb2FkZWQuCisJICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgZXhwIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBleHAgdGhlIGVuYWJsZW1lbnQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBldmFsdWF0aW9uLiBVc3VhbGx5LCB0aGUKKwkgKiAgdXNlcidzIHNlbGVjdGlvbi4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGV2YWxFbmFibGVtZW50RXhwcmVzc2lvbihJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCwgRXhwcmVzc2lvbiBleHApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIChleHAgIT0gbnVsbCkgPyAoKGV4cC5ldmFsdWF0ZShjb250ZXh0KSkgIT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkgOiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqIGFuIG9iamVjdAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW5hYmxlZAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKE9iamVjdCBvYmopIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGdldENvbnRleHR1YWxMYXVuY2hFbmFibGVtZW50RXhwcmVzc2lvbigpID09IG51bGwpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgb2JqKTsKKwkJY29udGV4dC5hZGRWYXJpYWJsZSgic2VydmVyIiwgb2JqKTsKKwkJcmV0dXJuIGV2YWxFbmFibGVtZW50RXhwcmVzc2lvbihjb250ZXh0LCBnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA0NWIyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSVNlcnZlckVkaXRvclBhcnRJbnB1dDsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgaW1wbGVtZW50cyBJU2VydmVyRWRpdG9yUGFydElucHV0IHsKKwlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzZXJ2ZXJSZWFkT25seTsKKwlwcm90ZWN0ZWQgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBzZXJ2ZXJDb21tYW5kTWFuYWdlcjsKKwkKKwlwdWJsaWMgU2VydmVyRWRpdG9yUGFydElucHV0KFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgc2VydmVyQ29tbWFuZE1hbmFnZXIsCisJCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCAgYm9vbGVhbiBzZXJ2ZXJSZWFkT25seSkgeworCQkKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJCXRoaXMuc2VydmVyUmVhZE9ubHkgPSBzZXJ2ZXJSZWFkT25seTsKKwkJdGhpcy5zZXJ2ZXJDb21tYW5kTWFuYWdlciA9IHNlcnZlckNvbW1hbmRNYW5hZ2VyOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiAiLSI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKKwkJcmV0dXJuICItIjsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2VydmVyIHRvIGJlIGVkaXRlZC4KKwkgKgorCSAqIEByZXR1cm4gSVNlcnZlclJlc291cmNlCisJICovCisJcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7CisJCXJldHVybiBzZXJ2ZXI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgcmVhZC1vbmx5LgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2VydmVyUmVhZE9ubHkoKSB7CisJCXJldHVybiBzZXJ2ZXJSZWFkT25seTsKKwl9CisJCisJcHVibGljIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgZ2V0U2VydmVyQ29tbWFuZE1hbmFnZXIoKSB7CisJCXJldHVybiBzZXJ2ZXJDb21tYW5kTWFuYWdlcjsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgWyIgKyBzZXJ2ZXIgKyAiXSI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MmZmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworLyoqCisgKiBBIGNvbW1hbmQgbWFuYWdlciBmb3IgYSBzaW5nbGUgc2VydmVyIHJlc291cmNlLgorICovCitwdWJsaWMgY2xhc3MgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciB7CisJcHJvdGVjdGVkIFNlcnZlckVkaXRvciBlZGl0b3I7CisJcHJvdGVjdGVkIEdsb2JhbENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyOworCXByb3RlY3RlZCBTdHJpbmcgaWQ7CisKKwlwdWJsaWMgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlcihTZXJ2ZXJFZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIEdsb2JhbENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyKSB7CisJCXRoaXMuZWRpdG9yID0gZWRpdG9yOworCQl0aGlzLmNvbW1hbmRNYW5hZ2VyID0gY29tbWFuZE1hbmFnZXI7CisJCXRoaXMuaWQgPSBpZDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCQlyZXR1cm4gY29tbWFuZE1hbmFnZXIuaXNSZWFkT25seShpZCk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZSB0aGUgZ2l2ZW4gY29tbWFuZCBhbmQgcGxhY2UgaXQgaW4gdGhlIHVuZG8gc3RhY2suCisJICogSWYgdGhlIGNvbW1hbmQgY2Fubm90IGJlIHVuZG9uZSwgdGhlIHVzZXIgd2lsbCBiZSBub3RpZmVkCisJICogYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLgorCSAqCisJICogQHBhcmFtIG9wZXJhdGlvbiBhbiB1bmRvYWJsZSBvcGVyYXRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKKwkJaWYgKCF2YWxpZGF0ZUVkaXQoKSkKKwkJCXJldHVybjsKKworCQlpZiAoY29tbWFuZE1hbmFnZXIuaXNSZWFkT25seShpZCkpIHsKKwkJCXdhcm5SZWFkT25seSgpOworCQkJcmV0dXJuOworCQl9CisJCWNvbW1hbmRNYW5hZ2VyLmV4ZWN1dGVDb21tYW5kKGlkLCBvcGVyYXRpb24pOworCX0KKworCXByb3RlY3RlZCB2b2lkIHdhcm5SZWFkT25seSgpIHsKKwkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VXYXJuVGl0bGU7CisJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VXYXJuTWVzc2FnZTsKKwkJCisJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFZGl0KCkgeworCQlpZiAoY29tbWFuZE1hbmFnZXIuaXNEaXJ0eShpZCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCUlGaWxlW10gZmlsZXMgPSBjb21tYW5kTWFuYWdlci5nZXRSZWFkT25seUZpbGVzKGlkKTsKKwkJaWYgKGZpbGVzLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlJU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsIGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSk7CisJCQorCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgeworCQkJLy8gaW5mb3JtIHVzZXIKKwkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZWRpdG9yVmFsaWRhdGVFZGl0RmFpbHVyZU1lc3NhZ2U7CisJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOworCQkJCisJCQkvLyBjaGFuZ2UgdG8gcmVhZC1vbmx5CisJCQljb21tYW5kTWFuYWdlci5zZXRSZWFkT25seShpZCwgdHJ1ZSk7CisJCQkKKwkJCS8vIGRvIG5vdCBleGVjdXRlIGNvbW1hbmQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkvLyBjaGVjayBmaWxlIHRpbWVzdGFtcAorCQlJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXJmaWxlID0gY29tbWFuZE1hbmFnZXIuZ2V0U2VydmVyUmVzb3VyY2UoaWQpOworCQlpZiAoY29tbWFuZE1hbmFnZXIuaGFzQ2hhbmdlZChpZCkpIHsKKwkJCWlmIChzZXJ2ZXJmaWxlIGluc3RhbmNlb2YgSVNlcnZlcikKKwkJCQllZGl0b3IucHJvbXB0UmVsb2FkU2VydmVyRmlsZShpZCk7CisJCX0KKwkJCisJCS8vIGFsbG93IGVkaXQKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIFNlcnZlckVkaXRvciBnZXRTZXJ2ZXJFZGl0b3IoKSB7CisJCXJldHVybiBlZGl0b3I7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1N0YXR1c0xpbmVDb250cmlidXRpb25JdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhNjhlNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVN0YXR1c0ZpZWxkOworLyoqCisgKiBDb250cmlidXRpb24gaXRlbSBmb3IgdGhlIHN0YXR1cyBsaW5lLgorICovCitwdWJsaWMgY2xhc3MgU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gZXh0ZW5kcyBDb250cmlidXRpb25JdGVtIGltcGxlbWVudHMgSVN0YXR1c0ZpZWxkIHsKKworCXN0YXRpYyBjbGFzcyBTdGF0dXNMaW5lTGFiZWwgZXh0ZW5kcyBDTGFiZWwgeworCQkKKwkJcHJpdmF0ZSBzdGF0aWMgaW50IElOREVOVD0gMzsgLy8gbGVmdCBhbmQgcmlnaHQgbWFyZ2luIHVzZWQgaW4gQ0xhYmVsCisJCQorCQlwcml2YXRlIFBvaW50IGZGaXhlZFNpemU7CisJCQorCQlwdWJsaWMgU3RhdHVzTGluZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgeworCQkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCQkKKwkJCUdDIGdjPSBuZXcgR0MocGFyZW50KTsKKwkJCWdjLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisJCQlQb2ludCBleHRlbnQ9IGdjLnRleHRFeHRlbnQoIk1NTU1NTU1NTSIpOyAvLyROT04tTkxTLTEkCisJCQlnYy5kaXNwb3NlKCk7CisJCQkKKwkJCWZGaXhlZFNpemU9IG5ldyBQb2ludChleHRlbnQueCArIElOREVOVCAqIDIsIDEwKTsKKwkJfQorCQkKKwkJcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKKwkJCXJldHVybiBmRml4ZWRTaXplOworCQl9CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGZUZXh0OworCXByaXZhdGUgSW1hZ2UgZkltYWdlOworCXByaXZhdGUgU3RhdHVzTGluZUxhYmVsIGZMYWJlbDsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaWQuCisJICogCisJICogQHBhcmFtIGlkIHRoZSBpdGVtJ3MgaWQKKwkgKi8KKwlTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbShTdHJpbmcgaWQpIHsKKwkJc3VwZXIoaWQpOworCX0KKwkKKwkvKgorCSAqIEBzZWUgSVN0YXR1c0ZpZWxkI3NldFRleHQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisJCWZUZXh0PSB0ZXh0OworCQlpZiAoZkxhYmVsICE9IG51bGwgJiYgIWZMYWJlbC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCWZMYWJlbC5zZXRUZXh0KGZUZXh0KTsKKwkJfQkJCisJfQorCQorCS8qCisJICogQHNlZSBJU3RhdHVzRmllbGQjc2V0SW1hZ2UoSW1hZ2UpCisJICovCisJcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKKwkJZkltYWdlPSBpbWFnZTsKKwkJaWYgKGZMYWJlbCAhPSBudWxsICYmICFmTGFiZWwuaXNEaXNwb3NlZCgpKSB7CisJCQlmTGFiZWwuc2V0SW1hZ2UoZkltYWdlKTsKKwkJfQorCX0KKwkKKwkvKgorCSAqIEBzZWUgSUNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChDb21wb3NpdGUpCisJICovCisJcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7CisJCWZMYWJlbD0gbmV3IFN0YXR1c0xpbmVMYWJlbChwYXJlbnQsIFNXVC5TSEFET1dfSU4pOworCQlmTGFiZWwuc2V0RGF0YSh0aGlzKTsKKwkJCisJCWlmIChmVGV4dCAhPSBudWxsKQorCQkJZkxhYmVsLnNldFRleHQoZlRleHQpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvVGV4dEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1RleHRBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThiNWJmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1RleHRBY3Rpb24uamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisvKioKKyAqIFRleHQgYWN0aW9ucyAoY3V0LCBjb3B5LCBwYXN0ZSkgZm9yIHRoZSBXZWIgYnJvd3Nlci4KKyAqLworcHVibGljIGNsYXNzIFRleHRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCXByb3RlY3RlZCBEaXNwbGF5IGRpc3BsYXk7CisJcHJvdGVjdGVkIENsaXBib2FyZCBjbGlwYm9hcmQ7CisJcHJvdGVjdGVkIGJ5dGUgdHlwZTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDVVRfQUNUSU9OID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ09QWV9BQ1RJT04gPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBQQVNURV9BQ1RJT04gPSAyOworCQorCS8qKgorCSAqIFRleHRBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dEFjdGlvbihEaXNwbGF5IGRpc3BsYXksIGJ5dGUgdHlwZSkgeworCQlzdXBlcigiVGV4dCBhY3Rpb246ICIgKyB0eXBlKTsKKwkJdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsKKwkJY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChkaXNwbGF5KTsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29udHJvbCBnZXRDb250cm9sKCkgeworCQlDb250cm9sIGNvbnRyb2wgPSBkaXNwbGF5LmdldEZvY3VzQ29udHJvbCgpOworCQlyZXR1cm4gY29udHJvbDsKKwl9CisJCisJcHJvdGVjdGVkIFBvaW50IGdldENvbnRyb2xTZWxlY3Rpb24oKSB7CisJCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKKwkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkgeworCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7CisJCQlyZXR1cm4gdGV4dC5nZXRTZWxlY3Rpb24oKTsKKwkJfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tYm8pIHsKKwkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBjb250cm9sOworCQkJcmV0dXJuIGNvbWJvLmdldFNlbGVjdGlvbigpOworCQl9IGVsc2UKKwkJCXJldHVybiBudWxsOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDb250cm9sU2VsZWN0aW9uKFBvaW50IHNlbCkgeworCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7CisJCWlmIChjb250cm9sID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7CisJCQlUZXh0IHRleHQgPSAoVGV4dCkgY29udHJvbDsKKwkJCXRleHQuc2V0U2VsZWN0aW9uKHNlbCk7CisJCX0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKSB7CisJCQlDb21ibyBjb21ibyA9IChDb21ibykgY29udHJvbDsKKwkJCWNvbWJvLnNldFNlbGVjdGlvbihzZWwpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udHJvbFRleHQoKSB7CisJCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKKwkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkgeworCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7CisJCQlyZXR1cm4gdGV4dC5nZXRUZXh0KCk7CisJCX0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKSB7CisJCQlDb21ibyBjb21ibyA9IChDb21ibykgY29udHJvbDsKKwkJCXJldHVybiBjb21iby5nZXRUZXh0KCk7CisJCX0gZWxzZQorCQkJcmV0dXJuIG51bGw7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldENvbnRyb2xUZXh0KFN0cmluZyB0ZXh0KSB7CisJCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKKwkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKKwkJCVRleHQgdGV4dDIgPSAoVGV4dCkgY29udHJvbDsKKwkJCXRleHQyLnNldFRleHQodGV4dCk7CisJCX0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKSB7CisJCQlDb21ibyBjb21ibyA9IChDb21ibykgY29udHJvbDsKKwkJCWNvbWJvLnNldFRleHQodGV4dCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuICBUaGUgdGV4dCB3aWxsIGJlIHB1dCBpbiB0aGUgCisJICogY2xpcGJvYXJkIGluIHBsYWluIHRleHQgZm9ybWF0LgorCSAqLworCXB1YmxpYyB2b2lkIGNvcHkoKSB7CisJCVBvaW50IHNlbGVjdGlvbiA9IGdldENvbnRyb2xTZWxlY3Rpb24oKTsKKwkJU3RyaW5nIHRleHQgPSBnZXRDb250cm9sVGV4dCgpOworCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgdGV4dCA9PSBudWxsKQorCQkJcmV0dXJuOworCQorCQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKKwkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCVRleHRUcmFuc2ZlciBwbGFpblRleHRUcmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOworCQkJdHJ5IHsKKwkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMoCisJCQkJCW5ldyBTdHJpbmdbXSB7IHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueSkgfSwgCisJCQkJCW5ldyBUcmFuc2ZlcltdIHsgcGxhaW5UZXh0VHJhbnNmZXIgfSk7CisJCQl9IGNhdGNoIChTV1RFcnJvciBlcnJvcikgeworCQkJCS8vIENvcHkgdG8gY2xpcGJvYXJkIGZhaWxlZC4gVGhpcyBoYXBwZW5zIHdoZW4gYW5vdGhlciBhcHBsaWNhdGlvbiAKKwkJCQkvLyBpcyBhY2Nlc3NpbmcgdGhlIGNsaXBib2FyZCB3aGlsZSB3ZSBjb3B5LiBJZ25vcmUgdGhlIGVycm9yLgorCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIE1vdmVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuICBUaGUgdGV4dCB3aWxsIGJlIHB1dCBpbiB0aGUgCisJICogY2xpcGJvYXJkIGluIHBsYWluIHRleHQgZm9ybWF0IGFuZCBSVEYgZm9ybWF0LgorCSAqLworCXB1YmxpYyB2b2lkIGN1dCgpeworCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRDb250cm9sU2VsZWN0aW9uKCk7CisJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlpZiAoc2VsZWN0aW9uLnkgPiBzZWxlY3Rpb24ueCkgeworCQkJY29weSgpOworCQkJZGVsZXRlKCk7CisJCX0KKwl9CisJCisJLyoqCisJICogRGVsZXRlcyB0aGUgY2hhcmFjdGVyIHRvIHRoZSByaWdodCBvZiB0aGUgY2FyZXQuIERlbGV0ZSB0aGUgc2VsZWN0ZWQgdGV4dCBpZiBhbnkuCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlKCkgeworCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRDb250cm9sU2VsZWN0aW9uKCk7CisJCVN0cmluZyB0ZXh0ID0gZ2V0Q29udHJvbFRleHQoKTsKKwkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHRleHQgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkKKwkJaWYgKHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55KSB7CisJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc2VsZWN0aW9uLngpICsgdGV4dC5zdWJzdHJpbmcoc2VsZWN0aW9uLnkpOworCQkJc2V0Q29udHJvbFRleHQodGV4dCk7CisJCQlzZXRDb250cm9sU2VsZWN0aW9uKG5ldyBQb2ludChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLngpKTsKKwkJfQorCX0KKwkKKwkvKiogCisJICogUmVwbGFjZXMgdGhlIHNlbGVjdGlvbiB3aXRoIHRoZSBjbGlwYm9hcmQgdGV4dCBvciBpbnNlcnQgdGhlIHRleHQgYXQgCisJICogdGhlIGN1cnJlbnQgY2FyZXQgb2Zmc2V0IGlmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbi4gCisJICogSWYgdGhlIHdpZGdldCBoYXMgdGhlIFNXVC5TSU5HTEUgc3R5bGUgYW5kIHRoZSBjbGlwYm9hcmQgdGV4dCBjb250YWlucworCSAqIG1vcmUgdGhhbiBvbmUgbGluZSwgb25seSB0aGUgZmlyc3QgbGluZSB3aXRob3V0IGxpbmUgZGVsaW1pdGVycyBpcyAKKwkgKiBpbnNlcnRlZCBpbiB0aGUgd2lkZ2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHBhc3RlKCkgeworCQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKKwkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0Q29udHJvbFNlbGVjdGlvbigpOworCQlTdHJpbmcgdGV4dCA9IGdldENvbnRyb2xUZXh0KCk7CisJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCVN0cmluZyBuZXdUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKKwkJaWYgKG5ld1RleHQgIT0gbnVsbCAmJiBuZXdUZXh0Lmxlbmd0aCgpID4gMCkgeworCQkJaWYgKHRleHQgPT0gbnVsbCkKKwkJCQl0ZXh0ID0gbmV3VGV4dDsKKwkJCWVsc2UKKwkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc2VsZWN0aW9uLngpICsgbmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi55KTsKKwkJCXNldENvbnRyb2xUZXh0KHRleHQpOworCQorCQkJLy8gc2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIGVuZCBvZiB0aGUgcGFzdGUKKwkJCWludCB4ID0gc2VsZWN0aW9uLnggKyBuZXdUZXh0Lmxlbmd0aCgpOworCQkJc2V0Q29udHJvbFNlbGVjdGlvbihuZXcgUG9pbnQoeCwgeCkpOworCQl9CisJfQorCQorCS8qKgorCSAqIEV4ZWN1dGUgdGhlIGFjdGlvbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWlmIChkaXNwbGF5ID09IG51bGwpCisJCQlyZXR1cm47CisJCWlmICh0eXBlID09IENVVF9BQ1RJT04pCisJCQljdXQoKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBDT1BZX0FDVElPTikKKwkJCWNvcHkoKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBQQVNURV9BQ1RJT04pCisJCQlwYXN0ZSgpOworCX0KKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIGFjdGlvbnMgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCWlmIChnZXRDb250cm9sKCkgPT0gbnVsbCkgeworCQkJc2V0RW5hYmxlZChmYWxzZSk7CisJCQlyZXR1cm47CisJCX0KKwkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0Q29udHJvbFNlbGVjdGlvbigpOworCQlTdHJpbmcgdGV4dCA9IGdldENvbnRyb2xUZXh0KCk7CisKKwkJdHJ5IHsKKwkJCWlmICh0eXBlID09IENVVF9BQ1RJT04pCisJCQkJc2V0RW5hYmxlZCh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDAgJiYgc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnggPCBzZWxlY3Rpb24ueSk7CisJCQllbHNlIGlmICh0eXBlID09IENPUFlfQUNUSU9OKQorCQkJCXNldEVuYWJsZWQodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwICYmIHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi54IDwgc2VsZWN0aW9uLnkpOworCQkJZWxzZSBpZiAodHlwZSA9PSBQQVNURV9BQ1RJT04pIHsKKwkJCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7CisJCQkJaWYgKCFjb250cm9sLmlzRW5hYmxlZCgpKSB7CisJCQkJCXNldEVuYWJsZWQoZmFsc2UpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSkgeworCQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCVRleHQgdGV4dDIgPSAoVGV4dCkgY29udHJvbDsKKwkJCQlpZiAoIXRleHQyLmdldEVkaXRhYmxlKCkpIHsKKwkJCQkJc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7CisJCQkJU3RyaW5nIG5ld1RleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOworCQkJCXNldEVuYWJsZWQobmV3VGV4dCAhPSBudWxsICYmIG5ld1RleHQubGVuZ3RoKCkgPiAwKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHVwZGF0aW5nIHRleHQgYWN0aW9uIiwgZSk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblNpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbnNpb25TaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjZTBkZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbnNpb25TaXRlLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5leHRlbnNpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUNhdGVnb3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1lbWVudG87CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLkluc3RhbGxhYmxlUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlByb2dyZXNzVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIEV4dGVuc2lvblNpdGUgeworCXByaXZhdGUgSU1lbWVudG8gbWVtZW50bzsKKworCXB1YmxpYyBFeHRlbnNpb25TaXRlKElNZW1lbnRvIG1lbWVudG8pIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5tZW1lbnRvID0gbWVtZW50bzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKwkJcmV0dXJuIG1lbWVudG8uZ2V0U3RyaW5nKCJ1cmwiKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8SUZlYXR1cmU+IGZlYXR1cmVMaXN0OworCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc0NhdGVnb3J5KElTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYsIFN0cmluZyBjYXRlZ29yeSkgeworCQlJQ2F0ZWdvcnlbXSBjYXQgPSByZWYuZ2V0Q2F0ZWdvcmllcygpOworCQlpZiAoY2F0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpbnQgc2l6ZSA9IGNhdC5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXRbaV0uZ2V0TmFtZSgpKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKKwkJaWYgKGEgPT0gbnVsbCB8fCAiKiIuZXF1YWxzKGEpKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlpZiAoYiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhLCAiLCIpOworCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQlTdHJpbmcgYyA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCWlmIChiLmVxdWFscyhjKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxJRmVhdHVyZT4gZ2V0RmVhdHVyZXMoU3RyaW5nIGNhdGVnb3J5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGZlYXR1cmVMaXN0ICE9IG51bGwpCisJCQlyZXR1cm4gZmVhdHVyZUxpc3Q7CisJCQorCQlTdHJpbmcgZnJvbVNpdGUgPSBnZXRVcmwoKTsKKwkJCisJCUxpc3Q8SUZlYXR1cmU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElGZWF0dXJlPigpOworCQlpZiAoZnJvbVNpdGUgPT0gbnVsbCkKKwkJCXJldHVybiBsaXN0OworCQkKKwkJVVJMIGZyb21TaXRlVVJMID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWZyb21TaXRlVVJMID0gbmV3IFVSTChmcm9tU2l0ZSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbGlzdDsKKwkJfQorCQkKKwkJbW9uaXRvci5iZWdpblRhc2soIlNlYXJjaGluZyAiICsgZnJvbVNpdGUsIDEwMCk7CisJCUlTaXRlIHNpdGUgPSBudWxsOworCQl0cnkgeworCQkJc2l0ZSA9IEluc3RhbGxhYmxlUnVudGltZS5nZXRTaXRlKGZyb21TaXRlVVJMLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA1KSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVN0cmluZyBob3N0ID0gZnJvbVNpdGVVUkwuZ2V0SG9zdCgpOworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIGhvc3QsIGUpKTsKKwkJfQorCQkvLyBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbgorCQkKKwkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZVJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChoYXNDYXRlZ29yeShmZWF0dXJlUmVmc1tpXSwgY2F0ZWdvcnkpKSB7CisJCQkJaWYgKG1hdGNoZXMoZmVhdHVyZVJlZnNbaV0uZ2V0T1MoKSwgUGxhdGZvcm0uZ2V0T1MoKSkgJiYKKwkJCQkJCW1hdGNoZXMoZmVhdHVyZVJlZnNbaV0uZ2V0T1NBcmNoKCksIFBsYXRmb3JtLmdldE9TQXJjaCgpKSAmJgorCQkJCQkJbWF0Y2hlcyhmZWF0dXJlUmVmc1tpXS5nZXRXUygpLCBQbGF0Zm9ybS5nZXRXUygpKSkgeworCQkJCQlJRmVhdHVyZSBmZWF0dXJlMiA9IGZlYXR1cmVSZWZzW2ldLmdldEZlYXR1cmUoUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgNSkpOworCQkJCQlpZiAoZmVhdHVyZTIgIT0gbnVsbCkKKwkJCQkJCWxpc3QuYWRkKGZlYXR1cmUyKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbW9uaXRvci5kb25lKCk7CisJCQorCQlmZWF0dXJlTGlzdCA9IGxpc3Q7CisJCXJldHVybiBmZWF0dXJlTGlzdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkV4dGVuc2lvblNpdGVbIiArIGdldFVybCgpICsgIl0iOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9leHRlbnNpb24vRXh0ZW5zaW9uVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblV0aWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJmYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblV0aWxpdHkuamF2YQpAQCAtMCwwICsxLDMyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmV4dGVuc2lvbjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUxvY2FsU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVVJMRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWNhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmljYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUluc3RhbGxhYmxlU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTWVtZW50bzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSW5zdGFsbGFibGVTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuWE1MTWVtZW50bzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuUHJvZ3Jlc3NVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5FeHRlbnNpb25XaXphcmQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247CisKK3B1YmxpYyBjbGFzcyBFeHRlbnNpb25VdGlsaXR5IHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbGF1bmNoRXh0ZW5zaW9uV2l6YXJkKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7CisJCUV4dGVuc2lvbldpemFyZCB3aXphcmQyID0gbmV3IEV4dGVuc2lvbldpemFyZCh0aXRsZSwgbWVzc2FnZSk7CisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQyKTsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBFeHRlbnNpb25TaXRlW10gZ2V0RXh0ZW5zaW9uSXRlbXMoVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisJCXRyeSB7CisJCQlpbiA9IHVybC5vcGVuU3RyZWFtKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBVUkwgIiArIHVybCk7CisJCX0KKwkJCisJCWlmIChpbiA9PSBudWxsKQorCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICJDb3VsZCBub3QgbG9hZCBleHRlbnNpb25zIiwgbnVsbCkpOworCQkKKwkJdHJ5IHsKKwkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGluKTsKKwkJCUlNZW1lbnRvIGNoaWxkcmVuW10gPSBtZW1lbnRvLmdldENoaWxkcmVuKCJzaXRlIik7CisJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKKwkJCUxpc3Q8RXh0ZW5zaW9uU2l0ZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RXh0ZW5zaW9uU2l0ZT4oc2l6ZSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCUV4dGVuc2lvblNpdGUgaXRlbSA9IG5ldyBFeHRlbnNpb25TaXRlKGNoaWxkcmVuW2ldKTsKKwkJCQlsaXN0LmFkZChpdGVtKTsKKwkJCX0KKwkJCQorCQkJRXh0ZW5zaW9uU2l0ZVtdIGl0ZW1zID0gbmV3IEV4dGVuc2lvblNpdGVbbGlzdC5zaXplKCldOworCQkJbGlzdC50b0FycmF5KGl0ZW1zKTsKKwkJCXJldHVybiBpdGVtczsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gZXh0ZW5zaW9uIGl0ZW1zLgorCSAqIDxwPgorCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGV4dGVuc2lvbnMgaXRlbXMge0BsaW5rIEV4dGVuc2lvblNpdGV9CisJICovCisJcHVibGljIHN0YXRpYyBFeHRlbnNpb25TaXRlW10gZ2V0RXh0ZW5zaW9uSXRlbXMoKSB7CisJCVVSTCB1cmwgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJzZXJ2ZXJBZGFwdGVyU2l0ZXMueG1sIik7CisJCQorCQl0cnkgeworCQkJcmV0dXJuIGdldEV4dGVuc2lvbkl0ZW1zKHVybCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgZXh0ZW5zaW9uIGl0ZW1zIik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoZSBuZXcgZmVhdHVyZSBpcyBhbHJlYWR5IGluc3RhbGxlZCwgb3IgYSBuZXdlciBvbmUgaXMuCisJICogCisJICogQHBhcmFtIGV4aXN0aW5nCisJICogQHBhcmFtIG5ld0ZlYXR1cmUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5ldyBmZWF0dXJlIGlzIGFscmVhZHkgaW5zdGFsbGVkLCBvciBhIG5ld2VyIG9uZSBpcy4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gYWxyZWFkeUV4aXN0cyhMaXN0IGV4aXN0aW5nLCBJRmVhdHVyZSBuZXdGZWF0dXJlKSB7CisJCWlmIChleGlzdGluZy5jb250YWlucyhuZXdGZWF0dXJlKSkKKwkJCXJldHVybiB0cnVlOworCQkKKwkJVmVyc2lvbmVkSWRlbnRpZmllciBuZXdWaSA9IG5ld0ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQlTdHJpbmcgdmVyID0gbmV3VmkudG9TdHJpbmcoKTsKKwkJaW50IGluZCA9IHZlci5pbmRleE9mKCJfIik7CisJCWlmIChpbmQgPj0gMCkKKwkJCXZlciA9IHZlci5zdWJzdHJpbmcoaW5kKzEpOworCQlWZXJzaW9uIG5ld1YgPSBuZXcgVmVyc2lvbih2ZXIpOworCQkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGlzdGluZy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBpdGVyYXRvci5uZXh0KCk7CisJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IAorCQkJaWYgKHZpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobmV3VmkuZ2V0SWRlbnRpZmllcigpKSkgeworCQkJCXZlciA9IHZpLnRvU3RyaW5nKCk7CisJCQkJaW5kID0gdmVyLmluZGV4T2YoIl8iKTsKKwkJCQlpZiAoaW5kID49IDApCisJCQkJCXZlciA9IHZlci5zdWJzdHJpbmcoaW5kKzEpOworCQkJCVZlcnNpb24gbmV4dENhbmQgPSBuZXcgVmVyc2lvbih2ZXIpOworCQkJCWlmIChuZXh0Q2FuZC5jb21wYXJlVG8obmV3VikgPj0gMCkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmVhdHVyZShMaXN0PElGZWF0dXJlPiBsaXN0LCBMaXN0PElGZWF0dXJlPiBleGlzdGluZywgSUZlYXR1cmUgbmV3RmVhdHVyZSwgRmVhdHVyZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWlmIChhbHJlYWR5RXhpc3RzKGV4aXN0aW5nLCBuZXdGZWF0dXJlKSkKKwkJCXJldHVybjsKKwkJCisJCVZlcnNpb25lZElkZW50aWZpZXIgbmV3VmkgPSBuZXdGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJU3RyaW5nIHZlciA9IG5ld1ZpLnRvU3RyaW5nKCk7CisJCWludCBpbmQgPSB2ZXIuaW5kZXhPZigiXyIpOworCQlpZiAoaW5kID49IDApCisJCQl2ZXIgPSB2ZXIuc3Vic3RyaW5nKGluZCsxKTsKKwkJVmVyc2lvbiBuZXdWID0gbmV3IFZlcnNpb24odmVyKTsKKwkJSUZlYXR1cmUgcmVtb3ZlID0gbnVsbDsKKwkJCisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBpdGVyYXRvci5uZXh0KCk7CisJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IAorCQkJaWYgKHZpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobmV3VmkuZ2V0SWRlbnRpZmllcigpKSkgeworCQkJCXZlciA9IHZpLnRvU3RyaW5nKCk7CisJCQkJaW5kID0gdmVyLmluZGV4T2YoIl8iKTsKKwkJCQlpZiAoaW5kID49IDApCisJCQkJCXZlciA9IHZlci5zdWJzdHJpbmcoaW5kKzEpOworCQkJCVZlcnNpb24gbmV4dENhbmQgPSBuZXcgVmVyc2lvbih2ZXIpOworCQkJCWlmIChuZXh0Q2FuZC5jb21wYXJlVG8obmV3VikgPCAwKSB7CisJCQkJCXJlbW92ZSA9IGZlYXR1cmU7CisJCQkJfSBlbHNlIC8vIG5ldyBmZWF0dXJlIGlzIG9sZGVyCisJCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlpZiAocmVtb3ZlICE9IG51bGwpIHsKKwkJCWxpc3QucmVtb3ZlKHJlbW92ZSk7CisJCQlsaXN0ZW5lci5mZWF0dXJlUmVtb3ZlZChyZW1vdmUpOworCQl9CisJCQorCQlsaXN0LmFkZChuZXdGZWF0dXJlKTsKKwkJbGlzdGVuZXIuZmVhdHVyZUZvdW5kKG5ld0ZlYXR1cmUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGZWF0dXJlcyhMaXN0PElGZWF0dXJlPiBsaXN0LCBMaXN0PElGZWF0dXJlPiBleGlzdGluZywgTGlzdCBuZXdGZWF0dXJlcywgRmVhdHVyZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3RmVhdHVyZXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJYWRkRmVhdHVyZShsaXN0LCBleGlzdGluZywgKElGZWF0dXJlKSBpdGVyYXRvci5uZXh0KCksIGxpc3RlbmVyKTsKKwkJfQorCX0KKworCXB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZUxpc3RlbmVyIHsKKwkJcHVibGljIHZvaWQgZmVhdHVyZUZvdW5kKElGZWF0dXJlIGZlYXR1cmUpOworCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKTsKKwkJcHVibGljIHZvaWQgc2l0ZUZhaWx1cmUoU3RyaW5nIGhvc3QpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxJRmVhdHVyZT4gZ2V0RXhpc3RpbmdGZWF0dXJlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuaW5zdGFsbGFibGVTZXJ2ZXJMb2NhbCwgMTAwKTsKKwkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOworCQlpbnQgc2l6ZSA9IHNpdGVzLmxlbmd0aDsKKwkJTGlzdDxJRmVhdHVyZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZlYXR1cmU+KDIwMCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlc1tpXS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJaW50IHNpemUyID0gcmVmcy5sZW5ndGg7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQlJRmVhdHVyZSBmID0gcmVmc1tqXS5nZXRGZWF0dXJlKFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDUpKTsKKwkJCQlpZiAoIWxpc3QuY29udGFpbnMoZikpCisJCQkJCWxpc3QuYWRkKGYpOworCQkJfQorCQl9CisJCW1vbml0b3IuZG9uZSgpOworCQkKKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJcHVibGljIHN0YXRpYyBJRmVhdHVyZVtdIGdldEFsbEZlYXR1cmVzKGZpbmFsIFN0cmluZyBpZCwgZmluYWwgRmVhdHVyZUxpc3RlbmVyIGxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOworCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMTEwMCk7CisJCQorCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuaW5zdGFsbGFibGVTZXJ2ZXJMb2NhbCk7CisJCWZpbmFsIExpc3Q8SUZlYXR1cmU+IGV4aXN0aW5nID0gZ2V0RXhpc3RpbmdGZWF0dXJlcyhQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDApKTsKKwkJCisJCWZpbmFsIEV4dGVuc2lvblNpdGVbXSBpdGVtcyA9IEV4dGVuc2lvblV0aWxpdHkuZ2V0RXh0ZW5zaW9uSXRlbXMoKTsKKwkJSUluc3RhbGxhYmxlU2VydmVyW10gc2VydmVycyA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YWxsYWJsZVNlcnZlcnMoKTsKKwkJZmluYWwgaW50IHggPSAxMDAwIC8gKGl0ZW1zLmxlbmd0aCArIHNlcnZlcnMubGVuZ3RoKTsKKwkJCisJCW1vbml0b3Iud29ya2VkKDUwKTsKKwkJZmluYWwgTGlzdDxJRmVhdHVyZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZlYXR1cmU+KCk7CisJCWludCBzaXplID0gaXRlbXMubGVuZ3RoOworCQkKKwkJVGhyZWFkW10gdGhyZWFkcyA9IG5ldyBUaHJlYWRbc2l6ZV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQl0cnkgeworCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJCisJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmluc3RhbGxhYmxlU2VydmVyU2VhcmNoaW5nLCBpdGVtc1tpXS5nZXRVcmwoKSkpOworCQkJCWZpbmFsIGludCBpaSA9IGk7CisJCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMiA9IG1vbml0b3I7CisJCQkJdGhyZWFkc1tpXSA9IG5ldyBUaHJlYWQoIkV4dGVuc2lvbiBDaGVja2VyIikgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCUxpc3Q8SUZlYXR1cmU+IGxpc3QyID0gaXRlbXNbaWldLmdldEZlYXR1cmVzKGlkLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yMiwgeCkpOworCQkJCQkJCWFkZEZlYXR1cmVzKGxpc3QsIGV4aXN0aW5nLCBsaXN0MiwgbGlzdGVuZXIpOworCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQkJCWxpc3RlbmVyLnNpdGVGYWlsdXJlKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGRvd25sb2FkaW5nIHNlcnZlciBhZGFwdGVyIGluZm8iLCBjZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJCXRocmVhZHNbaV0uc2V0RGFlbW9uKHRydWUpOworCQkJCXRocmVhZHNbaV0uc3RhcnQoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGRvd25sb2FkaW5nIHNlcnZlciBhZGFwdGVyIGluZm8gMiIsIGUpOworCQkJfQorCQl9CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJCXJldHVybiBudWxsOworCQkJCQorCQkJCWlmICh0aHJlYWRzW2ldLmlzQWxpdmUoKSkKKwkJCQkJdGhyZWFkc1tpXS5qb2luKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBkb3dubG9hZGluZyBzZXJ2ZXIgYWRhcHRlciBpbmZvIDMiLCBlKTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gYWRkIGluc3RhbGxhYmxlIHNlcnZlcnMKKwkJc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlJbnN0YWxsYWJsZVNlcnZlciBpcyA9IChJbnN0YWxsYWJsZVNlcnZlcikgc2VydmVyc1tpXTsKKwkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5pbnN0YWxsYWJsZVNlcnZlclNlYXJjaGluZywgaXMuZ2V0RnJvbVNpdGUoKSkpOworCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGlzLmdldEZlYXR1cmUoUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgeCkpOworCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKKwkJCQlhZGRGZWF0dXJlKGxpc3QsIGV4aXN0aW5nLCBmZWF0dXJlLCBsaXN0ZW5lcik7CisJCX0KKwkJCisJCUlGZWF0dXJlW10gZWYgPSBuZXcgSUZlYXR1cmVbbGlzdC5zaXplKCldOworCQlsaXN0LnRvQXJyYXkoZWYpOworCQltb25pdG9yLmRvbmUoKTsKKwkJcmV0dXJuIGVmOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpY2Vuc2UoSUZlYXR1cmUgZmVhdHVyZSkgeworCQlJVVJMRW50cnkgbGljZW5zZSA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpOworCQlpZiAobGljZW5zZSAhPSBudWxsKQorCQkJcmV0dXJuIGxpY2Vuc2UuZ2V0QW5ub3RhdGlvbigpOworCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSUZlYXR1cmUgZmVhdHVyZSkgeworCQlJVVJMRW50cnkgbGljZW5zZSA9IGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKTsKKwkJaWYgKGxpY2Vuc2UgIT0gbnVsbCkKKwkJCXJldHVybiBsaWNlbnNlLmdldEFubm90YXRpb24oKTsKKwkJCisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbGFibGVTZXJ2ZXIjaW5zdGFsbChJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsKElGZWF0dXJlIGZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0cnkgeworCQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyID0gbmV3IElWZXJpZmljYXRpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgaW50IHByb21wdChJVmVyaWZpY2F0aW9uUmVzdWx0IHJlc3VsdCkgeworCQkJCQlyZXR1cm4gQ0hPSUNFX0lOU1RBTExfVFJVU1RfT05DRTsKKwkJCQl9CisJCQl9OworCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5pbnN0YWxsKGZlYXR1cmUsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBtb25pdG9yKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGluc3RhbGxpbmcgc2VydmVyIGFkYXB0ZXIiLCBjZSk7CisJCQl0aHJvdyBjZTsKKwkJfQorCQkKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcCgxMDAwKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Nvbm5lY3RlZFVJRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Db25uZWN0ZWRVSURlY29yYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhN2QyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Db25uZWN0ZWRVSURlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworCitwdWJsaWMgY2xhc3MgQ29ubmVjdGVkVUlEZWNvcmF0b3IgZXh0ZW5kcyBVSURlY29yYXRvciB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc2VydmVyU3RhdGVVbm1hbmFnZWQgPSBuZXcgU3RyaW5nW10geworCQkiIiwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nNCwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQyLAorCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmc0LAorCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZDJ9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RhcnRpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMSwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMiwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nM307CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RvcHBpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMSwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMiwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nM307CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VbXSBzdGFydGluZ0ltYWdlcyA9IG5ldyBJbWFnZVtdIHsKKwkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMSksCisJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzIpLAorCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18zKQorCX07CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VbXSBzdG9wcGluZ0ltYWdlcyA9IG5ldyBJbWFnZVtdIHsKKwkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMSksCisJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzIpLAorCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yKQorCX07CisKKwkvKioKKwkgKiBAc2VlIFVJRGVjb3JhdG9yI2dldFN0YXRlTGFiZWwoaW50LCBTdHJpbmcsIGludCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0YXRlTGFiZWwoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7CisJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCisJCQlyZXR1cm4gIiI7CisJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpCisJCQlyZXR1cm4gc3RhcnRpbmdUZXh0W2NvdW50XTsKKwkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKKwkJCXJldHVybiBzdG9wcGluZ1RleHRbY291bnRdOworCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKKwkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKKwkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWREZWJ1ZzsKKwkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCisJCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkUHJvZmlsZTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQ7CisJCX0gZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQorCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGVkOworCQkKKwkJcmV0dXJuIHNlcnZlclN0YXRlVW5tYW5hZ2VkW3N0YXRlXTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIFVJRGVjb3JhdG9yI2dldFN0YXRlSW1hZ2UoaW50LCBTdHJpbmcsIGludCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZ2V0U3RhdGVJbWFnZShpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpIHsKKwkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKKwkJCXJldHVybiBudWxsOworCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQorCQkJcmV0dXJuIHN0YXJ0aW5nSW1hZ2VzW2NvdW50XTsKKwkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKKwkJCXJldHVybiBzdG9wcGluZ0ltYWdlc1tjb3VudF07CisJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKKwkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUEVEKTsKKwkJZWxzZSB7IC8vaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgeworCQkJLy9TdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7CisJCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCisJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUcpOworCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKKwkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRCk7CisJCX0KKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FuUmVzdGFydCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXR1cEFjdGlvbihBY3Rpb24gYWN0aW9uLCBpbnQgYWN0aW9uMikgeworCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU3RvcFRvb2xUaXAyKTsKKwkJYWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RvcDIpOworCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfRElTQ09OTkVDVCkpOworCQlhY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9ESVNDT05ORUNUKSk7CisJCWFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX0RJU0NPTk5FQ1QpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVNlcnZlclRvb2xUaXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lTZXJ2ZXJUb29sVGlwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4NTNkMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lTZXJ2ZXJUb29sVGlwLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKKy8qKgorICogUHJvdmlkZXMgZXh0cmEgaW5mb3JtYXRpb24gdG8gdGhlIGhvdmVyIG92ZXIgbW91c2UgYWN0aW9uIG9mIGEgc2VydmVyCisgKiA8cD4KKyAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCisgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCisgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKKyAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVNlcnZlclRvb2xUaXAgeworCS8qKgorCSAqIEFsbG93cyBhZG9wdGVycyB0byBhZGQgd2lkZ2V0cyB0byB0aGUgdG9vbHRpcC4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQKKwkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQsIElTZXJ2ZXIgc2VydmVyKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9NYW5hZ2VkVUlEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL01hbmFnZWRVSURlY29yYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjA2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9NYW5hZ2VkVUlEZWNvcmF0b3IuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisKK3B1YmxpYyBjbGFzcyBNYW5hZ2VkVUlEZWNvcmF0b3IgZXh0ZW5kcyBVSURlY29yYXRvciB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc2VydmVyU3RhdGVVbm1hbmFnZWQgPSBuZXcgU3RyaW5nW10geworCQkiIiwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nNCwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQyLAorCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmc0LAorCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZDJ9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RhcnRpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMSwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMiwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nM307CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RvcHBpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMSwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMiwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nM307CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VbXSBzdGFydGluZ0ltYWdlcyA9IG5ldyBJbWFnZVtdIHsKKwkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMSksCisJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzIpLAorCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18zKQorCX07CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VbXSBzdG9wcGluZ0ltYWdlcyA9IG5ldyBJbWFnZVtdIHsKKwkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMSksCisJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzIpLAorCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yKQorCX07CisKKwkvKioKKwkgKiBAc2VlIFVJRGVjb3JhdG9yI2dldFN0YXRlTGFiZWwoaW50LCBTdHJpbmcsIGludCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0YXRlTGFiZWwoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7CisJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCisJCQlyZXR1cm4gIiI7CisJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpCisJCQlyZXR1cm4gc3RhcnRpbmdUZXh0W2NvdW50XTsKKwkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKKwkJCXJldHVybiBzdG9wcGluZ1RleHRbY291bnRdOworCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKKwkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKKwkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWREZWJ1ZzsKKwkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCisJCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkUHJvZmlsZTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQ7CisJCX0gZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQorCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGVkOworCQkKKwkJcmV0dXJuIHNlcnZlclN0YXRlVW5tYW5hZ2VkW3N0YXRlXTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIFVJRGVjb3JhdG9yI2dldFN0YXRlSW1hZ2UoaW50LCBTdHJpbmcsIGludCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZ2V0U3RhdGVJbWFnZShpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpIHsKKwkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKKwkJCXJldHVybiBudWxsOworCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQorCQkJcmV0dXJuIHN0YXJ0aW5nSW1hZ2VzW2NvdW50XTsKKwkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKKwkJCXJldHVybiBzdG9wcGluZ0ltYWdlc1tjb3VudF07CisJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKKwkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUEVEKTsKKwkJZWxzZSB7IC8vaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgeworCQkJLy9TdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7CisJCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCisJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUcpOworCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKKwkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRCk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoKSB7CisJCXJldHVybiAibW9kdWxlIjsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FuUmVzdGFydCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1B1Ymxpc2hlZFVJRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9QdWJsaXNoZWRVSURlY29yYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjYzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9QdWJsaXNoZWRVSURlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKworcHVibGljIGNsYXNzIFB1Ymxpc2hlZFVJRGVjb3JhdG9yIGV4dGVuZHMgVUlEZWNvcmF0b3IgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNlcnZlclN0YXRlVW5tYW5hZ2VkID0gbmV3IFN0cmluZ1tdIHsKKwkJIiIsCisJCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzQsCisJCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkMiwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nNCwKKwkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwZWQyfTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0YXJ0aW5nVGV4dCA9IG5ldyBTdHJpbmdbXSB7CisJCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzEsCisJCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzIsCisJCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzN9OworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0b3BwaW5nVGV4dCA9IG5ldyBTdHJpbmdbXSB7CisJCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzEsCisJCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzIsCisJCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzN9OworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlW10gc3RhcnRpbmdJbWFnZXMgPSBuZXcgSW1hZ2VbXSB7CisJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzEpLAorCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18yKSwKKwkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMykKKwl9OworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlW10gc3RvcHBpbmdJbWFnZXMgPSBuZXcgSW1hZ2VbXSB7CisJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzEpLAorCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yKSwKKwkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMikKKwl9OworCisJLyoqCisJICogQHNlZSBVSURlY29yYXRvciNnZXRTdGF0ZUxhYmVsKGludCwgU3RyaW5nLCBpbnQpCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdGF0ZUxhYmVsKGludCBzdGF0ZSwgU3RyaW5nIG1vZGUsIGludCBjb3VudCkgeworCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQorCQkJcmV0dXJuICIiOworCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQorCQkJcmV0dXJuIHN0YXJ0aW5nVGV4dFtjb3VudF07CisJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCisJCQlyZXR1cm4gc3RvcHBpbmdUZXh0W2NvdW50XTsKKwkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7CisJCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCisJCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkRGVidWc7CisJCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQorCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZFByb2ZpbGU7CisJCQllbHNlCisJCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkOworCQl9IGVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKKwkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZDsKKwkJCisJCXJldHVybiBzZXJ2ZXJTdGF0ZVVubWFuYWdlZFtzdGF0ZV07CisJfQorCisJLyoqCisJICogQHNlZSBVSURlY29yYXRvciNnZXRTdGF0ZUltYWdlKGludCwgU3RyaW5nLCBpbnQpCisJICovCisJcHVibGljIEltYWdlIGdldFN0YXRlSW1hZ2UoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7CisJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCisJCQlyZXR1cm4gbnVsbDsKKwkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKKwkJCXJldHVybiBzdGFydGluZ0ltYWdlc1tjb3VudF07CisJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCisJCQlyZXR1cm4gc3RvcHBpbmdJbWFnZXNbY291bnRdOworCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCisJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBFRCk7CisJCWVsc2UgeyAvL2lmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKKwkJCS8vU3RyaW5nIG1vZGUgPSBzZXJ2ZXIuZ2V0TW9kZSgpOworCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQorCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX0RFQlVHKTsKKwkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCisJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRSk7CisJCQllbHNlCisJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURUQpOworCQl9CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgeworCQlyZXR1cm4gIm1vZHVsZSI7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNhblJlc3RhcnQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9TZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5RGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQwNzRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSVNlcnZlckVkaXRvclBhcnRJbnB1dDsKKy8qKgorICogCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5RGVsZWdhdGUgeworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVkaXRvciBhY3Rpb24gc2hvdWxkIGJlIHZpc2libGUgb24gdGhlIGdpdmVuCisJICogc2VydmVyLiBUaGlzIGFsbG93cyBhY3Rpb25zIHRvIGJlIGZpbHRlcmVkIGJhc2VkIG9uIHRoZSBzZXJ2ZXIgdHlwZQorCSAqIG9yIHNlcnZlciBhdHRyaWJ1dGVzLgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciBiZWluZyBlZGl0ZWQKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGRpc3BsYXllZCwgb3IKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gc2hvdWxkRGlzcGxheShJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0aGUgYWN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBzaXRlIHRoZSBlZGl0b3Igc2l0ZQorCSAqIEBwYXJhbSBpbnB1dCB0aGUgc2VydmVyIGVkaXRvciBwb3J0IGlucHV0CisJICogQHJldHVybiBhbiBhY3Rpb24gdGhhdCBjYW4gYmUgcnVuIGFnYWluc3QgdGhlIHNlcnZlcgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihJRWRpdG9yU2l0ZSBzaXRlLCBJU2VydmVyRWRpdG9yUGFydElucHV0IGlucHV0KTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9VSURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVUlEZWNvcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTk5NTJkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVUlEZWNvcmF0b3IuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFVJRGVjb3JhdG9yIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU1RPUCA9IDA7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gc3RhdGUuCisJICoKKwkgKiBAcGFyYW0gc3RhdGUgYSBzZXJ2ZXIgc3RhdGUKKwkgKiBAcGFyYW0gbW9kZSBhIGxhdW5jaCBtb2RlCisJICogQHBhcmFtIGNvdW50IGEgdGltZXIgY291bnQKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXRlTGFiZWwoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KTsKKworCS8qKgorCSAqIFJldHVybnMgYW4gaW1hZ2UgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBzdGF0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gc3RhdGUgYSBzZXJ2ZXIgc3RhdGUKKwkgKiBAcGFyYW0gbW9kZSBhIGxhdW5jaCBtb2RlCisJICogQHBhcmFtIGNvdW50IGEgdGltZXIgY291bnQKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnBhcnRzLklJbWFnZQorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBJbWFnZSBnZXRTdGF0ZUltYWdlKGludCBzdGF0ZSwgU3RyaW5nIG1vZGUsIGludCBjb3VudCk7CisKKwlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoKSB7CisJCXJldHVybiAibW9kdWxlIjsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FuUmVzdGFydCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXR1cEFjdGlvbihBY3Rpb24gYWN0aW9uLCBpbnQgYWN0aW9uMikgeworCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU3RvcFRvb2xUaXApOworCQlhY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TdG9wKTsKKwkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUT1ApKTsKKwkJYWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RPUCkpOworCQlhY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVE9QKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VJRGVjb3JhdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVUlEZWNvcmF0b3JNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1ZmRjZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VJRGVjb3JhdG9yTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKKworcHVibGljIGNsYXNzIFVJRGVjb3JhdG9yTWFuYWdlciB7CisJcHJvdGVjdGVkIHN0YXRpYyBVSURlY29yYXRvciBkZWNvcmF0b3IgPSBuZXcgTWFuYWdlZFVJRGVjb3JhdG9yKCk7CisJCisJcHVibGljIHN0YXRpYyBVSURlY29yYXRvciBnZXRVSURlY29yYXRvcihJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7CisJCXJldHVybiBkZWNvcmF0b3I7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9BYnN0cmFjdFNlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0Fic3RyYWN0U2VydmVyQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5OWY1NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9BYnN0cmFjdFNlcnZlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25Qcm92aWRlckFjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworLyoqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgYW4gYWN0aW9uIG9uIGEgc2VydmVyLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7CisJcHJvdGVjdGVkIFNoZWxsIHNoZWxsOworCisJcHVibGljIEFic3RyYWN0U2VydmVyQWN0aW9uKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciwgU3RyaW5nIHRleHQpIHsKKwkJdGhpcyhudWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgdGV4dCk7CisJfQorCisJcHVibGljIEFic3RyYWN0U2VydmVyQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsIFN0cmluZyB0ZXh0KSB7CisJCXN1cGVyKHNlbGVjdGlvblByb3ZpZGVyLCB0ZXh0KTsKKwkJdGhpcy5zaGVsbCA9IHNoZWxsOworCQlzZXRFbmFibGVkKGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNlcnZlciBjYW4gY3VycmVudGx5IGJlIGFjdGVkIG9uLgorCSAqCisJICogQHJldHVybiBib29sZWFuCisJICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgorCSAqLworCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtIGFjdGlvbiBvbiB0aGlzIHNlcnZlci4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcik7CisKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpLml0ZXJhdG9yKCk7CisJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7CisJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKSB7CisJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7CisJCQlpZiAoYWNjZXB0KHNlcnZlcikpCisJCQkJcGVyZm9ybShzZXJ2ZXIpOworCQkJc2VsZWN0aW9uQ2hhbmdlZChnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVXBkYXRlIHRoZSBlbmFibGVkIHN0YXRlLgorCSAqIAorCSAqIEBwYXJhbSBzZWwgYSBzZWxlY3Rpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCkgeworCQlpZiAoc2VsLmlzRW1wdHkoKSkgeworCQkJc2V0RW5hYmxlZChmYWxzZSk7CisJCQlyZXR1cm47CisJCX0KKwkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7CisJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgeworCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKKwkJCQlpZiAoYWNjZXB0KHNlcnZlcikpCisJCQkJCWVuYWJsZWQgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlzZXRFbmFibGVkKGZhbHNlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJc2V0RW5hYmxlZChlbmFibGVkKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0NvcHlBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Db3B5QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljZmYxMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Db3B5QWN0aW9uLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqICJDb3B5IiBtZW51IGFjdGlvbi4KKyAqLworcHVibGljIGNsYXNzIENvcHlBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7CisJcHJvdGVjdGVkIEFjdGlvbiBwYXN0ZUFjdGlvbjsKKwlwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7CisKKwkvKioKKwkgKiBDb3B5QWN0aW9uIGNvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBzcCBhIHNlbGVjdGlvbiBwcm92aWRlcgorCSAqIEBwYXJhbSBjbGlwYm9hcmQgdGhlIGNsaXBib2FyZAorCSAqIEBwYXJhbSBwYXN0ZUFjdGlvbiB0aGUgcGFzdGUgYWN0aW9uCisJICovCisJcHVibGljIENvcHlBY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNwLCBDbGlwYm9hcmQgY2xpcGJvYXJkLCBBY3Rpb24gcGFzdGVBY3Rpb24pIHsKKwkJc3VwZXIoc3AsIE1lc3NhZ2VzLmFjdGlvbkNvcHkpOworCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7CisJCXNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOworCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWV9ESVNBQkxFRCkpOworCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuQ09QWSk7CisJCQorCQl0aGlzLmNsaXBib2FyZCA9IGNsaXBib2FyZDsKKwkJdGhpcy5wYXN0ZUFjdGlvbiA9IHBhc3RlQWN0aW9uOworCX0KKworCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgeworCQlyZXR1cm4gc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKKwkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7IG5ldyBJU2VydmVyW10geyBzZXJ2ZXIgfSwgc2VydmVyLmdldE5hbWUoKSB9LAorCQkJbmV3IFRyYW5zZmVyW10geyBTZXJ2ZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKKwkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0RlbGV0ZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0RlbGV0ZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYmYxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvRGVsZXRlQWN0aW9uLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5EZWxldGVTZXJ2ZXJEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKy8qKgorICogQWN0aW9uIGZvciBkZWxldGluZyBzZXJ2ZXIgcmVzb3VyY2VzLgorICovCitwdWJsaWMgY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24geworCXByb3RlY3RlZCBJU2VydmVyW10gc2VydmVyczsKKwlwcm90ZWN0ZWQgSUZvbGRlcltdIGNvbmZpZ3M7CisKKwkvKioKKwkgKiBEZWxldGVBY3Rpb24gY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKKwkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKKwkgKi8KKwlwdWJsaWMgRGVsZXRlQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc3ApIHsKKwkJc3VwZXIoc2hlbGwsIHNwLCBNZXNzYWdlcy5hY3Rpb25EZWxldGUpOworCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7CisJCXNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7CisJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEVfRElTQUJMRUQpKTsKKwkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLkRFTEVURSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7CisJCXNlcnZlcnMgPSBuZXcgSVNlcnZlcltdIHsgc2VydmVyIH07CisJCUxpc3Q8SUZvbGRlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZvbGRlcj4oKTsKKwkJCisJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAoc2VydmVyc1tpXS5pc1JlYWRPbmx5KCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlpZiAoc2VydmVyc1tpXS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkKKwkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSk7CisJCX0KKwkJCisJCS8vIHJlbW92ZSBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBzdGlsbCByZWZlcmVuY2VkIGJ5IG90aGVyIHNlcnZlcnMKKwkJSVNlcnZlcltdIHNlcnZlcnMyID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CisJCWlmIChzZXJ2ZXJzMiAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzMi5sZW5ndGg7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkJaWYgKHNlcnZlcnNbaV0uZXF1YWxzKHNlcnZlcnMyW2pdKSkKKwkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQl9CisJCQkJaWYgKCFmb3VuZCkgeworCQkJCQlJRm9sZGVyIGZvbGRlciA9IHNlcnZlcnMyW2pdLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKKwkJCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIGxpc3QuY29udGFpbnMoZm9sZGVyKSkKKwkJCQkJCWxpc3QucmVtb3ZlKGZvbGRlcik7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQljb25maWdzID0gbmV3IElGb2xkZXJbbGlzdC5zaXplKCldOworCQlsaXN0LnRvQXJyYXkoY29uZmlncyk7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKKwkJRGVsZXRlU2VydmVyRGlhbG9nIGRzZCA9IG5ldyBEZWxldGVTZXJ2ZXJEaWFsb2coc2hlbGwsIHNlcnZlcnMsIGNvbmZpZ3MpOworCQlkc2Qub3BlbigpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmZmEwNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb2R1bGVTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5JU2VydmVyTW9kdWxlOworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3MgZm9yIHJlZmVyZW5jaW5nIGEgc2VydmVyIGFuZCBhIG1vZHVsZSBhdCB0aGUgc2FtZSB0aW1lLgorICovCitwdWJsaWMgY2xhc3MgTW9kdWxlU2VydmVyIGltcGxlbWVudHMgSVNlcnZlck1vZHVsZSB7CisJLyoqCisJICogVGhlIHNlcnZlcgorCSAqLworCXB1YmxpYyBJU2VydmVyIHNlcnZlcjsKKworCS8qKgorCSAqIFRoZSBtb2R1bGUKKwkgKi8KKwlwdWJsaWMgSU1vZHVsZVtdIG1vZHVsZTsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBtb2R1bGUtc2VydmVyLgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQorCSAqLworCXB1YmxpYyBNb2R1bGVTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVbXSBtb2R1bGUpIHsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJCXRoaXMubW9kdWxlID0gbW9kdWxlOworCQlpZiAobW9kdWxlID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgbW9kdWxlIGJlbG9uZ3MgdG8uCisJICogCisJICogQHJldHVybiB0aGUgc2VydmVyCisJICovCisJcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgeworCQlyZXR1cm4gc2VydmVyOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1vZHVsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtb2R1bGUKKwkgKi8KKwlwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZSgpIHsKKwkJcmV0dXJuIG1vZHVsZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBvYmo7CisJCQorCQlpZiAobXMuc2VydmVyID09IG51bGwgJiYgc2VydmVyICE9IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpZiAobXMuc2VydmVyICE9IG51bGwgJiYgIW1zLnNlcnZlci5lcXVhbHMoc2VydmVyKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChtcy5tb2R1bGUubGVuZ3RoICE9IG1vZHVsZS5sZW5ndGgpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAoIW1vZHVsZVtpXS5lcXVhbHMobXMubW9kdWxlW2ldKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJc2IuYXBwZW5kKCJTZXJ2ZXItTW9kdWxlIFsiICsgc2VydmVyLmdldElkKCkgKyAiLyIgKyBzZXJ2ZXIuZ2V0TmFtZSgpICsgIiwgKCIpOworCQllbHNlCisJCQlzYi5hcHBlbmQoIlNlcnZlci1Nb2R1bGUgW251bGwsICgiKTsKKwkJCisJCWludCBzaXplID0gbW9kdWxlLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmIChpID4gMCkKKwkJCQlzYi5hcHBlbmQoIiwgIik7CisJCQlzYi5hcHBlbmQobW9kdWxlW2ldLmdldE5hbWUoKSk7CisJCX0KKwkJc2IuYXBwZW5kKCIpXSIpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vZHVsZVNsb3NoQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2xvc2hBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlkMDcxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vZHVsZVNsb3NoQWN0aW9uLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLk1vZGlmeU1vZHVsZXNXaXphcmQ7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTW9kdWxlU2xvc2hBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7CisJcHVibGljIE1vZHVsZVNsb3NoQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpIHsKKwkJc3VwZXIoc2hlbGwsIHNlbGVjdGlvblByb3ZpZGVyLCBNZXNzYWdlcy5hY3Rpb25Nb2RpZnlNb2R1bGVzKTsKKwkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uTW9kaWZ5TW9kdWxlc1Rvb2xUaXApOworCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRVRPT0xfTU9ESUZZX01PRFVMRVMpKTsKKwkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ1RPT0xfTU9ESUZZX01PRFVMRVMpKTsKKwkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRFRPT0xfTU9ESUZZX01PRFVMRVMpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNlcnZlciBjYW4gY3VycmVudGx5IGJlIGFjdGVkIG9uLgorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtIGFjdGlvbiBvbiB0aGlzIHNlcnZlci4KKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICovCisJcHVibGljIHZvaWQgcGVyZm9ybShmaW5hbCBJU2VydmVyIHNlcnZlcikgeworCQlpZiAoc2VydmVyID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQkvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IG1vZHVsZXMgZmlyc3QKKwkJLy8gZ2V0IGN1cnJlbnRseSBkZXBsb3llZCBtb2R1bGVzCisJCUxpc3Q8SU1vZHVsZT4gZGVwbG95ZWQgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CisJCUxpc3Q8SU1vZHVsZT4gbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKKwkJSU1vZHVsZVtdIGN1cnJlbnRNb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKKwkJaWYgKGN1cnJlbnRNb2R1bGVzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gY3VycmVudE1vZHVsZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlkZXBsb3llZC5hZGQoY3VycmVudE1vZHVsZXNbaV0pOworCQkJfQorCQl9CisJCQorCQkvLyBnZXQgcmVtYWluaW5nIG1vZHVsZXMKKwkJSU1vZHVsZVtdIG1vZHVsZXMyID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpKTsKKwkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gbW9kdWxlczIubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXMyW2ldOworCQkJCWlmICghZGVwbG95ZWQuY29udGFpbnMobW9kdWxlKSkgeworCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHNlcnZlci5jYW5Nb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCwgbnVsbCk7CisJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKQorCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCWlmIChkZXBsb3llZC5pc0VtcHR5KCkgJiYgbW9kdWxlcy5pc0VtcHR5KCkpIHsKKwkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCBNZXNzYWdlcy5kZWZhdWx0RGlhbG9nVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ0FkZFJlbW92ZU1vZHVsZXNOb25lKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJTW9kaWZ5TW9kdWxlc1dpemFyZCB3aXphcmQgPSBuZXcgTW9kaWZ5TW9kdWxlc1dpemFyZChzZXJ2ZXIpOworCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKKwkJZGlhbG9nLm9wZW4oKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vbml0b3JQcm9wZXJ0eVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yUHJvcGVydHlQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5YzNmMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yUHJvcGVydHlQYWdlLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuTW9uaXRvckNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CisvKioKKyAqIFByZWZlcmVuY2UgcGFnZSB0aGF0IGFsbG93cyBhIHVzZXIgdG8gbW9uaXRvciBwb3J0cyBmcm9tIGEgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgTW9uaXRvclByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7CisJcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOworCXByb3RlY3RlZCBNb25pdG9yQ29tcG9zaXRlIG1vbml0b3JDb21wOworCisJLyoqCisJICogTW9uaXRvclByb3BlcnR5UGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBNb25pdG9yUHJvcGVydHlQYWdlKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0aGUgYm9keSBvZiB0aGUgcGFnZS4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCisJICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7CisJCXNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50LmdldEFkYXB0ZXIoSVNlcnZlci5jbGFzcyk7CisJCQorCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZGF0YS53aWR0aEhpbnQgPSA1NTA7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKKwkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlRFUk1JTkFURV9TRVJWRVJfRElBTE9HKTsKKwkJCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOworCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JEZXNjcmlwdGlvbiwgbmV3IFN0cmluZ1tdIHsgc2VydmVyLmdldE5hbWUoKSB9ICkpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQltb25pdG9yQ29tcCA9IG5ldyBNb25pdG9yQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUsIG51bGwsIHNlcnZlcik7CisJCW1vbml0b3JDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKKwkJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKKwkJCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yU2VydmVyUG9ydEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vbml0b3JTZXJ2ZXJQb3J0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzYjYzMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yU2VydmVyUG9ydEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb25pdG9yZWRTZXJ2ZXJQb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU2VydmVyTW9uaXRvck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworLyoqCisgKiBNb25pdG9yIGEgc2VydmVyIHBvcnQuCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yU2VydmVyUG9ydEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJcHJvdGVjdGVkIFNoZWxsIHNoZWxsOworCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKKwlwcm90ZWN0ZWQgU2VydmVyUG9ydCBwb3J0OworCXByb3RlY3RlZCBJTW9uaXRvcmVkU2VydmVyUG9ydCBtb25pdG9yZWRQb3J0OworCXByb3RlY3RlZCBib29sZWFuIGNoZWNrZWQ7CisJCisJcHVibGljIE1vbml0b3JTZXJ2ZXJQb3J0QWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0KSB7CisJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmFjdGlvbk1vbml0b3JQb3J0LCBuZXcgU3RyaW5nW10geyBwb3J0LmdldFBvcnQoKSArICIiLCBwb3J0LmdldE5hbWUoKSB9KSk7CisJCQorCQl0aGlzLnNoZWxsID0gc2hlbGw7CisJCXRoaXMuc2VydmVyID0gc2VydmVyOworCQl0aGlzLnBvcnQgPSBwb3J0OworCQkKKwkJSU1vbml0b3JlZFNlcnZlclBvcnRbXSBtc3BzID0gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb25pdG9yZWRQb3J0cyhzZXJ2ZXIpOworCQlpZiAobXNwcyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IG1zcHMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAocG9ydC5lcXVhbHMobXNwc1tpXS5nZXRTZXJ2ZXJQb3J0KCkpICYmIC8vIG1zcHNbaV0uaXNTdGFydGVkKCkgJiYKKwkJCQkJCShtc3BzW2ldLmdldENvbnRlbnRUeXBlcygpID09IG51bGwgfHwgbXNwc1tpXS5nZXRDb250ZW50VHlwZXMoKS5sZW5ndGggPT0gMCB8fAorCQkJCQkJKHBvcnQuZ2V0Q29udGVudFR5cGVzKCkgIT0gbnVsbCAmJiBtc3BzW2ldLmdldENvbnRlbnRUeXBlcygpLmxlbmd0aCA9PSBwb3J0LmdldENvbnRlbnRUeXBlcygpLmxlbmd0aCkpKQorCQkJCQltb25pdG9yZWRQb3J0ID0gbXNwc1tpXTsKKwkJCX0KKwkJfQorCisJCWNoZWNrZWQgPSBtb25pdG9yZWRQb3J0ICE9IG51bGw7IC8vICYmIG1vbml0b3JlZFBvcnQuaXNTdGFydGVkKCk7CisJCXNldENoZWNrZWQoY2hlY2tlZCk7CisJfQorCisJLyoqCisJICogRW5hYmxlIG9yIGRpc2FibGUgbW9uaXRvcmluZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCUlTZXJ2ZXJNb25pdG9yTWFuYWdlciBzbW0gPSBTZXJ2ZXJNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpOworCQlpZiAoY2hlY2tlZCkgeworCQkJc21tLnJlbW92ZU1vbml0b3IobW9uaXRvcmVkUG9ydCk7CisJCX0gZWxzZSB7CisJCQlpZiAobW9uaXRvcmVkUG9ydCA9PSBudWxsKQorCQkJCW1vbml0b3JlZFBvcnQgPSBzbW0uY3JlYXRlTW9uaXRvcihzZXJ2ZXIsIHBvcnQsIC0xLCBudWxsKTsKKwkJCQorCQkJdHJ5IHsKKwkJCQlzbW0uc3RhcnRNb25pdG9yKG1vbml0b3JlZFBvcnQpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbW9uaXRvciIsIGUpOworCQkJfQorCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9PcGVuQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvT3BlbkFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTU1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvT3BlbkFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOworLyoqCisgKiAiT3BlbiIgbWVudSBhY3Rpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBPcGVuQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24geworCS8qKgorCSAqIE9wZW5BY3Rpb24gY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIHNwIGEgc2VsZWN0aW9uIHByb3ZpZGVyCisJICovCisJcHVibGljIE9wZW5BY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNwKSB7CisJCXN1cGVyKHNwLCBNZXNzYWdlcy5hY3Rpb25PcGVuKTsKKwkJCisJCS8vc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuT3BlbiIpOworCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLmpkdC51aS5lZGl0LnRleHQuamF2YS5vcGVuLmVkaXRvciIpOworCX0KKworCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKKwkJdHJ5IHsKKwkJCVNlcnZlclVJUGx1Z2luLmVkaXRTZXJ2ZXIoc2VydmVyKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGVkaXRpbmcgZWxlbWVudCIsIGUpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QYXN0ZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Bhc3RlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5MDA2NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QYXN0ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CisvKioKKyAqICJQYXN0ZSIgbWVudSBhY3Rpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBQYXN0ZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvblByb3ZpZGVyQWN0aW9uIHsKKwlwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7CisKKwkvKioKKwkgKiBQYXN0ZUFjdGlvbiBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbDsKKwkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKKwkgKiBAcGFyYW0gY2xpcGJvYXJkIHRoZSBjbGlwYm9hcmQKKwkgKi8KKwlwdWJsaWMgUGFzdGVBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzcCwgQ2xpcGJvYXJkIGNsaXBib2FyZCkgeworCQlzdXBlcihzcCwgTWVzc2FnZXMuYWN0aW9uUGFzdGUpOworCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7CisJCXNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEUpKTsKKwkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1BBU1RFX0RJU0FCTEVEKSk7CisJCXNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5QQVNURSk7CisJCQorCQl0aGlzLmNsaXBib2FyZCA9IGNsaXBib2FyZDsKKwkJLy9zZXRFbmFibGVkKGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIGVuYWJsZWQgc3RhdGUuCisJICogCisJICogQHBhcmFtIHNlbCBhIHNlbGVjdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKSB7CisJCVNlcnZlclRyYW5zZmVyIHNlcnZlclRyYW5zZmVyID0gU2VydmVyVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKKwkJSVNlcnZlcltdIHNlcnZlcnMgPSAoSVNlcnZlcltdKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoc2VydmVyVHJhbnNmZXIpOworCQlzZXRFbmFibGVkKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApOworCX0KKworCS8qKgorCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJU2VydmVyVHJhbnNmZXIgc2VydmVyVHJhbnNmZXIgPSBTZXJ2ZXJUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOworCQlJU2VydmVyW10gc2VydmVycyA9IChJU2VydmVyW10pIGNsaXBib2FyZC5nZXRDb250ZW50cyhzZXJ2ZXJUcmFuc2Zlcik7CisJCQorCQlpZiAoc2VydmVycyA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gc2VydmVyc1tpXS5jcmVhdGVXb3JraW5nQ29weSgpOworCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpd2MpLmRpc2Fzc29jaWF0ZSgpOworCQkJCXdjLnNldE5hbWUoIlRlbXAiKTsgLy8gc2V0cyB0aGUgbmFtZSBmcm9tIHRoZSBjdXJyZW50IG9uZSBzbyB0aGF0IHRoZQorCQkJCQkJLy8gZGVmYXVsdCBuYW1lIGdlbmVyYXRpb24gd2lsbCB3b3JrCisJCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZSh3Yyk7CisJCQkJd2Muc2F2ZShmYWxzZSwgbnVsbCk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRmFpbHVyZSB0byBjb3B5IHNlcnZlciIsIGNlKTsKKwkJCX0KKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHJvcGVydGllc0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Byb3BlcnRpZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTBhZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Byb3BlcnRpZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKy8qKgorICogQWN0aW9uIHRvIHNob3cgdGhlIHByb3BlcnR5IHBhZ2UgZm9yIGEgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgUHJvcGVydGllc0FjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHByb3BlcnR5UGFnZUlkOworCisJcHVibGljIFByb3BlcnRpZXNBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgeworCQl0aGlzKHNoZWxsLCBudWxsLCBzZWxlY3Rpb25Qcm92aWRlcik7CisJfQorCisJcHVibGljIFByb3BlcnRpZXNBY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyBwcm9wZXJ0eVBhZ2VJZCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7CisJCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgTWVzc2FnZXMuYWN0aW9uUHJvcGVydGllcyk7CisJCXRoaXMucHJvcGVydHlQYWdlSWQgPSBwcm9wZXJ0eVBhZ2VJZDsKKwkJaWYgKHByb3BlcnR5UGFnZUlkID09IG51bGwpCisJCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUFJPUEVSVElFUyk7CisJCQorCQl0cnkgeworCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJfQorCisJcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgeworCQlpZiAocHJvcGVydHlQYWdlSWQgPT0gbnVsbCkKKwkJCXByb3BlcnR5UGFnZUlkID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydGllcyI7CisJCURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihzaGVsbCwgc2VydmVyLCBwcm9wZXJ0eVBhZ2VJZCwgbnVsbCwgbnVsbCk7CisJCWRpYWxvZy5vcGVuKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QdWJsaXNoQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NGQxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisvKioKKyAqIFB1Ymxpc2ggdG8gYSBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBQdWJsaXNoQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24geworCXB1YmxpYyBQdWJsaXNoQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpIHsKKwkJc3VwZXIoc2hlbGwsIHNlbGVjdGlvblByb3ZpZGVyLCBNZXNzYWdlcy5hY3Rpb25QdWJsaXNoKTsKKwkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUHVibGlzaFRvb2xUaXApOworCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9QVUJMSVNIKSk7CisJCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfUFVCTElTSCkpOworCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1BVQkxJU0gpKTsKKwkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnB1Ymxpc2giKTsKKwkJdHJ5IHsKKwkJCXNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgeworCQlyZXR1cm4gc2VydmVyLmNhblB1Ymxpc2goKS5pc09LKCk7CisJfQorCisJcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgeworCQlwdWJsaXNoKHNlcnZlciwgc2hlbGwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBwdWJsaXNoKElTZXJ2ZXIgc2VydmVyLCBmaW5hbCBTaGVsbCBzaGVsbCkgeworCQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhU2VydmVyVUlQbHVnaW4ucHJvbXB0SWZEaXJ0eShzaGVsbCwgc2VydmVyKSkKKwkJCXJldHVybjsKKwkJCisJCWlmICghU2VydmVyVUlQbHVnaW4uc2F2ZUVkaXRvcnMoKSkKKwkJCXJldHVybjsKKwkJCisJCUlBZGFwdGFibGUgaW5mbyA9IG5ldyBJQWRhcHRhYmxlKCkgeworCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKKwkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQorCQkJCQlyZXR1cm4gc2hlbGw7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX07CisJCQorCQlzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG51bGwsIGluZm8sIG51bGwpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaENsZWFuQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaENsZWFuQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4YWE2MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QdWJsaXNoQ2xlYW5BY3Rpb24uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworLyoqCisgKiBDbGVhbiBwdWJsaXNoIHRvIGEgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgUHVibGlzaENsZWFuQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24geworCXB1YmxpYyBQdWJsaXNoQ2xlYW5BY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgeworCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIE1lc3NhZ2VzLmFjdGlvblB1Ymxpc2hDbGVhbik7CisJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblB1Ymxpc2hDbGVhblRvb2xUaXApOworCQl0cnkgeworCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICovCisJcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7CisJCXJldHVybiBzZXJ2ZXIuY2FuUHVibGlzaCgpLmlzT0soKTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtIGFjdGlvbiBvbiB0aGlzIHNlcnZlci4KKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICovCisJcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgeworCQlpZiAoIVNlcnZlclVJUGx1Z2luLnByb21wdElmRGlydHkoc2hlbGwsIHNlcnZlcikpCisJCQlyZXR1cm47CisJCQorCQlpZiAoIVNlcnZlclVJUGx1Z2luLnNhdmVFZGl0b3JzKCkpCisJCQlyZXR1cm47CisJCQorCQlpZiAoTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgTWVzc2FnZXMuZGVmYXVsdERpYWxvZ1RpdGxlLCBNZXNzYWdlcy5kaWFsb2dQdWJsaXNoQ2xlYW4pKSB7CisJCQlJQWRhcHRhYmxlIGluZm8gPSBuZXcgSUFkYXB0YWJsZSgpIHsKKwkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQorCQkJCQkJcmV0dXJuIHNoZWxsOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9OworCQkJCisJCQlzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfQ0xFQU4sIG51bGwsIGluZm8sIG51bGwpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZW1vdmVNb2R1bGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZW1vdmVNb2R1bGVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTZiYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1JlbW92ZU1vZHVsZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworLyoqCisgKiBBY3Rpb24gZm9yIHJlbW92aW5nIGEgbW9kdWxlIGZyb20gYSBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdmVNb2R1bGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKKwlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7CisJcHJvdGVjdGVkIFNoZWxsIHNoZWxsOworCisJLyoqCisJICogUmVtb3ZlTW9kdWxlQWN0aW9uIGNvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCisJICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgorCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKKwkgKi8KKwlwdWJsaWMgUmVtb3ZlTW9kdWxlQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlciwgSU1vZHVsZSBtb2R1bGUpIHsKKwkJc3VwZXIoTWVzc2FnZXMuYWN0aW9uUmVtb3ZlKTsKKwkJdGhpcy5zaGVsbCA9IHNoZWxsOworCQkKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJCXRoaXMubW9kdWxlID0gbW9kdWxlOworCX0KKworCS8qKgorCSAqIEludm9rZWQgd2hlbiBhbiBhY3Rpb24gb2NjdXJzLiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCBNZXNzYWdlcy5kZWZhdWx0RGlhbG9nVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ1JlbW92ZU1vZHVsZUNvbmZpcm0pKSB7CisJCQl0cnkgeworCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOworCQkJCXdjLm1vZGlmeU1vZHVsZXMobnVsbCwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsKTsKKwkJCQlzZXJ2ZXIgPSB3Yy5zYXZlKHRydWUsIG51bGwpOworCQkJCQorCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQgJiYKKwkJCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0UHVibGlzaE9uQWRkUmVtb3ZlTW9kdWxlKCkpIHsKKwkJCQkJZmluYWwgSUFkYXB0YWJsZSBpbmZvID0gbmV3IElBZGFwdGFibGUoKSB7CisJCQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQkJCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCisJCQkJCQkJCXJldHVybiBzaGVsbDsKKwkJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLCBudWxsKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcmVtb3ZlIG1vZHVsZSIsIGUpOworCQkJfQorCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZW5hbWVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZW5hbWVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ4ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1JlbmFtZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UcmVlRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuVGV4dEFjdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworLyoqCisgKiBBY3Rpb24gdG8gcmVuYW1lIGEgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgUmVuYW1lQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24geworCS8qCisJICogVGhlIHRyZWUgZWRpdGluZyB3aWRnZXRzLiBJZiB0cmVlRWRpdG9yIGlzIG51bGwgdGhlbiBlZGl0IHVzaW5nIHRoZQorCSAqIGRpYWxvZy4gV2Uga2VlcCB0aGUgZWRpdG9yVGV4dCBhcm91bmQgc28gdGhhdCB3ZSBjYW4gY2xvc2UgaXQgaWYgYSBuZXcKKwkgKiBzZWxlY3Rpb24gaXMgbWFkZS4KKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZUVkaXRvciB0cmVlRWRpdG9yOworCisJcHJvdGVjdGVkIFRyZWUgdHJlZTsKKworCXByb3RlY3RlZCBUZXh0IHRleHRFZGl0b3I7CisKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIHRleHRFZGl0b3JQYXJlbnQ7CisKKwlwcml2YXRlIFRleHRBY3Rpb25IYW5kbGVyIHRleHRBY3Rpb25IYW5kbGVyOworCisJLy8gVGhlIHNlcnZlciBiZWluZyBlZGl0ZWQgaWYgdGhpcyBpcyBiZWluZyBkb25lIGlubGluZQorCXByb3RlY3RlZCBJU2VydmVyIGVkaXRlZFNlcnZlcjsKKworCXByb3RlY3RlZCBib29sZWFuIHNhdmluZyA9IGZhbHNlOworCisJcHVibGljIFJlbmFtZUFjdGlvbihTaGVsbCBzaGVsbCwgVHJlZVZpZXdlciB2aWV3ZXIsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgeworCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIE1lc3NhZ2VzLmFjdGlvblJlbmFtZSk7CisJCXNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5SRU5BTUUpOworCQl0aGlzLnRyZWUgPSB2aWV3ZXIuZ2V0VHJlZSgpOworCQl0aGlzLnRyZWVFZGl0b3IgPSBuZXcgVHJlZUVkaXRvcih0cmVlKTsKKwkJdHJ5IHsKKwkJCXNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKKwkJcnVuV2l0aElubGluZUVkaXRvcihzZXJ2ZXIpOworCX0KKworCS8qCisJICogUnVuIHRoZSByZWNlaXZlciB1c2luZyBhbiBpbmxpbmUgZWRpdG9yIGZyb20gdGhlIHN1cHBsaWVkIG5hdmlnYXRvci4gVGhlCisJICogbmF2aWdhdG9yIHdpbGwgdGVsbCB0aGUgYWN0aW9uIHdoZW4gdGhlIHBhdGggaXMgcmVhZHkgdG8gcnVuLgorCSAqLworCXByaXZhdGUgdm9pZCBydW5XaXRoSW5saW5lRWRpdG9yKElTZXJ2ZXIgc2VydmVyKSB7CisJCXF1ZXJ5TmV3U2VydmVyTmFtZUlubGluZShzZXJ2ZXIpOworCX0KKworCS8qKgorCSAqIE9uIE1hYyB0aGUgdGV4dCB3aWRnZXQgYWxyZWFkeSBwcm92aWRlcyBhIGJvcmRlciB3aGVuIGl0IGhhcyBmb2N1cywgc28KKwkgKiB0aGVyZSBpcyBubyBuZWVkIHRvIGRyYXcgYW5vdGhlciBvbmUuIFRoZSB2YWx1ZSBvZiByZXR1cm5lZCBieSB0aGlzCisJICogbWV0aG9kIGlzIHVzZCB0byBjb250cm9sIHRoZSBpbnNldCB3ZSBhcHBseSB0byB0aGUgdGV4dCBmaWVsZCBib3VuZCdzIGluCisJICogb3JkZXIgdG8gZ2V0IHNwYWNlIGZvciBkcmF3aW5nIGEgYm9yZGVyLiBBIHZhbHVlIG9mIDEgbWVhbnMgYSBvbmUtcGl4ZWwKKwkgKiB3aWRlIGJvcmRlciBhcm91bmQgdGhlIHRleHQgZmllbGQuIEEgbmVnYXRpdmUgdmFsdWUgc3VwcmVzc2VzIHRoZSBib3JkZXIuCisJICogSG93ZXZlciwgaW4gTTkgdGhlIHN5c3RlbSBwcm9wZXJ0eQorCSAqICJvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLm5vRm9jdXNSaW5nIiBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEKKwkgKiB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYnVnICMyODg0Mi4gVGhlIGV4aXN0ZW5jZSBvZiB0aGUgcHJvcGVydHkgdHVybnMKKwkgKiB0aGUgbmF0aXZlIGZvY3VzIHJpbmcgb2ZmIGlmIHRoZSB3aWRnZXQgaXMgY29udGFpbmVkIGluIGEgbWFpbiB3aW5kb3cKKwkgKiAobm90IGRpYWxvZykuIFRoZSBjaGVjayBmb3IgdGhlIHByb3BlcnR5IHNob3VsZCBiZSByZW1vdmVkIGFmdGVyIGEgZmluYWwKKwkgKiBmaXggZm9yICMyODg0MiBoYXMgYmVlbiBwcm92aWRlZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Q2VsbEVkaXRvckluc2V0KENvbnRyb2wgYykgeworCQkvLyBzcGVjaWFsIGNhc2UgZm9yIE1hY09TIFgKKwkJaWYgKCJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKFN5c3RlbQorCQkJCQkuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24ubm9Gb2N1c1JpbmciKSA9PSBudWxsIHx8IGMuZ2V0U2hlbGwoKS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gLTI7IC8vIG5hdGl2ZSBib3JkZXIKKwkJCX0KKwkJfQorCQlyZXR1cm4gMTsgLy8gb25lIHBpeGVsIHdpZGUgYmxhY2sgYm9yZGVyCisJfQorCisJLyoqCisJICogR2V0IHRoZSBUcmVlIGJlaW5nIGVkaXRlZC4KKwkgKiAKKwkgKiBAcmV0dXJuVHJlZQorCSAqLworCXByaXZhdGUgVHJlZSBnZXRUcmVlKCkgeworCQlyZXR1cm4gdHJlZTsKKwl9CisKKwlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVQYXJlbnQoKSB7CisJCVRyZWUgdHJlZTIgPSBnZXRUcmVlKCk7CisJCUNvbXBvc2l0ZSByZXN1bHQgPSBuZXcgQ29tcG9zaXRlKHRyZWUyLCBTV1QuTk9ORSk7CisJCVRyZWVJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IHRyZWUyLmdldFNlbGVjdGlvbigpOworCQl0cmVlRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKKwkJdHJlZUVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7CisJCXRyZWVFZGl0b3Iuc2V0RWRpdG9yKHJlc3VsdCwgc2VsZWN0ZWRJdGVtc1swXSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBuZXcgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUgdGFyZ2V0IHJlc291cmNlIG9yCisJICogPGNvZGU+bnVsbDxjb2RlPgorCSAqIGlmIHRoZSBxdWVyeSB3YXMgY2FuY2VsZWQuIFJlbmFtZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHNlcnZlciB1c2luZyB0aGUgdGFibGUgZWRpdG9yLiAKKwkgKiBDb250aW51ZSB0aGUgYWN0aW9uIHdoZW4gdGhlIHVzZXIgaXMgZG9uZS4KKwkgKgorCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0byByZW5hbWUKKwkgKi8KKwlwcml2YXRlIHZvaWQgcXVlcnlOZXdTZXJ2ZXJOYW1lSW5saW5lKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7CisJCS8vIE1ha2Ugc3VyZSB0ZXh0IGVkaXRvciBpcyBjcmVhdGVkIG9ubHkgb25jZS4gU2ltcGx5IHJlc2V0IHRleHQKKwkJLy8gZWRpdG9yIHdoZW4gYWN0aW9uIGlzIGV4ZWN1dGVkIG1vcmUgdGhhbiBvbmNlLiBGaXhlcyBidWcgMjIyNjkKKwkJaWYgKHRleHRFZGl0b3JQYXJlbnQgPT0gbnVsbCkgeworCQkJY3JlYXRlVGV4dEVkaXRvcihzZXJ2ZXIpOworCQl9CisJCXRleHRFZGl0b3Iuc2V0VGV4dChzZXJ2ZXIuZ2V0TmFtZSgpKTsKKworCQkvLyBPcGVuIHRleHQgZWRpdG9yIHdpdGggaW5pdGlhbCBzaXplCisJCXRleHRFZGl0b3JQYXJlbnQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJUG9pbnQgdGV4dFNpemUgPSB0ZXh0RWRpdG9yLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7CisJCXRleHRTaXplLnggKz0gdGV4dFNpemUueTsgLy8gQWRkIGV4dHJhIHNwYWNlIGZvciBuZXcgY2hhcmFjdGVycworCQlQb2ludCBwYXJlbnRTaXplID0gdGV4dEVkaXRvclBhcmVudC5nZXRTaXplKCk7CisJCWludCBpbnNldCA9IGdldENlbGxFZGl0b3JJbnNldCh0ZXh0RWRpdG9yUGFyZW50KTsKKwkJdGV4dEVkaXRvci5zZXRCb3VuZHMoMiwgaW5zZXQsIE1hdGgubWluKHRleHRTaXplLngsIHBhcmVudFNpemUueCAtIDQpLAorCQkJCXBhcmVudFNpemUueSAtIDIgKiBpbnNldCk7CisJCXRleHRFZGl0b3JQYXJlbnQucmVkcmF3KCk7CisJCXRleHRFZGl0b3Iuc2VsZWN0QWxsKCk7CisJCXRleHRFZGl0b3Iuc2V0Rm9jdXMoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIHRleHQgZWRpdG9yIHdpZGdldC4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcmVuYW1lCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRFZGl0b3IoZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKKwkJLy8gQ3JlYXRlIHRleHQgZWRpdG9yIHBhcmVudC4gVGhpcyBkcmF3cyBhIG5pY2UgYm91bmRpbmcgcmVjdAorCQl0ZXh0RWRpdG9yUGFyZW50ID0gY3JlYXRlUGFyZW50KCk7CisJCXRleHRFZGl0b3JQYXJlbnQuc2V0VmlzaWJsZShmYWxzZSk7CisJCWZpbmFsIGludCBpbnNldCA9IGdldENlbGxFZGl0b3JJbnNldCh0ZXh0RWRpdG9yUGFyZW50KTsKKwkJaWYgKGluc2V0ID4gMCkgeworCQkJdGV4dEVkaXRvclBhcmVudC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CisJCQkJCVBvaW50IHRleHRTaXplID0gdGV4dEVkaXRvci5nZXRTaXplKCk7CisJCQkJCVBvaW50IHBhcmVudFNpemUgPSB0ZXh0RWRpdG9yUGFyZW50LmdldFNpemUoKTsKKwkJCQkJZS5nYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIE1hdGgubWluKHRleHRTaXplLnggKyA0LAorCQkJCQkJCXBhcmVudFNpemUueCAtIDEpLCBwYXJlbnRTaXplLnkgLSAxKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCQkvLyBDcmVhdGUgaW5uZXIgdGV4dCBlZGl0b3IKKwkJdGV4dEVkaXRvciA9IG5ldyBUZXh0KHRleHRFZGl0b3JQYXJlbnQsIFNXVC5OT05FKTsKKwkJdGV4dEVkaXRvci5zZXRGb250KHRyZWUuZ2V0Rm9udCgpKTsKKwkJdGV4dEVkaXRvclBhcmVudC5zZXRCYWNrZ3JvdW5kKHRleHRFZGl0b3IuZ2V0QmFja2dyb3VuZCgpKTsKKwkJdGV4dEVkaXRvci5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CisJCQkJUG9pbnQgdGV4dFNpemUgPSB0ZXh0RWRpdG9yLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAorCQkJCQkJU1dULkRFRkFVTFQpOworCQkJCXRleHRTaXplLnggKz0gdGV4dFNpemUueTsgLy8gQWRkIGV4dHJhIHNwYWNlIGZvciBuZXcKKwkJCQkvLyBjaGFyYWN0ZXJzLgorCQkJCVBvaW50IHBhcmVudFNpemUgPSB0ZXh0RWRpdG9yUGFyZW50LmdldFNpemUoKTsKKwkJCQl0ZXh0RWRpdG9yLnNldEJvdW5kcygyLCBpbnNldCwgTWF0aC5taW4odGV4dFNpemUueCwKKwkJCQkJCXBhcmVudFNpemUueCAtIDQpLCBwYXJlbnRTaXplLnkgLSAyICogaW5zZXQpOworCQkJCXRleHRFZGl0b3JQYXJlbnQucmVkcmF3KCk7CisJCQl9CisJCX0pOworCQl0ZXh0RWRpdG9yLmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKworCQkJCS8vIFdvcmthcm91bmQgZm9yIEJ1ZyAyMDIxNCBkdWUgdG8gZXh0cmEKKwkJCQkvLyB0cmF2ZXJzZSBldmVudHMKKwkJCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgeworCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKKwkJCQkJLy8gRG8gbm90aGluZyBpbiB0aGlzIGNhc2UKKwkJCQkJZGlzcG9zZVRleHRXaWRnZXQoKTsKKwkJCQkJZXZlbnQuZG9pdCA9IHRydWU7CisJCQkJCWV2ZW50LmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46CisJCQkJCXNhdmVDaGFuZ2VzQW5kRGlzcG9zZShzZXJ2ZXIpOworCQkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKKwkJCQkJZXZlbnQuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCXRleHRFZGl0b3IuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZmUpIHsKKwkJCQlzYXZlQ2hhbmdlc0FuZERpc3Bvc2Uoc2VydmVyKTsKKwkJCX0KKwkJfSk7CisKKwkJaWYgKHRleHRBY3Rpb25IYW5kbGVyICE9IG51bGwpIHsKKwkJCXRleHRBY3Rpb25IYW5kbGVyLmFkZFRleHQodGV4dEVkaXRvcik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDbG9zZSB0aGUgdGV4dCB3aWRnZXQgYW5kIHJlc2V0IHRoZSBlZGl0b3JUZXh0IGZpZWxkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VUZXh0V2lkZ2V0KCkgeworCQlpZiAodGV4dEFjdGlvbkhhbmRsZXIgIT0gbnVsbCkKKwkJCXRleHRBY3Rpb25IYW5kbGVyLnJlbW92ZVRleHQodGV4dEVkaXRvcik7CisKKwkJaWYgKHRleHRFZGl0b3JQYXJlbnQgIT0gbnVsbCkgeworCQkJdGV4dEVkaXRvclBhcmVudC5kaXNwb3NlKCk7CisJCQl0ZXh0RWRpdG9yUGFyZW50ID0gbnVsbDsKKwkJCXRleHRFZGl0b3IgPSBudWxsOworCQkJdHJlZUVkaXRvci5zZXRFZGl0b3IobnVsbCwgbnVsbCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTYXZlIHRoZSBjaGFuZ2VzIGFuZCBkaXNwb3NlIG9mIHRoZSB0ZXh0IHdpZGdldC4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcmVuYW1lCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2F2ZUNoYW5nZXNBbmREaXNwb3NlKElTZXJ2ZXIgc2VydmVyKSB7CisJCWlmIChzYXZpbmcgPT0gdHJ1ZSkKKwkJCXJldHVybjsKKwkJCisJCXNhdmluZyA9IHRydWU7CisJCS8vIENhY2hlIHRoZSByZXNvdXJjZSB0byBhdm9pZCBzZWxlY3Rpb24gbG9zcyBzaW5jZSBhIHNlbGVjdGlvbiBvZgorCQkvLyBhbm90aGVyIGl0ZW0gY2FuIHRyaWdnZXIgdGhpcyBtZXRob2QKKwkJZWRpdGVkU2VydmVyID0gc2VydmVyOworCQlmaW5hbCBTdHJpbmcgbmV3TmFtZSA9IHRleHRFZGl0b3IuZ2V0VGV4dCgpOworCQkvLyBSdW4gdGhpcyBpbiBhbiBhc3luYyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3BlcmF0aW9uIHRoYXQgdHJpZ2dlcmVkCisJCS8vIHRoaXMgYWN0aW9uIGlzIGNvbXBsZXRlZC4gT3RoZXJ3aXNlIHRoaXMgbGVhZHMgdG8gcHJvYmxlbXMgd2hlbiB0aGUKKwkJLy8gaWNvbiBvZiB0aGUgaXRlbSBiZWluZyByZW5hbWVkIGlzIGNsaWNrZWQgKGkuZS4sIHdoaWNoIGNhdXNlcyB0aGUKKwkJLy8gcmVuYW1lIHRleHQgd2lkZ2V0IHRvIGxvc2UgZm9jdXMgYW5kIHRyaWdnZXIgdGhpcyBtZXRob2QpCisJCWdldFRyZWUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyeSB7CisJCQkJCWlmICghbmV3TmFtZS5lcXVhbHMoZWRpdGVkU2VydmVyLmdldE5hbWUoKSkpIHsKKwkJCQkJCWlmIChTZXJ2ZXJQbHVnaW4uaXNOYW1lSW5Vc2UoZWRpdGVkU2VydmVyLCBuZXdOYW1lKSkgeworCQkJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBNZXNzYWdlcy5kZWZhdWx0RGlhbG9nVGl0bGUsIE1lc3NhZ2VzLmVycm9yRHVwbGljYXRlTmFtZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IGVkaXRlZFNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOworCQkJCQkJCQl3Yy5zZXROYW1lKG5ld05hbWUpOworCQkJCQkJCQl3Yy5zYXZlKGZhbHNlLCBudWxsKTsKKwkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCQkJCS8vIGlnbm9yZSBmb3Igbm93CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVkaXRlZFNlcnZlciA9IG51bGw7CisJCQkJCS8vIERpc3Bvc2UgdGhlIHRleHQgd2lkZ2V0IHJlZ2FyZGxlc3MKKwkJCQkJZGlzcG9zZVRleHRXaWRnZXQoKTsKKwkJCQkJLy8gRW5zdXJlIHRoZSBOYXZpZ2F0b3IgdHJlZSBoYXMgZm9jdXMsIHdoaWNoIGl0IG1heSBub3QgaWYKKwkJCQkJLy8gdGhlIHRleHQgd2lkZ2V0IHByZXZpb3VzbHkgaGFkIGZvY3VzCisJCQkJCWlmICh0cmVlICE9IG51bGwgJiYgIXRyZWUuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQl0cmVlLnNldEZvY3VzKCk7CisJCQkJCX0KKwkJCQl9IGZpbmFsbHkgeworCQkJCQlzYXZpbmcgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0pOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVzdGFydE1vZHVsZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Jlc3RhcnRNb2R1bGVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODNjZDUzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Jlc3RhcnRNb2R1bGVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqIFJlc3RhcnQgYSBtb2R1bGUgb24gYSBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXN0YXJ0TW9kdWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7CisJcHJvdGVjdGVkIElNb2R1bGVbXSBtb2R1bGU7CisKKwlwdWJsaWMgUmVzdGFydE1vZHVsZUFjdGlvbihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSkgeworCQlzdXBlcigpOworCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7CisJCQorCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblJlc3RhcnRNb2R1bGUpOworCQkKKwkJc2V0RW5hYmxlZChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQKKwkJCQkmJiBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSAhPSBJU2VydmVyLlNUQVRFX1VOS05PV04KKwkJCQkmJglzZXJ2ZXIuY2FuQ29udHJvbE1vZHVsZShtb2R1bGUsIG51bGwpLmlzT0soKSk7CisJfQorCisJLyoqCisJICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7CisJCUpvYiByZXN0YXJ0Sm9iID0gbmV3IEpvYihOTFMuYmluZChNZXNzYWdlcy5qb2JSZXN0YXJ0aW5nLCBtb2R1bGVbc2l6ZS0xXS5nZXROYW1lKCkpKSB7CisJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJc2VydmVyLnJlc3RhcnRNb2R1bGUobW9kdWxlLCBudWxsKTsKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0KKwkJfTsKKwkJcmVzdGFydEpvYi5zY2hlZHVsZSgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyQWN0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlckFjdGlvbkhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTY1NTNhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlckFjdGlvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zLlJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGU7CisvKioKKyAqIFNlcnZlciBhY3Rpb24gaGFuZGxlci4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlckFjdGlvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCUlTZWxlY3Rpb24gc2VsID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXZlbnQpOworCQlPYmplY3Qgb2JqID0gbnVsbDsKKwkJaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3QgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKKwkJCW9iaiA9IHNlbGVjdC5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJfQorCQkKKwkJU3RyaW5nIGlkID0gZXZlbnQuZ2V0Q29tbWFuZCgpLmdldElkKCk7CisJCWlmIChpZC5lbmRzV2l0aCgicHVibGlzaCIpKSB7CisJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgeworCQkJCVB1Ymxpc2hBY3Rpb24ucHVibGlzaCgoSVNlcnZlcikgb2JqLCBIYW5kbGVyVXRpbC5nZXRBY3RpdmVTaGVsbChldmVudCkpOworCQkJfSBlbHNlCisJCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiTm8gc2VydmVyIHNlbGVjdGVkIik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJU3RyaW5nIG1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKKwkJaWYgKGlkLmVuZHNXaXRoKCJkZWJ1ZyIpKQorCQkJbW9kZSA9IElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREU7CisJCWVsc2UgaWYgKGlkLmVuZHNXaXRoKCJwcm9maWxlIikpCisJCQltb2RlID0gSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFOworCQllbHNlIGlmIChpZC5lbmRzV2l0aCgic3RvcCIpKQorCQkJbW9kZSA9IG51bGw7CisJCQorCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgeworCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOworCQkJaWYgKG1vZGUgPT0gbnVsbCkKKwkJCQlTdG9wQWN0aW9uLnN0b3Aoc2VydmVyLCBIYW5kbGVyVXRpbC5nZXRBY3RpdmVTaGVsbChldmVudCkpOworCQkJZWxzZQorCQkJCVN0YXJ0QWN0aW9uLnN0YXJ0KHNlcnZlciwgbW9kZSwgSGFuZGxlclV0aWwuZ2V0QWN0aXZlU2hlbGwoZXZlbnQpKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIHJvcyA9IG5ldyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCk7CisJCXJvcy5zZXRMYXVuY2hNb2RlKG1vZGUpOworCQlJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7CisJCQkvLyBkdW1teSBhY3Rpb24KKwkJfTsKKwkJcm9zLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBzZWwpOworCQlyb3MucnVuKGFjdGlvbik7CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRhYmxlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRhYmxlTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Zjc3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuVUlEZWNvcmF0b3JNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlQ2VsbExhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLlNlcnZlclRyZWVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworLyoqCisgKiBTZXJ2ZXIgdGFibGUgbGFiZWwgcHJvdmlkZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ2VsbExhYmVsUHJvdmlkZXIgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3luY1N0YXRlID0gbmV3IFN0cmluZ1tdIHsKKwkJTWVzc2FnZXMudmlld1N5bmNPa2F5LAorCQlNZXNzYWdlcy52aWV3U3luY1Jlc3RhcnQsCisJCU1lc3NhZ2VzLnZpZXdTeW5jUHVibGlzaCwKKwkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0UHVibGlzaCwKKwkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoaW5nfTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3luY1N0YXRlVW5tYW5hZ2VkID0gbmV3IFN0cmluZ1tdIHsKKwkJTWVzc2FnZXMudmlld1N5bmNPa2F5MiwKKwkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0MiwKKwkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoMiwKKwkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0UHVibGlzaDIsCisJCU1lc3NhZ2VzLnZpZXdTeW5jUHVibGlzaGluZzJ9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbW9kdWxlUHVibGlzaFN0YXRlID0gbmV3IFN0cmluZ1tdIHsKKwkJIiIsCisJCU1lc3NhZ2VzLnZpZXdTeW5jT2theSwKKwkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoLAorCQlNZXNzYWdlcy52aWV3U3luY1B1Ymxpc2h9OworCisJcHJpdmF0ZSBpbnQgY291bnQgPSAwOworCisJcHJvdGVjdGVkIElTZXJ2ZXIgZGVmYXVsdFNlcnZlcjsKKworCS8qKgorCSAqIFNlcnZlclRhYmxlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIoKSB7CisJCS8vIEVuc3VyZSBkZWNvcmF0b3IgaXMgaW5pdGlhbGl6ZWQuCisJCXN1cGVyKG51bGwpOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZXJ2ZXIoSVNlcnZlciBkcykgeworCQlkZWZhdWx0U2VydmVyID0gZHM7CisJfQorCisJcHVibGljIElTZXJ2ZXIgZ2V0RGVmYXVsdFNlcnZlcigpIHsKKwkJcmV0dXJuIGRlZmF1bHRTZXJ2ZXI7CisJfQorCisJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSB7CisJCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgeworCQkJCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKKwkJCQlyZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKKwkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7CisJCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgeworCQkJCS8vcmV0dXJuIFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2UobXMubW9kdWxlW21zLm1vZHVsZS5sZW5ndGggLSAxXSk7CisJCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCQkJSW1hZ2UgaW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG1zLm1vZHVsZVttcy5tb2R1bGUubGVuZ3RoIC0gMV0pOworCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOworCQkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJCQlJbWFnZSBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgbXMpOworCQkJCQlpZiAoZGVjICE9IG51bGwpCisJCQkJCQlyZXR1cm4gZGVjOworCQkJCX0KKwkJCQlyZXR1cm4gaW1hZ2U7CisJCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKKwkJCQlpZiAobXMuc2VydmVyID09IG51bGwpCisJCQkJCXJldHVybiBudWxsOworCQkJCQorCQkJCS8qaW50IHN0YXRlID0gbXMuc2VydmVyLmdldE1vZHVsZVN0YXRlKG1zLm1vZHVsZSk7CisJCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkKKwkJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU1RBVEVfU1RBUlRFRCk7CisJCQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQorCQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TVEFURV9TVE9QUEVEKTsKKwkJCQkqLworCQkJCXJldHVybiBnZXRTdGF0ZUltYWdlKG1zLnNlcnZlci5nZXRTZXJ2ZXJUeXBlKCksIG1zLnNlcnZlci5nZXRNb2R1bGVTdGF0ZShtcy5tb2R1bGUpLCBudWxsKTsKKwkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikgeworCQkJCUlTdGF0dXMgc3RhdHVzID0gKChTZXJ2ZXIpIG1zLnNlcnZlcikuZ2V0TW9kdWxlU3RhdHVzKG1zLm1vZHVsZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQkJCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKKwkJCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCisJCQkJCQlyZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKKwkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQorCQkJCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKKwkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQorCQkJCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OworCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgeworCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkgeworCQkJCUltYWdlIGltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOworCQkJCS8qSVN0YXR1cyBzdGF0dXMgPSAoKFNlcnZlcikgc2VydmVyKS5nZXRTZXJ2ZXJTdGF0dXMoKTsKKwkJCQlpZiAoZGVmYXVsdFNlcnZlciAhPSBudWxsICYmIGRlZmF1bHRTZXJ2ZXIuZXF1YWxzKHNlcnZlcikgfHwgc3RhdHVzICE9IG51bGwpIHsKKwkJCQkJSW1hZ2UgZGVjb3JhdGVkID0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGVsZW1lbnQpOworCQkJCQlpZiAoZGVjb3JhdGVkICE9IG51bGwpCisJCQkJCQlyZXR1cm4gZGVjb3JhdGVkOworCQkJCX0qLworCQkJCS8vcmV0dXJuIGltYWdlOworCQkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJCQlJbWFnZSBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgc2VydmVyKTsKKwkJCQkJaWYgKGRlYyAhPSBudWxsKQorCQkJCQkJcmV0dXJuIGRlYzsKKwkJCQl9CisJCQkJcmV0dXJuIGltYWdlOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgeworCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7CisJCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJLy9pZiAoc2VydmVyVHlwZS5nZXRTZXJ2ZXJTdGF0ZVNldCgpID09IElTZXJ2ZXJUeXBlLlNFUlZFUl9TVEFURV9TRVRfUFVCTElTSEVEKQorCQkJLy8JcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gZ2V0U2VydmVyU3RhdGVJbWFnZShzZXJ2ZXIpOworCQl9IGVsc2UKKwkJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gZ2V0Q29sdW1uVGV4dChlbGVtZW50LCAwKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIHsKKwkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQorCQkJCXJldHVybiAoKFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIGVsZW1lbnQpLnRleHQ7CisJCQlyZXR1cm4gIiI7CisJCX0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKKwkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7CisJCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgeworCQkJCWlmIChtcy5tb2R1bGUgPT0gbnVsbCkKKwkJCQkJcmV0dXJuICIiOworCQkJCWludCBzaXplID0gbXMubW9kdWxlLmxlbmd0aDsKKwkJCQlTdHJpbmcgbmFtZSA9IG1zLm1vZHVsZVtzaXplIC0gMV0uZ2V0TmFtZSgpOworCQkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlVGV4dChuYW1lLCBtcyk7CisJCQkJCWlmIChkZWMgIT0gbnVsbCkKKwkJCQkJCXJldHVybiBkZWM7CisJCQkJfQorCQkJCXJldHVybiBuYW1lOworCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7CisJCQkJaWYgKG1zLnNlcnZlciA9PSBudWxsKQorCQkJCQlyZXR1cm4gIiI7CisJCQkJcmV0dXJuIGdldFN0YXRlTGFiZWwobXMuc2VydmVyLmdldFNlcnZlclR5cGUoKSwgbXMuc2VydmVyLmdldE1vZHVsZVN0YXRlKG1zLm1vZHVsZSksIG51bGwpOworCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7CisJCQkJSVN0YXR1cyBzdGF0dXMgPSAoKFNlcnZlcikgbXMuc2VydmVyKS5nZXRNb2R1bGVTdGF0dXMobXMubW9kdWxlKTsKKwkJCQlpZiAoc3RhdHVzICE9IG51bGwpCisJCQkJCXJldHVybiBzdGF0dXMuZ2V0TWVzc2FnZSgpOworCQkJCQorCQkJCXJldHVybiBtb2R1bGVQdWJsaXNoU3RhdGVbbXMuc2VydmVyLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtcy5tb2R1bGUpXTsKKwkJCX0KKwkJfQorCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OworCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKKwkJCXJldHVybiBub3ROdWxsKHNlcnZlci5nZXROYW1lKCkpOworCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7CisJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gc2VydmVyLmdldFNlcnZlclR5cGUoKTsKKwkJCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCisJCQkJcmV0dXJuIGdldFNlcnZlclN0YXRlTGFiZWwoc2VydmVyKTsKKwkJCQorCQkJcmV0dXJuICIiOworCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKKwkJCUlTdGF0dXMgc3RhdHVzID0gKChTZXJ2ZXIpIHNlcnZlcikuZ2V0U2VydmVyU3RhdHVzKCk7CisJCQlpZiAoc3RhdHVzICE9IG51bGwpCisJCQkJcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7CisJCQkKKwkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCisJCQkJcmV0dXJuICIiOworCQkJCisJCQkvL2lmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpID09IG51bGwpCisJCQkvLwlyZXR1cm4gTWVzc2FnZXMudmlld05vQ29uZmlndXJhdGlvbiIpOworCQkJCisJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQorCQkJCXJldHVybiAiIjsKKwkJCQorCQkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7CisJCQlpZiAoU2VydmVyVGFibGVWaWV3ZXIucHVibGlzaGluZy5jb250YWlucyhzZXJ2ZXJJZCkpCisJCQkJcmV0dXJuIHN5bmNTdGF0ZVs0XTsKKwkJCQorCQkJLy8gcmVwdWJsaXNoCisJCQlpbnQgaSA9IDA7CisJCQlpZiAoc2VydmVyLnNob3VsZFB1Ymxpc2goKSkgeworCQkJCWlmICgoKFNlcnZlcilzZXJ2ZXIpLmlzUHVibGlzaFVua25vd24oKSkKKwkJCQkJcmV0dXJuICIiOworCQkJCWkgKz0gMjsKKwkJCX0KKwkJCQorCQkJaWYgKHNlcnZlci5zaG91bGRSZXN0YXJ0KCkpCisJCQkJaSA9IDE7CisJCQkKKwkJCS8vSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7CisJCQkvLyBUT0RPOiBzdGF0ZSBzZXQKKwkJCS8vaWYgKHNlcnZlclR5cGUuZ2V0U2VydmVyU3RhdGVTZXQoKSA9PSBJU2VydmVyVHlwZS5TRVJWRVJfU1RBVEVfU0VUX01BTkFHRUQpCisJCQkJcmV0dXJuIHN5bmNTdGF0ZVtpXTsKKwkJCS8vcmV0dXJuIHN5bmNTdGF0ZVVubWFuYWdlZFtpXTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gIi0iOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgbm90TnVsbChTdHJpbmcgcykgeworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuICIiOworCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBpbWFnZSByZXByZXNlbnRpbmcgdGhlIHNlcnZlcidzIHN0YXRlLgorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucGFydHMuSUltYWdlCisJICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgorCSAqLworCXByb3RlY3RlZCBJbWFnZSBnZXRTZXJ2ZXJTdGF0ZUltYWdlKElTZXJ2ZXIgc2VydmVyKSB7CisJCXJldHVybiBnZXRTdGF0ZUltYWdlKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCksIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpLCBzZXJ2ZXIuZ2V0TW9kZSgpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGltYWdlIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gc3RhdGUuCisJICogCisJICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5wYXJ0cy5JSW1hZ2UKKwkgKi8KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0U3RhdGVJbWFnZShJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlLCBpbnQgc3RhdGUsIFN0cmluZyBtb2RlKSB7CisJCXJldHVybiBVSURlY29yYXRvck1hbmFnZXIuZ2V0VUlEZWNvcmF0b3Ioc2VydmVyVHlwZSkuZ2V0U3RhdGVJbWFnZShzdGF0ZSwgbW9kZSwgY291bnQpOworCQkvKmlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCisJCQlyZXR1cm4gbnVsbDsKKwkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKKwkJCXJldHVybiBzdGFydGluZ0ltYWdlc1tjb3VudF07CisJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCisJCQlyZXR1cm4gc3RvcHBpbmdJbWFnZXNbY291bnRdOworCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCisJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBFRCk7CisJCWVsc2UgeyAvL2lmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKKwkJCS8vU3RyaW5nIG1vZGUgPSBzZXJ2ZXIuZ2V0TW9kZSgpOworCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQorCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX0RFQlVHKTsKKwkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCisJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRSk7CisJCQllbHNlCisJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURUQpOworCQl9Ki8KKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNlcnZlcidzIHN0YXRlLgorCSAqCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCisJICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VydmVyU3RhdGVMYWJlbChJU2VydmVyIHNlcnZlcikgeworCQlyZXR1cm4gZ2V0U3RhdGVMYWJlbChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLCBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSwgc2VydmVyLmdldE1vZGUoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHN0YXRlLgorCSAqCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTdGF0ZUxhYmVsKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUsIGludCBzdGF0ZSwgU3RyaW5nIG1vZGUpIHsKKwkJcmV0dXJuIFVJRGVjb3JhdG9yTWFuYWdlci5nZXRVSURlY29yYXRvcihzZXJ2ZXJUeXBlKS5nZXRTdGF0ZUxhYmVsKHN0YXRlLCBtb2RlLCBjb3VudCk7CisJCS8qaWYgKHN0YXRlU2V0ID09IElTZXJ2ZXJUeXBlLlNFUlZFUl9TVEFURV9TRVRfUFVCTElTSEVEKQorCQkJcmV0dXJuICIiOworCQkKKwkJaWYgKHN0YXRlU2V0ID09IElTZXJ2ZXJUeXBlLlNFUlZFUl9TVEFURV9TRVRfTUFOQUdFRCkgeworCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKKwkJCQlyZXR1cm4gIiI7CisJCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQorCQkJCXJldHVybiBzdGFydGluZ1RleHRbY291bnRdOworCQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKKwkJCQlyZXR1cm4gc3RvcHBpbmdUZXh0W2NvdW50XTsKKwkJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgeworCQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkRGVidWciKTsKKwkJCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQorCQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWRQcm9maWxlIik7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQiKTsKKwkJCX0gZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQorCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZCIpOworCQl9CisJCQorCQlyZXR1cm4gc2VydmVyU3RhdGVVbm1hbmFnZWRbc3RhdGVdOyovCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFuaW1hdGUoKSB7CisJCWNvdW50ICsrOworCQlpZiAoY291bnQgPiAyKQorCQkJY291bnQgPSAwOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUYWJsZVZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDkzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDYzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkJhc2VDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisvKioKKyAqIFRyZWUgdmlldyBzaG93aW5nIHNlcnZlcnMgYW5kIHRoZWlyIGFzc29jaWF0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlclRhYmxlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9ICJyb290IjsKKwlwcm90ZWN0ZWQgc3RhdGljIENvbG9yIGNvbG9yOworCXByb3RlY3RlZCBzdGF0aWMgRm9udCBmb250OworCXByb3RlY3RlZCBDbGlwYm9hcmQgY2xpcGJvYXJkOworCisJcHJvdGVjdGVkIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBzZXJ2ZXJSZXNvdXJjZUxpc3RlbmVyOworCXByb3RlY3RlZCBJUHVibGlzaExpc3RlbmVyIHB1Ymxpc2hMaXN0ZW5lcjsKKwlwcm90ZWN0ZWQgSVNlcnZlckxpc3RlbmVyIHNlcnZlckxpc3RlbmVyOworCisJcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZGVsZXRlZEVsZW1lbnQgPSBudWxsOworCisJLy8gc2VydmVycyB0aGF0IGFyZSBjdXJyZW50bHkgcHVibGlzaGluZyBhbmQgc3RhcnRpbmcKKwlwcm90ZWN0ZWQgc3RhdGljIFNldDxTdHJpbmc+IHB1Ymxpc2hpbmcgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDQpOworCXByb3RlY3RlZCBzdGF0aWMgU2V0PFN0cmluZz4gc3RhcnRpbmcgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDQpOworCisJcHJvdGVjdGVkIFNlcnZlclRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOworCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKKwkvL3Byb3RlY3RlZCBJU2VsZWN0aW9uTGlzdGVuZXIgZHNMaXN0ZW5lcjsKKworCXByb3RlY3RlZCBTZXJ2ZXJzVmlldyB2aWV3OworCisJcHJvdGVjdGVkIGJvb2xlYW4gYW5pbWF0aW9uQWN0aXZlID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gc3RvcEFuaW1hdGlvbiA9IGZhbHNlOworCisJcHVibGljIGNsYXNzIFNlcnZlckNvbnRlbnRQcm92aWRlciBleHRlbmRzIEJhc2VDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgeworCQkJTGlzdDxJU2VydmVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOworCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKKwkJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKKwkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJCWlmICghKChTZXJ2ZXIpc2VydmVyc1tpXSkuaXNQcml2YXRlKCkpCisJCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisJCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKKwkJCQl0cnkgeworCQkJCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBtcy5zZXJ2ZXIuZ2V0Q2hpbGRNb2R1bGVzKG1zLm1vZHVsZSwgbnVsbCk7CisJCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOworCQkJCQlNb2R1bGVTZXJ2ZXJbXSBtczIgPSBuZXcgTW9kdWxlU2VydmVyW3NpemVdOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkJaW50IHNpemUyID0gbXMubW9kdWxlLmxlbmd0aDsKKwkJCQkJCUlNb2R1bGVbXSBtb2R1bGUgPSBuZXcgSU1vZHVsZVtzaXplMiArIDFdOworCQkJCQkJU3lzdGVtLmFycmF5Y29weShtcy5tb2R1bGUsIDAsIG1vZHVsZSwgMCwgc2l6ZTIpOworCQkJCQkJbW9kdWxlW3NpemUyXSA9IGNoaWxkcmVuW2ldOworCQkJCQkJbXMyW2ldID0gbmV3IE1vZHVsZVNlcnZlcihtcy5zZXJ2ZXIsIG1vZHVsZSk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIG1zMjsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisJCQkKKwkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7CisJCQlJTW9kdWxlW10gbW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCk7IAorCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKKwkJCU1vZHVsZVNlcnZlcltdIG1zID0gbmV3IE1vZHVsZVNlcnZlcltzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJbXNbaV0gPSBuZXcgTW9kdWxlU2VydmVyKHNlcnZlciwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZXNbaV0gfSk7CisJCQl9CisJCQlyZXR1cm4gbXM7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgeworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKKwkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OworCQkJCXJldHVybiBtcy5zZXJ2ZXI7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgeworCQkJCS8vIENoZWNrIGlmIHRoZSBtb2R1bGUgc2VydmVyIGhhcyBjaGlsZCBtb2R1bGVzLgorCQkJCU1vZHVsZVNlcnZlciBjdXJNb2R1bGVTZXJ2ZXIgPSAoTW9kdWxlU2VydmVyKWVsZW1lbnQ7CisJCQkJSVNlcnZlciBjdXJTZXJ2ZXIgPSBjdXJNb2R1bGVTZXJ2ZXIuc2VydmVyOworCQkJCUlNb2R1bGVbXSBjdXJNb2R1bGUgPSBjdXJNb2R1bGVTZXJ2ZXIubW9kdWxlOworCQkJCWlmIChjdXJTZXJ2ZXIgIT0gbnVsbCAmJiAgY3VyTW9kdWxlICE9IG51bGwpIHsKKwkJCQkJSU1vZHVsZVtdIGN1ckNoaWxkTW9kdWxlID0gY3VyU2VydmVyLmdldENoaWxkTW9kdWxlcyhjdXJNb2R1bGUsIG51bGwpOworCQkJCQlpZiAoY3VyQ2hpbGRNb2R1bGUgIT0gbnVsbCAmJiBjdXJDaGlsZE1vZHVsZS5sZW5ndGggPiAwKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCQorCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKKwkJCXJldHVybiBzZXJ2ZXIuZ2V0TW9kdWxlcygpLmxlbmd0aCA+IDA7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzdGFydFRocmVhZCgpIHsKKwkJaWYgKGFuaW1hdGlvbkFjdGl2ZSkKKwkJCXJldHVybjsKKwkJCisJCXN0b3BBbmltYXRpb24gPSBmYWxzZTsKKwkJCisJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGdldFRyZWUoKS5nZXREaXNwbGF5KCk7CisJCWZpbmFsIGludCBTTEVFUCA9IDIwMDsKKwkJZmluYWwgUnVubmFibGVbXSBhbmltYXRvciA9IG5ldyBSdW5uYWJsZVsxXTsKKwkJYW5pbWF0b3JbMF0gPSBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKCFzdG9wQW5pbWF0aW9uKSB7CisJCQkJCXRyeSB7CisJCQkJCQlsYWJlbFByb3ZpZGVyLmFuaW1hdGUoKTsKKwkJCQkJCQorCQkJCQkJaW50IHNpemUgPSAwOworCQkJCQkJU3RyaW5nW10gc2VydmVyczsKKwkJCQkJCXN5bmNocm9uaXplZCAoc3RhcnRpbmcpIHsKKwkJCQkJCQlzaXplID0gc3RhcnRpbmcuc2l6ZSgpOworCQkJCQkJCXNlcnZlcnMgPSBuZXcgU3RyaW5nW3NpemVdOworCQkJCQkJCXN0YXJ0aW5nLnRvQXJyYXkoc2VydmVycyk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVyc1tpXSk7CisJCQkJCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIGdldFRyZWUoKSAhPSBudWxsICYmICFnZXRUcmVlKCkuaXNEaXNwb3NlZCgpKQorCQkJCQkJCQl1cGRhdGVBbmltYXRpb24oc2VydmVyKTsKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkVycm9yIGluIFNlcnZlcnMgdmlldyBhbmltYXRpb24iLCBlKTsKKwkJCQkJfQorCQkJCQlkaXNwbGF5LnRpbWVyRXhlYyhTTEVFUCwgYW5pbWF0b3JbMF0pOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlkaXNwbGF5LnRpbWVyRXhlYyhTTEVFUCwgYW5pbWF0b3JbMF0pOworCQkJfQorCQl9KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzdG9wVGhyZWFkKCkgeworCQlzdG9wQW5pbWF0aW9uID0gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBTZXJ2ZXJUYWJsZVZpZXdlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqIAorCSAqIEBwYXJhbSB2aWV3IHRoZSB2aWV3IAorCSAqIEBwYXJhbSB0cmVlIHRoZSB0cmVlCisJICovCisJcHVibGljIFNlcnZlclRhYmxlVmlld2VyKGZpbmFsIFNlcnZlcnNWaWV3IHZpZXcsIGZpbmFsIFRyZWUgdHJlZSkgeworCQlzdXBlcih0cmVlKTsKKwkJdGhpcy52aWV3ID0gdmlldzsKKwkJY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZCh0cmVlLmdldERpc3BsYXkoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCUNvbHVtblZpZXdlclRvb2xUaXBTdXBwb3J0LmVuYWJsZUZvcih0aGlzKTsKKwkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTZXJ2ZXJDb250ZW50UHJvdmlkZXIoKSk7CisJCWxhYmVsUHJvdmlkZXIgPSBuZXcgU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyKCk7CQkKKwkJc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsJCQorCQkKKwkJc2V0Q29tcGFyYXRvcihuZXcgU2VydmVyVmlld2VyQ29tcGFyYXRvcihsYWJlbFByb3ZpZGVyKSk7CisJCQorCQlzZXRJbnB1dChST09UKTsKKwkJYWRkTGlzdGVuZXJzKCk7CisJCQorCQkvKmRzTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQkJCWlmICghKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKKwkJCQkJcmV0dXJuOworCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOworCQkJCWZpbmFsIE9iamVjdCBvYmogPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJSVByb2plY3QgcHJvaiA9IG51bGw7CisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgeworCQkJCQlJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgb2JqOworCQkJCQlwcm9qID0gcmVzLmdldFByb2plY3QoKTsKKwkJCQl9CisJCQkJaWYgKHByb2ogPT0gbnVsbCAmJiBvYmogIT0gbnVsbCkgeworCQkJCQl0cnkgeworCQkJCQkJSVJlc291cmNlIHJlcyA9IChJUmVzb3VyY2UpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihvYmosIElSZXNvdXJjZS5jbGFzcyk7CisJCQkJCQlpZiAocmVzICE9IG51bGwpCisJCQkJCQkJcHJvaiA9IHJlcy5nZXRQcm9qZWN0KCk7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBpZ25vcmUKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAocHJvaiAhPSBudWxsKSB7CisJCQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBwcm9qOworCQkJCQlmaW5hbCBJTW9kdWxlIG1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKHByb2plY3QpOworCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCWlmIChnZXRUcmVlKCkgPT0gbnVsbCB8fCBnZXRUcmVlKCkuaXNEaXNwb3NlZCgpKQorCQkJCQkJCQlyZXR1cm47CisKKwkJCQkJCQlJU2VydmVyIGRlZmF1bHRTZXJ2ZXIgPSBudWxsOworCQkJCQkJCWlmIChtb2R1bGUgIT0gbnVsbCkKKwkJCQkJCQkJZGVmYXVsdFNlcnZlciA9IFNlcnZlckNvcmUuZ2V0RGVmYXVsdFNlcnZlcihtb2R1bGUpOworCQkJCQkJCQorCQkJCQkJCUlTZXJ2ZXIgb2xkRGVmYXVsdFNlcnZlciA9IGxhYmVsUHJvdmlkZXIuZ2V0RGVmYXVsdFNlcnZlcigpOworCQkJCQkJCWlmICgob2xkRGVmYXVsdFNlcnZlciA9PSBudWxsICYmIGRlZmF1bHRTZXJ2ZXIgPT0gbnVsbCkKKwkJCQkJCQkJCXx8IChvbGREZWZhdWx0U2VydmVyICE9IG51bGwgJiYgb2xkRGVmYXVsdFNlcnZlci5lcXVhbHMoZGVmYXVsdFNlcnZlcikpKQorCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJbGFiZWxQcm92aWRlci5zZXREZWZhdWx0U2VydmVyKGRlZmF1bHRTZXJ2ZXIpOworCQkJCQkJCQorCQkJCQkJCWlmIChvbGREZWZhdWx0U2VydmVyICE9IG51bGwpCisJCQkJCQkJCXJlZnJlc2gob2xkRGVmYXVsdFNlcnZlcik7CisJCQkJCQkJaWYgKGRlZmF1bHRTZXJ2ZXIgIT0gbnVsbCkKKwkJCQkJCQkJcmVmcmVzaChkZWZhdWx0U2VydmVyKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfQorCQkJfQorCQl9OworCQl2aWV3LmdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGRzTGlzdGVuZXIpOyovCisJCQorCQlpZiAoY29sb3IgPT0gbnVsbCkgeworCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKTsKKwkJCWNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkFZKTsKKwkJCUZvbnREYXRhW10gZmQgPSBnZXRDb250cm9sKCkuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7CisJCQlpbnQgc2l6ZSA9IGZkLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCWZkW2ldLnNldFN0eWxlKFNXVC5JVEFMSUMpOworCQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmVmcmVzaCh0cnVlKTsKKwkJZWxzZSB7CisJCQlvYmogPSBhZGFwdExhYmVsQ2hhbmdlT2JqZWN0cyhvYmopOworCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQkJdXBkYXRlKG9ialtpXSwgbnVsbCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXNvcnQgdGhlIHRhYmxlIGJhc2VkIG9uIGZpZWxkLgorCSAqIAorCSAqIEBwYXJhbSBjb2x1bW4gdGhlIGNvbHVtbiBiZWluZyB1cGRhdGVkCisJICogQHBhcmFtIGNvbAorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlc29ydFRhYmxlKGZpbmFsIFRyZWVDb2x1bW4gY29sdW1uLCBpbnQgY29sKSB7CisJCVNlcnZlclZpZXdlckNvbXBhcmF0b3Igc29ydGVyID0gKFNlcnZlclZpZXdlckNvbXBhcmF0b3IpIGdldENvbXBhcmF0b3IoKTsKKwkJCisJCWlmIChjb2wgPT0gc29ydGVyLmdldFRvcFByaW9yaXR5KCkpCisJCQlzb3J0ZXIucmV2ZXJzZVRvcFByaW9yaXR5KCk7CisJCWVsc2UKKwkJCXNvcnRlci5zZXRUb3BQcmlvcml0eShjb2wpOworCQkKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKAorCQkJbmV3IFJ1bm5hYmxlKCkgeworCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJcmVmcmVzaCgpOworCQkJCQl1cGRhdGVEaXJlY3Rpb25JbmRpY2F0b3IoY29sdW1uKTsKKwkJCQl9CisJCQl9KTsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIGRpcmVjdGlvbiBpbmRpY2F0b3IgYXMgY29sdW1uIGlzIG5vdyB0aGUgcHJpbWFyeSBjb2x1bW4uCisJICogCisJICogQHBhcmFtIGNvbHVtbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURpcmVjdGlvbkluZGljYXRvcihUcmVlQ29sdW1uIGNvbHVtbikgeworCQlnZXRUcmVlKCkuc2V0U29ydENvbHVtbihjb2x1bW4pOworCQlpZiAoKChTZXJ2ZXJWaWV3ZXJDb21wYXJhdG9yKSBnZXRDb21wYXJhdG9yKCkpLmdldFRvcFByaW9yaXR5RGlyZWN0aW9uKCkgPT0gU2VydmVyVmlld2VyQ29tcGFyYXRvci5BU0NFTkRJTkcpCisJCQlnZXRUcmVlKCkuc2V0U29ydERpcmVjdGlvbihTV1QuVVApOworCQllbHNlCisJCQlnZXRUcmVlKCkuc2V0U29ydERpcmVjdGlvbihTV1QuRE9XTik7CisJfQorCisJcHJvdGVjdGVkIE9iamVjdFtdIGFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKE9iamVjdFtdIG9iaikgeworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gb2JqOworCQkKKwkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJaW50IHNpemUgPSBvYmoubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJaWYgKG9ialtpXSBpbnN0YW5jZW9mIElNb2R1bGUpIHsKKwkJCQlsaXN0LmFkZChvYmpbaV0pOworCQkJfSBlbHNlIGlmIChvYmpbaV0gaW5zdGFuY2VvZiBJU2VydmVyKSB7CisJCQkJbGlzdC5hZGQob2JqW2ldKTsKKwkJCX0gZWxzZSBpZiAob2JqW2ldIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisJCQkJbGlzdC5hZGQob2JqW2ldKTsKKwkJCX0gZWxzZSBpZiAob2JqW2ldIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKwkJCQlJUHJvamVjdCBwcm9qID0gKElQcm9qZWN0KSBvYmpbaV07CisKKwkJCQlMaXN0PE9iamVjdD4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJCQlnZXRUcmVlQ2hpbGRyZW4obGlzdDIsIHZpZXcudHJlZVRhYmxlKTsKKwkJCQkKKwkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QyLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQlPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKKwkJCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIG87CisJCQkJCQlpZiAocHJvai5lcXVhbHMobXMubW9kdWxlW21zLm1vZHVsZS5sZW5ndGggLSAxXS5nZXRQcm9qZWN0KCkpKQorCQkJCQkJCWxpc3QuYWRkKG1zKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbbGlzdC5zaXplKCldOworCQlsaXN0LnRvQXJyYXkobyk7CisJCXJldHVybiBvOworCX0KKworCXByaXZhdGUgdm9pZCBnZXRUcmVlQ2hpbGRyZW4oTGlzdDxPYmplY3Q+IGxpc3QsIFdpZGdldCB3aWRnZXQpIHsKKwkJSXRlbVtdIGl0ZW1zID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJSXRlbSBpdGVtID0gaXRlbXNbaV07CisJCQlPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOworCQkJaWYgKGRhdGEgIT0gbnVsbCkKKwkJCQlsaXN0LmFkZChkYXRhKTsKKwkJCQorCQkJaWYgKGdldEV4cGFuZGVkKGl0ZW0pKSB7CisJCQkJLy8gb25seSByZWN1cnNlIGlmIGl0IGlzIGV4cGFuZGVkIC0gaWYKKwkJCQkvLyBub3QgdGhlbiB0aGUgY2hpbGRyZW4gYXJlbid0IHZpc2libGUKKwkJCQlnZXRUcmVlQ2hpbGRyZW4obGlzdCwgaXRlbSk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7CisJCXNlcnZlclJlc291cmNlTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VydmVyQWRkZWQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJCQlhZGRTZXJ2ZXIoc2VydmVyKTsKKwkJCQlzZXJ2ZXIuYWRkU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOworCQkJCSgoU2VydmVyKSBzZXJ2ZXIpLmFkZFB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOworCQkJfQorCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgeworCQkJCXJlZnJlc2hTZXJ2ZXIoc2VydmVyKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJCQlyZW1vdmVTZXJ2ZXIoc2VydmVyKTsKKwkJCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOworCQkJCSgoU2VydmVyKSBzZXJ2ZXIpLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOworCQkJfQorCQl9OworCQlTZXJ2ZXJDb3JlLmFkZFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHNlcnZlclJlc291cmNlTGlzdGVuZXIpOworCQkKKwkJcHVibGlzaExpc3RlbmVyID0gbmV3IFB1Ymxpc2hBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgcHVibGlzaFN0YXJ0ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJCQloYW5kbGVQdWJsaXNoQ2hhbmdlKHNlcnZlciwgdHJ1ZSk7CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIHB1Ymxpc2hGaW5pc2hlZChJU2VydmVyIHNlcnZlciwgSVN0YXR1cyBzdGF0dXMpIHsKKwkJCQloYW5kbGVQdWJsaXNoQ2hhbmdlKHNlcnZlciwgZmFsc2UpOworCQkJfQorCQl9OworCQkKKwkJc2VydmVyTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgeworCQkJCWlmIChldmVudCA9PSBudWxsKQorCQkJCQlyZXR1cm47CisJCQkJCisJCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKKwkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOworCQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSkgIT0gMCkgeworCQkJCQkvLyBzZXJ2ZXIgY2hhbmdlIGV2ZW50CisJCQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSAhPSAwKSB7CisJCQkJCQlyZWZyZXNoU2VydmVyKHNlcnZlcik7CisJCQkJCQlpbnQgc3RhdGUgPSBldmVudC5nZXRTdGF0ZSgpOworCQkJCQkJU3RyaW5nIGlkID0gc2VydmVyLmdldElkKCk7CisJCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORyB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKSB7CisJCQkJCQkJYm9vbGVhbiBzdGFydFRocmVhZCA9IGZhbHNlOworCQkJCQkJCXN5bmNocm9uaXplZCAoc3RhcnRpbmcpIHsKKwkJCQkJCQkJaWYgKCFzdGFydGluZy5jb250YWlucyhpZCkpIHsKKwkJCQkJCQkJCWlmIChzdGFydGluZy5pc0VtcHR5KCkpCisJCQkJCQkJCQkJc3RhcnRUaHJlYWQgPSB0cnVlOworCQkJCQkJCQkJc3RhcnRpbmcuYWRkKGlkKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlpZiAoc3RhcnRUaHJlYWQpCisJCQkJCQkJCXN0YXJ0VGhyZWFkKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWJvb2xlYW4gc3RvcFRocmVhZCA9IGZhbHNlOworCQkJCQkJCXN5bmNocm9uaXplZCAoc3RhcnRpbmcpIHsKKwkJCQkJCQkJaWYgKHN0YXJ0aW5nLmNvbnRhaW5zKGlkKSkgeworCQkJCQkJCQkJc3RhcnRpbmcucmVtb3ZlKGlkKTsKKwkJCQkJCQkJCWlmIChzdGFydGluZy5pc0VtcHR5KCkpCisJCQkJCQkJCQkJc3RvcFRocmVhZCA9IHRydWU7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJaWYgKHN0b3BUaHJlYWQpCisJCQkJCQkJCXN0b3BUaHJlYWQoKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlCisJCQkJCQlyZWZyZXNoU2VydmVyKHNlcnZlcik7CisJCQkJfSBlbHNlIGlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSkgIT0gMCkgeworCQkJCQkvLyBtb2R1bGUgY2hhbmdlIGV2ZW50CisJCQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSAhPSAwIHx8IChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5QVUJMSVNIX1NUQVRFX0NIQU5HRSkgIT0gMCkgeworCQkJCQkJcmVmcmVzaFNlcnZlcihzZXJ2ZXIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCQkKKwkJLy8gYWRkIGxpc3RlbmVycyB0byBzZXJ2ZXJzCisJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CisJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCXNlcnZlcnNbaV0uYWRkU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOworCQkJCSgoU2VydmVyKSBzZXJ2ZXJzW2ldKS5hZGRQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKKwkJCX0KKwkJfQorCQkKKwkJbGFiZWxQcm92aWRlckxpc3RlbmVyID0gbmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCSAgICBoYW5kbGVMYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7CisJCSAgfQorCQl9OworCQlsYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKGxhYmVsUHJvdmlkZXJMaXN0ZW5lcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlcnZlcihmaW5hbCBJU2VydmVyIHNlcnZlcikgeworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyeSB7CisJCQkJCXJlZnJlc2goc2VydmVyKTsKKwkJCQkJSVNlbGVjdGlvbiBzZWwgPSBTZXJ2ZXJUYWJsZVZpZXdlci50aGlzLmdldFNlbGVjdGlvbigpOworCQkJCQlTZXJ2ZXJUYWJsZVZpZXdlci50aGlzLnNldFNlbGVjdGlvbihzZWwpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0KKwkJfSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZShEaXNwb3NlRXZlbnQgZXZlbnQpIHsKKwkJc3RvcFRocmVhZCgpOworCQkvL2lmIChkc0xpc3RlbmVyICE9IG51bGwpCisJCS8vCXZpZXcuZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoZHNMaXN0ZW5lcik7CisJCQorCQlTZXJ2ZXJDb3JlLnJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHNlcnZlclJlc291cmNlTGlzdGVuZXIpOworCQkKKwkJLy8gcmVtb3ZlIGxpc3RlbmVycyBmcm9tIHNlcnZlcgorCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOworCQlpZiAoc2VydmVycyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoc2VydmVyTGlzdGVuZXIgIT0gbnVsbCkKKwkJCQkJc2VydmVyc1tpXS5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7CisJCQkJaWYgKHB1Ymxpc2hMaXN0ZW5lciAhPSBudWxsKQorCQkJCQkoKFNlcnZlcikgc2VydmVyc1tpXSkucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7CisJCQl9CisJCX0KKwkJCisJCS8vIFJlbW92ZSB0aGUgbGFiZWwgcHJvdmlkZXIgbGlzdGVuZXJzLgorCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsICYmIGxhYmVsUHJvdmlkZXJMaXN0ZW5lciAhPSBudWxsKSB7CisJCQlsYWJlbFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKGxhYmVsUHJvdmlkZXJMaXN0ZW5lcik7CisJCX0KKwkJCisJCWNsaXBib2FyZC5kaXNwb3NlKCk7CisJCQorCQlzdXBlci5oYW5kbGVEaXNwb3NlKGV2ZW50KTsKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgcHVibGlzaCBzdGF0ZSBjaGFuZ2VzLgorCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQdWJsaXNoQ2hhbmdlKElTZXJ2ZXIgc2VydmVyLCBib29sZWFuIGlzUHVibGlzaGluZykgeworCQlTdHJpbmcgc2VydmVySWQgPSBzZXJ2ZXIuZ2V0SWQoKTsKKwkJaWYgKGlzUHVibGlzaGluZykKKwkJCXB1Ymxpc2hpbmcuYWRkKHNlcnZlcklkKTsKKwkJZWxzZQorCQkJcHVibGlzaGluZy5yZW1vdmUoc2VydmVySWQpOworCQorCQlyZWZyZXNoU2VydmVyKHNlcnZlcik7CisJfQorCQorCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlck1vZHVsZXNDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyMikgeworCQlpZiAoc2VydmVyMiA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CisJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWlmIChzZXJ2ZXIyLmVxdWFscyhzZXJ2ZXJzW2ldKSkKKwkJCQkJcmVmcmVzaChzZXJ2ZXJzW2ldKTsKKwkJCX0KKwkJfQorCX0KKwkKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiBhbiBlbGVtZW50IGlzIGFkZGVkLgorCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZUFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7CisJCWFkZChudWxsLCBzZXJ2ZXIpOworCX0KKwkKKwkvKnByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlclJlc291cmNlQWRkZWQoSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworCQljb25maWd1cmF0aW9uQ2hhbmdlKGNvbmZpZ3VyYXRpb24sIHRydWUpOworCX0qLworCQorCS8qKgorCSAqIENhbGxlZCB3aGVuIGFuIGVsZW1lbnQgaXMgY2hhbmdlZC4KKwkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyUmVzb3VyY2VDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyKSB7CisJCXJlZnJlc2goc2VydmVyKTsKKwl9CisJCisJLypwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZUNoYW5nZWQoSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOworCQlpZiAoc2VydmVycyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXJ2ZXJzW2ldLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKKwkJCQlpZiAoY29uZmlndXJhdGlvbi5lcXVhbHMoY29uZmlnKSkKKwkJCQkJcmVmcmVzaChzZXJ2ZXJzW2ldKTsKKwkJCX0KKwkJfQorCX0qLworCQorCS8qKgorCSAqIENhbGxlZCB3aGVuIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZC4KKwkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyUmVzb3VyY2VSZW1vdmVkKElTZXJ2ZXIgc2VydmVyKSB7CisJCXJlbW92ZShzZXJ2ZXIpOworCisJCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOworCQlwdWJsaXNoaW5nLnJlbW92ZShzZXJ2ZXJJZCk7CisKKwkJdmlldy5nZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLnNldE1lc3NhZ2UobnVsbCwgbnVsbCk7CisJfQorCisJLypwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZVJlbW92ZWQoSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworCQljb25maWd1cmF0aW9uQ2hhbmdlKGNvbmZpZ3VyYXRpb24sIGZhbHNlKTsKKwl9Ki8KKworCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZlcihmaW5hbCBJU2VydmVyIHNlcnZlcikgeworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWFkZChST09ULCBzZXJ2ZXIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZXJ2ZXIoZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKKwkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlyZW1vdmUoc2VydmVyKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LCBib29sZWFuIGZ1bGxNYXApIHsKKwkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWVJdGVtICYmIGNvbG9yICE9IG51bGwpIHsKKwkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIHdpZGdldDsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisJCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKKwkJCQlJTW9kdWxlIG0gPSBtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aC0xXTsKKwkJCQlpZiAobS5pc0V4dGVybmFsKCkpCisJCQkJCWl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7CisJCQkJZWxzZQorCQkJCQlpdGVtLnNldEZvcmVncm91bmQobnVsbCk7CisJCQkJaWYgKG1zLnNlcnZlci5nZXRNb2R1bGVQdWJsaXNoU3RhdGUobXMubW9kdWxlKSAhPSBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSkKKwkJCQkJaXRlbS5zZXRGb250KDAsIGZvbnQpOworCQkJCWVsc2UKKwkJCQkJaXRlbS5zZXRGb250KDAsIG51bGwpOworCQkJfQorCQl9CisJCXN1cGVyLmRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGZ1bGxNYXApOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFuaW1hdGlvbihJU2VydmVyIHNlcnZlcikgeworCQl0cnkgeworCQkJV2lkZ2V0IHdpZGdldCA9IGRvRmluZEl0ZW0oc2VydmVyKTsKKwkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIHdpZGdldDsKKwkJCWl0ZW0uc2V0VGV4dCgxLCBsYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoc2VydmVyLCAxKSk7CisJCQlpdGVtLnNldEltYWdlKDEsIGxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2Uoc2VydmVyLCAxKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgaW4gb3B0aW1pemVkIGFuaW1hdGlvbiIsIGUpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUcmFuc2Zlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRyYW5zZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0M2RjMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUcmFuc2Zlci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1lbWVudG87CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuWE1MTWVtZW50bzsKKy8qCisgKiBUaGUgZWxlbWVudCBzZXJpYWxpemF0aW9uIGZvcm1hdCBpczoKKyAqICAoaW50KSBudW1iZXIgb2Ygc2VydmVycworICogVGhlbiwgdGhlIGZvbGxvd2luZyBmb3IgZWFjaCBzZXJ2ZXI6CisgKiAgKFN0cmluZykgaWQKKyAqLworcHVibGljIGNsYXNzIFNlcnZlclRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlcnZlclRyYW5zZmVyIGluc3RhbmNlID0gbmV3IFNlcnZlclRyYW5zZmVyKCk7CisKKwkvLyBDcmVhdGUgYSB1bmlxdWUgSUQgdG8gbWFrZSBzdXJlIHRoYXQgZGlmZmVyZW50IEVjbGlwc2UKKwkvLyBhcHBsaWNhdGlvbnMgdXNlIGRpZmZlcmVudCAidHlwZXMiIG9mIDxjb2RlPkphdmFFbGVtZW50VHJhbnNmZXI8L2NvZGU+CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTkFNRSA9ICJzZXJ2ZXItdHJhbnNmZXItZm9ybWF0OiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICI6IiArIGluc3RhbmNlLmhhc2hDb2RlKCk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRUlEID0gcmVnaXN0ZXJUeXBlKFRZUEVfTkFNRSk7CisKKwlwcml2YXRlIFNlcnZlclRyYW5zZmVyKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqCisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBTZXJ2ZXJUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGluc3RhbmNlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gVHJhbnNmZXIuCisJICovCisJcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7CisJCXJldHVybiBuZXcgaW50W10geyBUWVBFSUQgfTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIFRyYW5zZmVyLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nW10geyBUWVBFX05BTUUgfTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyI2phdmFUb05hdGl2ZShqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IGRhdGEsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKKwkJaWYgKCEoZGF0YSBpbnN0YW5jZW9mIElTZXJ2ZXJbXSkpCisJCQlyZXR1cm47CisJCQorCQlJU2VydmVyW10gc2VydmVycyA9IChJU2VydmVyW10pIGRhdGE7CisJCXRyeSB7CisJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJCisJCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgic2VydmVycyIpOworCQkJCisJCQkvLyB3cml0ZSBlYWNoIGVsZW1lbnQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgeworCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgic2VydmVyIik7CisJCQkJKChTZXJ2ZXIpc2VydmVyc1tpXSkuc2VyaWFsaXplKGNoaWxkKTsKKwkJCX0KKwkJCQorCQkJbWVtZW50by5zYXZlKG91dCk7CisJCQkKKwkJCS8vIGNsZWFudXAKKwkJCW91dC5jbG9zZSgpOworCQkJYnl0ZVtdIGJ5dGVzID0gb3V0LnRvQnl0ZUFycmF5KCk7CisJCQlzdXBlci5qYXZhVG9OYXRpdmUoYnl0ZXMsIHRyYW5zZmVyRGF0YSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGl0J3MgYmVzdCB0byBzZW5kIG5vdGhpbmcgaWYgdGhlcmUgd2VyZSBwcm9ibGVtcworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlciNuYXRpdmVUb0phdmEob3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCisJICovCisJcHJvdGVjdGVkIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgeworCQlieXRlW10gYnl0ZXMgPSAoYnl0ZVtdKSBzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKKwkJaWYgKGJ5dGVzID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOworCQl0cnkgeworCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOworCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNlcnZlciIpOworCQkJCisJCQlpbnQgY291bnQgPSBjaGlsZHJlbi5sZW5ndGg7CisJCQlJU2VydmVyW10gcmVzdWx0cyA9IG5ldyBJU2VydmVyW2NvdW50XTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJCVNlcnZlciBzZXJ2ZXIgPSBuZXcgU2VydmVyKG51bGwpOworCQkJCXNlcnZlci5kZXNlcmlhbGl6ZShjaGlsZHJlbltpXSk7CisJCQkJcmVzdWx0c1tpXSA9IHNlcnZlcjsKKwkJCX0KKwkJCXJldHVybiByZXN1bHRzOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOworCQl9CisJCXJldHVybiBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVmlld2VyQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclZpZXdlckNvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGRiMzAyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclZpZXdlckNvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOworCitwdWJsaWMgY2xhc3MgU2VydmVyVmlld2VyQ29tcGFyYXRvciBleHRlbmRzIFZpZXdlckNvbXBhcmF0b3IgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9ERVBUSCA9IDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNDRU5ESU5HID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNDRU5ESU5HID0gLTE7CisKKwlwcm90ZWN0ZWQgU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7CisKKwlwcm90ZWN0ZWQgaW50W10gcHJpb3JpdGllcyA9IG5ldyBpbnRbXSB7IDAgfTsKKworCXByb3RlY3RlZCBpbnRbXSBkaXJlY3Rpb25zID0gbmV3IGludFtdIHsgQVNDRU5ESU5HIH07CisKKwlwdWJsaWMgU2VydmVyVmlld2VyQ29tcGFyYXRvcihTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgeworCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvcFByaW9yaXR5KGludCBwcmlvcml0eSkgeworCQlpZiAocHJpb3JpdGllc1swXSA9PSBwcmlvcml0eSkKKwkJCXJldHVybjsKKwkJCisJCWludCBsZW4gPSBwcmlvcml0aWVzLmxlbmd0aCArIDE7CisJCWlmIChsZW4gPiBNQVhfREVQVEgpCisJCQlsZW4gPSBNQVhfREVQVEg7CisJCQorCQlpbnRbXSB0ZW1wID0gbmV3IGludFtsZW5dOworCQlTeXN0ZW0uYXJyYXljb3B5KHByaW9yaXRpZXMsIDAsIHRlbXAsIDEsIGxlbiAtIDEpOworCQl0ZW1wWzBdID0gcHJpb3JpdHk7CisJCXByaW9yaXRpZXMgPSB0ZW1wOworCQkKKwkJdGVtcCA9IG5ldyBpbnRbbGVuXTsKKwkJU3lzdGVtLmFycmF5Y29weShkaXJlY3Rpb25zLCAwLCB0ZW1wLCAxLCBsZW4gLSAxKTsKKwkJdGVtcFswXSA9IEFTQ0VORElORzsKKwkJZGlyZWN0aW9ucyA9IHRlbXA7CisJfQorCisJcHVibGljIGludCBnZXRUb3BQcmlvcml0eSgpIHsKKwkJcmV0dXJuIHByaW9yaXRpZXNbMF07CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9wUHJpb3JpdHlEaXJlY3Rpb24oaW50IGRpcmVjdGlvbikgeworCQlpZiAoZGlyZWN0aW9uID09IEFTQ0VORElORyB8fCBkaXJlY3Rpb24gPT0gREVTQ0VORElORykgeworCQkJZGlyZWN0aW9uc1swXSA9IGRpcmVjdGlvbjsKKwkJfQorCX0KKworCXB1YmxpYyBpbnQgZ2V0VG9wUHJpb3JpdHlEaXJlY3Rpb24oKSB7CisJCXJldHVybiBkaXJlY3Rpb25zWzBdOworCX0KKworCXB1YmxpYyB2b2lkIHJldmVyc2VUb3BQcmlvcml0eSgpIHsKKwkJZGlyZWN0aW9uc1swXSAqPSAtMTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIsIGludCBhKSB7CisJCWludCBjb2wgPSBwcmlvcml0aWVzW2FdOworCQkKKwkJU3RyaW5nIHMxID0gbGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0KGUxLCBjb2wpOworCQlTdHJpbmcgczIgPSBsYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoZTIsIGNvbCk7CisJCQorCQlpbnQgcyA9IHMxLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIpICogZGlyZWN0aW9uc1thXTsKKwkJaWYgKHMgPT0gMCkgeworCQkJaWYgKGEgPT0gcHJpb3JpdGllcy5sZW5ndGggLSAxKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIGNvbXBhcmUodmlld2VyLCBlMSwgZTIsIGErMSk7CisJCX0KKwkJcmV0dXJuIHM7CisJfQorCisJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CisJCXJldHVybiBjb21wYXJlKHZpZXdlciwgZTEsIGUyLCAwKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlcnNWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDc1NGFkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlcnNWaWV3LmphdmEKQEAgLTAsMCArMSw0NjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVXBkYXRlU2VydmVySm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zLk5ld1NlcnZlcldpemFyZEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5JQ29udGV4dFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7CisvKioKKyAqIEEgdmlldyBvZiBzZXJ2ZXJzLCB0aGVpciBtb2R1bGVzLCBhbmQgc3RhdHVzLgorICovCitwdWJsaWMgY2xhc3MgU2VydmVyc1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT0xVTU5fV0lEVEggPSAiY29sdW1uV2lkdGgiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJTX1ZJRVdfQ09OVEVYVCA9ICJvcmcuZWNsaXBzZS51aS5zZXJ2ZXJWaWV3U2NvcGUiOworCisJcHJvdGVjdGVkIEFjdGlvbiBub25lQWN0aW9uID0gbmV3IEFjdGlvbihNZXNzYWdlcy5kaWFsb2dNb25pdG9yTm9uZSkgeworCQkvLyBkdW1teSBhY3Rpb24KKwl9OworCisJcHJvdGVjdGVkIGludFtdIGNvbHM7CisKKwlwcm90ZWN0ZWQgVHJlZSB0cmVlVGFibGU7CisJcHJvdGVjdGVkIFNlcnZlclRhYmxlVmlld2VyIHRhYmxlVmlld2VyOworCisJLy8gYWN0aW9ucyBvbiBhIHNlcnZlcgorCXByb3RlY3RlZCBBY3Rpb25bXSBhY3Rpb25zOworCXByb3RlY3RlZCBBY3Rpb24gYWN0aW9uTW9kaWZ5TW9kdWxlczsKKwlwcm90ZWN0ZWQgQWN0aW9uIG9wZW5BY3Rpb24sIHNob3dJbkNvbnNvbGVBY3Rpb24sIHNob3dJbkRlYnVnQWN0aW9uLCBwcm9wZXJ0aWVzQWN0aW9uLCBtb25pdG9yUHJvcGVydGllc0FjdGlvbjsKKwlwcm90ZWN0ZWQgQWN0aW9uIGNvcHlBY3Rpb24sIHBhc3RlQWN0aW9uLCBkZWxldGVBY3Rpb24sIHJlbmFtZUFjdGlvbjsKKworCS8qKgorCSAqIFNlcnZlcnNWaWV3IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFNlcnZlcnNWaWV3KCkgeworCQlzdXBlcigpOworCX0KKworCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBnZXRIZWFkZXJMaXN0ZW5lcihmaW5hbCBpbnQgY29sKSB7CisJCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCS8qKgorCQkJICogSGFuZGxlcyB0aGUgY2FzZSBvZiB1c2VyIHNlbGVjdGluZyB0aGUgaGVhZGVyIGFyZWEuCisJCQkgKi8KKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAodGFibGVWaWV3ZXIgPT0gbnVsbCkKKwkJCQkJcmV0dXJuOworCQkJCVRyZWVDb2x1bW4gY29sdW1uID0gKFRyZWVDb2x1bW4pIGUud2lkZ2V0OworCQkJCXRhYmxlVmlld2VyLnJlc29ydFRhYmxlKGNvbHVtbiwgY29sKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBjcmVhdGVQYXJ0Q29udHJvbCBtZXRob2QgY29tbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJdHJlZVRhYmxlID0gbmV3IFRyZWUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKKwkJdHJlZVRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisJCXRyZWVUYWJsZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOworCQl0cmVlVGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCXRyZWVUYWJsZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOworCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRyZWVUYWJsZSwgQ29udGV4dElkcy5WSUVXX1NFUlZFUlMpOworCQkKKwkJLy8gYWRkIGNvbHVtbnMKKwkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlVGFibGUsIFNXVC5TSU5HTEUpOworCQljb2x1bW4uc2V0VGV4dChNZXNzYWdlcy52aWV3U2VydmVyKTsKKwkJY29sdW1uLnNldFdpZHRoKGNvbHNbMF0pOworCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0SGVhZGVyTGlzdGVuZXIoMCkpOworCQl0cmVlVGFibGUuc2V0U29ydENvbHVtbihjb2x1bW4pOworCQl0cmVlVGFibGUuc2V0U29ydERpcmVjdGlvbihTV1QuVVApOworCQkKKwkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZVRhYmxlLCBTV1QuU0lOR0xFKTsKKwkJY29sdW1uMi5zZXRUZXh0KE1lc3NhZ2VzLnZpZXdTdGF0ZSk7CisJCWNvbHVtbjIuc2V0V2lkdGgoY29sc1sxXSk7CisJCWNvbHVtbjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0SGVhZGVyTGlzdGVuZXIoMSkpOworCQkKKwkJVHJlZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRyZWVDb2x1bW4odHJlZVRhYmxlLCBTV1QuU0lOR0xFKTsKKwkJY29sdW1uMy5zZXRUZXh0KE1lc3NhZ2VzLnZpZXdTdGF0dXMpOworCQljb2x1bW4zLnNldFdpZHRoKGNvbHNbMl0pOworCQljb2x1bW4zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldEhlYWRlckxpc3RlbmVyKDIpKTsKKwkJCisJCUlDb250ZXh0U2VydmljZSBjb250ZXh0U3VwcG9ydCA9IChJQ29udGV4dFNlcnZpY2UpZ2V0U2l0ZSgpLmdldFNlcnZpY2UoSUNvbnRleHRTZXJ2aWNlLmNsYXNzKTsKKwkJY29udGV4dFN1cHBvcnQuYWN0aXZhdGVDb250ZXh0KFNFUlZFUlNfVklFV19DT05URVhUKTsKKwkJCisJCWRlZmVySW5pdGlhbGl6YXRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVmZXJJbml0aWFsaXphdGlvbigpIHsKKwkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlVGFibGUsIFNXVC5OT05FKTsKKwkJaXRlbS5zZXRUZXh0KE1lc3NhZ2VzLnZpZXdJbml0aWFsaXppbmcpOworCQkKKwkJdGFibGVWaWV3ZXIgPSBuZXcgU2VydmVyVGFibGVWaWV3ZXIodGhpcywgdHJlZVRhYmxlKTsKKwkJaW5pdGlhbGl6ZUFjdGlvbnModGFibGVWaWV3ZXIpOworCQkKKwkJSm9iIGpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXcpIHsKKwkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOworCQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkJKChTZXJ2ZXIpc2VydmVyc1tpXSkuZ2V0QWxsTW9kdWxlcygpLml0ZXJhdG9yKCk7CisJCQkJCS8qd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCW1vZHVsZS5nCisJCQkJCX0qLworCQkJCX0KKwkJCQkKKwkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWRlZmVycmVkSW5pdGlhbGl6ZSgpOworCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkvLyBpZ25vcmUgLSB2aWV3IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KTsKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0KKwkJfTsKKwkJCisJCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7CisJCWpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOworCQlqb2Iuc2NoZWR1bGUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkZWZlcnJlZEluaXRpYWxpemUoKSB7CisJCXRhYmxlVmlld2VyLmluaXRpYWxpemUoKTsKKwkJdGFibGVWaWV3ZXIuYWRkT3Blbkxpc3RlbmVyKG5ldyBJT3Blbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgb3BlbihPcGVuRXZlbnQgZXZlbnQpIHsKKwkJCQl0cnkgeworCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOworCQkJCQlPYmplY3QgZGF0YSA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCQkJaWYgKCEoZGF0YSBpbnN0YW5jZW9mIElTZXJ2ZXIpKQorCQkJCQkJcmV0dXJuOworCQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBkYXRhOworCQkJCQlTZXJ2ZXJVSVBsdWdpbi5lZGl0U2VydmVyKHNlcnZlcik7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IG9wZW4gc2VydmVyIiwgZSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7CisJCW1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJZmluYWwgU2hlbGwgc2hlbGwgPSB0cmVlVGFibGUuZ2V0U2hlbGwoKTsKKwkJbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZ3IpIHsKKwkJCQlmaWxsQ29udGV4dE1lbnUoc2hlbGwsIG1ncik7CisJCQl9CisJCX0pOworCQlNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudSh0cmVlVGFibGUpOworCQl0cmVlVGFibGUuc2V0TWVudShtZW51KTsKKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIHRhYmxlVmlld2VyKTsKKwkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHRhYmxlVmlld2VyKTsKKwkJCisJCWluaXREcmFnQW5kRHJvcCgpOworCQkKKwkJLy8gaW5pdCB0aGUgdG9vbHRpcAorCQlTZXJ2ZXJUb29sVGlwIHRvb2xUaXAgPSBuZXcgU2VydmVyVG9vbFRpcCh0cmVlVGFibGUpOworCQl0b29sVGlwLnNldFNoaWZ0KG5ldyBQb2ludCgxMCwgMykpOworCQl0b29sVGlwLnNldFBvcHVwRGVsYXkoNDAwKTsgLy8gaW4gbXMKKwkJdG9vbFRpcC5zZXRIaWRlT25Nb3VzZURvd24odHJ1ZSk7CisJCXRvb2xUaXAuYWN0aXZhdGUoKTsKKwkJCisJCWlmICh0YWJsZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbUNvdW50KCkgPiAwKSB7CisJCQlPYmplY3Qgb2JqID0gdGFibGVWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW0oMCkuZ2V0RGF0YSgpOworCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iaikpOworCQl9CisJCQorCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlUaHJlYWQuc2xlZXAoNTAwMCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CisJCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQlJU2VydmVyIHNlcnZlciA9IHNlcnZlcnNbaV07CisJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKSB7CisJCQkJCQlVcGRhdGVTZXJ2ZXJKb2Igam9iID0gbmV3IFVwZGF0ZVNlcnZlckpvYihzZXJ2ZXIpOworCQkJCQkJam9iLnNjaGVkdWxlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisJCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisJCXRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZICsgMSk7CisJCXRocmVhZC5zdGFydCgpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUsIElNZW1lbnRvIG1lbWVudG8pIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7CisJCXN1cGVyLmluaXQoc2l0ZSwgbWVtZW50byk7CisJCWNvbHMgPSBuZXcgaW50WzNdOworCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCQkJY29sc1tpXSA9IDIwMDsKKwkJCWlmIChtZW1lbnRvICE9IG51bGwpIHsKKwkJCQlJbnRlZ2VyIGluID0gbWVtZW50by5nZXRJbnRlZ2VyKFRBR19DT0xVTU5fV0lEVEggKyBpKTsKKwkJCQlpZiAoaW4gIT0gbnVsbCAmJiBpbi5pbnRWYWx1ZSgpID4gNSkKKwkJCQkJY29sc1tpXSA9IGluLmludFZhbHVlKCk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgeworCQlUcmVlQ29sdW1uW10gdGMgPSB0cmVlVGFibGUuZ2V0Q29sdW1ucygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCQkJaW50IHdpZHRoID0gdGNbaV0uZ2V0V2lkdGgoKTsKKwkJCWlmICh3aWR0aCAhPSAwKQorCQkJCW1lbWVudG8ucHV0SW50ZWdlcihUQUdfQ09MVU1OX1dJRFRIICsgaSwgd2lkdGgpOworCQl9CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZSBhY3Rpb25zCisJICogCisJICogQHBhcmFtIHByb3ZpZGVyIGEgc2VsZWN0aW9uIHByb3ZpZGVyCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUFjdGlvbnMoSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7CisJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7CisJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKKwkJCisJCWFjdGlvbnMgPSBuZXcgQWN0aW9uWzZdOworCQkvLyBjcmVhdGUgdGhlIHN0YXJ0IGFjdGlvbnMKKwkJYWN0aW9uc1swXSA9IG5ldyBTdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpOworCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGVidWciLCBhY3Rpb25zWzBdKTsKKwkJYWN0aW9uc1sxXSA9IG5ldyBTdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKKwkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnJ1biIsIGFjdGlvbnNbMV0pOworCQlhY3Rpb25zWzJdID0gbmV3IFN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFKTsKKwkJCisJCS8vIGNyZWF0ZSB0aGUgc3RvcCBhY3Rpb24KKwkJYWN0aW9uc1szXSA9IG5ldyBTdG9wQWN0aW9uKHNoZWxsLCBwcm92aWRlcik7CisJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zdG9wIiwgYWN0aW9uc1szXSk7CisJCQorCQkvLyBjcmVhdGUgdGhlIHB1Ymxpc2ggYWN0aW9ucworCQlhY3Rpb25zWzRdID0gbmV3IFB1Ymxpc2hBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKKwkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnB1Ymxpc2giLCBhY3Rpb25zWzRdKTsKKwkJYWN0aW9uc1s1XSA9IG5ldyBQdWJsaXNoQ2xlYW5BY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKKwkJCisJCS8vIGNyZWF0ZSB0aGUgb3BlbiBhY3Rpb24KKwkJb3BlbkFjdGlvbiA9IG5ldyBPcGVuQWN0aW9uKHByb3ZpZGVyKTsKKwkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuT3BlbiIsIG9wZW5BY3Rpb24pOworCQkKKwkJLy8gY3JlYXRlIGNvcHksIHBhc3RlLCBhbmQgZGVsZXRlIGFjdGlvbnMKKwkJcGFzdGVBY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCB0YWJsZVZpZXdlci5jbGlwYm9hcmQpOworCQljb3B5QWN0aW9uID0gbmV3IENvcHlBY3Rpb24ocHJvdmlkZXIsIHRhYmxlVmlld2VyLmNsaXBib2FyZCwgcGFzdGVBY3Rpb24pOworCQlkZWxldGVBY3Rpb24gPSBuZXcgRGVsZXRlQWN0aW9uKHNoZWxsLCBwcm92aWRlcik7CisJCXJlbmFtZUFjdGlvbiA9IG5ldyBSZW5hbWVBY3Rpb24oc2hlbGwsIHRhYmxlVmlld2VyLCBwcm92aWRlcik7CisJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwgY29weUFjdGlvbik7CisJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksIHBhc3RlQWN0aW9uKTsKKwkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIGRlbGV0ZUFjdGlvbik7CisJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFTkFNRS5nZXRJZCgpLCByZW5hbWVBY3Rpb24pOworCQkKKwkJLy8gY3JlYXRlIHRoZSBvdGhlciBhY3Rpb25zCisJCWFjdGlvbk1vZGlmeU1vZHVsZXMgPSBuZXcgTW9kdWxlU2xvc2hBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKKwkJc2hvd0luQ29uc29sZUFjdGlvbiA9IG5ldyBTaG93SW5Db25zb2xlQWN0aW9uKHByb3ZpZGVyKTsKKwkJc2hvd0luRGVidWdBY3Rpb24gPSBuZXcgU2hvd0luRGVidWdBY3Rpb24ocHJvdmlkZXIpOworCQkKKwkJLy8gY3JlYXRlIHRoZSBwcm9wZXJ0aWVzIGFjdGlvbgorCQlwcm9wZXJ0aWVzQWN0aW9uID0gbmV3IFByb3BlcnRpZXNBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKKwkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5nZXRJZCgpLCBwcm9wZXJ0aWVzQWN0aW9uKTsKKwkJbW9uaXRvclByb3BlcnRpZXNBY3Rpb24gPSBuZXcgUHJvcGVydGllc0FjdGlvbihzaGVsbCwgIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydGllcy5tb25pdG9yIiwgcHJvdmlkZXIpOworCQkKKwkJLy8gYWRkIHRvb2xiYXIgYnV0dG9ucworCQlJQ29udHJpYnV0aW9uTWFuYWdlciBjbSA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aCAtIDE7IGkrKykKKwkJCWNtLmFkZChhY3Rpb25zW2ldKTsKKwkJCisJCWNtLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsTmV3Q29udGV4dE1lbnUoU2hlbGwgc2hlbGwsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJTWVudU1hbmFnZXIgbWVudSkgeworCQlJQWN0aW9uIG5ld1NlcnZlckFjdGlvbiA9IG5ldyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24oKTsKKwkJbmV3U2VydmVyQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uTmV3U2VydmVyKTsKKwkJbWVudS5hZGQobmV3U2VydmVyQWN0aW9uKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoU2hlbGwgc2hlbGwsIElNZW51TWFuYWdlciBtZW51KSB7CisJCS8vIGdldCBzZWxlY3Rpb24gYnV0IGF2b2lkIG5vIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KKwkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOworCQlJTW9kdWxlW10gbW9kdWxlID0gbnVsbDsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOworCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKQorCQkJCXNlcnZlciA9IChJU2VydmVyKSBvYmo7CisJCQlpZiAob2JqIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisJCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgb2JqOworCQkJCXNlcnZlciA9IG1zLnNlcnZlcjsKKwkJCQltb2R1bGUgPSBtcy5tb2R1bGU7CisJCQl9CisJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJc2VydmVyID0gbnVsbDsKKwkJCQltb2R1bGUgPSBudWxsOworCQkJfQorCQl9CisJCQorCQkvLyBuZXcgYWN0aW9uCisJCU1lbnVNYW5hZ2VyIG5ld01lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuYWN0aW9uTmV3KTsKKwkJZmlsbE5ld0NvbnRleHRNZW51KG51bGwsIHNlbGVjdGlvbiwgbmV3TWVudSk7CisJCW1lbnUuYWRkKG5ld01lbnUpOworCQkKKwkJLy8gb3BlbiBhY3Rpb24KKwkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZSA9PSBudWxsKSB7CisJCQltZW51LmFkZChvcGVuQWN0aW9uKTsKKwkJCQorCQkJU3RyaW5nIHRleHQgPSBNZXNzYWdlcy5hY3Rpb25TaG93SW47CisJCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7CisJCQlmaW5hbCBJQmluZGluZ1NlcnZpY2UgYmluZGluZ1NlcnZpY2UgPSAoSUJpbmRpbmdTZXJ2aWNlKSB3b3JrYmVuY2gKKwkJCQkJLmdldEFkYXB0ZXIoSUJpbmRpbmdTZXJ2aWNlLmNsYXNzKTsKKwkJCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGFjdGl2ZUJpbmRpbmdzID0gYmluZGluZ1NlcnZpY2UKKwkJCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5zaG93SW5RdWlja01lbnUiKTsKKwkJCWlmIChhY3RpdmVCaW5kaW5ncy5sZW5ndGggPiAwKSB7CisJCQkJdGV4dCArPSAiXHQiICsgYWN0aXZlQmluZGluZ3NbMF0uZm9ybWF0KCk7CisJCQl9CisJCQkKKwkJCU1lbnVNYW5hZ2VyIHNob3dJbk1lbnUgPSBuZXcgTWVudU1hbmFnZXIodGV4dCk7CisJCQlzaG93SW5NZW51LmFkZChzaG93SW5Db25zb2xlQWN0aW9uKTsKKwkJCXNob3dJbk1lbnUuYWRkKHNob3dJbkRlYnVnQWN0aW9uKTsKKwkJCS8vSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOworCQkJLy9hY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoImdyb3VwLnNob3ciLCBzaG93SW5NZW51KTsKKwkJCW1lbnUuYWRkKHNob3dJbk1lbnUpOworCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkJfSBlbHNlCisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkKKwkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQlpZiAobW9kdWxlID09IG51bGwpIHsKKwkJCQltZW51LmFkZChjb3B5QWN0aW9uKTsKKwkJCQltZW51LmFkZChwYXN0ZUFjdGlvbik7CisJCQkJbWVudS5hZGQoZGVsZXRlQWN0aW9uKTsKKwkJCQltZW51LmFkZChyZW5hbWVBY3Rpb24pOworCQkJfSBlbHNlIGlmIChtb2R1bGUubGVuZ3RoID09IDEpCisJCQkJbWVudS5hZGQobmV3IFJlbW92ZU1vZHVsZUFjdGlvbihzaGVsbCwgc2VydmVyLCBtb2R1bGVbMF0pKTsKKwkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisJCX0KKwkJCisJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgPT0gbnVsbCkgeworCQkJLy8gc2VydmVyIGFjdGlvbnMKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKKwkJCQltZW51LmFkZChhY3Rpb25zW2ldKTsKKwkJCQorCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkJCW1lbnUuYWRkKGFjdGlvbk1vZGlmeU1vZHVsZXMpOworCQkJCisJCQkvLyBtb25pdG9yCisJCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKSB7CisJCQkJZmluYWwgTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuYWN0aW9uTW9uaXRvcik7CisJCQkJCisJCQkJZmluYWwgSVNlcnZlciBzZXJ2ZXIyID0gc2VydmVyOworCQkJCWZpbmFsIFNoZWxsIHNoZWxsMiA9IHNoZWxsOworCQkJCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisJCQkJCQltZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKKwkJCQkJCWlmIChzZXJ2ZXIyLmdldEFkYXB0ZXIoU2VydmVyRGVsZWdhdGUuY2xhc3MpICE9IG51bGwpIHsKKwkJCQkJCQlTZXJ2ZXJQb3J0W10gcG9ydHMgPSBzZXJ2ZXIyLmdldFNlcnZlclBvcnRzKG51bGwpOworCQkJCQkJCWlmIChwb3J0cyAhPSBudWxsKSB7CisJCQkJCQkJCWludCBzaXplID0gcG9ydHMubGVuZ3RoOworCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkJCQkJaWYgKCFwb3J0c1tpXS5pc0FkdmFuY2VkKCkpCisJCQkJCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBNb25pdG9yU2VydmVyUG9ydEFjdGlvbihzaGVsbDIsIHNlcnZlcjIsIHBvcnRzW2ldKSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmIChtZW51TWFuYWdlci5pc0VtcHR5KCkpCisJCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5vbmVBY3Rpb24pOworCQkJCQkJCisJCQkJCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkJCQkJCW1lbnVNYW5hZ2VyLmFkZChtb25pdG9yUHJvcGVydGllc0FjdGlvbik7CisJCQkJCX0KKwkJCQl9KTsKKwkJCQkKKwkJCQkvLyBhZGQgYW4gaW5pdGlhbCBtZW51IGl0ZW0gc28gdGhhdCB0aGUgbWVudSBhcHBlYXJzIGNvcnJlY3RseQorCQkJCW5vbmVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJbWVudU1hbmFnZXIuYWRkKG5vbmVBY3Rpb24pOworCQkJCW1lbnUuYWRkKG1lbnVNYW5hZ2VyKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZSAhPSBudWxsKSB7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkJbWVudS5hZGQobmV3IFN0YXJ0TW9kdWxlQWN0aW9uKHNlcnZlciwgbW9kdWxlKSk7CisJCQltZW51LmFkZChuZXcgU3RvcE1vZHVsZUFjdGlvbihzZXJ2ZXIsIG1vZHVsZSkpOwkJCQorCQkJbWVudS5hZGQobmV3IFJlc3RhcnRNb2R1bGVBY3Rpb24oc2VydmVyLCBtb2R1bGUpKTsKKwkJfQorCQkKKwkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKyItZW5kIikpOworCQkKKwkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkJbWVudS5hZGQocHJvcGVydGllc0FjdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJaWYgKHRyZWVUYWJsZSAhPSBudWxsKQorCQkJdHJlZVRhYmxlLnNldEZvY3VzKCk7CisJfQorCisJLyoqCisgICAgKiBBZGRzIGRyYWcgYW5kIGRyb3Agc3VwcG9ydCB0byB0aGUgU2VydmVycyB2aWV3LgorICAgICovCisgICBwcm90ZWN0ZWQgdm9pZCBpbml0RHJhZ0FuZERyb3AoKSB7CisJCWludCBvcHMgPSBETkQuRFJPUF9DT1BZOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAorCQkJUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQkvL3RhYmxlVmlld2VyLmFkZERyYWdTdXBwb3J0KG9wcywgdHJhbnNmZXJzLCBuZXcgU2VydmVyc1ZpZXdEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdGFibGVWaWV3ZXIuYWRkRHJvcFN1cHBvcnQob3BzIHwgRE5ELkRST1BfREVGQVVMVCwgdHJhbnNmZXJzLCBuZXcgU2VydmVyc1ZpZXdEcm9wQWRhcHRlcih0YWJsZVZpZXdlcikpOworICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyc1ZpZXdEcm9wQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YjM0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyc1ZpZXdEcm9wQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckRyb3BBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUmVzb3VyY2VUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5FY2xpcHNlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zLlJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGU7CisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyIGV4dGVuZHMgVmlld2VyRHJvcEFkYXB0ZXIgeworCXByb3RlY3RlZCBTZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyKFZpZXdlciB2aWV3ZXIpIHsKKwkJc3VwZXIodmlld2VyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7CisJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKKwkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7CisKKwkJc3VwZXIuZHJhZ0VudGVyKGV2ZW50KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRHJvcChPYmplY3QgZGF0YSkgeworCQlPYmplY3QgdGFyZ2V0ID0gZ2V0Q3VycmVudFRhcmdldCgpOworCQlJU2VydmVyIHNlcnZlciA9IG51bGw7CisJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJU2VydmVyKQorCQkJc2VydmVyID0gKElTZXJ2ZXIpIHRhcmdldDsKKwkJCisJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbnVsbDsKKwkJaWYgKGRhdGEgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBkYXRhOworCQkJaXRlcmF0b3IgPSBzZWwuaXRlcmF0b3IoKTsKKwkJfQorCQkKKwkJaWYgKGl0ZXJhdG9yID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlib29sZWFuIGIgPSB0cnVlOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlPYmplY3QgZGF0YTIgPSBpdGVyYXRvci5uZXh0KCk7CisJCQlpZiAoIWRvU2VsKHNlcnZlciwgZGF0YTIpKQorCQkJCWIgPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gYjsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkb1NlbChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGRhdGEpIHsKKwkJLy8gY2hlY2sgaWYgdGhlIHNlbGVjdGlvbiBpcyBhIHByb2plY3QgKG1vZHVsZSkgdGhhdCB3ZSBjYW4gYWRkIHRvIHRoZSBzZXJ2ZXIKKwkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGRhdGEsIElQcm9qZWN0LmNsYXNzKTsKKwkJaWYgKHByb2plY3QgIT0gbnVsbCkgeworCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMocHJvamVjdCk7CisJCQlpZiAobW9kdWxlcyAhPSBudWxsICYmIG1vZHVsZXMubGVuZ3RoID09IDEpIHsKKwkJCQl0cnkgeworCQkJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKKwkJCQkJSU1vZHVsZVtdIHBhcmVudHMgPSB3Yy5nZXRSb290TW9kdWxlcyhtb2R1bGVzWzBdLCBudWxsKTsKKwkJCQkJaWYgKHBhcmVudHMgPT0gbnVsbCB8fCBwYXJlbnRzLmxlbmd0aCA9PSAwKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkKKwkJCQkJaWYgKFNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmVyLCBwYXJlbnRzWzBdLCBudWxsKSkKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCisJCQkJCUlNb2R1bGVbXSBhZGQgPSBuZXcgSU1vZHVsZVtdIHsgcGFyZW50c1swXSB9OworCQkJCQlpZiAod2MuY2FuTW9kaWZ5TW9kdWxlcyhhZGQsIG51bGwsIG51bGwpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUikgeworCQkJCQkJd2MubW9kaWZ5TW9kdWxlcyhtb2R1bGVzLCBudWxsLCBudWxsKTsKKwkJCQkJCXdjLnNhdmUoZmFsc2UsIG51bGwpOworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7CisJCQkJCXNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihzaGVsbCwgY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gb3RoZXJ3aXNlLCB0cnkgUnVuIG9uIFNlcnZlcgorCQlmaW5hbCBJU2VydmVyIGZpbmFsU2VydmVyID0gc2VydmVyOworCQlSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIHJvcyA9IG5ldyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCkgeworCQkJcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKElNb2R1bGUgbW9kdWxlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCWlmICghU2VydmVyVUlQbHVnaW4uaXNDb21wYXRpYmxlV2l0aExhdW5jaE1vZGUoZmluYWxTZXJ2ZXIsIGxhdW5jaE1vZGUpKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkKKwkJCQlpZiAoIVNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoZmluYWxTZXJ2ZXIsIG1vZHVsZSwgbW9uaXRvcikpIHsKKwkJCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gZmluYWxTZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCVNlcnZlclV0aWwubW9kaWZ5TW9kdWxlcyh3YywgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBuZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7CisJCQkJCQl3Yy5zYXZlKGZhbHNlLCBtb25pdG9yKTsKKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQkJdGhyb3cgY2U7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJcmV0dXJuIGZpbmFsU2VydmVyOworCQkJfQorCQl9OworCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigpIHsKKwkJCS8vCisJCX07CisJCXJvcy5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGF0YSkpOworCQkKKwkJLy9pZiAoIWFjdGlvbi5pc0VuYWJsZWQoKSkKKwkJLy8JcmV0dXJuIGZhbHNlOworCQkKKwkJcm9zLnJ1bihhY3Rpb24pOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURyb3AoT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgeworCQlpZiAodGFyZ2V0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCS8qSVNlcnZlciBzZXJ2ZXIgPSBudWxsOworCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVNlcnZlcikKKwkJCXNlcnZlciA9IChJU2VydmVyKSB0YXJnZXQ7Ki8KKwkJLy9pZiAoIVNlcnZlclVJUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KHRhcmdldCkpCisJCS8vCXJldHVybiBmYWxzZTsKKwkJCisJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiRHJvcCB0YXJnZXQ6ICIgKyB0YXJnZXQgKyAiICIgKyBvcGVyYXRpb24gKyAiICIgKyB0cmFuc2ZlclR5cGUpOworCQkKKwkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkKKwkJCXJldHVybiB0cnVlOworCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugc2VsZWN0aW9uIGZyb20gdGhlIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuCisgICAgKiAKKyAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIHNlbGVjdGlvbiBmcm9tIHRoZSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyCisgICAgKi8KKyAgIC8qcHJpdmF0ZSBJUmVzb3VyY2VbXSBnZXRTZWxlY3RlZFJlc291cmNlcygpIHsKKyAgICAgICBBcnJheUxpc3Qgc2VsZWN0ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpOworICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247CisgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNzZWwuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlcy5hZGQobyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgeworICAgICAgICAgICAgICAgICAgIElBZGFwdGFibGUgYSA9IChJQWRhcHRhYmxlKSBvOworICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByID0gKElSZXNvdXJjZSkgYS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlcy5hZGQocik7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHJldHVybiAoSVJlc291cmNlW10pIHNlbGVjdGVkUmVzb3VyY2VzLnRvQXJyYXkobmV3IElSZXNvdXJjZVtzZWxlY3RlZFJlc291cmNlcy5zaXplKCldKTsKKyAgIH0qLworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TaG93SW5Db25zb2xlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luQ29uc29sZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMGJmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luQ29uc29sZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLkNvbnNvbGVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5JVmlld1JlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CisvKioKKyAqICJTaG93IGluIENvbnNvbGUiIG1lbnUgYWN0aW9uLgorICovCitwdWJsaWMgY2xhc3MgU2hvd0luQ29uc29sZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKKwkvKioKKwkgKiBTaG93SW5Db25zb2xlQWN0aW9uIGNvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBzcCBhIHNlbGVjdGlvbiBwcm92aWRlcgorCSAqLworCXB1YmxpYyBTaG93SW5Db25zb2xlQWN0aW9uKElTZWxlY3Rpb25Qcm92aWRlciBzcCkgeworCQlzdXBlcihzcCwgIkNvbnNvbGUiKTsKKwkJCisJCUlWaWV3UmVnaXN0cnkgcmVnID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRWaWV3UmVnaXN0cnkoKTsKKwkJSVZpZXdEZXNjcmlwdG9yIGRlc2MgPSByZWcuZmluZChJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOworCQlzZXRUZXh0KGRlc2MuZ2V0TGFiZWwoKSk7CisJCXNldEltYWdlRGVzY3JpcHRvcihkZXNjLmdldEltYWdlRGVzY3JpcHRvcigpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJcmV0dXJuIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKSB7CisJCXRyeSB7CisJCQlJTGF1bmNoIGxhdW5jaCA9IHNlcnZlci5nZXRMYXVuY2goKTsKKwkJCXNlbGVjdFByb2Nlc3MobGF1bmNoLmdldFByb2Nlc3NlcygpWzBdKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgY29uc29sZSIsIGUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2VsZWN0UHJvY2VzcyhJUHJvY2VzcyBwcm9jZXNzKSB7CisJCUlDb25zb2xlTWFuYWdlciBjb25zb2xlTWFuYWdlciA9IENvbnNvbGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnNvbGVNYW5hZ2VyKCk7CisJCUlDb25zb2xlW10gY29uc29sZXMgPSBjb25zb2xlTWFuYWdlci5nZXRDb25zb2xlcygpOworCQlpbnQgc2l6ZSA9IGNvbnNvbGVzLmxlbmd0aDsKKwkJSUNvbnNvbGUgY29uc29sZSA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAoY29uc29sZXNbaV0gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlKSB7CisJCQkJb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZSBjb24gPSAob3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZSkgY29uc29sZXNbaV07CisJCQkJaWYgKHByb2Nlc3MuZXF1YWxzKGNvbi5nZXRQcm9jZXNzKCkpKQorCQkJCQljb25zb2xlID0gY29uc29sZXNbaV07CisJCQl9CisJCX0KKwkJCisJCWlmIChjb25zb2xlID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgOworCQlpZiAod2luZG93ICE9IG51bGwpIHsKKwkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOworCQkJaWYgKHBhZ2UgIT0gbnVsbCkgeworCQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYWdlLmZpbmRWaWV3KElDb25zb2xlQ29uc3RhbnRzLklEX0NPTlNPTEVfVklFVyk7CisJCQkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJCQl0cnkgeworCQkJCQkJcGFydCA9IHBhZ2Uuc2hvd1ZpZXcoSUNvbnNvbGVDb25zdGFudHMuSURfQ09OU09MRV9WSUVXKTsKKwkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IG9wZW4gY29uc29sZSB2aWV3Iik7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHBhcnQgIT0gbnVsbCkgeworCQkJCQlJQ29uc29sZVZpZXcgdmlldyA9IChJQ29uc29sZVZpZXcpIHBhcnQuZ2V0QWRhcHRlcihJQ29uc29sZVZpZXcuY2xhc3MpOworCQkJCQlpZiAodmlldyAhPSBudWxsKSB7CisJCQkJCQl2aWV3LnNldEZvY3VzKCk7CisJCQkJCQl2aWV3LmRpc3BsYXkoY29uc29sZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Nob3dJbkRlYnVnQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luRGVidWdBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQyY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Nob3dJbkRlYnVnQWN0aW9uLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5JVmlld1JlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CisvKioKKyAqICJTaG93IGluIENvbnNvbGUiIG1lbnUgYWN0aW9uLgorICovCitwdWJsaWMgY2xhc3MgU2hvd0luRGVidWdBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7CisJLyoqCisJICogU2hvd0luQ29uc29sZUFjdGlvbiBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKKwkgKi8KKwlwdWJsaWMgU2hvd0luRGVidWdBY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNwKSB7CisJCXN1cGVyKHNwLCAiQ29uc29sZSEiKTsKKwkJCisJCUlWaWV3UmVnaXN0cnkgcmVnID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRWaWV3UmVnaXN0cnkoKTsKKwkJSVZpZXdEZXNjcmlwdG9yIGRlc2MgPSByZWcuZmluZChJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKKwkJc2V0VGV4dChkZXNjLmdldExhYmVsKCkpOworCQlzZXRJbWFnZURlc2NyaXB0b3IoZGVzYy5nZXRJbWFnZURlc2NyaXB0b3IoKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7CisJCXJldHVybiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7CisJfQorCisJcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgeworCQl0cnkgeworCQkJSUxhdW5jaCBsYXVuY2ggPSBzZXJ2ZXIuZ2V0TGF1bmNoKCk7CisJCQlzZWxlY3RQcm9jZXNzKGxhdW5jaC5nZXRQcm9jZXNzZXMoKVswXSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzaG93aW5nIGluIGRlYnVnIiwgZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RQcm9jZXNzKElQcm9jZXNzIHByb2Nlc3MpIHsKKwkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIDsKKwkJaWYgKHdpbmRvdyAhPSBudWxsKSB7CisJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKKwkJCWlmIChwYWdlICE9IG51bGwpIHsKKwkJCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFnZS5maW5kVmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKKwkJCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlwYXJ0ID0gcGFnZS5zaG93VmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKKwkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IG9wZW4gZGVidWcgdmlldyIpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKKwkJCQkJSURlYnVnVmlldyB2aWV3ID0gKElEZWJ1Z1ZpZXcpcGFydC5nZXRBZGFwdGVyKElEZWJ1Z1ZpZXcuY2xhc3MpOworCQkJCQlpZiAodmlldyAhPSBudWxsKSB7CisJCQkJCQl2aWV3LnNldEZvY3VzKCk7CisJCQkJCQlWaWV3ZXIgdmlld2VyID0gdmlldy5nZXRWaWV3ZXIoKTsKKwkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocHJvY2VzcykpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TaG93SW5NZW51QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luTWVudUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjY2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luTWVudUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqICJTaG93SW5NZW51QWN0aW9uIiBtZW51IGFjdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFNob3dJbk1lbnVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCS8qKgorCSAqIFNob3dJbk1lbnVBY3Rpb24gY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIHNwIGEgc2VsZWN0aW9uIHByb3ZpZGVyCisJICovCisJcHVibGljIFNob3dJbk1lbnVBY3Rpb24oZmluYWwgSVNlbGVjdGlvblByb3ZpZGVyIHNwKSB7CisJCXN1cGVyKE1lc3NhZ2VzLmFjdGlvblNob3dJbik7CisJCQorCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLnNob3dJblF1aWNrTWVudSIpOworCQlzZXRNZW51Q3JlYXRvcihuZXcgSU1lbnVDcmVhdG9yKCkgeworCQkJcHJpdmF0ZSBNZW51TWFuYWdlciBtZW51TWFuYWdlcjsKKwkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkJaWYgKG1lbnVNYW5hZ2VyICE9IG51bGwpCisJCQkJCW1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKKwkJCX0KKworCQkJcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRpbmcgbWVudTEiKTsKKwkJCQlyZXR1cm4gZ2V0TWVudU1hbmFnZXIoKS5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCQkJfQorCisJCQlwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGluZyBtZW51MiIpOworCQkJCS8vcmV0dXJuIGdldE1lbnVNYW5hZ2VyKCkuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50LmdldFNoZWxsKCkpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJCisJCQlwcml2YXRlIE1lbnVNYW5hZ2VyIGdldE1lbnVNYW5hZ2VyKCkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRpbmcgbWVudSIpOworCQkJCWlmIChtZW51TWFuYWdlciAhPSBudWxsKQorCQkJCQlyZXR1cm4gbWVudU1hbmFnZXI7CisJCQkJCisJCQkJbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuYWN0aW9uU2hvd0luKTsKKwkJCQltZW51TWFuYWdlci5hZGQobmV3IFNob3dJbkNvbnNvbGVBY3Rpb24oc3ApKTsKKwkJCQltZW51TWFuYWdlci5hZGQobmV3IFNob3dJbkRlYnVnQWN0aW9uKHNwKSk7CisJCQkJcmV0dXJuIG1lbnVNYW5hZ2VyOworCQkJfQorCQl9KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0YXJ0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RhcnRBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmI3ZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0YXJ0QWN0aW9uLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlVJRGVjb3JhdG9yTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKy8qKgorICogU3RhcnQgYSBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFydEFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKKwkKKwlwdWJsaWMgU3RhcnRBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKKwkJc3VwZXIoc2hlbGwsIHNlbGVjdGlvblByb3ZpZGVyLCAic3RhcnQiKTsKKwkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKKwkJaWYgKGxhdW5jaE1vZGUgPT0gSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpIHsKKwkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblN0YXJ0VG9vbFRpcCk7CisJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0YXJ0KTsKKwkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUQVJUKSk7CisJCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUQVJUKSk7CisJCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUQVJUKSk7CisJCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucnVuIik7CisJCX0gZWxzZSBpZiAobGF1bmNoTW9kZSA9PSBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKSB7CisJCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Z1Rvb2xUaXApOworCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Zyk7CisJCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVEFSVF9ERUJVRykpOworCQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVF9ERUJVRykpOworCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVF9ERUJVRykpOworCQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmRlYnVnIik7CisJCX0gZWxzZSBpZiAobGF1bmNoTW9kZSA9PSBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUpIHsKKwkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGVUb29sVGlwKTsKKwkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uUHJvZmlsZSk7CisJCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVEFSVF9QUk9GSUxFKSk7CisJCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUQVJUX1BST0ZJTEUpKTsKKwkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RBUlRfUFJPRklMRSkpOworCQl9CisJCXRyeSB7CisJCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIG5hbWUgb2YgdGhlIEFjdGlvbiBsYWJlbCwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0dXMgb2YgdGhlIHNlcnZlci4KKwkgKiBAcGFyYW0gc2VsIHRoZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmcm9tIHRoZSB2aWV3CisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVRleHQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKXsKKwkJaWYgKHRoaXMubGF1bmNoTW9kZSA9PSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSkgeworCQkJaWYgKHNlbC5pc0VtcHR5KCkpIHsKKwkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0YXJ0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKwkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOworCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8CisJCQkJCQkgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykgeworCQkJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25SZXN0YXJ0KTsKKwkJCQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblJlc3RhcnRUb29sVGlwKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RhcnQpOworCQkJCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU3RhcnRUb29sVGlwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0JCisJCX0gZWxzZSBpZiAodGhpcy5sYXVuY2hNb2RlID09IElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpIHsKKwkJCWlmIChzZWwuaXNFbXB0eSgpKSB7CisJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Zyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWwuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKSB7CisJCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKKwkJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCB8fAorCQkJCQkJIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpIHsKKwkJCQkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uRGVidWdSZXN0YXJ0KTsKKwkJCQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnUmVzdGFydFRvb2xUaXApOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Zyk7CisJCQkJCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Z1Rvb2xUaXApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKHRoaXMubGF1bmNoTW9kZSA9PSBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUpIHsKKwkJCWlmIChzZWwuaXNFbXB0eSgpKSB7CisJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKwkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOworCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8CisJCQkJCQkgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykgeworCQkJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlUmVzdGFydCk7CisJCQkJCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlUmVzdGFydFRvb2xUaXApOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlKTsKKwkJCQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGVUb29sVGlwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQkJCisJfQorCQorCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBjdXJyZW50bHkgYmUgYWN0ZWQgb24uCisJICogQHJldHVybiBib29sZWFuCisJICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgorCSAqLworCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgeworCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7IC8vIHN0YXJ0CisJCQlyZXR1cm4gc2VydmVyLmNhblN0YXJ0KGxhdW5jaE1vZGUpLmlzT0soKTsKKwkJfQorCQkvLyByZXN0YXJ0CisJCVN0cmluZyBtb2RlMiA9IGxhdW5jaE1vZGU7CisJCWlmIChtb2RlMiA9PSBudWxsKQorCQkJbW9kZTIgPSBzZXJ2ZXIuZ2V0TW9kZSgpOworCQlyZXR1cm4gc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIFVJRGVjb3JhdG9yTWFuYWdlci5nZXRVSURlY29yYXRvcihzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpKS5jYW5SZXN0YXJ0KCkgJiYgc2VydmVyLmNhblJlc3RhcnQobW9kZTIpLmlzT0soKTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtIGFjdGlvbiBvbiB0aGlzIHNlcnZlci4KKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICovCisJcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgeworCQlzdGFydChzZXJ2ZXIsIGxhdW5jaE1vZGUsIHNoZWxsKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnQoSVNlcnZlciBzZXJ2ZXIsIFN0cmluZyBsYXVuY2hNb2RlLCBmaW5hbCBTaGVsbCBzaGVsbCkgeworCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7CisJCQlpZiAoIVNlcnZlclVJUGx1Z2luLnNhdmVFZGl0b3JzKCkpCisJCQkJcmV0dXJuOworCQkJCisJCQkvKmZpbmFsIElBZGFwdGFibGUgaW5mbyA9IG5ldyBJQWRhcHRhYmxlKCkgeworCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7CisJCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCisJCQkJCQlyZXR1cm4gc2hlbGw7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX07Ki8KKwkJCXNlcnZlci5zdGFydChsYXVuY2hNb2RlLCAoSU9wZXJhdGlvbkxpc3RlbmVyKW51bGwpOworCQl9IGVsc2UgeworCQkJaWYgKHNoZWxsICE9IG51bGwgJiYgIVNlcnZlclVJUGx1Z2luLnByb21wdElmRGlydHkoc2hlbGwsIHNlcnZlcikpCisJCQkJcmV0dXJuOworCQkJCisJCQl0cnkgeworCQkJCVN0cmluZyBsYXVuY2hNb2RlMiA9IGxhdW5jaE1vZGU7CisJCQkJaWYgKGxhdW5jaE1vZGUyID09IG51bGwpCisJCQkJCWxhdW5jaE1vZGUyID0gc2VydmVyLmdldE1vZGUoKTsKKwkJCQlzZXJ2ZXIucmVzdGFydChsYXVuY2hNb2RlMiwgKElPcGVyYXRpb25MaXN0ZW5lcikgbnVsbCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc3RhcnRpbmcgc2VydmVyIiwgZSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCkgeworCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNlbCk7CisJCXVwZGF0ZVRleHQoc2VsKTsJCQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RhcnRNb2R1bGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdGFydE1vZHVsZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGMyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RhcnRNb2R1bGVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworLyoqCisgKiBSZXN0YXJ0IGEgbW9kdWxlIG9uIGEgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgU3RhcnRNb2R1bGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKKwlwcm90ZWN0ZWQgSU1vZHVsZVtdIG1vZHVsZTsKKworCXB1YmxpYyBTdGFydE1vZHVsZUFjdGlvbihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSkgeworCQlzdXBlcigpOworCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7CisJCQorCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0YXJ0TW9kdWxlKTsKKwkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RBUlQpKTsKKwkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVCkpOworCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUQVJUKSk7CisJCXNldEVuYWJsZWQoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVECisJCQkJJiYgKHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRAorCQkJCQl8fCBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCisJCQkJJiYgc2VydmVyLmNhbkNvbnRyb2xNb2R1bGUobW9kdWxlLCBudWxsKS5pc09LKCkpOworCX0KKworCS8qKgorCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOworCQlKb2Igc3RhcnRKb2IgPSBuZXcgSm9iKE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzMsIG1vZHVsZVtzaXplLTFdLmdldE5hbWUoKSkpIHsKKwkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQlzZXJ2ZXIuc3RhcnRNb2R1bGUobW9kdWxlLCBudWxsKTsKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0KKwkJfTsKKwkJc3RhcnRKb2Iuc2NoZWR1bGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RvcEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0b3BBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWY0OTVmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0b3BBY3Rpb24uamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworLyoqCisgKiBTdG9wICh0ZXJtaW5hdGUpIGEgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgU3RvcEFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKKwlwdWJsaWMgU3RvcEFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7CisJCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgTWVzc2FnZXMuYWN0aW9uU3RvcCk7CisJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3BUb29sVGlwKTsKKwkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RPUCkpOworCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUT1ApKTsKKwkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVE9QKSk7CisJCXNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zdG9wIik7CisJCXRyeSB7CisJCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNlcnZlciBjYW4gY3VycmVudGx5IGJlIGFjdGVkIG9uLgorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuY2FuU3RvcCgpLmlzT0soKTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtIGFjdGlvbiBvbiB0aGlzIHNlcnZlci4KKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICovCisJcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgeworCQlzdG9wKHNlcnZlciwgc2hlbGwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wKElTZXJ2ZXIgc2VydmVyLCBTaGVsbCBzaGVsbCkgeworCQlTZXJ2ZXJVSVBsdWdpbi5hZGRUZXJtaW5hdGlvbldhdGNoKHNoZWxsLCBzZXJ2ZXIsIFNlcnZlclVJUGx1Z2luLlNUT1ApOyAvLyBUT0RPIC0gc2hvdWxkIHJlZG8KKwkJCisJCUlKb2JNYW5hZ2VyIGpvYk1hbmFnZXIgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpOworCQlKb2JbXSBqb2JzID0gam9iTWFuYWdlci5maW5kKFNlcnZlclV0aWwuU0VSVkVSX0pPQl9GQU1JTFkpOworCQlmb3IgKEpvYiBqOiBqb2JzKSB7CisJCQlpZiAoaiBpbnN0YW5jZW9mIFNlcnZlci5TdGFydEpvYikgeworCQkJCVNlcnZlci5TdGFydEpvYiBzdGFydEpvYiA9IChTZXJ2ZXIuU3RhcnRKb2IpIGo7CisJCQkJaWYgKHN0YXJ0Sm9iLmdldFNlcnZlcigpLmVxdWFscyhzZXJ2ZXIpKSB7CisJCQkJCXN0YXJ0Sm9iLmNhbmNlbCgpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlzZXJ2ZXIuc3RvcChmYWxzZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdG9wTW9kdWxlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RvcE1vZHVsZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzBhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RvcE1vZHVsZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqIFJlc3RhcnQgYSBtb2R1bGUgb24gYSBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9wTW9kdWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7CisJcHJvdGVjdGVkIElNb2R1bGVbXSBtb2R1bGU7CisKKwlwdWJsaWMgU3RvcE1vZHVsZUFjdGlvbihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSkgeworCQlzdXBlcigpOworCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7CisJCQorCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3BNb2R1bGUpOworCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVE9QKSk7CisJCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RPUCkpOworCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUT1ApKTsKKwkJc2V0RW5hYmxlZChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQKKwkJCQkmJiAoc2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZSkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVECisJCQkJCXx8IHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKKwkJCQkmJiBzZXJ2ZXIuY2FuQ29udHJvbE1vZHVsZShtb2R1bGUsIG51bGwpLmlzT0soKSk7CisJfQorCisJLyoqCisJICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7CisJCUpvYiBzdG9wSm9iID0gbmV3IEpvYihOTFMuYmluZChNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmczLCBtb2R1bGVbc2l6ZS0xXS5nZXROYW1lKCkpKSB7CisJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJc2VydmVyLnN0b3BNb2R1bGUobW9kdWxlLCBudWxsKTsKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0KKwkJfTsKKwkJc3RvcEpvYi5zY2hlZHVsZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUYWJsZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRhYmxlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwMzYyYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUYWJsZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworLyoqCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFibGVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKKwlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7CisKKwlwdWJsaWMgQWJzdHJhY3RUYWJsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCQorCQljcmVhdGVXaWRnZXRzKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlV2lkZ2V0cygpIHsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQlzZXRMYXlvdXQobGF5b3V0KTsKKwkJCisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCWNyZWF0ZVRhYmxlKCk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7CisJCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7CisJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKwkJY3JlYXRlVGFibGVWaWV3ZXIoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZSgpIHsKKwkJdGFibGUgPSBuZXcgVGFibGUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlVmlld2VyKCkgeworCQl0YWJsZVZpZXdlciA9IG5ldyBMb2NrZWRUYWJsZVZpZXdlcih0YWJsZSk7CisJfQorCisJcHJvdGVjdGVkIFRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgeworCQlyZXR1cm4gdGFibGVWaWV3ZXI7CisJfQorCisJcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwyKSB7CisJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKKwkJcmV0dXJuIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWZyZXNoKCkgeworCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3Qgb2JqKSB7CisJCXRhYmxlVmlld2VyLnJlZnJlc2gob2JqKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IG9iaikgeworCQl0YWJsZVZpZXdlci5yZW1vdmUob2JqKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0ZmFmYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRUcmVlOworLyoqCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7CisJcHJvdGVjdGVkIEZpbHRlcmVkVHJlZSB0cmVlOworCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7CisJcHJvdGVjdGVkIExhYmVsIGRlc2NyaXB0aW9uOworCisJcHVibGljIEFic3RyYWN0VHJlZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOworCQkKKwkJY3JlYXRlV2lkZ2V0cygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdpZGdldHMoKSB7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMzsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDM7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCXNldExheW91dChsYXlvdXQpOworCQkKKwkJU3RyaW5nIGRlc2NyaXB0aW9uVGV4dCA9IGdldERlc2NyaXB0aW9uTGFiZWwoKTsKKwkJaWYgKGRlc2NyaXB0aW9uVGV4dCAhPSBudWxsKSB7CisJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7CisJCQlsYWJlbC5zZXRUZXh0KGRlc2NyaXB0aW9uVGV4dCk7CisJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7CisJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCX0KKwkJCisJCVN0cmluZyBkZXRhaWxzID0gZ2V0RGV0YWlsc0xhYmVsKCk7CisJCWlmIChkZXRhaWxzICE9IG51bGwpIHsKKwkJCUxpbmsgcHJlZkxpbmsgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7CisJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKKwkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkJcHJlZkxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCXByZWZMaW5rLnNldFRleHQoIjxhPiIgKyBkZXRhaWxzICsgIjwvYT4iKTsKKwkJCXByZWZMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJZGV0YWlsc1NlbGVjdGVkKCk7CisJCQkJfQorCQkJfSk7CisJCX0KKwkJCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5XUkFQKTsKKwkJbGFiZWwuc2V0VGV4dChnZXRUaXRsZUxhYmVsKCkpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7CisJCWlmIChkZXNjcmlwdGlvblRleHQgIT0gbnVsbCAmJiBkZXRhaWxzID09IG51bGwpCisJCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gNzsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQljcmVhdGVUcmVlKCk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCXRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCXRyZWVWaWV3ZXIgPSB0cmVlLmdldFZpZXdlcigpOworCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOworCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgeworCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOworCQkJCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCQlpZiAodHJlZVZpZXdlci5pc0V4cGFuZGFibGUoZWxlbWVudCkpCisJCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShlbGVtZW50LCAhdHJlZVZpZXdlci5nZXRFeHBhbmRlZFN0YXRlKGVsZW1lbnQpKTsKKwkJICAgIH0KKwkJfSk7CisJCQorCQlpZiAoaGFzRGVzY3JpcHRpb24oKSkgeworCQkJZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOworCQkJZGVzY3JpcHRpb24uc2V0VGV4dCgiTXVsdGlcbkxpbmVcbk1lc3NhZ2UiKTsKKwkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7CisJCQlQb2ludCBwID0gZGVzY3JpcHRpb24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKKwkJCWRlc2NyaXB0aW9uLnNldFRleHQoIiIpOworCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOworCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlpZiAocC55ID4gMTApCisJCQkJZGF0YS5oZWlnaHRIaW50ID0gcC55OworCQkJZWxzZQorCQkJCWRhdGEuaGVpZ2h0SGludCA9IDQyOworCQkJZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJfQorCQkKKwkJdHJlZS5mb3JjZUZvY3VzKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZSgpIHsKKwkJdHJlZSA9IG5ldyBGaWx0ZXJlZFRyZWUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUsIG5ldyBTZXJ2ZXJQYXR0ZXJuRmlsdGVyKCkpOworCX0KKworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25MYWJlbCgpOworCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUaXRsZUxhYmVsKCk7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKKwkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgdGV4dCAhPSBudWxsKQorCQkJZGVzY3JpcHRpb24uc2V0VGV4dCh0ZXh0KTsKKwl9CisKKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgeworCQlyZXR1cm4gdHJlZVZpZXdlcjsKKwl9CisKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwyOworCQlyZXR1cm4gc2VsLmdldEZpcnN0RWxlbWVudCgpOworCX0KKworCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOworCX0KKworCXB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IG9iaikgeworCQl0cmVlVmlld2VyLnJlZnJlc2gob2JqKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IG9iaikgeworCQl0cmVlVmlld2VyLnJlbW92ZShvYmopOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGV0YWlsc0xhYmVsKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkZXRhaWxzU2VsZWN0ZWQoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1ZTA5NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CisvKioKKyAqIFJ1bnRpbWUgdHlwZSBjb250ZW50IHByb3ZpZGVyLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAicm9vdCI7CisKKwlwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb247CisKKwlwdWJsaWMgY2xhc3MgVHJlZUVsZW1lbnQgeworCQlwdWJsaWMgU3RyaW5nIHRleHQ7CisJCXB1YmxpYyBMaXN0PE9iamVjdD4gY29udGVudHM7CisJfQorCisJcHJvdGVjdGVkIE9iamVjdFtdIGVsZW1lbnRzOworCXByb3RlY3RlZCBNYXA8T2JqZWN0LCBUcmVlRWxlbWVudD4gZWxlbWVudFRvUGFyZW50TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBUcmVlRWxlbWVudD4oMik7CisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFRyZWVFbGVtZW50PiB0ZXh0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUcmVlRWxlbWVudD4oMik7CisKKwkvKioKKwkgKiBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCQkKKwkJZmlsbFRyZWUoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyKGJvb2xlYW4gaW5pdCkgeworCQlzdXBlcigpOworCX0KKworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxUcmVlKCk7CisKKwlwcm90ZWN0ZWQgdm9pZCBjbGVhbigpIHsKKwkJZWxlbWVudHMgPSBudWxsOworCQllbGVtZW50VG9QYXJlbnRNYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFRyZWVFbGVtZW50PigyKTsKKwkJdGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHJlZUVsZW1lbnQ+KDIpOworCQkKKwkJaW5pdGlhbFNlbGVjdGlvbiA9IG51bGw7CisJfQorCisJcHJvdGVjdGVkIFRyZWVFbGVtZW50IGdldE9yQ3JlYXRlKExpc3Q8VHJlZUVsZW1lbnQ+IGxpc3QsIFN0cmluZyB0ZXh0KSB7CisJCXRyeSB7CisJCQlPYmplY3Qgb2JqID0gdGV4dE1hcC5nZXQodGV4dCk7CisJCQlpZiAob2JqICE9IG51bGwpCisJCQkJcmV0dXJuIChUcmVlRWxlbWVudCkgb2JqOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJCisJCVRyZWVFbGVtZW50IGVsZW1lbnQgPSBuZXcgVHJlZUVsZW1lbnQoKTsKKwkJZWxlbWVudC50ZXh0ID0gdGV4dDsKKwkJZWxlbWVudC5jb250ZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQl0ZXh0TWFwLnB1dCh0ZXh0LCBlbGVtZW50KTsKKwkJbGlzdC5hZGQoZWxlbWVudCk7CisJCXJldHVybiBlbGVtZW50OworCX0KKwkKKwlwcm90ZWN0ZWQgVHJlZUVsZW1lbnQgZ2V0T3JDcmVhdGUoTGlzdDxUcmVlRWxlbWVudD4gbGlzdCwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCkgeworCQl0cnkgeworCQkJT2JqZWN0IG9iaiA9IHRleHRNYXAuZ2V0KGlkKTsKKwkJCWlmIChvYmogIT0gbnVsbCkKKwkJCQlyZXR1cm4gKFRyZWVFbGVtZW50KSBvYmo7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5ldyBUcmVlRWxlbWVudCgpOworCQllbGVtZW50LnRleHQgPSB0ZXh0OworCQllbGVtZW50LmNvbnRlbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCXRleHRNYXAucHV0KGlkLCBlbGVtZW50KTsKKwkJbGlzdC5hZGQoZWxlbWVudCk7CisJCXJldHVybiBlbGVtZW50OworCX0KKworCXByb3RlY3RlZCBUcmVlRWxlbWVudCBnZXRCeVRleHQoU3RyaW5nIHRleHQpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0ZXh0TWFwLmdldCh0ZXh0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCXByb3RlY3RlZCBUcmVlRWxlbWVudCBnZXRQYXJlbnRJbXBsKE9iamVjdCBvYmopIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBlbGVtZW50VG9QYXJlbnRNYXAuZ2V0KG9iaik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4gIAorCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSB2aWV3ZXIgd2hlbiBpdCBpcyBkaXNwb3NlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyIAorCSAqIHdoZW4gaXRzIGlucHV0IGlzIHNldCB0byB0aGUgZ2l2ZW4gZWxlbWVudC4gCisJICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLgorCSAqIFRoZSByZXN1bHQgaXMgbm90IG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudCB0aGUgaW5wdXQgZWxlbWVudAorCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlcgorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gZWxlbWVudHM7CisJfQorCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7CisJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmVlRWxlbWVudCkpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCVRyZWVFbGVtZW50IHJ0ZSA9IChUcmVlRWxlbWVudCkgZWxlbWVudDsKKwkJcmV0dXJuIHJ0ZS5jb250ZW50cy50b0FycmF5KCk7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJcmV0dXJuIGdldFBhcmVudEltcGwoZWxlbWVudCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKwkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKKwkJcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMDsKKwl9CisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQKKwkgKiBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBlbGVtZW50LgorCSAqIDxwPgorCSAqIEEgdHlwaWNhbCB1c2UgZm9yIHRoaXMgbWV0aG9kIGlzIHJlZ2lzdGVyaW5nIHRoZSBjb250ZW50IHByb3ZpZGVyIGFzIGEgbGlzdGVuZXIKKwkgKiB0byBjaGFuZ2VzIG9uIHRoZSBuZXcgaW5wdXQgKHVzaW5nIG1vZGVsLXNwZWNpZmljIG1lYW5zKSwgYW5kIGRlcmVnaXN0ZXJpbmcgdGhlIHZpZXdlciAKKwkgKiBmcm9tIHRoZSBvbGQgaW5wdXQuIEluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZSBub3RpZmljYXRpb25zLCB0aGUgY29udGVudCBwcm92aWRlcgorCSAqIHByb3BhZ2F0ZXMgdGhlIGNoYW5nZXMgdG8gdGhlIHZpZXdlci4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKKwkgKiBAcGFyYW0gb2xkSW5wdXQgdGhlIG9sZCBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyCisJICogICBkaWQgbm90IHByZXZpb3VzbHkgaGF2ZSBhbiBpbnB1dAorCSAqIEBwYXJhbSBuZXdJbnB1dCB0aGUgbmV3IGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIKKwkgKiAgIGRvZXMgbm90IGhhdmUgYW4gaW5wdXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCXByaXZhdGUgT2JqZWN0W10gZ2V0QWxsT2JqZWN0cygpIHsKKwkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJT2JqZWN0W10gb2JqID0gZ2V0RWxlbWVudHMobnVsbCk7CisJCWlmIChvYmogIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoIShvYmpbaV0gaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpKQorCQkJCQlsaXN0LmFkZChvYmpbaV0pOworCQkJCWdldEFsbENoaWxkcmVuKGxpc3QsIG9ialtpXSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGxpc3QudG9BcnJheSgpOworCX0KKworCXByaXZhdGUgdm9pZCBnZXRBbGxDaGlsZHJlbihMaXN0PE9iamVjdD4gbGlzdCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJT2JqZWN0W10gb2JqID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7CisJCWlmIChvYmogIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoIShvYmpbaV0gaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpKQorCQkJCQlsaXN0LmFkZChvYmpbaV0pOworCQkJCWdldEFsbENoaWxkcmVuKGxpc3QsIG9ialtpXSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldEluaXRpYWxTZWxlY3Rpb24oKSB7CisJCWlmIChpbml0aWFsU2VsZWN0aW9uID09IG51bGwpIHsKKwkJCUluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBpc3AgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCWluaXRpYWxTZWxlY3Rpb24gPSBpc3AuZ2V0SW5pdGlhbFNlbGVjdGlvbihnZXRBbGxPYmplY3RzKCkpOworCQl9CisJCXJldHVybiBpbml0aWFsU2VsZWN0aW9uOworCX0KKwkKKwlwdWJsaWMgT2JqZWN0IGdldEluaXRpYWxTZWxlY3Rpb24oSVByb2plY3QgcHJvamVjdCl7CisJCWlmIChpbml0aWFsU2VsZWN0aW9uID09IG51bGwpIHsKKwkJCUluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBpc3AgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCWluaXRpYWxTZWxlY3Rpb24gPSBpc3AuZ2V0SW5pdGlhbFNlbGVjdGlvbihnZXRBbGxPYmplY3RzKCkscHJvamVjdCk7CisJCX0KKwkJcmV0dXJuIGluaXRpYWxTZWxlY3Rpb247CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYmY2NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworLyoqCisgKiBBYnN0cmFjdCB0cmVlIGxhYmVsIHByb3ZpZGVyLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyIHsKKwkvKioKKwkgKiBBIHN0YW5kYXJkIHRyZWUgbGFiZWwgcHJvdmlkZXIuCisJICovCisJcHVibGljIEFic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQSBzdGFuZGFyZCB0cmVlIGxhYmVsIHByb3ZpZGVyLgorCSAqIAorCSAqIEBwYXJhbSBkZWNvcmF0b3IgYSBsYWJlbCBkZWNvcmF0b3IsIG9yIG51bGwgaWYgbm8gZGVjb3JhdG9yIGlzIHJlcXVpcmVkCisJICovCisJcHVibGljIEFic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgeworCQlzdXBlcihkZWNvcmF0b3IpOworCX0KKworCS8qKgorCSAqIEBzZWUgQmFzZUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIHsKKwkJCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKKwkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7CisJCX0KKwkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZUltcGwoZWxlbWVudCk7CisJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJSW1hZ2UgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGVsZW1lbnQpOworCQkJaWYgKGRlYyAhPSBudWxsKQorCQkJCXJldHVybiBkZWM7CisJCX0KKwkJcmV0dXJuIGltYWdlOworCX0KKworCS8qKgorCSAqIFJldHVybiBhbiBpbWFnZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCisJICogIAorCSAqIEBwYXJhbSBlbGVtZW50IGFuIGVsZW1lbnQKKwkgKiBAcmV0dXJuIGFuIGltYWdlCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IEltYWdlIGdldEltYWdlSW1wbChPYmplY3QgZWxlbWVudCk7CisKKwkvKioKKwkgKiBAc2VlIEJhc2VMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIHsKKwkJCXJldHVybiAoKFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIGVsZW1lbnQpLnRleHQ7CisJCX0KKwkJU3RyaW5nIHRleHQgPSBnZXRUZXh0SW1wbChlbGVtZW50KTsKKwkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7CisJCQlTdHJpbmcgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlVGV4dCh0ZXh0LCBlbGVtZW50KTsKKwkJCWlmIChkZWMgIT0gbnVsbCAmJiAhZGVjLmVxdWFscygiIikpCisJCQkJcmV0dXJuIGRlYzsKKwkJfQorCQlyZXR1cm4gdGV4dDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCisJICogIAorCSAqIEBwYXJhbSBlbGVtZW50IGFuIGVsZW1lbnQKKwkgKiBAcmV0dXJuIGEgbGFiZWwKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFRleHRJbXBsKE9iamVjdCBlbGVtZW50KTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VDZWxsTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlQ2VsbExhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGVjYzhjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlQ2VsbExhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisvKioKKyAqIEEgYmFzaWMgY2VsbCBsYWJlbCBwcm92aWRlci4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VDZWxsTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgeworCXB1YmxpYyBJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yOworCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIHByb3ZpZGVyTGlzdGVuZXI7CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXIjdXBkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ2VsbCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGUoVmlld2VyQ2VsbCBjZWxsKXsKKwkJc3VwZXIudXBkYXRlKGNlbGwpOworCQlPYmplY3QgZWxlbWVudCA9IGNlbGwuZ2V0RWxlbWVudCgpOworCQlpbnQgaW5kZXggPSBjZWxsLmdldENvbHVtbkluZGV4KCk7CisJCWNlbGwuc2V0VGV4dChnZXRDb2x1bW5UZXh0KGVsZW1lbnQsaW5kZXgpKTsKKwkJSW1hZ2UgaW1hZ2UgPSBnZXRDb2x1bW5JbWFnZShlbGVtZW50LCBpbmRleCk7CisJCWNlbGwuc2V0SW1hZ2UoaW1hZ2UpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIEJhc2VDZWxsTGFiZWxQcm92aWRlcgorCSAqLworCXB1YmxpYyBCYXNlQ2VsbExhYmVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CQkKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBCYXNlQ2VsbExhYmVsUHJvdmlkZXIgd2l0aCBhIGRlY29yYXRvciBhdCB0aGUgZnJvbnQgb2YgdGhlIHJvdworCSAqIEBwYXJhbSBkZWNvcmF0b3IKKwkgKi8KKwlwdWJsaWMgQmFzZUNlbGxMYWJlbFByb3ZpZGVyKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKKwkJc3VwZXIoKTsKKwkJCQorCQlpZiAoZGVjb3JhdG9yID09IG51bGwpeworCQkJZGVjb3JhdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKTsKKwkJCXByb3ZpZGVyTGlzdGVuZXIgPSBuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcigpIHsKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCisJCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCQlmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOworCQkJCX0KKwkJCX07CisJCQlkZWNvcmF0b3IuYWRkTGlzdGVuZXIocHJvdmlkZXJMaXN0ZW5lcik7CisJCX0KKwkKKwkJdGhpcy5kZWNvcmF0b3IgPSBkZWNvcmF0b3I7CisJfSAKKworCXB1YmxpYyBQb2ludCBnZXRUb29sVGlwU2hpZnQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbmV3IFBvaW50KDUsIDUpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0VG9vbFRpcERpc3BsYXlEZWxheVRpbWUoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gMjAwMDsKKwl9CisKKwlwdWJsaWMgaW50IGdldFRvb2xUaXBUaW1lRGlzcGxheWVkKE9iamVjdCBvYmplY3QpIHsJCisJCXJldHVybiA1MDAwOworCX0KKwkKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAoZGVjb3JhdG9yICE9IG51bGwgJiYgcHJvdmlkZXJMaXN0ZW5lciAhPSBudWxsKSB7CisJCQlkZWNvcmF0b3IucmVtb3ZlTGlzdGVuZXIocHJvdmlkZXJMaXN0ZW5lcik7CisJCX0KKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIEV4dGVuZGVycyBvZiB0aGlzIGNsYXNzIHdvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFuIGltYWdlIHRvIHRoZSBjb2x1bW4gYmFzZWQgb24gdGhlIGVsZW1lbnQgCisJICogYmVpbmcgcGFzc2VkCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiBAcmV0dXJuIGFuIGltYWdlCisJICovCisJcHVibGljIGFic3RyYWN0IEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpOworCisJLyoqCisgICAgKiBFeHRlbmRlcnMgb2YgdGhpcyBjbGFzcyB3b3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhIHRleHQgbGFiZWwgdG8gdGhlIGNvbHVtbiBiYXNlZCBvbiB0aGUgZWxlbWVudAorICAgICogYmVpbmcgcGFzc2VkIAorCSAqIEBwYXJhbSBlbGVtZW50CisJICogQHBhcmFtIGluZGV4CisJICogQHJldHVybiBhIHN0cmluZworCSAqLworCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTUyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgeworCXB1YmxpYyBCYXNlQ29udGVudFByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJLy8gZG8gbm90aGluZworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjZjYxNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUxhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOworLyoqCisgKiBBIGJhc2ljIGxhYmVsIHByb3ZpZGVyLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7CisJcHJvdGVjdGVkIElMYWJlbERlY29yYXRvciBkZWNvcmF0b3I7CisJcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxJTGFiZWxQcm92aWRlckxpc3RlbmVyPiBsaXN0ZW5lcnM7CisJcHJpdmF0ZSBJTGFiZWxQcm92aWRlckxpc3RlbmVyIHByb3ZpZGVyTGlzdGVuZXI7CisKKwkvKioKKwkgKiBBIGJhc2ljIElMYWJlbFByb3ZpZGVyIHdpdGggbm8gZGVjb3JhdG9yLgorCSAqLworCXB1YmxpYyBCYXNlTGFiZWxQcm92aWRlcigpIHsKKwkJdGhpcyhudWxsKTsKKwl9CisKKwkvKioKKwkgKiBBIGJhc2ljIElMYWJlbFByb3ZpZGVyIHdpdGggc3VwcG9ydCBmb3IgYSBkZWNvcmF0b3IuCisJICogCisJICogQHBhcmFtIGRlY29yYXRvciBhIGxhYmVsIGRlY29yYXRvciwgb3IgbnVsbCBpZiBubyBkZWNvcmF0b3IgaXMgcmVxdWlyZWQKKwkgKi8KKwlwdWJsaWMgQmFzZUxhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgeworCQlzdXBlcigpOworCQlpZiAoZGVjb3JhdG9yID09IG51bGwpCisJCQlkZWNvcmF0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpOworCQkKKwkJdGhpcy5kZWNvcmF0b3IgPSBkZWNvcmF0b3I7CisJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJcHJvdmlkZXJMaXN0ZW5lciA9IG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJZmlyZUxpc3RlbmVyKGV2ZW50KTsKKwkJCQl9CisJCQl9OworCQkJZGVjb3JhdG9yLmFkZExpc3RlbmVyKHByb3ZpZGVyTGlzdGVuZXIpOworCQl9CisJfQorCisJLyoqCisJICogVXNlIHRoaXMgbWV0aG9kIHRvIGF2b2lkIGhhdmluZyBhIGxhYmVsIGRlY29yYXRvci4gVGhpcyBtZXRob2QgaXMgTk9UIEFQSS4KKwkgKiAKKwkgKiBAcGFyYW0gbm9EZWNvcmF0b3IKKwkgKi8KKwlwdWJsaWMgQmFzZUxhYmVsUHJvdmlkZXIoYm9vbGVhbiBub0RlY29yYXRvcikgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJaWYgKGxpc3RlbmVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBjYW5ub3QgYmUgbnVsbCIpOworCQkKKwkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQorCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJTGFiZWxQcm92aWRlckxpc3RlbmVyPigpOworCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWlmIChsaXN0ZW5lciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKKwkJCisJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkKKwkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGZpcmVMaXN0ZW5lcihMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCB8fCBsaXN0ZW5lcnMuaXNFbXB0eSgpKQorCQkJcmV0dXJuOworCQkKKwkJaW50IHNpemUgPSBsaXN0ZW5lcnMuc2l6ZSgpOworCQlJTGFiZWxQcm92aWRlckxpc3RlbmVyW10gc3JsID0gbmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXJbc2l6ZV07CisJCWxpc3RlbmVycy50b0FycmF5KHNybCk7CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlzcmxbaV0ubGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiICBFcnJvciBmaXJpbmcgbGFiZWwgY2hhbmdlIGV2ZW50IHRvICIgKyBzcmxbaV0sIGUpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpCisJCQlkZWNvcmF0b3IucmVtb3ZlTGlzdGVuZXIocHJvdmlkZXJMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJcmV0dXJuICIiOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgbm90TnVsbChTdHJpbmcgcykgeworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuICIiOworCQlyZXR1cm4gczsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0RlZmF1bHRWaWV3ZXJTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvRGVmYXVsdFZpZXdlclNvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjYxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0RlZmF1bHRWaWV3ZXJTb3J0ZXIuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOworLyoqCisgKiBDbGFzcyB1c2VkIHRvIHNvcnQgY2F0ZWdvcmllcywgcnVudGltZSB0eXBlcywgYW5kIHNlcnZlciB0eXBlcyBpbiB0aGUKKyAqIE5ldyB3aXphcmRzLgorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdFZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBWZXJzaW9uIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JTID0gIi4sIjsKKworCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHNlZ21lbnRzOworCisJCXByaXZhdGUgVmVyc2lvbihTdHJpbmdbXSBzZWdtZW50cykgeworCQkJdGhpcy5zZWdtZW50cyA9IHNlZ21lbnRzOworCQl9CisKKwkJcHVibGljIHN0YXRpYyBWZXJzaW9uIHBhcnNlVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyc2lvbiwgU0VQQVJBVE9SUywgZmFsc2UpOworCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKKwkJCQlsaXN0LmFkZChzdC5uZXh0VG9rZW4oKSk7CisJCQkKKwkJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKKwkJCWxpc3QudG9BcnJheShzKTsKKwkJCXJldHVybiBuZXcgVmVyc2lvbihzKTsKKwkJfQorCisJCXByaXZhdGUgaW50IGNvbXBhcmVUbyhTdHJpbmcgczEsIFN0cmluZyBzMikgeworCQkJdHJ5IHsKKwkJCQlpbnQgaTEgPSBJbnRlZ2VyLnBhcnNlSW50KHMxKTsKKwkJCQlpbnQgaTIgPSBJbnRlZ2VyLnBhcnNlSW50KHMyKTsKKwkJCQlpZiAoaTEgPT0gaTIpCisJCQkJCXJldHVybiAwOworCQkJCWlmIChpMSA+IGkyKQorCQkJCQlyZXR1cm4gMTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7CisJCX0KKworCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqZWN0KSB7CisJCQlpZiAob2JqZWN0ID09IHRoaXMpCisJCQkJcmV0dXJuIDA7CisJCQkKKwkJCVZlcnNpb24gb3RoZXIgPSAoVmVyc2lvbikgb2JqZWN0OworCQkJaW50IGkgPSAwOworCQkJd2hpbGUgKGkgPCBzZWdtZW50cy5sZW5ndGggJiYgaSA8IG90aGVyLnNlZ21lbnRzLmxlbmd0aCkgeworCQkJCVN0cmluZyBzMSA9IHNlZ21lbnRzW2ldOworCQkJCVN0cmluZyBzMiA9IG90aGVyLnNlZ21lbnRzW2ldOworCQkJCWludCBjID0gY29tcGFyZVRvKHMxLCBzMik7CisJCQkJaWYgKGMgIT0gMCkKKwkJCQkJcmV0dXJuIGM7CisJCQkJaSsrOworCQkJfQorCQkJCisJCQlpZiAoaSA9PSBzZWdtZW50cy5sZW5ndGggJiYgaSA9PSBvdGhlci5zZWdtZW50cy5sZW5ndGgpCisJCQkJcmV0dXJuIDA7CisJCQkKKwkJCWlmIChpID09IHNlZ21lbnRzLmxlbmd0aCkKKwkJCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgVmlld2VyU29ydGVyI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisJCWlmIChvMSBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkKKwkJCW8xID0gKChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIG8xKS50ZXh0OworCQkKKwkJaWYgKG8yIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KQorCQkJbzIgPSAoKEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgbzIpLnRleHQ7CisJCQorCQkvLyBmaWx0ZXIgb3V0IHN0cmluZ3MKKwkJaWYgKG8xIGluc3RhbmNlb2YgU3RyaW5nICYmIG8yIGluc3RhbmNlb2YgU3RyaW5nKQorCQkJcmV0dXJuIGNvbXBhcmVDYXRlZ29yaWVzKChTdHJpbmcpIG8xLCAoU3RyaW5nKSBvMik7CisJCWlmIChvMSBpbnN0YW5jZW9mIFN0cmluZykKKwkJCXJldHVybiAtMTsKKwkJaWYgKG8yIGluc3RhbmNlb2YgU3RyaW5nKQorCQkJcmV0dXJuIDE7CisJCQorCQlpZiAobzEgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUgJiYgbzIgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpCisJCQlyZXR1cm4gY29tcGFyZVJ1bnRpbWVUeXBlcygoSVJ1bnRpbWVUeXBlKSBvMSwgKElSdW50aW1lVHlwZSkgbzIpOworCQkKKwkJaWYgKG8xIGluc3RhbmNlb2YgSVNlcnZlclR5cGUgJiYgbzIgaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkKKwkJCXJldHVybiBjb21wYXJlU2VydmVyVHlwZXMoKElTZXJ2ZXJUeXBlKSBvMSwgKElTZXJ2ZXJUeXBlKSBvMik7CisJCQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKioKKwkgKiBTb3J0IHR3byBjYXRlZ29yeSBuYW1lcy4KKwkgKiAKKwkgKiBAcGFyYW0gczEgdGhlIGZpcnN0IGNhdGVnb3J5CisJICogQHBhcmFtIHMyIHRoZSBzZWNvbmQgY2F0ZWdvcnkKKwkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGxlc3MgIHRoYW4gdGhlIAorCSAqICAgIHNlY29uZCBlbGVtZW50OyB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMKKwkgKiAgICBlcXVhbCB0byB0aGUgc2Vjb25kIGVsZW1lbnQ7IGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QKKwkgKiAgICBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIGVsZW1lbnQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGludCBjb21wYXJlQ2F0ZWdvcmllcyhTdHJpbmcgczEsIFN0cmluZyBzMikgeworCQl0cnkgeworCQkJVmVyc2lvbiB2MSA9IFZlcnNpb24ucGFyc2VWZXJzaW9uKHMxKTsKKwkJCVZlcnNpb24gdjIgPSBWZXJzaW9uLnBhcnNlVmVyc2lvbihzMik7CisJCQkKKwkJCXJldHVybiB2MS5jb21wYXJlVG8odjIpOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisJCQkvLyBpZ25vcmUKKwkJfQorCQkKKwkJcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7CisJfQorCisJLyoqCisJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHdvIGl0ZW1zIGFyZSBpbiB0aGUgc2FtZSAnZmFtaWx5JywgYW5kCisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKiAKKwkgKiBAcGFyYW0gczEgLSBmaXJzdCBuYW1lCisJICogQHBhcmFtIHYxIC0gZmlyc3QgdmVyc2lvbgorCSAqIEBwYXJhbSBzMiAtIHNlY29uZCBuYW1lCisJICogQHBhcmFtIHYyIC0gc2Vjb25kIHZlcnNpb24KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gaXRlbXMgYXJlIGluIHRoZSBzYW1lICdmYW1pbHknLCBhbmQKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzU2FtZUZhbWlseShTdHJpbmcgczEsIFN0cmluZyB2MSwgU3RyaW5nIHMyLCBTdHJpbmcgdjIpIHsKKwkJaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmICh2MSAhPSBudWxsKSB7CisJCQlpbnQgaW5kID0gczEuaW5kZXhPZih2MSk7CisJCQlpZiAoaW5kID49IDApCisJCQkJczEgPSBzMS5zdWJzdHJpbmcoMCwgaW5kKSArIHMxLnN1YnN0cmluZyhpbmQrdjEubGVuZ3RoKCkpOworCQl9CisJCQorCQlpZiAodjIgIT0gbnVsbCkgeworCQkJaW50IGluZCA9IHMyLmluZGV4T2YodjIpOworCQkJaWYgKGluZCA+PSAwKQorCQkJCXMyID0gczIuc3Vic3RyaW5nKDAsIGluZCkgKyBzMi5zdWJzdHJpbmcoaW5kK3YyLmxlbmd0aCgpKTsKKwkJfQorCQlyZXR1cm4gKHMxLmVxdWFscyhzMikpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgaW50IGNvbXBhcmVWZXJzaW9ucyhTdHJpbmcgczEsIFN0cmluZyBzMikgeworCQlWZXJzaW9uIHYxID0gVmVyc2lvbi5wYXJzZVZlcnNpb24oczEpOworCQlWZXJzaW9uIHYyID0gVmVyc2lvbi5wYXJzZVZlcnNpb24oczIpOworCQkKKwkJcmV0dXJuIHYxLmNvbXBhcmVUbyh2Mik7CisJfQorCisJLyoqCisJICogU29ydCB0d28gcnVudGltZSB0eXBlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcjEgdGhlIGZpcnN0IHJ1bnRpbWUgdHlwZQorCSAqIEBwYXJhbSByMiB0aGUgc2Vjb25kIHJ1bnRpbWUgdHlwZQorCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgbGVzcyAgdGhhbiB0aGUgCisJICogICAgc2Vjb25kIGVsZW1lbnQ7IHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcworCSAqICAgIGVxdWFsIHRvIHRoZSBzZWNvbmQgZWxlbWVudDsgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdAorCSAqICAgIGVsZW1lbnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgaW50IGNvbXBhcmVSdW50aW1lVHlwZXMoSVJ1bnRpbWVUeXBlIHIxLCBJUnVudGltZVR5cGUgcjIpIHsKKwkJaWYgKGlzU2FtZUZhbWlseShyMS5nZXROYW1lKCksIHIxLmdldFZlcnNpb24oKSwgcjIuZ2V0TmFtZSgpLCByMi5nZXRWZXJzaW9uKCkpKQorCQkJcmV0dXJuIGNvbXBhcmVWZXJzaW9ucyhyMS5nZXRWZXJzaW9uKCksIHIyLmdldFZlcnNpb24oKSk7CisJCQorCQlyZXR1cm4gcjEuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocjIuZ2V0TmFtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBTb3J0IHR3byBzZXJ2ZXIgdHlwZXMuCisJICogCisJICogQHBhcmFtIHMxIHRoZSBmaXJzdCBzZXJ2ZXIgdHlwZQorCSAqIEBwYXJhbSBzMiB0aGUgc2Vjb25kIHNlcnZlciB0eXBlCisJICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzICB0aGFuIHRoZSAKKwkgKiAgICBzZWNvbmQgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzCisJICogICAgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0CisJICogICAgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBpbnQgY29tcGFyZVNlcnZlclR5cGVzKElTZXJ2ZXJUeXBlIHMxLCBJU2VydmVyVHlwZSBzMikgeworCQlJUnVudGltZVR5cGUgcjEgPSBzMS5nZXRSdW50aW1lVHlwZSgpOworCQlJUnVudGltZVR5cGUgcjIgPSBzMi5nZXRSdW50aW1lVHlwZSgpOworCQlpZiAocjEgIT0gbnVsbCAmJiByMiAhPSBudWxsKSB7CisJCQlpZiAoaXNTYW1lRmFtaWx5KHMxLmdldE5hbWUoKSwgcjEuZ2V0VmVyc2lvbigpLCBzMi5nZXROYW1lKCksIHIyLmdldFZlcnNpb24oKSkpCisJCQkJcmV0dXJuIGNvbXBhcmVWZXJzaW9ucyhyMS5nZXRWZXJzaW9uKCksIHIyLmdldFZlcnNpb24oKSk7CisJCX0KKwkJCisJCXJldHVybiBzMS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShzMi5nZXROYW1lKCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2lvbkNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9FeHRlbnNpb25Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE2MjJjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9FeHRlbnNpb25Db21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQ5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmV4dGVuc2lvbi5FeHRlbnNpb25VdGlsaXR5OworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIEV4dGVuc2lvbkNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7CisJcHVibGljIGludGVyZmFjZSBGZWF0dXJlU2VsZWN0aW9uTGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCBmZWF0dXJlU2VsZWN0ZWQoSUZlYXR1cmUgZmVhdHVyZSk7CisJfQorCisJcHJvdGVjdGVkIFRhYmxlIHRhYmxlOworCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKKworCXByb3RlY3RlZCBGb250IGZvbnQ7CisKKwlwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIEltYWdlPiBpbWFnZXM7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHByb2dyZXNzOworCXByb3RlY3RlZCBpbnQgdG90YWxXb3JrOworCXByb3RlY3RlZCBkb3VibGUgY3VycmVudFdvcms7CisJcHJvdGVjdGVkIGludCBjb3VudDsKKworCXB1YmxpYyBGZWF0dXJlU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7CisKKwlwdWJsaWMgRXh0ZW5zaW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgRmVhdHVyZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisJCQorCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gNTsKKwkJLy9sYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCXNldExheW91dChsYXlvdXQpOworCQkKKwkJRm9udCBjdXJyZW50Rm9udCA9IGdldEZvbnQoKTsKKwkJRm9udERhdGFbXSBmZCA9IGN1cnJlbnRGb250LmdldEZvbnREYXRhKCk7CisJCWludCBzaXplMiA9IGZkLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7CisJCQlmZFtpXS5zZXRIZWlnaHQoZmRbaV0uZ2V0SGVpZ2h0KCkgKyAyKTsKKwkJCWZkW2ldLnNldFN0eWxlKFNXVC5CT0xEKTsKKwkJfQorCQkKKwkJZm9udCA9IG5ldyBGb250KGdldERpc3BsYXkoKSwgZmQpOworCQkKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOworCQlkYXRhLmhlaWdodEhpbnQgPSAzNTA7CisJCXNldExheW91dERhdGEoZGF0YSk7CisJCQorCQl0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKKwkJLy9kYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJLy9kYXRhLmhlaWdodEhpbnQgPSAyNTA7CisJCWRhdGEud2lkdGhIaW50ID0gMzUwOworCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkvL3RhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKwkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7CisJCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKKwkJdGFibGUuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCWRpc3Bvc2VSZXNvdXJjZXMoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOworCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOworCQkKKwkJLyp0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5QaXhlbERhdGEoOTAsIGZhbHNlKSk7CisJCS8vdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4MCwgdHJ1ZSkpOworCQlUYWJsZUNvbHVtbiBjb2wyID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisJCWNvbDIuc2V0VGV4dCgibnVsbCIpOworCQkqLworCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwLCAyNTAsIGZhbHNlKSk7CisJCWZpbmFsIFRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQljb2wuc2V0VGV4dCgibnVsbCIpOworCQkvKmNvbC5zZXRXaWR0aCgzMDApOworCQljb2wuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQljb2wucGFjaygpOworCQkJfQorCQl9KTsqLworCQkKKwkJLy90YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDMwLCAyNTAsIGZhbHNlKSk7CisJCS8vVGFibGVDb2x1bW4gY29sMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQkvL2NvbDIuc2V0VGV4dCgibnVsbDIiKTsKKwkJCisJCWZpbmFsIGludCBURVhUX01BUkdJTiA9IDM7CisJCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihldmVudC53aWR0aCk7CisJCQkJLypUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07CisJCQkJT2JqZWN0IG9iaiA9IGl0ZW0uZ2V0RGF0YSgpOworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJtZWFzdXJlICIgKyBvYmopOworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CisJCQkJCWV2ZW50LmdjLnNldEZvbnQoZm9udCk7CisJCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KCJBIik7CisJCQkJCWV2ZW50LmdjLnNldEZvbnQobnVsbCk7CisJCQkJCS8vZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCBURVhUX01BUkdJTiAqIDIgKyBzaXplLnkpOworCQkJCQlldmVudC5oZWlnaHQgPSBURVhUX01BUkdJTiAqIDIgKyBzaXplLnk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihldmVudC5oZWlnaHQpOworCQkJCQlyZXR1cm47CisJCQkJfSovCisJCQkJZXZlbnQuZ2Muc2V0Rm9udChmb250KTsKKwkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCgiQSIpOworCQkJCWludCBoID0gVEVYVF9NQVJHSU4gKiAzICsgc2l6ZS55OworCQkJCXNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KCJBIik7CisJCQkJZXZlbnQuZ2Muc2V0Rm9udChudWxsKTsKKwkJCQloICs9IHNpemUueTsKKwkJCQloID0gTWF0aC5tYXgoaCwgNDAgKyBURVhUX01BUkdJTiAqIDIpOworCQkJCS8vZXZlbnQud2lkdGggPSA0MDA7CisJCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCBoKTsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihldmVudC5oZWlnaHQpOworCQkJCS8vZXZlbnQud2lkdGggPSAzMDA7CisJCQl9CisJCX0pOworCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJCS8vaWYgKGV2ZW50LmluZGV4ID09IDApCisJCQkJLy8JcmV0dXJuOworCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkZPUkVHUk9VTkQ7CisJCQkJLy9ldmVudC5kZXRhaWwgJj0gflNXVC5CQUNLR1JPVU5EOworCQkJfQorCQl9KTsKKwkJdGFibGUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQkvL2lmIChldmVudC5pbmRleCA9PSAwKQorCQkJCS8vCXJldHVybjsKKwkJCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07CisJCQkJT2JqZWN0IG9iaiA9IGl0ZW0uZ2V0RGF0YSgpOworCQkJCQorCQkJCWludCB3aWR0aCA9IHRhYmxlLmdldENvbHVtbigwKS5nZXRXaWR0aCgpOworCQkJCUdDIGdjID0gZXZlbnQuZ2M7CisJCQkJCisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIG9iajsKKwkJCQkJaWYgKHByb2dyZXNzICE9IG51bGwpCisJCQkJCQlzID0gcHJvZ3Jlc3M7CisJCQkJCWludCBoID0gZXZlbnQueSArIGV2ZW50LmhlaWdodCAvIDI7CisJCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHMpOworCQkJCQlnYy5kcmF3VGV4dChzLCBldmVudC54ICsgVEVYVF9NQVJHSU4sIGggLSBzaXplLnkvMiwgdHJ1ZSk7CisJCQkJCQorCQkJCQlpbnQgaGggPSBldmVudC55ICsgZXZlbnQuaGVpZ2h0IC0gNSAtIFRFWFRfTUFSR0lOIC0gMTsKKwkJCQkJCisJCQkJCWdjLnNldExpbmVXaWR0aCgyKTsKKwkJCQkJQ29sb3IgY29sb3IgPSBnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OKTsKKwkJCQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7CisJCQkJCQorCQkJCQlpbnQgd2lkdGgyID0gMDsKKwkJCQkJaW50IHN0ZXAgPSA5OworCQkJCQlpZiAodG90YWxXb3JrID4gMCkKKwkJCQkJCXdpZHRoMiA9IChpbnQpICgod2lkdGggLSBzdGVwICogMiAtIDE1IC0gVEVYVF9NQVJHSU4gKiAyKSAqIGN1cnJlbnRXb3JrIC8gdG90YWxXb3JrKTsKKwkJCQkJCisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGgyOyBpKz0gc3RlcCkgeworCQkJCQkJZ2MuZmlsbFJlY3RhbmdsZShldmVudC54ICsgVEVYVF9NQVJHSU4gKyBpLCBoaCwgc3RlcCAtIDIsIDUpOworCQkJCQl9CisJCQkJCQorCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMaXN0KSB7CisJCQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gKExpc3Q8U3RyaW5nPikgb2JqOworCQkJCQkKKwkJCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKKwkJCQkJU3RyaW5nW10gaG9zdHMgPSBuZXcgU3RyaW5nW3NpemVdOworCQkJCQlsaXN0LnRvQXJyYXkoaG9zdHMpOworCQkJCQkKKwkJCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkJaWYgKGkgPiAwKQorCQkJCQkJCXNiLmFwcGVuZCgiLCAiKTsKKwkJCQkJCXNiLmFwcGVuZChob3N0c1tpXSk7CisJCQkJCX0KKwkJCQkJU3RyaW5nIHMgPSBOTFMuYmluZChNZXNzYWdlcy53aXpOZXdJbnN0YWxsYWJsZVNlcnZlclNpdGVFcnJvciwgc2IudG9TdHJpbmcoKSk7CisJCQkJCWdjLmRyYXdUZXh0KHMsIGV2ZW50LnggKyBURVhUX01BUkdJTiwgZXZlbnQueSArIFRFWFRfTUFSR0lOLCB0cnVlKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlJRmVhdHVyZSBlaSA9IChJRmVhdHVyZSkgb2JqOworCQkJCWlmIChlaSA9PSBudWxsKQorCQkJCQlyZXR1cm47CisJCQkJCisJCQkJCisJCQkJLy9pZiAoKGV2ZW50LmRldGFpbCAmIFNXVC5TRUxFQ1RFRCkgPT0gMCkgeworCQkJCS8vCS8vZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZCgpOworCQkJCS8vCS8vZXZlbnQuZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgNSk7CisJCQkJLy8JZXZlbnQuZ2Muc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOworCQkJCS8vCWV2ZW50LmdjLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsKKwkJCQkvLwlldmVudC5nYy5maWxsUmVjdGFuZ2xlKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLCBldmVudC5oZWlnaHQpOworCQkJCS8vfQorCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKHdpZHRoICsgIiAiICsgZXZlbnQud2lkdGggKyAiICIgKyBldmVudC54KTsKKwkJCQkKKwkJCQlTdHJpbmcgbmFtZSA9IGVpLmdldExhYmVsKCk7CisJCQkJU3RyaW5nIHByb3ZpZGVyID0gIiIgKyBlaS5nZXRQcm92aWRlcigpOworCQkJCS8vU3RyaW5nIHByb3ZpZGVyID0gIiIgKyBlaS5nZXRJbWFnZSgpOworCQkJCS8vU3RyaW5nIHByb3ZpZGVyID0gIiIgKyBFeHRlbnNpb25VdGlsaXR5LmdldERlc2NyaXB0aW9uKGVpKTsKKwkJCQlTdHJpbmcgdmVyID0gZWkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisJCQkJaW50IGluZCA9IHZlci5pbmRleE9mKCJfIik7CisJCQkJaWYgKGluZCA+PSAwKQorCQkJCQl2ZXIgPSB2ZXIuc3Vic3RyaW5nKGluZCsxKTsKKwkJCQlTdHJpbmcgdmVyc2lvbiA9ICJ2IiArIHZlcjsKKwkJCQkKKwkJCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlKGVpLmdldEltYWdlKCkpOworCQkJCWlmIChpbWFnZSA9PSBudWxsKQorCQkJCQlpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfV0laQkFOX05FV19TRVJWRVIpOworCQkJCWludCBpdyA9IGltYWdlLmdldEJvdW5kcygpLndpZHRoOworCQkJCWludCBpaCA9IGltYWdlLmdldEJvdW5kcygpLmhlaWdodDsKKwkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGl3LCBpaCwgZXZlbnQueCArIFRFWFRfTUFSR0lOLCBldmVudC55ICsgVEVYVF9NQVJHSU4sIDQwLCA0MCk7CisJCQkJaXcgPSA0MCArIFRFWFRfTUFSR0lOICogMjsKKwkJCQkKKwkJCQlpbnQgeU9mZnNldCA9IFRFWFRfTUFSR0lOOworCQkJCWdjLnNldEZvbnQoZm9udCk7CisJCQkJZ2MuZHJhd1RleHQobmFtZSwgZXZlbnQueCArIGl3LCBldmVudC55ICsgeU9mZnNldCwgdHJ1ZSk7CisJCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LmdjLnRleHRFeHRlbnQobmFtZSk7CisJCQkJZ2Muc2V0Rm9udChudWxsKTsKKwkJCQkKKwkJCQl5T2Zmc2V0ICs9IHNpemUueSArIFRFWFRfTUFSR0lOOworCQkJCWdjLmRyYXdUZXh0KHByb3ZpZGVyLCBldmVudC54ICsgaXcsIGV2ZW50LnkgKyB5T2Zmc2V0LCB0cnVlKTsKKwkJCQkKKwkJCQlzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh2ZXJzaW9uKTsKKwkJCQlnYy5kcmF3VGV4dCh2ZXJzaW9uLCBldmVudC54ICsgd2lkdGggLSBURVhUX01BUkdJTiAqIDMgLSBzaXplLngsIGV2ZW50LnkgKyB5T2Zmc2V0LCB0cnVlKTsKKwkJCX0KKwkJfSk7CisJCQorCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgeworCQkJCWlmICgoZTEgaW5zdGFuY2VvZiBJRmVhdHVyZSkgJiYgIShlMiBpbnN0YW5jZW9mIElGZWF0dXJlKSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWlmICghKGUxIGluc3RhbmNlb2YgSUZlYXR1cmUpICYmIChlMiBpbnN0YW5jZW9mIElGZWF0dXJlKSkKKwkJCQkJcmV0dXJuIDE7CisJCQkJdHJ5IHsKKwkJCQkJSUZlYXR1cmUgZjEgPSAoSUZlYXR1cmUpIGUxOworCQkJCQlJRmVhdHVyZSBmMiA9IChJRmVhdHVyZSkgZTI7CisJCQkJCXJldHVybiAoZjEuZ2V0TGFiZWwoKS5jb21wYXJlVG9JZ25vcmVDYXNlKGYyLmdldExhYmVsKCkpKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0pOworCQkKKwkJLypDb21wb3NpdGUgYnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOworCQlidXR0b25Db21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJYnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJCisJCUJ1dHRvbiBpbnN0YWxsID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgIkZpbmQgVXBkYXRlcyIpOworCQlpbnN0YWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCS8vCisJCQl9CisJCX0pOyovCisJCQorCQlmaW5hbCBMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7CisJCWRlc2NyaXB0aW9uLnNldFRleHQoIk11bHRpXG5MaW5lXG5NZXNzYWdlIik7CisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7CisJCVBvaW50IHAgPSBkZXNjcmlwdGlvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworCQlkZXNjcmlwdGlvbi5zZXRUZXh0KCIiKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJaWYgKHAueSA+IDEwKQorCQkJZGF0YS5oZWlnaHRIaW50ID0gcC55OworCQllbHNlCisJCQlkYXRhLmhlaWdodEhpbnQgPSA0MjsKKwkJZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCS8qZmluYWwgTGFiZWwgZG93bmxvYWQgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlkb3dubG9hZC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlkb3dubG9hZC5zZXRUZXh0KCJEb3dubG9hZCBzaXplOiAiKTsqLworCQkKKwkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJCQlPYmplY3Qgb2JqID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZSkKKwkJCQkJZmVhdHVyZSA9IChJRmVhdHVyZSkgb2JqOworCQkJCQorCQkJCWhhbmRsZVNlbGVjdGlvbihmZWF0dXJlKTsKKwkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKQorCQkJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KEV4dGVuc2lvblV0aWxpdHkuZ2V0RGVzY3JpcHRpb24oZmVhdHVyZSkpOworCQkJCWVsc2UKKwkJCQkJZGVzY3JpcHRpb24uc2V0VGV4dCgiIik7CisJCQkJLypsb25nIHNpemUgPSBmZWF0dXJlLmdldERvd25sb2FkU2l6ZSgpOworCQkJCVN0cmluZyBzID0gIjx1bmtub3duPiI7CisJCQkJaWYgKHNpemUgPiAwKQorCQkJCQlzID0gc2l6ZSArICIgS2IiOworCQkJCWRvd25sb2FkLnNldFRleHQoIkRvd25sb2FkIHNpemU6ICIgKyBzKTsqLworCQkJfQorCQl9KTsKKwkJCisJCWRlZmVySW5pdGlhbGl6YXRpb24oKTsKKwl9CisKKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoVVJMIHVybCkgeworCQlpZiAodXJsID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXRyeSB7CisJCQlJbWFnZSBpbWFnZSA9IGltYWdlcy5nZXQodXJsLnRvU3RyaW5nKCkpOworCQkJaWYgKGltYWdlICE9IG51bGwpCisJCQkJcmV0dXJuIGltYWdlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkJdHJ5IHsKKwkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7CisJCQlJbWFnZSBpbWFnZSA9IGlkLmNyZWF0ZUltYWdlKCk7CisJCQlpZiAoaW1hZ2VzID09IG51bGwpCisJCQkJaW1hZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4oKTsKKwkJCWltYWdlcy5wdXQodXJsLnRvU3RyaW5nKCksIGltYWdlKTsKKwkJCXJldHVybiBpbWFnZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sICJDb3VsZCBub3QgY3JlYXRlIGltYWdlIiwgZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZGlzcG9zZVJlc291cmNlcygpIHsKKwkJdHJ5IHsKKwkJCWZvbnQuZGlzcG9zZSgpOworCQkJCisJCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKKwkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGltYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOworCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJaW1hZ2UuZGlzcG9zZSgpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZGlzcG9zZSAtIHBvc3NpYmxlIHJlc291cmNlIGxlYWsiLCBlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbihJRmVhdHVyZSBmZWF0dXJlKSB7CisJCWxpc3RlbmVyLmZlYXR1cmVTZWxlY3RlZChmZWF0dXJlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkZWZlckluaXRpYWxpemF0aW9uKCkgeworCQlmaW5hbCBMaXN0PE9iamVjdD4gbGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDxPYmplY3Q+KCkpOworCQlsaXN0LmFkZChNZXNzYWdlcy52aWV3SW5pdGlhbGl6aW5nKTsKKwkJCisJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRXh0ZW5zaW9uQ29udGVudFByb3ZpZGVyKGxpc3QpKTsKKwkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRXh0ZW5zaW9uVGFibGVMYWJlbFByb3ZpZGVyKCkpOworCQl0YWJsZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7CisJCQorCQlmaW5hbCBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIkRlZmVycmVkIEluaXRpYWxpemF0aW9uIikgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWRlZmVycmVkSW5pdGlhbGl6ZShsaXN0LCBuZXcgSVByb2dyZXNzTW9uaXRvcigpIHsKKwkJCQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrMikgeworCQkJCQkJdG90YWxXb3JrID0gdG90YWxXb3JrMjsKKwkJCQkJCXByb2dyZXNzID0gbmFtZTsKKwkJCQkJfQorCisJCQkJCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7CisJCQkJCQlwcm9ncmVzcyA9IG5hbWU7CisJCQkJCX0KKworCQkJCQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7CisJCQkJCQlwcm9ncmVzcyA9IG5hbWU7CisJCQkJCX0KKworCQkJCQlwdWJsaWMgdm9pZCBkb25lKCkgeworCQkJCQkJLy8gCisJCQkJCX0KKworCQkJCQlwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgeworCQkJCQkJY3VycmVudFdvcmsgKz0gd29yazsKKwkJCQkJfQorCisJCQkJCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKworCQkJCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7CisJCQkJCQkvLyAKKwkJCQkJfQorCisJCQkJCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgeworCQkJCQkJY3VycmVudFdvcmsgKz0gd29yazsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9OworCQl0LnNldERhZW1vbih0cnVlKTsKKwkJdC5zdGFydCgpOworCQkKKwkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOworCQlmaW5hbCBpbnQgU0xFRVAgPSAxMDA7CisJCWZpbmFsIFJ1bm5hYmxlW10gYW5pbWF0b3IgPSBuZXcgUnVubmFibGVbMV07CisJCWFuaW1hdG9yWzBdID0gbmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmICh0LmlzQWxpdmUoKSkgeworCQkJCQljb3VudCsrOworCQkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkKKwkJCQkJCXRhYmxlVmlld2VyLnJlZnJlc2goQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOworCQkJCQlkaXNwbGF5LnRpbWVyRXhlYyhTTEVFUCwgYW5pbWF0b3JbMF0pOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJZGlzcGxheS50aW1lckV4ZWMoU0xFRVAsIGFuaW1hdG9yWzBdKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkZWZlcnJlZEluaXRpYWxpemUoZmluYWwgTGlzdDxPYmplY3Q+IGxpc3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlmaW5hbCBMaXN0PFN0cmluZz4gZmFpbGVkU2l0ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJRXh0ZW5zaW9uVXRpbGl0eS5GZWF0dXJlTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IEV4dGVuc2lvblV0aWxpdHkuRmVhdHVyZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgZmVhdHVyZUZvdW5kKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCQlsaXN0LmFkZChmZWF0dXJlKTsKKwkJCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkKKwkJCQkJbGlzdC5zZXQoMCwgcHJvZ3Jlc3MpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7CisJCQkJbGlzdC5yZW1vdmUoZmVhdHVyZSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHNpdGVGYWlsdXJlKFN0cmluZyBob3N0KSB7CisJCQkJc3luY2hyb25pemVkIChmYWlsZWRTaXRlcykgeworCQkJCQlpZiAoIWxpc3QuY29udGFpbnMoZmFpbGVkU2l0ZXMpKQorCQkJCQkJbGlzdC5hZGQoZmFpbGVkU2l0ZXMpOworCQkJCQlmYWlsZWRTaXRlcy5hZGQoaG9zdCk7CisJCQkJfQorCQkJfQorCQl9OworCQkKKwkJU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJBZGFwdGVyIjsKKwkJdHJ5IHsKKwkJCUV4dGVuc2lvblV0aWxpdHkuZ2V0QWxsRmVhdHVyZXMoaWQsIGxpc3RlbmVyMiwgbW9uaXRvcik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBkb3dubG9hZGluZyBzZXJ2ZXIgYWRhcHRlciBpbmZvIiwgY2UpOworCQl9CisJCQorCQlsaXN0LnJlbW92ZSgwKTsKKwkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkKKwkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7CisJCQl9CisJCX0pOworCX0KKworCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgeworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7CisJCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaW9uQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2lvbkNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NGNmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2lvbkNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworLyoqCisgKiBFeHRlbnNpb24gY29udGVudCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIEV4dGVuc2lvbkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKKwlwcm90ZWN0ZWQgTGlzdCBsaXN0OworCisJcHVibGljIEV4dGVuc2lvbkNvbnRlbnRQcm92aWRlcihMaXN0IGxpc3QpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5saXN0ID0gbGlzdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJcmV0dXJuIGxpc3QudG9BcnJheSgpOworCX0KKworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaW9uVGFibGVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2lvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Y2UxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2lvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworLyoqCisgKiBFeHRlbnNpb24gaXRlbSB0YWJsZSBsYWJlbCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIEV4dGVuc2lvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CisJLyoqCisJICogRXh0ZW5zaW9uVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIEV4dGVuc2lvblRhYmxlTGFiZWxQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBFeHRlbnNpb25UYWJsZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZGVjb3JhdG9yIGEgbGFiZWwgZGVjb3JhdG9yLCBvciBudWxsIGlmIG5vIGRlY29yYXRvciBpcyByZXF1aXJlZAorCSAqLworCXB1YmxpYyBFeHRlbnNpb25UYWJsZUxhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgeworCQlzdXBlcihkZWNvcmF0b3IpOworCX0KKworCS8qKgorCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShPYmplY3QsIGludCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChPYmplY3QsIGludCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3QpCisJCQlyZXR1cm4gIlNvbWUgdXBkYXRlIHNpdGVzIGZhaWxlZCI7CisJCQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykKKwkJCXJldHVybiAoKFN0cmluZykgZWxlbWVudCkgKyBNYXRoLnJhbmRvbSgpOworCQkKKwkJSUZlYXR1cmUgaXRlbSA9IChJRmVhdHVyZSkgZWxlbWVudDsKKwkJcmV0dXJuIGl0ZW0uZ2V0TGFiZWwoKSArICJcbiIgKyBpdGVtLmdldFByb3ZpZGVyKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSUxvY2tlZExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSUxvY2tlZExhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTcxZTAzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9JTG9ja2VkTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworLyoqCisgKiBFeHRlbmRzIDxjb2RlPklUYWJsZUxhYmVsUHJvdmlkZXI8L2NvZGU+IHdpdGggbWV0aG9kcyB0byBwcm92aWRlCisgKiBsb2NrIGluZm9ybWF0aW9uLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElMb2NrZWRMYWJlbFByb3ZpZGVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsb2NrIGluZm8gZm9yIHRoZSBlbGVtZW50LiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZAorCSAqIHRvIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSB0YWJsZSByb3cuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudCB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZW50aXJlIHJvdywgb3IgCisJICogICAgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IG5vIGlucHV0IG9iamVjdCBpcyBzZXQKKwkgKiAgICBpbiB0aGUgdmlld2VyCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlbSBpcyBsb2NrZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KKwkgKiAgICBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZChPYmplY3QgZWxlbWVudCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Jbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4ZmFkOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SZXNvdXJjZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0cy5GYWNldFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOworLyoqCisgKiBDbGFzcyB1c2VkIHRvIHNvcnQgY2F0ZWdvcmllcywgcnVudGltZSB0eXBlcywgYW5kIHNlcnZlciB0eXBlcyBpbiB0aGUKKyAqIE5ldyB3aXphcmRzLgorICovCitwdWJsaWMgY2xhc3MgSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKKworCXB1YmxpYyBPYmplY3QgZ2V0SW5pdGlhbFNlbGVjdGlvbihPYmplY3RbXSBvYmopIHsKKwkJaWYgKG9iaiA9PSBudWxsIHx8IG9iai5sZW5ndGggPT0gMCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJaWYgKG9ialswXSBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgeworCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOworCQkJSVJ1bnRpbWVUeXBlW10gcnQgPSBuZXcgSVJ1bnRpbWVUeXBlW3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQkJcnRbaV0gPSAoSVJ1bnRpbWVUeXBlKSBvYmpbaV07CisJCQlyZXR1cm4gZ2V0SW5pdGlhbFNlbGVjdGlvbihydCk7CisJCX0KKwkJCisJCWlmIChvYmpbMF0gaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkgeworCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOworCQkJSVNlcnZlclR5cGVbXSBzdCA9IG5ldyBJU2VydmVyVHlwZVtzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCXN0W2ldID0gKElTZXJ2ZXJUeXBlKSBvYmpbaV07CisJCQlyZXR1cm4gZ2V0SW5pdGlhbFNlbGVjdGlvbihzdCk7CisJCX0KKwkJCisJCWlmIChvYmpbMF0gaW5zdGFuY2VvZiBJU2VydmVyKSB7CisJCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7CisJCQlJU2VydmVyW10gc3QgPSBuZXcgSVNlcnZlcltzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCXN0W2ldID0gKElTZXJ2ZXIpIG9ialtpXTsKKwkJCXJldHVybiBnZXRJbml0aWFsU2VsZWN0aW9uKHN0KTsKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIHNlcnZlclR5cGVzCisJICogQHJldHVybiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KKwkgKi8KKwlwdWJsaWMgSVNlcnZlclR5cGUgZ2V0SW5pdGlhbFNlbGVjdGlvbihJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzKSB7CisJCWlmIChzZXJ2ZXJUeXBlcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpbnQgc2l6ZSA9IHNlcnZlclR5cGVzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmIChoYXNSdW50aW1lKHNlcnZlclR5cGVzW2ldKSkKKwkJCQlyZXR1cm4gc2VydmVyVHlwZXNbaV07CisJCX0KKwkJcmV0dXJuIGdldERlZmF1bHRTZXJ2ZXJUeXBlKHNlcnZlclR5cGVzKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVycworCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgc2VsZWN0aW9uCisJICovCisJcHVibGljIElTZXJ2ZXIgZ2V0SW5pdGlhbFNlbGVjdGlvbihJU2VydmVyW10gc2VydmVycykgeworCQlyZXR1cm4gZ2V0SW5pdGlhbFNlbGVjdGlvbihzZXJ2ZXJzLG51bGwpOworCX0KKwkKKwkvKioKKwkgKiBBbGxvd3MgYWRvcHRlcnMgdG8gcHJvdmlkZSBhbiBpbml0aWFsIHNlbGVjdGlvbiBvdXQgb2YgYSBsaXN0IG9mIGl0ZW1zLgorCSAqIDxwPgorCSAqIFRoZSA8Y29kZT5JUHJvamVjdDwvY29kZT4gY2FuIGJlIG51bGwsIGluIGNhc2VzIHdoZXJlIGEgcHJvamVjdCBzZWxlY3Rpb24gd2FzIG5vdCBhdmFpbGFibGUgKGllOiBOZXcgU2VydmVyIFdpemFyZCkKKwkgKiA8L3A+PHA+CisJICogUmV0dXJuaW5nIDxjb2RlPm51bGw8L2NvZGU+IG1lYW5zIG5vIG9iamVjdCBpcyBhcHBsaWNhYmxlIHRvIGJlIHNlbGVjdGVkLiAKKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHNlcnZlcnMKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgSVNlcnZlciBnZXRJbml0aWFsU2VsZWN0aW9uKElTZXJ2ZXJbXSBzZXJ2ZXJzLCBJUHJvamVjdCBwcm9qZWN0KXsKKwkJaWYgKHNlcnZlcnMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJSVNlcnZlciBydmFsID0gc2VydmVyc1swXTsKKwkJCisJCWlmIChwcm9qZWN0ICE9IG51bGwpeworCQkJdHJ5eworCQkJCS8vIGNoZWNrIGZvciB0aGUgdGFyZ2V0ZWQgcnVudGltZSBvZiB0aGUgcHJvamVjdAorCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKKwkJCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCl7CisJCQkJCW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgZmFjZXRlZFJ1bnRpbWUgPSBmYWNldGVkUHJvamVjdC5nZXRQcmltYXJ5UnVudGltZSgpOworCQkJCQkJaWYgKGZhY2V0ZWRSdW50aW1lICE9IG51bGwpeworCQkJCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBGYWNldFV0aWwuZ2V0UnVudGltZShmYWNldGVkUnVudGltZSk7CisJCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBmaW5kU2VydmVyRnJvbVJ1bnRpbWUocnVudGltZS5nZXRJZCgpKTsKKwkJCQkJCQlpZiAoc2VydmVyICE9IG51bGwpeworCQkJCQkJCQlydmFsID0gc2VydmVyOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSl7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsIkNvdWxkIG5vdCBjcmVhdGUgYSBmYWNldGVkIHByb2plY3QiLGNlKTsKKwkJCQl9CisJCQl9CisJCXJldHVybiBydmFsOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBydW50aW1lVHlwZXMKKwkgKiBAcmV0dXJuIHRoZSBpbml0aWFsIHNlbGVjdGlvbgorCSAqLworCXB1YmxpYyBJUnVudGltZVR5cGUgZ2V0SW5pdGlhbFNlbGVjdGlvbihJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMpIHsKKwkJaWYgKHJ1bnRpbWVUeXBlcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpbnQgc2l6ZSA9IHJ1bnRpbWVUeXBlcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAoaGFzUnVudGltZShydW50aW1lVHlwZXNbaV0pKQorCQkJCXJldHVybiBydW50aW1lVHlwZXNbaV07CisJCX0KKwkJcmV0dXJuIGdldERlZmF1bHRSdW50aW1lVHlwZShydW50aW1lVHlwZXMpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGhhc1J1bnRpbWUoSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgeworCQlyZXR1cm4gaGFzUnVudGltZShzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGhhc1J1bnRpbWUoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7CisJCWlmIChydW50aW1lVHlwZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyVUlQbHVnaW4uZ2V0UnVudGltZXMocnVudGltZVR5cGUpOworCQlyZXR1cm4gcnVudGltZXMgIT0gbnVsbCAmJiBydW50aW1lcy5sZW5ndGggPiAwOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkZWZhdWx0IHNlcnZlciB0eXBlLCB0eXBpY2FsbHkgdGhlICdmaXJzdCcgb25lIHNvcnRlZAorCSAqIGFscGhhYmV0aWNhbGx5IGJ5IG5hbWUuCisJICogCisJICogQHBhcmFtIHNlcnZlclR5cGVzCisJICogQHJldHVybiB0aGUgZGVmYXVsdCBzZXJ2ZXIgdHlwZQorCSAqLworCXByb3RlY3RlZCBJU2VydmVyVHlwZSBnZXREZWZhdWx0U2VydmVyVHlwZShJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzKSB7CisJCWlmIChzZXJ2ZXJUeXBlcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpbnQgc2l6ZSA9IHNlcnZlclR5cGVzLmxlbmd0aDsKKwkJaWYgKHNpemUgPT0gMSkKKwkJCXJldHVybiBzZXJ2ZXJUeXBlc1swXTsKKwkJCisJCUlTZXJ2ZXJUeXBlIGZpcnN0ID0gc2VydmVyVHlwZXNbMF07CisJCWZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAoRGVmYXVsdFZpZXdlclNvcnRlci5jb21wYXJlU2VydmVyVHlwZXMoZmlyc3QsIHNlcnZlclR5cGVzW2ldKSA+IDApCisJCQkJZmlyc3QgPSBzZXJ2ZXJUeXBlc1tpXTsKKwkJfQorCQlyZXR1cm4gZmlyc3Q7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGRlZmF1bHQgcnVudGltZSB0eXBlLCB0eXBpY2FsbHkgdGhlICdmaXJzdCcgb25lIHNvcnRlZAorCSAqIGFscGhhYmV0aWNhbGx5IGJ5IG5hbWUuCisJICogCisJICogQHBhcmFtIHJ1bnRpbWVUeXBlcworCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcnVudGltZSB0eXBlCisJICovCisJcHJvdGVjdGVkIElSdW50aW1lVHlwZSBnZXREZWZhdWx0UnVudGltZVR5cGUoSVJ1bnRpbWVUeXBlW10gcnVudGltZVR5cGVzKSB7CisJCWlmIChydW50aW1lVHlwZXMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJaW50IHNpemUgPSBydW50aW1lVHlwZXMubGVuZ3RoOworCQlpZiAoc2l6ZSA9PSAxKQorCQkJcmV0dXJuIHJ1bnRpbWVUeXBlc1swXTsKKwkJCisJCUlSdW50aW1lVHlwZSBmaXJzdCA9IHJ1bnRpbWVUeXBlc1swXTsKKwkJZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmIChEZWZhdWx0Vmlld2VyU29ydGVyLmNvbXBhcmVSdW50aW1lVHlwZXMoZmlyc3QsIHJ1bnRpbWVUeXBlc1tpXSkgPiAwKQorCQkJCWZpcnN0ID0gcnVudGltZVR5cGVzW2ldOworCQl9CisJCXJldHVybiBmaXJzdDsKKwl9CisJCisJLyoqCisJICogQWxsb3dzIGFkb3B0ZXJzIHRvIHByb3ZpZGUgYW4gaW5pdGlhbCBzZWxlY3Rpb24gb3V0IG9mIGEgbGlzdCBvZiBpdGVtcy4KKwkgKiA8cD4KKwkgKiBUaGUgPGNvZGU+SVByb2plY3Q8L2NvZGU+IGNhbiBiZSBudWxsLCBpbiBjYXNlcyB3aGVyZSBhIHByb2plY3Qgc2VsZWN0aW9uIHdhcyBub3QgYXZhaWxhYmxlIChpZTogTmV3IFNlcnZlciBXaXphcmQpCisJICogPC9wPjxwPgorCSAqIFJldHVybmluZyA8Y29kZT5udWxsPC9jb2RlPiBtZWFucyBubyBvYmplY3QgaXMgYXBwbGljYWJsZSB0byBiZSBzZWxlY3RlZC4gCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBvYmogQ29udGFpbnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBwb3NzaWJsZSBvYmplY3QgdG8gYmUgc2VsZWN0ZWQuIAorCSAqIEBwYXJhbSBwcm9qZWN0CisJICogQHJldHVybiBUaGUgb2JqZWN0IHRvIGJlIHNlbGVjdGVkIGZyb20gdGhlIDxjb2RlPm9ialtdPC9jb2RlPiAKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEluaXRpYWxTZWxlY3Rpb24oT2JqZWN0IFtdIG9iaiwgSVByb2plY3QgcHJvamVjdCl7CisJCWlmIChvYmogPT0gbnVsbCB8fCBvYmoubGVuZ3RoID09IDApCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCWlmIChvYmpbMF0gaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKKwkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKKwkJCUlSdW50aW1lVHlwZVtdIHJ0ID0gbmV3IElSdW50aW1lVHlwZVtzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCXJ0W2ldID0gKElSdW50aW1lVHlwZSkgb2JqW2ldOworCQkJcmV0dXJuIGdldEluaXRpYWxTZWxlY3Rpb24ocnQpOworCQl9CisJCQorCQlpZiAob2JqWzBdIGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKKwkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKKwkJCUlTZXJ2ZXJUeXBlW10gc3QgPSBuZXcgSVNlcnZlclR5cGVbc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQlzdFtpXSA9IChJU2VydmVyVHlwZSkgb2JqW2ldOworCQkJcmV0dXJuIGdldEluaXRpYWxTZWxlY3Rpb24oc3QpOworCQl9CisJCQorCQlpZiAob2JqWzBdIGluc3RhbmNlb2YgSVNlcnZlcikgeworCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOworCQkJSVNlcnZlcltdIHN0ID0gbmV3IElTZXJ2ZXJbc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQlzdFtpXSA9IChJU2VydmVyKSBvYmpbaV07CisJCQlyZXR1cm4gZ2V0SW5pdGlhbFNlbGVjdGlvbihzdCxwcm9qZWN0KTsKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CQkKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc2VydmVyIHdpdGggdGhlIGdpdmVuIHJ1bnRpbWUgaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IAorCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgc2VydmVycworCSAqIGZvciB0aGUgbWF0Y2hpbmcgcnVudGltZSBpZC4gVGhlIGlkIG1heSBub3QgYmUgbnVsbC4KKwkgKiAKKwkgKiBAcGFyYW0gcnVudGltZUlkCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgc3RhdGljIElTZXJ2ZXIgZmluZFNlcnZlckZyb21SdW50aW1lKFN0cmluZyBydW50aW1lSWQpeworCQlpZiAocnVudGltZUlkID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQkKKwkJSVNlcnZlciBbXSBzZXJ2ZXJzID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0U2VydmVycygpOworCQlmb3IgKElTZXJ2ZXIgc2VydmVyOnNlcnZlcnMpeworCQkJaWYgKHJ1bnRpbWVJZCA9PSBzZXJ2ZXIuZ2V0UnVudGltZSgpLmdldElkKCkpeworCQkJCXJldHVybiBzZXJ2ZXI7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkQ2hlY2tib3hUYWJsZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Mb2NrZWRDaGVja2JveFRhYmxlVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwNmI0YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkQ2hlY2tib3hUYWJsZVZpZXdlci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NrZWRDaGVja2JveFRhYmxlVmlld2VyIGV4dGVuZHMgQ2hlY2tib3hUYWJsZVZpZXdlciB7CisJcHJvdGVjdGVkIENvbG9yIGNvbG9yOworCisJcHVibGljIExvY2tlZENoZWNrYm94VGFibGVWaWV3ZXIoVGFibGUgdGFibGUpIHsKKwkJc3VwZXIodGFibGUpOworCQljcmVhdGVDb2xvcih0YWJsZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29sb3IoQ29udHJvbCBjKSB7CisJCWNvbG9yID0gbmV3IENvbG9yKGMuZ2V0RGlzcGxheSgpLCAyNTUsIDI1NSwgMjI1KTsKKwkJYy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7CisJCQkJY29sb3IuZGlzcG9zZSgpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkb1VwZGF0ZUl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgeworCQlpZiAoY29sb3IgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgeworCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSB3aWRnZXQ7CisJCQlpZiAoZ2V0TGFiZWxQcm92aWRlcigpIGluc3RhbmNlb2YgSUxvY2tlZExhYmVsUHJvdmlkZXIpIHsKKwkJCQlJTG9ja2VkTGFiZWxQcm92aWRlciBwcm92aWRlciA9IChJTG9ja2VkTGFiZWxQcm92aWRlcikgZ2V0TGFiZWxQcm92aWRlcigpOworCQkJCWlmIChwcm92aWRlci5pc0xvY2tlZChlbGVtZW50KSkgeworCQkJCQlpdGVtLnNldEJhY2tncm91bmQoY29sb3IpOworCQkJCQlpdGVtLnNldEltYWdlKDAsIG51bGwpOworCQkJCX0gZWxzZQorCQkJCQlpdGVtLnNldEJhY2tncm91bmQobnVsbCk7CisJCQl9CisJCX0KKwkJc3VwZXIuZG9VcGRhdGVJdGVtKHdpZGdldCwgZWxlbWVudCwgZnVsbE1hcCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkVGFibGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkVGFibGVWaWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWMyZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Mb2NrZWRUYWJsZVZpZXdlci5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIExvY2tlZFRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIgeworCXByb3RlY3RlZCBDb2xvciBjb2xvcjsKKworCXB1YmxpYyBMb2NrZWRUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCWNyZWF0ZUNvbG9yKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBMb2NrZWRUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCWNyZWF0ZUNvbG9yKHBhcmVudCk7CisJfQorCisJcHVibGljIExvY2tlZFRhYmxlVmlld2VyKFRhYmxlIHRhYmxlKSB7CisJCXN1cGVyKHRhYmxlKTsKKwkJY3JlYXRlQ29sb3IodGFibGUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbG9yKENvbnRyb2wgYykgeworCQljb2xvciA9IG5ldyBDb2xvcihjLmdldERpc3BsYXkoKSwgMjU1LCAyNTUsIDIyNSk7CisJCWMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCWNvbG9yLmRpc3Bvc2UoKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LCBib29sZWFuIGZ1bGxNYXApIHsKKwkJaWYgKGNvbG9yID09IG51bGwpCisJCQlyZXR1cm47CisJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKKwkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgd2lkZ2V0OworCQkJaWYgKGdldExhYmVsUHJvdmlkZXIoKSBpbnN0YW5jZW9mIElMb2NrZWRMYWJlbFByb3ZpZGVyKSB7CisJCQkJSUxvY2tlZExhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUxvY2tlZExhYmVsUHJvdmlkZXIpIGdldExhYmVsUHJvdmlkZXIoKTsKKwkJCQlpZiAocHJvdmlkZXIuaXNMb2NrZWQoZWxlbWVudCkpIHsKKwkJCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKKwkJCQkJaXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKKwkJCQl9IGVsc2UKKwkJCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOworCQkJfQorCQl9CisJCXN1cGVyLmRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGZ1bGxNYXApOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vZHVsZUFydGlmYWN0Q29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vZHVsZUFydGlmYWN0Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5Yzc4NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9kdWxlQXJ0aWZhY3RDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworCitwdWJsaWMgY2xhc3MgTW9kdWxlQXJ0aWZhY3RDb21wb3NpdGUgZXh0ZW5kcyBEaWFsb2cgeworCXByb3RlY3RlZCBJTW9kdWxlQXJ0aWZhY3RbXSBtb2R1bGVBcnRpZmFjdHM7CisJcHJpdmF0ZSBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7CisJcHJpdmF0ZSBTdHJpbmcgbGF1bmNoTW9kZTsJCQorCXByaXZhdGUgSU1vZHVsZUFydGlmYWN0IHNlbGVjdGlvbjsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIElNb2R1bGVBcnRpZmFjdCBmb3IgdGhlIHNlbGVjdGVkIHJlc291cmNlCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBtb2R1bGVBcnRpZmFjdHMKKwkgKiBAcGFyYW0gbGF1bmNoTW9kZQorCSAqLworCXB1YmxpYyBNb2R1bGVBcnRpZmFjdENvbXBvc2l0ZShTaGVsbCBwYXJlbnQsZmluYWwgSU1vZHVsZUFydGlmYWN0W10gbW9kdWxlQXJ0aWZhY3RzLCBTdHJpbmcgbGF1bmNoTW9kZSl7CisJCXN1cGVyKHBhcmVudCk7CisJCXNldFNoZWxsU3R5bGUoU1dULlJFU0laRSB8IGdldFNoZWxsU3R5bGUoKSk7CisJCXRoaXMubW9kdWxlQXJ0aWZhY3RzID0gbW9kdWxlQXJ0aWZhY3RzOworCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCisJICovCisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKKwkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOworCQlzaGVsbC5zZXRUZXh0KGdldFdpbmRvd1RpdGxlKCkpOworCX0KKworCS8qKgorCSAqIEJhc2VkIG9uIHRoZSBsYXVuY2ggbW9kZSwgcmV0dXJuIHRoZSBOTFMgU3RyaW5nIGZvciB0aGUgRGlhbG9nLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHdpbmRvdyB0aXRsZQorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldFdpbmRvd1RpdGxlKCkgeworCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlOworCQkKKwkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKQorCQkJdGl0bGUgPSBNZXNzYWdlcy53aXpEZWJ1Z09uU2VydmVyVGl0bGU7CQkJCQkKKwkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKKwkJCXRpdGxlID0gTWVzc2FnZXMud2l6UHJvZmlsZU9uU2VydmVyVGl0bGU7CisJCXJldHVybiB0aXRsZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKKwkJCisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CisJCQkJCisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJCisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisJCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOworCQkKKwkJVGV4dCBkZXNjcmlwdGlvbiA9IG5ldyBUZXh0KGNvbXBvc2l0ZSxTV1QuTk9ORSk7CisJCWRlc2NyaXB0aW9uLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlQXJ0aWZhY3RzRGVzY3JpcHRpb24pOworCQlkZXNjcmlwdGlvbi5zZXRFZGl0YWJsZShmYWxzZSk7CisJCWRlc2NyaXB0aW9uLnNldEN1cnNvcihjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX0FSUk9XKSk7CisJCQorCQljcmVhdGVDb250ZW50KGNvbXBvc2l0ZSk7CisJCQorCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbnRlbnRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCxTV1QuTk9ORSB8U1dULlJFU0laRSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwkJCisJCWxheW91dC5udW1Db2x1bW5zID0gMTsKKwkJCQkKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQkKKwkJY29udGVudENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJY29udGVudENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQljb250ZW50Q29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisJCQorCQlMYWJlbCB0YWJsZVRpdGxlID0gbmV3IExhYmVsKGNvbnRlbnRDb21wb3NpdGUsU1dULk5vbmUpOworCQl0YWJsZVRpdGxlLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlQXJ0aWZhY3RzQXZhaWxhYmxlTGlzdCk7CisKKwkJbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGNvbnRlbnRDb21wb3NpdGUsU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOworCQlsaXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlsaXN0Vmlld2VyLmdldExpc3QoKS5zZXRGb2N1cygpOworCisJCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBCYXNlQ29udGVudFByb3ZpZGVyKCkgeworCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCQlyZXR1cm4gbW9kdWxlQXJ0aWZhY3RzOworCQkJfQorCQl9KTsKKwkJCisJCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQmFzZUxhYmVsUHJvdmlkZXIoKSB7CisJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsJCQkJCisJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVBcnRpZmFjdERlbGVnYXRlKSB7CisJCQkJCS8vIFRyeSB0byBkaXNwbGF5IHRoZSBvYmplY3QgdXNpbmcgaXRzIG5hbWUgCisJCQkJCU1vZHVsZUFydGlmYWN0RGVsZWdhdGUgbW9kdWxlQXJ0aWZhY3QgPSAoTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSllbGVtZW50OworCQkJCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gbW9kdWxlQXJ0aWZhY3QuZ2V0TmFtZSgpOworCQkJCQlpZiAoYXJ0aWZhY3ROYW1lICE9IG51bGwgJiYgYXJ0aWZhY3ROYW1lLmxlbmd0aCgpID49IDApIHsKKwkJCQkJCWludCBjbGFzc05hbWVJbmRleCA9IGFydGlmYWN0TmFtZS5sYXN0SW5kZXhPZigiLiIpOworCQkJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gYXJ0aWZhY3ROYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWVJbmRleCk7CisJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gYXJ0aWZhY3ROYW1lLnN1YnN0cmluZyhjbGFzc05hbWVJbmRleCsxKTsKKwkJCQkJCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIChwYWNrYWdlTmFtZS5sZW5ndGgoKTw9MCkgPT0gZmFsc2UpeworCQkJCQkJCXJldHVybiBjbGFzc05hbWUgKyAiICgiK21vZHVsZUFydGlmYWN0LmdldE5hbWUoKSsiKSI7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gbW9kdWxlQXJ0aWZhY3QuZ2V0TmFtZSgpOworCQkJCQl9CisKKwkJCQkJLy8gSWYgdGhlIG5hbWUgaXMgZW1wdHkgd2UgY2FuIHRoZW4gdXNlIHRoZSBtb2R1bGUgYXJ0aWZhY3QgY2xhc3MgbmFtZSAgCisJCQkJCXJldHVybiBtb2R1bGVBcnRpZmFjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsJCQkJCisJCQkJfQorCQkJCXJldHVybiBNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWU7CisJCQl9CisJCX0pOworCQkKKwkJbGlzdFZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKwkJCQlidXR0b25QcmVzc2VkKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOworCQkJfQorCQl9KTsKKwkJCQorCQlsaXN0Vmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNlbGVjdGlvbiBvZiB0aGUgZGlhbG9nCisJICogCisJICogQHJldHVybiB0aGUgc2VsZWN0ZWQgbW9kdWxlIGFydGlmYWN0CisJICovCisJcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRTZWxlY3Rpb24oKSB7CisJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjIgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGxpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisJCWlmIChzZWxlY3Rpb24yID09IG51bGwgfHwgc2VsZWN0aW9uMi5nZXRGaXJzdEVsZW1lbnQoKSA9PSBudWxsKQorCQkJcmV0dXJuIHNlbGVjdGlvbjsKKwkJCisJCXNlbGVjdGlvbiA9IChJTW9kdWxlQXJ0aWZhY3Qpc2VsZWN0aW9uMi5nZXRGaXJzdEVsZW1lbnQoKTsgCisJCXJldHVybiBzZWxlY3Rpb247CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCisJICovCisJcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKKwkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKKwkJCWlmIChnZXRTZWxlY3Rpb24oKSA9PSBudWxsKXsKKwkJCQlNZXNzYWdlQm94IG1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveChnZXRTaGVsbCgpLFNXVC5JQ09OX0VSUk9SIHwgU1dULk9LKTsKKwkJCQltZXNzYWdlQm94LnNldE1lc3NhZ2UoTWVzc2FnZXMud2l6TW9kdWxlQXJ0aWZhY3RzTm9TZWxlY3Rpb25FcnJvcik7CisJCQkJbWVzc2FnZUJveC5zZXRUZXh0KGdldFdpbmRvd1RpdGxlKCkpOworCQkJCW1lc3NhZ2VCb3gub3BlbigpOworCQkJCS8vIGJ5cGFzcyB0aGUgY2FsbCB0byBzdXBlciwgc28gdGhhdCB0aGlzIERpYWxvZyBkb2Vzbid0IGdldCBkaXNwb3NlZAorCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA2NGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwyMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb25pdG9yZWRTZXJ2ZXJQb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU2VydmVyTW9uaXRvck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTW9uaXRvckNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7CisJLy9wcm90ZWN0ZWQgU2VydmVyUG9ydCBzZWxlY3Rpb247CisJcHJvdGVjdGVkIFBvcnRTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKKwlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7CisJCisJcHJvdGVjdGVkIElTZXJ2ZXJNb25pdG9yTWFuYWdlciBzbW07CisJCisJcHJvdGVjdGVkIFRhYmxlIG1vbml0b3JUYWJsZTsKKwlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgbW9uaXRvclRhYmxlVmlld2VyOworCQorCXB1YmxpYyBpbnRlcmZhY2UgUG9ydFNlbGVjdGlvbkxpc3RlbmVyIHsKKwkJcHVibGljIHZvaWQgcG9ydFNlbGVjdGVkKFNlcnZlclBvcnQgcG9ydCk7CisJfQorCQorCXB1YmxpYyBNb25pdG9yQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgUG9ydFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMiwgSVNlcnZlciBzZXJ2ZXIpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7CisJCXRoaXMuc2VydmVyID0gc2VydmVyOworCQkKKwkJc21tID0gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwkJCisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCXNldExheW91dChsYXlvdXQpOworCisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCW1vbml0b3JUYWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKKwkJLy9kYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJZGF0YS5oZWlnaHRIaW50ID0gMTUwOworCQkvL2RhdGEud2lkdGhIaW50ID0gMzQwOworCQltb25pdG9yVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJbW9uaXRvclRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKwkJbW9uaXRvclRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKG1vbml0b3JUYWJsZSk7CisJCQorCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOworCQltb25pdG9yVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKKwkJbW9uaXRvclRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisJCQorCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDgsIDgwLCB0cnVlKSk7CisJCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbihtb25pdG9yVGFibGUsIFNXVC5OT05FKTsKKwkJY29sLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbHVtblN0YXR1cyk7CisJCQorCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEyLCAxMjAsIHRydWUpKTsKKwkJY29sID0gbmV3IFRhYmxlQ29sdW1uKG1vbml0b3JUYWJsZSwgU1dULk5PTkUpOworCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uVHlwZSk7CisJCQorCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDgsIDgwLCB0cnVlKSk7CisJCWNvbCA9IG5ldyBUYWJsZUNvbHVtbihtb25pdG9yVGFibGUsIFNXVC5OT05FKTsKKwkJY29sLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbHVtblBvcnQpOworCQkKKwkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4MCwgdHJ1ZSkpOworCQljb2wgPSBuZXcgVGFibGVDb2x1bW4obW9uaXRvclRhYmxlLCBTV1QuTk9ORSk7CisJCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb2x1bW5Nb25pdG9yUG9ydCk7CisJCQorCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDgsIDgwLCB0cnVlKSk7CisJCWNvbCA9IG5ldyBUYWJsZUNvbHVtbihtb25pdG9yVGFibGUsIFNXVC5OT05FKTsKKwkJY29sLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbHVtbkNvbnRlbnRUeXBlKTsKKwkJCisJCW1vbml0b3JUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IE1vbml0b3JDb250ZW50UHJvdmlkZXIoc2VydmVyKSk7CisJCW1vbml0b3JUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBNb25pdG9yTGFiZWxQcm92aWRlcihzZXJ2ZXIpKTsKKwkJbW9uaXRvclRhYmxlVmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKKwkJCisJCW1vbml0b3JUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgeworCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQxID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBlMTsKKwkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBwb3J0MiA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgZTI7CisJCQkJaWYgKHBvcnQxLmdldFNlcnZlclBvcnQoKS5nZXRQb3J0KCkgPT0gcG9ydDIuZ2V0U2VydmVyUG9ydCgpLmdldFBvcnQoKSkgeworCQkJCQlpZiAocG9ydDEuZ2V0TW9uaXRvclBvcnQoKSA9PSBwb3J0Mi5nZXRNb25pdG9yUG9ydCgpKSB7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfSBlbHNlIGlmIChwb3J0MS5nZXRNb25pdG9yUG9ydCgpID4gcG9ydDIuZ2V0TW9uaXRvclBvcnQoKSkKKwkJCQkJCXJldHVybiAxOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gLTE7CisJCQkJfSBlbHNlIGlmIChwb3J0MS5nZXRTZXJ2ZXJQb3J0KCkuZ2V0UG9ydCgpID4gcG9ydDIuZ2V0U2VydmVyUG9ydCgpLmdldFBvcnQoKSkKKwkJCQkJcmV0dXJuIDE7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0pOworCQkKKwkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKKwkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKKwkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWJ1dHRvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7CisJCQorCQlmaW5hbCBJU2VydmVyIHNlcnZlcjIgPSBzZXJ2ZXI7CisJCUJ1dHRvbiBhZGQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5hZGQpOworCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpLCBzZXJ2ZXIyKTsKKwkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7CisJCQkJCVNlcnZlclBvcnQgcG9ydCA9IGRpYWxvZy5nZXRTZXJ2ZXJQb3J0KCk7CisJCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHNwID0gc21tLmNyZWF0ZU1vbml0b3Ioc2VydmVyMiwgcG9ydCwgZGlhbG9nLmdldE1vbml0b3JQb3J0KCksIGRpYWxvZy5nZXRDb250ZW50VHlwZXMoKSk7CisJCQkJCWlmIChzcCAhPSBudWxsKQorCQkJCQkJbW9uaXRvclRhYmxlVmlld2VyLmFkZChzcCk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKKwkJCWFkZC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCisJCWZpbmFsIEJ1dHRvbiBlZGl0ID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuZWRpdCk7CisJCWVkaXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtb25pdG9yVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisJCQkJSU1vbml0b3JlZFNlcnZlclBvcnQgcG9ydCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkJCU1vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IE1vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSwgc2VydmVyMiwgcG9ydC5nZXRTZXJ2ZXJQb3J0KCksIHBvcnQuZ2V0TW9uaXRvclBvcnQoKSwgcG9ydC5nZXRDb250ZW50VHlwZXMoKSk7CisJCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkgeworCQkJCQlzbW0ucmVtb3ZlTW9uaXRvcihwb3J0KTsKKwkJCQkJbW9uaXRvclRhYmxlVmlld2VyLnJlbW92ZShwb3J0KTsKKwkJCQkJcG9ydCA9IHNtbS5jcmVhdGVNb25pdG9yKHNlcnZlcjIsIGRpYWxvZy5nZXRTZXJ2ZXJQb3J0KCksIGRpYWxvZy5nZXRNb25pdG9yUG9ydCgpLCBkaWFsb2cuZ2V0Q29udGVudFR5cGVzKCkpOworCQkJCQlpZiAocG9ydCAhPSBudWxsKSB7CisJCQkJCQltb25pdG9yVGFibGVWaWV3ZXIuYWRkKHBvcnQpOworCQkJCQkJbW9uaXRvclRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwb3J0KSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0pOworCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOworCQkKKwkJZmluYWwgQnV0dG9uIHJlbW92ZSA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnJlbW92ZSk7CisJCXJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBtc3AgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIGdldFNlbGVjdGlvbihtb25pdG9yVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCQkJCWlmIChtc3AuaXNTdGFydGVkKCkpCisJCQkJCXNtbS5zdG9wTW9uaXRvcihtc3ApOworCQkJCXNtbS5yZW1vdmVNb25pdG9yKG1zcCk7CisJCQkJbW9uaXRvclRhYmxlVmlld2VyLnJlbW92ZShtc3ApOworCQkJfQorCQl9KTsKKwkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOworCQkKKwkJZmluYWwgQnV0dG9uIHN0YXJ0ID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuc3RhcnQpOworCQlzdGFydC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG1vbml0b3JUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBtc3AgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCQl0cnkgeworCQkJCQlzbW0uc3RhcnRNb25pdG9yKG1zcCk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwkJCQl9CisJCQkJbW9uaXRvclRhYmxlVmlld2VyLnJlZnJlc2gobXNwKTsKKwkJCQltb25pdG9yVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1zcCkpOworCQkJfQorCQl9KTsKKwkJc3RhcnQuc2V0RW5hYmxlZChmYWxzZSk7CisJCQorCQlmaW5hbCBCdXR0b24gc3RvcCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnN0b3ApOworCQlzdG9wLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgbW9uaXRvclRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOworCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkJCXNtbS5zdG9wTW9uaXRvcihtc3ApOworCQkJCW1vbml0b3JUYWJsZVZpZXdlci5yZWZyZXNoKG1zcCk7CisJCQkJbW9uaXRvclRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtc3ApKTsKKwkJCX0KKwkJfSk7CisJCXN0b3Auc2V0RW5hYmxlZChmYWxzZSk7CisJCQorCQltb25pdG9yVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBwb3J0ID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBnZXRTZWxlY3Rpb24obW9uaXRvclRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKKwkJCQlpZiAocG9ydCAhPSBudWxsKSB7CisJCQkJCWVkaXQuc2V0RW5hYmxlZCghcG9ydC5pc1N0YXJ0ZWQoKSk7CisJCQkJCXJlbW92ZS5zZXRFbmFibGVkKHRydWUpOworCQkJCQlzdGFydC5zZXRFbmFibGVkKCFwb3J0LmlzU3RhcnRlZCgpKTsKKwkJCQkJc3RvcC5zZXRFbmFibGVkKHBvcnQuaXNTdGFydGVkKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJc3RhcnQuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCXN0b3Auc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0W10gbXNwcyA9IFNlcnZlck1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9uaXRvcmVkUG9ydHMoc2VydmVyKTsgCisJCWlmIChtc3BzICE9IG51bGwgJiYgbXNwcy5sZW5ndGggPiAwKQorCQkJbW9uaXRvclRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtc3BzWzBdKSk7CisJfQorCQorCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgeworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7CisJCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5MzEzNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JNYW5hZ2VyOworLyoqCisgKiBNb25pdG9yIHBvcnQgY29udGVudCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIE1vbml0b3JDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ29udGVudFByb3ZpZGVyIHsKKwlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7CisKKwlwdWJsaWMgTW9uaXRvckNvbnRlbnRQcm92aWRlcihJU2VydmVyIHNlcnZlcikgeworCQlzdXBlcigpOworCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwl9CisKKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQlyZXR1cm4gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb25pdG9yZWRQb3J0cyhzZXJ2ZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckRpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OGVlODYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JEaWFsb2cuamF2YQpAQCAtMCwwICsxLDI0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKKy8qKgorICogRGlhbG9nIHRoYXQgcHJvbXB0cyBhIHVzZXIgdG8gYWRkIG9yIGVkaXQgYSBzZXJ2ZXIgbW9uaXRvci4KKyAqLworcHVibGljIGNsYXNzIE1vbml0b3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKKwlwcm90ZWN0ZWQgU2VydmVyUG9ydCBwb3J0OworCXByb3RlY3RlZCBpbnQgbW9uaXRvclBvcnQgPSAtMTsKKwlwcm90ZWN0ZWQgU3RyaW5nW10gcG9ydENvbnRlbnRUeXBlczsKKwlwcm90ZWN0ZWQgU3RyaW5nW10gY29udGVudFR5cGVzOworCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHBvcnRDaGFuZ2VkID0gZmFsc2U7CisJCisJcHJvdGVjdGVkIEJ1dHRvbiBvazsKKwkKKwlwcm90ZWN0ZWQgVGFibGUgdGFibGU7CisJcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOworCXByb3RlY3RlZCBib29sZWFuIGluaXQ7CisKKwkvKioKKwkgKiBNb25pdG9yRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICogCisJICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBzaGVsbAorCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorCSAqLworCXB1YmxpYyBNb25pdG9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJU2VydmVyIHNlcnZlcikgeworCQlzdXBlcihwYXJlbnRTaGVsbCk7CisKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJfQorCisJcHVibGljIE1vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBtb25pdG9yUG9ydCwgU3RyaW5nW10gY29udGVudFR5cGVzKSB7CisJCXRoaXMocGFyZW50U2hlbGwsIHNlcnZlcik7CisJCXRoaXMubW9uaXRvclBvcnQgPSBtb25pdG9yUG9ydDsKKwkJdGhpcy5jb250ZW50VHlwZXMgPSBjb250ZW50VHlwZXM7CisJCXRoaXMucG9ydCA9IHBvcnQ7CisJCWlzRWRpdCA9IHRydWU7CisJfQorCisJLyoqCisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgeworCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7CisJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvclRpdGxlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJb2sgPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKKwkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisJCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5URVJNSU5BVEVfU0VSVkVSX0RJQUxPRyk7CisJCQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKKwkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQWRkRGVzY3JpcHRpb24sIG5ldyBTdHJpbmdbXSB7IHNlcnZlci5nZXROYW1lKCkgfSApKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJZGF0YS53aWR0aEhpbnQgPSAyNzU7CisJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKKwkJZGF0YS5oZWlnaHRIaW50ID0gMTAwOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOworCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7CisJCQorCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOworCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOworCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCQkKKwkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMiwgMTIwLCB0cnVlKSk7CisJCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uVHlwZSk7CisJCQorCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDQsIDQwLCB0cnVlKSk7CisJCWNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uUG9ydCk7CisJCQorCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFBvcnRDb250ZW50UHJvdmlkZXIoc2VydmVyKSk7CisJCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFBvcnRMYWJlbFByb3ZpZGVyKHNlcnZlcikpOworCQl0YWJsZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7CisJCQorCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgeworCQkJCVNlcnZlclBvcnQgcG9ydDEgPSAoU2VydmVyUG9ydCkgZTE7CisJCQkJU2VydmVyUG9ydCBwb3J0MiA9IChTZXJ2ZXJQb3J0KSBlMjsKKwkJCQlpZiAocG9ydDEuZ2V0UG9ydCgpID09IHBvcnQyLmdldFBvcnQoKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJZWxzZSBpZiAocG9ydDEuZ2V0UG9ydCgpID4gcG9ydDIuZ2V0UG9ydCgpKQorCQkJCQlyZXR1cm4gMTsKKwkJCQllbHNlCisJCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSk7CisJCQorCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yTW9uaXRvclBvcnQpOworCQkKKwkJZmluYWwgVGV4dCBwb3J0VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS53aWR0aEhpbnQgPSAxNTA7CisJCXBvcnRUZXh0LnNldExheW91dERhdGEoZGF0YSk7CisJCWlmIChtb25pdG9yUG9ydCA+PSAwKQorCQkJcG9ydFRleHQuc2V0VGV4dChtb25pdG9yUG9ydCArICIiKTsKKworCQlwb3J0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQl0cnkgeworCQkJCQltb25pdG9yUG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydFRleHQuZ2V0VGV4dCgpKTsKKwkJCQkJaWYgKG9rICE9IG51bGwpCisJCQkJCQlvay5zZXRFbmFibGVkKHRydWUpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQltb25pdG9yUG9ydCA9IC0xOworCQkJCQlpZiAob2sgIT0gbnVsbCkKKwkJCQkJCW9rLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCX0KKwkJCQlwb3J0Q2hhbmdlZCA9IHRydWU7CisJCQl9CisJCX0pOworCQkKKwkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlKTsKKwkJCisJCWZpbmFsIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS53aWR0aEhpbnQgPSAxNTA7CisJCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7CisJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWludCBzaXplID0gY29tYm8uZ2V0SXRlbUNvdW50KCk7CisJCQkJaW50IHNlbCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7CisJCQkJaWYgKHNlbCA9PSBzaXplIC0gMSkKKwkJCQkJY29udGVudFR5cGVzID0gcG9ydENvbnRlbnRUeXBlczsKKwkJCQllbHNlCisJCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7IHBvcnRDb250ZW50VHlwZXNbc2VsXSB9OworCQkJfQorCQl9KTsKKwkJCisJCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJcG9ydCA9IChTZXJ2ZXJQb3J0KSBnZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCQkJCWlmIChwb3J0ID09IG51bGwpCisJCQkJCXJldHVybjsKKwkJCQlpZiAoIXBvcnRDaGFuZ2VkKSB7CisJCQkJCXBvcnRUZXh0LnNldFRleHQoKHBvcnQuZ2V0UG9ydCgpICsgMSkgKyAiIik7CisJCQkJCXBvcnRDaGFuZ2VkID0gZmFsc2U7CisJCQkJfQorCQkJCXBvcnRDb250ZW50VHlwZXMgPSBwb3J0LmdldENvbnRlbnRUeXBlcygpOworCQkJCVN0cmluZ1tdIHMgPSBudWxsOworCQkJCVN0cmluZyBhbGwgPSBNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29udGVudFR5cGVBbGw7CisJCQkJaWYgKHBvcnRDb250ZW50VHlwZXMgPT0gbnVsbCB8fCBwb3J0Q29udGVudFR5cGVzLmxlbmd0aCA9PSAxKSB7CisJCQkJCXMgPSBuZXcgU3RyaW5nW10geyBhbGwgfTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgc2l6ZSA9IHBvcnRDb250ZW50VHlwZXMubGVuZ3RoOworCQkJCQlzID0gbmV3IFN0cmluZ1tzaXplKzFdOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkJc1tpXSA9IE1vbml0b3JMYWJlbFByb3ZpZGVyLmdldENvbnRlbnRUeXBlU3RyaW5nKHBvcnRDb250ZW50VHlwZXNbaV0pOworCQkJCQl9CisJCQkJCXNbc2l6ZV0gPSBhbGw7CisJCQkJfQorCQkJCWNvbWJvLnNldEl0ZW1zKHMpOworCQkJCWNvbWJvLnNldFRleHQoYWxsKTsKKwkJCX0KKwkJfSk7CisJCQorCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7CisJCQorCQlpZiAocG9ydCAhPSBudWxsKSB7CisJCQlwb3J0Q2hhbmdlZCA9IHRydWU7CisJCQlTdHJpbmdbXSBjdCA9IGNvbnRlbnRUeXBlczsKKwkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwb3J0KSk7CisJCQlpZiAoY3QgIT0gbnVsbCAmJiBjdC5sZW5ndGggPiAwKQorCQkJCWNvbWJvLnNldFRleHQoTW9uaXRvckxhYmVsUHJvdmlkZXIuZ2V0Q29udGVudFR5cGVTdHJpbmcoY3RbMF0pKTsKKwkJfSBlbHNlIGlmICh0YWJsZVZpZXdlciAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCU9iamVjdCBvYmogPSB0YWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7CisJCQkJaWYgKG9iaiAhPSBudWxsKQorCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmopKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKwkJCisJCXBvcnRDaGFuZ2VkID0gZmFsc2U7CisJCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCQorCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgeworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7CisJCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0TW9uaXRvclBvcnQoKSB7CisJCXJldHVybiBtb25pdG9yUG9ydDsKKwl9CisKKwlwdWJsaWMgU2VydmVyUG9ydCBnZXRTZXJ2ZXJQb3J0KCkgeworCQlyZXR1cm4gcG9ydDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVzKCkgeworCQlyZXR1cm4gY29udGVudFR5cGVzOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyYTc4NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckxhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1vbml0b3JlZFNlcnZlclBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CisvKioKKyAqIE1vbml0b3IgcG9ydCBsYWJlbCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIE1vbml0b3JMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKKwlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7CisKKwlwdWJsaWMgTW9uaXRvckxhYmVsUHJvdmlkZXIoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJfQorCisJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJSU1vbml0b3JlZFNlcnZlclBvcnQgcG9ydCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgZWxlbWVudDsKKwkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKKwkJCWlmIChwb3J0LmlzU3RhcnRlZCgpKQorCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX01PTklUT1JfT04pOworCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfTU9OSVRPUl9PRkYpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIGVsZW1lbnQ7CisJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7CisJCQlpZiAocG9ydC5pc1N0YXJ0ZWQoKSkKKwkJCQlyZXR1cm4gTWVzc2FnZXMuc3RhcnRlZDsKKwkJCXJldHVybiBNZXNzYWdlcy5zdG9wcGVkOworCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpCisJCQlyZXR1cm4gbm90TnVsbChwb3J0LmdldFNlcnZlclBvcnQoKS5nZXROYW1lKCkpOworCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKQorCQkJcmV0dXJuIHBvcnQuZ2V0U2VydmVyUG9ydCgpLmdldFBvcnQoKSArICIiOworCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKQorCQkJcmV0dXJuIHBvcnQuZ2V0TW9uaXRvclBvcnQoKSArICIiOworCQllbHNlIHsKKwkJCVN0cmluZ1tdIGNvbnRlbnQgPSBwb3J0LmdldENvbnRlbnRUeXBlcygpOworCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCB8fCBjb250ZW50Lmxlbmd0aCA9PSAwKQorCQkJCXJldHVybiBNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29udGVudFR5cGVBbGw7CisJCQkKKwkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCWludCBzaXplID0gY29udGVudC5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWlmIChpID4gMCkKKwkJCQkJc2IuYXBwZW5kKCIsIik7CisJCQkJc2IuYXBwZW5kKGdldENvbnRlbnRUeXBlU3RyaW5nKGNvbnRlbnRbaV0pKTsKKwkJCX0KKwkJCXJldHVybiBzYi50b1N0cmluZygpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldENvbnRlbnRUeXBlU3RyaW5nKFN0cmluZyBzKSB7CisJCWlmICgid2ViIi5lcXVhbHMocykpCisJCQlyZXR1cm4gTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlV2ViOworCQllbHNlIGlmICgid2Vic2VydmljZXMiLmVxdWFscyhzKSkKKwkJCXJldHVybiBNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29udGVudFR5cGVXZWJTZXJ2aWNlczsKKwkJZWxzZQorCQkJcmV0dXJuIHM7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0Q29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyMjFjOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydENvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CisvKioKKyAqIE1vbml0b3IgcG9ydCBjb250ZW50IHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgUG9ydENvbnRlbnRQcm92aWRlciBleHRlbmRzIEJhc2VDb250ZW50UHJvdmlkZXIgeworCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKKworCXB1YmxpYyBQb3J0Q29udGVudFByb3ZpZGVyKElTZXJ2ZXIgc2VydmVyKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuc2VydmVyID0gc2VydmVyOworCX0KKworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyUG9ydHMobnVsbCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydExhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzY3NGY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0TGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OworLyoqCisgKiBTZXJ2ZXIgcG9ydCBsYWJlbCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIFBvcnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKKwlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7CisKKwlwdWJsaWMgUG9ydExhYmVsUHJvdmlkZXIoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJfQorCisJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJU2VydmVyUG9ydCBwb3J0ID0gKFNlcnZlclBvcnQpIGVsZW1lbnQ7CisJCWlmIChjb2x1bW5JbmRleCA9PSAwKQorCQkJcmV0dXJuIG5vdE51bGwocG9ydC5nZXROYW1lKCkpOworCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKQorCQkJcmV0dXJuIHBvcnQuZ2V0UG9ydCgpICsgIiI7CisJCWVsc2UKKwkJCXJldHVybiAiIjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjczOWQyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlQ29tcG9zaXRlIHsKKwlwcm90ZWN0ZWQgSVJ1bnRpbWUgc2VsZWN0aW9uOworCXByb3RlY3RlZCBJUnVudGltZSBkZWZhdWx0UnVudGltZTsKKwlwcm90ZWN0ZWQgUnVudGltZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOworCQorCXB1YmxpYyBpbnRlcmZhY2UgUnVudGltZVNlbGVjdGlvbkxpc3RlbmVyIHsKKwkJcHVibGljIHZvaWQgcnVudGltZVNlbGVjdGVkKElSdW50aW1lIHJ1bnRpbWUpOworCX0KKwkKKwljbGFzcyBSdW50aW1lVmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKKwkJYm9vbGVhbiBzb3J0QnlOYW1lOworCQlwdWJsaWMgUnVudGltZVZpZXdlclNvcnRlcihib29sZWFuIHNvcnRCeU5hbWUpIHsKKwkJCXRoaXMuc29ydEJ5TmFtZSA9IHNvcnRCeU5hbWU7CisJCX0KKwkJCisJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgeworCQkJSVJ1bnRpbWUgcjEgPSAoSVJ1bnRpbWUpIGUxOworCQkJSVJ1bnRpbWUgcjIgPSAoSVJ1bnRpbWUpIGUyOworCQkJaWYgKHNvcnRCeU5hbWUpCisJCQkJcmV0dXJuIGdldENvbXBhcmF0b3IoKS5jb21wYXJlKG5vdE51bGwocjEuZ2V0TmFtZSgpKSwgbm90TnVsbChyMi5nZXROYW1lKCkpKTsKKwkJCQorCQkJaWYgKHIxLmdldFJ1bnRpbWVUeXBlKCkgPT0gbnVsbCkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAocjIuZ2V0UnVudGltZVR5cGUoKSA9PSBudWxsKQorCQkJCXJldHVybiAxOworCQkJcmV0dXJuIGdldENvbXBhcmF0b3IoKS5jb21wYXJlKG5vdE51bGwocjEuZ2V0UnVudGltZVR5cGUoKS5nZXROYW1lKCkpLCBub3ROdWxsKHIyLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpKSk7CisJCX0KKwkJCisJCXByb3RlY3RlZCBTdHJpbmcgbm90TnVsbChTdHJpbmcgcykgeworCQkJaWYgKHMgPT0gbnVsbCkKKwkJCQlyZXR1cm4gIiI7CisJCQlyZXR1cm4gczsKKwkJfQorCX0KKwkKKwlwdWJsaWMgUnVudGltZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFJ1bnRpbWVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7CisJCQorCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOworCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOworCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCisJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMCwgMTYwLCB0cnVlKSk7CisJCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQljb2wuc2V0VGV4dChNZXNzYWdlcy5jb2x1bW5OYW1lKTsKKwkJY29sLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFJ1bnRpbWVWaWV3ZXJTb3J0ZXIodHJ1ZSkpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXdpZGdldFNlbGVjdGVkKGUpOworCQkJfQorCQl9KTsKKworCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDAsIDEyNSwgdHJ1ZSkpOworCQljb2wgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKKwkJY29sLnNldFRleHQoTWVzc2FnZXMuY29sdW1uVHlwZSk7CisJCWNvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBSdW50aW1lVmlld2VyU29ydGVyKGZhbHNlKSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7CisJCQl9CisJCX0pOworCQkKKwkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSdW50aW1lQ29udGVudFByb3ZpZGVyKCkpOworCQkKKwkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBSdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyKCk7CisJCWxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKKwkJCQlpZiAob2JqID09IG51bGwpCisJCQkJCXRhYmxlVmlld2VyLnJlZnJlc2godHJ1ZSk7CisJCQkJZWxzZSB7CisJCQkJCW9iaiA9IFNlcnZlclVJUGx1Z2luLmFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKG9iaik7CisJCQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKG9ialtpXSwgdHJ1ZSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKKwkJCisJCXRhYmxlVmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKKwkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyJuYW1lIiwgInR5cGUifSk7CisJCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgUnVudGltZVZpZXdlclNvcnRlcih0cnVlKSk7CisJCQorCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUnVudGltZSkKKwkJCQkJc2VsZWN0aW9uID0gKElSdW50aW1lKSBvYmo7CisJCQkJZWxzZQorCQkJCQlzZWxlY3Rpb24gPSBudWxsOworCQkJCWxpc3RlbmVyLnJ1bnRpbWVTZWxlY3RlZChzZWxlY3Rpb24pOworCQkJfQorCQl9KTsKKwkJCisJCXRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgeworCQkJCWlmIChlLmNoYXJhY3RlciA9PSAnbCcpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBnZXRTZWxlY3RlZFJ1bnRpbWUoKTsKKwkJCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSBydW50aW1lLmNyZWF0ZVdvcmtpbmdDb3B5KCk7CisJCQkJCQl3Yy5zZXRSZWFkT25seSghcnVudGltZS5pc1JlYWRPbmx5KCkpOworCQkJCQkJd2Muc2F2ZShmYWxzZSwgbnVsbCk7CisJCQkJCQlyZWZyZXNoKHJ1bnRpbWUpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkJCS8vIGlnbm9yZQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7CisJCQkJLy8gZG8gbm90aGluZworCQkJfQorCQl9KTsKKwkJCisJCS8vIGFmdGVyIGFkZGluZyBhbiBpdGVtIGRvIHRoZSBwYWNraW5nIG9mIHRoZSB0YWJsZQorCQlpZiAodGFibGUuZ2V0SXRlbUNvdW50KCkgPiAwKSB7CisJCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7CisJCQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKQorCQkJCWNvbHVtbnNbaV0ucGFjaygpOworCQkJdGFibGUucGFjaygpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGUoKSB7CisJCXRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZVZpZXdlcigpIHsKKwkJdGFibGVWaWV3ZXIgPSBuZXcgTG9ja2VkVGFibGVWaWV3ZXIodGFibGUpOworCX0KKworCXB1YmxpYyBJUnVudGltZSBnZXRTZWxlY3RlZFJ1bnRpbWUoKSB7CisJCXJldHVybiBzZWxlY3Rpb247CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3ZTY3MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZTsKKy8qKgorICogUnVudGltZSBjb250ZW50IHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgUnVudGltZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEJhc2VDb250ZW50UHJvdmlkZXIgeworCS8qKgorCSAqIFJ1bnRpbWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgUnVudGltZUNvbnRlbnRQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQlMaXN0PElSdW50aW1lPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKKwkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKKwkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoISgoUnVudGltZSlydW50aW1lc1tpXSkuaXNQcml2YXRlKCkpCisJCQkJCWxpc3QuYWRkKHJ1bnRpbWVzW2ldKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRhYmxlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwMTI0MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRhYmxlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKy8qKgorICogUnVudGltZSB0YWJsZSBsYWJlbCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElMb2NrZWRMYWJlbFByb3ZpZGVyIHsKKwkvKioKKwkgKiBSdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFJ1bnRpbWVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogUnVudGltZVRhYmxlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqIAorCSAqIEBwYXJhbSBkZWNvcmF0b3IgYSBsYWJlbCBkZWNvcmF0b3IsIG9yIG51bGwgaWYgbm8gZGVjb3JhdG9yIGlzIHJlcXVpcmVkCisJICovCisJcHVibGljIFJ1bnRpbWVUYWJsZUxhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgeworCQlzdXBlcihkZWNvcmF0b3IpOworCX0KKworCS8qKgorCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShPYmplY3QsIGludCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgeworCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKKwkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKKwkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsKSB7CisJCQkJSW1hZ2UgaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlKHJ1bnRpbWVUeXBlLmdldElkKCkpOworCQkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJCQlJbWFnZSBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgZWxlbWVudCk7CisJCQkJCWlmIChkZWMgIT0gbnVsbCkKKwkJCQkJCXJldHVybiBkZWM7CisJCQkJfQorCQkJCXJldHVybiBpbWFnZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChPYmplY3QsIGludCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OworCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgeworCQkJU3RyaW5nIHRleHQgPSBub3ROdWxsKHJ1bnRpbWUuZ2V0TmFtZSgpKTsKKwkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJCVN0cmluZyBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIGVsZW1lbnQpOworCQkJCWlmIChkZWMgIT0gbnVsbCkKKwkJCQkJcmV0dXJuIGRlYzsKKwkJCX0KKwkJCXJldHVybiB0ZXh0OworCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKKwkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKKwkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsKQorCQkJCXJldHVybiBub3ROdWxsKHJ1bnRpbWVUeXBlLmdldE5hbWUoKSk7CisJCQlyZXR1cm4gIiI7CisJCX0gZWxzZQorCQkJcmV0dXJuICIiOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzTG9ja2VkKE9iamVjdCBlbGVtZW50KSB7CisJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7CisJCXJldHVybiBydW50aW1lLmlzUmVhZE9ubHkoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNWFkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKKy8qKgorICogUnVudGltZSBjb250ZW50IHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgUnVudGltZVRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIgeworCS8qKgorCSAqIFJ1bnRpbWVUcmVlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBSdW50aW1lVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBmaWxsVHJlZSgpIHsKKwkJY2xlYW4oKTsKKwkJTGlzdDxUcmVlRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VHJlZUVsZW1lbnQ+KCk7CisJCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7CisJCWlmIChydW50aW1lcyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZXNbaV0uZ2V0UnVudGltZVR5cGUoKTsKKwkJCQl0cnkgeworCQkJCQlUcmVlRWxlbWVudCBlbGUgPSBnZXRPckNyZWF0ZShsaXN0LCBydW50aW1lVHlwZS5nZXRWZW5kb3IoKSk7CisJCQkJCWVsZS5jb250ZW50cy5hZGQocnVudGltZXNbaV0pOworCQkJCQllbGVtZW50VG9QYXJlbnRNYXAucHV0KHJ1bnRpbWVzW2ldLCBlbGUpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBpbiBydW50aW1lIGNvbnRlbnQgcHJvdmlkZXIiLCBlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkMDM1YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisvKioKKyAqIFJ1bnRpbWUgbGFiZWwgcHJvdmlkZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBSdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CisJLyoqCisJICogUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFJ1bnRpbWVUcmVlTGFiZWxQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZGVjb3JhdG9yIGEgbGFiZWwgZGVjb3JhdG9yLCBvciBudWxsIGlmIG5vIGRlY29yYXRvciBpcyByZXF1aXJlZAorCSAqLworCXB1YmxpYyBSdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgeworCQlzdXBlcihkZWNvcmF0b3IpOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUltcGwoT2JqZWN0IGVsZW1lbnQpIHsKKwkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKKwkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOworCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkgeworCQkJSW1hZ2UgaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlKHJ1bnRpbWVUeXBlLmdldElkKCkpOworCQkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7CisJCQkJSW1hZ2UgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGVsZW1lbnQpOworCQkJCWlmIChkZWMgIT0gbnVsbCkKKwkJCQkJcmV0dXJuIGRlYzsKKwkJCX0KKwkJCXJldHVybiBpbWFnZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHRJbXBsKE9iamVjdCBlbGVtZW50KSB7CisJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7CisJCXJldHVybiBub3ROdWxsKHJ1bnRpbWUuZ2V0TmFtZSgpKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIHsKKwkJCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7CisJCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKKwkJCX0KKwkJCXJldHVybiBnZXRJbWFnZUltcGwoZWxlbWVudCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgeworCQkJaWYgKGNvbHVtbkluZGV4ID09IDApCisJCQkJcmV0dXJuICgoU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgZWxlbWVudCkudGV4dDsKKwkJCXJldHVybiAiIjsKKwkJfQorCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OworCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgeworCQkJU3RyaW5nIHRleHQgPSBub3ROdWxsKHJ1bnRpbWUuZ2V0TmFtZSgpKTsKKwkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJCVN0cmluZyBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIHJ1bnRpbWUpOworCQkJCWlmIChkZWMgIT0gbnVsbCkKKwkJCQkJcmV0dXJuIGRlYzsKKwkJCX0KKwkJCXJldHVybiB0ZXh0OworCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKKwkJCWlmIChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCkKKwkJCQlyZXR1cm4gbm90TnVsbChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpKTsKKwkJCXJldHVybiAiIjsKKwkJfQorCQlyZXR1cm4gIiI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVR5cGVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVR5cGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzMwY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmV4dGVuc2lvbi5FeHRlbnNpb25VdGlsaXR5OworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVUeXBlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29tcG9zaXRlIHsKKwlwcm90ZWN0ZWQgSVJ1bnRpbWVUeXBlIHNlbGVjdGlvbjsKKwlwcm90ZWN0ZWQgUnVudGltZVR5cGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGlvbjsKKwlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7CisJcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOworCXByb3RlY3RlZCBTdHJpbmcgcnVudGltZVR5cGVJZDsKKworCXByb3RlY3RlZCBSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOworCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxTZWxlY3Rpb24gPSB0cnVlOworCisJcHVibGljIGludGVyZmFjZSBSdW50aW1lVHlwZVNlbGVjdGlvbkxpc3RlbmVyIHsKKwkJcHVibGljIHZvaWQgcnVudGltZVR5cGVTZWxlY3RlZChJUnVudGltZVR5cGUgcnVudGltZVR5cGUpOworCX0KKworCXB1YmxpYyBSdW50aW1lVHlwZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNyZWF0aW9uLCBSdW50aW1lVHlwZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMiwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcnVudGltZVR5cGVJZCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOworCQl0aGlzLmNyZWF0aW9uID0gY3JlYXRpb247CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJCXRoaXMucnVudGltZVR5cGVJZCA9IHJ1bnRpbWVUeXBlSWQ7CisJCQorCQljb250ZW50UHJvdmlkZXIgPSBuZXcgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyKGNyZWF0aW9uLCB0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKTsKKwkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKKwkJCisJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgUnVudGltZVR5cGVUcmVlTGFiZWxQcm92aWRlcigpOworCQlsYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCU9iamVjdFtdIG9iaiA9IGV2ZW50LmdldEVsZW1lbnRzKCk7CisJCQkJaWYgKG9iaiA9PSBudWxsKQorCQkJCQl0cmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7CisJCQkJZWxzZSB7CisJCQkJCW9iaiA9IFNlcnZlclVJUGx1Z2luLmFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKG9iaik7CisJCQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQkJCQl0cmVlVmlld2VyLnJlZnJlc2gob2JqW2ldLCB0cnVlKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7CisJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOworCQkKKwkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKKwkJCQkJc2VsZWN0aW9uID0gKElSdW50aW1lVHlwZSkgb2JqOworCQkJCQlzZXREZXNjcmlwdGlvbihzZWxlY3Rpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2VsZWN0aW9uID0gbnVsbDsKKwkJCQkJc2V0RGVzY3JpcHRpb24oIiIpOworCQkJCX0KKwkJCQlsaXN0ZW5lci5ydW50aW1lVHlwZVNlbGVjdGVkKHNlbGVjdGlvbik7CisJCQl9CisJCX0pOworCQkKKwkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IERlZmF1bHRWaWV3ZXJTb3J0ZXIoKSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJaWYgKHZpc2libGUgJiYgaW5pdGlhbFNlbGVjdGlvbikgeworCQkJaW5pdGlhbFNlbGVjdGlvbiA9IGZhbHNlOworCQkJaWYgKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkgIT0gbnVsbCkKKwkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbigpKSwgdHJ1ZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlTGFiZWwoKSB7CisJCXJldHVybiBNZXNzYWdlcy5ydW50aW1lVHlwZUNvbXBUcmVlOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25MYWJlbCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKwkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOworCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyKGNyZWF0aW9uLCB0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKSk7CisJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7CisJfQorCisJcHVibGljIElSdW50aW1lVHlwZSBnZXRTZWxlY3RlZFJ1bnRpbWVUeXBlKCkgeworCQlyZXR1cm4gc2VsZWN0aW9uOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGV0YWlsc0xhYmVsKCkgeworCQlyZXR1cm4gTWVzc2FnZXMuaW5zdGFsbGFibGVTZXJ2ZXJMaW5rOworCX0KKworCXByaXZhdGUgdm9pZCBjbG9zZVdpemFyZChDb21wb3NpdGUgY29tcCkgeworCQlpZiAoY29tcCA9PSBudWxsIHx8IGNvbXAuaXNEaXNwb3NlZCgpKQorCQkJcmV0dXJuOworCQkKKwkJQ29tcG9zaXRlIGMgPSBjb21wLmdldFBhcmVudCgpOworCQlpZiAoYyBpbnN0YW5jZW9mIFNoZWxsKSB7CisJCQlTaGVsbCBzID0gKFNoZWxsKSBjOworCQkJcy5jbG9zZSgpOworCQl9CisJCWNsb3NlV2l6YXJkKGMpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGRldGFpbHNTZWxlY3RlZCgpIHsKKwkJaWYgKEV4dGVuc2lvblV0aWxpdHkubGF1bmNoRXh0ZW5zaW9uV2l6YXJkKGdldFNoZWxsKCksIE1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyVGl0bGUsCisJCQkJTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJEZXNjcmlwdGlvbikpIHsKKwkJCS8vcmVmcmVzaCgpOworCQkJY2xvc2VXaXphcmQodGhpcyk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2OWY4NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CisvKioKKyAqIFJ1bnRpbWUgdHlwZSBjb250ZW50IHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGlvbjsKKwlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7CisJcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOworCXByb3RlY3RlZCBTdHJpbmcgcnVudGltZVR5cGVJZDsKKworCS8qKgorCSAqIFJ1bnRpbWVUeXBlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBjcmVhdGlvbiB0cnVlIHRvIGluY2x1ZGUgcnVudGltZXMgdGhhdCBjYW4gYmUgY3JlYXRlZAorCSAqLworCXB1YmxpYyBSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoYm9vbGVhbiBjcmVhdGlvbikgeworCQlzdXBlcigpOworCQl0aGlzLmNyZWF0aW9uID0gY3JlYXRpb247CisJfQorCisJcHVibGljIFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlcihib29sZWFuIGNyZWF0aW9uLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBydW50aW1lVHlwZUlkKSB7CisJCXN1cGVyKGZhbHNlKTsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKKwkJdGhpcy5jcmVhdGlvbiA9IGNyZWF0aW9uOworCQkKKwkJZmlsbFRyZWUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBmaWxsVHJlZSgpIHsKKwkJY2xlYW4oKTsKKwkJTGlzdDxUcmVlRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VHJlZUVsZW1lbnQ+KCk7CisJCUlSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcyA9IFNlcnZlclV0aWwuZ2V0UnVudGltZVR5cGVzKHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpOworCQlpZiAocnVudGltZVR5cGVzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZVR5cGVzW2ldOworCQkJCWlmICghY3JlYXRpb24gfHwgcnVudGltZVR5cGUuY2FuQ3JlYXRlKCkpIHsKKwkJCQkJVHJlZUVsZW1lbnQgZWxlID0gZ2V0T3JDcmVhdGUobGlzdCwgcnVudGltZVR5cGUuZ2V0VmVuZG9yKCkpOworCQkJCQllbGUuY29udGVudHMuYWRkKHJ1bnRpbWVUeXBlKTsKKwkJCQkJZWxlbWVudFRvUGFyZW50TWFwLnB1dChydW50aW1lVHlwZSwgZWxlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTczYzZiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKy8qKgorICogUnVudGltZSB0eXBlIGxhYmVsIHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgUnVudGltZVR5cGVUcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIgeworCS8qKgorCSAqIFJ1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgUnVudGltZVR5cGVUcmVlTGFiZWxQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICogCisJICogQHBhcmFtIGRlY29yYXRvciBhIGxhYmVsIGRlY29yYXRvciwgb3IgbnVsbCBpZiBubyBkZWNvcmF0b3IgaXMgcmVxdWlyZWQKKwkgKi8KKwlwdWJsaWMgUnVudGltZVR5cGVUcmVlTGFiZWxQcm92aWRlcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7CisJCXN1cGVyKGRlY29yYXRvcik7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJvdGVjdGVkIEltYWdlIGdldEltYWdlSW1wbChPYmplY3QgZWxlbWVudCkgeworCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSAoSVJ1bnRpbWVUeXBlKSBlbGVtZW50OworCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lVHlwZS5nZXRJZCgpKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHRJbXBsKE9iamVjdCBlbGVtZW50KSB7CisJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGVsZW1lbnQ7CisJCXJldHVybiBub3ROdWxsKHJ1bnRpbWVUeXBlLmdldE5hbWUoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODhiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlckNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbHRlcmVkVHJlZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5TZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXI7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgU2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29tcG9zaXRlIHsKKwlwcm90ZWN0ZWQgSVNlcnZlciBzZWxlY3Rpb247CisJcHJvdGVjdGVkIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOworCXByb3RlY3RlZCBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsU2VsZWN0aW9uID0gdHJ1ZTsKKworCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGU7CisJcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zOworCisJcHVibGljIGludGVyZmFjZSBTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciB7CisJCXB1YmxpYyB2b2lkIHNlcnZlclNlbGVjdGVkKElTZXJ2ZXIgc2VydmVyKTsKKwl9CisKKwlwdWJsaWMgU2VydmVyQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMiwgSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMubW9kdWxlID0gbW9kdWxlOworCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOworCQkKKwkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyMjsKKwkJCisJCVRyZWUgdHJlZTIgPSB0cmVlVmlld2VyLmdldFRyZWUoKTsKKwkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULlNJTkdMRSk7CisJCWNvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLnZpZXdTZXJ2ZXIpOworCQljb2x1bW4uc2V0V2lkdGgoMzI1KTsKKwkJCisJCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuU0lOR0xFKTsKKwkJY29sdW1uMi5zZXRUZXh0KE1lc3NhZ2VzLnZpZXdTdGF0ZSk7CisJCWNvbHVtbjIuc2V0V2lkdGgoMTAwKTsKKwkJCisJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyKG1vZHVsZSwgbGF1bmNoTW9kZSk7CisJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7CisJCQorCQkvL0lMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgU2VydmVyVHJlZUxhYmVsUHJvdmlkZXIoKTsKKwkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIoKTsKKwkJbGFiZWxQcm92aWRlci5hZGRMaXN0ZW5lcihuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQlPYmplY3RbXSBvYmogPSBldmVudC5nZXRFbGVtZW50cygpOworCQkJCWlmIChvYmogPT0gbnVsbCkKKwkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKHRydWUpOworCQkJCWVsc2UgeworCQkJCQlvYmogPSBTZXJ2ZXJVSVBsdWdpbi5hZGFwdExhYmVsQ2hhbmdlT2JqZWN0cyhvYmopOworCQkJCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKG9ialtpXSwgdHJ1ZSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOworCQl0cmVlVmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKKwkJdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDEpOworCQkKKwkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKSB7CisJCQkJCXNlbGVjdGlvbiA9IChJU2VydmVyKSBvYmo7CisJCQkJCXNldERlc2NyaXB0aW9uKHNlbGVjdGlvbi5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXREZXNjcmlwdGlvbigpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzZWxlY3Rpb24gPSBudWxsOworCQkJCQlzZXREZXNjcmlwdGlvbigiIik7CisJCQkJfQorCQkJCWxpc3RlbmVyLnNlcnZlclNlbGVjdGVkKHNlbGVjdGlvbik7CisJCQl9CisJCX0pOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRyZWUoKSB7CisJCXRyZWUgPSBuZXcgRmlsdGVyZWRUcmVlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OLCBuZXcgU2VydmVyUGF0dGVybkZpbHRlcigpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYm9vbGVhbiBiKSB7CisJCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7CisJCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJY29udGVudFByb3ZpZGVyLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhiKTsKKwkJdHJlZVZpZXdlci5yZWZyZXNoKCk7CisJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCwgdHJ1ZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJaWYgKHZpc2libGUgJiYgaW5pdGlhbFNlbGVjdGlvbikgeworCQkJaW5pdGlhbFNlbGVjdGlvbiA9IGZhbHNlOworCQkJZGVmZXJJbml0aWFsaXphdGlvbigpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgcmVmcmVzaEFsbCgpIHsKKwkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOworCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlcihtb2R1bGUsIGxhdW5jaE1vZGUpOworCQljb250ZW50UHJvdmlkZXIuc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyk7CisJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7CisJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlTGFiZWwoKSB7CisJCXJldHVybiBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJTZWxlY3RFeGlzdGluZzsKKwl9CisKKwlwdWJsaWMgSVNlcnZlciBnZXRTZWxlY3RlZFNlcnZlcigpIHsKKwkJcmV0dXJuIHNlbGVjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlcnZlciBzZXJ2ZXIpIHsKKwkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VydmVyKSwgdHJ1ZSk7CisJCWVsc2UKKwkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGRlZmVySW5pdGlhbGl6YXRpb24oKSB7CisJCUpvYiBqb2IgPSBuZXcgSm9iKE1lc3NhZ2VzLmpvYkluaXRpYWxpemluZ1NlcnZlcnNWaWV3KSB7CisJCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlpZiAoY29udGVudFByb3ZpZGVyLmdldEluaXRpYWxTZWxlY3Rpb24obW9kdWxlLmdldFByb2plY3QoKSkgIT0gbnVsbCkKKwkJCQkJCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29udGVudFByb3ZpZGVyLmdldEluaXRpYWxTZWxlY3Rpb24obW9kdWxlLmdldFByb2plY3QoKSkpLCB0cnVlKTsKKwkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJLy8gaWdub3JlIC0gd2l6YXJkIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KTsKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0KKwkJfTsKKwkJCisJCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7CisJCWpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOworCQlqb2Iuc2NoZWR1bGUoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJQYXR0ZXJuRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclBhdHRlcm5GaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFlODllCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJQYXR0ZXJuRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlBhdHRlcm5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKKworcHVibGljIGNsYXNzIFNlcnZlclBhdHRlcm5GaWx0ZXIgZXh0ZW5kcyBQYXR0ZXJuRmlsdGVyIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xlYWZNYXRjaChWaWV3ZXIgdmlld2VyLCBPYmplY3QgZWxlbWVudCkgeworCQlib29sZWFuIGIgPSBzdXBlci5pc0xlYWZNYXRjaCh2aWV3ZXIsIGVsZW1lbnQpOworCQlpZiAoYikKKwkJCXJldHVybiB0cnVlOworCQkKKwkJT2JqZWN0IHBhcmVudCA9ICgoSVRyZWVDb250ZW50UHJvdmlkZXIpICgoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXIpCisJCQkJLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRQYXJlbnQoZWxlbWVudCk7CisJCWlmIChwYXJlbnQgIT0gbnVsbCkgeworCQkJU3RyaW5nIGxhYmVsVGV4dCA9ICgoSUxhYmVsUHJvdmlkZXIpICgoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyKS5nZXRMYWJlbFByb3ZpZGVyKCkpCisJCQkJCS5nZXRUZXh0KHBhcmVudCk7CisJCQkKKwkJCWlmIChsYWJlbFRleHQgIT0gbnVsbCAmJiB3b3JkTWF0Y2hlcyhsYWJlbFRleHQpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSAmJiBtYXRjaGVzUnVudGltZVR5cGUoKElSdW50aW1lVHlwZSkgZWxlbWVudCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZSAmJiBtYXRjaGVzUnVudGltZSgoSVJ1bnRpbWUpIGVsZW1lbnQpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUgJiYgbWF0Y2hlc1NlcnZlclR5cGUoKElTZXJ2ZXJUeXBlKSBlbGVtZW50KSkKKwkJCXJldHVybiB0cnVlOworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIgJiYgbWF0Y2hlc1NlcnZlcigoSVNlcnZlcikgZWxlbWVudCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzTW9kdWxlVHlwZShJTW9kdWxlVHlwZSBtdCkgeworCQlTdHJpbmcgdGV4dCA9IG10LmdldE5hbWUoKTsKKwkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQorCQkJcmV0dXJuIHRydWU7CisJCXRleHQgPSBtdC5nZXRWZXJzaW9uKCk7CisJCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc1J1bnRpbWVUeXBlKElSdW50aW1lVHlwZSBydCkgeworCQlTdHJpbmcgdGV4dCA9IHJ0LmdldE5hbWUoKTsKKwkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQorCQkJcmV0dXJuIHRydWU7CisJCXRleHQgPSBydC5nZXREZXNjcmlwdGlvbigpOworCQlpZiAod29yZE1hdGNoZXModGV4dCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJdGV4dCA9IHJ0LmdldFZlbmRvcigpOworCQlpZiAod29yZE1hdGNoZXModGV4dCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJdGV4dCA9IHJ0LmdldFZlcnNpb24oKTsKKwkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlJTW9kdWxlVHlwZVtdIG10cyA9IHJ0LmdldE1vZHVsZVR5cGVzKCk7CisJCWlmIChtdHMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBtdHMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAobWF0Y2hlc01vZHVsZVR5cGUobXRzW2ldKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNSdW50aW1lKElSdW50aW1lIHIpIHsKKwkJU3RyaW5nIHRleHQgPSByLmdldE5hbWUoKTsKKwkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgeworCQkJdGV4dCA9IHIuZ2V0TG9jYXRpb24oKS50b1BvcnRhYmxlU3RyaW5nKCk7CisJCQlpZiAod29yZE1hdGNoZXModGV4dCkpCisJCQkJcmV0dXJuIHRydWU7CisJCQl0ZXh0ID0gci5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKKwkJCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoci5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYgbWF0Y2hlc1J1bnRpbWVUeXBlKHIuZ2V0UnVudGltZVR5cGUoKSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNTZXJ2ZXJUeXBlKElTZXJ2ZXJUeXBlIHN0KSB7CisJCVN0cmluZyB0ZXh0ID0gc3QuZ2V0RGVzY3JpcHRpb24oKTsKKwkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChzdC5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYgbWF0Y2hlc1J1bnRpbWVUeXBlKHN0LmdldFJ1bnRpbWVUeXBlKCkpKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzU2VydmVyKElTZXJ2ZXIgc3QpIHsKKwkJU3RyaW5nIHRleHQgPSBzdC5nZXROYW1lKCk7CisJCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKKwkJCXJldHVybiB0cnVlOworCQlpZiAoc3QuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgbWF0Y2hlc1NlcnZlclR5cGUoc3QuZ2V0U2VydmVyVHlwZSgpKSkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4YTE2YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworLyoqCisgKiBSdW50aW1lIHR5cGUgY29udGVudCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIgeworCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGU7CisJcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zOworCisJLyoqCisJICogU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7CisJCXN1cGVyKGZhbHNlKTsKKwkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7CisJCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7CisJCQorCQlmaWxsVHJlZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYm9vbGVhbiBiKSB7CisJCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7CisJCWZpbGxUcmVlKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGZpbGxUcmVlKCkgeworCQljbGVhbigpOworCQlMaXN0PFRyZWVFbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUcmVlRWxlbWVudD4oKTsKKwkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKKwkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJaWYgKGFjY2VwdFNlcnZlcihzZXJ2ZXJzW2ldKSkgeworCQkJCQlUcmVlRWxlbWVudCB0ZSA9IGdldE9yQ3JlYXRlKGxpc3QsIHNlcnZlcnNbaV0uZ2V0SG9zdCgpKTsKKwkJCQkJdGUuY29udGVudHMuYWRkKHNlcnZlcnNbaV0pOworCQkJCQllbGVtZW50VG9QYXJlbnRNYXAucHV0KHNlcnZlcnNbaV0sIHRlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IGxhdW5jaE1vZGUgPT0gbnVsbCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAoIVNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlciwgbGF1bmNoTW9kZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7CisJCWlmIChpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMpIHsKKwkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbXQuZ2V0SWQoKSwgbnVsbCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgeworCQkJaWYgKCFTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpLCBtdC5nZXRJZCgpLCBtdC5nZXRWZXJzaW9uKCkpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclR5cGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGQ0NTNlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5leHRlbnNpb24uRXh0ZW5zaW9uVXRpbGl0eTsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29tcG9zaXRlIHsKKwlwcm90ZWN0ZWQgSVNlcnZlclR5cGUgc2VsZWN0aW9uOworCXByb3RlY3RlZCBTZXJ2ZXJUeXBlU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7CisJcHJvdGVjdGVkIFNlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsU2VsZWN0aW9uID0gdHJ1ZTsKKworCXByb3RlY3RlZCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlOworCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyVHlwZUlkOworCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2NhbGhvc3Q7CisJcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zOworCisJcHVibGljIGludGVyZmFjZSBTZXJ2ZXJUeXBlU2VsZWN0aW9uTGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCBzZXJ2ZXJUeXBlU2VsZWN0ZWQoSVNlcnZlclR5cGUgdHlwZSk7CisJfQorCisJcHVibGljIFNlcnZlclR5cGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgU2VydmVyVHlwZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMikgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOworCQkKKwkJdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKKwkJdGhpcy5zZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXJUeXBlSWQ7CisJCQorCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIobW9kdWxlVHlwZSwgc2VydmVyVHlwZUlkKTsKKwkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKKwkJCisJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyKCk7CisJCWxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKKwkJCQlpZiAob2JqID09IG51bGwpCisJCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKKwkJCQllbHNlIHsKKwkJCQkJb2JqID0gU2VydmVyVUlQbHVnaW4uYWRhcHRMYWJlbENoYW5nZU9iamVjdHMob2JqKTsKKwkJCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChvYmpbaV0sIHRydWUpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKKwkJdHJlZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7CisKKwkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkgeworCQkJCQlzZWxlY3Rpb24gPSAoSVNlcnZlclR5cGUpIG9iajsKKwkJCQkJc2V0RGVzY3JpcHRpb24oc2VsZWN0aW9uLmdldERlc2NyaXB0aW9uKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXNlbGVjdGlvbiA9IG51bGw7CisJCQkJCXNldERlc2NyaXB0aW9uKCIiKTsKKwkJCQl9CisJCQkJbGlzdGVuZXIuc2VydmVyVHlwZVNlbGVjdGVkKHNlbGVjdGlvbik7CisJCQl9CisJCX0pOworCQkKKwkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IERlZmF1bHRWaWV3ZXJTb3J0ZXIoKSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJaWYgKHZpc2libGUgJiYgaW5pdGlhbFNlbGVjdGlvbikgeworCQkJaW5pdGlhbFNlbGVjdGlvbiA9IGZhbHNlOworCQkJZGVmZXJJbml0aWFsaXphdGlvbigpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZGVmZXJJbml0aWFsaXphdGlvbigpIHsKKwkJSm9iIGpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXcpIHsKKwkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWlmIChjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbigpICE9IG51bGwpCisJCQkJCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkpLCB0cnVlKTsKKwkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJLy8gaWdub3JlIC0gd2l6YXJkIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KTsKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0KKwkJfTsKKwkJCisJCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7CisJCWpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOworCQlqb2Iuc2NoZWR1bGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzZXRIb3N0KGJvb2xlYW4gbmV3SG9zdCkgeworCQlpZiAoaXNMb2NhbGhvc3QgPT0gbmV3SG9zdCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlzTG9jYWxob3N0ID0gbmV3SG9zdDsKKwkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOworCQljb250ZW50UHJvdmlkZXIuc2V0TG9jYWxob3N0KGlzTG9jYWxob3N0KTsKKwkJdHJlZVZpZXdlci5yZWZyZXNoKCk7CisJCS8vdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOworCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwsIHRydWUpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYm9vbGVhbiBiKSB7CisJCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7CisJCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJY29udGVudFByb3ZpZGVyLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhiKTsKKwkJdHJlZVZpZXdlci5yZWZyZXNoKCk7CisJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCwgdHJ1ZSk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlTGFiZWwoKSB7CisJCXJldHVybiBNZXNzYWdlcy5zZXJ2ZXJUeXBlQ29tcExhYmVsOworCX0KKworCXB1YmxpYyBJU2VydmVyVHlwZSBnZXRTZWxlY3RlZFNlcnZlclR5cGUoKSB7CisJCXJldHVybiBzZWxlY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKwkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOworCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIobW9kdWxlVHlwZSwgc2VydmVyVHlwZUlkKSk7CisJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxzTGFiZWwoKSB7CisJCXJldHVybiBNZXNzYWdlcy5pbnN0YWxsYWJsZVNlcnZlckxpbms7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsb3NlV2l6YXJkKENvbXBvc2l0ZSBjb21wKSB7CisJCWlmIChjb21wID09IG51bGwgfHwgY29tcC5pc0Rpc3Bvc2VkKCkpCisJCQlyZXR1cm47CisJCUNvbXBvc2l0ZSBjID0gY29tcC5nZXRQYXJlbnQoKTsKKwkJaWYgKGMgaW5zdGFuY2VvZiBTaGVsbCkgeworCQkJU2hlbGwgcyA9IChTaGVsbCkgYzsKKwkJCXMuY2xvc2UoKTsKKwkJfQorCQljbG9zZVdpemFyZChjKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkZXRhaWxzU2VsZWN0ZWQoKSB7CisJCWlmIChFeHRlbnNpb25VdGlsaXR5LmxhdW5jaEV4dGVuc2lvbldpemFyZChnZXRTaGVsbCgpLCBNZXNzYWdlcy53aXpOZXdJbnN0YWxsYWJsZVNlcnZlclRpdGxlLAorCQkJCU1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyRGVzY3JpcHRpb24pKSB7CisJCQkvL3JlZnJlc2goKTsKKwkJCWNsb3NlV2l6YXJkKHRoaXMpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNmM2U0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CisvKioKKyAqIFNlcnZlciB0eXBlIGNvbnRlbnQgcHJvdmlkZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciB7CisJcHJvdGVjdGVkIGJvb2xlYW4gbG9jYWxob3N0OworCisJcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGU7CisJcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJUeXBlSWQ7CisJcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zOworCisJLyoqCisJICogU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIG1vZHVsZVR5cGUgYSBtb2R1bGUgdHlwZQorCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQgYSBzZXJ2ZXIgdHlwZSBpZCwgb3IgbnVsbCB0byBtYXRjaCBhbnkgaWQKKwkgKi8KKwlwdWJsaWMgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHNlcnZlclR5cGVJZCkgeworCQlzdXBlcihmYWxzZSk7CisJCWxvY2FsaG9zdCA9IHRydWU7CisJCQorCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOworCQl0aGlzLnNlcnZlclR5cGVJZCA9IHNlcnZlclR5cGVJZDsKKwkJCisJCWZpbGxUcmVlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGZpbGxUcmVlKCkgeworCQljbGVhbigpOworCisJCUxpc3Q8VHJlZUVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFRyZWVFbGVtZW50PigpOworCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOworCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXJUeXBlc1tpXTsKKwkJCQlpZiAoaW5jbHVkZShzZXJ2ZXJUeXBlKSkgeworCQkJCQl0cnkgeworCQkJCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOworCQkJCQkJVHJlZUVsZW1lbnQgZWxlID0gZ2V0T3JDcmVhdGUobGlzdCwgcnVudGltZVR5cGUuZ2V0VmVuZG9yKCkpOworCQkJCQkJZWxlLmNvbnRlbnRzLmFkZChzZXJ2ZXJUeXBlKTsKKwkJCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQoc2VydmVyVHlwZSwgZWxlKTsKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBpbiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBjb250ZW50IHByb3ZpZGVyIiwgZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKKwkJaWYgKHNlcnZlclR5cGVJZCAhPSBudWxsICYmICFzZXJ2ZXJUeXBlLmdldElkKCkuc3RhcnRzV2l0aChzZXJ2ZXJUeXBlSWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOworCQlpZiAocnVudGltZVR5cGUgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCVN0cmluZyBtb2R1bGVUeXBlSWQgPSBudWxsOworCQlpZiAobW9kdWxlVHlwZSAhPSBudWxsKQorCQkJbW9kdWxlVHlwZUlkID0gbW9kdWxlVHlwZS5nZXRJZCgpOworCQlpZiAoaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKSB7CisJCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlVHlwZUlkLCBudWxsKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgbW9kdWxlVmVyc2lvbiA9IG51bGw7CisJCQlpZiAobW9kdWxlVHlwZSAhPSBudWxsKQorCQkJCW1vZHVsZVZlcnNpb24gPSBtb2R1bGVUeXBlLmdldFZlcnNpb24oKTsKKwkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCBtb2R1bGVUeXBlSWQsIG1vZHVsZVZlcnNpb24pKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJaWYgKGxvY2FsaG9zdCB8fCBzZXJ2ZXJUeXBlLnN1cHBvcnRzUmVtb3RlSG9zdHMoKSkKKwkJCXJldHVybiB0cnVlOworCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGNoZWNrRm9yTm9uU3R1YkVudmlyb25tZW50UnVudGltZShJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7CisJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKKwkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlclVJUGx1Z2luLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKTsKKwkJaWYgKHJ1bnRpbWVzID09IG51bGwgfHwgcnVudGltZXMubGVuZ3RoID09IDApCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmICghcnVudGltZXNbaV0uaXNTdHViKCkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExvY2FsaG9zdChib29sZWFuIGxvY2FsKSB7CisJCWxvY2FsaG9zdCA9IGxvY2FsOworCQlmaWxsVHJlZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhib29sZWFuIGIpIHsKKwkJaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zID0gYjsKKwkJZmlsbFRyZWUoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3MjIzMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworLyoqCisgKiBTZXJ2ZXIgdHlwZSBsYWJlbCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIgeworCS8qKgorCSAqIFNlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBTZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICogCisJICogQHBhcmFtIGRlY29yYXRvciBhIGxhYmVsIGRlY29yYXRvciwgb3IgbnVsbCBpZiBubyBkZWNvcmF0b3IgaXMgcmVxdWlyZWQKKwkgKi8KKwlwdWJsaWMgU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKKwkJc3VwZXIoZGVjb3JhdG9yKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VJbXBsKE9iamVjdCBlbGVtZW50KSB7CisJCUlTZXJ2ZXJUeXBlIHR5cGUgPSAoSVNlcnZlclR5cGUpIGVsZW1lbnQ7CisJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKHR5cGUuZ2V0SWQoKSk7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0SW1wbChPYmplY3QgZWxlbWVudCkgeworCQlJU2VydmVyVHlwZSB0eXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OworCQlyZXR1cm4gbm90TnVsbCh0eXBlLmdldE5hbWUoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvVmVyc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9WZXJzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5NzBjOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvVmVyc2lvbi5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK3B1YmxpYyBjbGFzcyBWZXJzaW9uIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIi4iOworCisJcHJpdmF0ZSBTdHJpbmdbXSB2ZXJzaW9uOworCisJcHVibGljIFZlcnNpb24oU3RyaW5nIHMpIHsKKwkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCBTRVBBUkFUT1IpOworCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkKKwkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOworCQkJaW50IHNpemUgPSBzdHIubGVuZ3RoKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWlmICghQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChzdHIuY2hhckF0KGkpKSkKKwkJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiVmVyc2lvbiBzdHJpbmdzIGNhbm5vdCBjb250YWluICciICsgc3RyLmNoYXJBdChpKSArICInIik7CisJCQl9CisJCQlsaXN0LmFkZChzdHIpOworCQl9CisJCQorCQl2ZXJzaW9uID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07CisJCWxpc3QudG9BcnJheSh2ZXJzaW9uKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFZlcnNpb24gcGFyc2VWZXJzaW9uKFN0cmluZyBzKSB7CisJCXJldHVybiBuZXcgVmVyc2lvbihzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKFZlcnNpb24gdjEsIFZlcnNpb24gdjIpIHsKKwkJaW50IHYxbCA9IHYxLnZlcnNpb24ubGVuZ3RoOworCQlpbnQgdjJsID0gdjIudmVyc2lvbi5sZW5ndGg7CisJCQorCQlpbnQgc2l6ZSA9IE1hdGgubWluKHYxbCwgdjJsKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJZG91YmxlIGQxID0gRG91YmxlLnBhcnNlRG91YmxlKHYxLnZlcnNpb25baV0pOworCQkJCWRvdWJsZSBkMiA9IERvdWJsZS5wYXJzZURvdWJsZSh2Mi52ZXJzaW9uW2ldKTsKKwkJCQkKKwkJCQlpbnQgYyA9IERvdWJsZS5jb21wYXJlKGQxLCBkMik7CisJCQkJaWYgKGMgIT0gMCkKKwkJCQkJcmV0dXJuIGM7CisJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCQkKKwkJCWludCBjID0gdjEudmVyc2lvbltpXS5jb21wYXJlVG8odjIudmVyc2lvbltpXSk7CisJCQlpZiAoYyAhPSAwKQorCQkJCXJldHVybiBjOworCQl9CisJCWlmICh2MWwgPT0gdjJsKQorCQkJcmV0dXJuIDA7CisJCWlmICh2MWwgPiB2MmwpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIC0xOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAyZTIwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9PcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3NlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOworLyoqCisgKiBBY3Rpb24gdG8gb3BlbiB0aGUgV2ViIGJyb3N3ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBPcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7CisJLyoqCisJICogT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogRGlzcG9zZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUuICBUaGUgaW1wbGVtZW50b3Igc2hvdWxkIHVuaG9vayBhbnkgcmVmZXJlbmNlcworCSAqIHRvIGl0c2VsZiBzbyB0aGF0IGdhcmJhZ2UgY29sbGVjdGlvbiBjYW4gb2NjdXIuCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHdpdGggdGhlIHdvcmtiZW5jaCB3aW5kb3cgaXQgd2lsbCB3b3JrIGluLgorCSAqCisJICogQHBhcmFtIHdpbmRvdyB0aGUgd2luZG93IHRoYXQgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgZGVsZWdhdGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4KKwkgKiA8cD4KKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZGVsZWdhdGluZyBhY3Rpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLgorCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyB0aGUgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlCisJICogICBhY3Rpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKKwkJdHJ5IHsKKwkJCUlXb3JrYmVuY2hCcm93c2VyU3VwcG9ydCBicm93c2VyU3VwcG9ydCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKKwkJCUlXZWJCcm93c2VyIGJyb3dzZXIgPSBicm93c2VyU3VwcG9ydC5jcmVhdGVCcm93c2VyKElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5MT0NBVElPTl9CQVIgfCBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTkFWSUdBVElPTl9CQVIsIG51bGwsIG51bGwsIG51bGwpOworCQkJYnJvd3Nlci5vcGVuVVJMKG51bGwpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igb3BlbmluZyBicm93c2VyIiwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB0aGF0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaCBoYXMgY2hhbmdlZC4KKwkgKiA8cD4KKwkgKiBJbXBsZW1lbnRlcnMgY2FuIHVzZSB0aGlzIG9wcG9ydHVuaXR5IHRvIGNoYW5nZSB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZQorCSAqIGFjdGlvbiBvciB0byBtb2RpZnkgb3RoZXIgcHJlc2VudGF0aW9uIHByb3BlcnRpZXMuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgYWN0aW9uCisJICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL1N3aXRjaEJyb3dzZXJXb3JrYmVuY2hBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGYwZjYyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5Ccm93c2VyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklCcm93c2VyRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJQcmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV2ViQnJvd3NlclV0aWw7CisvKioKKyAqIEFjdGlvbiB0byBvcGVuIHRoZSBXZWIgYnJvc3dlci4KKyAqLworcHVibGljIGNsYXNzIFN3aXRjaEJyb3dzZXJXb3JrYmVuY2hBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTIgeworCS8qKgorCSAqIFRoZSBtZW51IGNyZWF0ZWQgYnkgdGhpcyBhY3Rpb24KKwkgKi8KKwlwcml2YXRlIE1lbnUgZk1lbnU7CisJCQorCXByb3RlY3RlZCBib29sZWFuIHJlY3JlYXRlTWVudSA9IGZhbHNlOworCisJLyoqCisJICogU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBTd2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXNldE1lbnUobnVsbCk7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhpcyBhY3Rpb24ncyBkcm9wLWRvd24gbWVudSwgZGlzcG9zaW5nIHRoZSBwcmV2aW91cyBtZW51LgorCSAqIAorCSAqIEBwYXJhbSBtZW51IHRoZSBuZXcgbWVudQorCSAqLworCXByaXZhdGUgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgeworCQlpZiAoZk1lbnUgIT0gbnVsbCkgeworCQkJZk1lbnUuZGlzcG9zZSgpOworCQl9CisJCWZNZW51ID0gbWVudTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisJCisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gYWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbWVudSB3aXRoIGFuIGFjY2VsZXJhdG9yIHNwZWNpZmllZAorCSAqIGJ5IHRoZSBnaXZlbiBudW1iZXIuCisJICogCisJICogQHBhcmFtIG1lbnUgdGhlIG1lbnUgdG8gYWRkIHRoZSBhY3Rpb24gdG8KKwkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gYWRkCisJICogQHBhcmFtIGFjY2VsZXJhdG9yIHRoZSBudW1iZXIgdGhhdCBzaG91bGQgYXBwZWFyIGFzIGFuIGFjY2VsZXJhdG9yCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KE1lbnUgbWVudSwgSUFjdGlvbiBhY3Rpb24sIGludCBhY2NlbGVyYXRvcikgeworCQlTdHJpbmdCdWZmZXIgbGFiZWw9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJaWYgKGFjY2VsZXJhdG9yID49IDAgJiYgYWNjZWxlcmF0b3IgPCAxMCkgeworCQkJLy9hZGQgdGhlIG51bWVyaWNhbCBhY2NlbGVyYXRvcgorCQkJbGFiZWwuYXBwZW5kKCcmJyk7CisJCQlsYWJlbC5hcHBlbmQoYWNjZWxlcmF0b3IpOworCQkJbGFiZWwuYXBwZW5kKCcgJyk7CisJCX0KKwkJbGFiZWwuYXBwZW5kKGFjdGlvbi5nZXRUZXh0KCkpOworCQlhY3Rpb24uc2V0VGV4dChsYWJlbC50b1N0cmluZygpKTsKKwkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOworCQlpdGVtLmZpbGwobWVudSwgLTEpOworCX0KKworCS8qKgorCSAqIEZpbGxzIHRoZSBkcm9wLWRvd24gbWVudSB3aXRoIGZhdm9yaXRlcyBhbmQgbGF1bmNoIGhpc3RvcnksCisJICogbGF1bmNoIHNob3J0Y3V0cywgYW5kIGFuIGFjdGlvbiB0byBvcGVuIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBkaWFsb2cuCisJICoKKwkgKiBAcGFyYW0gbWVudSB0aGUgbWVudSB0byBmaWxsCisJICovCisJcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KSB7CisJCWludCBpID0gMDsKKwkJaWYgKFdlYkJyb3dzZXJVdGlsLmNhblVzZUludGVybmFsV2ViQnJvd3NlcigpKSB7CisJCQlhZGRUb01lbnUobWVudSwgbmV3IFN3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uKG51bGwsIFdlYkJyb3dzZXJQcmVmZXJlbmNlLmdldEJyb3dzZXJDaG9pY2UoKSA9PSBXZWJCcm93c2VyUHJlZmVyZW5jZS5JTlRFUk5BTCwgbnVsbCksIGkrKyk7CisJCX0KKwkJSUJyb3dzZXJEZXNjcmlwdG9yIGN1cnJlbnQgPSBCcm93c2VyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRXZWJCcm93c2VyKCk7CisJCUJyb3dzZXJNYW5hZ2VyIGJyb3dzZXJNYW5hZ2VyID0gQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBicm93c2VyTWFuYWdlci5nZXRXZWJCcm93c2VycygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCUlCcm93c2VyRGVzY3JpcHRvciBicm93c2VyID0gKElCcm93c2VyRGVzY3JpcHRvcikgaXRlcmF0b3IubmV4dCgpOworCQkJYWRkVG9NZW51KG1lbnUsIG5ldyBTd2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbihicm93c2VyLCBXZWJCcm93c2VyUHJlZmVyZW5jZS5nZXRCcm93c2VyQ2hvaWNlKCkgIT0gV2ViQnJvd3NlclByZWZlcmVuY2UuSU5URVJOQUwgJiYgYnJvd3Nlci5lcXVhbHMoY3VycmVudCksIGJyb3dzZXJNYW5hZ2VyKSwgaSsrKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1lbnUgZm9yIHRoZSBhY3Rpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5pdE1lbnUoKSB7CisJCS8vIEFkZCBsaXN0ZW5lciB0byByZXBvcHVsYXRlIHRoZSBtZW51IGVhY2ggdGltZQorCQkvLyBpdCBpcyBzaG93biBiZWNhdXNlIG9mIGR5bmFtaWMgaGlzdG9yeSBsaXN0CisJCWZNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKKwkJCQkvL2lmIChyZWNyZWF0ZU1lbnUpIHsKKwkJCQkJTWVudSBtID0gKE1lbnUpIGUud2lkZ2V0OworCQkJCQlNZW51SXRlbVtdIGl0ZW1zID0gbS5nZXRJdGVtcygpOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlpdGVtc1tpXS5kaXNwb3NlKCk7CisJCQkJCX0KKwkJCQkJZmlsbE1lbnUobSk7CisJCQkJCXJlY3JlYXRlTWVudSA9IGZhbHNlOworCQkJCS8vfQorCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQkvLyBkbyBub3RoaW5nCisJfQorCQorCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgeworCQlzZXRNZW51KG5ldyBNZW51KHBhcmVudCkpOworCQkvL2ZpbGxNZW51KGZNZW51KTsKKwkJaW5pdE1lbnUoKTsKKwkJcmV0dXJuIGZNZW51OworCX0KKworCXB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKKwkJc2V0TWVudShuZXcgTWVudShwYXJlbnQpKTsKKwkJLy9maWxsTWVudShmTWVudSk7CisJCWluaXRNZW51KCk7CisJCXJldHVybiBmTWVudTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjhhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL1N3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuQnJvd3Nlck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5JQnJvd3NlckRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5XZWJCcm93c2VyUHJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworLyoqCisgKiBBY3Rpb24gdG8gb3BlbiB0aGUgV2ViIGJyb3dzZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBTd2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJcHJvdGVjdGVkIElCcm93c2VyRGVzY3JpcHRvciB3ZWJicm93c2VyOworCXByb3RlY3RlZCBCcm93c2VyTWFuYWdlciBicm93c2VyTWFuYWdlcjsKKworCS8qKgorCSAqIFN3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICogCisJICogQHBhcmFtIHdlYmJyb3dzZXIgYSBicm93c2VyCisJICogQHBhcmFtIGN1cnJlbnQgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IGJyb3dzZXIKKwkgKiBAcGFyYW0gbWFuYWdlciB0aGUgYnJvd3NlciBtYW5hZ2VyCisJICovCisJcHVibGljIFN3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uKElCcm93c2VyRGVzY3JpcHRvciB3ZWJicm93c2VyLCBib29sZWFuIGN1cnJlbnQsIEJyb3dzZXJNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJc3VwZXIoKTsKKwkJCisJCXRoaXMud2ViYnJvd3NlciA9IHdlYmJyb3dzZXI7CisJCXRoaXMuYnJvd3Nlck1hbmFnZXIgPSBtYW5hZ2VyOworCQlpZiAod2ViYnJvd3NlciA9PSBudWxsKQorCQkJc2V0VGV4dChNZXNzYWdlcy5pbnRlcm5hbFdlYkJyb3dzZXJOYW1lKTsKKwkJZWxzZQorCQkJc2V0VGV4dCh3ZWJicm93c2VyLmdldE5hbWUoKSk7CisJCQorCQlpZiAoY3VycmVudCkKKwkJCXNldENoZWNrZWQodHJ1ZSk7CisJfQorCisJLyoqCisJICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlpZiAod2ViYnJvd3NlciA9PSBudWxsKQorCQkJV2ViQnJvd3NlclByZWZlcmVuY2Uuc2V0QnJvd3NlckNob2ljZShXZWJCcm93c2VyUHJlZmVyZW5jZS5JTlRFUk5BTCk7CisJCWVsc2UgeworCQkJV2ViQnJvd3NlclByZWZlcmVuY2Uuc2V0QnJvd3NlckNob2ljZShXZWJCcm93c2VyUHJlZmVyZW5jZS5FWFRFUk5BTCk7CisJCQlicm93c2VyTWFuYWdlci5zZXRDdXJyZW50V2ViQnJvd3Nlcih3ZWJicm93c2VyKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvQWJzdHJhY3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9BYnN0cmFjdFdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZjgyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvQWJzdHJhY3RXaXphcmQuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CisvKioKKyAqIEFuIGFic3RyYWN0IFdpemFyZCB0aGF0IGNvbnRhaW5zIGhlbHBlciBtZXRob2RzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXaXphcmQgZXh0ZW5kcyBXaXphcmQgeworCXByb3RlY3RlZCBJV29ya2JlbmNoIHdvcmtiZW5jaDsKKwlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOworCisJLyoqCisJICogQWJzdHJhY3RXaXphcmQgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgQWJzdHJhY3RXaXphcmQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBjdXJyZW50IHdvcmtiZW5jaC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB3b3JrYmVuY2gKKwkgKi8KKwlwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7CisJCXJldHVybiB3b3JrYmVuY2g7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgd29ya2JlbmNoIGFuZCBjdXJyZW50IHNlbGVjdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3V29ya2JlbmNoCisJICogQHBhcmFtIG5ld1NlbGVjdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBuZXdXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1NlbGVjdGlvbikgeworCQl3b3JrYmVuY2ggPSBuZXdXb3JrYmVuY2g7CisJCXNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL0V4dGVuc2lvbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL0V4dGVuc2lvbldpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDRlOGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvRXh0ZW5zaW9uV2l6YXJkLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkV4dGVuc2lvblV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuRXh0ZW5zaW9uV2l6YXJkRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTGljZW5zZVdpemFyZEZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7CisvKioKKyAqIEEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YWxsYWJsZSBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlbnNpb25XaXphcmQgZXh0ZW5kcyBUYXNrV2l6YXJkIHsKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgRXh0ZW5zaW9uV2l6YXJkLgorCSAqIAorCSAqIEBwYXJhbSB0aXRsZSB0aGUgd2l6YXJkIHRpdGxlCisJICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRlc2NyaXB0aW9uIG1lc3NhZ2UKKwkgKi8KKwlwdWJsaWMgRXh0ZW5zaW9uV2l6YXJkKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIodGl0bGUsIG5ldyBXaXphcmRGcmFnbWVudCgpIHsKKwkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKKwkJCQlsaXN0LmFkZChuZXcgRXh0ZW5zaW9uV2l6YXJkRnJhZ21lbnQoKSk7CisJCQkJbGlzdC5hZGQobmV3IExpY2Vuc2VXaXphcmRGcmFnbWVudCgpKTsKKwkJCQlsaXN0LmFkZChuZXcgV2l6YXJkRnJhZ21lbnQoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQkJCQlJRmVhdHVyZSBpcyA9IChJRmVhdHVyZSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfRkVBVFVSRSk7CisJCQkJCQlpZiAoaXMgIT0gbnVsbCkKKwkJCQkJCQlpbnN0YWxsKGlzKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW52YWxpZGF0ZUxpY2Vuc2UoVGFza01vZGVsIHRhc2tNb2RlbCkgeworCQlJRmVhdHVyZSBpcyA9IChJRmVhdHVyZSkgdGFza01vZGVsLmdldE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0ZFQVRVUkUpOworCQlJRmVhdHVyZSBscyA9IChJRmVhdHVyZSkgdGFza01vZGVsLmdldE9iamVjdChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9TRVJWRVIpOworCQlpZiAoaXMgPT0gbHMpCisJCQlyZXR1cm47CisJCQorCQl0YXNrTW9kZWwucHV0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFLCBMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9VTktOT1dOKTsKKwkJdGFza01vZGVsLnB1dE9iamVjdChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9BQ0NFUFQsIG51bGwpOworCQl0YXNrTW9kZWwucHV0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX1NFUlZFUiwgbnVsbCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUxpY2Vuc2UoSVdpemFyZEhhbmRsZSB3aXphcmQsIGZpbmFsIFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKKwkJZmluYWwgSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgdGFza01vZGVsLmdldE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0ZFQVRVUkUpOworCQlJRmVhdHVyZSBscyA9IChJRmVhdHVyZSkgdGFza01vZGVsLmdldE9iamVjdChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9TRVJWRVIpOworCQlpZiAoZmVhdHVyZS5lcXVhbHMobHMpKQorCQkJcmV0dXJuOworCQkKKwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQlTdHJpbmcgbGljZW5zZSA9IExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX1VOS05PV047CisJCQkJbGljZW5zZSA9IEV4dGVuc2lvblV0aWxpdHkuZ2V0TGljZW5zZShmZWF0dXJlKTsKKwkJCQlpZiAobGljZW5zZSA9PSBudWxsKQorCQkJCQlsaWNlbnNlID0gTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfTk9ORTsKKwkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFLCBsaWNlbnNlKTsKKwkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX1NFUlZFUiwgZmVhdHVyZSk7CisJCQl9CisJCX07CisJCQorCQl0cnkgeworCQkJd2l6YXJkLnJ1bih0cnVlLCBmYWxzZSwgcnVubmFibGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2l0aCBydW5uYWJsZSIsIGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwkvKioKKwkgKiBJbnN0YWxsIGEgbmV3IGZlYXR1cmUuCisJICogQHBhcmFtIGZlYXR1cmUKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5zdGFsbChmaW5hbCBJRmVhdHVyZSBmZWF0dXJlKSB7CisJCWlmIChmZWF0dXJlID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlmaW5hbCBib29sZWFuW10gYiA9IG5ldyBib29sZWFuWzFdOworCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKKwkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyQ29uZmlybSwgZmVhdHVyZS5nZXRMYWJlbCgpKTsKKwkJCQliWzBdID0gTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCksCisJCQkJCU1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgbXNnKTsKKwkJCX0KKwkJfSk7CisJCWlmICghYlswXSkKKwkJCXJldHVybjsKKwkJCisJCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJKb2IsIGZlYXR1cmUuZ2V0TGFiZWwoKSk7CisJCUpvYiBqb2IgPSBuZXcgSm9iKG5hbWUpIHsKKwkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQl0cnkgeworCQkJCQlFeHRlbnNpb25VdGlsaXR5Lmluc3RhbGwoZmVhdHVyZSwgbW9uaXRvcik7CisJCQkJCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJCQlwcm9tcHRSZXN0YXJ0KCk7CisJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJam9iLnNldFVzZXIodHJ1ZSk7CisJCWpvYi5zY2hlZHVsZSgpOworCX0KKworCS8qKgorCSAqIFByb21wdCB0aGUgdXNlciB0byByZXN0YXJ0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9tcHRSZXN0YXJ0KCkgeworCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKKwkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCksCisJCQkJCQlNZXNzYWdlcy5kZWZhdWx0RGlhbG9nVGl0bGUsIE1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyUmVzdGFydCkpIHsKKwkJCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCJSZXN0YXJ0IHRocmVhZCIpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlzbGVlcCgxMDAwKTsKKwkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCQkvLyBpZ25vcmUKKwkJCQkJCQl9CisJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlc3RhcnQoKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0pOworCQkJCQkJfQorCQkJCQl9OworCQkJCQl0LnNldERhZW1vbih0cnVlKTsKKwkJCQkJdC5zdGFydCgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9Nb2RpZnlNb2R1bGVzV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTW9kaWZ5TW9kdWxlc1dpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZGMxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTW9kaWZ5TW9kdWxlc1dpemFyZC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKKy8qKgorICogQSB3aXphcmQgdXNlZCB0byBhZGQgYW5kIHJlbW92ZSBtb2R1bGVzLgorICovCitwdWJsaWMgY2xhc3MgTW9kaWZ5TW9kdWxlc1dpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgeworCXN0YXRpYyBjbGFzcyBNb2RpZnlNb2R1bGVzV2l6YXJkMiBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKKwkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgeworCQkJbGlzdC5hZGQobmV3IE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudCh0cnVlKSk7CisJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlU2VydmVyRnJhZ21lbnQpOworCQkJCisJCQlsaXN0LmFkZChuZXcgV2l6YXJkRnJhZ21lbnQoKSB7CisJCQkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCQkJSVNlcnZlckF0dHJpYnV0ZXMgc3ZyID0gKElTZXJ2ZXJBdHRyaWJ1dGVzKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKKwkJCQkJaWYgKHN2ciBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKwkJCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIHN2cjsKKwkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQgJiYKKwkJCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRQdWJsaXNoT25BZGRSZW1vdmVNb2R1bGUoKSkgeworCQkJCQkJCUlBZGFwdGFibGUgaW5mbyA9IG51bGw7CisJCQkJCQkJLypJQWRhcHRhYmxlIGluZm8gPSBuZXcgSUFkYXB0YWJsZSgpIHsKKwkJCQkJCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKKwkJCQkJCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCisJCQkJCQkJCQkJcmV0dXJuIHNoZWxsOworCQkJCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCQkJCX0KKwkJCQkJCQl9OyovCisJCQkJCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLCBudWxsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQl9CisJfQorCisJLyoqCisJICogTW9kaWZ5TW9kdWxlc1dpemFyZCBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICovCisJcHVibGljIE1vZGlmeU1vZHVsZXNXaXphcmQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJc3VwZXIoTWVzc2FnZXMud2l6TW9kdWxlV2l6YXJkVGl0bGUsIG5ldyBNb2RpZnlNb2R1bGVzV2l6YXJkMigpKTsKKwkJCisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1J1bnRpbWVXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9OZXdSdW50aW1lV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhNzg3NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9OZXdSdW50aW1lV2l6YXJkLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk5ld1J1bnRpbWVXaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CisvKioKKyAqIEEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBydW50aW1lLgorICovCitwdWJsaWMgY2xhc3MgTmV3UnVudGltZVdpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKKwkvKioKKwkgKiBOZXdSdW50aW1lV2l6YXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIE5ld1J1bnRpbWVXaXphcmQoKSB7CisJCXN1cGVyKE1lc3NhZ2VzLndpek5ld1J1bnRpbWVXaXphcmRUaXRsZSwgbmV3IFdpemFyZEZyYWdtZW50KCkgeworCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgeworCQkJCWxpc3QuYWRkKG5ldyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSk7CisJCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVJ1bnRpbWVGcmFnbWVudCk7CisJCQl9CisJCX0pOworCisJCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIG5ld1dvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZlcldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZlcldpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGRkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTmV3U2VydmVyV2l6YXJkLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5Nb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuVGFza3NXaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CisvKioKKyAqIEEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBzZXJ2ZXIgYW5kIHNlcnZlciBjb25maWd1cmF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgTmV3U2VydmVyV2l6YXJkIGV4dGVuZHMgVGFza1dpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgeworCS8qKgorCSAqIE5ld1NlcnZlcldpemFyZCBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmQoKSB7CisJCXRoaXMobnVsbCwgbnVsbCk7CisJfQorCisJcHVibGljIE5ld1NlcnZlcldpemFyZChmaW5hbCBTdHJpbmdbXSBpZHMsIGZpbmFsIFN0cmluZ1tdIHZhbHVlcykgeworCQlzdXBlcihNZXNzYWdlcy53aXpOZXdTZXJ2ZXJXaXphcmRUaXRsZSwgbmV3IFdpemFyZEZyYWdtZW50KCkgeworCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgeworCQkJCWxpc3QuYWRkKG5ldyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudCgpKTsKKwkJCQkKKwkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5UZW1wU2F2ZVJ1bnRpbWVGcmFnbWVudCk7CisJCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuVGVtcFNhdmVTZXJ2ZXJGcmFnbWVudCk7CisJCQkJCisJCQkJbGlzdC5hZGQobmV3IE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudCgpKTsKKwkJCQlsaXN0LmFkZChuZXcgVGFza3NXaXphcmRGcmFnbWVudCgpKTsKKwkJCQkKKwkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlUnVudGltZUZyYWdtZW50KTsKKwkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlU2VydmVyRnJhZ21lbnQpOworCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVIb3N0bmFtZUZyYWdtZW50KTsKKwkJCX0KKwkJfSk7CisJCQorCQlpZiAoaWRzICE9IG51bGwpIHsKKwkJCVRhc2tNb2RlbCB0YXNrTW9kZWwyID0gZ2V0VGFza01vZGVsKCk7CisJCQlpbnQgc2l6ZSA9IGlkcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCXRhc2tNb2RlbDIucHV0T2JqZWN0KGlkc1tpXSwgdmFsdWVzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBuZXdXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1NlbGVjdGlvbikgeworCQkvLyBkbyBub3RoaW5nCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9SdW5PblNlcnZlcldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1J1bk9uU2VydmVyV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwMWY0MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9SdW5PblNlcnZlcldpemFyZC5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklMYXVuY2hhYmxlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50LlJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQ7CisvKioKKyAqIEEgd2l6YXJkIHVzZWQgZm9yIFJ1biBvbiBTZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBSdW5PblNlcnZlcldpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgeworCS8qKgorCSAqIFJ1bk9uU2VydmVyV2l6YXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICogCisJICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQorCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbGF1bmNoIG1vZGUKKwkgKiBAcGFyYW0gbW9kdWxlQXJ0aWZhY3QgYSBtb2R1bGUgYXJ0aWZhY3QKKwkgKi8KKwlwdWJsaWMgUnVuT25TZXJ2ZXJXaXphcmQoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHsKKwkJc3VwZXIoTWVzc2FnZXMud2l6UnVuT25TZXJ2ZXJUaXRsZSwgbmV3IFJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQobW9kdWxlLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCkpOworCQkKKwkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7CisJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKKwkJCXNldFdpbmRvd1RpdGxlKE1lc3NhZ2VzLndpekRlYnVnT25TZXJ2ZXJUaXRsZSk7CisJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpCisJCQlzZXRXaW5kb3dUaXRsZShNZXNzYWdlcy53aXpQcm9maWxlT25TZXJ2ZXJUaXRsZSk7CisJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19MQVVOQ0hfTU9ERSwgbGF1bmNoTW9kZSk7CisJfQorCisJLyoqCisJICogUnVuT25TZXJ2ZXJXaXphcmQgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCisJICogQHBhcmFtIGxhdW5jaE1vZGUgYSBsYXVuY2ggbW9kZQorCSAqIEBwYXJhbSBtb2R1bGVBcnRpZmFjdCBhIG1vZHVsZSBhcnRpZmFjdAorCSAqLworCXB1YmxpYyBSdW5PblNlcnZlcldpemFyZChJU2VydmVyIHNlcnZlciwgU3RyaW5nIGxhdW5jaE1vZGUsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgeworCQlzdXBlcihNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlLCBuZXcgUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudChzZXJ2ZXIsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0KSk7CisJCQorCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKKwkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKQorCQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlKTsKKwkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKKwkJCXNldFdpbmRvd1RpdGxlKE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlKTsKKwkJCisJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcik7CisJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19MQVVOQ0hfTU9ERSwgbGF1bmNoTW9kZSk7CisJCWFkZFBhZ2VzKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBzZXJ2ZXIuCisJICogCisJICogQHJldHVybiB0aGUgc2VydmVyCisJICovCisJcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgeworCQl0cnkgeworCQkJcmV0dXJuIChJU2VydmVyKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIGlmIHRoZSB1c2VyIHdhbnRzIHRvIHVzZSB0aGUgc2VydmVyIGFzIGEgZGVmYXVsdC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNlcnZlciBzaG91bGQgYmUgdGhlIGRlZmF1bHQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1ByZWZlcnJlZFNlcnZlcigpIHsKKwkJdHJ5IHsKKwkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19ERUZBVUxUX1NFUlZFUik7CisJCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgc2VsZWN0ZWQgY2xpZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNsaWVudAorCSAqLworCXB1YmxpYyBJQ2xpZW50IGdldFNlbGVjdGVkQ2xpZW50KCkgeworCQl0cnkgeworCQkJcmV0dXJuIChJQ2xpZW50KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGxhdW5jaGFibGUgYWRhcHRlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyCisJICovCisJcHVibGljIElMYXVuY2hhYmxlQWRhcHRlciBnZXRMYXVuY2hhYmxlQWRhcHRlcigpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiAoSUxhdW5jaGFibGVBZGFwdGVyKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19MQVVOQ0hBQkxFX0FEQVBURVIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB3aXphcmQgc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgc2hvdWxkIGJlIHNob3duLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogICAgb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gc2hvdWxkQXBwZWFyKCkgeworCQlyZXR1cm4gZ2V0U2VydmVyKCkgPT0gbnVsbCB8fCBoYXNUYXNrcygpIHx8IGhhc0NsaWVudHMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIHRhc2tzLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIHRhc2tzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogICAgb3RoZXJ3aXNlCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGFza3MoKSB7CisJCXRyeSB7CisJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX1RBU0tTKTsKKwkJCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgd2l6YXJkIGhhcyBtdWx0aXBsZSBjbGllbnRzIHRvIHNob3cuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHdpemFyZCBoYXMgbXVsdGlwbGUgY2xpZW50cywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqICAgIG90aGVyd2lzZQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhc0NsaWVudHMoKSB7CisJCXRyeSB7CisJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMpOworCQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1Rhc2tXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwZDczMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkLmphdmEKQEAgLTAsMCArMSw1NjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuV29ya3NwYWNlUnVubmFibGVBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OworLyoqCisgKiBBIHdpemFyZCB1c2VkIHRvIGV4ZWN1dGUgdGFza3MuCisgKi8KK3B1YmxpYyBjbGFzcyBUYXNrV2l6YXJkIGltcGxlbWVudHMgSVdpemFyZCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBGSU5JU0ggPSAyOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQ0FOQ0VMID0gMzsKKworCXByaXZhdGUgTGlzdDxJV2l6YXJkUGFnZT4gcGFnZXM7CisJcHJpdmF0ZSBib29sZWFuIGFkZGluZ1BhZ2VzOworCXByaXZhdGUgTWFwPFdpemFyZEZyYWdtZW50LCBUYXNrV2l6YXJkUGFnZT4gZnJhZ21lbnREYXRhID0gbmV3IEhhc2hNYXA8V2l6YXJkRnJhZ21lbnQsIFRhc2tXaXphcmRQYWdlPigpOworCXByb3RlY3RlZCBUYXNrTW9kZWwgdGFza01vZGVsOworCQorCXByaXZhdGUgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworCQorCXByaXZhdGUgYm9vbGVhbiBuZWVkc1Byb2dyZXNzTW9uaXRvciA9IGZhbHNlOworCQorCXByaXZhdGUgYm9vbGVhbiBmb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMgPSBmYWxzZTsKKworCXByaXZhdGUgYm9vbGVhbiBpc0hlbHBBdmFpbGFibGUgPSBmYWxzZTsKKwkKKwlwcml2YXRlIEltYWdlIGRlZmF1bHRJbWFnZSA9IG51bGw7CisJCisJcHJpdmF0ZSBSR0IgdGl0bGVCYXJDb2xvciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB3aW5kb3dUaXRsZSA9IG51bGw7CisJCisJcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBudWxsOworCQorCXByaXZhdGUgV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50OworCXByaXZhdGUgV2l6YXJkRnJhZ21lbnQgY3VycmVudEZyYWdtZW50OworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IFRhc2tXaXphcmQgd2l0aCB0aGUgZ2l2ZW4gdGl0bGUgYW5kIHJvb3QgZnJhZ21lbnQuCisJICogCisJICogQHBhcmFtIHRpdGxlIGEgdGl0bGUKKwkgKiBAcGFyYW0gcm9vdEZyYWdtZW50IGEgcm9vdCBmcmFnbWVudAorCSAqLworCXB1YmxpYyBUYXNrV2l6YXJkKFN0cmluZyB0aXRsZSwgV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50KSB7CisJCXRoaXModGl0bGUsIHJvb3RGcmFnbWVudCwgbnVsbCk7CisJCXNldFdpbmRvd1RpdGxlKHRpdGxlKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgVGFza1dpemFyZCB3aXRoIHRoZSBnaXZlbiB0aXRsZSwgcm9vdCBmcmFnbWVudCwgYW5kIHRhc2sgbW9kZWwuCisJICogCisJICogQHBhcmFtIHRpdGxlIGEgdGl0bGUKKwkgKiBAcGFyYW0gcm9vdEZyYWdtZW50IGEgcm9vdCBmcmFnbWVudAorCSAqIEBwYXJhbSB0YXNrTW9kZWwgYSB0YXNrIG1vZGVsCisJICovCisJcHVibGljIFRhc2tXaXphcmQoU3RyaW5nIHRpdGxlLCBXaXphcmRGcmFnbWVudCByb290RnJhZ21lbnQsIFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKKwkJc3VwZXIoKTsKKwkJaWYgKHRpdGxlICE9IG51bGwpCisJCQlzZXRXaW5kb3dUaXRsZSh0aXRsZSk7CisJCXRoaXMucm9vdEZyYWdtZW50ID0gcm9vdEZyYWdtZW50OworCQl0aGlzLnRhc2tNb2RlbCA9IHRhc2tNb2RlbDsKKwkJaWYgKHRhc2tNb2RlbCA9PSBudWxsKQorCQkJdGhpcy50YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7CisJCQorCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKKwkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7CisJCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOworCX0KKwkKKwlwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKKwkJcmV0dXJuIHRhc2tNb2RlbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSb290RnJhZ21lbnQoV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50KSB7CisJCXRoaXMucm9vdEZyYWdtZW50ID0gcm9vdEZyYWdtZW50OworCX0KKwkKKwlwdWJsaWMgV2l6YXJkRnJhZ21lbnQgZ2V0Um9vdEZyYWdtZW50KCkgeworCQlyZXR1cm4gcm9vdEZyYWdtZW50OworCX0KKworCS8qKgorCSAqIENhbmNlbCB0aGUgY2xpZW50IHNlbGVjdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7CisJCWZpbmFsIExpc3QgbGlzdCA9IGdldEFsbFdpemFyZEZyYWdtZW50cygpOworCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQkJCXRyeSB7CisJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOworCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQorCQkJCQkJZXhlY3V0ZVRhc2soKFdpemFyZEZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCksIENBTkNFTCwgbW9uaXRvcik7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihjZSk7CisJCQkJfQorCQkJfQorCQl9OworCQkKKwkJVGhyb3dhYmxlIHQgPSBudWxsOworCQl0cnkgeworCQkJaWYgKGdldENvbnRhaW5lcigpICE9IG51bGwpCisJCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKKwkJCWVsc2UKKwkJCQlydW5uYWJsZS5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0ZSkgeworCQkJdCA9IHRlLmdldENhdXNlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0ID0gZTsKKwkJfQorCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYW5jZWxsaW5nIHRhc2sgd2l6YXJkIiwgdCk7CisJCQorCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKKwkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcih0LmdldExvY2FsaXplZE1lc3NhZ2UoKSwgKChDb3JlRXhjZXB0aW9uKXQpLmdldFN0YXR1cygpKTsKKwkJfSBlbHNlCisJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IodC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQkKKwkJcmV0dXJuIGZhbHNlOworCQkKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgeworCQlpZiAoY3VycmVudEZyYWdtZW50ICE9IG51bGwpCisJCQljdXJyZW50RnJhZ21lbnQuZXhpdCgpOworCQkKKwkJZmluYWwgV2l6YXJkRnJhZ21lbnQgY0ZyYWdtZW50ID0gY3VycmVudEZyYWdtZW50OworCisJCWZpbmFsIExpc3QgbGlzdCA9IGdldEFsbFdpemFyZEZyYWdtZW50cygpOworCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCS8vIGVudGVyICYgZXhpdCB0aGUgcmVtYWluaW5nIHBhZ2VzCisJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKGNGcmFnbWVudCk7CisJCQkJd2hpbGUgKGluZGV4ID4gMCAmJiBpbmRleCA8IGxpc3Quc2l6ZSgpIC0gMSkgeworCQkJCQlmaW5hbCBXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IChXaXphcmRGcmFnbWVudCkgbGlzdC5nZXQoKytpbmRleCk7CisJCQkJCXRyeSB7CisJCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQlmcmFnbWVudC5lbnRlcigpOworCQkJCQkJCQlmcmFnbWVudC5leGl0KCk7CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGVudGVyL2V4aXQgcGFnZSIsIGUpOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmICh1c2VKb2IoKSkgeworCQkJCQljbGFzcyBGaW5pc2hXaXphcmRKb2IgZXh0ZW5kcyBKb2IgeworCQkJCQkJcHVibGljIEZpbmlzaFdpemFyZEpvYigpIHsKKwkJCQkJCQlzdXBlcihnZXRKb2JUaXRsZSgpKTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKKwkJCQkJCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZmFtaWx5Ii5lcXVhbHMoZmFtaWx5KTsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKKwkJCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKKwkJCQkJCQkJCWV4ZWN1dGVUYXNrKChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpLCBGSU5JU0gsIG1vbml0b3IyKTsKKwkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGZpbmlzaGluZyB3aXphcmQgam9iIiwgY2UpOworCQkJCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCk7CisJCQkJCQkJfQorCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJCQkJfQorCQkJCQl9CisJCQkJCQorCQkJCQlGaW5pc2hXaXphcmRKb2Igam9iID0gbmV3IEZpbmlzaFdpemFyZEpvYigpOworCQkJCQlqb2Iuc2V0VXNlcih0cnVlKTsKKwkJCQkJam9iLnNjaGVkdWxlKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7CisJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCisJCQkJCQlleGVjdXRlVGFzaygoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKSwgRklOSVNILCBtb25pdG9yKTsKKwkJCQl9CisJCQl9CisJCX07CisJCQorCQlUaHJvd2FibGUgdCA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCkKKwkJCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgbmV3IFdvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlcihydW5uYWJsZSkpOworCQkJZWxzZQorCQkJCXJ1bm5hYmxlLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHRlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBmaW5pc2hpbmcgdGFzayB3aXphcmQiLCB0ZSk7CisJCQl0ID0gdGUuZ2V0Q2F1c2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGZpbmlzaGluZyB0YXNrIHdpemFyZCAyIiwgZSk7CisJCQl0ID0gZTsKKwkJfQorCQkKKwkJLy8gVE9ETzogc2hvdyBiZXR0ZXIgZXJyb3IgZGlhbG9nLCBlLmcuIHdoZW4gVG9tY2F0IGNvbmZpZyBpcyBjb3JydXB0IHdoaWxlIGRvaW5nIEFkZC9SZW1vdmUKKwkJLy8gaXQgY3VycmVudGx5IGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlIHR3aWNlCisJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBjb21wbGV0aW5nIHdpemFyZCIsIHQpOworCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKKwkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcih0LmdldExvY2FsaXplZE1lc3NhZ2UoKSwgKChDb3JlRXhjZXB0aW9uKXQpLmdldFN0YXR1cygpKTsKKwkJfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgTnVsbFBvaW50ZXJFeGNlcHRpb24pCisJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoIk51bGxQb2ludGVyRXhjZXB0aW9uIik7CisJCWVsc2UKKwkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcih0LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgeworCQlwYWdlcy5hZGQocGFnZSk7CisJCXBhZ2Uuc2V0V2l6YXJkKHRoaXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVGFzayhXaXphcmRGcmFnbWVudCBmcmFnbWVudCwgYnl0ZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGZyYWdtZW50ID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlpZiAodHlwZSA9PSBGSU5JU0gpCisJCQlmcmFnbWVudC5wZXJmb3JtRmluaXNoKG1vbml0b3IpOworCQllbHNlIGlmICh0eXBlID09IENBTkNFTCkKKwkJCWZyYWdtZW50LnBlcmZvcm1DYW5jZWwobW9uaXRvcik7CisJfQorCQorCXByb3RlY3RlZCBXaXphcmRGcmFnbWVudCBnZXRDdXJyZW50V2l6YXJkRnJhZ21lbnQoKSB7CisJCXJldHVybiBjdXJyZW50RnJhZ21lbnQ7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHN3aXRjaFdpemFyZEZyYWdtZW50KFdpemFyZEZyYWdtZW50IG5ld0ZyYWdtZW50KSB7CisJCUxpc3QgbGlzdCA9IGdldEFsbFdpemFyZEZyYWdtZW50cygpOworCQlpbnQgb2xkSW5kZXggPSBsaXN0LmluZGV4T2YoY3VycmVudEZyYWdtZW50KTsKKwkJaW50IG5ld0luZGV4ID0gbGlzdC5pbmRleE9mKG5ld0ZyYWdtZW50KTsKKwkJaWYgKG9sZEluZGV4ID09IG5ld0luZGV4KQorCQkJcmV0dXJuOworCQkKKwkJLy9zYWZlRXhlY3V0ZVRhc2soY3VycmVudEZyYWdtZW50LCBERVBBUlRVUkUpOworCQlpZiAoY3VycmVudEZyYWdtZW50ICE9IG51bGwpCisJCQljdXJyZW50RnJhZ21lbnQuZXhpdCgpOworCQkKKwkJaWYgKG9sZEluZGV4IDwgbmV3SW5kZXgpCisJCQlvbGRJbmRleCArKzsKKwkJZWxzZQorCQkJb2xkSW5kZXggLS07CisJCQorCQl3aGlsZSAob2xkSW5kZXggIT0gbmV3SW5kZXgpIHsKKwkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gKFdpemFyZEZyYWdtZW50KSBsaXN0LmdldChvbGRJbmRleCk7CisJCQkvL3NhZmVFeGVjdXRlVGFzayhmcmFnbWVudCwgQVJSSVZBTCk7CisJCQkvL3NhZmVFeGVjdXRlVGFzayhmcmFnbWVudCwgREVQQVJUVVJFKTsKKwkJCWZyYWdtZW50LmVudGVyKCk7CisJCQlmcmFnbWVudC5leGl0KCk7CisJCQlpZiAob2xkSW5kZXggPCBuZXdJbmRleCkKKwkJCQlvbGRJbmRleCArKzsKKwkJCWVsc2UKKwkJCQlvbGRJbmRleCAtLTsKKwkJfQorCQkKKwkJY3VycmVudEZyYWdtZW50ID0gbmV3RnJhZ21lbnQ7CisJCS8vc2FmZUV4ZWN1dGVUYXNrKGN1cnJlbnRGcmFnbWVudCwgQVJSSVZBTCk7CisJCWN1cnJlbnRGcmFnbWVudC5lbnRlcigpOworCX0KKwkKKwlwcml2YXRlIExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGdldEFsbFdpemFyZEZyYWdtZW50cygpIHsKKwkJTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8V2l6YXJkRnJhZ21lbnQ+KCk7CisJCWxpc3QuYWRkKHJvb3RGcmFnbWVudCk7CisJCWFkZFN1YldpemFyZEZyYWdtZW50cyhyb290RnJhZ21lbnQsIGxpc3QpOworCQkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gKFdpemFyZEZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCk7CisJCQlpZiAoIXRhc2tNb2RlbC5lcXVhbHMoZnJhZ21lbnQuZ2V0VGFza01vZGVsKCkpKQorCQkJCWZyYWdtZW50LnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOworCQl9CisJCXJldHVybiBsaXN0OworCX0KKworCXByaXZhdGUgdm9pZCBhZGRTdWJXaXphcmRGcmFnbWVudHMoV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQsIExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmcmFnbWVudC5nZXRDaGlsZEZyYWdtZW50cygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVdpemFyZEZyYWdtZW50IGNoaWxkID0gKFdpemFyZEZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCk7CisJCQlsaXN0LmFkZChjaGlsZCk7CisJCQlhZGRTdWJXaXphcmRGcmFnbWVudHMoY2hpbGQsIGxpc3QpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjYWRkUGFnZXMoKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworCQlpZiAoYWRkaW5nUGFnZXMpCisJCQlyZXR1cm47CisJCQorCQl0cnkgeworCQkJYWRkaW5nUGFnZXMgPSB0cnVlOworCQkJcGFnZXMgPSBuZXcgQXJyYXlMaXN0PElXaXphcmRQYWdlPigpOworCQkJSXRlcmF0b3I8V2l6YXJkRnJhZ21lbnQ+IGl0ZXJhdG9yID0gZ2V0QWxsV2l6YXJkRnJhZ21lbnRzKCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlUYXNrV2l6YXJkUGFnZSBwYWdlID0gZ2V0RnJhZ21lbnREYXRhKGZyYWdtZW50KTsKKwkJCQlpZiAoZnJhZ21lbnQuaGFzQ29tcG9zaXRlKCkpIHsKKwkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkKKwkJCQkJCWFkZFBhZ2UocGFnZSk7CisJCQkJCWVsc2UgeworCQkJCQkJVGFza1dpemFyZFBhZ2UgcGFnZTIgPSBuZXcgVGFza1dpemFyZFBhZ2UoZnJhZ21lbnQpOworCQkJCQkJZnJhZ21lbnREYXRhLnB1dChmcmFnbWVudCwgcGFnZTIpOworCQkJCQkJYWRkUGFnZShwYWdlMik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBhZGRpbmcgZnJhZ21lbnRzIHRvIHdpemFyZCIsIGUpOworCQl9IGZpbmFsbHkgeworCQkJYWRkaW5nUGFnZXMgPSBmYWxzZTsKKwkJfQorCX0KKworCS8qcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVXaXphcmRQYWdlcygpIHsKKwkJdHJ5IHsKKwkJCWN1cnJlbnQudXBkYXRlUGFnZXMoKTsKKwkJCWN1cnJlbnQuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgdXBkYXRpbmcgd2l6YXJkIHBhZ2VzIiwgZSk7CisJCX0KKwl9Ki8KKworCXByaXZhdGUgVGFza1dpemFyZFBhZ2UgZ2V0RnJhZ21lbnREYXRhKFdpemFyZEZyYWdtZW50IGZyYWdtZW50KSB7CisJCXRyeSB7CisJCQlUYXNrV2l6YXJkUGFnZSBwYWdlID0gZnJhZ21lbnREYXRhLmdldChmcmFnbWVudCk7CisJCQlpZiAocGFnZSAhPSBudWxsKQorCQkJCXJldHVybiBwYWdlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBmcmFnbWVudCBkYXRhIiwgZSk7CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhZ2VzKCkgeworCQlhZGRQYWdlcygpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCisJICovCisJcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgeworCQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIGNoZWNrIGlmIGFsbCBwYWdlcyBhcmUgY29tcGxldGUuCisJCWZvciAoaW50IGk9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgeworCQkJaWYgKCEocGFnZXMuZ2V0KGkpKS5pc1BhZ2VDb21wbGV0ZSgpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgeworCQkvLyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjcmVhdGUgYWxsIHRoZSBwYWdlcyBjb250cm9scworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKXsKKwkJCUlXaXphcmRQYWdlIHBhZ2UgPSBwYWdlcy5nZXQoaSk7CisJCQlwYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBub3RpZnkgcGFnZXMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgeworCQkJcGFnZXMuZ2V0KGkpLmRpc3Bvc2UoKTsKKwkJfQorCisJCS8vIGRpc3Bvc2Ugb2YgaW1hZ2UKKwkJaWYgKGRlZmF1bHRJbWFnZSAhPSBudWxsKSB7CisJCQlkZWZhdWx0SW1hZ2UuZGlzcG9zZSgpOworCQkJZGVmYXVsdEltYWdlID0gbnVsbDsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldENvbnRhaW5lcigpCisJICovCisJcHVibGljIElXaXphcmRDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworCQlyZXR1cm4gY29udGFpbmVyOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldERlZmF1bHRQYWdlSW1hZ2UoKQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXREZWZhdWx0UGFnZUltYWdlKCkgeworCQlyZXR1cm4gZGVmYXVsdEltYWdlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldERpYWxvZ1NldHRpbmdzKCkKKwkgKi8KKwlwdWJsaWMgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgeworCQlyZXR1cm4gZGlhbG9nU2V0dGluZ3M7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0TmV4dFBhZ2Uob3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlKQorCSAqLworCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7CisJCWludCBpbmRleCA9IHBhZ2VzLmluZGV4T2YocGFnZSk7CisJCWlmIChpbmRleCA9PSBwYWdlcy5zaXplKCkgLSAxIHx8IGluZGV4ID09IC0xKQorCQkJLy8gbGFzdCBwYWdlIG9yIHBhZ2Ugbm90IGZvdW5kCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiBwYWdlcy5nZXQoaW5kZXggKyAxKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRQYWdlKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIElXaXphcmRQYWdlIGdldFBhZ2UoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKSB7CisJCQlJV2l6YXJkUGFnZSBwYWdlID0gcGFnZXMuZ2V0KGkpOworCQkJU3RyaW5nIHBhZ2VOYW1lID0gcGFnZS5nZXROYW1lKCk7CisJCQlpZiAocGFnZU5hbWUuZXF1YWxzKG5hbWUpKQorCQkJCXJldHVybiBwYWdlOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFBhZ2VDb3VudCgpCisJICovCisJcHVibGljIGludCBnZXRQYWdlQ291bnQoKSB7CisJCXJldHVybiBwYWdlcy5zaXplKCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UGFnZXMoKQorCSAqLworCXB1YmxpYyBJV2l6YXJkUGFnZVtdIGdldFBhZ2VzKCkgeworCQlyZXR1cm4gcGFnZXMudG9BcnJheShuZXcgSVdpemFyZFBhZ2VbcGFnZXMuc2l6ZSgpXSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UHJldmlvdXNQYWdlKG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKKwkgKi8KKwlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UHJldmlvdXNQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKKwkJaW50IGluZGV4ID0gcGFnZXMuaW5kZXhPZihwYWdlKTsKKwkJaWYgKGluZGV4ID09IDAgfHwgaW5kZXggPT0gLTEpCisJCQkvLyBmaXJzdCBwYWdlIG9yIHBhZ2Ugbm90IGZvdW5kCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIHBhZ2VzLmdldChpbmRleCAtIDEpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFN0YXJ0aW5nUGFnZSgpCisJICovCisJcHVibGljIElXaXphcmRQYWdlIGdldFN0YXJ0aW5nUGFnZSgpIHsKKwkJaWYgKHBhZ2VzLnNpemUoKSA9PSAwKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlyZXR1cm4gcGFnZXMuZ2V0KDApOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFRpdGxlQmFyQ29sb3IoKQorCSAqLworCXB1YmxpYyBSR0IgZ2V0VGl0bGVCYXJDb2xvcigpIHsKKwkJcmV0dXJuIHRpdGxlQmFyQ29sb3I7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0V2luZG93VGl0bGUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0V2luZG93VGl0bGUoKSB7CisJCXJldHVybiB3aW5kb3dUaXRsZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNpc0hlbHBBdmFpbGFibGUoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSGVscEF2YWlsYWJsZSgpIHsKKwkJcmV0dXJuIGlzSGVscEF2YWlsYWJsZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNuZWVkc1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoKQorCSAqLworCXB1YmxpYyBib29sZWFuIG5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHsKKwkJcmV0dXJuIGZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyB8fCBwYWdlcy5zaXplKCkgPiAxOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI25lZWRzUHJvZ3Jlc3NNb25pdG9yKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBuZWVkc1Byb2dyZXNzTW9uaXRvcigpIHsKKwkJcmV0dXJuIG5lZWRzUHJvZ3Jlc3NNb25pdG9yOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoSVdpemFyZENvbnRhaW5lciB3aXphcmRDb250YWluZXIpIHsKKwkJdGhpcy5jb250YWluZXIgPSB3aXphcmRDb250YWluZXI7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldERpYWxvZ1NldHRpbmdzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgeworCQlkaWFsb2dTZXR0aW5ncyA9IHNldHRpbmdzOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcihib29sZWFuIGIpIHsKKwkJbmVlZHNQcm9ncmVzc01vbml0b3IgPSBiOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoYm9vbGVhbiBiKSB7CisJCWZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyA9IGI7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFdpbmRvd1RpdGxlKFN0cmluZyB0aXRsZSkgeworCQl3aW5kb3dUaXRsZSA9IHRpdGxlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHVzZUpvYigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9iVGl0bGUoKSB7CisJCXJldHVybiBnZXRXaW5kb3dUaXRsZSgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvVGFza1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmEyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvVGFza1dpemFyZFBhZ2UuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKKy8qKgorICogQSB0YXNrIHdpemFyZCBwYWdlLgorICovCitjbGFzcyBUYXNrV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJV2l6YXJkSGFuZGxlIHsKKwlwcm90ZWN0ZWQgV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQ7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCXB1YmxpYyBUYXNrV2l6YXJkUGFnZShXaXphcmRGcmFnbWVudCBmcmFnbWVudCkgeworCQlzdXBlcihmcmFnbWVudC50b1N0cmluZygpKTsKKwkJdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50OworCX0KKworCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudENvbXApIHsKKwkJQ29tcG9zaXRlIGNvbXAgPSBudWxsOworCQl0cnkgeworCQkJY29tcCA9IGZyYWdtZW50LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnRDb21wLCB0aGlzKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgY3JlYXRlIHdpemFyZCBwYWdlIGNvbXBvc2l0ZSIsIGUpOworCQl9CisJCWlmIChjb21wID09IG51bGwpIHsKKwkJCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudENvbXAsIFNXVC5OT05FKTsKKwkJCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOworCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOworCQkJbGFiZWwuc2V0VGV4dCgiSW50ZXJuYWwgZXJyb3IiKTsKKwkJfQorCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCWRhdGEud2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoMTUwKTsKKwkJY29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlzZXRDb250cm9sKGNvbXApOworCQkKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKwkJdXBkYXRlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7CisJCXRyeSB7CisJCQlpZiAoIWZyYWdtZW50LmlzQ29tcGxldGUoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7CisJCWlmIChnZXROZXh0UGFnZSgpID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXRyeSB7CisJCQlpZiAoIWZyYWdtZW50LmlzQ29tcGxldGUoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJCisJCWlmICh2aXNpYmxlKSB7CisJCQlUYXNrV2l6YXJkIHdpemFyZCA9IChUYXNrV2l6YXJkKSBnZXRXaXphcmQoKTsKKwkJCXdpemFyZC5zd2l0Y2hXaXphcmRGcmFnbWVudChmcmFnbWVudCk7CisJCQkKKwkJCWlmIChnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IG51bGwpCisJCQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHR5cGUpIHsKKwkJaWYgKHR5cGUgPT0gSU1lc3NhZ2VQcm92aWRlci5FUlJPUiAmJiAiIi5lcXVhbHMobWVzc2FnZSkpIHsKKwkJCW1lc3NhZ2UgPSBudWxsOworCQl9CisJCXN1cGVyLnNldE1lc3NhZ2UobWVzc2FnZSwgdHlwZSk7CisJCVdpemFyZEZyYWdtZW50IGZyYWcgPSAoKFRhc2tXaXphcmQpIGdldFdpemFyZCgpKS5nZXRDdXJyZW50V2l6YXJkRnJhZ21lbnQoKTsKKwkJaWYgKCFmcmFnbWVudC5lcXVhbHMoZnJhZykpCisJCQlyZXR1cm47CisJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkucnVuKGZvcmssIGNhbmNlbGFibGUsIHJ1bm5hYmxlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCWlmICghaXNDcmVhdGVkKQorCQkJcmV0dXJuOworCQkKKwkJZmluYWwgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKKwkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWZyYWdtZW50LnVwZGF0ZUNoaWxkRnJhZ21lbnRzKCk7CisJCQkJKChUYXNrV2l6YXJkKSBnZXRXaXphcmQoKSkudXBkYXRlUGFnZXMoKTsKKwkJCQkKKwkJCQlpZiAoY29udGFpbmVyLmdldEN1cnJlbnRQYWdlKCkgIT0gbnVsbCkKKwkJCQkJY29udGFpbmVyLnVwZGF0ZUJ1dHRvbnMoKTsKKwkJCX0KKwkJfSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9XaXphcmRUYXNrVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1dpemFyZFRhc2tVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3M2VkMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9XaXphcmRUYXNrVXRpbC5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlByb2plY3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5FY2xpcHNlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV2l6YXJkVGFza1V0aWwgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTEFVTkNIQUJMRV9BREFQVEVSID0gImxhdW5jaGFibGVBZGFwdGVyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0xBVU5DSEFCTEUgPSAibGF1bmNoYWJsZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19DTElFTlQgPSAiY2xpZW50IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0NMSUVOVFMgPSAiY2xpZW50cyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19ERUZBVUxUX1NFUlZFUiA9ICJkZWZhdWx0U2VydmVyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX01PREUgPSAibW9kZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19IQVNfVEFTS1MgPSAiaGFzVGFza3MiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfSEFTX0NMSUVOVFMgPSAiaGFzQ2xpZW50cyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19GRUFUVVJFID0gImZlYXR1cmUiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfRVhJU1RJTkcgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0RFVEVDVCA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfTUFOVUFMID0gMjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgV2l6YXJkRnJhZ21lbnQgU2F2ZVJ1bnRpbWVGcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKKwkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCVdpemFyZFRhc2tVdGlsLnNhdmVSdW50aW1lKGdldFRhc2tNb2RlbCgpLCBtb25pdG9yKTsKKwkJfQorCX07CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFdpemFyZEZyYWdtZW50IFNhdmVTZXJ2ZXJGcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKKwkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCVdpemFyZFRhc2tVdGlsLnNhdmVTZXJ2ZXIoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOworCQl9CisJfTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgV2l6YXJkRnJhZ21lbnQgVGVtcFNhdmVSdW50aW1lRnJhZ21lbnQgPSBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7CisJCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQlXaXphcmRUYXNrVXRpbC50ZW1wU2F2ZVJ1bnRpbWUoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOworCQl9CisJfTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgV2l6YXJkRnJhZ21lbnQgVGVtcFNhdmVTZXJ2ZXJGcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKKwkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCVdpemFyZFRhc2tVdGlsLnRlbXBTYXZlU2VydmVyKGdldFRhc2tNb2RlbCgpLCBtb25pdG9yKTsKKwkJfQorCX07CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFdpemFyZEZyYWdtZW50IFNhdmVIb3N0bmFtZUZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgeworCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJdHJ5IHsKKwkJCQlJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIyID0gKElTZXJ2ZXJBdHRyaWJ1dGVzKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKKwkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmFkZEhvc3RuYW1lKHNlcnZlcjIuZ2V0SG9zdCgpKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKwl9OworCisJcHJpdmF0ZSBXaXphcmRUYXNrVXRpbCgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzYXZlUnVudGltZShUYXNrTW9kZWwgdGFza01vZGVsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgdGFza01vZGVsLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKKwkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lIGluc3RhbmNlb2YgSVJ1bnRpbWVXb3JraW5nQ29weSkgeworCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOworCQkJaWYgKHdvcmtpbmdDb3B5LmlzRGlydHkoKSkKKwkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHdvcmtpbmdDb3B5LnNhdmUoZmFsc2UsIG1vbml0b3IpKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5JVGFzayNkb1Rhc2soKQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzYXZlU2VydmVyKFRhc2tNb2RlbCB0YXNrTW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIgaW5zdGFuY2VvZiBJU2VydmVyV29ya2luZ0NvcHkpIHsKKwkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKKwkJCWlmICh3b3JraW5nQ29weS5pc0RpcnR5KCkpIHsKKwkJCQlJRmlsZSBmaWxlID0gKChTZXJ2ZXIpd29ya2luZ0NvcHkpLmdldEZpbGUoKTsKKwkJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKKwkJCQkJCisJCQkJCWlmICghZmlsZS5nZXRQcm9qZWN0KCkuZXhpc3RzKCkpCisJCQkJCQlFY2xpcHNlVXRpbC5jcmVhdGVOZXdTZXJ2ZXJQcm9qZWN0KG51bGwsIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsLCBtb25pdG9yKTsKKwkJCQkJCisJCQkJCVByb2plY3RQcm9wZXJ0aWVzIHBwID0gU2VydmVyUGx1Z2luLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpOworCQkJCQlpZiAoIXBwLmlzU2VydmVyUHJvamVjdCgpKQorCQkJCQkJcHAuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBtb25pdG9yKTsKKwkJCQl9CisJCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHdvcmtpbmdDb3B5LnNhdmUoZmFsc2UsIG1vbml0b3IpKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB0ZW1wU2F2ZVJ1bnRpbWUoVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7CisJCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZSBpbnN0YW5jZW9mIElSdW50aW1lV29ya2luZ0NvcHkpIHsKKwkJCUlSdW50aW1lV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgcnVudGltZTsKKwkJCWlmICghd29ya2luZ0NvcHkuaXNEaXJ0eSgpKQorCQkJCXJldHVybjsKKwkJCQorCQkJcnVudGltZSA9IHdvcmtpbmdDb3B5LnNhdmUoZmFsc2UsIG1vbml0b3IpOworCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBydW50aW1lLmNyZWF0ZVdvcmtpbmdDb3B5KCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRlbXBTYXZlU2VydmVyKFRhc2tNb2RlbCB0YXNrTW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIgaW5zdGFuY2VvZiBJU2VydmVyV29ya2luZ0NvcHkpIHsKKwkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKKwkJCWlmICghd29ya2luZ0NvcHkuaXNEaXJ0eSgpKQorCQkJCXJldHVybjsKKwkJCQorCQkJSUZpbGUgZmlsZSA9ICgoU2VydmVyKXdvcmtpbmdDb3B5KS5nZXRGaWxlKCk7CisJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOworCQkJCQorCQkJCWlmICghZmlsZS5nZXRQcm9qZWN0KCkuZXhpc3RzKCkpCisJCQkJCUVjbGlwc2VVdGlsLmNyZWF0ZU5ld1NlcnZlclByb2plY3QobnVsbCwgcHJvamVjdC5nZXROYW1lKCksIG51bGwsIG1vbml0b3IpOworCQkJCQorCQkJCVByb2plY3RQcm9wZXJ0aWVzIHBwID0gU2VydmVyUGx1Z2luLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpOworCQkJCWlmICghcHAuaXNTZXJ2ZXJQcm9qZWN0KCkpCisJCQkJCXBwLnNldFNlcnZlclByb2plY3QodHJ1ZSwgbW9uaXRvcik7CisJCQl9CisJCQlJUnVudGltZSBydW50aW1lID0gd29ya2luZ0NvcHkuZ2V0UnVudGltZSgpOworCQkJCisJCQlzZXJ2ZXIgPSB3b3JraW5nQ29weS5zYXZlKGZhbHNlLCBtb25pdG9yKTsKKwkJCXdvcmtpbmdDb3B5ID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7CisJCQkKKwkJCXdvcmtpbmdDb3B5LnNldFJ1bnRpbWUocnVudGltZSk7CisJCQlpZiAod29ya2luZ0NvcHkuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkKKwkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KXdvcmtpbmdDb3B5KS5pbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKKwkJCQorCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHdvcmtpbmdDb3B5KTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNb2R1bGUoSU1vZHVsZSBtb2R1bGUsIFRhc2tNb2RlbCB0YXNrTW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAobW9kdWxlID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7CisJCUlNb2R1bGUgcGFyZW50TW9kdWxlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbW9uaXRvcik7CisJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkKKwkJCQlwYXJlbnRNb2R1bGUgPSBwYXJlbnRzWzBdOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIHBhcmVudCBtb2R1bGUiLCBlKTsKKwkJfQorCQkKKwkJaWYgKHBhcmVudE1vZHVsZSA9PSBudWxsKSB7CisJCQkvLyB1c2UgdGhlIG9yaWdpbmFsIG1vZHVsZSBzaW5jZSBubyBwYXJlbnQgbW9kdWxlIGlzIGF2YWlsYWJsZQorCQkJcGFyZW50TW9kdWxlID0gbW9kdWxlOworCQl9CisJCQorCQlJTW9kdWxlW10gbW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCk7CisJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAocGFyZW50TW9kdWxlLmVxdWFscyhtb2R1bGVzW2ldKSkKKwkJCQlyZXR1cm47CisJCX0KKwkJCisJCUlTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOworCQl3b3JraW5nQ29weS5tb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBwYXJlbnRNb2R1bGUgfSwgbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOworCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgd29ya2luZ0NvcHkuc2F2ZShmYWxzZSwgbW9uaXRvcikpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlNb2R1bGVzKExpc3Q8SU1vZHVsZT4gYWRkLCBMaXN0PElNb2R1bGU+IHJlbW92ZSwgVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmICgoYWRkID09IG51bGwgfHwgYWRkLmlzRW1wdHkoKSkgJiYgKHJlbW92ZSA9PSBudWxsIHx8IHJlbW92ZS5pc0VtcHR5KCkpKQorCQkJcmV0dXJuOworCQkKKwkJSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgdGFza01vZGVsLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOworCQkKKwkJLy8gbW9kaWZ5IG1vZHVsZXMKKwkJSU1vZHVsZVtdIHJlbW92ZTIgPSBuZXcgSU1vZHVsZVswXTsKKwkJaWYgKHJlbW92ZSAhPSBudWxsKSB7CisJCQlyZW1vdmUyID0gbmV3IElNb2R1bGVbcmVtb3ZlLnNpemUoKV07CisJCQlyZW1vdmUudG9BcnJheShyZW1vdmUyKTsKKwkJfQorCQkKKwkJSU1vZHVsZVtdIGFkZDIgPSBuZXcgSU1vZHVsZVswXTsKKwkJaWYgKGFkZCAhPSBudWxsKSB7CisJCQlhZGQyID0gbmV3IElNb2R1bGVbYWRkLnNpemUoKV07CisJCQlhZGQudG9BcnJheShhZGQyKTsKKwkJfQorCQkKKwkJSUZpbGUgZmlsZSA9ICgoU2VydmVyKXdvcmtpbmdDb3B5KS5nZXRGaWxlKCk7CisJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKKwkJCQorCQkJaWYgKCFmaWxlLmdldFByb2plY3QoKS5leGlzdHMoKSkKKwkJCQlFY2xpcHNlVXRpbC5jcmVhdGVOZXdTZXJ2ZXJQcm9qZWN0KG51bGwsIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsLCBtb25pdG9yKTsKKwkJCQorCQkJUHJvamVjdFByb3BlcnRpZXMgcHAgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7CisJCQlpZiAoIXBwLmlzU2VydmVyUHJvamVjdCgpKQorCQkJCXBwLnNldFNlcnZlclByb2plY3QodHJ1ZSwgbW9uaXRvcik7CisJCX0KKwkJCisJCXdvcmtpbmdDb3B5Lm1vZGlmeU1vZHVsZXMoYWRkMiwgcmVtb3ZlMiwgbW9uaXRvcik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9FeHRlbnNpb25XaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L0V4dGVuc2lvbldpemFyZEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3ZGEwZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9FeHRlbnNpb25XaXphcmRGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuRXh0ZW5zaW9uV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuRXh0ZW5zaW9uMkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIEV4dGVuc2lvbldpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgeworCXByb3RlY3RlZCBFeHRlbnNpb24yQ29tcG9zaXRlIGNvbXA7CisJcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOworCisJcHVibGljIEV4dGVuc2lvbldpemFyZEZyYWdtZW50KCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suV2l6YXJkVGFzayNnZXRXaXphcmRQYWdlKCkKKwkgKi8KKwlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZDIpIHsKKwkJdGhpcy53aXphcmQgPSB3aXphcmQyOworCQljb21wID0gbmV3IEV4dGVuc2lvbjJDb21wb3NpdGUocGFyZW50LCBnZXRUYXNrTW9kZWwoKSwgd2l6YXJkKTsKKwkJCisJCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXpOZXdJbnN0YWxsYWJsZVNlcnZlclRpdGxlKTsKKwkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyRGVzY3JpcHRpb24pOworCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9ORVdfU0VSVkVSKSk7CisJCXJldHVybiBjb21wOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CisJCXJldHVybiBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19GRUFUVVJFKSAhPSBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIGV4aXQoKSB7CisJCUV4dGVuc2lvbldpemFyZC51cGRhdGVMaWNlbnNlKHdpemFyZCwgZ2V0VGFza01vZGVsKCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTGljZW5zZVdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTGljZW5zZVdpemFyZEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1NWI0MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9MaWNlbnNlV2l6YXJkRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuTGljZW5zZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIExpY2Vuc2VXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFID0gImxpY2Vuc2UiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfTk9ORSA9ICJub25lIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFX1VOS05PV04gPSAidW5rbm93biI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9BQ0NFUFQgPSAiYWNjZXB0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFX1NFUlZFUiA9ICJsaWNlbnNlX3NlcnZlciI7CisKKwlwcm90ZWN0ZWQgTGljZW5zZUNvbXBvc2l0ZSBjb21wOworCisJcHVibGljIExpY2Vuc2VXaXphcmRGcmFnbWVudCgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCXB1YmxpYyB2b2lkIGVudGVyKCkgeworCQlpZiAoY29tcCAhPSBudWxsKQorCQkJY29tcC51cGRhdGVMaWNlbnNlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suV2l6YXJkVGFzayNnZXRXaXphcmRQYWdlKCkKKwkgKi8KKwlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgeworCQljb21wID0gbmV3IExpY2Vuc2VDb21wb3NpdGUocGFyZW50LCBnZXRUYXNrTW9kZWwoKSwgd2l6YXJkKTsKKwkJCisJCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXpMaWNlbnNlVGl0bGUpOworCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMud2l6TGljZW5zZURlc2NyaXB0aW9uKTsKKwkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fTkVXX1NFUlZFUikpOworCQlyZXR1cm4gY29tcDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworCQl0cnkgeworCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9BQ0NFUFQpOworCQkJaWYgKGIgIT0gbnVsbCAmJiBiLmJvb2xlYW5WYWx1ZSgpKQorCQkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4NTU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9Nb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1vZHVsZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5Nb2RpZnlNb2R1bGVzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgeworCXByb3RlY3RlZCBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlIGNvbXA7CisKKwlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7CisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1B1Ymxpc2hPcHRpb247CisKKwlwdWJsaWMgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50KCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJcHVibGljIE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudChib29sZWFuIHNob3dQdWJsaXNoT3B0aW9uKSB7CisJCXRoaXMuc2hvd1B1Ymxpc2hPcHRpb24gPSBzaG93UHVibGlzaE9wdGlvbjsKKwl9CisKKwlwdWJsaWMgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50KElNb2R1bGUgbW9kdWxlKSB7CisJCXRoaXMubW9kdWxlID0gbW9kdWxlOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC50YXNrLldpemFyZFRhc2sjZ2V0V2l6YXJkUGFnZSgpCisJICovCisJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKKwkJY29tcCA9IG5ldyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlKHBhcmVudCwgaGFuZGxlLCBtb2R1bGUsIHNob3dQdWJsaXNoT3B0aW9uKTsKKwkJcmV0dXJuIGNvbXA7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKKwkJc3VwZXIuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7CisJCWlmIChjb21wICE9IG51bGwpCisJCQljb21wLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOworCX0KKworCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgeworCQl1cGRhdGVNb2R1bGVzKCk7CisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZyYWdtZW50cygpOworCX0KKworCXB1YmxpYyB2b2lkIGVudGVyKCkgeworCQl1cGRhdGVNb2R1bGVzKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlTW9kdWxlcygpIHsKKwkJaWYgKGNvbXAgIT0gbnVsbCkgeworCQkJSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyID0gKElTZXJ2ZXJBdHRyaWJ1dGVzKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKKwkJCWNvbXAuc2V0VGFza01vZGVsKGdldFRhc2tNb2RlbCgpKTsKKwkJCWNvbXAuc2V0U2VydmVyKHNlcnZlcik7CisJCX0gZWxzZSBpZiAobW9kdWxlICE9IG51bGwpIHsKKwkJCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBnZXRUYXNrTW9kZWwoKTsKKwkJCWlmICh0YXNrTW9kZWwgPT0gbnVsbCkKKwkJCQlyZXR1cm47CisJCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgdGFza01vZGVsLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOworCQkJaWYgKHNlcnZlciA9PSBudWxsKSB7CisJCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19NT0RVTEVTLCBudWxsKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCWZpbmFsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVMaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7CisJCQkoKFNlcnZlcikgc2VydmVyKS52aXNpdChuZXcgSU1vZHVsZVZpc2l0b3IoKSB7CisJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZTIpIHsKKwkJCQkJbW9kdWxlTGlzdC5hZGQobW9kdWxlMik7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0sIG51bGwpOworCQkJCisJCQkvLyBhZGQgbW9kdWxlCisJCQlJTW9kdWxlIHBhcmVudCA9IG51bGw7CisJCQl0cnkgeworCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbnVsbCk7CisJCQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOworCQkJCQorCQkJCWlmIChwYXJlbnRzICE9IG51bGwgJiYgcGFyZW50cy5sZW5ndGggPiAwKSB7CisJCQkJCXBhcmVudCA9IHBhcmVudHNbMF07CisJCQkJCWxpc3QuYWRkKHBhcmVudCk7CisJCQkJfQorCQkJCS8vIFRPRE8gLSBnZXQgcGFyZW50IG1vZHVsZXMgY29ycmVjdAorCQkJCWlmICghbW9kdWxlTGlzdC5jb250YWlucyhtb2R1bGUpKSB7CisJCQkJCW1vZHVsZUxpc3QuYWRkKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSk7CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcGFyZW50IG1vZHVsZSIsIGUpOworCQkJfQorCQkJCisJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX01PRFVMRVMsIG1vZHVsZUxpc3QpOworCQl9CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKKwkJaWYgKGNvbXAgIT0gbnVsbCkKKwkJCXJldHVybiBjb21wLmlzQ29tcGxldGUoKTsKKwkJCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChjb21wICE9IG51bGwpIHsKKwkJCVdpemFyZFRhc2tVdGlsLm1vZGlmeU1vZHVsZXMoY29tcC5nZXRNb2R1bGVzVG9BZGQoKSwgY29tcC5nZXRNb2R1bGVzVG9SZW1vdmUoKSwgZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOworCQkJaWYgKHNob3dQdWJsaXNoT3B0aW9uKQorCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0UHVibGlzaE9uQWRkUmVtb3ZlTW9kdWxlKGNvbXAuc2hvdWxkUHVibGlzaEltbWVkaWF0ZWx5KCkpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzNkMWVkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L05ld1J1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuTmV3UnVudGltZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIE5ld1J1bnRpbWVXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKKwkvLyBmaWx0ZXIgYnkgdHlwZS92ZXJzaW9uCisJcHJvdGVjdGVkIFN0cmluZyB0eXBlOworCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKKworCS8vIGZpbHRlciBieSBwYXJ0aWFsIHJ1bnRpbWUgdHlwZSBpZAorCXByb3RlY3RlZCBTdHJpbmcgcnVudGltZVR5cGVJZDsKKworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudD4gZnJhZ21lbnRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50PigpOworCisJcHVibGljIE5ld1J1bnRpbWVXaXphcmRGcmFnbWVudCgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCXB1YmxpYyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQoU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcnVudGltZVR5cGVJZCkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCQl0aGlzLnJ1bnRpbWVUeXBlSWQgPSBydW50aW1lVHlwZUlkOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC50YXNrLldpemFyZFRhc2sjZ2V0V2l6YXJkUGFnZSgpCisJICovCisJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKKwkJcmV0dXJuIG5ldyBOZXdSdW50aW1lQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkLCBnZXRUYXNrTW9kZWwoKSwgdHlwZSwgdmVyc2lvbiwgcnVudGltZVR5cGVJZCk7CisJfQorCisJcHVibGljIExpc3QgZ2V0Q2hpbGRGcmFnbWVudHMoKSB7CisJCUxpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3RJbXBsID0gbmV3IEFycmF5TGlzdDxXaXphcmRGcmFnbWVudD4oKTsKKwkJY3JlYXRlQ2hpbGRGcmFnbWVudHMobGlzdEltcGwpOworCQlyZXR1cm4gbGlzdEltcGw7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgeworCQlpZiAoZ2V0VGFza01vZGVsKCkgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7CisJCWlmIChydW50aW1lID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlXaXphcmRGcmFnbWVudCBzdWIgPSBnZXRXaXphcmRGcmFnbWVudChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7CisJCWlmIChzdWIgIT0gbnVsbCkKKwkJCWxpc3QuYWRkKHN1Yik7CisJCQorCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgeworCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIHNlcnZlciBpbnN0YW5jZW9mIFNlcnZlcldvcmtpbmdDb3B5KSB7CisJCQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7CisJCQkJdHJ5IHsKKwkJCQkJaWYgKHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSAhPSBudWxsICYmICFydW50aW1lLmdldExvY2F0aW9uKCkuaXNFbXB0eSgpKQorCQkJCQkJc3djLmltcG9ydFJ1bnRpbWVDb25maWd1cmF0aW9uKHJ1bnRpbWUsIG51bGwpOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJfQorCQkJCisJCQlsaXN0LmFkZChuZXcgV2l6YXJkRnJhZ21lbnQoKSB7CisJCQkJcHVibGljIHZvaWQgZW50ZXIoKSB7CisJCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZTIgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOworCQkJCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyMiA9IChJU2VydmVyV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOworCQkJCQlzZXJ2ZXIyLnNldFJ1bnRpbWUocnVudGltZTIpOworCQkJCX0KKwkJCX0pOworCQkJCisJCQlzdWIgPSBnZXRXaXphcmRGcmFnbWVudChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOworCQkJaWYgKHN1YiAhPSBudWxsKQorCQkJCWxpc3QuYWRkKHN1Yik7CisJCQkKKwkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVTZXJ2ZXJGcmFnbWVudCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgV2l6YXJkRnJhZ21lbnQgZ2V0V2l6YXJkRnJhZ21lbnQoU3RyaW5nIHR5cGVJZCkgeworCQl0cnkgeworCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBmcmFnbWVudE1hcC5nZXQodHlwZUlkKTsKKwkJCWlmIChmcmFnbWVudCAhPSBudWxsKQorCQkJCXJldHVybiBmcmFnbWVudDsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJCQorCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IFNlcnZlclVJUGx1Z2luLmdldFdpemFyZEZyYWdtZW50KHR5cGVJZCk7CisJCWlmIChmcmFnbWVudCAhPSBudWxsKQorCQkJZnJhZ21lbnRNYXAucHV0KHR5cGVJZCwgZnJhZ21lbnQpOworCQlyZXR1cm4gZnJhZ21lbnQ7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L05ld1NlcnZlcldpemFyZEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwNjk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuTmV3U2VydmVyQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfRVhJU1RJTkcgPSBXaXphcmRUYXNrVXRpbC5NT0RFX0VYSVNUSU5HOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0RFVEVDVCA9IFdpemFyZFRhc2tVdGlsLk1PREVfREVURUNUOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX01BTlVBTCA9IFdpemFyZFRhc2tVdGlsLk1PREVfTUFOVUFMOworCisJcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOworCXByb3RlY3RlZCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlOworCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyVHlwZUlkOworCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50PiBmcmFnbWVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnQ+KCk7CisJcHJvdGVjdGVkIElQYXRoIHJ1bnRpbWVMb2NhdGlvbiA9IG51bGw7CisKKwlwdWJsaWMgTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwlwdWJsaWMgTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQoSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHNlcnZlclR5cGVJZCkgeworCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOworCQl0aGlzLnNlcnZlclR5cGVJZCA9IHNlcnZlclR5cGVJZDsKKwl9CisKKwlwdWJsaWMgTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQoSU1vZHVsZSBtb2R1bGUpIHsKKwkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBlbnRlcigpIHsKKwkJc3VwZXIuZW50ZXIoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suV2l6YXJkVGFzayNnZXRXaXphcmRQYWdlKCkKKwkgKi8KKwlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgeworCQlTdHJpbmcgbGF1bmNoTW9kZSA9IChTdHJpbmcpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19MQVVOQ0hfTU9ERSk7CisJCU5ld1NlcnZlckNvbXBvc2l0ZSBjb21wID0gbnVsbDsKKwkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCB8fCBzZXJ2ZXJUeXBlSWQgIT0gbnVsbCkKKwkJCWNvbXAgPSBuZXcgTmV3U2VydmVyQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkLCBtb2R1bGVUeXBlLCBzZXJ2ZXJUeXBlSWQsIGxhdW5jaE1vZGUpOworCQllbHNlCisJCQljb21wID0gbmV3IE5ld1NlcnZlckNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCwgbW9kdWxlLCBsYXVuY2hNb2RlKTsKKwkJaWYgKGdldFRhc2tNb2RlbCgpICE9IG51bGwpCisJCQljb21wLnNldFRhc2tNb2RlbChnZXRUYXNrTW9kZWwoKSk7CisJCXJldHVybiBjb21wOworCX0KKworCXByb3RlY3RlZCBXaXphcmRGcmFnbWVudCBnZXRXaXphcmRGcmFnbWVudChTdHJpbmcgdHlwZUlkKSB7CisJCXRyeSB7CisJCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IGZyYWdtZW50TWFwLmdldCh0eXBlSWQpOworCQkJaWYgKGZyYWdtZW50ICE9IG51bGwpCisJCQkJcmV0dXJuIGZyYWdtZW50OworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkJCisJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gU2VydmVyVUlQbHVnaW4uZ2V0V2l6YXJkRnJhZ21lbnQodHlwZUlkKTsKKwkJaWYgKGZyYWdtZW50ICE9IG51bGwpCisJCQlmcmFnbWVudE1hcC5wdXQodHlwZUlkLCBmcmFnbWVudCk7CisJCXJldHVybiBmcmFnbWVudDsKKwl9CisKKwlwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKKwkJTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdEltcGwgPSBuZXcgQXJyYXlMaXN0PFdpemFyZEZyYWdtZW50PigpOworCQljcmVhdGVDaGlsZEZyYWdtZW50cyhsaXN0SW1wbCk7CisJCXJldHVybiBsaXN0SW1wbDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7CisJCWlmIChnZXRUYXNrTW9kZWwoKSA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJQnl0ZSBiID0gKEJ5dGUpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX01PREUpOworCQlpZiAoYiAhPSBudWxsICYmIGIuYnl0ZVZhbHVlKCkgPT0gTU9ERV9NQU5VQUwpIHsKKwkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKKwkJCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZSBpbnN0YW5jZW9mIElSdW50aW1lV29ya2luZ0NvcHkpIHsKKwkJCQlXaXphcmRGcmFnbWVudCBzdWIgPSBnZXRXaXphcmRGcmFnbWVudChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7CisJCQkJaWYgKHN1YiAhPSBudWxsKQorCQkJCQlsaXN0LmFkZChzdWIpOworCQkJfQorCQkJCisJCQlJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIgPSAoSVNlcnZlckF0dHJpYnV0ZXMpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOworCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIHNlcnZlciBpbnN0YW5jZW9mIFNlcnZlcldvcmtpbmdDb3B5KSB7CisJCQkJCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOworCQkJCQlpZiAocnVudGltZSAhPSBudWxsICYmIHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSAhPSBudWxsICYmICFydW50aW1lLmdldExvY2F0aW9uKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlpZiAocnVudGltZUxvY2F0aW9uID09IG51bGwgfHwgIXJ1bnRpbWVMb2NhdGlvbi5lcXVhbHMocnVudGltZS5nZXRMb2NhdGlvbigpKSkKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlzd2MuaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24ocnVudGltZSwgbnVsbCk7CisJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQkJCQkvLyBpZ25vcmUKKwkJCQkJCQl9CisJCQkJCQlydW50aW1lTG9jYXRpb24gPSBydW50aW1lLmdldExvY2F0aW9uKCk7CisJCQkJCX0gZWxzZQorCQkJCQkJcnVudGltZUxvY2F0aW9uID0gbnVsbDsKKwkJCQl9CisJCQkJV2l6YXJkRnJhZ21lbnQgc3ViID0gZ2V0V2l6YXJkRnJhZ21lbnQoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKKwkJCQlpZiAoc3ViICE9IG51bGwpCisJCQkJCWxpc3QuYWRkKHN1Yik7CisJCQl9CisJCX0gZWxzZSBpZiAoYiAhPSBudWxsICYmIGIuYnl0ZVZhbHVlKCkgPT0gTU9ERV9FWElTVElORykgeworCQkJLyppZiAoY29tcCAhPSBudWxsKSB7CisJCQkJSVNlcnZlciBzZXJ2ZXIgPSBjb21wLmdldFNlcnZlcigpOworCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCQkJbGlzdC5hZGQobmV3IFRhc2tzV2l6YXJkRnJhZ21lbnQoKSk7CisJCQl9Ki8KKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CisJCXJldHVybiBnZXRTZXJ2ZXIoKSAhPSBudWxsOyAKKwl9CisKKwlwcml2YXRlIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gKElTZXJ2ZXJXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvT3B0aW9uYWxDbGllbnRXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L09wdGlvbmFsQ2xpZW50V2l6YXJkRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTk1MjY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L09wdGlvbmFsQ2xpZW50V2l6YXJkRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKKy8qKgorICogQSBmcmFnbWVudCB1c2VkIHRvIHNlbGVjdCBhIGNsaWVudC4KKyAqLworcHVibGljIGNsYXNzIE9wdGlvbmFsQ2xpZW50V2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7CisJcHJvdGVjdGVkIElDbGllbnRbXSBjbGllbnRzOworCisJcHJvdGVjdGVkIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdDsKKwlwcm90ZWN0ZWQgSVNlcnZlciBsYXN0U2VydmVyOworCXByb3RlY3RlZCBPYmplY3QgbGFzdExhdW5jaGFibGU7CisKKwlwdWJsaWMgT3B0aW9uYWxDbGllbnRXaXphcmRGcmFnbWVudChJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5tb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0OworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKKwkJaWYgKGNsaWVudHMgIT0gbnVsbCAmJiBjbGllbnRzLmxlbmd0aCA+IDEpCisJCQlsaXN0LmFkZChuZXcgU2VsZWN0Q2xpZW50V2l6YXJkRnJhZ21lbnQoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2xpZW50cygpIHsKKwkJaWYgKGdldFRhc2tNb2RlbCgpID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQl0cnkgeworCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7CisJCQkKKwkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgeworCQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0xBVU5DSEFCTEVfQURBUFRFUiwgbnVsbCk7CisJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfTEFVTkNIQUJMRSwgbnVsbCk7CisJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5UUywgbnVsbCk7CisJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMsIG5ldyBCb29sZWFuKGZhbHNlKSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQkvL2lmIChsYXN0U2VydmVyID09IG51bGwpCisJCQkvLwlyZXR1cm47CisJCQkKKwkJCS8vIGdldCB0aGUgbGF1bmNoYWJsZSBhZGFwdGVyIGFuZCBtb2R1bGUgb2JqZWN0CisJCQlPYmplY3QgbGF1bmNoYWJsZSA9IG51bGw7CisJCQl0cnkgeworCQkJCU9iamVjdFtdIG9iaiA9IFNlcnZlclVJUGx1Z2luLmdldExhdW5jaGFibGVBZGFwdGVyKHNlcnZlciwgbW9kdWxlQXJ0aWZhY3QpOworCQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0xBVU5DSEFCTEVfQURBUFRFUiwgb2JqWzBdKTsKKwkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19MQVVOQ0hBQkxFLCBvYmpbMV0pOworCQkJCWxhdW5jaGFibGUgPSBvYmpbMV07CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfTEFVTkNIQUJMRV9BREFQVEVSLCBudWxsKTsKKwkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19MQVVOQ0hBQkxFLCBudWxsKTsKKwkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlRTLCBudWxsKTsKKwkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19IQVNfQ0xJRU5UUywgbmV3IEJvb2xlYW4oZmFsc2UpKTsKKwkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IobnVsbCwgY2UuZ2V0U3RhdHVzKCkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJLy8gc3RvcCBoZXJlIGlmIHRoZSBzZXJ2ZXIgYW5kIGxhdW5jaGFibGUgaGF2ZW4ndCBjaGFuZ2VkCisJCQlpZiAobGFzdFNlcnZlciAhPSBudWxsICYmIGxhc3RTZXJ2ZXIuZXF1YWxzKHNlcnZlcikpIHsKKwkJCQlpZiAobGFzdExhdW5jaGFibGUgPT0gbnVsbCAmJiBsYXVuY2hhYmxlID09IG51bGwpCisJCQkJCXJldHVybjsKKwkJCQlpZiAobGFzdExhdW5jaGFibGUgIT0gbnVsbCAmJiBsYXN0TGF1bmNoYWJsZS5lcXVhbHMobGF1bmNoYWJsZSkpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWxhc3RTZXJ2ZXIgPSBzZXJ2ZXI7CisJCQlsYXN0TGF1bmNoYWJsZSA9IGxhdW5jaGFibGU7CisJCQkKKwkJCVN0cmluZyBsYXVuY2hNb2RlID0gKFN0cmluZykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX0xBVU5DSF9NT0RFKTsKKwkJCWNsaWVudHMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRDbGllbnRzKHNlcnZlciwgbGF1bmNoYWJsZSwgbGF1bmNoTW9kZSk7CisJCQkKKwkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0NMSUVOVFMsIG51bGwpOworCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMsIG5ldyBCb29sZWFuKGZhbHNlKSk7CisJCQlpZiAoY2xpZW50cyAhPSBudWxsKSB7CisJCQkJaWYgKGNsaWVudHMubGVuZ3RoID4gMSkgeworCQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlRTLCBjbGllbnRzKTsKKwkJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMsIG5ldyBCb29sZWFuKHRydWUpKTsKKwkJCQl9IGVsc2UKKwkJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5ULCBjbGllbnRzWzBdKTsKKwkJCX0KKwkJCQorCQkJdXBkYXRlQ2hpbGRGcmFnbWVudHMoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJfQorCisJcHVibGljIHZvaWQgZW50ZXIoKSB7CisJCXVwZGF0ZUNsaWVudHMoKTsKKwl9CisKKwlwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKKwkJdXBkYXRlQ2xpZW50cygpOworCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGcmFnbWVudHMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgeworCQlzdXBlci5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKKwkJdXBkYXRlQ2xpZW50cygpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1J1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmZjZjdhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1J1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OworLyoqCisgKiBBIGZyYWdtZW50IHVzZWQgZm9yIHRoZSBSdW4gb24gU2VydmVyIHdpemFyZC4KKyAqLworcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7CisJcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOworCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKKwlwcm90ZWN0ZWQgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0OworCisJLyoqCisJICogQ3JlYXRlIHRoZSBSdW4gb24gU2VydmVyIHdpemFyZCB3aXRoIGFsbCBwYWdlcy4KKwkgKiAKKwkgKiBAcGFyYW0gbW9kdWxlCisJICogQHBhcmFtIGxhdW5jaE1vZGUKKwkgKiBAcGFyYW0gbW9kdWxlQXJ0aWZhY3QKKwkgKi8KKwlwdWJsaWMgUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudChJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgeworCQlzdXBlcigpOworCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKKwkJdGhpcy5tb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0OworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0aGUgUnVuIG9uIFNlcnZlciB3aXphcmQgd2l0aCBhIGRlZmF1bHQgc2VydmVyLgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKKwkgKiBAcGFyYW0gbGF1bmNoTW9kZQorCSAqIEBwYXJhbSBtb2R1bGVBcnRpZmFjdAorCSAqLworCXB1YmxpYyBSdW5PblNlcnZlcldpemFyZEZyYWdtZW50KElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuc2VydmVyID0gc2VydmVyOworCQl0aGlzLm1vZHVsZUFydGlmYWN0ID0gbW9kdWxlQXJ0aWZhY3Q7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgeworCQlpZiAoc2VydmVyID09IG51bGwpIHsKKwkJCWxpc3QuYWRkKG5ldyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudChtb2R1bGUpKTsKKwkJCQorCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuVGVtcFNhdmVSdW50aW1lRnJhZ21lbnQpOworCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuVGVtcFNhdmVTZXJ2ZXJGcmFnbWVudCk7CisJCQkKKwkJCWxpc3QuYWRkKG5ldyBNb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQobW9kdWxlKSk7CisJCX0KKwkJCisJCWxpc3QuYWRkKG5ldyBUYXNrc1dpemFyZEZyYWdtZW50KCkpOworCQkKKwkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVJ1bnRpbWVGcmFnbWVudCk7CisJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVTZXJ2ZXJGcmFnbWVudCk7CisJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKKwkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVIb3N0bmFtZUZyYWdtZW50KTsKKwkJCisJCWxpc3QuYWRkKG5ldyBPcHRpb25hbENsaWVudFdpemFyZEZyYWdtZW50KG1vZHVsZUFydGlmYWN0KSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9TZWxlY3RDbGllbnRXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1NlbGVjdENsaWVudFdpemFyZEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3ZWI3NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9TZWxlY3RDbGllbnRXaXphcmRGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5TZWxlY3RDbGllbnRDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKKy8qKgorICogQSBmcmFnbWVudCB1c2VkIHRvIHNlbGVjdCBhIGNsaWVudC4KKyAqLworcHVibGljIGNsYXNzIFNlbGVjdENsaWVudFdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgeworCXB1YmxpYyBTZWxlY3RDbGllbnRXaXphcmRGcmFnbWVudCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7CisJCXJldHVybiBuZXcgU2VsZWN0Q2xpZW50Q29tcG9zaXRlKHBhcmVudCwgd2l6YXJkLCBnZXRUYXNrTW9kZWwoKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKKwkJdHJ5IHsKKwkJCUlDbGllbnRbXSBjbGllbnRzID0gKElDbGllbnRbXSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5UUyk7CisJCQlpZiAoY2xpZW50cyA9PSBudWxsIHx8IGNsaWVudHMubGVuZ3RoIDwgMikKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlyZXR1cm4gZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5UKSAhPSBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvU3ViVGFza3NXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1N1YlRhc2tzV2l6YXJkRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjRhMWUzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1N1YlRhc2tzV2l6YXJkRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuVGFza3NDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJUYXNrc1dpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgeworCXByb3RlY3RlZCBUYXNrc0NvbXBvc2l0ZSBjb21wOworCisJcHJvdGVjdGVkIExpc3QgdGFza3M7CisKKwlwdWJsaWMgU3ViVGFza3NXaXphcmRGcmFnbWVudCgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCXB1YmxpYyB2b2lkIGVudGVyKCkgeworCQl1cGRhdGVUYXNrcyh0YXNrcyk7CisJCQorCQlpZiAoY29tcCAhPSBudWxsKQorCQkJY29tcC5jcmVhdGVDb250cm9sKCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlVGFza3MoTGlzdCBuZXdUYXNrcykgeworCQl0YXNrcyA9IG5ld1Rhc2tzOworCQlpZiAoY29tcCAhPSBudWxsKQorCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJaWYgKGNvbXAgIT0gbnVsbCAmJiAhY29tcC5pc0Rpc3Bvc2VkKCkpCisJCQkJCQljb21wLnNldFRhc2tzKHRhc2tzKTsKKwkJCQl9CisJCQl9KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQorCSAqLworCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7CisJCWNvbXAgPSBuZXcgVGFza3NDb21wb3NpdGUocGFyZW50LCB3aXphcmQpOworCQlyZXR1cm4gY29tcDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvVGFza3NXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1Rhc2tzV2l6YXJkRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmM1ZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1Rhc2tzV2l6YXJkRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDMwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLklPcmRlcmVkOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRhc2tzV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBU0tTX1BFUl9QQUdFID0gNTsKKworCXB1YmxpYyBjbGFzcyBUYXNrSW5mbyBpbXBsZW1lbnRzIElPcmRlcmVkIHsKKwkJcHVibGljIGludCBraW5kOworCQlwdWJsaWMgU3RyaW5nIGlkOworCQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbiB0YXNrMjsKKwkJCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUID0gImRlZmF1bHQ6IjsKKwkJCisJCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7CisJCQlpZiAoaWQgPT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJCWlmIChzZWxlY3RlZFRhc2tNYXAuY29udGFpbnNLZXkoaWQpKQorCQkJCXJldHVybiAoc2VsZWN0ZWRUYXNrTWFwLmdldChpZCkpLmJvb2xlYW5WYWx1ZSgpOworCQkJCisJCQlpZiAoc2VsZWN0ZWRUYXNrTWFwLmNvbnRhaW5zS2V5KERFRkFVTFQgKyBpZCkpCisJCQkJcmV0dXJuIChzZWxlY3RlZFRhc2tNYXAuZ2V0KERFRkFVTFQgKyBpZCkpLmJvb2xlYW5WYWx1ZSgpOworCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZWxlY3RlZChib29sZWFuIHNlbCkgeworCQkJc2VsZWN0ZWRUYXNrTWFwLnB1dChERUZBVUxUICsgZ2V0SWQoKSwgbmV3IEJvb2xlYW4oc2VsKSk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0U2VsZWN0ZWQoKSB7CisJCQlyZXR1cm4gKHNlbGVjdGVkVGFza01hcC5nZXQoREVGQVVMVCArIGlkKSkuYm9vbGVhblZhbHVlKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbCkgeworCQkJc2VsZWN0ZWRUYXNrTWFwLnB1dChnZXRJZCgpLCBuZXcgQm9vbGVhbihzZWwpKTsKKwkJfQorCQkKKwkJcHVibGljIGludCBnZXRPcmRlcigpIHsKKwkJCXJldHVybiB0YXNrMi5nZXRPcmRlcigpOworCQl9CisJCQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldElkKCkgeworCQkJcmV0dXJuIGlkOworCQl9CisJCQorCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVGFza0luZm8pKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJVGFza0luZm8gdGkgPSAoVGFza0luZm8pIG9iajsKKwkJCWlmIChraW5kICE9IHRpLmtpbmQpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlpZiAoaWQgPT0gbnVsbCB8fCAhaWQuZXF1YWxzKHRpLmlkKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJCWlmICh0YXNrMiA9PSBudWxsICYmIHRpLnRhc2syICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlpZiAodGFzazIgIT0gbnVsbCAmJiB0aS50YXNrMiA9PSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJdHJ5IHsKKwkJCQlpZiAodGFzazIgIT0gbnVsbCAmJiB0aS50YXNrMiAhPSBudWxsKSB7CisJCQkJCWlmICh0YXNrMi5nZXRLaW5kKCkgIT0gdGkudGFzazIuZ2V0S2luZCgpKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQlpZiAodGFzazIuZ2V0T3JkZXIoKSAhPSB0aS50YXNrMi5nZXRPcmRlcigpKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQlpZiAoIXRhc2syLmdldExhYmVsKCkuZXF1YWxzKHRpLnRhc2syLmdldExhYmVsKCkpKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQlpZiAoIXRhc2syLmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKHRpLnRhc2syLmdldERlc2NyaXB0aW9uKCkpKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBMaXN0PFRhc2tJbmZvPiB0YXNrczsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNPcHRpb25hbFRhc2tzOworCXByb3RlY3RlZCBib29sZWFuIGhhc1ByZWZlcnJlZFRhc2tzOworCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEJvb2xlYW4+IHNlbGVjdGVkVGFza01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKKworCXB1YmxpYyBUYXNrc1dpemFyZEZyYWdtZW50KCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgeworCQlpZiAodGFza3MgPT0gbnVsbCB8fCB0YXNrcy5pc0VtcHR5KCkpCisJCQlyZXR1cm47CisJCQorCQlpbnQgc2l6ZSA9IHRhc2tzLnNpemUoKTsKKwkJaW50IHBhZ2VzID0gKHNpemUgLSAxKSAvIFRBU0tTX1BFUl9QQUdFICsgMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CisJCQlTdWJUYXNrc1dpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbmV3IFN1YlRhc2tzV2l6YXJkRnJhZ21lbnQoKTsKKwkJCUxpc3QgbGlzdDIgPSB0YXNrcy5zdWJMaXN0KFRBU0tTX1BFUl9QQUdFICogaSwgTWF0aC5taW4oc2l6ZSwgVEFTS1NfUEVSX1BBR0UgKiAoaSsxKSkpOworCQkJZnJhZ21lbnQudXBkYXRlVGFza3MobGlzdDIpOworCQkJbGlzdC5hZGQoZnJhZ21lbnQpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgZW50ZXIoKSB7CisJCXVwZGF0ZVRhc2tzKCk7CisJfQorCisJcHVibGljIExpc3QgZ2V0Q2hpbGRGcmFnbWVudHMoKSB7CisJCXVwZGF0ZVRhc2tzKCk7CisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZyYWdtZW50cygpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7CisJCXN1cGVyLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOworCQl1cGRhdGVUYXNrcygpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZVRhc2tzKCkgeworCQlpZiAoZ2V0VGFza01vZGVsKCkgPT0gbnVsbCkgeworCQkJdGFza3MgPSBudWxsOworCQkJcmV0dXJuOworCQl9CisJCQorCQlJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIgPSAoSVNlcnZlckF0dHJpYnV0ZXMpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOworCQlMaXN0IG1vZHVsZXMgPSAoTGlzdCkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX01PRFVMRVMpOworCQkKKwkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZXMgPT0gbnVsbCkgeworCQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVbXT4oKTsKKwkJCSgoU2VydmVyKSBzZXJ2ZXIpLnZpc2l0KG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKKwkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlMikgeworCQkJCQltb2R1bGVMaXN0LmFkZChtb2R1bGUyKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfSwgbnVsbCk7CisJCQkKKwkJCW1vZHVsZXMgPSBtb2R1bGVMaXN0OworCQl9CisJCQorCQlpZiAoc2VydmVyICE9IG51bGwgJiYgbW9kdWxlcyAhPSBudWxsKSB7CisJCQloYXNPcHRpb25hbFRhc2tzID0gZmFsc2U7CisJCQloYXNQcmVmZXJyZWRUYXNrcyA9IGZhbHNlOworCQkJTGlzdDxUYXNrSW5mbz4gdGFza0xpc3QgPSBuZXcgQXJyYXlMaXN0PFRhc2tJbmZvPig1KTsKKwkJCWNyZWF0ZVRhc2tzKHRhc2tMaXN0LCBzZXJ2ZXIsIG1vZHVsZXMpOworCQkJCisJCQlpZiAodGFza3MgPT0gbnVsbCB8fCAhdGFza3MuZXF1YWxzKHRhc2tMaXN0KSkgeworCQkJCXRhc2tzID0gdGFza0xpc3Q7CisJCQkJdXBkYXRlQ2hpbGRGcmFnbWVudHMoKTsKKwkJCQkKKwkJCQlib29sZWFuIGIgPSBoYXNPcHRpb25hbFRhc2tzIHx8IGhhc1ByZWZlcnJlZFRhc2tzOworCQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0hBU19UQVNLUywgbmV3IEJvb2xlYW4oYikpOwkJCQkKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhc2tzKExpc3Q8VGFza0luZm8+IHRhc2tMaXN0LCBJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIsIExpc3QgbW9kdWxlcykgeworCQlpZiAoc2VydmVyID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlMaXN0PFN0cmluZz4gZW5hYmxlZFRhc2tzID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRFbmFibGVkT3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9uSWRzKCk7CisJCUxpc3Q8U3RyaW5nPiBkaXNhYmxlZFRhc2tzID0gKChTZXJ2ZXIpc2VydmVyKS5nZXREaXNhYmxlZFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25JZHMoKTsKKwkJUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzMiA9ICgoU2VydmVyKXNlcnZlcikuZ2V0QWxsVGFza3MobW9kdWxlcyk7CisJCWZvciAoaW50IGogPSAwOyBqIDwgdGFza3MyLmxlbmd0aDsgaisrKSB7CisJCQlpbnQga2luZCA9IHRhc2tzMltqXS5nZXRLaW5kKCk7CisJCQlTdHJpbmcgaWQgPSAoKFNlcnZlcilzZXJ2ZXIpLmdldFB1Ymxpc2hPcGVyYXRpb25JZCh0YXNrczJbal0pOworCQkJaWYgKGtpbmQgPT0gUHVibGlzaE9wZXJhdGlvbi5PUFRJT05BTCB8fCBraW5kID09IFB1Ymxpc2hPcGVyYXRpb24uUFJFRkVSUkVEKQorCQkJCWhhc09wdGlvbmFsVGFza3MgPSB0cnVlOworCQkJaWYgKGtpbmQgPT0gUHVibGlzaE9wZXJhdGlvbi5QUkVGRVJSRUQpCisJCQkJaGFzUHJlZmVycmVkVGFza3MgPSB0cnVlOworCQkJdGFza3MyW2pdLnNldFRhc2tNb2RlbChnZXRUYXNrTW9kZWwoKSk7CisJCQkKKwkJCWJvb2xlYW4gc2VsZWN0ZWQgPSB0cnVlOworCQkJaWYgKGtpbmQgPT0gUHVibGlzaE9wZXJhdGlvbi5PUFRJT05BTCkgeworCQkJCWlmICghZW5hYmxlZFRhc2tzLmNvbnRhaW5zKGlkKSkKKwkJCQkJc2VsZWN0ZWQgPSBmYWxzZTsKKwkJCX0gZWxzZSBpZiAoa2luZCA9PSBQdWJsaXNoT3BlcmF0aW9uLlBSRUZFUlJFRCkgeworCQkJCWlmIChkaXNhYmxlZFRhc2tzLmNvbnRhaW5zKGlkKSkKKwkJCQkJc2VsZWN0ZWQgPSBmYWxzZTsKKwkJCX0KKwkJCXRhc2tMaXN0LmFkZChnZXRTZXJ2ZXJUYXNrKHNlcnZlciwgdGFza3MyW2pdLCBzZWxlY3RlZCkpOworCQl9CisJfQorCisJcHVibGljIFRhc2tJbmZvIGdldFNlcnZlclRhc2soSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyLCBQdWJsaXNoT3BlcmF0aW9uIHRhc2syLCBib29sZWFuIHNlbGVjdGVkKSB7CisJCVRhc2tJbmZvIHN0aSA9IG5ldyBUYXNrSW5mbygpOworCQlzdGkudGFzazIgPSB0YXNrMjsKKwkJc3RpLmtpbmQgPSB0YXNrMi5nZXRLaW5kKCk7CisJCXN0aS5pZCA9ICgoU2VydmVyKXNlcnZlcikuZ2V0UHVibGlzaE9wZXJhdGlvbklkKHRhc2syKTsKKwkJc3RpLnNldERlZmF1bHRTZWxlY3RlZChzZWxlY3RlZCk7CisJCQorCQlyZXR1cm4gc3RpOworCX0KKworCS8qKgorCSAqIEBzZWUgV2l6YXJkRnJhZ21lbnQjcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmICghaGFzT3B0aW9uYWxUYXNrcykKKwkJCXJldHVybjsKKwkJCisJCWlmICh0YXNrcyA9PSBudWxsIHx8IHRhc2tzLmlzRW1wdHkoKSkKKwkJCXJldHVybjsKKwkJCisJCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBnZXRUYXNrTW9kZWwoKTsKKwkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcil0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7CisJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWJvb2xlYW4gY3JlYXRlZFdDID0gZmFsc2U7CisJCVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKKwkJaWYgKHNlcnZlciBpbnN0YW5jZW9mIFNlcnZlcldvcmtpbmdDb3B5KQorCQkJd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpc2VydmVyOworCQllbHNlIHsKKwkJCXdjID0gKFNlcnZlcldvcmtpbmdDb3B5KXNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOworCQkJY3JlYXRlZFdDID0gdHJ1ZTsKKwkJfQorCQkKKwkJLy8gY29tcGFyZSBsaXN0cworCQlMaXN0PFN0cmluZz4gZGlzYWJsZWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJTGlzdDxTdHJpbmc+IGVuYWJsZWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrcy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlUYXNrSW5mbyB0YXNrID0gKFRhc2tJbmZvKWl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChQdWJsaXNoT3BlcmF0aW9uLlJFUVVJUkVEID09IHRhc2sua2luZCkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJU3RyaW5nIGlkID0gd2MuZ2V0UHVibGlzaE9wZXJhdGlvbklkKHRhc2sudGFzazIpOworCQkJaWYgKFB1Ymxpc2hPcGVyYXRpb24uUFJFRkVSUkVEID09IHRhc2sua2luZCkgeworCQkJCWlmICghdGFzay5pc1NlbGVjdGVkKCkpCisJCQkJCWRpc2FibGVkLmFkZChpZCk7CisJCQl9IGVsc2UgaWYgKFB1Ymxpc2hPcGVyYXRpb24uT1BUSU9OQUwgPT0gdGFzay5raW5kKSB7CisJCQkJaWYgKHRhc2suaXNTZWxlY3RlZCgpKQorCQkJCQllbmFibGVkLmFkZChpZCk7CisJCQl9CisJCX0KKwkJCisJCUxpc3Q8U3RyaW5nPiBjdXJEaXNhYmxlZCA9IHdjLmdldERpc2FibGVkUHJlZmVycmVkUHVibGlzaE9wZXJhdGlvbklkcygpOworCQlMaXN0PFN0cmluZz4gY3VyRW5hYmxlZCA9IHdjLmdldEVuYWJsZWRPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25JZHMoKTsKKwkJCisJCWJvb2xlYW4gZGlmZmVyZW50ID0gZmFsc2U7CisJCWlmIChjdXJFbmFibGVkLnNpemUoKSAhPSBlbmFibGVkLnNpemUoKSB8fCBjdXJEaXNhYmxlZC5zaXplKCkgIT0gZGlzYWJsZWQuc2l6ZSgpKSB7CisJCQlkaWZmZXJlbnQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJZm9yIChTdHJpbmcgaWQgOiBjdXJEaXNhYmxlZCkgeworCQkJCWlmICghZGlzYWJsZWQuY29udGFpbnMoaWQpKQorCQkJCQlkaWZmZXJlbnQgPSB0cnVlOworCQkJfQorCQkJZm9yIChTdHJpbmcgaWQgOiBjdXJFbmFibGVkKSB7CisJCQkJaWYgKCFlbmFibGVkLmNvbnRhaW5zKGlkKSkKKwkJCQkJZGlmZmVyZW50ID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKGRpZmZlcmVudCkgeworCQkJd2MucmVzZXRQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9ucygpOworCQkJd2MucmVzZXRPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25zKCk7CisJCQkKKwkJCUl0ZXJhdG9yPFRhc2tJbmZvPiBpdGVyYXRvcjIgPSB0YXNrcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKKwkJCQlUYXNrSW5mbyB0YXNrID0gaXRlcmF0b3IyLm5leHQoKTsKKwkJCQlpZiAoUHVibGlzaE9wZXJhdGlvbi5SRVFVSVJFRCA9PSB0YXNrLmtpbmQpCisJCQkJCWNvbnRpbnVlOworCQkJCQorCQkJCWlmIChQdWJsaXNoT3BlcmF0aW9uLlBSRUZFUlJFRCA9PSB0YXNrLmtpbmQpIHsKKwkJCQkJaWYgKCF0YXNrLmlzU2VsZWN0ZWQoKSkKKwkJCQkJCXdjLmRpc2FibGVQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9ucyh0YXNrLnRhc2syKTsKKwkJCQl9IGVsc2UgaWYgKFB1Ymxpc2hPcGVyYXRpb24uT1BUSU9OQUwgPT0gdGFzay5raW5kKSB7CisJCQkJCWlmICh0YXNrLmlzU2VsZWN0ZWQoKSkKKwkJCQkJCXdjLmVuYWJsZU9wdGlvbmFsUHVibGlzaE9wZXJhdGlvbnModGFzay50YXNrMik7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAoY3JlYXRlZFdDICYmIHdjLmlzRGlydHkoKSkKKwkJCXdjLnNhdmUodHJ1ZSwgbW9uaXRvcik7CisJCW1vbml0b3IuZG9uZSgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9FeHRlbnNpb24yQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9FeHRlbnNpb24yQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2M2YwMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0V4dGVuc2lvbjJDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5FeHRlbnNpb25Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuRXh0ZW5zaW9uV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKKy8qKgorICogQSBjb21wb3NpdGUgdXNlZCB0byBzZWxlY3QgYSBzZXJ2ZXIgdG8gaW5zdGFsbC4KKyAqLworcHVibGljIGNsYXNzIEV4dGVuc2lvbjJDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCXByaXZhdGUgVGFza01vZGVsIHRhc2tNb2RlbDsKKwlwcml2YXRlIElXaXphcmRIYW5kbGUgd2l6YXJkOworCXByaXZhdGUgRXh0ZW5zaW9uQ29tcG9zaXRlIGNvbXA7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgTmV3SW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGUuCisJICogCisJICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKKwkgKiBAcGFyYW0gdGFza01vZGVsIGEgdGFzayBtb2RlbAorCSAqIEBwYXJhbSB3aXphcmQgdGhlIHdpemFyZCB0aGlzIGNvbXBvc2l0ZSBpcyBjb250YWluZWQgaW4KKwkgKi8KKwlwdWJsaWMgRXh0ZW5zaW9uMkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBUYXNrTW9kZWwgdGFza01vZGVsLCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKKwkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7CisJCXRoaXMud2l6YXJkID0gd2l6YXJkOworCQkKKwkJY3JlYXRlQ29udHJvbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIFVJIG9mIHRoZSBwYWdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCQlzZXRMYXlvdXQobGF5b3V0KTsKKwkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5TRUxFQ1RfQ0xJRU5UX1dJWkFSRCk7CisJCQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CisJCWRhdGEud2lkdGhIaW50ID0gMjI1OworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyTWVzc2FnZSk7CisJCQorCQljb21wID0gbmV3IEV4dGVuc2lvbkNvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSwgbmV3IEV4dGVuc2lvbkNvbXBvc2l0ZS5GZWF0dXJlU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBmZWF0dXJlU2VsZWN0ZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQkJCWhhbmRsZVNlbGVjdGlvbihmZWF0dXJlKTsKKwkJCX0KKwkJfSk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZGF0YS5oZWlnaHRIaW50ID0gMjAwOworCQljb21wLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOworCQkKKwkJLypKb2Igam9iID0gbmV3IEpvYigiRG93bmxvYWRpbmcgaW5mb3JtYXRpb24iKSB7CisJCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQljb21wLmRlZmVycmVkSW5pdGlhbGl6ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJLy8gaWdub3JlIC0gdmlldyBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZAorCQkJCQkJfQorCQkJCQl9CisJCQkJfSk7CisJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQl9CisJCX07CisJCQorCQlqb2Iuc2V0U3lzdGVtKHRydWUpOworCQlqb2Iuc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKKwkJam9iLnNjaGVkdWxlKCk7Ki8KKwkJCisJCS8qVGhyZWFkIHQ9IG5ldyBUaHJlYWQoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJcnVuQmFja2dyb3VuZCgpOworCQkJCQl9CisJCQkJfSk7CisJCQl9CisJCX07CisJCXQuc3RhcnQoKTsqLworCQkvL3J1bkJhY2tncm91bmQoKTsKKwl9CisKKwkvKnByb3RlY3RlZCB2b2lkIHJ1bkJhY2tncm91bmQoKSB7CisJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJY29tcC5kZWZlcnJlZEluaXRpYWxpemUobW9uaXRvcik7CisJCQl9CisJCX07CisJCXRyeSB7CisJCQl3aXphcmQucnVuKHRydWUsIGZhbHNlLCBydW5uYWJsZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aXRoIHJ1bm5hYmxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0qLworCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJdGFza01vZGVsLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0ZFQVRVUkUsIGZlYXR1cmUpOworCQlFeHRlbnNpb25XaXphcmQuaW52YWxpZGF0ZUxpY2Vuc2UodGFza01vZGVsKTsKKwkJd2l6YXJkLnVwZGF0ZSgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9GaXhlZFRhYmxlTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9GaXhlZFRhYmxlTGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3OTMyMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0ZpeGVkVGFibGVMYXlvdXQuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKKworLy9pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKy8vaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRml4ZWRUYWJsZUxheW91dCBleHRlbmRzIExheW91dCB7CisJLy9wcml2YXRlIExpc3QgY29sdW1ucyA9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwkvKnB1YmxpYyB2b2lkIGFkZENvbHVtbkRhdGEoSW50ZWdlciBkYXRhKSB7CisJCWNvbHVtbnMuYWRkKGRhdGEpOworCX0qLworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0I2NvbXB1dGVTaXplKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pCisJICovCisJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKKwkJVGFibGUgdGFibGUgPSAoVGFibGUpIGNvbXBvc2l0ZTsKKwkJUG9pbnQgcmVzdWx0ID0gdGFibGUuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQjbGF5b3V0KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgYm9vbGVhbikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb21wb3NpdGU7CisJCVRhYmxlQ29sdW1uW10gdGFibGVDb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOworCQlpbnQgd2lkdGggPSB0YWJsZS5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAxMDsKKwkJCisJCXRhYmxlQ29sdW1uc1swXS5zZXRXaWR0aCh3aWR0aCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0hvc3RuYW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Ib3N0bmFtZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDRiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Ib3N0bmFtZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQXV0b0NvbXBsZXRlRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udHJvbERlY29yYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LlRleHRDb250ZW50QWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworLyoqCisgKiBBIGNvbXBvc2l0ZSB1c2VkIHRvIHNlbGVjdCBhIGhvc3RuYW1lLgorICovCitwdWJsaWMgY2xhc3MgSG9zdG5hbWVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEhPU1QgPSAibG9jYWxob3N0IjsKKwlwcm90ZWN0ZWQgU3RyaW5nIGhvc3Q7CisJcHJvdGVjdGVkIElIb3N0bmFtZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOworCQorCXByb3RlY3RlZCBUZXh0IGhvc3RuYW1lOworCQorCXB1YmxpYyBpbnRlcmZhY2UgSUhvc3RuYW1lU2VsZWN0aW9uTGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCBob3N0bmFtZVNlbGVjdGVkKFN0cmluZyBob3N0KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgSG9zdG5hbWVDb21wb3NpdGUuCisJICogCisJICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKKwkgKiBAcGFyYW0gbGlzdGVuZXIyIGEgaG9zdG5hbWUgc2VsZWN0aW9uIGxpc3RlbmVyCisJICovCisJcHVibGljIEhvc3RuYW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElIb3N0bmFtZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMikgeworCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKKwkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyMjsKKwkJCisJCWNyZWF0ZUNvbnRyb2woKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgeworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJc2V0TGF5b3V0KGxheW91dCk7CisJCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuU0VMRUNUX0NMSUVOVF9XSVpBUkQpOworCQkKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOworCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmhvc3RuYW1lKTsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7CisJCQorCQlob3N0bmFtZSA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOworCQlob3N0bmFtZS5zZXRUZXh0KExPQ0FMSE9TVCk7CisJCWZpbmFsIENvbnRyb2xEZWNvcmF0aW9uIGhvc3RuYW1lRGVjb3JhdGlvbiA9IG5ldyBDb250cm9sRGVjb3JhdGlvbihob3N0bmFtZSwgU1dULlRPUCB8IFNXVC5MRUFEKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJaG9zdG5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCWhvc3RuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCWhvc3RuYW1lQ2hhbmdlZChob3N0bmFtZS5nZXRUZXh0KCkpOworCQkJfQorCQl9KTsKKwkJCisJCUZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpOworCQlGaWVsZERlY29yYXRpb24gZmQgPSByZWdpc3RyeS5nZXRGaWVsZERlY29yYXRpb24oRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuREVDX0NPTlRFTlRfUFJPUE9TQUwpOworCQlob3N0bmFtZURlY29yYXRpb24uc2V0SW1hZ2UoZmQuZ2V0SW1hZ2UoKSk7CisJCWhvc3RuYW1lRGVjb3JhdGlvbi5zZXREZXNjcmlwdGlvblRleHQoZmQuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQorCQlob3N0bmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7CisJCQkJaG9zdG5hbWVEZWNvcmF0aW9uLnNob3coKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgeworCQkJCWhvc3RuYW1lRGVjb3JhdGlvbi5oaWRlKCk7CisJCQl9CisJCX0pOworCQkKKwkJTGlzdDxTdHJpbmc+IGhvc3RzID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRIb3N0bmFtZXMoKTsKKwkJU3RyaW5nW10gaG9zdHMyID0gaG9zdHMudG9BcnJheShuZXcgU3RyaW5nW2hvc3RzLnNpemUoKV0pOworCQluZXcgQXV0b0NvbXBsZXRlRmllbGQoaG9zdG5hbWUsIG5ldyBUZXh0Q29udGVudEFkYXB0ZXIoKSwgaG9zdHMyKTsKKwkJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaG9zdG5hbWVDaGFuZ2VkKFN0cmluZyBuZXdIb3N0KSB7CisJCWlmIChuZXdIb3N0ID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlpZiAobmV3SG9zdC5lcXVhbHMoaG9zdCkpCisJCQlyZXR1cm47CisKKwkJaG9zdCA9IG5ld0hvc3Q7CisJCWxpc3RlbmVyLmhvc3RuYW1lU2VsZWN0ZWQoaG9zdCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRIb3N0bmFtZSgpIHsKKwkJcmV0dXJuIGhvc3Q7CisJfQorCisJcHVibGljIHZvaWQgc2V0SG9zdG5hbWUoU3RyaW5nIG5ld0hvc3RuYW1lKSB7CisJCWhvc3RuYW1lLnNldFRleHQobmV3SG9zdG5hbWUpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0xpY2Vuc2VDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0xpY2Vuc2VDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlhY2JkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTGljZW5zZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50LkxpY2Vuc2VXaXphcmRGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisvKioKKyAqIEEgY29tcG9zaXRlIHVzZWQgdG8gYWNjZXB0IGEgbGljZW5zZS4KKyAqLworcHVibGljIGNsYXNzIExpY2Vuc2VDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCWNsYXNzIExpY2Vuc2VMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgeworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERU5UID0gMTU7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEFDSU5HID0gNTsKKwkJCisJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCQlpZiAod0hpbnQgPCAyMDApCisJCQkJd0hpbnQgPSAyMDA7CisJCQlpZiAoaEhpbnQgPCAzMDApCisJCQkJaEhpbnQgPSAzMDA7CisJCQlyZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7CisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKKwkJCVBvaW50IHAxID0gY2hpbGRyZW5bMV0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKKwkJCVBvaW50IHAyID0gY2hpbGRyZW5bMl0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKKwkJCQorCQkJUmVjdGFuZ2xlIHIgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOworCQkJCisJCQljaGlsZHJlblsyXS5zZXRCb3VuZHMoci54ICsgSU5ERU5ULCByLnkgKyByLmhlaWdodCAtIHAyLnksIHIud2lkdGggLSBJTkRFTlQsIHAyLnkpOworCQkJY2hpbGRyZW5bMV0uc2V0Qm91bmRzKHIueCArIElOREVOVCwgci55ICsgci5oZWlnaHQgLSBwMi55IC0gcDEueSAtIFNQQUNJTkcsIHIud2lkdGggLSBJTkRFTlQsIHAxLnkpOworCQkJY2hpbGRyZW5bMF0uc2V0Qm91bmRzKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCAtIHAxLnkgLSBwMi55IC0gU1BBQ0lORyAqIDMpOworCQl9CisJfQorCisJcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7CisJcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOworCXByb3RlY3RlZCBUZXh0IGxpY2Vuc2VUZXh0OworCXByb3RlY3RlZCBCdXR0b24gYWNjZXB0OworCXByb3RlY3RlZCBCdXR0b24gZGVjbGluZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRlZDsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBMaWNlbnNlQ29tcG9zaXRlLgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCisJICogQHBhcmFtIHRhc2tNb2RlbCBhIHRhc2sgbW9kZWwKKwkgKiBAcGFyYW0gd2l6YXJkIHRoZSB3aXphcmQgdGhpcyBjb21wb3NpdGUgaXMgY29udGFpbmVkIGluCisJICovCisJcHVibGljIExpY2Vuc2VDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgVGFza01vZGVsIHRhc2tNb2RlbCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7CisJCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOworCQl0aGlzLndpemFyZCA9IHdpemFyZDsKKwkJCisJCWNyZWF0ZUNvbnRyb2woKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgeworCQlzZXRMYXlvdXQobmV3IExpY2Vuc2VMYXlvdXQoKSk7CisJCQorCQlsaWNlbnNlVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOworCQlsaWNlbnNlVGV4dC5zZXRCYWNrZ3JvdW5kKGxpY2Vuc2VUZXh0LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7CisJCQorCQlhY2NlcHQgPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7CisJCWFjY2VwdC5zZXRUZXh0KE1lc3NhZ2VzLndpekxpY2Vuc2VBY2NlcHQpOworCQlhY2NlcHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJYWNjZXB0ZWQgPSBhY2NlcHQuZ2V0U2VsZWN0aW9uKCk7CisJCQkJdGFza01vZGVsLnB1dE9iamVjdChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9BQ0NFUFQsIG5ldyBCb29sZWFuKGFjY2VwdGVkKSk7CisJCQkJd2l6YXJkLnVwZGF0ZSgpOworCQkJfQorCQl9KTsKKwkJCisJCWRlY2xpbmUgPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7CisJCWRlY2xpbmUuc2V0VGV4dChNZXNzYWdlcy53aXpMaWNlbnNlRGVjbGluZSk7CisJCQorCQl1cGRhdGVMaWNlbnNlKCk7CisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlTGljZW5zZSgpIHsKKwkJU3RyaW5nIGxpY2Vuc2UgPSAoU3RyaW5nKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFKTsKKwkJaWYgKGxpY2Vuc2UgPT0gbnVsbCkKKwkJCWxpY2Vuc2UgPSBMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9VTktOT1dOOworCQkKKwkJT2JqZWN0IGFjYyA9IHRhc2tNb2RlbC5nZXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfQUNDRVBUKTsKKwkJaWYgKGFjYyA9PSBudWxsKSB7CisJCQlhY2NlcHRlZCA9IGZhbHNlOworCQkJYWNjZXB0LnNldFNlbGVjdGlvbihmYWxzZSk7CisJCQlkZWNsaW5lLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCX0KKwkJCisJCWlmIChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9OT05FLmVxdWFscyhsaWNlbnNlKSkgeworCQkJbGljZW5zZVRleHQuc2V0VGV4dChNZXNzYWdlcy53aXpMaWNlbnNlTm9uZSk7CisJCQlhY2NlcHQuc2V0RW5hYmxlZChmYWxzZSk7CisJCQlkZWNsaW5lLnNldEVuYWJsZWQoZmFsc2UpOworCQkJYWNjZXB0ZWQgPSB0cnVlOworCQl9IGVsc2UgaWYgKExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX1VOS05PV04uZXF1YWxzKGxpY2Vuc2UpKSB7CisJCQlsaWNlbnNlVGV4dC5zZXRUZXh0KE1lc3NhZ2VzLndpekxpY2Vuc2VOb25lKTsKKwkJCWFjY2VwdC5zZXRFbmFibGVkKHRydWUpOworCQkJZGVjbGluZS5zZXRFbmFibGVkKHRydWUpOworCQl9IGVsc2UgeworCQkJbGljZW5zZVRleHQuc2V0VGV4dChsaWNlbnNlKTsKKwkJCWFjY2VwdC5zZXRFbmFibGVkKHRydWUpOworCQkJZGVjbGluZS5zZXRFbmFibGVkKHRydWUpOworCQl9CisJCXRhc2tNb2RlbC5wdXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfQUNDRVBULCBuZXcgQm9vbGVhbihhY2NlcHRlZCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Nb2RpZnlNb2R1bGVzQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Nb2RpZnlNb2R1bGVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0YWQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL01vZGlmeU1vZHVsZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7CisvKioKKyAqIEEgd2l6YXJkIHBhZ2UgdXNlZCB0byBhZGQgYW5kIHJlbW92ZSBtb2R1bGVzLgorICovCitwdWJsaWMgY2xhc3MgTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19SRUZSRVNIX01PRFVMRVMgPSAicmVmcmVzaC1tb2R1bGVzIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOworCXByb3RlY3RlZCBzdGF0aWMgQ29sb3IgY29sb3I7CisJcHJvdGVjdGVkIHN0YXRpYyBGb250IGZvbnQ7CisKKwlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7CisKKwlwcm90ZWN0ZWQgSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyOworCXByb3RlY3RlZCBJUnVudGltZSBydW50aW1lOworCXByb3RlY3RlZCBib29sZWFuIHJ1bnRpbWVEaXJ0eTsKKwlwcm90ZWN0ZWQgT2JqZWN0IHJlZnJlc2hNb2R1bGVzOworCXByb3RlY3RlZCBib29sZWFuIHNob3dQdWJsaXNoT3B0aW9uOworCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hJbW1lZGlhdGVseTsKKworCXByb3RlY3RlZCBNYXA8Q2hpbGRNb2R1bGVNYXBLZXksIElNb2R1bGVbXT4gY2hpbGRNb2R1bGVNYXAgPSBuZXcgSGFzaE1hcDxDaGlsZE1vZHVsZU1hcEtleSwgSU1vZHVsZVtdPigpOworCXByb3RlY3RlZCBNYXA8SU1vZHVsZSwgSU1vZHVsZVtdPiBwYXJlbnRNb2R1bGVNYXAgPSBuZXcgSGFzaE1hcDxJTW9kdWxlLCBJTW9kdWxlW10+KCk7CisKKwkvLyBvcmlnaW5hbCBtb2R1bGVzIG9uIHRoZSBzZXJ2ZXIKKwlwcm90ZWN0ZWQgTGlzdDxJTW9kdWxlPiBvcmlnaW5hbE1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CisKKwkvLyBtb2R1bGVzIGF2YWlsYWJsZSB0byBiZSBhZGRlZCB0byB0aGUgc2VydmVyCisJcHJvdGVjdGVkIExpc3Q8SU1vZHVsZT4gbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKKworCS8vIGN1cnJlbnQgbW9kdWxlcyBvbiB0aGUgc2VydmVyCisJcHJvdGVjdGVkIExpc3Q8SU1vZHVsZT4gZGVwbG95ZWQgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CisKKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBhdmFpbGFibGVUcmVlVmlld2VyOworCXByb3RlY3RlZCBUcmVlVmlld2VyIGRlcGxveWVkVHJlZVZpZXdlcjsKKworCXByb3RlY3RlZCBCdXR0b24gYWRkLCBhZGRBbGw7CisJcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmUsIHJlbW92ZUFsbDsKKworCXByb3RlY3RlZCBUYXNrTW9kZWwgdGFza01vZGVsOworCisJLy8gYSBtb2R1bGUgdGhhdCBtdXN0IGJlIGtlcHQgb24gdGhlIHNlcnZlcgorCXByb3RlY3RlZCBJTW9kdWxlIHJlcXVpcmVkTW9kdWxlOworCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcGxldGUgPSB0cnVlOworCisJLy8gdGhlIHBhcmVudCBtb2R1bGVzIG9mIHRoZSBhYm92ZSBtb2R1bGVzLiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgbW9kdWxlcworCS8vIG11c3QgYmUga2VwdCBvbiB0aGUgc2VydmVyCisJcHJvdGVjdGVkIElNb2R1bGVbXSByZXF1aXJlZE1vZHVsZXM7CisKKwlwcm90ZWN0ZWQgTWFwPElNb2R1bGUsIElTdGF0dXM+IGVycm9yTWFwOworCisJYWJzdHJhY3QgY2xhc3MgVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQorCisJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQkJLy8gZG8gbm90aGluZworCQl9CisJCQorCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKKwkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIHBhcmVudEVsZW1lbnQ7CisJCQlJTW9kdWxlW10gcGFyZW50ID0gbXMubW9kdWxlOworCQkJSU1vZHVsZVtdIGNoaWxkcmVuID0gY2hpbGRNb2R1bGVNYXAuZ2V0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShwYXJlbnQpKTsKKwkJCQorCQkJTGlzdDxNb2R1bGVTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZVNlcnZlcj4oKTsKKwkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisJCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkJSU1vZHVsZSBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJCQkKKwkJCQkJcGFyZW50TW9kdWxlTWFwLnB1dChjaGlsZCwgcGFyZW50KTsKKwkJCQkJCisJCQkJCWludCBzaXplMiA9IHBhcmVudC5sZW5ndGg7CisJCQkJCUlNb2R1bGVbXSBtb2R1bGUyID0gbmV3IElNb2R1bGVbc2l6ZTIgKyAxXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShwYXJlbnQsIDAsIG1vZHVsZTIsIDAsIHNpemUyKTsKKwkJCQkJbW9kdWxlMltzaXplMl0gPSBjaGlsZDsKKwkJCQkJbGlzdC5hZGQobmV3IE1vZHVsZVNlcnZlcihudWxsLCBtb2R1bGUyKSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOworCQl9CisKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7CisJCQlJTW9kdWxlW10gY2hpbGQgPSBtcy5tb2R1bGU7CisJCQlJTW9kdWxlW10gbW9kdWxlczIgPSBwYXJlbnRNb2R1bGVNYXAuZ2V0KGNoaWxkKTsKKwkJCWlmIChtb2R1bGVzMiA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJcmV0dXJuIG5ldyBNb2R1bGVTZXJ2ZXIobnVsbCwgbW9kdWxlczIpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKwkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7CisJCQlJTW9kdWxlW10gcGFyZW50ID0gbXMubW9kdWxlOworCQkJSU1vZHVsZVtdIGNoaWxkcmVuID0gY2hpbGRNb2R1bGVNYXAuZ2V0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShwYXJlbnQpKTsKKwkJCXJldHVybiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKTsKKwkJfQorCX0KKworCWNsYXNzIEF2YWlsYWJsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFRyZWVDb250ZW50UHJvdmlkZXIgeworCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQkJTGlzdDxNb2R1bGVTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZVNlcnZlcj4oKTsKKwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlsaXN0LmFkZChuZXcgTW9kdWxlU2VydmVyKG51bGwsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSkpOworCQkJfQorCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOworCQl9CisJfQorCisJY2xhc3MgRGVwbG95ZWRDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBUcmVlQ29udGVudFByb3ZpZGVyIHsKKwkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCUxpc3Q8TW9kdWxlU2VydmVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2R1bGVTZXJ2ZXI+KCk7CisJCQlJdGVyYXRvciBpdGVyYXRvciA9IGRlcGxveWVkLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOworCQkJCWxpc3QuYWRkKG5ldyBNb2R1bGVTZXJ2ZXIobnVsbCwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9KSk7CisJCQl9CisJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGUga2V5IGVsZW1lbnQgZm9yIHRoZSBjaGlsZCBtb2R1bGUgbWFwCisJICogQ2hpbGRNYXBNb2R1bGVLZXkKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgQ2hpbGRNb2R1bGVNYXBLZXkgeworCQlwcm90ZWN0ZWQgSU1vZHVsZVtdIG1vZHVsZVRyZWU7CisJCQorCQlwcm90ZWN0ZWQgQ2hpbGRNb2R1bGVNYXBLZXkoSU1vZHVsZSBjdXJNb2R1bGUpIHsKKwkJCWlmIChjdXJNb2R1bGUgIT0gbnVsbCkgeworCQkJCW1vZHVsZVRyZWUgPSBuZXcgSU1vZHVsZVtdIHsgY3VyTW9kdWxlIH07CisJCQl9CisJCX0KKwkJCisJCXByb3RlY3RlZCBDaGlsZE1vZHVsZU1hcEtleShJTW9kdWxlW10gY3VyTW9kdWxlVHJlZSkgeworCQkJbW9kdWxlVHJlZSA9IGN1ck1vZHVsZVRyZWU7CisJCX0KKwkJCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCQlpZiAob2JqID09IHRoaXMpIC8vIHNhbWUgb2JqZWN0CisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCWlmICghKG9iaiBpbnN0YW5jZW9mIENoaWxkTW9kdWxlTWFwS2V5KSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCisJCQlJTW9kdWxlW10gY3VyQ29tcGFyZU1vZHVsZSA9ICgoQ2hpbGRNb2R1bGVNYXBLZXkpIG9iaikubW9kdWxlVHJlZTsKKwkJCWlmIChjdXJDb21wYXJlTW9kdWxlID09IG1vZHVsZVRyZWUpIHsKKwkJCQkvLyB0aGUgbW9kdWxlIHRyZWUgaXMgdGhlIHNhbWUKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAobW9kdWxlVHJlZSA9PSBudWxsIHx8IGN1ckNvbXBhcmVNb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGVUcmVlLmxlbmd0aCAhPSBjdXJDb21wYXJlTW9kdWxlLmxlbmd0aCl7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQkvLyBjb21wYXJlIGVhY2ggbW9kdWxlCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJDb21wYXJlTW9kdWxlLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmICghY3VyQ29tcGFyZU1vZHVsZVtpXS5lcXVhbHMobW9kdWxlVHJlZVtpXSkpCisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCS8vIGZvcmNlIHRoZSBzYW1lIGhhc2ggY29kZSBvbiBhbGwgdGhlIGluc3RhbmNlcyB0byBtYWtlcyBzdXJlIHRoZQorCQkJLy8gZXF1YWxzKE9iamVjdCkgbWV0aG9kIGlzIGJlaW5nIHVzZWQgZm9yIGNvbXBhcmluZyB0aGUgb2JqZWN0cworCQkJcmV0dXJuIDEyMzQ1OworCQl9CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IE1vZGlmeU1vZHVsZXNDb21wb3NpdGUuCisJICogCisJICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKKwkgKiBAcGFyYW0gd2l6YXJkIGEgd2l6YXJkCisJICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRoYXQgaXMgYmVpbmcgYWRkZWQKKwkgKi8KKwlwdWJsaWMgTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgSU1vZHVsZSBtb2R1bGUpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7CisJCXRoaXMud2l6YXJkID0gd2l6YXJkOworCQlyZXF1aXJlZE1vZHVsZSA9IG1vZHVsZTsKKwkJCisJCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXpNb2R1bGVUaXRsZSk7CisJCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpNb2R1bGVEZXNjcmlwdGlvbik7CisJCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laQkFOX1NFTEVDVF9TRVJWRVIpKTsKKwkJCisJCWNyZWF0ZUNvbnRyb2woKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQorCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQKKwkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdGhhdCBpcyBiZWluZyBhZGRlZAorCSAqIEBwYXJhbSBzaG93UHVibGlzaE9wdGlvbiBzaG93IHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgSU1vZHVsZSBtb2R1bGUsIGJvb2xlYW4gc2hvd1B1Ymxpc2hPcHRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7CisJCXRoaXMud2l6YXJkID0gd2l6YXJkOworCQlyZXF1aXJlZE1vZHVsZSA9IG1vZHVsZTsKKwkJdGhpcy5zaG93UHVibGlzaE9wdGlvbiA9IHNob3dQdWJsaXNoT3B0aW9uOworCQkKKwkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpek1vZHVsZVRpdGxlKTsKKwkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek1vZHVsZURlc2NyaXB0aW9uKTsKKwkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fU0VMRUNUX1NFUlZFUikpOworCQkKKwkJY3JlYXRlQ29udHJvbCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcnZlcihJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIpIHsKKwkJaWYgKGlzVmlzaWJsZSgpKQorCQkJcmV0dXJuOworCQkKKwkJLy8gc2VlIGJ1ZyAxODU4NzUsIDIwNTg2OQorCQlpZiAocmVmcmVzaE1vZHVsZXMgPT0gdGFza01vZGVsLmdldE9iamVjdChUQVNLX1JFRlJFU0hfTU9EVUxFUykgJiYgc2VydmVyID09IHRoaXMuc2VydmVyKSB7CisJCQlpZiAoc2VydmVyID09IG51bGwpCisJCQkJcmV0dXJuOworCQkJaWYgKHJ1bnRpbWUgPT0gc2VydmVyLmdldFJ1bnRpbWUoKSkgeworCQkJCWlmIChydW50aW1lID09IG51bGwpCisJCQkJCXJldHVybjsKKwkJCQlpZiAocnVudGltZSBpbnN0YW5jZW9mIElSdW50aW1lV29ya2luZ0NvcHkpIHsKKwkJCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOworCQkJCQlpZiAod2MuaXNEaXJ0eSgpID09IHJ1bnRpbWVEaXJ0eSkKKwkJCQkJCXJldHVybjsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCQorCQlyZWZyZXNoTW9kdWxlcyA9IHRhc2tNb2RlbC5nZXRPYmplY3QoVEFTS19SRUZSRVNIX01PRFVMRVMpOworCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwkJaWYgKHNlcnZlciA9PSBudWxsKQorCQkJcnVudGltZSA9IG51bGw7CisJCWVsc2UKKwkJCXJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOworCQlydW50aW1lRGlydHkgPSBmYWxzZTsKKwkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgeworCQkJaWYgKHJ1bnRpbWUgaW5zdGFuY2VvZiBJUnVudGltZVdvcmtpbmdDb3B5KSB7CisJCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOworCQkJCWlmICh3Yy5pc0RpcnR5KCkpCisJCQkJCXJ1bnRpbWVEaXJ0eSA9IHRydWU7CisJCQl9CisJCX0KKwkJCisJCW9yaWdpbmFsTW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKKwkJZGVwbG95ZWQgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CisJCW1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CisJCQorCQljaGlsZE1vZHVsZU1hcCA9IG5ldyBIYXNoTWFwPENoaWxkTW9kdWxlTWFwS2V5LCBJTW9kdWxlW10+KCk7CisJCQorCQlpZiAoc2VydmVyID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlTeXN0ZW0uc2V0UHJvcGVydHkoIkoyRUVjYWNoZSIsICIiICsgTWF0aC5yYW5kb20oKSk7CisJCQorCQkvLyBnZXQgY3VycmVudGx5IGRlcGxveWVkIG1vZHVsZXMKKwkJSU1vZHVsZVtdIGN1cnJlbnRNb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKKwkJaWYgKGN1cnJlbnRNb2R1bGVzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gY3VycmVudE1vZHVsZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlvcmlnaW5hbE1vZHVsZXMuYWRkKGN1cnJlbnRNb2R1bGVzW2ldKTsKKwkJCQlkZXBsb3llZC5hZGQoY3VycmVudE1vZHVsZXNbaV0pOworCQkJfQorCQl9CisJCQorCQkvLyBhZGQgbmV3IG1vZHVsZQorCQlyZXF1aXJlZE1vZHVsZXMgPSBudWxsOworCQllcnJvck1hcCA9IG5ldyBIYXNoTWFwPElNb2R1bGUsIElTdGF0dXM+KCk7CisJCWlmIChyZXF1aXJlZE1vZHVsZSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKHJlcXVpcmVkTW9kdWxlLCBudWxsKTsKKwkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkKKwkJCQkJcmVxdWlyZWRNb2R1bGVzID0gcGFyZW50czsKKwkJCQllbHNlCisJCQkJCXJlcXVpcmVkTW9kdWxlcyA9IG5ldyBJTW9kdWxlW10geyByZXF1aXJlZE1vZHVsZSB9OworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCS8vIGlnbm9yZQorCQkJCS8vZXJyb3JNYXAucHV0KG5ld01vZHVsZSwgY2UuZ2V0U3RhdHVzKCkpOworCQkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sICJBIHBvc3NpYmxlIHNlcnZlciBpbXBsZW1lbnRhdGlvbiBlcnJvciIsIGNlKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIHJvb3QgbW9kdWxlIiwgZSk7CisJCQl9CisJCX0KKwkJaWYgKHJlcXVpcmVkTW9kdWxlcyAhPSBudWxsICYmICFkZXBsb3llZC5jb250YWlucyhyZXF1aXJlZE1vZHVsZXNbMF0pKQorCQkJZGVwbG95ZWQuYWRkKHJlcXVpcmVkTW9kdWxlc1swXSk7CisJCQorCQkvLyBnZXQgcmVtYWluaW5nIG1vZHVsZXMKKwkJSU1vZHVsZVtdIG1vZHVsZXMyID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpKTsKKwkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gbW9kdWxlczIubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXMyW2ldOworCQkJCWlmICghZGVwbG95ZWQuY29udGFpbnMobW9kdWxlKSkgeworCQkJCQl0cnkgeworCQkJCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBudWxsKTsKKwkJCQkJCWlmIChwYXJlbnRzICE9IG51bGwpIHsKKwkJCQkJCQlpbnQgc2l6ZTIgPSBwYXJlbnRzLmxlbmd0aDsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKKwkJCQkJCQkJaWYgKHBhcmVudHNbal0uZXF1YWxzKG1vZHVsZSkpIHsKKwkJCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gc2VydmVyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsLCBudWxsKTsKKwkJCQkJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKKwkJCQkJCQkJCQllcnJvck1hcC5wdXQobW9kdWxlLCBzdGF0dXMpOworCQkJCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQkJZXJyb3JNYXAucHV0KG1vZHVsZSwgY2UuZ2V0U3RhdHVzKCkpOworCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gYnVpbGQgY2hpbGQgbWFwCisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwbG95ZWQuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOworCQkJdHJ5IHsKKwkJCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBzZXJ2ZXIuZ2V0Q2hpbGRNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCk7CisJCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkKKwkJCQkJY2hpbGRNb2R1bGVNYXAucHV0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShtb2R1bGUpLCBjaGlsZHJlbik7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJCQorCQlpdGVyYXRvciA9IG1vZHVsZXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOworCQkJdHJ5IHsKKwkJCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBzZXJ2ZXIuZ2V0Q2hpbGRNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCk7CisJCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkKKwkJCQkJY2hpbGRNb2R1bGVNYXAucHV0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShtb2R1bGUpLCBjaGlsZHJlbik7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJCQorCQkvLyBnZXQgY2hpbGRyZW4gcmVjdXJzaXZlbHkgb25lIGxldmVsCisJCS8vIHB1dCBjaGlsZCBlbGVtZW50cyBpbnRvIGEgZGlmZmVyZW50IGxpc3QgdG8gYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb25zCisJCUl0ZXJhdG9yPENoaWxkTW9kdWxlTWFwS2V5PiBpdGVyYXRvcjIgPSBjaGlsZE1vZHVsZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQlMaXN0PENoaWxkTW9kdWxlTWFwS2V5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDaGlsZE1vZHVsZU1hcEtleT4oKTsKKwkJd2hpbGUgKGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKKwkJCWxpc3QuYWRkKGl0ZXJhdG9yMi5uZXh0KCkpOworCQl9CisJCQorCQlpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJQ2hpbGRNb2R1bGVNYXBLZXkga2V5ID0gKENoaWxkTW9kdWxlTWFwS2V5KSBpdGVyYXRvci5uZXh0KCk7CisJCQlJTW9kdWxlW10gY2hpbGRyZW4wID0gY2hpbGRNb2R1bGVNYXAuZ2V0KGtleSk7CisJCQlpZiAoY2hpbGRyZW4wICE9IG51bGwpIHsKKwkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuMC5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkJaW50IHNpemUyID0ga2V5Lm1vZHVsZVRyZWUubGVuZ3RoOworCQkJCQlJTW9kdWxlW10gbW9kdWxlMiA9IG5ldyBJTW9kdWxlW3NpemUyICsgMV07CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoa2V5Lm1vZHVsZVRyZWUsIDAsIG1vZHVsZTIsIDAsIHNpemUyKTsKKwkJCQkJbW9kdWxlMltzaXplMl0gPSBjaGlsZHJlbjBbaV07CisJCQkJCQorCQkJCQl0cnkgeworCQkJCQkJSU1vZHVsZVtdIGNoaWxkcmVuID0gc2VydmVyLmdldENoaWxkTW9kdWxlcyhtb2R1bGUyLCBudWxsKTsKKwkJCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApCisJCQkJCQkJY2hpbGRNb2R1bGVNYXAucHV0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShtb2R1bGUyKSwgY2hpbGRyZW4pOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gaWdub3JlCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCVN5c3RlbS5zZXRQcm9wZXJ0eSgiSjJFRWNhY2hlIiwgIiIpOworCQkKKwkJdXBkYXRlVGFza01vZGVsKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIGIpIHsKKwkJaWYgKGIpIHsKKwkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCWlmIChhdmFpbGFibGVUcmVlVmlld2VyID09IG51bGwgfHwgYXZhaWxhYmxlVHJlZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQorCQkJCQkJcmV0dXJuOworCQkJCQl0cnkgeyAvLyB1cGRhdGUgdHJlZXMgaWYgd2UgY2FuCisJCQkJCQlhdmFpbGFibGVUcmVlVmlld2VyLnJlZnJlc2goKTsKKwkJCQkJCWRlcGxveWVkVHJlZVZpZXdlci5yZWZyZXNoKCk7CisJCQkJCQlzZXRFbmFibGVtZW50KCk7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBpZ25vcmUKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQl9CisJCXN1cGVyLnNldFZpc2libGUoYik7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCBtb2RlbCkgeworCQl0aGlzLnRhc2tNb2RlbCA9IG1vZGVsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIFVJIG9mIHRoZSBwYWdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7CisJCXNldExheW91dChsYXlvdXQpOworCQlzZXRGb250KGdldFBhcmVudCgpLmdldEZvbnQoKSk7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5NT0RJRllfTU9EVUxFU19DT01QT1NJVEUpOworCQkKKwkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOworCQljb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSk7CisJCUZvbnREYXRhW10gZmQgPSBnZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKKwkJaW50IHNpemUyID0gZmQubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspCisJCQlmZFtpXS5zZXRTdHlsZShTV1QuSVRBTElDKTsKKwkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkKTsKKwkJYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCWZvbnQuZGlzcG9zZSgpOworCQkJfQorCQl9KTsKKwkJCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVNZXNzYWdlKTsKKwkJCisJCWxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVBdmFpbGFibGVMaXN0KTsKKwkJCisJCWxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dCgiIik7CisJCQorCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlRGVwbG95ZWRMaXN0KTsKKwkJCisJCVRyZWUgYXZhaWxhYmxlVHJlZSA9IG5ldyBUcmVlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWRhdGEuaGVpZ2h0SGludCA9IDIwMDsKKwkJZGF0YS53aWR0aEhpbnQgPSAxNTA7CisJCWF2YWlsYWJsZVRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCWF2YWlsYWJsZVRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihhdmFpbGFibGVUcmVlKTsKKwkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCWxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKKwkJCQlpZiAob2JqID09IG51bGwpCisJCQkJCWF2YWlsYWJsZVRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKKwkJCQllbHNlIHsKKwkJCQkJb2JqID0gU2VydmVyVUlQbHVnaW4uYWRhcHRMYWJlbENoYW5nZU9iamVjdHMob2JqKTsKKwkJCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQkJCWF2YWlsYWJsZVRyZWVWaWV3ZXIucmVmcmVzaChvYmpbaV0sIHRydWUpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCWF2YWlsYWJsZVRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKKwkJYXZhaWxhYmxlVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEF2YWlsYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKKwkJYXZhaWxhYmxlVHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkgeworCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CisJCQkJaWYgKGUxIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyICYmIGUyIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisJCQkJCU1vZHVsZVNlcnZlciBzMSA9IChNb2R1bGVTZXJ2ZXIpIGUxOworCQkJCQlNb2R1bGVTZXJ2ZXIgczIgPSAoTW9kdWxlU2VydmVyKSBlMjsKKwkJCQkJcmV0dXJuIChzMS5tb2R1bGVbczEubW9kdWxlLmxlbmd0aCAtIDFdLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyLm1vZHVsZVtzMi5tb2R1bGUubGVuZ3RoIC0gMV0uZ2V0TmFtZSgpKSk7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKKwkJCX0KKwkJfSk7CisJCWF2YWlsYWJsZVRyZWVWaWV3ZXIuc2V0SW5wdXQoUk9PVCk7CisJCQorCQlhdmFpbGFibGVUcmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJc2V0RW5hYmxlbWVudCgpOworCQkJfQorCQl9KTsKKwkJYXZhaWxhYmxlVHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKwkJCQlzZXRFbmFibGVtZW50KCk7CisJCQkJaWYgKGFkZC5pc0VuYWJsZWQoKSkKKwkJCQkJYWRkKGZhbHNlKTsKKwkJCX0KKwkJfSk7CisJCQorCQkvLyBzbG9zaCBidXR0b25zCisJCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZGF0YS53aWR0aEhpbnQgPSAxMjA7CisJCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDU7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAyNTsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDIwOworCQljb21wLnNldExheW91dChsYXlvdXQpOworCQkKKwkJYWRkID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7CisJCWFkZC5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZUFkZCk7CisJCWFkZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQlhZGQoZmFsc2UpOworCQkJfQorCQl9KTsKKwkJCisJCXJlbW92ZSA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOworCQlyZW1vdmUuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVSZW1vdmUpOworCQlyZW1vdmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCXJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJcmVtb3ZlKGZhbHNlKTsKKwkJCX0KKwkJfSk7CisJCQorCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoIiIpOworCQkKKwkJYWRkQWxsID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7CisJCWFkZEFsbC5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZUFkZEFsbCk7CisJCWFkZEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJYWRkQWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQlhZGQodHJ1ZSk7CisJCQl9CisJCX0pOworCQkKKwkJcmVtb3ZlQWxsID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7CisJCXJlbW92ZUFsbC5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZVJlbW92ZUFsbCk7CisJCXJlbW92ZUFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJcmVtb3ZlQWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQlyZW1vdmUodHJ1ZSk7CisJCQl9CisJCX0pOworCQkKKwkJVHJlZSBkZXBsb3llZFRyZWUgPSBuZXcgVHJlZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlkYXRhLndpZHRoSGludCA9IDE1MDsKKwkJZGVwbG95ZWRUcmVlLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlkZXBsb3llZFRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihkZXBsb3llZFRyZWUpIHsKKwkJCXB1YmxpYyB2b2lkIGRvVXBkYXRlSXRlbShXaWRnZXQgd2lkZ2V0LCBPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBmdWxsTWFwKSB7CisJCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWVJdGVtICYmIGNvbG9yICE9IG51bGwpIHsKKwkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgd2lkZ2V0OworCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgeworCQkJCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKKwkJCQkJCUlNb2R1bGUgbSA9IG1zLm1vZHVsZVttcy5tb2R1bGUubGVuZ3RoLTFdOworCQkJCQkJaWYgKG0uaXNFeHRlcm5hbCgpKQorCQkJCQkJCWl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7CisJCQkJCQllbHNlCisJCQkJCQkJaXRlbS5zZXRGb3JlZ3JvdW5kKG51bGwpOworCQkJCQkJaWYgKCEoc2VydmVyIGluc3RhbmNlb2YgSVNlcnZlcikgfHwgKChJU2VydmVyKXNlcnZlcikuZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1zLm1vZHVsZSkgIT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpCisJCQkJCQkJaXRlbS5zZXRGb250KGZvbnQpOworCQkJCQkJZWxzZQorCQkJCQkJCWl0ZW0uc2V0Rm9udChudWxsKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlzdXBlci5kb1VwZGF0ZUl0ZW0od2lkZ2V0LCBlbGVtZW50LCBmdWxsTWFwKTsKKwkJCX0KKwkJfTsKKwkJbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCWxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKKwkJCQlpZiAob2JqID09IG51bGwpCisJCQkJCWRlcGxveWVkVHJlZVZpZXdlci5yZWZyZXNoKHRydWUpOworCQkJCWVsc2UgeworCQkJCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCQkJZGVwbG95ZWRUcmVlVmlld2VyLnJlZnJlc2gob2JqW2ldLCB0cnVlKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQlkZXBsb3llZFRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKKwkJZGVwbG95ZWRUcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRGVwbG95ZWRDb250ZW50UHJvdmlkZXIoKSk7CisJCWRlcGxveWVkVHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkgeworCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CisJCQkJaWYgKGUxIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyICYmIGUyIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisJCQkJCU1vZHVsZVNlcnZlciBzMSA9IChNb2R1bGVTZXJ2ZXIpIGUxOworCQkJCQlNb2R1bGVTZXJ2ZXIgczIgPSAoTW9kdWxlU2VydmVyKSBlMjsKKwkJCQkJcmV0dXJuIChzMS5tb2R1bGVbczEubW9kdWxlLmxlbmd0aCAtIDFdLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyLm1vZHVsZVtzMi5tb2R1bGUubGVuZ3RoIC0gMV0uZ2V0TmFtZSgpKSk7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKKwkJCX0KKwkJfSk7CisJCWRlcGxveWVkVHJlZVZpZXdlci5zZXRJbnB1dChST09UKTsKKwkJCisJCWRlcGxveWVkVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCXNldEVuYWJsZW1lbnQoKTsKKwkJCX0KKwkJfSk7CisJCWRlcGxveWVkVHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKwkJCQlzZXRFbmFibGVtZW50KCk7CisJCQkJaWYgKHJlbW92ZS5pc0VuYWJsZWQoKSkKKwkJCQkJcmVtb3ZlKGZhbHNlKTsKKwkJCX0KKwkJfSk7CisJCQorCQlpZiAoc2hvd1B1Ymxpc2hPcHRpb24pIHsKKwkJCWZpbmFsIEJ1dHRvbiBwdWJsaXNoID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOworCQkJcHVibGlzaC5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZVB1Ymxpc2hJbW1lZGlhdGVseSk7CisJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKKwkJCXB1Ymxpc2guc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCQorCQkJcHVibGlzaEltbWVkaWF0ZWx5ID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRQdWJsaXNoT25BZGRSZW1vdmVNb2R1bGUoKTsKKwkJCXB1Ymxpc2guc2V0U2VsZWN0aW9uKHB1Ymxpc2hJbW1lZGlhdGVseSk7CisJCQlwdWJsaXNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJCXB1Ymxpc2hJbW1lZGlhdGVseSA9IHB1Ymxpc2guZ2V0U2VsZWN0aW9uKCk7CisJCQkJfQorCQkJfSk7CisJCX0KKwkJCisJCXNldEVuYWJsZW1lbnQoKTsKKwkJYXZhaWxhYmxlVHJlZS5zZXRGb2N1cygpOworCQkKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKKwl9CisKKwlwcm90ZWN0ZWQgTW9kdWxlU2VydmVyW10gZ2V0QXZhaWxhYmxlU2VsZWN0aW9uKCkgeworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGF2YWlsYWJsZVRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisJCWlmIChzZWwuaXNFbXB0eSgpKQorCQkJcmV0dXJuIG5ldyBNb2R1bGVTZXJ2ZXJbMF07CisJCQkKKwkJTW9kdWxlU2VydmVyIFtdICBtc3MgPSBuZXcgTW9kdWxlU2VydmVyW3NlbC5zaXplKCldOworCQlTeXN0ZW0uYXJyYXljb3B5KHNlbC50b0FycmF5KCksIDAsIG1zcywgMCwgc2VsLnNpemUoKSk7CisJCXJldHVybiBtc3M7CisJfQorCisJcHJvdGVjdGVkIE1vZHVsZVNlcnZlcltdIGdldERlcGxveWVkU2VsZWN0aW9uKCkgeworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGRlcGxveWVkVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbC5pc0VtcHR5KCkpCisJCQlyZXR1cm4gbmV3IE1vZHVsZVNlcnZlclswXTsKKwkJCisJCU1vZHVsZVNlcnZlciBbXSAgbXNzID0gbmV3IE1vZHVsZVNlcnZlcltzZWwuc2l6ZSgpXTsKKwkJU3lzdGVtLmFycmF5Y29weShzZWwudG9BcnJheSgpLCAwLCBtc3MsIDAsIHNlbC5zaXplKCkpOworCQlyZXR1cm4gbXNzOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoTW9kdWxlU2VydmVyIG1zKSB7CisJCWlmIChtcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG1zLm1vZHVsZTsKKwkJcmV0dXJuIG1vZHVsZXMyW21vZHVsZXMyLmxlbmd0aCAtIDFdOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoTW9kdWxlU2VydmVyW10gbXMpIHsKKwkJaWYgKG1zID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJSU1vZHVsZVtdIG1vZHVsZXMyID0gbmV3IElNb2R1bGVbbXMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtcy5sZW5ndGg7IGkrKykKKwkJCW1vZHVsZXMyW2ldID0gZ2V0TW9kdWxlKG1zW2ldKTsKKwkJCisJCXJldHVybiBtb2R1bGVzMjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVtZW50KCkgeworCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOworCQkKKwkJaW50IGNvdW50ID0gMDsKKwkJaWYgKHJlcXVpcmVkTW9kdWxlcyAhPSBudWxsKSB7CisJCQkvLyBjb3VudCBob3cgbWFueSBvZiByZXF1aXJlZE1vZHVsZXMgYXJlIGRlcGxveWVkCisJCQlpbnQgc2l6ZSA9IHJlcXVpcmVkTW9kdWxlcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWlmIChkZXBsb3llZC5jb250YWlucyhyZXF1aXJlZE1vZHVsZXNbaV0pKQorCQkJCQljb3VudCsrOworCQkJfQorCQl9CisJCQorCQkvLyBnaXZlIGVycm9yIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIHJlcXVpcmVkIG1vZHVsZXMgYW5kIG5vbmUgYXJlCisJCS8vIGFkZGVkIHRvIHRoZSBzZXJ2ZXIKKwkJaXNDb21wbGV0ZSA9IHRydWU7CisJCWlmIChyZXF1aXJlZE1vZHVsZXMgIT0gbnVsbCAmJiByZXF1aXJlZE1vZHVsZXMubGVuZ3RoID4gMSAmJiBjb3VudCA9PSAwKSB7CisJCQlTdHJpbmcgcyA9ICIiOworCQkJaW50IHNpemUgPSByZXF1aXJlZE1vZHVsZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoaSA+IDApCisJCQkJCXMgKz0gIiB8ICI7CisJCQkJcyArPSByZXF1aXJlZE1vZHVsZXNbaV0uZ2V0TmFtZSgpOworCQkJfQorCQkJd2l6YXJkLnNldE1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMud2l6TW9kdWxlUmVxdWlyZWRNb2R1bGVzLCBzKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7CisJCQlpc0NvbXBsZXRlID0gZmFsc2U7CisJCX0KKwkJCisJCS8vIHNlbGVjdGlvbiBzcGVjaWZpYyBtZXNzYWdlcworCQlNb2R1bGVTZXJ2ZXJbXSBtcyA9IGdldEF2YWlsYWJsZVNlbGVjdGlvbigpOworCQlpZiAobXMgPT0gbnVsbCB8fCAgbXMubGVuZ3RoID09IDApIHsKKwkJCWFkZC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOworCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIHNlbGVjdGlvbiwgaWYgd2UgZmluZCBhdCBsZWFzdCBPTkUgbW9kdWxlIHRoYXQgY2FuJ3QgYmUgYWRkZWQsIGV4aXQgdGhlIGxvb3AKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXMubGVuZ3RoOyBpKyspIHsKKwkJCQlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShtc1tpXSk7CisJCQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGVycm9yTWFwLmdldChtb2R1bGUpOworCQkJCQkJaWYgKG1vZHVsZXMuY29udGFpbnMobW9kdWxlKSkgeworCQkJCQkJCWlmIChzdGF0dXMgPT0gbnVsbCApCisJCQkJCQkJCWVuYWJsZWQgPSB0cnVlOworCQkJCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKKwkJCQkJCQkJLy8gdGhpcyBtb2R1bGUgY2FuJ3QgYmUgYWRkZWQgYmVjYXVzZSBoYXMgZXJyb3JzLCBleGl0IHRoZSBsb29wCisJCQkJCQkJCWVuYWJsZWQgPSBmYWxzZTsKKwkJCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0gZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKXsKKwkJCQkJCQkJZW5hYmxlZCA9IHRydWU7CisJCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTyl7CisJCQkJCQkJCWVuYWJsZWQgPSB0cnVlOworCQkJCQkJCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNleworCQkJCQkJCS8vIGF0IGxlYXN0IE9ORSBtb2R1bGUgZnJvbSB0aGUgc2VsZWN0aW9uIGNhbid0IGJlIGFkZGVkLCBleGl0IHRoZSBsb29wICAgCisJCQkJCQkJZW5hYmxlZCA9IGZhbHNlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuSU5GTywiVW5hYmxlIHRvIGhhbmRsZSBlcnJvciBtYXAgZm9yIG1vZHVsZToiICsgbW9kdWxlKTsgCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlhZGQuc2V0RW5hYmxlZChlbmFibGVkKTsKKwkJfQorCQlhZGRBbGwuc2V0RW5hYmxlZChtb2R1bGVzLnNpemUoKSA+IDApOworCQkKKwkJbXMgPSBnZXREZXBsb3llZFNlbGVjdGlvbigpOworCQlpZiAobXMgPT0gbnVsbCB8fCAgbXMubGVuZ3RoID09IDApIHsKKwkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOworCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIHNlbGVjdGlvbiwgaWYgd2UgZmluZCBhdCBsZWFzdCBPTkUgbW9kdWxlIHRoYXQgY2FuJ3QgYmUgYWRkZWQsIGV4aXQgdGhlIGxvb3AKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXMubGVuZ3RoOyBpKyspIHsKKwkJCQlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShtc1tpXSk7CisJCQkJaWYgKG1vZHVsZSAhPSBudWxsICYmIGRlcGxveWVkLmNvbnRhaW5zKG1vZHVsZSkpIHsKKwkJCQkJLy8gcHJvdmlkZSBlcnJvciBhYm91dCByZW1vdmluZyByZXF1aXJlZCBzaW5nbGUgbW9kdWxlCisJCQkJCS8vIHJlcXVpcmVkIG1vZHVsZXMgY2FuJ3QgYmUgcmVtb3ZlZAorCQkJCQlpZiAocmVxdWlyZWRNb2R1bGVzICE9IG51bGwpeworCQkJCQkJaWYgKHJlcXVpcmVkTW9kdWxlcy5sZW5ndGggPT0gMSAmJiByZXF1aXJlZE1vZHVsZXNbMF0uZXF1YWxzKG1vZHVsZSkpIHsKKwkJCQkJCQkvLyB0aGlzIGlzIGEgcmVxdWlyZWQgbW9kdWxlIGFuZCBjYW4ndCBiZSByZW1vdmVkLCBleGl0IHRoZSBsb29wCisJCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMud2l6TW9kdWxlUmVxdWlyZWRNb2R1bGUsIG1vZHVsZS5nZXROYW1lKCkpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKKwkJCQkJCQllbmFibGVkID0gZmFsc2U7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSAKKwkJCQkJCWVuYWJsZWQgPSB0cnVlOworCQkJCX0KKwkJCQllbHNleworCQkJCQkvLyB0aGlzIG1vZHVsZSBpcyBub3QgZm91bmQgaW4gdGhlICdkZXBsb3llZCcgYXJyYXksIHRoZSBtb2R1bGUgbWlnaHQgYmUgYSBjaGlsZAorCQkJCQkvLyBhdCBsZWFzdCBPTkUgbW9kdWxlIGZyb20gdGhlIHNlbGVjdGlvbiBjYW4ndCBiZSByZW1vdmVkLCBleGl0IHRoZSBsb29wCisJCQkJCWVuYWJsZWQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJcmVtb3ZlLnNldEVuYWJsZWQoZW5hYmxlZCk7CisJCX0KKwkKKwkJaWYgKHJlcXVpcmVkTW9kdWxlcyA9PSBudWxsKQorCQkJcmVtb3ZlQWxsLnNldEVuYWJsZWQoZGVwbG95ZWQuc2l6ZSgpID4gMCk7CisJCWVsc2UKKwkJCXJlbW92ZUFsbC5zZXRFbmFibGVkKGRlcGxveWVkLnNpemUoKSA+IDEpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZChib29sZWFuIGFsbCkgeworCQlpZiAoYWxsKSB7CisJCQlJTW9kdWxlW10gbW9kdWxlczIgPSBuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV07CisJCQltb2R1bGVzLnRvQXJyYXkobW9kdWxlczIpOworCQkJbW92ZUFsbChtb2R1bGVzMiwgdHJ1ZSk7CisJCX0gZWxzZQorCQkJbW92ZUFsbChnZXRNb2R1bGVzKGdldEF2YWlsYWJsZVNlbGVjdGlvbigpKSwgdHJ1ZSk7CisJCXVwZGF0ZVRhc2tNb2RlbCgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZShib29sZWFuIGFsbCkgeworCQlpZiAoYWxsKSB7CisJCQkvLyBwaWNrIG9uZSBvZiB0aGUgcmVxdWlyZWQgbW9kdWxlcyB0byBrZWVwCisJCQlJTW9kdWxlIGtlZXAgPSBudWxsOworCQkJaWYgKHJlcXVpcmVkTW9kdWxlcyAhPSBudWxsKSB7CisJCQkJaW50IHNpemUyID0gcmVxdWlyZWRNb2R1bGVzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKKwkJCQkJaWYgKGtlZXAgPT0gbnVsbCAmJiBkZXBsb3llZC5jb250YWlucyhyZXF1aXJlZE1vZHVsZXNbaV0pKQorCQkJCQkJa2VlcCA9IHJlcXVpcmVkTW9kdWxlc1tpXTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKKwkJCWxpc3QuYWRkQWxsKGRlcGxveWVkKTsKKwkJCWxpc3QucmVtb3ZlKGtlZXApOworCQkJCisJCQlJTW9kdWxlW10gbW9kdWxlczIgPSBuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV07CisJCQlsaXN0LnRvQXJyYXkobW9kdWxlczIpOworCQkJCisJCQltb3ZlQWxsKG1vZHVsZXMyLCBmYWxzZSk7CisJCX0gZWxzZQorCQkJbW92ZUFsbChnZXRNb2R1bGVzKGdldERlcGxveWVkU2VsZWN0aW9uKCkpLCBmYWxzZSk7CisJCXVwZGF0ZVRhc2tNb2RlbCgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIG1vdmVBbGwoSU1vZHVsZVtdIG1vZHMsIGJvb2xlYW4gYWRkMikgeworCQlpbnQgc2l6ZSA9IG1vZHMubGVuZ3RoOworCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlJU3RhdHVzIHN0YXR1cyA9IGVycm9yTWFwLmdldChtb2RzW2ldKTsKKwkJCQorCQkJaWYgKHN0YXR1cyA9PSBudWxsICYmICFsaXN0LmNvbnRhaW5zKG1vZHNbaV0pKQorCQkJCWxpc3QuYWRkKG1vZHNbaV0pOworCQl9CisJCQorCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOworCQkJTW9kdWxlU2VydmVyIG1zID0gbmV3IE1vZHVsZVNlcnZlcihudWxsLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0pOworCQkJaWYgKGFkZDIpIHsKKwkJCQltb2R1bGVzLnJlbW92ZShtb2R1bGUpOworCQkJCWRlcGxveWVkLmFkZChtb2R1bGUpOworCQkJCWF2YWlsYWJsZVRyZWVWaWV3ZXIucmVtb3ZlKG1zKTsKKwkJCQlkZXBsb3llZFRyZWVWaWV3ZXIuYWRkKFJPT1QsIG1zKTsKKwkJCX0gZWxzZSB7CisJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKKwkJCQlkZXBsb3llZC5yZW1vdmUobW9kdWxlKTsKKwkJCQlhdmFpbGFibGVUcmVlVmlld2VyLmFkZChST09ULCBtcyk7CisJCQkJZGVwbG95ZWRUcmVlVmlld2VyLnJlbW92ZShtcyk7CisJCQl9CisJCX0KKworCQlzZXRFbmFibGVtZW50KCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGFza01vZGVsKCkgeworCQlpZiAodGFza01vZGVsID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19NT0RVTEVTLCBnZXRNb2R1bGVNYXAoKSk7CisJCXdpemFyZC51cGRhdGUoKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxJTW9kdWxlPiBnZXRNb2R1bGVzVG9SZW1vdmUoKSB7CisJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBvcmlnaW5hbE1vZHVsZXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKCFkZXBsb3llZC5jb250YWlucyhtb2R1bGUpKQorCQkJCWxpc3QuYWRkKG1vZHVsZSk7CisJCX0KKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJcHVibGljIExpc3Q8SU1vZHVsZT4gZ2V0TW9kdWxlc1RvQWRkKCkgeworCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwbG95ZWQuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKCFvcmlnaW5hbE1vZHVsZXMuY29udGFpbnMobW9kdWxlKSkKKwkJCQlsaXN0LmFkZChtb2R1bGUpOworCQl9CisJCXJldHVybiBsaXN0OworCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkQ2hpbGRNYXAoTGlzdDxJTW9kdWxlW10+IG1hcCwgSU1vZHVsZVtdIHBhcmVudHMsIElNb2R1bGVbXSBjaGlsZHJlbikgeworCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJSU1vZHVsZSBtb2R1bGUgPSBjaGlsZHJlbltpXTsKKwkJCQorCQkJaW50IHNpemUyID0gcGFyZW50cy5sZW5ndGg7CisJCQlJTW9kdWxlW10gbW9kdWxlczIgPSBuZXcgSU1vZHVsZVtzaXplMiArIDFdOworCQkJU3lzdGVtLmFycmF5Y29weShwYXJlbnRzLCAwLCBtb2R1bGVzMiwgMCwgc2l6ZTIpOworCQkJbW9kdWxlczJbc2l6ZTJdID0gbW9kdWxlOworCQkJbWFwLmFkZChtb2R1bGVzMik7CisJCQkKKwkJCUlNb2R1bGVbXSBjaGlsZHJlbjIgPSBjaGlsZE1vZHVsZU1hcC5nZXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KG1vZHVsZSkpOworCQkJaWYgKGNoaWxkcmVuMiAhPSBudWxsKQorCQkJCWFkZENoaWxkTWFwKG1hcCwgbW9kdWxlczIsIGNoaWxkcmVuMik7CisJCX0KKwl9CisKKwlwdWJsaWMgTGlzdCBnZXRNb2R1bGVNYXAoKSB7CisJCWZpbmFsIExpc3Q8SU1vZHVsZVtdPiBtYXAgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVbXT4oKTsKKwkKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBsb3llZC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7CisJCQlJTW9kdWxlW10gbW9kdWxlVHJlZSA9IG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsKKwkJCW1hcC5hZGQobW9kdWxlVHJlZSk7CisJCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBjaGlsZE1vZHVsZU1hcC5nZXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KG1vZHVsZSkpOworCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpCisJCQkJYWRkQ2hpbGRNYXAobWFwLCBtb2R1bGVUcmVlLCBjaGlsZHJlbik7CisJCX0KKwkJCisJCXJldHVybiBtYXA7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIGlzQ29tcGxldGU7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2hvdWxkUHVibGlzaEltbWVkaWF0ZWx5KCkgeworCQlyZXR1cm4gcHVibGlzaEltbWVkaWF0ZWx5OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdEZXRlY3RTZXJ2ZXJDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld0RldGVjdFNlcnZlckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGRkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdEZXRlY3RTZXJ2ZXJDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkJhc2VDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKKy8qKgorICogQSB3aXphcmQgcGFnZSB1c2VkIHRvIGRldGVjdCBhIHNlcnZlci4KKyAqLworcHVibGljIGNsYXNzIE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7CisJcHJvdGVjdGVkIFN0cmluZyBob3N0OworCQorCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyOworCXByb3RlY3RlZCBJU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7CisJCisJcHJvdGVjdGVkIExpc3Qgc2VydmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwlwcm90ZWN0ZWQgQnV0dG9uIGRldGVjdDsKKwlwcm90ZWN0ZWQgVGFibGUgdGFibGU7CisJcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOworCXByb3RlY3RlZCBMYWJlbCBob3N0TGFiZWw7CisKKwlwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciB7CisJCXB1YmxpYyB2b2lkIHNlcnZlclNlbGVjdGVkKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcik7CisJfQorCQorCXB1YmxpYyBjbGFzcyBTZXJ2ZXJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ29udGVudFByb3ZpZGVyIHsKKwkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCXJldHVybiBzZXJ2ZXJzLnRvQXJyYXkoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgY2xhc3MgU2VydmVyTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyMikgeworCQkJLy8gZG8gbm90aGluZworCQl9CisKKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQorCisJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCQlJU2VydmVyIHNlcnZlcjIgPSAoSVNlcnZlcikgZWxlbWVudDsKKwkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQorCQkJCXJldHVybiBzZXJ2ZXIyLmdldE5hbWUoKTsKKwkJCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDApCisJCQkJcmV0dXJuICJuL2EiOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcjIpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBOZXdEZXRlY3RTZXJ2ZXJDb21wb3NpdGUuCisJICogCisJICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKKwkgKiBAcGFyYW0gbGlzdGVuZXIyIGEgc2VydmVyIHNlbGVjdGlvbiBsaXN0ZW5lcgorCSAqLworCXB1YmxpYyBOZXdEZXRlY3RTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMikgeworCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKKwkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyMjsKKworCQljcmVhdGVDb250cm9sKCk7CisJfQorCQorCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVIZWFkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzcGFuKSB7CisJCUxhYmVsIGxhYmVsID0gY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBzcGFuLCB0cnVlLCBmYWxzZSk7CisJCWxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKKwkJcmV0dXJuIGxhYmVsOworCX0KKwkKKwlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzcGFuLCBib29sZWFuIGFsaWduVG9wLCBib29sZWFuIGluZGVudCkgeworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKKwkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOworCQlpZiAoYWxpZ25Ub3ApCisJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKKwkJaWYgKGluZGVudCkKKwkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlyZXR1cm4gbGFiZWw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgVUkgb2YgdGhlIHBhZ2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCXNldExheW91dChsYXlvdXQpOworCQkvL1dvcmtiZW5jaEhlbHAuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLlNFTEVDVF9DTElFTlRfV0laQVJEKTsKKwkKKwkJY3JlYXRlSGVhZGluZ0xhYmVsKHRoaXMsICJTZWxlY3QgdGhlIFNlcnZlciIsIDIpOworCQkKKwkJdGFibGUgPSBuZXcgVGFibGUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOworCQlkYXRhLmhlaWdodEhpbnQgPSA2MDsKKwkJZGF0YS53aWR0aEhpbnQgPSA1MDsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOworCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKKwkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKKworCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCAxMDAsIHRydWUpKTsKKwkJVGFibGVDb2x1bW4gY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisJCWNvbC5zZXRUZXh0KCJTZXJ2ZXIiKTsKKwkJCisJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNDAsIDgwLCB0cnVlKSk7CisJCVRhYmxlQ29sdW1uIGNvbDIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKKwkJY29sMi5zZXRUZXh0KCJTdGF0dXMiKTsKKwkJCisJCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7CisJCQorCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7CisJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2VydmVyQ29udGVudFByb3ZpZGVyKCkpOworCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTZXJ2ZXJMYWJlbFByb3ZpZGVyKCkpOworCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXSB7Im5hbWUiLCAic3RhdHVzIn0pOworCQl0YWJsZVZpZXdlci5zZXRJbnB1dCgicm9vdCIpOworCQkKKwkJU3RyaW5nIGRhdGUgPSAiPG5vdz4iOworCQlob3N0TGFiZWwgPSBjcmVhdGVMYWJlbCh0aGlzLCAiTGFzdCBkZXRlY3RlZCBzZXJ2ZXJzIG9uICIgKyBob3N0ICsgIiBhdCAiICsgZGF0ZSArICI6IiwgMSwgZmFsc2UsIHRydWUpOworCQkKKwkJZGV0ZWN0ID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgIlJlZnJlc2giKTsKKwkJZGV0ZWN0LnNldEVuYWJsZWQoZmFsc2UpOworCQlkYXRhID0gKEdyaWREYXRhKSBkZXRlY3QuZ2V0TGF5b3V0RGF0YSgpOworCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORDsKKworCQkvLyBsaXN0ZW5lcnMKKwkJZGV0ZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCS8vIGRvIG5vdGhpbmcKKwkJCX0KKwkJfSk7CisKKwkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOworCQkJCU9iamVjdCBvYmogPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJSVNlcnZlcldvcmtpbmdDb3B5IG5ld1NlcnZlciA9IG51bGw7CisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXJXb3JraW5nQ29weSkKKwkJCQkJbmV3U2VydmVyID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgb2JqOworCQkJCQorCQkJCWlmICgobmV3U2VydmVyID09IG51bGwgJiYgc2VydmVyICE9IG51bGwpIHx8IChuZXdTZXJ2ZXIgIT0gbnVsbCAmJiAhbmV3U2VydmVyLmVxdWFscyhzZXJ2ZXIpKSkgeworCQkJCQlzZXJ2ZXIgPSBuZXdTZXJ2ZXI7CisJCQkJCWxpc3RlbmVyLnNlcnZlclNlbGVjdGVkKHNlcnZlcik7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCXNldEhvc3QobnVsbCk7CisJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworCQlyZXR1cm4gaG9zdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisJCXRoaXMuaG9zdCA9IGhvc3Q7CisJCXNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKKwkJaWYgKGhvc3QgIT0gbnVsbCkgeworCQkJaG9zdExhYmVsLnNldFRleHQoIkRldGVjdGVkIHNlcnZlcnMgb24gIiArIGhvc3QgKyAiOiIpOworCQkJZGV0ZWN0LnNldEVuYWJsZWQodHJ1ZSk7CisJCQl0YWJsZS5zZXRFbmFibGVkKHRydWUpOworCQl9IGVsc2UgeworCQkJaG9zdExhYmVsLnNldFRleHQoIk5vIGhvc3Qgc2VsZWN0ZWQiKTsKKwkJCWRldGVjdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCXRhYmxlLnNldEVuYWJsZWQoZmFsc2UpOworCQl9CisJfQorCisJcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7CisJCXJldHVybiBzZXJ2ZXI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld01hbnVhbFNlcnZlckNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3MjY2OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld01hbnVhbFNlcnZlckNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNTkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuU2VydmVyVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5UYXNrV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OworLyoqCisgKiBXaXphcmQgcGFnZSB1c2VkIHRvIGNyZWF0ZSBhIHNlcnZlciBhbmQgY29uZmlndXJhdGlvbiBhdCB0aGUgc2FtZSB0aW1lLgorICovCitwdWJsaWMgY2xhc3MgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKKwlwdWJsaWMgaW50ZXJmYWNlIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIHsKKwkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyKTsKKwkJcHVibGljIHZvaWQgcnVudGltZVNlbGVjdGVkKElSdW50aW1lIHJ1bnRpbWUpOworCX0KKworCXB1YmxpYyBpbnRlcmZhY2UgSVdpemFyZEhhbmRsZTIgeworCQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCQlwdWJsaWMgdm9pZCB1cGRhdGUoKTsKKwkJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpOworCX0KKwlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZTIgd2l6YXJkOworCisJcHJvdGVjdGVkIFNlcnZlclR5cGVDb21wb3NpdGUgc2VydmVyVHlwZUNvbXBvc2l0ZTsKKworCXByb3RlY3RlZCBMYWJlbCBydW50aW1lTGFiZWw7CisJcHJvdGVjdGVkIENvbWJvIHJ1bnRpbWVDb21ibzsKKwlwcm90ZWN0ZWQgTGluayBjb25maWd1cmVSdW50aW1lczsKKwlwcm90ZWN0ZWQgTGluayBhZGRSdW50aW1lOworCXByb3RlY3RlZCBJUnVudGltZVtdIHJ1bnRpbWVzOworCXByb3RlY3RlZCBJUnVudGltZSBuZXdSdW50aW1lOworCisJcHJvdGVjdGVkIFRleHQgc2VydmVyTmFtZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJOYW1lOworCXByb3RlY3RlZCBib29sZWFuIHNlcnZlck5hbWVNb2RpZmllZDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZ1NlcnZlck5hbWU7CisJcHJvdGVjdGVkIFRvb2xCYXJNYW5hZ2VyIHNlcnZlck5hbWVUb29sQmFyOworCisJcHJvdGVjdGVkIElSdW50aW1lIHJ1bnRpbWU7CisJcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7CisJcHJvdGVjdGVkIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOworCisJcHJvdGVjdGVkIFN0cmluZyBob3N0OworCisJcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGU7CisJcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOworCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyVHlwZUlkOworCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVJbmNvbXBhdGlibGU7CisKKwlwcm90ZWN0ZWQgU2VydmVyQ3JlYXRpb25DYWNoZSBjYWNoZSA9IG5ldyBTZXJ2ZXJDcmVhdGlvbkNhY2hlKCk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHNlcnZlciBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgaW5pdGlhbAorCSAqIHJlc291cmNlIHNlbGVjdGlvbiBjb250YWlucyBleGFjdGx5IG9uZSBjb250YWluZXIgcmVzb3VyY2UgdGhlbiBpdCB3aWxsIGJlCisJICogdXNlZCBhcyB0aGUgZGVmYXVsdCBjb250YWluZXIgcmVzb3VyY2UuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQorCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQgaGFuZGxlCisJICogQHBhcmFtIG1vZHVsZVR5cGUgYSBtb2R1bGUgdHlwZQorCSAqIEBwYXJhbSBtb2R1bGUgYW4gb3B0aW9uYWwgbW9kdWxlCisJICogQHBhcmFtIHNlcnZlclR5cGVJZCBhIHNlcnZlciB0eXBlIGlkLCBvciBudWxsCisJICogQHBhcmFtIGluY2x1ZGVJbmNvbXBhdGlibGUgdHJ1ZSB0byBpbmNsdWRlIGluY29tcGF0aWJsZSBzZXJ2ZXJzIHRoYXQgc3VwcG9ydCBzaW1pbGFyIG1vZHVsZSB0eXBlcworCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHNlcnZlciBzZWxlY3Rpb24gbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUyIHdpemFyZCwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBzZXJ2ZXJUeXBlSWQsIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZSwgU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7CisJCXRoaXMud2l6YXJkID0gd2l6YXJkOworCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisJCQorCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOworCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKKwkJdGhpcy5zZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXJUeXBlSWQ7CisJCXRoaXMuaW5jbHVkZUluY29tcGF0aWJsZSA9IGluY2x1ZGVJbmNvbXBhdGlibGU7CisJCQorCQljcmVhdGVDb250cm9sKCk7CisJCXdpemFyZC5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhpcyBwYWdlJ3MgaW5pdGlhbCB2aXN1YWwgY29tcG9uZW50cy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgeworCQkvLyB0b3AgbGV2ZWwgZ3JvdXAKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCXNldExheW91dChsYXlvdXQpOworCisJCXRoaXMuc2V0Rm9udChnZXRQYXJlbnQoKS5nZXRGb250KCkpOworCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwkJd2hzLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5ORVdfU0VSVkVSX1dJWkFSRCk7CisJCQorCQlzZXJ2ZXJUeXBlQ29tcG9zaXRlID0gbmV3IFNlcnZlclR5cGVDb21wb3NpdGUodGhpcywgbW9kdWxlVHlwZSwgc2VydmVyVHlwZUlkLCBuZXcgU2VydmVyVHlwZUNvbXBvc2l0ZS5TZXJ2ZXJUeXBlU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZXJ2ZXJUeXBlU2VsZWN0ZWQoSVNlcnZlclR5cGUgdHlwZTIpIHsKKwkJCQloYW5kbGVUeXBlU2VsZWN0aW9uKHR5cGUyKTsKKwkJCQkvL1dpemFyZFV0aWwuZGVmYXVsdFNlbGVjdChwYXJlbnQsIENyZWF0ZVNlcnZlcldpemFyZFBhZ2UudGhpcyk7CisJCQl9CisJCX0pOworCQlzZXJ2ZXJUeXBlQ29tcG9zaXRlLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhpbmNsdWRlSW5jb21wYXRpYmxlKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CisJCXNlcnZlclR5cGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJd2hzLnNldEhlbHAoc2VydmVyVHlwZUNvbXBvc2l0ZSwgQ29udGV4dElkcy5ORVdfU0VSVkVSX1RZUEUpOworCQkKKwkJTGFiZWwgc2VydmVyTmFtZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJc2VydmVyTmFtZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuc2VydmVyTmFtZSk7CisJCQorCQlzZXJ2ZXJOYW1lID0gbmV3IFRleHQodGhpcywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuQ0FOQ0VMKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOworCQlpZiAoKHNlcnZlck5hbWUuZ2V0U3R5bGUoKSAmIFNXVC5DQU5DRUwpICE9IDApCisJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJc2VydmVyTmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJc2VydmVyTmFtZS5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOworCQkKKwkJc2VydmVyTmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQlpZiAodXBkYXRpbmdTZXJ2ZXJOYW1lKQorCQkJCQlyZXR1cm47CisJCQkJCisJCQkJU3RyaW5nIG5hbWUgPSBzZXJ2ZXJOYW1lLmdldFRleHQoKTsKKwkJCQlpZiAoc2VydmVyICE9IG51bGwpIHsKKwkJCQkJc2VydmVyLnNldE5hbWUobmFtZSk7CisJCQkJCUlSdW50aW1lIHJ1bnRpbWUyID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKKwkJCQkJaWYgKHJ1bnRpbWUyICE9IG51bGwgJiYgcnVudGltZTIgaW5zdGFuY2VvZiBJUnVudGltZVdvcmtpbmdDb3B5KSB7CisJCQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ3YyA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lMjsKKwkJCQkJCXJ3Yy5zZXROYW1lKG5hbWUpOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmIChzZXJ2ZXJOYW1lTW9kaWZpZWQpCisJCQkJCXJldHVybjsKKwkJCQkKKwkJCQlzZXJ2ZXJOYW1lTW9kaWZpZWQgPSB0cnVlOworCQkJCWlmIChzZXJ2ZXJOYW1lVG9vbEJhciAhPSBudWxsKQorCQkJCQlzZXJ2ZXJOYW1lVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCX0KKwkJfSk7CisJCQorCQlpZiAoKHNlcnZlck5hbWUuZ2V0U3R5bGUoKSAmIFNXVC5DQU5DRUwpID09IDApIHsKKwkJCXNlcnZlck5hbWVUb29sQmFyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5GTEFUIHwgU1dULkhPUklaT05UQUwpOworCQkJc2VydmVyTmFtZVRvb2xCYXIuY3JlYXRlQ29udHJvbCh0aGlzKTsKKwkJCQorCQkJSUFjdGlvbiByZXNldERlZmF1bHRBY3Rpb24gPSBuZXcgQWN0aW9uKCIiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ly8kTk9OLU5MUy0xJAorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzZXJ2ZXIpOworCQkJCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7CisJCQkJCXNlcnZlck5hbWVNb2RpZmllZCA9IGZhbHNlOworCQkJCQlpZiAoc2VydmVyTmFtZVRvb2xCYXIgIT0gbnVsbCkKKwkJCQkJCXNlcnZlck5hbWVUb29sQmFyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQl9CisJCQl9OworCQkJCisJCQlyZXNldERlZmF1bHRBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuc2VydmVyTmFtZURlZmF1bHQpOworCQkJcmVzZXREZWZhdWx0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9SRVNFVF9ERUZBVUxUKSk7CisJCQlyZXNldERlZmF1bHRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRFRPT0xfUkVTRVRfREVGQVVMVCkpOworCQkJCisJCQlzZXJ2ZXJOYW1lVG9vbEJhci5hZGQocmVzZXREZWZhdWx0QWN0aW9uKTsKKwkJCXNlcnZlck5hbWVUb29sQmFyLnVwZGF0ZShmYWxzZSk7CisJCQlzZXJ2ZXJOYW1lVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCX0KKwkJCisJCXJ1bnRpbWVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCXJ1bnRpbWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpek5ld1NlcnZlclJ1bnRpbWUpOworCQkKKwkJcnVudGltZUNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5SRUFEX09OTFkpOworCQlydW50aW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCXJ1bnRpbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJdHJ5IHsKKwkJCQkJc2V0UnVudGltZShydW50aW1lc1tydW50aW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisJCQl9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXdpZGdldFNlbGVjdGVkKGUpOworCQkJfQorCQl9KTsKKwkJCisJCWFkZFJ1bnRpbWUgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7CisJCWFkZFJ1bnRpbWUuc2V0VGV4dCgiPGE+IiArIE1lc3NhZ2VzLmFkZFJ1bnRpbWUgKyAiPC9hPiIpOworCQlhZGRSdW50aW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7CisJCWFkZFJ1bnRpbWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlclR5cGVDb21wb3NpdGUuZ2V0U2VsZWN0ZWRTZXJ2ZXJUeXBlKCk7CisJCQkJaWYgKHNob3dSdW50aW1lV2l6YXJkKHNlcnZlclR5cGUpICE9IFdpbmRvdy5DQU5DRUwpCisJCQkJCXVwZGF0ZVJ1bnRpbWVDb21ibyhzZXJ2ZXJUeXBlKTsKKwkJCX0KKwkJfSk7CisJCQorCQljb25maWd1cmVSdW50aW1lcyA9IG5ldyBMaW5rKHRoaXMsIFNXVC5OT05FKTsKKwkJY29uZmlndXJlUnVudGltZXMuc2V0VGV4dCgiPGE+IiArIE1lc3NhZ2VzLmNvbmZpZ3VyZVJ1bnRpbWVzICsgIjwvYT4iKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOworCQljb25maWd1cmVSdW50aW1lcy5zZXRMYXlvdXREYXRhKGRhdGEpOworCQljb25maWd1cmVSdW50aW1lcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAoc2hvd1ByZWZlcmVuY2VQYWdlKCkpIHsKKwkJCQkJcnVudGltZSA9IG51bGw7CisJCQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXJUeXBlQ29tcG9zaXRlLmdldFNlbGVjdGVkU2VydmVyVHlwZSgpOworCQkJCQl1cGRhdGVSdW50aW1lQ29tYm8oc2VydmVyVHlwZSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UHJlZmVyZW5jZVBhZ2UoKSB7CisJCVN0cmluZyBpZCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByZWZlcmVuY2VQYWdlIjsKKwkJU3RyaW5nIGlkMiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnJ1bnRpbWUucHJlZmVyZW5jZVBhZ2UiOworCQlmaW5hbCBQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgaWQyLCBuZXcgU3RyaW5nW10geyBpZCwgaWQyIH0sIG51bGwpOworCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKTsKKwl9CisKKwlwcm90ZWN0ZWQgaW50IHNob3dSdW50aW1lV2l6YXJkKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKKwkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBudWxsOworCQlUYXNrTW9kZWwgdGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOworCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7CisJCWZpbmFsIFdpemFyZEZyYWdtZW50IGZyYWdtZW50MiA9IFNlcnZlclVJUGx1Z2luLmdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWVUeXBlLmdldElkKCkpOworCQlpZiAoZnJhZ21lbnQyID09IG51bGwpCisJCQlyZXR1cm4gV2luZG93LkNBTkNFTDsKKwkJCisJCXRyeSB7CisJCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXb3JraW5nQ29weSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7CisJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHJ1bnRpbWVXb3JraW5nQ29weSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHJ1bnRpbWUiLCBjZSk7CisJCQlyZXR1cm4gV2luZG93LkNBTkNFTDsKKwkJfQorCQlmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKKwkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKKwkJCQlsaXN0LmFkZChmcmFnbWVudDIpOworCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOworCQkJfQorCQl9OworCQlUYXNrV2l6YXJkIHdpemFyZDIgPSBuZXcgVGFza1dpemFyZChNZXNzYWdlcy53aXpOZXdSdW50aW1lV2l6YXJkVGl0bGUsIGZyYWdtZW50LCB0YXNrTW9kZWwpOworCQl3aXphcmQyLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKKwkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkMik7CisJCXJldHVybiBkaWFsb2cub3BlbigpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKwkJdGhpcy5ob3N0ID0gaG9zdDsKKwkJaWYgKHNlcnZlclR5cGVDb21wb3NpdGUgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworCQlpZiAoaG9zdCA9PSBudWxsKSB7CisJCQljaGFuZ2VkID0gc2VydmVyVHlwZUNvbXBvc2l0ZS5zZXRIb3N0KHRydWUpOworCQl9IGVsc2UgaWYgKFNvY2tldFV0aWwuaXNMb2NhbGhvc3QoaG9zdCkpCisJCQljaGFuZ2VkID0gc2VydmVyVHlwZUNvbXBvc2l0ZS5zZXRIb3N0KHRydWUpOworCQllbHNlCisJCQljaGFuZ2VkID0gc2VydmVyVHlwZUNvbXBvc2l0ZS5zZXRIb3N0KGZhbHNlKTsKKwkJCisJCWlmIChjaGFuZ2VkKQorCQkJaGFuZGxlVHlwZVNlbGVjdGlvbihzZXJ2ZXJUeXBlQ29tcG9zaXRlLmdldFNlbGVjdGVkU2VydmVyVHlwZSgpKTsKKwkJZWxzZSBpZiAoc2VydmVyICE9IG51bGwpIHsKKwkJCXNlcnZlci5zZXRIb3N0KGhvc3QpOworCQkJaWYgKCFzZXJ2ZXJOYW1lTW9kaWZpZWQpIHsKKwkJCQl1cGRhdGluZ1NlcnZlck5hbWUgPSB0cnVlOworCQkJCVNlcnZlclV0aWwuc2V0U2VydmVyRGVmYXVsdE5hbWUoc2VydmVyKTsKKwkJCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7CisJCQkJdXBkYXRpbmdTZXJ2ZXJOYW1lID0gZmFsc2U7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBMb2FkIGEgc2VydmVyIG9mIHRoZSBnaXZlbiB0eXBlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGxvYWRTZXJ2ZXJJbXBsKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKKwkJc2VydmVyID0gbnVsbDsKKwkJCisJCWlmIChzZXJ2ZXJUeXBlID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlib29sZWFuIGlzTG9jYWxob3N0ID0gU29ja2V0VXRpbC5pc0xvY2FsaG9zdChob3N0KTsKKwkJCisJCXNlcnZlciA9IGNhY2hlLmdldENhY2hlZFNlcnZlcihzZXJ2ZXJUeXBlLCBpc0xvY2FsaG9zdCk7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgeworCQkJc2VydmVyLnNldEhvc3QoaG9zdCk7CisJCQlTZXJ2ZXJVdGlsLnNldFNlcnZlckRlZmF1bHROYW1lKHNlcnZlcik7CisJCQlydW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKKwkJCWxpc3RlbmVyLnJ1bnRpbWVTZWxlY3RlZChydW50aW1lKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJdHJ5IHsKKwkJCS8vIHRyeSB0byBjcmVhdGUgcnVudGltZSBmaXJzdAorCQkJSVJ1bnRpbWUgcnVuID0gbnVsbDsKKwkJCWlmIChzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSkgeworCQkJCXJ1bnRpbWUgPSBudWxsOworCQkJCXVwZGF0ZVJ1bnRpbWVzKHNlcnZlclR5cGUsIGlzTG9jYWxob3N0KTsKKwkJCQlydW4gPSBnZXREZWZhdWx0UnVudGltZSgpOworCQkJfQorCQkJc2VydmVyID0gY2FjaGUuY3JlYXRlU2VydmVyKHNlcnZlclR5cGUsIHJ1biwgaXNMb2NhbGhvc3QsIG51bGwpOworCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQkJc2VydmVyLnNldEhvc3QoaG9zdCk7CisJCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzZXJ2ZXIpOworCQkJCQorCQkJCWlmIChzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSAmJiBzZXJ2ZXIuZ2V0UnVudGltZSgpID09IG51bGwpIHsKKwkJCQkJcnVudGltZSA9IG51bGw7CisJCQkJCXVwZGF0ZVJ1bnRpbWVzKHNlcnZlclR5cGUsIGlzTG9jYWxob3N0KTsKKwkJCQkJc2V0UnVudGltZShnZXREZWZhdWx0UnVudGltZSgpKTsKKwkJCQkJCisJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgJiYgIXJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5pc0VtcHR5KCkpCisJCQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KXNlcnZlcikuaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24ocnVudGltZSwgbnVsbCk7CisJCQkJfQorCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpc2VydmVyKS5zZXREZWZhdWx0cyhudWxsKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgc2VydmVyIiwgY2UpOworCQkJc2VydmVyID0gbnVsbDsKKwkJCXJ1bnRpbWUgPSBudWxsOworCQkJd2l6YXJkLnNldE1lc3NhZ2UoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKKwkJfQorCQkKKwkJaWYgKHNlcnZlciA9PSBudWxsKQorCQkJd2l6YXJkLnNldE1lc3NhZ2UoTWVzc2FnZXMud2l6RXJyb3JTZXJ2ZXJDcmVhdGlvbkVycm9yLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKKwl9CisKKwkvKioKKwkgKiBQaWNrIHRoZSBmaXJzdCBub24tc3R1YiBydW50aW1lIGZpcnN0LiBPdGhlcndpc2UsIGp1c3QgcGljayB0aGUgZmlyc3QgcnVudGltZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHJ1bnRpbWUKKwkgKi8KKwlwcm90ZWN0ZWQgSVJ1bnRpbWUgZ2V0RGVmYXVsdFJ1bnRpbWUoKSB7CisJCWlmIChydW50aW1lcyA9PSBudWxsIHx8IHJ1bnRpbWVzLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpZiAocnVudGltZXMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWlmICghcnVudGltZXNbaV0uaXNTdHViKCkpCisJCQkJCXJldHVybiBydW50aW1lc1tpXTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcnVudGltZXNbMF07CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUnVudGltZXMoSVNlcnZlclR5cGUgc2VydmVyVHlwZSwgYm9vbGVhbiBpc0xvY2FsaG9zdCkgeworCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOworCQlydW50aW1lcyA9IFNlcnZlclVJUGx1Z2luLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKTsKKwkJbmV3UnVudGltZSA9IG51bGw7CisJCQorCQlpZiAocnVudGltZXMgIT0gbnVsbCkgeworCQkJTGlzdDxJUnVudGltZT4gcnVudGltZXMyID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKKwkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlJUnVudGltZSBydW50aW1lMiA9IHJ1bnRpbWVzW2ldOworCQkJCWlmIChpc0xvY2FsaG9zdCB8fCAhcnVudGltZTIuaXNTdHViKCkpCisJCQkJCXJ1bnRpbWVzMi5hZGQocnVudGltZTIpOworCQkJfQorCQkJcnVudGltZXMgPSBuZXcgSVJ1bnRpbWVbcnVudGltZXMyLnNpemUoKV07CisJCQlydW50aW1lczIudG9BcnJheShydW50aW1lcyk7CisJCQlpZiAocnVudGltZXMubGVuZ3RoID4gMCkKKwkJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIGNyZWF0ZSBhIG5ldyBydW50aW1lCisJCXRyeSB7CisJCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXQyA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7CisJCQlTZXJ2ZXJVdGlsLnNldFJ1bnRpbWVEZWZhdWx0TmFtZShydW50aW1lV0MpOworCQkJcnVudGltZXMgPSBuZXcgSVJ1bnRpbWVbMV07CisJCQlydW50aW1lc1swXSA9IHJ1bnRpbWVXQzsKKwkJCW5ld1J1bnRpbWUgPSBydW50aW1lV0M7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZG4ndCBjcmVhdGUgcnVudGltZSIsIGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSdW50aW1lQ29tYm8oSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgeworCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsIHx8ICFzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSB8fCBzZXJ2ZXIgPT0gbnVsbCkgeworCQkJaWYgKHJ1bnRpbWVMYWJlbCAhPSBudWxsKSB7CisJCQkJcnVudGltZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nWzBdKTsKKwkJCQlydW50aW1lQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJcnVudGltZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOworCQkJCXJ1bnRpbWVDb21iby5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQljb25maWd1cmVSdW50aW1lcy5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQljb25maWd1cmVSdW50aW1lcy5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQlhZGRSdW50aW1lLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCWFkZFJ1bnRpbWUuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl9CisJCQlydW50aW1lcyA9IG5ldyBJUnVudGltZVswXTsKKwkJCXNldFJ1bnRpbWUobnVsbCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCXVwZGF0ZVJ1bnRpbWVzKHNlcnZlclR5cGUsICFTb2NrZXRVdGlsLmlzTG9jYWxob3N0KHNlcnZlci5nZXRIb3N0KCkpKTsKKwkJCisJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOworCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbc2l6ZV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKG5ld1J1bnRpbWUpKQorCQkJCWl0ZW1zW2ldID0gTWVzc2FnZXMud2l6TmV3U2VydmVyUnVudGltZUNyZWF0ZTsKKwkJCWVsc2UKKwkJCQlpdGVtc1tpXSA9IHJ1bnRpbWVzW2ldLmdldE5hbWUoKTsKKwkJfQorCQkKKwkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKKwkJCXNldFJ1bnRpbWUoZ2V0RGVmYXVsdFJ1bnRpbWUoKSk7CisJCQorCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKKwkJCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhpdGVtcyk7CisJCQlpZiAocnVudGltZXMubGVuZ3RoID4gMCkgeworCQkJCWludCBzZWwgPSAtMTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQorCQkJCQkJc2VsID0gaTsKKwkJCQl9CisJCQkJaWYgKHNlbCA8IDApIHsKKwkJCQkJc2VsID0gMDsKKwkJCQl9CisJCQkJCisJCQkJcnVudGltZUNvbWJvLnNlbGVjdChzZWwpOworCQkJCXNldFJ1bnRpbWUocnVudGltZXNbMF0pOworCQkJfQorCQkJCisJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7CisJCQlib29sZWFuIHNob3dSdW50aW1lID0gU2VydmVyVUlQbHVnaW4uZ2V0UnVudGltZXMocnVudGltZVR5cGUpLmxlbmd0aCA+PTE7CisJCQlydW50aW1lQ29tYm8uc2V0RW5hYmxlZChzaG93UnVudGltZSk7CisJCQlydW50aW1lTGFiZWwuc2V0RW5hYmxlZChzaG93UnVudGltZSk7CisJCQljb25maWd1cmVSdW50aW1lcy5zZXRFbmFibGVkKHNob3dSdW50aW1lKTsKKwkJCWFkZFJ1bnRpbWUuc2V0RW5hYmxlZChzaG93UnVudGltZSk7CisJCQlydW50aW1lTGFiZWwuc2V0VmlzaWJsZShzaG93UnVudGltZSk7CisJCQlydW50aW1lQ29tYm8uc2V0VmlzaWJsZShzaG93UnVudGltZSk7CisJCQljb25maWd1cmVSdW50aW1lcy5zZXRWaXNpYmxlKHNob3dSdW50aW1lKTsKKwkJCWFkZFJ1bnRpbWUuc2V0VmlzaWJsZShzaG93UnVudGltZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUyKSB7CisJCXJ1bnRpbWUgPSBydW50aW1lMjsKKwkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQlzZXJ2ZXIuc2V0UnVudGltZShydW50aW1lKTsKKwkJCVNlcnZlclV0aWwuc2V0U2VydmVyRGVmYXVsdE5hbWUoc2VydmVyKTsKKwkJfQorCQlsaXN0ZW5lci5ydW50aW1lU2VsZWN0ZWQocnVudGltZSk7CisJfQorCisJLyoqCisJICogSGFuZGxlIHRoZSBzZXJ2ZXIgdHlwZSBzZWxlY3Rpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlVHlwZVNlbGVjdGlvbihJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7CisJCWJvb2xlYW4gd3JvbmcgPSBmYWxzZTsKKwkJaWYgKHNlcnZlclR5cGUgIT0gbnVsbCAmJiBtb2R1bGVUeXBlICE9IG51bGwpIHsKKwkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKKwkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCBtb2R1bGVUeXBlKSkgeworCQkJCXNlcnZlclR5cGUgPSBudWxsOworCQkJCXdyb25nID0gdHJ1ZTsKKwkJCQkvL3dpemFyZC5zZXRNZXNzYWdlKCJOb3QgdGhlIHJpZ2h0IHNwZWMgbGV2ZWwyIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7CisJCQl9CisJCX0KKwkJCisJCWlmICh3cm9uZykgeworCQkJc2VydmVyID0gbnVsbDsKKwkJCXJ1bnRpbWUgPSBudWxsOworCQkJd2l6YXJkLnNldE1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JWZXJzaW9uTGV2ZWwsIG5ldyBPYmplY3RbXSB7IG1vZHVsZVR5cGUuZ2V0TmFtZSgpLCBtb2R1bGVUeXBlLmdldFZlcnNpb24oKSB9KSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7CisJCX0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSBudWxsKSB7CisJCQlzZXJ2ZXIgPSBudWxsOworCQkJcnVudGltZSA9IG51bGw7CisJCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7CisJCQlsb2FkU2VydmVySW1wbChzZXJ2ZXJUeXBlKTsKKwkJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgIT0gbnVsbCkgeworCQkJCUlTdGF0dXMgc3RhdHVzID0gTmV3U2VydmVyQ29tcG9zaXRlLmlzU3VwcG9ydGVkTW9kdWxlKHNlcnZlciwgbW9kdWxlKTsKKwkJCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKKwkJCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCisJCQkJCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKKwkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQorCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKKwkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQorCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7CisJCQkJCXNlcnZlciA9IG51bGw7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsICYmICFzZXJ2ZXJOYW1lTW9kaWZpZWQpIHsKKwkJCXVwZGF0aW5nU2VydmVyTmFtZSA9IHRydWU7CisJCQlpZiAoc2VydmVyID09IG51bGwpCisJCQkJc2VydmVyTmFtZS5zZXRUZXh0KCIiKTsKKwkJCWVsc2UKKwkJCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7CisJCQl1cGRhdGluZ1NlcnZlck5hbWUgPSBmYWxzZTsKKwkJfQorCQkKKwkJdXBkYXRlUnVudGltZUNvbWJvKHNlcnZlclR5cGUpOworCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsKSB7CisJCQlpZiAoc2VydmVyID09IG51bGwpIHsKKwkJCQlzZXJ2ZXJOYW1lLnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJCQlzZXJ2ZXJOYW1lVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCXNlcnZlck5hbWUuc2V0RWRpdGFibGUodHJ1ZSk7CisJCQkJc2VydmVyTmFtZVRvb2xCYXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoc2VydmVyTmFtZU1vZGlmaWVkKTsKKwkJCX0KKwkJfQorCQlsaXN0ZW5lci5zZXJ2ZXJTZWxlY3RlZChzZXJ2ZXIpOworCQl3aXphcmQudXBkYXRlKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkKKwkJaWYgKHZpc2libGUpIHsKKwkJCS8qaWYgKGRlZmF1bHRTZXJ2ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7IGRlZmF1bHRTZXJ2ZXJGYWN0b3J5IH0pOworCQkJCXRyZWUuc2hvd0l0ZW0odHJlZS5nZXRJdGVtcygpWzBdKTsKKwkJCX0qLworCQkJLy8gZm9yY2UgdGhlIGZvY3VzIHRvIGluaXRpYWxseSB2YWxpZGF0ZSB0aGUgZmllbGRzCisJCQloYW5kbGVUeXBlU2VsZWN0aW9uKG51bGwpOworCQl9CisJCQorCQlDb250cm9sW10gYyA9IGdldENoaWxkcmVuKCk7CisJCWlmIChjICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gYy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCQlpZiAoY1tpXSAhPSBudWxsICYmIGNbaV0gaW5zdGFuY2VvZiBTZXJ2ZXJUeXBlQ29tcG9zaXRlKQorCQkJCQljW2ldLnNldFZpc2libGUodmlzaWJsZSk7CisJCX0KKwkJaWYgKHZpc2libGUpCisJCQloYW5kbGVUeXBlU2VsZWN0aW9uKHNlcnZlclR5cGVDb21wb3NpdGUuZ2V0U2VsZWN0ZWRTZXJ2ZXJUeXBlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisJCXNlcnZlclR5cGVDb21wb3NpdGUucmVmcmVzaCgpOworCX0KKworCXB1YmxpYyBJUnVudGltZSBnZXRSdW50aW1lKCkgeworCQlyZXR1cm4gcnVudGltZTsKKwl9CisKKwlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKKwkJcmV0dXJuIHNlcnZlcjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3UnVudGltZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3UnVudGltZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMWRkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdSdW50aW1lQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Db250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLlJ1bnRpbWVUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdSdW50aW1lQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKKwlwcm90ZWN0ZWQgVHJlZSB0cmVlOworCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7CisJcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVTZXJ2ZXI7CisKKwlwcm90ZWN0ZWQgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lOworCisJLy8gY2FjaGUgb2YgY3JlYXRlZCBydW50aW1lcyBhbmQgc2VydmVycworCXByb3RlY3RlZCBNYXA8SVJ1bnRpbWVUeXBlLCBJUnVudGltZVdvcmtpbmdDb3B5PiBjYWNoZSA9IG5ldyBIYXNoTWFwPElSdW50aW1lVHlwZSwgSVJ1bnRpbWVXb3JraW5nQ29weT4oKTsKKwlwcm90ZWN0ZWQgTWFwPElSdW50aW1lLCBJU2VydmVyV29ya2luZ0NvcHk+IHNlcnZlckNhY2hlID0gbmV3IEhhc2hNYXA8SVJ1bnRpbWUsIElTZXJ2ZXJXb3JraW5nQ29weT4oKTsKKworCXByb3RlY3RlZCBUYXNrTW9kZWwgdGFza01vZGVsOworCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKKworCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247CisJcHJvdGVjdGVkIFN0cmluZyBydW50aW1lVHlwZUlkOworCXByb3RlY3RlZCBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlOworCisJcHVibGljIE5ld1J1bnRpbWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQsIFRhc2tNb2RlbCB0bSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcnVudGltZVR5cGVJZCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKKwkJCisJCXRoaXMud2l6YXJkID0gd2l6YXJkOworCQl0aGlzLnRhc2tNb2RlbCA9IHRtOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCQl0aGlzLnJ1bnRpbWVUeXBlSWQgPSBydW50aW1lVHlwZUlkOworCQkKKwkJY3JlYXRlQ29udHJvbCgpOworCQkKKwkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpek5ld1J1bnRpbWVUaXRsZSk7CisJCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpOZXdSdW50aW1lRGVzY3JpcHRpb24pOworCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9ORVdfUlVOVElNRSkpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKKwkJLy9pbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7CisJCXNldExheW91dChsYXlvdXQpOworCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwkJd2hzLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5ORVdfUlVOVElNRV9XSVpBUkQpOworCQkKKwkJZmluYWwgUnVudGltZVR5cGVDb21wb3NpdGUgY29tcCA9IG5ldyBSdW50aW1lVHlwZUNvbXBvc2l0ZSh0aGlzLCB0cnVlLCBuZXcgUnVudGltZVR5cGVDb21wb3NpdGUuUnVudGltZVR5cGVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVUeXBlU2VsZWN0ZWQoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7CisJCQkJaGFuZGxlU2VsZWN0aW9uKHJ1bnRpbWVUeXBlKTsKKwkJCX0KKwkJfSwgdHlwZSwgdmVyc2lvbiwgcnVudGltZVR5cGVJZCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZGF0YS5oZWlnaHRIaW50ID0gMzAwOworCQljb21wLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQljcmVhdGVTZXJ2ZXIgPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7CisJCWNyZWF0ZVNlcnZlci5zZXRUZXh0KE1lc3NhZ2VzLndpek5ld1J1bnRpbWVDcmVhdGVTZXJ2ZXIpOworCQljcmVhdGVTZXJ2ZXIuc2V0U2VsZWN0aW9uKFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0Q3JlYXRlU2VydmVyV2l0aFJ1bnRpbWUoKSk7CisJCWNyZWF0ZVNlcnZlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQloYW5kbGVTZXJ2ZXIoKTsKKwkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLnNldENyZWF0ZVNlcnZlcldpdGhSdW50aW1lKGNyZWF0ZVNlcnZlci5nZXRTZWxlY3Rpb24oKSk7CisJCQl9CisJCX0pOworCX0KKworCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbihJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKKwkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCisJCQlydW50aW1lID0gbnVsbDsKKwkJZWxzZSB7CisJCQl0cnkgeworCQkJCXJ1bnRpbWUgPSBudWxsOworCQkJCXJ1bnRpbWUgPSBjYWNoZS5nZXQocnVudGltZVR5cGUpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJCWlmIChydW50aW1lID09IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlydW50aW1lID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShudWxsLCBudWxsKTsKKwkJCQkJU2VydmVyVXRpbC5zZXRSdW50aW1lRGVmYXVsdE5hbWUocnVudGltZSk7CisJCQkJCWlmIChydW50aW1lICE9IG51bGwpCisJCQkJCQljYWNoZS5wdXQocnVudGltZVR5cGUsIHJ1bnRpbWUpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0KKwkJfQorCQlzZXJ2ZXJUeXBlID0gZ2V0Q29tcGF0aWJsZVNlcnZlclR5cGUocnVudGltZVR5cGUpOworCQloYW5kbGVTZXJ2ZXIoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXIoKSB7CisJCWJvb2xlYW4gb3B0aW9uID0gZmFsc2U7CisJCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwgJiYgc2VydmVyVHlwZS5oYXNSdW50aW1lKCkpCisJCQlvcHRpb24gPSB0cnVlOworCQljcmVhdGVTZXJ2ZXIuc2V0VmlzaWJsZShvcHRpb24pOworCQkKKwkJaWYgKG9wdGlvbiAmJiBjcmVhdGVTZXJ2ZXIuZ2V0U2VsZWN0aW9uKCkpIHsKKwkJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBnZXRTZXJ2ZXIoKTsKKwkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCBzZXJ2ZXIpOworCQl9IGVsc2UKKwkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCBudWxsKTsKKwkJCisJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZSk7CisJCXdpemFyZC51cGRhdGUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIElTZXJ2ZXJUeXBlIGdldENvbXBhdGlibGVTZXJ2ZXJUeXBlKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgeworCQlMaXN0PElTZXJ2ZXJUeXBlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyVHlwZT4oKTsKKwkJSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKKwkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlJUnVudGltZVR5cGUgcnQgPSBzZXJ2ZXJUeXBlc1tpXS5nZXRSdW50aW1lVHlwZSgpOworCQkJaWYgKHJ0ICE9IG51bGwgJiYgcnQuZXF1YWxzKHJ1bnRpbWVUeXBlKSkKKwkJCQlsaXN0LmFkZChzZXJ2ZXJUeXBlc1tpXSk7CisJCX0KKwkJaWYgKGxpc3Quc2l6ZSgpID09IDEpCisJCQlyZXR1cm4gbGlzdC5nZXQoMCk7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEdldCBhIHNlcnZlciBvZiB0aGUgZ2l2ZW4gdHlwZS4KKwkgKi8KKwlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKKwkJaWYgKHNlcnZlclR5cGUgPT0gbnVsbCB8fCBydW50aW1lID09IG51bGwgfHwgIXNlcnZlclR5cGUuaGFzUnVudGltZSgpKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gc2VydmVyQ2FjaGUuZ2V0KHJ1bnRpbWUpOworCQlpZiAoc2VydmVyICE9IG51bGwpCisJCQlyZXR1cm4gc2VydmVyOworCQkKKwkJdHJ5IHsKKwkJCXNlcnZlciA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKG51bGwsIG51bGwsIHJ1bnRpbWUsIG51bGwpOworCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQkJc2VydmVyLnNldEhvc3QoImxvY2FsaG9zdCIpOworCQkJCVNlcnZlclV0aWwuc2V0U2VydmVyRGVmYXVsdE5hbWUoc2VydmVyKTsKKwkJCQlzZXJ2ZXJDYWNoZS5wdXQocnVudGltZSwgc2VydmVyKTsKKwkJCQlyZXR1cm4gc2VydmVyOworCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjcmVhdGluZyBzZXJ2ZXIiLCBjZSk7CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBJUnVudGltZVdvcmtpbmdDb3B5IGdldFJ1bnRpbWUoKSB7CisJCXJldHVybiBydW50aW1lOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOworCQkKKwkJQ29udHJvbFtdIGMgPSBnZXRDaGlsZHJlbigpOworCQlpZiAoYyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IGMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQkJaWYgKGNbaV0gIT0gbnVsbCkKKwkJCQkJY1tpXS5zZXRWaXNpYmxlKHZpc2libGUpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld1NlcnZlckNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3U2VydmVyQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxYjRjZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld1NlcnZlckNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLlNlcnZlckNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOworLyoqCisgKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gc2VsZWN0IGEgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgTmV3U2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKKwlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7CisJcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7CisJcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOworCXByb3RlY3RlZCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlOworCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyVHlwZUlkOworCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9FWElTVElORyA9IFdpemFyZFRhc2tVdGlsLk1PREVfRVhJU1RJTkc7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfREVURUNUID0gV2l6YXJkVGFza1V0aWwuTU9ERV9ERVRFQ1Q7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfTUFOVUFMID0gV2l6YXJkVGFza1V0aWwuTU9ERV9NQU5VQUw7CisJcHJvdGVjdGVkIGJ5dGUgbW9kZTsKKworCXByb3RlY3RlZCBDb21wb3NpdGUgZGV0ZWN0Q29tcDI7CisJcHJvdGVjdGVkIE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZSBkZXRlY3RDb21wOworCXByb3RlY3RlZCBIb3N0bmFtZUNvbXBvc2l0ZSBkZXRlY3RIb3N0Q29tcDsKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIG1hbnVhbENvbXAyOworCXByb3RlY3RlZCBOZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUgbWFudWFsQ29tcDsKKwlwcm90ZWN0ZWQgSG9zdG5hbWVDb21wb3NpdGUgbWFudWFsSG9zdENvbXA7CisJcHJvdGVjdGVkIFNlcnZlckNvbXBvc2l0ZSBleGlzdGluZ0NvbXA7CisKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIHN0YWNrOworCXByb3RlY3RlZCBTdGFja0xheW91dCBzdGFja0xheW91dDsgCisKKwlwcm90ZWN0ZWQgU3RyaW5nIGxhc3RIb3N0bmFtZTsKKworCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgZXhpc3RpbmdXQzsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBOZXdTZXJ2ZXJDb21wb3NpdGUuCisJICogCisJICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKKwkgKiBAcGFyYW0gd2l6YXJkIGEgd2l6YXJkIGhhbmRsZQorCSAqIEBwYXJhbSBtb2R1bGVUeXBlIGEgbW9kdWxlIHR5cGUsIG9yIG51bGwKKwkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIGEgc2VydmVyIHR5cGUgaWQsIG9yIG51bGwKKwkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIGxhdW5jaCBtb2RlCisJICovCisJcHVibGljIE5ld1NlcnZlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7CisJCXRoaXMud2l6YXJkID0gd2l6YXJkOworCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOworCQl0aGlzLnNlcnZlclR5cGVJZCA9IHNlcnZlclR5cGVJZDsKKwkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKKwkJCisJCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXpOZXdTZXJ2ZXJUaXRsZSk7CisJCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpOZXdTZXJ2ZXJEZXNjcmlwdGlvbik7CisJCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laQkFOX05FV19TRVJWRVIpKTsKKwkJCisJCWNyZWF0ZUNvbnRyb2woKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgTmV3U2VydmVyQ29tcG9zaXRlLgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCisJICogQHBhcmFtIHdpemFyZCBhIHdpemFyZCBoYW5kbGUKKwkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCisJICogQHBhcmFtIGxhdW5jaE1vZGUgYSBsYXVuY2ggbW9kZQorCSAqLworCXB1YmxpYyBOZXdTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQsIElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKKwkJdGhpcy53aXphcmQgPSB3aXphcmQ7CisJCXRoaXMubW9kdWxlID0gbW9kdWxlOworCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOworCQkKKwkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpek5ld1NlcnZlclRpdGxlKTsKKwkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek5ld1NlcnZlckRlc2NyaXB0aW9uKTsKKwkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fTkVXX1NFUlZFUikpOworCQkKKwkJY3JlYXRlQ29udHJvbCgpOworCX0KKworCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7CisJCWxhYmVsLnNldFRleHQodGV4dCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47CisJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKKwkJcmV0dXJuIGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgMSk7CisJfQorCisJcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKKwkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOworCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKKwkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7CisJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlyZXR1cm4gYnV0dG9uOworCX0KKwkKKwlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0MiwgaW50IHNwYW4pIHsKKwkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuTk9ORSk7CisJCXRleHQuc2V0VGV4dCh0ZXh0Mik7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47CisJCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJcmV0dXJuIHRleHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgVUkgb2YgdGhlIHBhZ2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7CisJCXNldExheW91dChsYXlvdXQpOworCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwkJd2hzLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5ORVdfU0VSVkVSX1dJWkFSRCk7CisJCQorCQlpZiAobW9kdWxlICE9IG51bGwpIHsKKwkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKKwkJCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlKTsKKwkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpCisJCQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlKTsKKwkJCWVsc2UKKwkJCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6UnVuT25TZXJ2ZXJUaXRsZSk7CisJCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMud2l6TmV3U2VydmVyUnVuT25TZXJ2ZXJEZXNjcmlwdGlvbik7CisJCQljcmVhdGVMYWJlbCh0aGlzLCBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJTZWxlY3QsIDEpOworCQl9CisJCQorCQlCdXR0b24gZXhpc3RpbmcgPSBudWxsOworCQlpZiAobW9kdWxlICE9IG51bGwpIHsKKwkJCWZpbmFsIEJ1dHRvbiBwcmVkZWZpbmVkID0gY3JlYXRlUmFkaW9CdXR0b24odGhpcywgTWVzc2FnZXMud2l6TmV3U2VydmVyRXhpc3RpbmcsIDEpOworCQkJcHJlZGVmaW5lZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWlmIChwcmVkZWZpbmVkLmdldFNlbGVjdGlvbigpKQorCQkJCQkJdG9nZ2xlTW9kZShNT0RFX0VYSVNUSU5HKTsKKwkJCQl9CisJCQl9KTsKKwkJCWV4aXN0aW5nID0gcHJlZGVmaW5lZDsKKwkJfQorCQkKKwkJLypmaW5hbCBCdXR0b24gYXV0byA9IGNyZWF0ZVJhZGlvQnV0dG9uKHRoaXMsIE1lc3NhZ2VzLndpek5ld1NlcnZlckRldGVjdCIpLCAxKTsKKwkJYXV0by5zZXRFbmFibGVkKGZhbHNlKTsKKwkJYXV0by5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAoYXV0by5nZXRTZWxlY3Rpb24oKSkKKwkJCQkJdG9nZ2xlTW9kZShNT0RFX0RFVEVDVCk7CisJCQl9CisJCX0pOyovCisJCisJCUJ1dHRvbiBtYW51YWwgPSBudWxsOworCQlpZiAobW9kdWxlICE9IG51bGwpIHsKKwkJCWZpbmFsIEJ1dHRvbiBtYW51YWxCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbih0aGlzLCBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJNYW51YWwsIDEpOworCQkJbWFudWFsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJaWYgKG1hbnVhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKKwkJCQkJCXRvZ2dsZU1vZGUoTU9ERV9NQU5VQUwpOworCQkJCX0KKwkJCX0pOworCQkJbWFudWFsID0gbWFudWFsQnV0dG9uOworCQl9CisJCQorCQlzdGFjayA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCXN0YWNrLnNldExheW91dERhdGEoZGF0YSk7CisJCXN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7CisJCXN0YWNrTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCXN0YWNrTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJc3RhY2suc2V0TGF5b3V0KHN0YWNrTGF5b3V0KTsKKwkJCisJCWlmIChtb2R1bGUgIT0gbnVsbCkKKwkJCWNyZWF0ZUV4aXN0aW5nQ29tcG9zaXRlKHN0YWNrKTsKKwkJY3JlYXRlQXV0b0NvbXBvc2l0ZShzdGFjayk7CisJCWNyZWF0ZU1hbnVhbENvbXBvc2l0ZShzdGFjayk7CisJCQorCQlpZiAoZXhpc3RpbmdDb21wICE9IG51bGwgJiYgZXhpc3RpbmcgIT0gbnVsbCkgeworCQkJaWYgKGlzRXhpc3RpbmdTZXJ2ZXIoKSkgeworCQkJCW1vZGUgPSBNT0RFX0VYSVNUSU5HOworCQkJCXN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBleGlzdGluZ0NvbXA7CisJCQkJZXhpc3Rpbmcuc2V0U2VsZWN0aW9uKHRydWUpOworCQkJfSBlbHNlIHsKKwkJCQltb2RlID0gTU9ERV9NQU5VQUw7CisJCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOworCQkJCW1hbnVhbENvbXAuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQlpZiAobWFudWFsICE9IG51bGwpCisJCQkJCW1hbnVhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCQkJZXhpc3Rpbmcuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJZXhpc3RpbmdDb21wLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJbW9kZSA9IE1PREVfTUFOVUFMOworCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOworCQkJbWFudWFsQ29tcC5zZXRWaXNpYmxlKHRydWUpOworCQkJaWYgKG1hbnVhbCAhPSBudWxsKQorCQkJCW1hbnVhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCX0KKwkJCisJCWlmIChtb2R1bGUgIT0gbnVsbCkgeworCQkJLy8gcHJlZmVycmVkIHNlcnZlciBidXR0b24KKwkJCWZpbmFsIEJ1dHRvbiBwcmVmID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0sgfCBTV1QuV1JBUCk7CisJCQlwcmVmLnNldFRleHQoTWVzc2FnZXMud2l6U2VsZWN0U2VydmVyUHJlZmVycmVkKTsKKwkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EKTsKKwkJCXByZWYuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCXByZWYuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfREVGQVVMVF9TRVJWRVIsIG5ldyBCb29sZWFuKHByZWYuZ2V0U2VsZWN0aW9uKCkpKTsKKwkJCQl9CisJCQl9KTsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJlZiwgQ29udGV4dElkcy5TRUxFQ1RfU0VSVkVSX1BSRUZFUkVOQ0UpOworCQl9CisJCQorCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHRvZ2dsZU1vZGUoYnl0ZSBuZXdNb2RlKSB7CisJCWlmICghaXNWaXNpYmxlKCkpCisJCQlyZXR1cm47CisJCQorCQlpZiAobmV3TW9kZSA9PSBtb2RlKQorCQkJcmV0dXJuOworCQkKKwkJbW9kZSA9IG5ld01vZGU7CisJCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7CisJCQorCQlpZiAobW9kZSA9PSBNT0RFX0VYSVNUSU5HKSB7CisJCQlzdGFja0xheW91dC50b3BDb250cm9sID0gZXhpc3RpbmdDb21wOworCQkJZXhpc3RpbmdDb21wLnNldFNlbGVjdGlvbihleGlzdGluZ0NvbXAuZ2V0U2VsZWN0ZWRTZXJ2ZXIoKSk7CisJCX0gZWxzZSBpZiAobW9kZSA9PSBNT0RFX0RFVEVDVCkgeworCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGRldGVjdENvbXAyOworCQkJZGV0ZWN0Q29tcC5zZXRWaXNpYmxlKHRydWUpOworCQl9IGVsc2UgeworCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOworCQkJbWFudWFsQ29tcC5zZXRWaXNpYmxlKHRydWUpOworCQl9CisJCXN0YWNrLmxheW91dCgpOworCQlpZiAodGFza01vZGVsICE9IG51bGwpIHsKKwkJCXRhc2tNb2RlbC5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19NT0RFLCBuZXcgQnl0ZShtb2RlKSk7CisJCQl1cGRhdGVUYXNrTW9kZWwoKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBIb3N0bmFtZUNvbXBvc2l0ZSBjcmVhdGVIb3N0Q29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7CisJCUhvc3RuYW1lQ29tcG9zaXRlIGhvc3RDb21wID0gbmV3IEhvc3RuYW1lQ29tcG9zaXRlKGNvbXAsIG5ldyBIb3N0bmFtZUNvbXBvc2l0ZS5JSG9zdG5hbWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGhvc3RuYW1lU2VsZWN0ZWQoU3RyaW5nIGhvc3QpIHsKKwkJCQlsYXN0SG9zdG5hbWUgPSBob3N0OworCQkJCWlmIChkZXRlY3RDb21wICE9IG51bGwpCisJCQkJCWRldGVjdENvbXAuc2V0SG9zdChob3N0KTsKKwkJCQlpZiAobWFudWFsQ29tcCAhPSBudWxsKQorCQkJCQltYW51YWxDb21wLnNldEhvc3QoaG9zdCk7CisJCQl9CisJCX0pOworCQkKKwkJaWYgKGxhc3RIb3N0bmFtZSAhPSBudWxsKQorCQkJaG9zdENvbXAuc2V0SG9zdG5hbWUobGFzdEhvc3RuYW1lKTsKKwkJCisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CisJCWhvc3RDb21wLnNldExheW91dERhdGEoZGF0YSk7CisJCXJldHVybiBob3N0Q29tcDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdXRvQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7CisJCWRldGVjdENvbXAyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQlkZXRlY3RDb21wMi5zZXRMYXlvdXQobGF5b3V0KTsKKwkJCisJCWRldGVjdEhvc3RDb21wID0gY3JlYXRlSG9zdENvbXBvc2l0ZShkZXRlY3RDb21wMik7CisJCQorCQlkZXRlY3RDb21wID0gbmV3IE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZShkZXRlY3RDb21wMiwgbmV3IE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZS5JU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZXJ2ZXJTZWxlY3RlZChJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIpIHsKKwkJCQkvLyBkbyBub3RoaW5nCisJCQl9CisJCX0pOworCisJCWlmIChsYXN0SG9zdG5hbWUgIT0gbnVsbCkKKwkJCWRldGVjdENvbXAuc2V0SG9zdChsYXN0SG9zdG5hbWUpOworCQllbHNlCisJCQlkZXRlY3RDb21wLnNldEhvc3QoImxvY2FsaG9zdCIpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKKwkJZGF0YS5oZWlnaHRIaW50ID0gMTUwOworCQlkZXRlY3RDb21wLnNldExheW91dERhdGEoZGF0YSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXhpc3RpbmdDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXApIHsKKwkJZXhpc3RpbmdDb21wID0gbmV3IFNlcnZlckNvbXBvc2l0ZShjb21wLCBuZXcgU2VydmVyQ29tcG9zaXRlLlNlcnZlclNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKKwkJCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOworCQkJCQorCQkJCS8vIGNoZWNrIGZvciBjb21wYXRpYmlsaXR5CisJCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZSAhPSBudWxsKSB7CisJCQkJCUlTdGF0dXMgc3RhdHVzID0gaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyLCBtb2R1bGUpOworCQkJCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKKwkJCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQorCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOworCQkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQorCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7CisJCQkJCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pCisJCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7CisJCQkJCQlzZXJ2ZXIgPSBudWxsOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmIChleGlzdGluZ1dDICE9IG51bGwpIHsKKwkJCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5lcXVhbHMoZXhpc3RpbmdXQy5nZXRPcmlnaW5hbCgpKSkKKwkJCQkJCXJldHVybjsKKwkJCQkJZXhpc3RpbmdXQyA9IG51bGw7CisJCQkJfQorCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCQkJZXhpc3RpbmdXQyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOworCQkJCXVwZGF0ZVRhc2tNb2RlbCgpOworCQkJfQorCQl9LCBtb2R1bGUsIGxhdW5jaE1vZGUpOworCQlleGlzdGluZ0NvbXAuc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKHRydWUpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKKwkJZGF0YS5oZWlnaHRIaW50ID0gMTUwOworCQlleGlzdGluZ0NvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdGF0dXMgb2Ygd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCisJICogCisJICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgorCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKKwkgKiBAcmV0dXJuIGFuIElTdGF0dXMgcmVwcmVzZW50aW5nIHRoZSBlcnJvciBvciB3YXJuaW5nLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyBwcm9ibGVtcworCSAqLworCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBpc1N1cHBvcnRlZE1vZHVsZShJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlKSB7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgIT0gbnVsbCkgeworCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7CisJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7CisJCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG10KSkgeworCQkJCVN0cmluZyB0eXBlID0gbXQuZ2V0TmFtZSgpOworCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JWZXJzaW9uTGV2ZWwsIG5ldyBPYmplY3RbXSB7IHR5cGUsIG10LmdldFZlcnNpb24oKSB9KSk7CisJCQl9CisJCQkKKwkJCUlNb2R1bGVbXSByb290TW9kdWxlcyA9IG51bGw7CisJCQl0cnkgeworCQkJCXJvb3RNb2R1bGVzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbnVsbCk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcm9vdCBtb2R1bGUiLCBlKTsKKwkJCX0KKwkJCWlmIChyb290TW9kdWxlcyAhPSBudWxsKSB7CisJCQkJaWYgKHJvb3RNb2R1bGVzLmxlbmd0aCA9PSAwKQorCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmVycm9yUm9vdE1vZHVsZSk7CisJCQkJCisJCQkJaW50IHNpemUgPSByb290TW9kdWxlcy5sZW5ndGg7CisJCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOworCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQl0cnkgeworCQkJCQkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJCQkJCXN0YXR1cyA9IHNlcnZlci5jYW5Nb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10ge3Jvb3RNb2R1bGVzW2ldfSwgbnVsbCwgbnVsbCk7CisJCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmlzT0soKSkKKwkJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcm9vdCBtb2R1bGUiLCBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIWZvdW5kICYmIHN0YXR1cyAhPSBudWxsKQorCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzRXhpc3RpbmdTZXJ2ZXIoKSB7CisJCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBsYXVuY2hNb2RlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOworCQlpZiAoc2VydmVycyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7CisJCQkJaWYgKFNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlcnNbaV0sIGxhdW5jaE1vZGUpICYmCisJCQkJCVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpLCBtdCkpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFudWFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7CisJCW1hbnVhbENvbXAyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQltYW51YWxDb21wMi5zZXRMYXlvdXQobGF5b3V0KTsKKwkJbWFudWFsQ29tcDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCQorCQltYW51YWxIb3N0Q29tcCA9IGNyZWF0ZUhvc3RDb21wb3NpdGUobWFudWFsQ29tcDIpOworCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZVR5cGU7CisJCWJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZSA9IHRydWU7CisJCWlmIChtb2R1bGVUeXBlICE9IG51bGwpCisJCQlpbmNsdWRlSW5jb21wYXRpYmxlID0gZmFsc2U7CisJCQorCQlpZiAobW9kdWxlICE9IG51bGwpCisJCQltdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7CisJCQorCQltYW51YWxDb21wID0gbmV3IE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZShtYW51YWxDb21wMiwgbmV3IE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZS5JV2l6YXJkSGFuZGxlMigpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQkJCXdpemFyZC5ydW4oZm9yaywgY2FuY2VsYWJsZSwgcnVubmFibGUpOworCQkJfQorCQkJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQkJCXdpemFyZC51cGRhdGUoKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKSB7CisJCQkJd2l6YXJkLnNldE1lc3NhZ2UobmV3TWVzc2FnZSwgbmV3VHlwZSk7CisJCQl9CisJCX0sIG10LCBtb2R1bGUsIHNlcnZlclR5cGVJZCwgaW5jbHVkZUluY29tcGF0aWJsZSwgbmV3IE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZS5TZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlcnZlclNlbGVjdGVkKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcikgeworCQkJCXVwZGF0ZVRhc2tNb2RlbCgpOworCQkJfQorCQkJcHVibGljIHZvaWQgcnVudGltZVNlbGVjdGVkKElSdW50aW1lIHJ1bnRpbWUpIHsKKwkJCQl1cGRhdGVUYXNrTW9kZWwoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlpZiAobGFzdEhvc3RuYW1lICE9IG51bGwpCisJCQltYW51YWxDb21wLnNldEhvc3QobGFzdEhvc3RuYW1lKTsKKwkJZWxzZQorCQkJbWFudWFsQ29tcC5zZXRIb3N0KCJsb2NhbGhvc3QiKTsKKworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOworCQlkYXRhLmhlaWdodEhpbnQgPSAzMjU7CisJCW1hbnVhbENvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYXNrTW9kZWwoKSB7CisJCWlmICh0YXNrTW9kZWwgIT0gbnVsbCkgeworCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IGdldFNlcnZlcigpOworCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7CisJCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcik7CisJCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBzZXJ2ZXIuZ2V0UnVudGltZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIG51bGwpOworCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgbnVsbCk7CisJCQl9CisJCX0KKwkJd2l6YXJkLnVwZGF0ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgbW9kZWwpIHsKKwkJdGFza01vZGVsID0gbW9kZWw7CisJCXRhc2tNb2RlbC5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19NT0RFLCBuZXcgQnl0ZShtb2RlKSk7CisJCXVwZGF0ZVRhc2tNb2RlbCgpOworCX0KKworCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgeworCQlpZiAobW9kZSA9PSBNT0RFX0VYSVNUSU5HKQorCQkJcmV0dXJuIGV4aXN0aW5nV0M7IC8vZXhpc3RpbmdDb21wLmdldFNlbGVjdGVkU2VydmVyKCk7CisJCWVsc2UgaWYgKG1vZGUgPT0gTU9ERV9ERVRFQ1QpCisJCQlyZXR1cm4gZGV0ZWN0Q29tcC5nZXRTZXJ2ZXIoKTsKKwkJZWxzZQorCQkJcmV0dXJuIG1hbnVhbENvbXAuZ2V0U2VydmVyKCk7CisJfQorCisJcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKSB7CisJCWlmIChtb2RlID09IE1PREVfRVhJU1RJTkcpIHsKKwkJCUlTZXJ2ZXIgc2VydmVyID0gZXhpc3RpbmdDb21wLmdldFNlbGVjdGVkU2VydmVyKCk7CisJCQlpZiAoc2VydmVyICE9IG51bGwpCisJCQkJcmV0dXJuIHNlcnZlci5nZXRSdW50aW1lKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIGlmIChtb2RlID09IE1PREVfREVURUNUKQorCQkJcmV0dXJuIG51bGw7CisJCWVsc2UKKwkJCXJldHVybiBtYW51YWxDb21wLmdldFJ1bnRpbWUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOworCQkKKwkJQ29udHJvbFtdIGMgPSBnZXRDaGlsZHJlbigpOworCQlpZiAoYyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IGMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQkJaWYgKGNbaV0gIT0gbnVsbCkKKwkJCQkJY1tpXS5zZXRWaXNpYmxlKHZpc2libGUpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1NlbGVjdENsaWVudENvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvU2VsZWN0Q2xpZW50Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4MjhlNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1NlbGVjdENsaWVudENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07CisvKioKKyAqIEEgd2l6YXJkIHBhZ2UgdXNlZCB0byBzZWxlY3QgYSBzZXJ2ZXIgY2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgU2VsZWN0Q2xpZW50Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKKwlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7CisJcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7CisKKwkvLyB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byBzZWxlY3QgZnJvbQorCXByb3RlY3RlZCBJQ2xpZW50W10gY2xpZW50czsKKworCS8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudAorCXByb3RlY3RlZCBJQ2xpZW50IHNlbGVjdGVkQ2xpZW50OworCisJLy8gdGhlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzCisJcHJvdGVjdGVkIFRhYmxlIGVsZW1lbnRUYWJsZTsKKworCS8vIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VsZWN0ZWQgY2xpZW50CisJcHJvdGVjdGVkIExhYmVsIGRlc2NyaXB0aW9uOworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IFNlbGVjdENsaWVudENvbXBvc2l0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQorCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQgaGFuZGxlCisJICogQHBhcmFtIHRhc2tNb2RlbCBhIHRhc2sgbW9kZWwKKwkgKi8KKwlwdWJsaWMgU2VsZWN0Q2xpZW50Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkLCBUYXNrTW9kZWwgdGFza01vZGVsKSB7CisJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOworCQl0aGlzLndpemFyZCA9IHdpemFyZDsKKwkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7CisJCXRyeSB7CisJCQljbGllbnRzID0gKElDbGllbnRbXSkgdGFza01vZGVsLmdldE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0NMSUVOVFMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkKKwkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpelNlbGVjdENsaWVudFRpdGxlKTsKKwkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpelNlbGVjdENsaWVudERlc2NyaXB0aW9uKTsKKwkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fU0VMRUNUX1NFUlZFUl9DTElFTlQpKTsKKwkJCisJCWNyZWF0ZUNvbnRyb2woKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgeworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKKwkJc2V0TGF5b3V0KGxheW91dCk7CisKKwkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7CisJCXdocy5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuU0VMRUNUX0NMSUVOVF9XSVpBUkQpOworCQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7CisJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMud2l6U2VsZWN0Q2xpZW50TWVzc2FnZSk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkKKwkJZWxlbWVudFRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWRhdGEuaGVpZ2h0SGludCA9IDgwOworCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKKwkJZWxlbWVudFRhYmxlLnNldExheW91dERhdGEoZGF0YSk7CisJCWVsZW1lbnRUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJaGFuZGxlU2VsZWN0aW9uKCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWhhbmRsZVNlbGVjdGlvbigpOworCQkJCS8vVE9ETzogV2l6YXJkVXRpbC5kZWZhdWx0U2VsZWN0KGdldFdpemFyZCgpLCBTZWxlY3RDbGllbnRXaXphcmRQYWdlLnRoaXMpOworCQkJfQorCQl9KTsKKwkJd2hzLnNldEhlbHAoZWxlbWVudFRhYmxlLCBDb250ZXh0SWRzLlNFTEVDVF9DTElFTlQpOworCQorCQlpZiAoY2xpZW50cyAhPSBudWxsKSB7CisJCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKKwkJCWludCBzaXplID0gY2xpZW50cy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShlbGVtZW50VGFibGUsIFNXVC5OT05FKTsKKwkJCQlpdGVtLnNldFRleHQoMCwgbGFiZWxQcm92aWRlci5nZXRUZXh0KGNsaWVudHNbaV0pKTsKKwkJCQlpdGVtLnNldEltYWdlKDAsIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoY2xpZW50c1tpXSkpOworCQkJCWl0ZW0uc2V0RGF0YShjbGllbnRzW2ldKTsKKwkJCX0KKwkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOworCQl9CisJCQorCQlkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7CisJCWRlc2NyaXB0aW9uLnNldFRleHQoIiIpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisJCWRhdGEuaGVpZ2h0SGludCA9IDcwOworCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworCQorCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOworCX0KKworCS8qKgorCSAqIEhhbmRsZSB0aGUgc2VsZWN0aW9uIG9mIGEgY2xpZW50LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbigpIHsKKwkJaW50IGluZGV4ID0gZWxlbWVudFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7CisJCWlmIChpbmRleCA8IDApCisJCQlzZWxlY3RlZENsaWVudCA9IG51bGw7CisJCWVsc2UKKwkJCXNlbGVjdGVkQ2xpZW50ID0gY2xpZW50c1tpbmRleF07CisJCQorCQl0YXNrTW9kZWwucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5ULCBzZWxlY3RlZENsaWVudCk7CisJCWlmIChzZWxlY3RlZENsaWVudCAhPSBudWxsKQorCQkJd2l6YXJkLnNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKKwkJZWxzZQorCQkJd2l6YXJkLnNldE1lc3NhZ2UoIiIsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOworCQkKKwkJU3RyaW5nIGRlc2MgPSBudWxsOworCQlpZiAoc2VsZWN0ZWRDbGllbnQgIT0gbnVsbCkKKwkJCWRlc2MgPSBzZWxlY3RlZENsaWVudC5nZXREZXNjcmlwdGlvbigpOworCQlpZiAoZGVzYyA9PSBudWxsKQorCQkJZGVzYyA9ICIiOworCQlkZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2MpOworCQkKKwkJd2l6YXJkLnVwZGF0ZSgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9TZXJ2ZXJDcmVhdGlvbkNhY2hlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9TZXJ2ZXJDcmVhdGlvbkNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwZTM4YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1NlcnZlckNyZWF0aW9uQ2FjaGUuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgdXNlZCB0byBjYWNoZSB0aGUgY3JlYXRpb24gb2Ygc2VydmVycy4KKyAqLworcHVibGljIGNsYXNzIFNlcnZlckNyZWF0aW9uQ2FjaGUgeworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJU2VydmVyV29ya2luZ0NvcHk+IGNhY2hlOworCisJLyoqCisJICogU2VydmVyQ3JlYXRpb25DYWNoZSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBTZXJ2ZXJDcmVhdGlvbkNhY2hlKCkgeworCQlzdXBlcigpOworCQljYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVNlcnZlcldvcmtpbmdDb3B5PigpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUga2V5IHRvIHVzZSBmb3IgdGhlIGdpdmVuIHNlcnZlciB0eXBlLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlIHRoZSBzZXJ2ZXIgdHlwZQorCSAqIEBwYXJhbSBpc0xvY2FsaG9zdCB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgbG9jYWwKKwkgKiBAcmV0dXJuIHRoZSBrZXkKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRLZXkoSVNlcnZlclR5cGUgdHlwZSwgYm9vbGVhbiBpc0xvY2FsaG9zdCkgeworCQlyZXR1cm4gdHlwZS5nZXRJZCgpICsgInwiICsgaXNMb2NhbGhvc3QgKyAifCI7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IHNlcnZlciBhbmQgcHV0IGl0IGluIHRoZSBjYWNoZS4KKwkgKgorCSAqIEBwYXJhbSB0eXBlIHRoZSBzZXJ2ZXIgdHlwZQorCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZSwgb3IgbnVsbAorCSAqIEBwYXJhbSBpc0xvY2FsaG9zdCB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgbG9jYWwKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKKwkgKiBAcmV0dXJuIGEgc2VydmVyIHdvcmtpbmcgY29weQorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCisJICovCisJcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVTZXJ2ZXIoSVNlcnZlclR5cGUgdHlwZSwgSVJ1bnRpbWUgcnVudGltZSwgYm9vbGVhbiBpc0xvY2FsaG9zdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSB0eXBlLmNyZWF0ZVNlcnZlcihudWxsLCBudWxsLCBydW50aW1lLCBtb25pdG9yKTsKKwkJY2FjaGUucHV0KGdldEtleSh0eXBlLCBpc0xvY2FsaG9zdCksIHNlcnZlcik7CisJCXJldHVybiBzZXJ2ZXI7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHByZXZpb3VzbHkgY2FjaGVkIHNlcnZlciwgaWYgb25lIGV4aXN0cworCSAqIAorCSAqIEBwYXJhbSB0eXBlIHRoZSBzZXJ2ZXIgdHlwZQorCSAqIEBwYXJhbSBpc0xvY2FsaG9zdCB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgbG9jYWwKKwkgKiBAcmV0dXJuIGEgd29ya2luZyBjb3B5CisJICovCisJcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRDYWNoZWRTZXJ2ZXIoSVNlcnZlclR5cGUgdHlwZSwgYm9vbGVhbiBpc0xvY2FsaG9zdCkgeworCQl0cnkgeworCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IGNhY2hlLmdldChnZXRLZXkodHlwZSwgaXNMb2NhbGhvc3QpKTsKKwkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCQlyZXR1cm4gc2VydmVyOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvVGFza3NDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjgxYjRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvVGFza3NDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5UYXNrc1dpemFyZEZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworLyoqCisgKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gc2VsZWN0IHNlcnZlciBhbmQgbW9kdWxlIHRhc2tzLgorICovCitwdWJsaWMgY2xhc3MgVGFza3NDb21wb3NpdGUgZXh0ZW5kcyBTY3JvbGxlZENvbXBvc2l0ZSB7CisJcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOworCisJLy8gdGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gc2VsZWN0IGZyb20KKwlwcm90ZWN0ZWQgTGlzdCB0YXNrczsKKworCXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZWQ7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgVGFza3NDb21wb3NpdGUuCisJICogCisJICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKKwkgKiBAcGFyYW0gd2l6YXJkIGEgd2l6YXJkIGhhbmRsZQorCSAqLworCXB1YmxpYyBUYXNrc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7CisJCXRoaXMud2l6YXJkID0gd2l6YXJkOworCQkKKwkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpelRhc2tUaXRsZSk7CisJCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpUYXNrRGVzY3JpcHRpb24pOworCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSKSk7CisJCQorCQkvL2NyZWF0ZUNvbnRyb2woKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYXNrcyhMaXN0IHRhc2tzKSB7CisJCXRoaXMudGFza3MgPSB0YXNrczsKKwkJCisJCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CisJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJY2hpbGRyZW5baV0uZGlzcG9zZSgpOworCQkJfQorCQl9CisJCQorCQljcmVhdGVkID0gZmFsc2U7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgVUkgb2YgdGhlIHBhZ2UuCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKKwkJaWYgKGNyZWF0ZWQpCisJCQlyZXR1cm47CisJCQorCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJCQkKKwkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKKwkJc2V0Q29udGVudChjb21wKTsKKwkJVGFza3NMYXlvdXQgbGF5b3V0ID0gbmV3IFRhc2tzTGF5b3V0KFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpKTsKKwkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLlNFTEVDVF9UQVNLX1dJWkFSRCk7CisJCQorCQlpbnQgc2l6ZSA9IDA7CisJCWlmICh0YXNrcyAhPSBudWxsKQorCQkJc2l6ZSA9IHRhc2tzLnNpemUoKTsKKwkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCU9iamVjdCBvYmogPSB0YXNrcy5nZXQoaSk7CisJCQlmaW5hbCBUYXNrc1dpemFyZEZyYWdtZW50LlRhc2tJbmZvIHN0aSA9IChUYXNrc1dpemFyZEZyYWdtZW50LlRhc2tJbmZvKSBvYmo7CisJCQlmaW5hbCBCdXR0b24gY2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyB8IFNXVC5XUkFQKTsKKwkJCVN0cmluZyBsYWJlbCA9IHN0aS50YXNrMi5nZXRMYWJlbCgpOworCQkJaWYgKGxhYmVsICE9IG51bGwpCisJCQkJY2hlY2tib3guc2V0VGV4dChsYWJlbCk7CisJCQllbHNlCisJCQkJY2hlY2tib3guc2V0VGV4dChNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWUpOworCQkKKwkJCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCQlzdGkuc2V0U2VsZWN0ZWQoY2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOworCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQkJc3RpLnNldFNlbGVjdGVkKGNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwoY29tcCwgU1dULldSQVApOworCQkJU3RyaW5nIGRlc2MgPSBzdGkudGFzazIuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCWlmIChkZXNjICE9IG51bGwpCisJCQkJZGVzY3JpcHRpb24uc2V0VGV4dChkZXNjKTsKKwkJCWVsc2UKKwkJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSk7CisJCQkKKwkJCWlmIChzdGkua2luZCA9PSBQdWJsaXNoT3BlcmF0aW9uLlJFUVVJUkVEKSB7CisJCQkJY2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOworCQkJCWNoZWNrYm94LnNldEVuYWJsZWQoZmFsc2UpOworCQkJCWRlc2NyaXB0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfSBlbHNlCisJCQkJY2hlY2tib3guc2V0U2VsZWN0aW9uKHN0aS5pc1NlbGVjdGVkKCkpOworCQl9CisJCQorCQlpZiAoc2l6ZSA9PSAwKQorCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiVGFzayBjb21wb3NpdGUgYXBwZWFyZWQgd2l0aCBubyB0YXNrcyEiKTsKKwkJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7CisJCQorCQlzZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOworCQlzZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKKwkJCisJCXNldE1pblNpemUoY29tcC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKKwkJbGF5b3V0KHRydWUsIHRydWUpOworCQkKKwkJY3JlYXRlZCA9IHRydWU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1Rhc2tzTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0xheW91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGQ0NWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0xheW91dC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGFza3NMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgeworCXByaXZhdGUgaW50IHZlcnRpY2FsU3BhY2luZzsKKworCXB1YmxpYyBUYXNrc0xheW91dChpbnQgdmVydGljYWxTcGFjaW5nKSB7CisJCXRoaXMudmVydGljYWxTcGFjaW5nID0gdmVydGljYWxTcGFjaW5nOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dCNjb21wdXRlU2l6ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGludCwgaW50LCBib29sZWFuKQorCSAqLworCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCS8vcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOworCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKKwkJCisJCWludCB5ID0gNTsKKwkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoaSAlIDIgPT0gMCkgeworCQkJCQlpbnQgaCA9IGNoaWxkcmVuW2ldLmNvbXB1dGVTaXplKHdIaW50LCBTV1QuREVGQVVMVCkueTsKKwkJCQkJeSArPSBoICsgdmVydGljYWxTcGFjaW5nIC8gMjsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgaCA9IE1hdGgubWF4KDQ1LCBjaGlsZHJlbltpXS5jb21wdXRlU2l6ZSh3SGludCwgU1dULkRFRkFVTFQpLnkpOworCQkJCQl5ICs9IGggKyB2ZXJ0aWNhbFNwYWNpbmc7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBuZXcgUG9pbnQoMjAwLCB5KTsgLy8gKyB2ZXJ0aWNhbFNwYWNpbmcpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dCNsYXlvdXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBib29sZWFuKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKKwkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7CisJCVJlY3RhbmdsZSByID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKKwkJCisJCWludCB5ID0gci55ICsgNTsKKwkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoaSAlIDIgPT0gMCkgeworCQkJCQlpbnQgaCA9IGNoaWxkcmVuW2ldLmNvbXB1dGVTaXplKHIud2lkdGggLSAxMCwgU1dULkRFRkFVTFQpLnk7CisJCQkJCWNoaWxkcmVuW2ldLnNldEJvdW5kcyhyLnggKyA1LCB5LCByLndpZHRoIC0gMTAsIGgpOworCQkJCQl5ICs9IGggKyB2ZXJ0aWNhbFNwYWNpbmcgLyAyOworCQkJCX0gZWxzZSB7CisJCQkJCWludCBoID0gTWF0aC5tYXgoNDUsIGNoaWxkcmVuW2ldLmNvbXB1dGVTaXplKHIud2lkdGggLSAyNSwgU1dULkRFRkFVTFQpLnkpOworCQkJCQljaGlsZHJlbltpXS5zZXRCb3VuZHMoci54ICsgMjAsIHksIHIud2lkdGggLSAyNSwgaCk7CisJCQkJCXkgKz0gaCArIHZlcnRpY2FsU3BhY2luZzsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvV29ya3NwYWNlUnVubmFibGVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Xb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODA1MTlkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvV29ya3NwYWNlUnVubmFibGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKKy8qKgorICogSVJ1bm5hYmxlV2l0aFByb2dyZXNzQWRhcHRlciB0byBhbGxvdyBpdCB0byBydW4gYW4gSVdvcmtzcGFjZVJ1bm5hYmxlLgorICovCitwdWJsaWMgY2xhc3MgV29ya3NwYWNlUnVubmFibGVBZGFwdGVyIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKKwlwcml2YXRlIElXb3Jrc3BhY2VSdW5uYWJsZSB3b3Jrc3BhY2VSdW5uYWJsZTsKKwkKKwlwdWJsaWMgV29ya3NwYWNlUnVubmFibGVBZGFwdGVyKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSkgeworCQl3b3Jrc3BhY2VSdW5uYWJsZSA9IHJ1bm5hYmxlOworCX0KKworCS8qCisJICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQl0cnkgeworCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwgbW9uaXRvcik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWJhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwzOCBAQAorPGh0bWw+Cis8aGVhZD4KKzxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD5UaGUgc2VydmVyIHRvb2xzIFVJLjwvcD4KKzx0YWJsZSB3aWR0aD0iNTAwIj4KKzx0cj4KKzx0ZD4KKzxwPlNlcnZlclVJQ29yZSBpcyB0aGUgbWFpbiBlbnRyeS1wb2ludCBmb3IgdGhlIEFQSS4gRnJvbSBoZXJlLCBjbGllbnRzCitjYW4gZ2V0IHRoZSB3aXphcmQgcGFnZXMgZm9yIGEgcGFydGljdWxhciBzZXJ2ZXIgdHlwZSwgZ2V0IGEgbGFiZWwKK3Byb3ZpZGVyIGZvciBhbGwgc2VydmVyIHR5cGVzLCBvciBsYXVuY2ggUnVuIG9uIFNlcnZlciBkaXJlY3RseS48L3A+Cis8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjUwMCI+Cis8dHI+Cis8dGQ+Cis8cD5TZXJ2ZXJVSVV0aWwgcHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzLiBDdXJyZW50bHksIHRoaXMgaXMgbGltaXRlZCB0bworbGF1bmNoaW5nIHRoZSBzZXJ2ZXIgcnVudGltZSB3aXphcmQgYW5kIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc2VydmVyCitydW50aW1lLjwvcD4KKzwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzx0YWJsZSB3aWR0aD0iNTAwIj4KKzx0cj4KKzx0ZD4KKzxwPlNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIgaXMgYSBnZW5lcmljIHNlcnZlciB0b29scyB0YWIgdGhhdCBjYW4KK2JlIHVzZWQgaW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGFiIGdyb3VwcyBmb3IgYSBzZXJ2ZXIgbGF1bmNoLiBJdCBzaG93cworaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlciB0byB0aGUgdXNlci48L3A+Cis8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3BhY2thZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3M2UyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGh0bWw+Cis8aGVhZD4KKwk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KKwk8bWV0YQorCQluYW1lPSJyb290IgorCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+CisJPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGFic3RyYWN0PlRoZSBzZXJ2ZXIgdG9vbHMgVUkuPC9hYnN0cmFjdD4KKworPHA+U2VydmVyVUlDb3JlIGlzIHRoZSBtYWluIGVudHJ5LXBvaW50IGZvciB0aGUgQVBJLiBGcm9tIGhlcmUsIGNsaWVudHMKK2NhbiBnZXQgdGhlIHdpemFyZCBwYWdlcyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZlciB0eXBlLCBnZXQgYSBsYWJlbAorcHJvdmlkZXIgZm9yIGFsbCBzZXJ2ZXIgdHlwZXMsIG9yIGxhdW5jaCBSdW4gb24gU2VydmVyIGRpcmVjdGx5LjwvcD4KKworPHA+U2VydmVyVUlVdGlsIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcy4gQ3VycmVudGx5LCB0aGlzIGlzIGxpbWl0ZWQgdG8KK2xhdW5jaGluZyB0aGUgc2VydmVyIHJ1bnRpbWUgd2l6YXJkIGFuZCBlZGl0aW5nIGFuIGV4aXN0aW5nIHNlcnZlcgorcnVudGltZS48L3A+CisKKzxwPlNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIgaXMgYSBnZW5lcmljIHNlcnZlciB0b29scyB0YWIgdGhhdCBjYW4KK2JlIHVzZWQgaW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGFiIGdyb3VwcyBmb3IgYSBzZXJ2ZXIgbGF1bmNoLiBJdCBzaG93cworaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlciB0byB0aGUgdXNlci48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvSVdpemFyZEhhbmRsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL0lXaXphcmRIYW5kbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWM5NzUyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL0lXaXphcmRIYW5kbGUuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKKy8qKgorICogQSB3aXphcmQgaGFuZGxlLgorICogCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVdpemFyZEhhbmRsZSBleHRlbmRzIElNZXNzYWdlUHJvdmlkZXIgeworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHdpemFyZCBlcnJvciBtZXNzYWdlcyBhbmQgYnV0dG9ucy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHRpdGxlIG9mIHRoaXMgd2l6YXJkIHBhZ2UuCisJICogIAorCSAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgb2YgdGhlIHdpemFyZCBwYWdlCisJICovCisJcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKTsKKworCS8qKgorCSAqIFRoZSBwYWdlJ3MgZGVzY3JpcHRpb24uCisJICogCisJICogQHBhcmFtIGRlc2MgdGhlIHBhZ2UncyBkZXNjcmlwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKTsKKworCS8qKgorCSAqIFRoZSBwYWdlJ3MgaW1hZ2UgZGVzY3JpcHRvci4KKwkgKiAKKwkgKiBAcGFyYW0gaW1hZ2UgdGhlIHBhZ2UncyBpbWFnZSBkZXNjcmlwdG9yCisJICovCisJcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBpbWFnZSk7CisKKwkvKioKKwkgKiBTZXQgYW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLgorCSAqIAorCSAqIEBwYXJhbSBuZXdNZXNzYWdlIHRoZSBuZXcgbWVzc2FnZQorCSAqIEBwYXJhbSBuZXdUeXBlIHRoZSBuZXcgdHlwZSwgZnJvbSBJU3RhdHVzCisJICovCisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpOworCisJLyoqCisJICogRXhlY3V0ZSBhIHJ1bm5hYmxlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgd2l6YXJkLiBUaGlzIHdpbGwgdHlwaWNhbGx5CisJICogZGlzYWJsZSB0aGUgd2l6YXJkIHdoaWxlIHRoZSBydW5uYWJsZSBpcyBydW5uaW5nLCBhbmQgcHJvdmlkZSBhIHByb2dyZXNzCisJICogbW9uaXRvciBmb3IgdGhlIHVzZXIuICAKKwkgKiAKKwkgKiBAcGFyYW0gZm9yayB0cnVlIGlmIGEgc2VwYXJhdGUgdGhyZWFkIHNob3VsZCBiZSB1c2VkCisJICogQHBhcmFtIGNhbmNlbGFibGUgdHJ1ZSBpZiBpdCBzaG91bGQgYmUgY2FuY2VsYWJsZQorCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgcnVubmFibGUKKwkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiBpdCBpcyBpbnRlcnJ1cHRlZAorCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9XaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL1dpemFyZEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwZjhlOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9XaXphcmRGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMjIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKKy8qKgorICogQSB3aXphcmQgZnJhZ21lbnQgaXMgYSBub2RlIHdpdGhpbiBhIHdpemFyZCB0aGF0IHByb3ZpZGVzIGEgY29tcGxldGVseQorICogZXh0ZW5kYWJsZSB3aXphcmQgZmxvdyBieSBzdXBwb3J0aW5nIGEgZmxleGlibGUgdHJlZSBzdHJ1Y3R1cmUgZm9yIHRoZQorICogcGFnZXMuIEFzIHRoZSB1c2VyIHdhbGtzIHBhZ2VzIHRocm91Z2ggdGhlIHdpemFyZCwgdGhleSBhcmUgYWN0dWFsbHkKKyAqIHRyYXZlcnNpbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSwgYW5kIGVhY2ggbm9kZSBjYW4gYWRkIG9yIHJlbW92ZSBjaGlsZHJlbgorICogYXQgYW55IHRpbWUuCisgKiAKKyAqIEVhY2ggbm9kZSBtYXkgYmUgbm9uLVVJICh1c2VmdWwgZm9yIGluamVjdGluZyBiZWhhdmlvdXIgaW50byB0aGUgdHJlZSkKKyAqIG9yIGNvbnRhaW4gYSBzaW5nbGUgd2l6YXJkIHBhZ2UgKEBzZWUgaGFzQ29tcG9zaXRlKCkgYW5kCisgKiBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlLCBJV2l6YXJkSGFuZGxlKSkuIFRoZSBub2RlIG1heSBhbHNvIGhhdmUKKyAqIGNoaWxkcmVuIChAc2VlIGdldENoaWxkRnJhZ21lbnRzKCksIHdoaWNoIHNob3VsZCBiZSB1cGRhdGVkIG9yIHJlZnJlc2hlZAorICogd2hlbmV2ZXIgdGhlIHVwZGF0ZUNoaWxkRnJhZ21lbnRzKCkgbWV0aG9kIGlzIGNhbGxlZCBieSBhbm90aGVyIG5vZGUgdG8KKyAqIGxldCB0aGlzIG5vZGUga25vdyB0aGF0IGl0J3Mgc3RhdGUgbWF5IGhhdmUgY2hhbmdlZC4KKyAqIAorICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgY3JlYXRlQ2hpbGRGcmFnbWVudHMoKSBtZXRob2QgdG8gYWxsb3cgdGhlCisgKiBmcmFnbWVudCB0byBhZGQgaXQncyBjaGlsZHJlbiBpbnRvIHRoZSB0cmVlLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5CisgKiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgdGhlIHRyZWUgaXMgdXBkYXRlZCBhbmQgaXQgbXVzdCByZXR1cm4gdGhlCisgKiBzYW1lIGluc3RhbmNlIG9mIGFueSBjaGlsZHJlbiB0aGF0IGhhdmUgcHJldmlvdXNseSBiZWVuIHJldHVybmVkLgorICogCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXaXphcmRGcmFnbWVudCB7CisJcHJpdmF0ZSBUYXNrTW9kZWwgdGFza01vZGVsOworCXByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXRlID0gdHJ1ZTsKKwlwcml2YXRlIExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3RJbXBsOworCisJLyoqCisJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZyYWdtZW50IGhhcyBhbiBhc3NvY2lhdGVkIFVJLAorCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaGFzIGEgY29tcG9zaXRlCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgY29tcG9zaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZyYWdtZW50LgorCSAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gaGFzQ29tcG9zaXRlKCkgcmV0dXJucyB0cnVlLgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCisJICogQHBhcmFtIGhhbmRsZSBhIHdpemFyZCBoYW5kbGUKKwkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbXBvc2l0ZQorCSAqLworCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgaGFuZGxlKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHdpemFyZCB0YXNrIG1vZGVsLgorCSAqIDxwPgorCSAqIEEgdGFzayBtb2RlbCBpcyBzaGFyZWQgYnkgYWxsIGZyYWdtZW50cyBpbiB0aGUgd2l6YXJkIGFuZCBpcyB1c2VkIHRvIHNoYXJlCisJICogZGF0YS4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgdGFzayBmbG93IGFuZCBhbGxvd3MKKwkgKiBmcmFnbWVudHMgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgZnJhZ21lbnRzCisJICogdG8gYmUgY2hhaW5lZCB0b2dldGhlciBhbmQgc2hhcmUgZGF0YSBmcm9tIHRoZSBvdXRwdXQgb2Ygb25lIGZyYWdtZW50IHRvCisJICogdGhlIGlucHV0IG9mIGFub3RoZXIuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSB0YXNrTW9kZWwgdGhlIHRhc2sgbW9kZWwKKwkgKiBAc2VlICNnZXRUYXNrTW9kZWwoKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7CisJCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHdpemFyZCB0YXNrIG1vZGVsLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHRhc2sgbW9kZWwKKwkgKiBAc2VlICNzZXRUYXNrTW9kZWwoVGFza01vZGVsKQorCSAqLworCXB1YmxpYyBUYXNrTW9kZWwgZ2V0VGFza01vZGVsKCkgeworCQlyZXR1cm4gdGFza01vZGVsOworCX0KKworCS8qKgorCSAqIENhbGxlZCB3aGVuIHRoZSB3aXphcmQgdGhhdCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgdG8gaGFzIHRyYXZlcnNlZAorCSAqIGludG8gdGhpcyB3aXphcmQgZnJhZ21lbnQuIEl0IGlzIGNhbGxlZCB0byBnaXZlIHRoZSBmcmFnbWVudCB0aGUKKwkgKiBvcHBvcnR1bml0eSB0byBpbml0aWFsaXplIGFueSB2YWx1ZXMgc2hvd24gaW4gdGhlIGNvbXBvc2l0ZSBvcgorCSAqIHVwZGF0ZSB0aGUgdGFzayBtb2RlbC4KKwkgKiA8cD4KKwkgKiBXaGVuIGZpbmlzaCBpcyBwcmVzc2VkLCB0aGUgY3VycmVudCBmcmFnbWVudCBpcyBleGl0KCllZCwgYW5kIHRoZW4KKwkgKiBwZXJmb3JtRmluaXNoKCkgaXMgY2FsbGVkIG9uIGFsbCBvZiB0aGUgZnJhZ21lbnRzIGluIHRoZSB0cmVlLgorCSAqIGVudGVyKCkgYW5kIGV4aXQoKSBhcmUgbm90IGNhbGxlZCBvbiB0aGUgcmVtYWluaW5nIGZyYWdtZW50cy4KKwkgKiA8L3A+CisJICovCisJcHVibGljIHZvaWQgZW50ZXIoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvIGhhcyB0cmF2ZXJzZWQKKwkgKiBvdXQgb2YgdGhpcyB3aXphcmQgZnJhZ21lbnQuIEl0IGlzIGNhbGxlZCB0byBnaXZlIHRoZSBmcmFnbWVudCB0aGUKKwkgKiBvcHBvcnR1bml0eSB0byBzYXZlIGFueSB2YWx1ZXMgZW50ZXJlZCBpbnRvIHRoZSBjb21wb3NpdGUgb3IKKwkgKiB1cGRhdGUgdGhlIHRhc2sgbW9kZWwuCisJICogPHA+CisJICogV2hlbiBmaW5pc2ggaXMgcHJlc3NlZCwgdGhlIGN1cnJlbnQgZnJhZ21lbnQgaXMgZXhpdCgpZWQsIGFuZCB0aGVuCisJICogcGVyZm9ybUZpbmlzaCgpIGlzIGNhbGxlZCBvbiBhbGwgb2YgdGhlIGZyYWdtZW50cyBpbiB0aGUgdHJlZS4KKwkgKiBlbnRlcigpIGFuZCBleGl0KCkgYXJlIG5vdCBjYWxsZWQgb24gdGhlIHJlbWFpbmluZyBmcmFnbWVudHMuIAorCSAqIDwvcD4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGl0KCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogQ2FsbGVkIHdoZW4gdGhlIHdpemFyZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmVsb25ncyB0byBpcyBmaW5pc2hlZC4KKwkgKiBBZnRlciBleGl0KClpbmcgdGhlIGN1cnJlbnQgcGFnZSwgYWxsIGZyYWdtZW50J3MgcGVyZm9ybUZpbmlzaCgpCisJICogbWV0aG9kcyBhcmUgY2FsbGVkIGluIG9yZGVyLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBhbmQgbXVzdCBub3QgYWNjZXNzIHRoZQorCSAqIGNvbXBvc2l0ZS4gTm90IG9ubHkgbWlnaHQgdGhlIHVzZXIgbmV2ZXIgaGF2ZSBhY2Nlc3NlZCB0aGUgZnJhZ21lbnQncworCSAqIGNvbXBvc2l0ZSwgYnV0IHRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkgb24gYSBqb2IKKwkgKiBvbmNlIHRoZSB3aXphcmQgaGFzIGNsb3NlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcworCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZworCSAqLworCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvIGlzIGNhbmNlbGVkLgorCSAqIEFmdGVyIGV4aXQoKWluZyB0aGUgY3VycmVudCBwYWdlLCBhbGwgZnJhZ21lbnQncyBwZXJmb3JtQ2FuY2VsKCkKKwkgKiBtZXRob2RzIGFyZSBjYWxsZWQgaW4gb3JkZXIuCisJICogPHA+CisJICogVGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkIGFuZCBtdXN0IG5vdCBhY2Nlc3MgdGhlCisJICogY29tcG9zaXRlLiBOb3Qgb25seSBtaWdodCB0aGUgdXNlciBuZXZlciBoYXZlIGFjY2Vzc2VkIHRoZSBmcmFnbWVudCdzCisJICogY29tcG9zaXRlLCBidXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBvbiBhIGpvYgorCSAqIG9uY2UgdGhlIHdpemFyZCBoYXMgY2xvc2VkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCisJICovCisJcHVibGljIHZvaWQgcGVyZm9ybUNhbmNlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNoaWxkIGZyYWdtZW50cy4gQ2hpbGQgZnJhZ21lbnRzIGNvbWUgZGlyZWN0bHkgYWZ0ZXIgdGhpcyBmcmFnbWVudAorCSAqIGluIHRoZSB3aXphcmQgZmxvdy4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBjaGlsZCBmcmFnbWVudHMKKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKKwkJaWYgKGxpc3RJbXBsID09IG51bGwpIHsKKwkJCWxpc3RJbXBsID0gbmV3IEFycmF5TGlzdDxXaXphcmRGcmFnbWVudD4oKTsKKwkJCWNyZWF0ZUNoaWxkRnJhZ21lbnRzKGxpc3RJbXBsKTsKKwkJfQorCQlyZXR1cm4gbGlzdEltcGw7CisJfQorCisJLyoqCisJICogQ2FsbGVkIHRvIGdpdmUgdGhlIGZyYWdtZW50IGEgY2hhbmNlIHRvIHVwZGF0ZSBpdCdzIGNoaWxkIGZyYWdtZW50cyBpbgorCSAqIHJlc3BvbnNlIHRvIG90aGVyIGNoYW5nZXMgd2l0aGluIHRoZSB3aXphcmQgb3IgdGFzayBtb2RlbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVDaGlsZEZyYWdtZW50cygpIHsKKwkJbGlzdEltcGwgPSBudWxsOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgZ2V0Q2hpbGRGcmFnbWVudHMoKSB0bworCSAqIGFsbG93IHRoaXMgZnJhZ21lbnQgdG8gYWRkIGl0J3MgY2hpbGRyZW4uIFRoaXMgbWV0aG9kIG11c3QgY2FjaGUgYW5kCisJICogcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIG9mIGFueSBjaGlsZCBmcmFnbWVudCBjcmVhdGVkLiBJZiBuZXcKKwkgKiBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgZWFjaCB0aW1lIHRoZSB3aXphcmQgaXMgdXBkYXRlZCwgdGhlIGVuYWJsZW1lbnQKKwkgKiBzdGF0ZSBhbmQgdGhlIGZsb3cgb2YgdGhlIHdpemFyZCB3aWxsIGJlIGluY29ycmVjdC4gCisJICogCisJICogQHBhcmFtIGxpc3QgYSBsaXN0IHRvIGFkZCB0aGUgY2hpbGQgZnJhZ21lbnRzIHRvCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZnJhZ21lbnQgaXMgY29tcGxldGUgKGNhbiBmaW5pc2gpLiBJZiBpdCBpcworCSAqIGNvbXBsZXRlIHRoZSB1c2VyIHdpbGwgYmUgYWxsb3dlZCB0byBnbyB0byB0aGUgbmV4dCBmcmFnbWVudCBvcgorCSAqIGZpbmlzaCB0aGUgd2l6YXJkLiBJZiB0aGUgZnJhZ21lbnQgaXMgbm90IGNvbXBsZXRlLCB0aGUgTmV4dCBidXR0b24KKwkgKiB3aWxsIGJlIGRpc2FibGVkLiBJZiB0aGUgZnJhZ21lbnQgaXMgY29tcGxldGUgYnV0IGFub3RoZXIgZnJhZ21lbnQKKwkgKiBpcyBub3QgY29tcGxldGUsIHRoZSBGaW5pc2ggYnV0dG9uIHdpbGwgbm90IGJlIGVuYWJsZWQuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZnJhZ21lbnQgaXMgY29tcGxldGUsIGFuZAorCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworCQlyZXR1cm4gaXNDb21wbGV0ZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIGlzQ29tcGxldGUgc3RhdGUuCisJICogCisJICogQHBhcmFtIGNvbXBsZXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmcmFnbWVudCBpcyBjb21wbGV0ZSwgYW5kCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldENvbXBsZXRlKGJvb2xlYW4gY29tcGxldGUpIHsKKwkJdGhpcy5pc0NvbXBsZXRlID0gY29tcGxldGU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NjU3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzxodG1sPgorPGhlYWQ+Cis8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+V2l6YXJkIGFuZCB0YXNrIHN1cHBvcnQgZm9yIHRoZSBzZXJ2ZXIgdG9vbHMgVUkuPC9wPgorPHRhYmxlIHdpZHRoPSI1MDAiPgorPHRyPgorPHRkPgorPHA+V2l6YXJkRnJhZ21lbnQgaXMgZXh0ZW5kZWQgdG8gcHJvdmlkZSBhIHN1YnRyZWUgb2Ygd2l6YXJkIHBhZ2VzIG9yIHRhc2tzCit0aGF0IGNhbiBiZSBpbnNlcnRlZCBpbnRvIGEgbGFyZ2VyIHdpemFyZCBmbG93LiBUYXNrV2l6YXJkIGlzIHRoZSBzdGFuZGFyZAord2l6YXJkIHRoYXQga25vd3MgaG93IHRvIGhhbmRsZSBXaXphcmRGcmFnbWVudHMgYW5kIGRpc3BsYXkgdGhlbSBpbiBvcmRlcgord2l0aGluIGEgc2luZ2xlIHdpemFyZC4gSXQgdXNlcyB0aGUgVGFza1dpemFyZFBhZ2VzIHRvIGRpc3BsYXkgdGhlIHdpemFyZAorZnJhZ21lbnQncyBjb21wb3NpdGVzIHdpdGhpbiB0aGUgd2l6YXJkLjwvcD4KKzwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDQzMzMzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL3BhY2thZ2UueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8aHRtbD4KKzxoZWFkPgorCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgorCTxtZXRhCisJCW5hbWU9InJvb3QiCisJCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KKwk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8YWJzdHJhY3Q+V2l6YXJkIGFuZCB0YXNrIHN1cHBvcnQgZm9yIHRoZSBzZXJ2ZXIgdG9vbHMgVUkuPC9hYnN0cmFjdD4KKworPHA+V2l6YXJkRnJhZ21lbnQgaXMgZXh0ZW5kZWQgdG8gcHJvdmlkZSBhIHN1YnRyZWUgb2Ygd2l6YXJkIHBhZ2VzIG9yIHRhc2tzCit0aGF0IGNhbiBiZSBpbnNlcnRlZCBpbnRvIGEgbGFyZ2VyIHdpemFyZCBmbG93LiBUYXNrV2l6YXJkIGlzIHRoZSBzdGFuZGFyZAord2l6YXJkIHRoYXQga25vd3MgaG93IHRvIGhhbmRsZSBXaXphcmRGcmFnbWVudHMgYW5kIGRpc3BsYXkgdGhlbSBpbiBvcmRlcgord2l0aGluIGEgc2luZ2xlIHdpemFyZC4gSXQgdXNlcyB0aGUgVGFza1dpemFyZFBhZ2VzIHRvIGRpc3BsYXkgdGhlIHdpemFyZAorZnJhZ21lbnQncyBjb21wb3NpdGVzIHdpdGhpbiB0aGUgd2l6YXJkLjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK